summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/isci/task.h
diff options
context:
space:
mode:
authorJeff Skirvin <jeffrey.d.skirvin@intel.com>2011-06-20 14:09:06 -0700
committerDan Williams <dan.j.williams@intel.com>2011-07-03 04:04:50 -0700
commitcde76fbf1f27551a08860227765ae8d5026ac0d9 (patch)
tree15b05ab39908e634cd633232025025d54a94a0ed /drivers/scsi/isci/task.h
parent61aaff49e20fdb700f1300a49962bc76effc77fc (diff)
isci: Add decode for SMP request retry error condition
There are situations with slow expanders in which a first attempt to execute an SMP request will fail with a timeout. Immediate subsequent retries will generally succeed. This change makes sure SMP I/O failures are immediately failed to libsas so that retries happen with no discovery process timeout delay. Signed-off-by: Jeff Skirvin <jeffrey.d.skirvin@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/scsi/isci/task.h')
-rw-r--r--drivers/scsi/isci/task.h27
1 files changed, 21 insertions, 6 deletions
diff --git a/drivers/scsi/isci/task.h b/drivers/scsi/isci/task.h
index 432b81aecd4..c8dd075d2be 100644
--- a/drivers/scsi/isci/task.h
+++ b/drivers/scsi/isci/task.h
@@ -301,6 +301,27 @@ isci_task_set_completion_status(
task->task_status.stat = status;
switch (task_notification_selection) {
+
+ case isci_perform_error_io_completion:
+
+ if (task->task_proto == SAS_PROTOCOL_SMP) {
+ /* There is no error escalation in the SMP case.
+ * Convert to a normal completion to avoid the
+ * timeout in the discovery path and to let the
+ * next action take place quickly.
+ */
+ task_notification_selection
+ = isci_perform_normal_io_completion;
+
+ /* Fall through to the normal case... */
+ } else {
+ /* Use sas_task_abort */
+ /* Leave SAS_TASK_STATE_DONE clear
+ * Leave SAS_TASK_AT_INITIATOR set.
+ */
+ break;
+ }
+
case isci_perform_aborted_io_completion:
/* This path can occur with task-managed requests as well as
* requests terminated because of LUN or device resets.
@@ -313,12 +334,6 @@ isci_task_set_completion_status(
default:
WARN_ONCE(1, "unknown task_notification_selection: %d\n",
task_notification_selection);
- /* Fall through to the error case... */
- case isci_perform_error_io_completion:
- /* Use sas_task_abort */
- /* Leave SAS_TASK_STATE_DONE clear
- * Leave SAS_TASK_AT_INITIATOR set.
- */
break;
}