aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErwan Velu <e.velu@criteo.com>2019-03-21 05:49:27 -0400
committerMartin K. Petersen <martin.petersen@oracle.com>2019-05-20 10:56:43 -0400
commit8ef860ae55e96c9e8999a12c800d9fd1a91f66d7 (patch)
treeff641bb955522f2ac0486963147be9dabaa2fe6e
parent41552199b5518fe26bee0829a28dd1880441b430 (diff)
scsi: smartpqi: Reporting unhandled SCSI errors
When a HARDWARE_ERROR is triggered for ASC=0x3e, the existing code is only considering the case where ASCQ=0x1. According to the http://www.t10.org/lists/asc-num.htm#ASC_3E specification, other values may occur like a timeout (ASCQ=0x2). This patch prints an error message when a non-handled message is received. This can help diagnose a possible misbehavior of the controller or a missing implementation in the Linux kernel. This patch keeps the exact same error handling but prints a message if an ASCQ != 1 is reported. [mkp: clarified commit message] Signed-off-by: Erwan Velu <e.velu@criteo.com> Acked-by: Don Brace <don.brace@microsemi.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/smartpqi/smartpqi_init.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index c26cac819f9e..b17761eafca9 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -2755,16 +2755,25 @@ static void pqi_process_raid_io_error(struct pqi_io_request *io_request)
2755 scsi_normalize_sense(error_info->data, 2755 scsi_normalize_sense(error_info->data,
2756 sense_data_length, &sshdr) && 2756 sense_data_length, &sshdr) &&
2757 sshdr.sense_key == HARDWARE_ERROR && 2757 sshdr.sense_key == HARDWARE_ERROR &&
2758 sshdr.asc == 0x3e && 2758 sshdr.asc == 0x3e) {
2759 sshdr.ascq == 0x1) {
2760 struct pqi_ctrl_info *ctrl_info = shost_to_hba(scmd->device->host); 2759 struct pqi_ctrl_info *ctrl_info = shost_to_hba(scmd->device->host);
2761 struct pqi_scsi_dev *device = scmd->device->hostdata; 2760 struct pqi_scsi_dev *device = scmd->device->hostdata;
2762 2761
2763 if (printk_ratelimit()) 2762 switch (sshdr.ascq) {
2764 scmd_printk(KERN_ERR, scmd, "received 'logical unit failure' from controller for scsi %d:%d:%d:%d\n", 2763 case 0x1: /* LOGICAL UNIT FAILURE */
2765 ctrl_info->scsi_host->host_no, device->bus, device->target, device->lun); 2764 if (printk_ratelimit())
2766 pqi_take_device_offline(scmd->device, "RAID"); 2765 scmd_printk(KERN_ERR, scmd, "received 'logical unit failure' from controller for scsi %d:%d:%d:%d\n",
2767 host_byte = DID_NO_CONNECT; 2766 ctrl_info->scsi_host->host_no, device->bus, device->target, device->lun);
2767 pqi_take_device_offline(scmd->device, "RAID");
2768 host_byte = DID_NO_CONNECT;
2769 break;
2770
2771 default: /* See http://www.t10.org/lists/asc-num.htm#ASC_3E */
2772 if (printk_ratelimit())
2773 scmd_printk(KERN_ERR, scmd, "received unhandled error %d from controller for scsi %d:%d:%d:%d\n",
2774 sshdr.ascq, ctrl_info->scsi_host->host_no, device->bus, device->target, device->lun);
2775 break;
2776 }
2768 } 2777 }
2769 2778
2770 if (sense_data_length > SCSI_SENSE_BUFFERSIZE) 2779 if (sense_data_length > SCSI_SENSE_BUFFERSIZE)