scsi: smartpqi: Add phy ID support for the physical drives
authorMurthy Bhat <Murthy.Bhat@microchip.com>
Thu, 11 Mar 2021 20:17:19 +0000 (14:17 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 6 Apr 2021 03:02:32 +0000 (23:02 -0400)
Display topology using PHY numbers. PHY (both local and remote) numbers
corresponding to physical drives are read from
BMIC_IDENTIFY_PHYSICAL_DEVICE.

Link: https://lore.kernel.org/r/161549383947.25025.16977895345376485056.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: Kevin Barnett <kevin.barnett@microchip.com>
Reviewed-by: Martin Wilck <mwilck@suse.com>
Signed-off-by: Murthy Bhat <Murthy.Bhat@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_sas_transport.c

index 0b94c75..d7dac55 100644 (file)
@@ -1089,6 +1089,7 @@ struct pqi_scsi_dev {
        u8      phy_connected_dev_type;
        u8      box[8];
        u16     phys_connector[8];
+       u8      phy_id;
        bool    raid_bypass_configured; /* RAID bypass configured */
        bool    raid_bypass_enabled;    /* RAID bypass enabled */
        u32     next_bypass_group;
index 761d7ec..0e43322 100644 (file)
@@ -1434,6 +1434,8 @@ no_buffer:
        device->volume_offline = volume_offline;
 }
 
+#define PQI_DEVICE_PHY_MAP_SUPPORTED   0x10
+
 static int pqi_get_physical_device_info(struct pqi_ctrl_info *ctrl_info,
        struct pqi_scsi_dev *device,
        struct bmic_identify_physical_device *id_phys)
@@ -1473,6 +1475,13 @@ static int pqi_get_physical_device_info(struct pqi_ctrl_info *ctrl_info,
        memcpy(&device->page_83_identifier, &id_phys->page_83_identifier,
                sizeof(device->page_83_identifier));
 
+       if ((id_phys->even_more_flags & PQI_DEVICE_PHY_MAP_SUPPORTED) &&
+               id_phys->phy_count)
+               device->phy_id =
+                       id_phys->phy_to_phy_map[device->active_path_index];
+       else
+               device->phy_id = 0xFF;
+
        return 0;
 }
 
@@ -1839,6 +1848,7 @@ static void pqi_scsi_update_device(struct pqi_scsi_dev *existing_device,
        existing_device->aio_handle = new_device->aio_handle;
        existing_device->volume_status = new_device->volume_status;
        existing_device->active_path_index = new_device->active_path_index;
+       existing_device->phy_id = new_device->phy_id;
        existing_device->path_map = new_device->path_map;
        existing_device->bay = new_device->bay;
        existing_device->box_index = new_device->box_index;
index 77923c6..71e83d5 100644 (file)
@@ -92,6 +92,7 @@ static int pqi_sas_port_add_rphy(struct pqi_sas_port *pqi_sas_port,
 
        identify = &rphy->identify;
        identify->sas_address = pqi_sas_port->sas_address;
+       identify->phy_identifier = pqi_sas_port->device->phy_id;
 
        if (pqi_sas_port->device &&
                pqi_sas_port->device->is_expander_smp_device) {