scsi: smartpqi: Add retries for device reset
authorMahesh Rajashekhara <mahesh.rajashekhara@microsemi.com>
Fri, 7 Dec 2018 22:28:16 +0000 (16:28 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 20 Dec 2018 03:23:34 +0000 (22:23 -0500)
Reviewed-by: Ajish Koshy <ajish.koshy@microsemi.com>
Reviewed-by: Murthy Bhat <murthy.bhat@microsemi.com>
Reviewed-by: Justin Lindley <justin.lindley@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Dave Carroll <david.carroll@microsemi.com>
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Mahesh Rajashekhara <mahesh.rajashekhara@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/smartpqi/smartpqi.h
drivers/scsi/smartpqi/smartpqi_init.c

index bbf056d..646982e 100644 (file)
@@ -587,6 +587,7 @@ typedef u32 pqi_index_t;
 #define SOP_TASK_ATTRIBUTE_ACA                 4
 
 #define SOP_TMF_COMPLETE               0x0
+#define SOP_TMF_REJECTED               0x4
 #define SOP_TMF_FUNCTION_SUCCEEDED     0x8
 
 /* additional CDB bytes usage field codes */
index e195d9a..0f28ce5 100644 (file)
@@ -2665,6 +2665,9 @@ static int pqi_interpret_task_management_response(
        case SOP_TMF_FUNCTION_SUCCEEDED:
                rc = 0;
                break;
+       case SOP_TMF_REJECTED:
+               rc = -EAGAIN;
+               break;
        default:
                rc = -EIO;
                break;
@@ -5218,14 +5221,23 @@ static int pqi_lun_reset(struct pqi_ctrl_info *ctrl_info,
        return rc;
 }
 
+#define PQI_LUN_RESET_RETRIES                  3
+#define PQI_LUN_RESET_RETRY_INTERVAL_MSECS     10000
 /* Performs a reset at the LUN level. */
 
 static int pqi_device_reset(struct pqi_ctrl_info *ctrl_info,
        struct pqi_scsi_dev *device)
 {
        int rc;
+       unsigned int retries;
 
-       rc = pqi_lun_reset(ctrl_info, device);
+       for (retries = 0;;) {
+               rc = pqi_lun_reset(ctrl_info, device);
+               if (rc != -EAGAIN ||
+                   ++retries > PQI_LUN_RESET_RETRIES)
+                       break;
+               msleep(PQI_LUN_RESET_RETRY_INTERVAL_MSECS);
+       }
        if (rc == 0)
                rc = pqi_device_wait_for_pending_io(ctrl_info, device);