]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: hisi_sas: Modify v3 HW SATA completion error processing
authorXingui Yang <yangxingui@huawei.com>
Thu, 14 Jul 2022 18:23:21 +0000 (02:23 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 19 Sep 2023 10:22:44 +0000 (12:22 +0200)
[ Upstream commit 7e15334f5d256367fb4c77f4ee0003e1e3d9bf9d ]

If the I/O completion response frame returned by the target device has been
written to the host memory and the err bit in the status field of the
received fis is 1, ts->stat should set to SAS_PROTO_RESPONSE, and this will
let EH analyze and further determine cause of failure.

Link: https://lore.kernel.org/r/1657823002-139010-5-git-send-email-john.garry@huawei.com
Signed-off-by: Xingui Yang <yangxingui@huawei.com>
Signed-off-by: John Garry <john.garry@huawei.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Stable-dep-of: f5393a5602ca ("scsi: hisi_sas: Fix normally completed I/O analysed as failed")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c

index 00f0847e1487a6dbb077cd9617e6a41b3b1ac646..7204666c0407658488aefb2ee1c02cc552ff2198 100644 (file)
@@ -480,6 +480,9 @@ struct hisi_sas_err_record_v3 {
 #define RX_DATA_LEN_UNDERFLOW_OFF      6
 #define RX_DATA_LEN_UNDERFLOW_MSK      (1 << RX_DATA_LEN_UNDERFLOW_OFF)
 
+#define RX_FIS_STATUS_ERR_OFF          0
+#define RX_FIS_STATUS_ERR_MSK          (1 << RX_FIS_STATUS_ERR_OFF)
+
 #define HISI_SAS_COMMAND_ENTRIES_V3_HW 4096
 #define HISI_SAS_MSI_COUNT_V3_HW 32
 
@@ -2151,6 +2154,7 @@ slot_err_v3_hw(struct hisi_hba *hisi_hba, struct sas_task *task,
                        hisi_sas_status_buf_addr_mem(slot);
        u32 dma_rx_err_type = le32_to_cpu(record->dma_rx_err_type);
        u32 trans_tx_fail_type = le32_to_cpu(record->trans_tx_fail_type);
+       u16 sipc_rx_err_type = le16_to_cpu(record->sipc_rx_err_type);
        u32 dw3 = le32_to_cpu(complete_hdr->dw3);
 
        switch (task->task_proto) {
@@ -2178,7 +2182,10 @@ slot_err_v3_hw(struct hisi_hba *hisi_hba, struct sas_task *task,
        case SAS_PROTOCOL_SATA:
        case SAS_PROTOCOL_STP:
        case SAS_PROTOCOL_SATA | SAS_PROTOCOL_STP:
-               if (dma_rx_err_type & RX_DATA_LEN_UNDERFLOW_MSK) {
+               if ((complete_hdr->dw0 & CMPLT_HDR_RSPNS_XFRD_MSK) &&
+                   (sipc_rx_err_type & RX_FIS_STATUS_ERR_MSK)) {
+                       ts->stat = SAS_PROTO_RESPONSE;
+               } else if (dma_rx_err_type & RX_DATA_LEN_UNDERFLOW_MSK) {
                        ts->residual = trans_tx_fail_type;
                        ts->stat = SAS_DATA_UNDERRUN;
                } else if (dw3 & CMPLT_HDR_IO_IN_TARGET_MSK) {