scsi: lpfc: Add support for ATTO Fibre Channel devices
authorBradley Grove <bgrove@attotech.com>
Tue, 24 May 2022 12:56:21 +0000 (08:56 -0400)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 2 Jun 2022 02:40:59 +0000 (22:40 -0400)
Update pci_device_id table and generate reporting strings for ATTO Celerity
and ThunderLink Fibre Channel devices.

Link: https://lore.kernel.org/r/20220524125621.47102-1-bgrove@attotech.com
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: James Smart <jsmart2021@gmail.com>
Co-developed-by: Jason Seba <jseba@attotech.com>
Signed-off-by: Jason Seba <jseba@attotech.com>
Signed-off-by: Bradley Grove <bgrove@attotech.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_hw.h
drivers/scsi/lpfc/lpfc_ids.h
drivers/scsi/lpfc/lpfc_init.c

index 748c532..7b8cf67 100644 (file)
@@ -1736,6 +1736,28 @@ struct lpfc_fdmi_reg_portattr {
 #define PCI_DEVICE_ID_TOMCAT        0x0714
 #define PCI_DEVICE_ID_SKYHAWK       0x0724
 #define PCI_DEVICE_ID_SKYHAWK_VF    0x072c
+#define PCI_VENDOR_ID_ATTO          0x117c
+#define PCI_DEVICE_ID_CLRY_16XE     0x0064
+#define PCI_DEVICE_ID_CLRY_161E     0x0063
+#define PCI_DEVICE_ID_CLRY_162E     0x0064
+#define PCI_DEVICE_ID_CLRY_164E     0x0065
+#define PCI_DEVICE_ID_CLRY_16XP     0x0094
+#define PCI_DEVICE_ID_CLRY_161P     0x00a0
+#define PCI_DEVICE_ID_CLRY_162P     0x0094
+#define PCI_DEVICE_ID_CLRY_164P     0x00a1
+#define PCI_DEVICE_ID_CLRY_32XE     0x0094
+#define PCI_DEVICE_ID_CLRY_321E     0x00a2
+#define PCI_DEVICE_ID_CLRY_322E     0x00a3
+#define PCI_DEVICE_ID_CLRY_324E     0x00ac
+#define PCI_DEVICE_ID_CLRY_32XP     0x00bb
+#define PCI_DEVICE_ID_CLRY_321P     0x00bc
+#define PCI_DEVICE_ID_CLRY_322P     0x00bd
+#define PCI_DEVICE_ID_CLRY_324P     0x00be
+#define PCI_DEVICE_ID_TLFC_2        0x0064
+#define PCI_DEVICE_ID_TLFC_2XX2     0x4064
+#define PCI_DEVICE_ID_TLFC_3        0x0094
+#define PCI_DEVICE_ID_TLFC_3162     0x40a6
+#define PCI_DEVICE_ID_TLFC_3322     0x40a7
 
 #define JEDEC_ID_ADDRESS            0x0080001c
 #define FIREFLY_JEDEC_ID            0x1ACC
index 6a90e6e..a1b9be2 100644 (file)
@@ -124,5 +124,35 @@ const struct pci_device_id lpfc_id_table[] = {
                PCI_ANY_ID, PCI_ANY_ID, },
        {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_SKYHAWK_VF,
                PCI_ANY_ID, PCI_ANY_ID, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_16XE,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_161E, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_16XE,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_162E, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_16XE,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_164E, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_16XP,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_161P, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_16XP,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_162P, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_16XP,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_164P, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_32XE,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_321E, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_32XE,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_322E, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_32XE,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_324E, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_32XP,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_321P, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_32XP,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_322P, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_32XP,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_CLRY_324P, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_TLFC_2,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_TLFC_2XX2, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_TLFC_3,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_TLFC_3162, },
+       {PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_TLFC_3,
+               PCI_VENDOR_ID_ATTO, PCI_DEVICE_ID_TLFC_3322, },
        { 0 }
 };
