scsi: smartpqi: Add retries for device reset

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>
This commit is contained in:
Mahesh Rajashekhara 2018-12-07 16:28:16 -06:00 committed by Martin K. Petersen
parent b212c2510d
commit 3406384b76
2 changed files with 14 additions and 1 deletions

View File

@ -587,6 +587,7 @@ typedef u32 pqi_index_t;
#define SOP_TASK_ATTRIBUTE_ACA 4 #define SOP_TASK_ATTRIBUTE_ACA 4
#define SOP_TMF_COMPLETE 0x0 #define SOP_TMF_COMPLETE 0x0
#define SOP_TMF_REJECTED 0x4
#define SOP_TMF_FUNCTION_SUCCEEDED 0x8 #define SOP_TMF_FUNCTION_SUCCEEDED 0x8
/* additional CDB bytes usage field codes */ /* additional CDB bytes usage field codes */

View File

@ -2665,6 +2665,9 @@ static int pqi_interpret_task_management_response(
case SOP_TMF_FUNCTION_SUCCEEDED: case SOP_TMF_FUNCTION_SUCCEEDED:
rc = 0; rc = 0;
break; break;
case SOP_TMF_REJECTED:
rc = -EAGAIN;
break;
default: default:
rc = -EIO; rc = -EIO;
break; break;
@ -5218,14 +5221,23 @@ static int pqi_lun_reset(struct pqi_ctrl_info *ctrl_info,
return rc; return rc;
} }
#define PQI_LUN_RESET_RETRIES 3
#define PQI_LUN_RESET_RETRY_INTERVAL_MSECS 10000
/* Performs a reset at the LUN level. */ /* Performs a reset at the LUN level. */
static int pqi_device_reset(struct pqi_ctrl_info *ctrl_info, static int pqi_device_reset(struct pqi_ctrl_info *ctrl_info,
struct pqi_scsi_dev *device) struct pqi_scsi_dev *device)
{ {
int rc; 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) if (rc == 0)
rc = pqi_device_wait_for_pending_io(ctrl_info, device); rc = pqi_device_wait_for_pending_io(ctrl_info, device);