scsi: smartpqi: Add support for new product ids
authorKevin Barnett <kevin.barnett@microchip.com>
Thu, 11 Mar 2021 20:15:09 +0000 (14:15 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 6 Apr 2021 03:02:28 +0000 (23:02 -0400)
Add support for newer hardware by adding in a product identifier. This
identifier can then be used to check for the hardware generation.

Link: https://lore.kernel.org/r/161549370966.25025.2968242206975557607.stgit@brunhilda
Reviewed-by: Scott Benesh <scott.benesh@microchip.com>
Reviewed-by: Mike McGowen <mike.mcgowen@microchip.com>
Reviewed-by: Scott Teel <scott.teel@microchip.com>
Reviewed-by: Martin Wilck <mwilck@suse.com>
Signed-off-by: Kevin Barnett <kevin.barnett@microchip.com>
Signed-off-by: Don Brace <don.brace@microchip.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/smartpqi/smartpqi.h
drivers/scsi/smartpqi/smartpqi_init.c
drivers/scsi/smartpqi/smartpqi_sis.c
drivers/scsi/smartpqi/smartpqi_sis.h

index 3e54590..7d3f956 100644 (file)
@@ -79,7 +79,8 @@ struct pqi_ctrl_registers {
        __le32  sis_ctrl_to_host_doorbell_clear;        /* A0h */
        u8      reserved4[0xb0 - (0xa0 + sizeof(__le32))];
        __le32  sis_driver_scratch;                     /* B0h */
-       u8      reserved5[0xbc - (0xb0 + sizeof(__le32))];
+       __le32  sis_product_identifier;                 /* B4h */
+       u8      reserved5[0xbc - (0xb4 + sizeof(__le32))];
        __le32  sis_firmware_status;                    /* BCh */
        u8      reserved6[0x1000 - (0xbc + sizeof(__le32))];
        __le32  sis_mailbox[8];                         /* 1000h */
@@ -585,6 +586,7 @@ struct pqi_raid_error_info {
 /* these values are defined by the PQI spec */
 #define PQI_MAX_NUM_ELEMENTS_ADMIN_QUEUE       255
 #define PQI_MAX_NUM_ELEMENTS_OPERATIONAL_QUEUE 65535
+
 #define PQI_QUEUE_ELEMENT_ARRAY_ALIGNMENT      64
 #define PQI_QUEUE_ELEMENT_LENGTH_ALIGNMENT     16
 #define PQI_ADMIN_INDEX_ALIGNMENT              64
@@ -1082,6 +1084,11 @@ struct pqi_event {
        (PQI_RESERVED_IO_SLOTS_LUN_RESET + PQI_RESERVED_IO_SLOTS_EVENT_ACK + \
        PQI_RESERVED_IO_SLOTS_SYNCHRONOUS_REQUESTS)
 
+#define PQI_CTRL_PRODUCT_ID_GEN1       0
+#define PQI_CTRL_PRODUCT_ID_GEN2       7
+#define PQI_CTRL_PRODUCT_REVISION_A    0
+#define PQI_CTRL_PRODUCT_REVISION_B    1
+
 struct pqi_ctrl_info {
        unsigned int    ctrl_id;
        struct pci_dev  *pci_dev;
@@ -1089,6 +1096,8 @@ struct pqi_ctrl_info {
        char            serial_number[17];
        char            model[17];
        char            vendor[9];
+       u8              product_id;
+       u8              product_revision;
        void __iomem    *iomem_base;
        struct pqi_ctrl_registers __iomem *registers;
        struct pqi_device_registers __iomem *pqi_registers;
index 4533085..f388ef3 100644 (file)
@@ -7151,6 +7151,7 @@ static int pqi_force_sis_mode(struct pqi_ctrl_info *ctrl_info)
 static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info)
 {
        int rc;
+       u32 product_id;
 
        if (reset_devices) {
                sis_soft_reset(ctrl_info);
@@ -7187,6 +7188,10 @@ static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info)
                return rc;
        }
 
+       product_id = sis_get_product_id(ctrl_info);
+       ctrl_info->product_id = (u8)product_id;
+       ctrl_info->product_revision = (u8)(product_id >> 8);
+
        if (reset_devices) {
                if (ctrl_info->max_outstanding_requests >
                        PQI_MAX_OUTSTANDING_REQUESTS_KDUMP)
@@ -8608,6 +8613,8 @@ static void __attribute__((unused)) verify_structures(void)
        BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
                sis_driver_scratch) != 0xb0);
        BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
+               sis_product_identifier) != 0xb4);
+       BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
                sis_firmware_status) != 0xbc);
        BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
                sis_mailbox) != 0x1000);
index 26ea6b9..f0199bd 100644 (file)
@@ -149,6 +149,11 @@ bool sis_is_kernel_up(struct pqi_ctrl_info *ctrl_info)
                                SIS_CTRL_KERNEL_UP;
 }
 
+u32 sis_get_product_id(struct pqi_ctrl_info *ctrl_info)
+{
+       return readl(&ctrl_info->registers->sis_product_identifier);
+}
+
 /* used for passing command parameters/results when issuing SIS commands */
 struct sis_sync_cmd_params {
        u32     mailbox[6];     /* mailboxes 0-5 */
index 878d34c..12cd2ab 100644 (file)
@@ -27,5 +27,6 @@ int sis_reenable_sis_mode(struct pqi_ctrl_info *ctrl_info);
 void sis_write_driver_scratch(struct pqi_ctrl_info *ctrl_info, u32 value);
 u32 sis_read_driver_scratch(struct pqi_ctrl_info *ctrl_info);
 void sis_soft_reset(struct pqi_ctrl_info *ctrl_info);
+u32 sis_get_product_id(struct pqi_ctrl_info *ctrl_info);
 
 #endif /* _SMARTPQI_SIS_H */