|
@@ -227,6 +227,13 @@
|
|
|
#define CMPLT_HDR_RSPNS_XFRD_MSK (0x1 << CMPLT_HDR_RSPNS_XFRD_OFF)
|
|
|
#define CMPLT_HDR_ERX_OFF 12
|
|
|
#define CMPLT_HDR_ERX_MSK (0x1 << CMPLT_HDR_ERX_OFF)
|
|
|
+#define CMPLT_HDR_ABORT_STAT_OFF 13
|
|
|
+#define CMPLT_HDR_ABORT_STAT_MSK (0x7 << CMPLT_HDR_ABORT_STAT_OFF)
|
|
|
+/* abort_stat */
|
|
|
+#define STAT_IO_NOT_VALID 0x1
|
|
|
+#define STAT_IO_NO_DEVICE 0x2
|
|
|
+#define STAT_IO_COMPLETE 0x3
|
|
|
+#define STAT_IO_ABORTED 0x4
|
|
|
/* dw1 */
|
|
|
#define CMPLT_HDR_IPTT_OFF 0
|
|
|
#define CMPLT_HDR_IPTT_MSK (0xffff << CMPLT_HDR_IPTT_OFF)
|
|
@@ -1569,6 +1576,30 @@ slot_complete_v2_hw(struct hisi_hba *hisi_hba, struct hisi_sas_slot *slot,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ /* Use SAS+TMF status codes */
|
|
|
+ switch ((complete_hdr->dw0 & CMPLT_HDR_ABORT_STAT_MSK)
|
|
|
+ >> CMPLT_HDR_ABORT_STAT_OFF) {
|
|
|
+ case STAT_IO_ABORTED:
|
|
|
+ /* this io has been aborted by abort command */
|
|
|
+ ts->stat = SAS_ABORTED_TASK;
|
|
|
+ goto out;
|
|
|
+ case STAT_IO_COMPLETE:
|
|
|
+ /* internal abort command complete */
|
|
|
+ ts->stat = TMF_RESP_FUNC_COMPLETE;
|
|
|
+ goto out;
|
|
|
+ case STAT_IO_NO_DEVICE:
|
|
|
+ ts->stat = TMF_RESP_FUNC_COMPLETE;
|
|
|
+ goto out;
|
|
|
+ case STAT_IO_NOT_VALID:
|
|
|
+ /* abort single io, controller don't find
|
|
|
+ * the io need to abort
|
|
|
+ */
|
|
|
+ ts->stat = TMF_RESP_FUNC_FAILED;
|
|
|
+ goto out;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
if ((complete_hdr->dw0 & CMPLT_HDR_ERX_MSK) &&
|
|
|
(!(complete_hdr->dw0 & CMPLT_HDR_RSPNS_XFRD_MSK))) {
|
|
|
|