scsi: lpfc: Revise Topology and RAS support checks for new adapters
authorJames Smart <jsmart2021@gmail.com>
Thu, 22 Jul 2021 22:17:18 +0000 (15:17 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 27 Jul 2021 04:06:41 +0000 (00:06 -0400)
Support for Topology and RAS logging capabilities were qualified by PCIe
device ID checks necessitating additional driver changes for new device
IDs.

Reduce reliance on specific PCIe device IDs by substituting checks for SLI
family information. This automatically picks up support on the newest
hardware.

Link: https://lore.kernel.org/r/20210722221721.74388-4-jsmart2021@gmail.com
Co-developed-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_attr.c
drivers/scsi/lpfc/lpfc_hw4.h
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/lpfc/lpfc_mbox.c
drivers/scsi/lpfc/lpfc_scsi.c

index 457989cfc0b73bc19dee5fcace10589b47cade64..a5154856bc0f698c4f8b95ef3027ade39bf4053e 100644 (file)
@@ -4038,6 +4038,7 @@ lpfc_topology_store(struct device *dev, struct device_attribute *attr,
        const char *val_buf = buf;
        int err;
        uint32_t prev_val;
+       u8 sli_family, if_type;
 
        if (!strncmp(buf, "nolip ", strlen("nolip "))) {
                nolip = 1;
@@ -4061,13 +4062,16 @@ lpfc_topology_store(struct device *dev, struct device_attribute *attr,
                /*
                 * The 'topology' is not a configurable parameter if :
                 *   - persistent topology enabled
-                *   - G7/G6 with no private loop support
+                *   - ASIC_GEN_NUM >= 0xC, with no private loop support
                 */
-
+               sli_family = bf_get(lpfc_sli_intf_sli_family,
+                                   &phba->sli4_hba.sli_intf);
+               if_type = bf_get(lpfc_sli_intf_if_type,
+                                &phba->sli4_hba.sli_intf);
                if ((phba->hba_flag & HBA_PERSISTENT_TOPO ||
-                    (!phba->sli4_hba.pc_sli4_params.pls &&
-                    (phba->pcidev->device == PCI_DEVICE_ID_LANCER_G6_FC ||
-                    phba->pcidev->device == PCI_DEVICE_ID_LANCER_G7_FC))) &&
+                   (!phba->sli4_hba.pc_sli4_params.pls &&
+                    (sli_family == LPFC_SLI_INTF_FAMILY_G6 ||
+                     if_type == LPFC_SLI_INTF_IF_TYPE_6))) &&
                    val == 4) {
                        lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
                                "3114 Loop mode not supported\n");
index c31a0cbcc2086f09351e938c7b03bfef39e7b2db..aadbb0de629d9edea6b13d3e08a6805968d43184 100644 (file)
@@ -94,6 +94,9 @@ struct lpfc_sli_intf {
 #define LPFC_SLI_INTF_FAMILY_BE3       0x1
 #define LPFC_SLI_INTF_FAMILY_LNCR_A0   0xa
 #define LPFC_SLI_INTF_FAMILY_LNCR_B0   0xb
+#define LPFC_SLI_INTF_FAMILY_G6                0xc
+#define LPFC_SLI_INTF_FAMILY_G7                0xd
+#define LPFC_SLI_INTF_FAMILY_G7P       0xe
 #define lpfc_sli_intf_slirev_SHIFT             4
 #define lpfc_sli_intf_slirev_MASK              0x0000000F
 #define lpfc_sli_intf_slirev_WORD              word0
@@ -4719,6 +4722,7 @@ union lpfc_wqe128 {
 
 #define MAGIC_NUMBER_G6 0xFEAA0003
 #define MAGIC_NUMBER_G7 0xFEAA0005
+#define MAGIC_NUMBER_G7P 0xFEAA0020
 
 struct lpfc_grp_hdr {
        uint32_t size;
index f08129c67a2e91184d1050ee3f58b541dd462e90..ead8e91e862577e3c772a3fdd47d8f2f05de25f7 100644 (file)
@@ -8550,9 +8550,12 @@ lpfc_map_topology(struct lpfc_hba *phba, struct lpfc_mbx_read_config *rd_config)
        }
        /* FW supports persistent topology - override module parameter value */
        phba->hba_flag |= HBA_PERSISTENT_TOPO;
-       switch (phba->pcidev->device) {
-       case PCI_DEVICE_ID_LANCER_G7_FC:
-       case PCI_DEVICE_ID_LANCER_G6_FC:
+
+       /* if ASIC_GEN_NUM >= 0xC) */
+       if ((bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) ==
+                   LPFC_SLI_INTF_IF_TYPE_6) ||
+           (bf_get(lpfc_sli_intf_sli_family, &phba->sli4_hba.sli_intf) ==
+                   LPFC_SLI_INTF_FAMILY_G6)) {
                if (!tf) {
                        phba->cfg_topology = ((pt == LINK_FLAGS_LOOP)
                                        ? FLAGS_TOPOLOGY_MODE_LOOP
@@ -8560,8 +8563,7 @@ lpfc_map_topology(struct lpfc_hba *phba, struct lpfc_mbx_read_config *rd_config)
                } else {
                        phba->hba_flag &= ~HBA_PERSISTENT_TOPO;
                }
-               break;
-       default:        /* G5 */
+       } else { /* G5 */
                if (tf) {
                        /* If topology failover set - pt is '0' or '1' */
                        phba->cfg_topology = (pt ? FLAGS_TOPOLOGY_MODE_PT_LOOP :
@@ -8571,7 +8573,6 @@ lpfc_map_topology(struct lpfc_hba *phba, struct lpfc_mbx_read_config *rd_config)
                                        ? FLAGS_TOPOLOGY_MODE_PT_PT
                                        : FLAGS_TOPOLOGY_MODE_LOOP);
                }
-               break;
        }
        if (phba->hba_flag & HBA_PERSISTENT_TOPO) {
                lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
@@ -12991,7 +12992,9 @@ lpfc_log_write_firmware_error(struct lpfc_hba *phba, uint32_t offset,
        const struct firmware *fw)
 {
        int rc;
+       u8 sli_family;
 
+       sli_family = bf_get(lpfc_sli_intf_sli_family, &phba->sli4_hba.sli_intf);
        /* Three cases:  (1) FW was not supported on the detected adapter.
         * (2) FW update has been locked out administratively.
         * (3) Some other error during FW update.
@@ -12999,10 +13002,12 @@ lpfc_log_write_firmware_error(struct lpfc_hba *phba, uint32_t offset,
         * for admin diagnosis.
         */
        if (offset == ADD_STATUS_FW_NOT_SUPPORTED ||
-           (phba->pcidev->device == PCI_DEVICE_ID_LANCER_G6_FC &&
+           (sli_family == LPFC_SLI_INTF_FAMILY_G6 &&
             magic_number != MAGIC_NUMBER_G6) ||
-           (phba->pcidev->device == PCI_DEVICE_ID_LANCER_G7_FC &&
-            magic_number != MAGIC_NUMBER_G7)) {
+           (sli_family == LPFC_SLI_INTF_FAMILY_G7 &&
+            magic_number != MAGIC_NUMBER_G7) ||
+           (sli_family == LPFC_SLI_INTF_FAMILY_G7P &&
+            magic_number != MAGIC_NUMBER_G7P)) {
                lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
                                "3030 This firmware version is not supported on"
                                " this HBA model. Device:%x Magic:%x Type:%x "
@@ -14053,17 +14058,18 @@ lpfc_sli4_oas_verify(struct lpfc_hba *phba)
 void
 lpfc_sli4_ras_init(struct lpfc_hba *phba)
 {
-       switch (phba->pcidev->device) {
-       case PCI_DEVICE_ID_LANCER_G6_FC:
-       case PCI_DEVICE_ID_LANCER_G7_FC:
+       /* if ASIC_GEN_NUM >= 0xC) */
+       if ((bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) ==
+                   LPFC_SLI_INTF_IF_TYPE_6) ||
+           (bf_get(lpfc_sli_intf_sli_family, &phba->sli4_hba.sli_intf) ==
+                   LPFC_SLI_INTF_FAMILY_G6)) {
                phba->ras_fwlog.ras_hwsupport = true;
                if (phba->cfg_ras_fwlog_func == PCI_FUNC(phba->pcidev->devfn) &&
                    phba->cfg_ras_fwlog_buffsize)
                        phba->ras_fwlog.ras_enabled = true;
                else
                        phba->ras_fwlog.ras_enabled = false;
-               break;
-       default:
+       } else {
                phba->ras_fwlog.ras_hwsupport = false;
        }
 }
index 84bc373190d85c6d1a71cf3f9a9ed93be30eb8ce..6c754ee96beeec7d4c5319045efb80f40f6c2da7 100644 (file)
@@ -513,8 +513,9 @@ lpfc_init_link(struct lpfc_hba * phba,
                break;
        }
 
-       if ((phba->pcidev->device == PCI_DEVICE_ID_LANCER_G6_FC ||
-            phba->pcidev->device == PCI_DEVICE_ID_LANCER_G7_FC) &&
+       /* Topology handling for ASIC_GEN_NUM 0xC and later */
+       if ((phba->sli4_hba.pc_sli4_params.sli_family == LPFC_SLI_INTF_FAMILY_G6 ||
+            phba->sli4_hba.pc_sli4_params.if_type == LPFC_SLI_INTF_IF_TYPE_6) &&
            !(phba->sli4_hba.pc_sli4_params.pls) &&
            mb->un.varInitLnk.link_flags & FLAGS_TOPOLOGY_MODE_LOOP) {
                mb->un.varInitLnk.link_flags = FLAGS_TOPOLOGY_MODE_PT_PT;
index 10002a13c5c6e5eb878c4b4c07d9801b6c0def6a..ee4ff485586617b2bc3e306e3a7305b609685110 100644 (file)
@@ -5029,12 +5029,8 @@ lpfc_check_pci_resettable(struct lpfc_hba *phba)
                }
 
                /* Check for valid Emulex Device ID */
-               switch (ptr->device) {
-               case PCI_DEVICE_ID_LANCER_FC:
-               case PCI_DEVICE_ID_LANCER_G6_FC:
-               case PCI_DEVICE_ID_LANCER_G7_FC:
-                       break;
-               default:
+               if (phba->sli_rev != LPFC_SLI_REV4 ||
+                   phba->hba_flag & HBA_FCOE_MODE) {
                        lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
                                        "8347 Incapable PCI reset device: "
                                        "0x%04x\n", ptr->device);