]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: lpfc: Restrict support for 32 byte CDBs to specific HBAs
authorJustin Tee <justin.tee@broadcom.com>
Thu, 12 Sep 2024 23:24:42 +0000 (16:24 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 4 Oct 2024 14:33:31 +0000 (16:33 +0200)
commit 05ab4e7846f1103377133c00295a9a910cc6dfc2 upstream.

An older generation of HBAs are failing FCP discovery due to usage of an
outdated field in FCP command WQEs.

Fix by checking the SLI Interface Type register for applicable support of
32 Byte CDB commands, and restore a setting for a WQE path using normal 16
byte CDBs.

Fixes: af20bb73ac25 ("scsi: lpfc: Add support for 32 byte CDBs")
Cc: stable@vger.kernel.org # v6.10+
Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20240912232447.45607-4-justintee8345@gmail.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/scsi/lpfc/lpfc_hw4.h
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/lpfc/lpfc_scsi.c

index 500253007b1dc866f589fc1852b7503c991be326..26e1313ebb21fced6545d55768b7b8efcd4419f2 100644 (file)
@@ -4847,6 +4847,7 @@ struct fcp_iwrite64_wqe {
 #define        cmd_buff_len_SHIFT  16
 #define        cmd_buff_len_MASK  0x00000ffff
 #define        cmd_buff_len_WORD  word3
+/* Note: payload_offset_len field depends on ASIC support */
 #define payload_offset_len_SHIFT 0
 #define payload_offset_len_MASK 0x0000ffff
 #define payload_offset_len_WORD word3
@@ -4863,6 +4864,7 @@ struct fcp_iread64_wqe {
 #define        cmd_buff_len_SHIFT  16
 #define        cmd_buff_len_MASK  0x00000ffff
 #define        cmd_buff_len_WORD  word3
+/* Note: payload_offset_len field depends on ASIC support */
 #define payload_offset_len_SHIFT 0
 #define payload_offset_len_MASK 0x0000ffff
 #define payload_offset_len_WORD word3
@@ -4879,6 +4881,7 @@ struct fcp_icmnd64_wqe {
 #define        cmd_buff_len_SHIFT  16
 #define        cmd_buff_len_MASK  0x00000ffff
 #define        cmd_buff_len_WORD  word3
+/* Note: payload_offset_len field depends on ASIC support */
 #define payload_offset_len_SHIFT 0
 #define payload_offset_len_MASK 0x0000ffff
 #define payload_offset_len_WORD word3
index e1dfa96c2a553a51b123c7a53814d1288922106d..0c1404dc5f3bdb3d87ace1f21b4be4aac29e71d6 100644 (file)
@@ -4699,6 +4699,7 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
        uint64_t wwn;
        bool use_no_reset_hba = false;
        int rc;
+       u8 if_type;
 
        if (lpfc_no_hba_reset_cnt) {
                if (phba->sli_rev < LPFC_SLI_REV4 &&
@@ -4773,10 +4774,24 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
        shost->max_id = LPFC_MAX_TARGET;
        shost->max_lun = vport->cfg_max_luns;
        shost->this_id = -1;
-       if (phba->sli_rev == LPFC_SLI_REV4)
-               shost->max_cmd_len = LPFC_FCP_CDB_LEN_32;
-       else
+
+       /* Set max_cmd_len applicable to ASIC support */
+       if (phba->sli_rev == LPFC_SLI_REV4) {
+               if_type = bf_get(lpfc_sli_intf_if_type,
+                                &phba->sli4_hba.sli_intf);
+               switch (if_type) {
+               case LPFC_SLI_INTF_IF_TYPE_2:
+                       fallthrough;
+               case LPFC_SLI_INTF_IF_TYPE_6:
+                       shost->max_cmd_len = LPFC_FCP_CDB_LEN_32;
+                       break;
+               default:
+                       shost->max_cmd_len = LPFC_FCP_CDB_LEN;
+                       break;
+               }
+       } else {
                shost->max_cmd_len = LPFC_FCP_CDB_LEN;
+       }
 
        if (phba->sli_rev == LPFC_SLI_REV4) {
                if (!phba->cfg_fcp_mq_threshold ||
index 98ce9d97a225703fdd060d35b27151795aa9e17d..9f0b59672e1915d98ddee8737a5fdc4198c65b70 100644 (file)
@@ -4760,7 +4760,7 @@ static int lpfc_scsi_prep_cmnd_buf_s4(struct lpfc_vport *vport,
 
         /* Word 3 */
        bf_set(payload_offset_len, &wqe->fcp_icmd,
-              sizeof(struct fcp_cmnd32) + sizeof(struct fcp_rsp));
+              sizeof(struct fcp_cmnd) + sizeof(struct fcp_rsp));
 
        /* Word 6 */
        bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com,