For Dev Handles who value is less than hba's phys count number
 driver will return HBA sas address value as a sas address.
So for Virtual SES device also driver was returning HBA sas address instead
 of Virtual SES sas address. So now updated the driver to return
 Virtual SES's sas address for Virtual SES device instead of
 HBA's sas address.

Signed-off-by: Sreekanth Reddy <sreekanth.re...@broadcom.com>
---
 drivers/scsi/mpt3sas/mpt3sas_scsih.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c 
b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
index 600e8ef..cc78ce4 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
@@ -406,11 +406,6 @@ _scsih_get_sas_address(struct MPT3SAS_ADAPTER *ioc, u16 
handle,
 
        *sas_address = 0;
 
-       if (handle <= ioc->sas_hba.num_phys) {
-               *sas_address = ioc->sas_hba.sas_address;
-               return 0;
-       }
-
        if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
            MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
                pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n", ioc->name,
@@ -420,7 +415,15 @@ _scsih_get_sas_address(struct MPT3SAS_ADAPTER *ioc, u16 
handle,
 
        ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & MPI2_IOCSTATUS_MASK;
        if (ioc_status == MPI2_IOCSTATUS_SUCCESS) {
-               *sas_address = le64_to_cpu(sas_device_pg0.SASAddress);
+               /* For HBA vSES don't return hba sas address instead return
+                * vSES's sas address.
+                */
+               if ((handle <= ioc->sas_hba.num_phys) &&
+                  (!(le32_to_cpu(sas_device_pg0.DeviceInfo) &
+                  MPI2_SAS_DEVICE_INFO_SEP)))
+                       *sas_address = ioc->sas_hba.sas_address;
+               else
+                       *sas_address = le64_to_cpu(sas_device_pg0.SASAddress);
                return 0;
        }
 
-- 
2.4.3

Reply via email to