1 Nothing here for now, move along...
2 commit c695793b52216ad6a11ce952fc8d29f3a9d0c7cd
3 Author: Balsundar P <balsundar.p@microsemi.com>
4 Date: Tue Oct 15 11:52:04 2019 +0530
6 scsi: aacraid: bump version
10 Link: https://lore.kernel.org/r/1571120524-6037-8-git-send-email-balsundar.p@microsemi.com
11 Signed-off-by: Balsundar P <balsundar.p@microsemi.com>
12 Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
14 diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
15 index 17a4e8b8bd00..e3e4ecbea726 100644
16 --- a/drivers/scsi/aacraid/aacraid.h
17 +++ b/drivers/scsi/aacraid/aacraid.h
18 @@ -85,7 +85,7 @@ enum {
19 #define PMC_GLOBAL_INT_BIT0 0x00000001
21 #ifndef AAC_DRIVER_BUILD
22 -# define AAC_DRIVER_BUILD 50877
23 +# define AAC_DRIVER_BUILD 50983
24 # define AAC_DRIVER_BRANCH "-custom"
26 #define MAXIMUM_NUM_CONTAINERS 32
28 commit 26c54d0ec25c186329d845ad1beb9d3dde586af9
29 Author: Balsundar P <balsundar.p@microsemi.com>
30 Date: Tue Oct 15 11:52:03 2019 +0530
32 scsi: aacraid: send AIF request post IOP RESET
34 After IOP reset completion, AIF request command is not issued to the
35 controller. Driver schedules a worker thread to issue a AIF request command
36 after IOP reset completion.
38 [mkp: fix zeroday warning]
40 Link: https://lore.kernel.org/r/1571120524-6037-7-git-send-email-balsundar.p@microsemi.com
41 Acked-by: Balsundar P < Balsundar.P@microchip.com>
42 Signed-off-by: Balsundar P <balsundar.p@microsemi.com>
43 Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
45 diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
46 index f76a33cb0259..17a4e8b8bd00 100644
47 --- a/drivers/scsi/aacraid/aacraid.h
48 +++ b/drivers/scsi/aacraid/aacraid.h
49 @@ -1330,7 +1330,7 @@ struct fib {
50 #define AAC_DEVTYPE_ARC_RAW 2
51 #define AAC_DEVTYPE_NATIVE_RAW 3
53 -#define AAC_SAFW_RESCAN_DELAY (10 * HZ)
54 +#define AAC_RESCAN_DELAY (10 * HZ)
56 struct aac_hba_map_info {
57 __le32 rmw_nexus; /* nexus for native HBA devices */
58 @@ -1603,6 +1603,7 @@ struct aac_dev
59 struct fsa_dev_info *fsa_dev;
60 struct task_struct *thread;
61 struct delayed_work safw_rescan_work;
62 + struct delayed_work src_reinit_aif_worker;
65 *This lock will protect the two 32-bit
66 @@ -2647,7 +2648,12 @@ int aac_scan_host(struct aac_dev *dev);
68 static inline void aac_schedule_safw_scan_worker(struct aac_dev *dev)
70 - schedule_delayed_work(&dev->safw_rescan_work, AAC_SAFW_RESCAN_DELAY);
71 + schedule_delayed_work(&dev->safw_rescan_work, AAC_RESCAN_DELAY);
74 +static inline void aac_schedule_src_reinit_aif_worker(struct aac_dev *dev)
76 + schedule_delayed_work(&dev->src_reinit_aif_worker, AAC_RESCAN_DELAY);
79 static inline void aac_safw_rescan_worker(struct work_struct *work)
80 @@ -2661,10 +2667,10 @@ static inline void aac_safw_rescan_worker(struct work_struct *work)
84 -static inline void aac_cancel_safw_rescan_worker(struct aac_dev *dev)
85 +static inline void aac_cancel_rescan_worker(struct aac_dev *dev)
87 - if (dev->sa_firmware)
88 - cancel_delayed_work_sync(&dev->safw_rescan_work);
89 + cancel_delayed_work_sync(&dev->safw_rescan_work);
90 + cancel_delayed_work_sync(&dev->src_reinit_aif_worker);
93 /* SCp.phase values */
94 @@ -2674,6 +2680,7 @@ static inline void aac_cancel_safw_rescan_worker(struct aac_dev *dev)
95 #define AAC_OWNER_FIRMWARE 0x106
97 void aac_safw_rescan_worker(struct work_struct *work);
98 +void aac_src_reinit_aif_worker(struct work_struct *work);
99 int aac_acquire_irq(struct aac_dev *dev);
100 void aac_free_irq(struct aac_dev *dev);
101 int aac_setup_safw_adapter(struct aac_dev *dev);
102 @@ -2731,6 +2738,7 @@ int aac_probe_container(struct aac_dev *dev, int cid);
103 int _aac_rx_init(struct aac_dev *dev);
104 int aac_rx_select_comm(struct aac_dev *dev, int comm);
105 int aac_rx_deliver_producer(struct fib * fib);
106 +void aac_reinit_aif(struct aac_dev *aac, unsigned int index);
108 static inline int aac_is_src(struct aac_dev *dev)
110 diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
111 index 3f268f669cc3..5a8a999606ea 100644
112 --- a/drivers/scsi/aacraid/commsup.c
113 +++ b/drivers/scsi/aacraid/commsup.c
114 @@ -1464,6 +1464,14 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
118 +static void aac_schedule_bus_scan(struct aac_dev *aac)
120 + if (aac->sa_firmware)
121 + aac_schedule_safw_scan_worker(aac);
123 + aac_schedule_src_reinit_aif_worker(aac);
126 static int _aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type)
129 @@ -1639,7 +1647,7 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type)
131 if (!retval && !is_kdump_kernel()) {
132 dev_info(&aac->pdev->dev, "Scheduling bus rescan\n");
133 - aac_schedule_safw_scan_worker(aac);
134 + aac_schedule_bus_scan(aac);
138 @@ -1960,6 +1968,16 @@ int aac_scan_host(struct aac_dev *dev)
142 +void aac_src_reinit_aif_worker(struct work_struct *work)
144 + struct aac_dev *dev = container_of(to_delayed_work(work),
145 + struct aac_dev, src_reinit_aif_worker);
147 + wait_event(dev->scsi_host_ptr->host_wait,
148 + !scsi_host_in_recovery(dev->scsi_host_ptr));
149 + aac_reinit_aif(dev, dev->cardtype);
153 * aac_handle_sa_aif Handle a message from the firmware
154 * @dev: Which adapter this fib is from
155 diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
156 index 55a55c56fea9..ee6bc2f9b80a 100644
157 --- a/drivers/scsi/aacraid/linit.c
158 +++ b/drivers/scsi/aacraid/linit.c
159 @@ -1593,6 +1593,19 @@ static void aac_init_char(void)
163 +void aac_reinit_aif(struct aac_dev *aac, unsigned int index)
166 + * Firmware may send a AIF messages very early and the Driver may have
167 + * ignored as it is not fully ready to process the messages. Send
168 + * AIF to firmware so that if there are any unprocessed events they
169 + * can be processed now.
171 + if (aac_drivers[index].quirks & AAC_QUIRK_SRC)
172 + aac_intr_normal(aac, 0, 2, 0, NULL);
176 static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
178 unsigned index = id->driver_data;
179 @@ -1690,6 +1703,8 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
180 mutex_init(&aac->scan_mutex);
182 INIT_DELAYED_WORK(&aac->safw_rescan_work, aac_safw_rescan_worker);
183 + INIT_DELAYED_WORK(&aac->src_reinit_aif_worker,
184 + aac_src_reinit_aif_worker);
186 * Map in the registers from the adapter.
188 @@ -1880,7 +1895,7 @@ static int aac_suspend(struct pci_dev *pdev, pm_message_t state)
189 struct aac_dev *aac = (struct aac_dev *)shost->hostdata;
191 scsi_block_requests(shost);
192 - aac_cancel_safw_rescan_worker(aac);
193 + aac_cancel_rescan_worker(aac);
194 aac_send_shutdown(aac);
196 aac_release_resources(aac);
197 @@ -1939,7 +1954,7 @@ static void aac_remove_one(struct pci_dev *pdev)
198 struct Scsi_Host *shost = pci_get_drvdata(pdev);
199 struct aac_dev *aac = (struct aac_dev *)shost->hostdata;
201 - aac_cancel_safw_rescan_worker(aac);
202 + aac_cancel_rescan_worker(aac);
203 scsi_remove_host(shost);
206 @@ -1997,7 +2012,7 @@ static pci_ers_result_t aac_pci_error_detected(struct pci_dev *pdev,
207 aac->handle_pci_error = 1;
209 scsi_block_requests(aac->scsi_host_ptr);
210 - aac_cancel_safw_rescan_worker(aac);
211 + aac_cancel_rescan_worker(aac);
213 aac_release_resources(aac);
216 commit 572ee53a9badf62f3973d66f6475f9ce69720a25
217 Author: Balsundar P <balsundar.p@microsemi.com>
218 Date: Tue Oct 15 11:52:02 2019 +0530
220 scsi: aacraid: check adapter health
222 Currently driver waits for the command IOCTL from the firmware and if the
223 firmware enters nonresponsive state, the driver doesn't respond till the
224 firmware is responsive again.
226 Check that firmware is alive, otherwise return -EBUSY.
228 [mkp: clarified commit desc]
230 Link: https://lore.kernel.org/r/1571120524-6037-6-git-send-email-balsundar.p@microsemi.com
231 Signed-off-by: Balsundar P <balsundar.p@microsemi.com>
232 Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
234 diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
235 index 40f78509ca94..55a55c56fea9 100644
236 --- a/drivers/scsi/aacraid/linit.c
237 +++ b/drivers/scsi/aacraid/linit.c
238 @@ -612,9 +612,13 @@ static struct device_attribute *aac_dev_attrs[] = {
239 static int aac_ioctl(struct scsi_device *sdev, unsigned int cmd,
243 struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata;
244 if (!capable(CAP_SYS_RAWIO))
246 + retval = aac_adapter_check_health(dev);
249 return aac_do_ioctl(dev, cmd, arg);
253 commit e2fd90dd2ed87bdcfdfb640f06da48fd23efa080
254 Author: Balsundar P <balsundar.p@microsemi.com>
255 Date: Tue Oct 15 11:52:01 2019 +0530
257 scsi: aacraid: setting different timeout for src and thor
259 Set 180 second timeout for thor and 60 seconds for src controllers.
261 Link: https://lore.kernel.org/r/1571120524-6037-5-git-send-email-balsundar.p@microsemi.com
262 Signed-off-by: Balsundar P <balsundar.p@microsemi.com>
263 Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
265 diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
266 index 2388143d59f5..e36608ce937a 100644
267 --- a/drivers/scsi/aacraid/aachba.c
268 +++ b/drivers/scsi/aacraid/aachba.c
269 @@ -1477,6 +1477,7 @@ static struct aac_srb * aac_scsi_common(struct fib * fib, struct scsi_cmnd * cmd
270 struct aac_srb * srbcmd;
273 + struct aac_dev *dev = fib->dev;
276 switch(cmd->sc_data_direction){
277 @@ -1503,7 +1504,7 @@ static struct aac_srb * aac_scsi_common(struct fib * fib, struct scsi_cmnd * cmd
278 srbcmd->flags = cpu_to_le32(flag);
279 timeout = cmd->request->timeout/HZ;
282 + timeout = (dev->sa_firmware ? AAC_SA_TIMEOUT : AAC_ARC_TIMEOUT);
283 srbcmd->timeout = cpu_to_le32(timeout); // timeout in seconds
284 srbcmd->retry_limit = 0; /* Obsolete parameter */
285 srbcmd->cdb_size = cpu_to_le32(cmd->cmd_len);
286 diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
287 index 3fdd4583cbb5..f76a33cb0259 100644
288 --- a/drivers/scsi/aacraid/aacraid.h
289 +++ b/drivers/scsi/aacraid/aacraid.h
290 @@ -108,6 +108,8 @@ enum {
291 #define AAC_BUS_TARGET_LOOP (AAC_MAX_BUSES * AAC_MAX_TARGETS)
292 #define AAC_MAX_NATIVE_SIZE 2048
293 #define FW_ERROR_BUFFER_SIZE 512
294 +#define AAC_SA_TIMEOUT 180
295 +#define AAC_ARC_TIMEOUT 60
297 #define get_bus_number(x) (x/AAC_MAX_TARGETS)
298 #define get_target_number(x) (x%AAC_MAX_TARGETS)
299 diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
300 index 4a858789e6c5..40f78509ca94 100644
301 --- a/drivers/scsi/aacraid/linit.c
302 +++ b/drivers/scsi/aacraid/linit.c
303 @@ -391,6 +391,7 @@ static int aac_slave_configure(struct scsi_device *sdev)
305 unsigned int depth = 0;
306 unsigned int set_timeout = 0;
308 bool set_qd_dev_type = false;
311 @@ -483,10 +484,13 @@ static int aac_slave_configure(struct scsi_device *sdev)
314 * Firmware has an individual device recovery time typically
315 - * of 35 seconds, give us a margin.
316 + * of 35 seconds, give us a margin. Thor devices can take longer in
317 + * error recovery, hence different value.
319 - if (set_timeout && sdev->request_queue->rq_timeout < (45 * HZ))
320 - blk_queue_rq_timeout(sdev->request_queue, 45*HZ);
322 + timeout = aac->sa_firmware ? AAC_SA_TIMEOUT : AAC_ARC_TIMEOUT;
323 + blk_queue_rq_timeout(sdev->request_queue, timeout * HZ);
329 commit c02a3342bad32baa9be201da39d3809b74f92239
330 Author: Balsundar P <balsundar.p@microsemi.com>
331 Date: Tue Oct 15 11:52:00 2019 +0530
333 scsi: aacraid: fixed firmware assert issue
335 Before issuing IOP reset, INTX mode is selected. This is triggering MSGU
336 lockup and ended in basecode assert. Use DROP_IO command when IOP reset is
337 sent in preparation for interrupt mode switch.
339 Link: https://lore.kernel.org/r/1571120524-6037-4-git-send-email-balsundar.p@microsemi.com
340 Signed-off-by: Balsundar P <balsundar.p@microsemi.com>
341 Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
343 diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
344 index 3fa03230f6ba..3fdd4583cbb5 100644
345 --- a/drivers/scsi/aacraid/aacraid.h
346 +++ b/drivers/scsi/aacraid/aacraid.h
347 @@ -1673,6 +1673,7 @@ struct aac_dev
349 u32 handle_pci_error;
351 + u8 soft_reset_support;
354 #define aac_adapter_interrupt(dev) \
355 diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
356 index d4fcfa1e54e0..f75878d773cf 100644
357 --- a/drivers/scsi/aacraid/comminit.c
358 +++ b/drivers/scsi/aacraid/comminit.c
359 @@ -571,6 +571,11 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
361 dev->sa_firmware = 0;
363 + if (status[4] & le32_to_cpu(AAC_EXTOPT_SOFT_RESET))
364 + dev->soft_reset_support = 1;
366 + dev->soft_reset_support = 0;
368 if ((dev->comm_interface == AAC_COMM_MESSAGE) &&
369 (status[2] > dev->base_size)) {
370 aac_adapter_ioremap(dev, 0);
371 diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
372 index 3b66e06726c8..787ec9baebb0 100644
373 --- a/drivers/scsi/aacraid/src.c
374 +++ b/drivers/scsi/aacraid/src.c
375 @@ -733,10 +733,20 @@ static bool aac_is_ctrl_up_and_running(struct aac_dev *dev)
379 +static void aac_src_drop_io(struct aac_dev *dev)
381 + if (!dev->soft_reset_support)
384 + aac_adapter_sync_cmd(dev, DROP_IO,
385 + 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
388 static void aac_notify_fw_of_iop_reset(struct aac_dev *dev)
390 aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS, 0, 0, 0, 0, 0, 0, NULL,
391 NULL, NULL, NULL, NULL);
392 + aac_src_drop_io(dev);
395 static void aac_send_iop_reset(struct aac_dev *dev)
397 commit f2244c1b35e5302070af4c729db0b0e9eb8350c9
398 Author: Balsundar P <balsundar.p@microsemi.com>
399 Date: Tue Oct 15 11:51:59 2019 +0530
401 scsi: aacraid: fixed IO reporting error
403 The problem is the driver detects FastResponse bit set and saves it to
404 Fib's flags to not check IO response status, but it never clears it for
405 next IO. Hence the next IO will pick up FastResponse bit to not check
406 the IO response status and fail to report any type IO error to kernel
408 Link: https://lore.kernel.org/r/1571120524-6037-3-git-send-email-balsundar.p@microsemi.com
409 Signed-off-by: Balsundar P <balsundar.p@microsemi.com>
410 Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
412 diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
413 index 2142a649e865..3f268f669cc3 100644
414 --- a/drivers/scsi/aacraid/commsup.c
415 +++ b/drivers/scsi/aacraid/commsup.c
416 @@ -232,6 +232,7 @@ struct fib *aac_fib_alloc_tag(struct aac_dev *dev, struct scsi_cmnd *scmd)
417 fibptr->type = FSAFS_NTC_FIB_CONTEXT;
418 fibptr->callback_data = NULL;
419 fibptr->callback = NULL;
425 commit c86fbe484c10b2cd1e770770db2d6b2c88801c1d
426 Author: Balsundar P <balsundar.p@microsemi.com>
427 Date: Tue Oct 15 11:51:58 2019 +0530
429 scsi: aacraid: fix illegal IO beyond last LBA
431 The driver fails to handle data when read or written beyond device reported
432 LBA, which triggers kernel panic
434 Link: https://lore.kernel.org/r/1571120524-6037-2-git-send-email-balsundar.p@microsemi.com
435 Signed-off-by: Balsundar P <balsundar.p@microsemi.com>
436 Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
438 diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
439 index 0ed3f806ace5..2388143d59f5 100644
440 --- a/drivers/scsi/aacraid/aachba.c
441 +++ b/drivers/scsi/aacraid/aachba.c
442 @@ -2467,13 +2467,13 @@ static int aac_read(struct scsi_cmnd * scsicmd)
443 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
444 SAM_STAT_CHECK_CONDITION;
445 set_sense(&dev->fsa_dev[cid].sense_data,
446 - HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
447 + ILLEGAL_REQUEST, SENCODE_LBA_OUT_OF_RANGE,
448 ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
449 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
450 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
451 SCSI_SENSE_BUFFERSIZE));
452 scsicmd->scsi_done(scsicmd);
457 dprintk((KERN_DEBUG "aac_read[cpu %d]: lba = %llu, t = %ld.\n",
458 @@ -2559,13 +2559,13 @@ static int aac_write(struct scsi_cmnd * scsicmd)
459 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
460 SAM_STAT_CHECK_CONDITION;
461 set_sense(&dev->fsa_dev[cid].sense_data,
462 - HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
463 + ILLEGAL_REQUEST, SENCODE_LBA_OUT_OF_RANGE,
464 ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
465 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
466 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
467 SCSI_SENSE_BUFFERSIZE));
468 scsicmd->scsi_done(scsicmd);
473 dprintk((KERN_DEBUG "aac_write[cpu %d]: lba = %llu, t = %ld.\n",