From: Mahesh Rajashekhara <mahesh.rajashekh...@microsemi.com>

Reviewed-by: Ajish Koshy <ajish.ko...@microsemi.com>
Reviewed-by: Murthy Bhat <murthy.b...@microsemi.com>
Reviewed-by: Justin Lindley <justin.lind...@microsemi.com>
Reviewed-by: Scott Benesh <scott.ben...@microsemi.com>
Reviewed-by: Dave Carroll <david.carr...@microsemi.com>
Reviewed-by: Scott Teel <scott.t...@microsemi.com>
Reviewed-by: Kevin Barnett <kevin.barn...@microsemi.com>
Signed-off-by: Mahesh Rajashekhara <mahesh.rajashekh...@microsemi.com>
Signed-off-by: Don Brace <don.br...@microsemi.com>
---
 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