index 2bffaa6..93b94c6 100644 (file)
@@ -2414,6 +2414,90 @@ lpfc_parse_vpd(struct lpfc_hba *phba, uint8_t *vpd, int len)
        return(1);
 }
 
+/**
+ * lpfc_get_atto_model_desc - Retrieve ATTO HBA device model name and description
+ * @phba: pointer to lpfc hba data structure.
+ * @mdp: pointer to the data structure to hold the derived model name.
+ * @descp: pointer to the data structure to hold the derived description.
+ *
+ * This routine retrieves HBA's description based on its registered PCI device
+ * ID. The @descp passed into this function points to an array of 256 chars. It
+ * shall be returned with the model name, maximum speed, and the host bus type.
+ * The @mdp passed into this function points to an array of 80 chars. When the
+ * function returns, the @mdp will be filled with the model name.
+ **/
+static void
+lpfc_get_atto_model_desc(struct lpfc_hba *phba, uint8_t *mdp, uint8_t *descp)
+{
+       uint16_t sub_dev_id = phba->pcidev->subsystem_device;
+       char *model = "<Unknown>";
+       int tbolt = 0;
+
+       switch (sub_dev_id) {
+       case PCI_DEVICE_ID_CLRY_161E:
+               model = "161E";
+               break;
+       case PCI_DEVICE_ID_CLRY_162E:
+               model = "162E";
+               break;
+       case PCI_DEVICE_ID_CLRY_164E:
+               model = "164E";
+               break;
+       case PCI_DEVICE_ID_CLRY_161P:
+               model = "161P";
+               break;
+       case PCI_DEVICE_ID_CLRY_162P:
+               model = "162P";
+               break;
+       case PCI_DEVICE_ID_CLRY_164P:
+               model = "164P";
+               break;
+       case PCI_DEVICE_ID_CLRY_321E:
+               model = "321E";
+               break;
+       case PCI_DEVICE_ID_CLRY_322E:
+               model = "322E";
+               break;
+       case PCI_DEVICE_ID_CLRY_324E:
+               model = "324E";
+               break;
+       case PCI_DEVICE_ID_CLRY_321P:
+               model = "321P";
+               break;
+       case PCI_DEVICE_ID_CLRY_322P:
+               model = "322P";
+               break;
+       case PCI_DEVICE_ID_CLRY_324P:
+               model = "324P";
+               break;
+       case PCI_DEVICE_ID_TLFC_2XX2:
+               model = "2XX2";
+               tbolt = 1;
+               break;
+       case PCI_DEVICE_ID_TLFC_3162:
+               model = "3162";
+               tbolt = 1;
+               break;
+       case PCI_DEVICE_ID_TLFC_3322:
+               model = "3322";
+               tbolt = 1;
+               break;
+       default:
+               model = "Unknown";
+               break;
+       }
+
+       if (mdp && mdp[0] == '\0')
+               snprintf(mdp, 79, "%s", model);
+
+       if (descp && descp[0] == '\0')
+               snprintf(descp, 255,
+                        "ATTO %s%s, Fibre Channel Adapter Initiator, Port %s",
+                        (tbolt) ? "ThunderLink FC " : "Celerity FC-",
+                        model,
+                        phba->Port);
+}
+
 /**
  * lpfc_get_hba_model_desc - Retrieve HBA device model name and description
  * @phba: pointer to lpfc hba data structure.
@@ -2444,6 +2528,11 @@ lpfc_get_hba_model_desc(struct lpfc_hba *phba, uint8_t *mdp, uint8_t *descp)
                && descp && descp[0] != '\0')
                return;
 
+       if (phba->pcidev->vendor == PCI_VENDOR_ID_ATTO) {
+               lpfc_get_atto_model_desc(phba, mdp, descp);
+               return;
+       }
+
        if (phba->lmt & LMT_64Gb)
                max_speed = 64;
        else if (phba->lmt & LMT_32Gb)