scsi: hisi_sas: modify error handling for v2 hw
authorXiang Chen <chenxiang66@hisilicon.com>
Wed, 22 Mar 2017 17:25:24 +0000 (01:25 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 23 Mar 2017 15:12:02 +0000 (11:12 -0400)
For error codes which need abort-and-retry, simulate IO timeout and let
SCSI+ATA layers process those errors.

Previously for SSP, we should try to abort the IO in the LLDD and then
pass back to upper layer, but sometimes this would also error. So
Instead of adding special error handling for this scenario in the LLDD,
allow the upper layer to handle completely.

No performance hit is seen by taking this approach.

Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c

index b9d51324e406c3c684e43bc1b41880a6cd0c74e1..a35f8811edcb0c8d514cca0a5493c748de1a7dcc 100644 (file)
@@ -1747,7 +1747,6 @@ slot_complete_v2_hw(struct hisi_hba *hisi_hba, struct hisi_sas_slot *slot)
 
        task->task_state_flags &=
                ~(SAS_TASK_STATE_PENDING | SAS_TASK_AT_INITIATOR);
-       task->task_state_flags |= SAS_TASK_STATE_DONE;
 
        memset(ts, 0, sizeof(*ts));
        ts->resp = SAS_TASK_COMPLETE;
@@ -1786,11 +1785,9 @@ slot_complete_v2_hw(struct hisi_hba *hisi_hba, struct hisi_sas_slot *slot)
                (!(complete_hdr->dw0 & CMPLT_HDR_RSPNS_XFRD_MSK))) {
 
                slot_err_v2_hw(hisi_hba, task, slot);
-               if (unlikely(slot->abort)) {
-                       queue_work(hisi_hba->wq, &slot->abort_slot);
-                       /* immediately return and do not complete */
+
+               if (unlikely(slot->abort))
                        return ts->stat;
-               }
                goto out;
        }
 
@@ -1842,7 +1839,7 @@ slot_complete_v2_hw(struct hisi_hba *hisi_hba, struct hisi_sas_slot *slot)
        }
 
 out:
-
+       task->task_state_flags |= SAS_TASK_STATE_DONE;
        hisi_sas_slot_task_free(hisi_hba, task, slot);
        sts = ts->stat;