From: Mahesh Rajashekhara <[email protected]>

Reviewed-by: Ajish Koshy <[email protected]>
Reviewed-by: Murthy Bhat <[email protected]>
Reviewed-by: Justin Lindley <[email protected]>
Reviewed-by: Scott Benesh <[email protected]>
Reviewed-by: Dave Carroll <[email protected]>
Reviewed-by: Scott Teel <[email protected]>
Reviewed-by: Kevin Barnett <[email protected]>
Signed-off-by: Mahesh Rajashekhara <[email protected]>
Signed-off-by: Don Brace <[email protected]>
---
 drivers/scsi/smartpqi/smartpqi.h      |    1 +
 drivers/scsi/smartpqi/smartpqi_init.c |   14 +++++++++++++-
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/smartpqi/smartpqi.h b/drivers/scsi/smartpqi/smartpqi.h
index bbf056ddd026..646982e45904 100644
--- a/drivers/scsi/smartpqi/smartpqi.h
+++ b/drivers/scsi/smartpqi/smartpqi.h
@@ -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 */
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c 
b/drivers/scsi/smartpqi/smartpqi_init.c
index 72e635cc594c..db95b1cb6889 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -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);
 

Reply via email to