diff mbox

[06/20,SCSI] mpt3sas: Provides the physical location of sas drives

Message ID 1434102153-38581-7-git-send-email-Sreekanth.Reddy@avagotech.com (mailing list archive)
State New, archived
Headers show

Commit Message

Sreekanth Reddy June 12, 2015, 9:42 a.m. UTC
This Patch will provide more details of the devices such as slot number, enclosure logical id, enclosure level & connector name in the following scenarios,

- When end device is added in the topology,
- When the end device is removed from the setup,
- When the SCSI mid layer issues TASK ABORT/ DEVICE RESET/ TARGET RESET during error handling,
- When any command to the device fails with Sense key Hardware error or Medium error or Unit Attention,
- When firmware returns device error or device not ready status for the end device,
- When a Predicted fault is detected on an end device.

This information can be used by the user to identify the location of the desired drive in the topology.

Driver will get these information by reading the sas device page0.

Signed-off-by: Sreekanth Reddy <Sreekanth.Reddy@avagotech.com>
---
 drivers/scsi/mpt3sas/mpt3sas_base.h  |   2 +
 drivers/scsi/mpt3sas/mpt3sas_scsih.c | 238 +++++++++++++++++++++++++++++------
 2 files changed, 201 insertions(+), 39 deletions(-)

Comments

Sreekanth Reddy June 18, 2015, 9:56 a.m. UTC | #1
Hi,

Any other review comments on this patch. please let us known if any
changes are required.

Thanks,
Sreekanth

On Fri, Jun 12, 2015 at 3:12 PM, Sreekanth Reddy
<sreekanth.reddy@avagotech.com> wrote:
> This Patch will provide more details of the devices such as slot number, enclosure logical id, enclosure level & connector name in the following scenarios,
>
> - When end device is added in the topology,
> - When the end device is removed from the setup,
> - When the SCSI mid layer issues TASK ABORT/ DEVICE RESET/ TARGET RESET during error handling,
> - When any command to the device fails with Sense key Hardware error or Medium error or Unit Attention,
> - When firmware returns device error or device not ready status for the end device,
> - When a Predicted fault is detected on an end device.
>
> This information can be used by the user to identify the location of the desired drive in the topology.
>
> Driver will get these information by reading the sas device page0.
>
> Signed-off-by: Sreekanth Reddy <Sreekanth.Reddy@avagotech.com>
> ---
>  drivers/scsi/mpt3sas/mpt3sas_base.h  |   2 +
>  drivers/scsi/mpt3sas/mpt3sas_scsih.c | 238 +++++++++++++++++++++++++++++------
>  2 files changed, 201 insertions(+), 39 deletions(-)
>
> diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h b/drivers/scsi/mpt3sas/mpt3sas_base.h
> index b79ad4f..293ad23 100644
> --- a/drivers/scsi/mpt3sas/mpt3sas_base.h
> +++ b/drivers/scsi/mpt3sas/mpt3sas_base.h
> @@ -317,6 +317,8 @@ struct _sas_device {
>         u8      fast_path;
>         u8      pfa_led_on;
>         u8      pend_sas_rphy_add;
> +       u8   enclosure_level;
> +       u8   connector_name[4];
>  };
>
>  /**
> diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
> index d457dba..64dd90b 100644
> --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
> +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
> @@ -585,6 +585,22 @@ _scsih_sas_device_remove(struct MPT3SAS_ADAPTER *ioc,
>
>         if (!sas_device)
>                 return;
> +       pr_info(MPT3SAS_FMT
> +           "removing handle(0x%04x), sas_addr(0x%016llx)\n",
> +           ioc->name, sas_device->handle,
> +           (unsigned long long) sas_device->sas_address);
> +
> +       if (sas_device->enclosure_handle != 0)
> +               pr_info(MPT3SAS_FMT
> +                  "removing enclosure logical id(0x%016llx), slot(%d)\n",
> +                  ioc->name, (unsigned long long)
> +                  sas_device->enclosure_logical_id, sas_device->slot);
> +
> +       if (sas_device->connector_name[0] != '\0')
> +               pr_info(MPT3SAS_FMT
> +                  "removing enclosure level(0x%04x), connector name( %s)\n",
> +                  ioc->name, sas_device->enclosure_level,
> +                  sas_device->connector_name);
>
>         spin_lock_irqsave(&ioc->sas_device_lock, flags);
>         list_del(&sas_device->list);
> @@ -663,6 +679,18 @@ _scsih_sas_device_add(struct MPT3SAS_ADAPTER *ioc,
>                 ioc->name, __func__, sas_device->handle,
>                 (unsigned long long)sas_device->sas_address));
>
> +       if (sas_device->enclosure_handle != 0)
> +               dewtprintk(ioc, pr_info(MPT3SAS_FMT
> +                   "%s: enclosure logical id(0x%016llx), slot( %d)\n",
> +                   ioc->name, __func__, (unsigned long long)
> +                   sas_device->enclosure_logical_id, sas_device->slot));
> +
> +       if (sas_device->connector_name[0] != '\0')
> +               dewtprintk(ioc, pr_info(MPT3SAS_FMT
> +                   "%s: enclosure level(0x%04x), connector name( %s)\n",
> +                   ioc->name, __func__,
> +                   sas_device->enclosure_level, sas_device->connector_name));
> +
>         spin_lock_irqsave(&ioc->sas_device_lock, flags);
>         list_add_tail(&sas_device->list, &ioc->sas_device_list);
>         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
> @@ -704,6 +732,18 @@ _scsih_sas_device_init_add(struct MPT3SAS_ADAPTER *ioc,
>                 __func__, sas_device->handle,
>                 (unsigned long long)sas_device->sas_address));
>
> +       if (sas_device->enclosure_handle != 0)
> +               dewtprintk(ioc, pr_info(MPT3SAS_FMT
> +                   "%s: enclosure logical id(0x%016llx), slot( %d)\n",
> +                   ioc->name, __func__, (unsigned long long)
> +                   sas_device->enclosure_logical_id, sas_device->slot));
> +
> +       if (sas_device->connector_name[0] != '\0')
> +               dewtprintk(ioc, pr_info(MPT3SAS_FMT
> +                   "%s: enclosure level(0x%04x), connector name( %s)\n",
> +                   ioc->name, __func__, sas_device->enclosure_level,
> +                   sas_device->connector_name));
> +
>         spin_lock_irqsave(&ioc->sas_device_lock, flags);
>         list_add_tail(&sas_device->list, &ioc->sas_device_init_list);
>         _scsih_determine_boot_device(ioc, sas_device, 0);
> @@ -1772,10 +1812,16 @@ _scsih_slave_configure(struct scsi_device *sdev)
>             "sas_addr(0x%016llx), phy(%d), device_name(0x%016llx)\n",
>             ds, handle, (unsigned long long)sas_device->sas_address,
>             sas_device->phy, (unsigned long long)sas_device->device_name);
> -       sdev_printk(KERN_INFO, sdev,
> -               "%s: enclosure_logical_id(0x%016llx), slot(%d)\n",
> -               ds, (unsigned long long)
> -           sas_device->enclosure_logical_id, sas_device->slot);
> +       if (sas_device->enclosure_handle != 0)
> +               sdev_printk(KERN_INFO, sdev,
> +                    "%s: enclosure_logical_id(0x%016llx), slot(%d)\n",
> +                    ds, (unsigned long long)
> +                    sas_device->enclosure_logical_id, sas_device->slot);
> +       if (sas_device->connector_name[0] != '\0')
> +               sdev_printk(KERN_INFO, sdev,
> +                    "%s: enclosure level(0x%04x), connector name( %s)\n",
> +                    ds, sas_device->enclosure_level,
> +                    sas_device->connector_name);
>
>         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
>
> @@ -2189,10 +2235,17 @@ _scsih_tm_display_info(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *scmd)
>                             sas_device->handle,
>                             (unsigned long long)sas_device->sas_address,
>                             sas_device->phy);
> -                       starget_printk(KERN_INFO, starget,
> -                           "enclosure_logical_id(0x%016llx), slot(%d)\n",
> -                          (unsigned long long)sas_device->enclosure_logical_id,
> -                           sas_device->slot);
> +                       if (sas_device->enclosure_handle != 0)
> +                               starget_printk(KERN_INFO, starget,
> +                                "enclosure_logical_id(0x%016llx), slot(%d)\n",
> +                                (unsigned long long)
> +                                sas_device->enclosure_logical_id,
> +                                sas_device->slot);
> +                       if (sas_device->connector_name)
> +                               starget_printk(KERN_INFO, starget,
> +                               "enclosure level(0x%04x),connector name(%s)\n",
> +                                sas_device->enclosure_level,
> +                                sas_device->connector_name);
>                 }
>                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
>         }
> @@ -2813,6 +2866,18 @@ _scsih_tm_tr_send(struct MPT3SAS_ADAPTER *ioc, u16 handle)
>                         "setting delete flag: handle(0x%04x), sas_addr(0x%016llx)\n",
>                         ioc->name, handle,
>                     (unsigned long long)sas_address));
> +               if (sas_device->enclosure_handle != 0)
> +                       dewtprintk(ioc, pr_info(MPT3SAS_FMT
> +                        "setting delete flag:enclosure logical id(0x%016llx),"
> +                        " slot(%d)\n", ioc->name, (unsigned long long)
> +                         sas_device->enclosure_logical_id,
> +                         sas_device->slot));
> +               if (sas_device->connector_name)
> +                       dewtprintk(ioc, pr_info(MPT3SAS_FMT
> +                        "setting delete flag: enclosure level(0x%04x),"
> +                        " connector name( %s)\n", ioc->name,
> +                         sas_device->enclosure_level,
> +                         sas_device->connector_name));
>                 _scsih_ublock_io_device(ioc, sas_address);
>                 sas_target_priv_data->handle = MPT3SAS_INVALID_DEVICE_HANDLE;
>         }
> @@ -3828,10 +3893,19 @@ _scsih_scsi_ioc_info(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,
>                                 "\tsas_address(0x%016llx), phy(%d)\n",
>                                 ioc->name, (unsigned long long)
>                             sas_device->sas_address, sas_device->phy);
> -                       pr_warn(MPT3SAS_FMT
> -                           "\tenclosure_logical_id(0x%016llx), slot(%d)\n",
> -                           ioc->name, (unsigned long long)
> -                           sas_device->enclosure_logical_id, sas_device->slot);
> +                       if (sas_device->enclosure_handle != 0)
> +                               pr_warn(MPT3SAS_FMT
> +                                 "\tenclosure_logical_id(0x%016llx),"
> +                                 "slot(%d)\n", ioc->name,
> +                                 (unsigned long long)
> +                                 sas_device->enclosure_logical_id,
> +                                 sas_device->slot);
> +                       if (sas_device->connector_name[0])
> +                               pr_warn(MPT3SAS_FMT
> +                                 "\tenclosure level(0x%04x),"
> +                                 " connector name( %s)\n", ioc->name,
> +                                 sas_device->enclosure_level,
> +                                 sas_device->connector_name);
>                 }
>                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
>         }
> @@ -4006,7 +4080,16 @@ _scsih_smart_predicted_fault(struct MPT3SAS_ADAPTER *ioc, u16 handle)
>                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
>                 return;
>         }
> -       starget_printk(KERN_WARNING, starget, "predicted fault\n");
> +       if (sas_device->enclosure_handle != 0)
> +               starget_printk(KERN_INFO, starget, "predicted fault, "
> +                       "enclosure logical id(0x%016llx), slot(%d)\n",
> +                       (unsigned long long)sas_device->enclosure_logical_id,
> +                       sas_device->slot);
> +       if (sas_device->connector_name[0] != '\0')
> +               starget_printk(KERN_WARNING, starget, "predicted fault, "
> +                       "enclosure level(0x%04x), connector name( %s)\n",
> +                       sas_device->enclosure_level,
> +                       sas_device->connector_name);
>         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
>
>         if (ioc->pdev->subsystem_vendor == PCI_VENDOR_ID_IBM)
> @@ -4126,8 +4209,13 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
>                         _scsih_smart_predicted_fault(ioc,
>                             le16_to_cpu(mpi_reply->DevHandle));
>                 mpt3sas_trigger_scsi(ioc, data.skey, data.asc, data.ascq);
> -       }
>
> +               if (!(ioc->logging_level & MPT_DEBUG_REPLY) &&
> +                    ((scmd->sense_buffer[2] == UNIT_ATTENTION) ||
> +                    (scmd->sense_buffer[2] == MEDIUM_ERROR) ||
> +                    (scmd->sense_buffer[2] == HARDWARE_ERROR)))
> +                       _scsih_scsi_ioc_info(ioc, scmd, mpi_reply, smid);
> +               }
>         switch (ioc_status) {
>         case MPI2_IOCSTATUS_BUSY:
>         case MPI2_IOCSTATUS_INSUFFICIENT_RESOURCES:
> @@ -4795,6 +4883,16 @@ _scsih_check_device(struct MPT3SAS_ADAPTER *ioc,
>                         sas_device->handle, handle);
>                 sas_target_priv_data->handle = handle;
>                 sas_device->handle = handle;
> +               if (sas_device_pg0.Flags &
> +                    MPI2_SAS_DEVICE0_FLAGS_ENCL_LEVEL_VALID) {
> +                       sas_device->enclosure_level =
> +                               le16_to_cpu(sas_device_pg0.EnclosureLevel);
> +                       memcpy(&sas_device->connector_name[0],
> +                               &sas_device_pg0.ConnectorName[0], 4);
> +               } else {
> +                       sas_device->enclosure_level = 0;
> +                       sas_device->connector_name[0] = '\0';
> +               }
>         }
>
>         /* check if device is present */
> @@ -4901,14 +4999,24 @@ _scsih_add_device(struct MPT3SAS_ADAPTER *ioc, u16 handle, u8 phy_num,
>                     ioc->name, __FILE__, __LINE__, __func__);
>         sas_device->enclosure_handle =
>             le16_to_cpu(sas_device_pg0.EnclosureHandle);
> -       sas_device->slot =
> -           le16_to_cpu(sas_device_pg0.Slot);
> +       if (sas_device->enclosure_handle != 0)
> +               sas_device->slot =
> +                   le16_to_cpu(sas_device_pg0.Slot);
>         sas_device->device_info = device_info;
>         sas_device->sas_address = sas_address;
>         sas_device->phy = sas_device_pg0.PhyNum;
>         sas_device->fast_path = (le16_to_cpu(sas_device_pg0.Flags) &
>             MPI25_SAS_DEVICE0_FLAGS_FAST_PATH_CAPABLE) ? 1 : 0;
>
> +       if (sas_device_pg0.Flags & MPI2_SAS_DEVICE0_FLAGS_ENCL_LEVEL_VALID) {
> +               sas_device->enclosure_level =
> +                       le16_to_cpu(sas_device_pg0.EnclosureLevel);
> +               memcpy(&sas_device->connector_name[0],
> +                       &sas_device_pg0.ConnectorName[0], 4);
> +       } else {
> +               sas_device->enclosure_level = 0;
> +               sas_device->connector_name[0] = '\0';
> +       }
>         /* get enclosure_logical_id */
>         if (sas_device->enclosure_handle && !(mpt3sas_config_get_enclosure_pg0(
>            ioc, &mpi_reply, &enclosure_pg0, MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE,
> @@ -4950,6 +5058,18 @@ _scsih_remove_device(struct MPT3SAS_ADAPTER *ioc,
>                 ioc->name, __func__,
>             sas_device->handle, (unsigned long long)
>             sas_device->sas_address));
> +       if (sas_device->enclosure_handle != 0)
> +               dewtprintk(ioc, pr_info(MPT3SAS_FMT
> +                   "%s: enter: enclosure logical id(0x%016llx), slot(%d)\n",
> +                   ioc->name, __func__,
> +                   (unsigned long long)sas_device->enclosure_logical_id,
> +                   sas_device->slot));
> +       if (sas_device->connector_name[0] != '\0')
> +               dewtprintk(ioc, pr_info(MPT3SAS_FMT
> +                 "%s: enter: enclosure level(0x%04x), connector name( %s)\n",
> +                 ioc->name, __func__,
> +                 sas_device->enclosure_level,
> +                 sas_device->connector_name));
>
>         if (sas_device->starget && sas_device->starget->hostdata) {
>                 sas_target_priv_data = sas_device->starget->hostdata;
> @@ -4966,12 +5086,34 @@ _scsih_remove_device(struct MPT3SAS_ADAPTER *ioc,
>                 "removing handle(0x%04x), sas_addr(0x%016llx)\n",
>                 ioc->name, sas_device->handle,
>             (unsigned long long) sas_device->sas_address);
> +       if (sas_device->enclosure_handle != 0)
> +               pr_info(MPT3SAS_FMT
> +                 "removing : enclosure logical id(0x%016llx), slot(%d)\n",
> +                 ioc->name,
> +                 (unsigned long long)sas_device->enclosure_logical_id,
> +                 sas_device->slot);
> +       if (sas_device->connector_name[0] != '\0')
> +               pr_info(MPT3SAS_FMT
> +                 "removing enclosure level(0x%04x), connector name( %s)\n",
> +                 ioc->name, sas_device->enclosure_level,
> +                 sas_device->connector_name);
>
>         dewtprintk(ioc, pr_info(MPT3SAS_FMT
>                 "%s: exit: handle(0x%04x), sas_addr(0x%016llx)\n",
>                 ioc->name, __func__,
> -           sas_device->handle, (unsigned long long)
> -           sas_device->sas_address));
> +               sas_device->handle, (unsigned long long)
> +               sas_device->sas_address));
> +       if (sas_device->enclosure_handle != 0)
> +               dewtprintk(ioc, pr_info(MPT3SAS_FMT
> +                   "%s: exit: enclosure logical id(0x%016llx), slot(%d)\n",
> +                   ioc->name, __func__,
> +                   (unsigned long long)sas_device->enclosure_logical_id,
> +                   sas_device->slot));
> +       if (sas_device->connector_name[0] != '\0')
> +               dewtprintk(ioc, pr_info(MPT3SAS_FMT
> +                   "%s: exit: enclosure level(0x%04x), connector name(%s)\n",
> +                   ioc->name, __func__, sas_device->enclosure_level,
> +                   sas_device->connector_name));
>
>         kfree(sas_device);
>  }
> @@ -6364,9 +6506,7 @@ _scsih_prep_device_scan(struct MPT3SAS_ADAPTER *ioc)
>  /**
>   * _scsih_mark_responding_sas_device - mark a sas_devices as responding
>   * @ioc: per adapter object
> - * @sas_address: sas address
> - * @slot: enclosure slot id
> - * @handle: device handle
> + * @sas_device_pg0: SAS Device page 0
>   *
>   * After host reset, find out whether devices are still responding.
>   * Used in _scsih_remove_unresponsive_sas_devices.
> @@ -6374,8 +6514,8 @@ _scsih_prep_device_scan(struct MPT3SAS_ADAPTER *ioc)
>   * Return nothing.
>   */
>  static void
> -_scsih_mark_responding_sas_device(struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
> -       u16 slot, u16 handle)
> +_scsih_mark_responding_sas_device(struct MPT3SAS_ADAPTER *ioc,
> +Mpi2SasDevicePage0_t *sas_device_pg0)
>  {
>         struct MPT3SAS_TARGET *sas_target_priv_data = NULL;
>         struct scsi_target *starget;
> @@ -6384,8 +6524,8 @@ _scsih_mark_responding_sas_device(struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
>
>         spin_lock_irqsave(&ioc->sas_device_lock, flags);
>         list_for_each_entry(sas_device, &ioc->sas_device_list, list) {
> -               if (sas_device->sas_address == sas_address &&
> -                   sas_device->slot == slot) {
> +               if ((sas_device->sas_address == sas_device_pg0->SASAddress) &&
> +                       (sas_device->slot == sas_device_pg0->Slot)) {
>                         sas_device->responding = 1;
>                         starget = sas_device->starget;
>                         if (starget && starget->hostdata) {
> @@ -6394,22 +6534,40 @@ _scsih_mark_responding_sas_device(struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
>                                 sas_target_priv_data->deleted = 0;
>                         } else
>                                 sas_target_priv_data = NULL;
> -                       if (starget)
> +                       if (starget) {
>                                 starget_printk(KERN_INFO, starget,
> -                                   "handle(0x%04x), sas_addr(0x%016llx), "
> -                                   "enclosure logical id(0x%016llx), "
> -                                   "slot(%d)\n", handle,
> -                                   (unsigned long long)sas_device->sas_address,
> +                                   "handle(0x%04x), sas_addr(0x%016llx)\n",
> +                                   sas_device_pg0->DevHandle,
>                                     (unsigned long long)
> -                                   sas_device->enclosure_logical_id,
> -                                   sas_device->slot);
> -                       if (sas_device->handle == handle)
> +                                   sas_device->sas_address);
> +
> +                               if (sas_device->enclosure_handle != 0)
> +                                       starget_printk(KERN_INFO, starget,
> +                                        "enclosure logical id(0x%016llx),"
> +                                        " slot(%d)\n",
> +                                        (unsigned long long)
> +                                        sas_device->enclosure_logical_id,
> +                                        sas_device->slot);
> +                       }
> +                       if (sas_device_pg0->Flags &
> +                             MPI2_SAS_DEVICE0_FLAGS_ENCL_LEVEL_VALID) {
> +                               sas_device->enclosure_level =
> +                                  le16_to_cpu(sas_device_pg0->EnclosureLevel);
> +                               memcpy(&sas_device->connector_name[0],
> +                                       &sas_device_pg0->ConnectorName[0], 4);
> +                       } else {
> +                               sas_device->enclosure_level = 0;
> +                               sas_device->connector_name[0] = '\0';
> +                       }
> +
> +                       if (sas_device->handle == sas_device_pg0->DevHandle)
>                                 goto out;
>                         pr_info("\thandle changed from(0x%04x)!!!\n",
>                             sas_device->handle);
> -                       sas_device->handle = handle;
> +                       sas_device->handle = sas_device_pg0->DevHandle;
>                         if (sas_target_priv_data)
> -                               sas_target_priv_data->handle = handle;
> +                               sas_target_priv_data->handle =
> +                                       sas_device_pg0->DevHandle;
>                         goto out;
>                 }
>         }
> @@ -6448,13 +6606,15 @@ _scsih_search_responding_sas_devices(struct MPT3SAS_ADAPTER *ioc)
>                     MPI2_IOCSTATUS_MASK;
>                 if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
>                         break;
> -               handle = le16_to_cpu(sas_device_pg0.DevHandle);
> +               handle = sas_device_pg0.DevHandle =
> +                               le16_to_cpu(sas_device_pg0.DevHandle);
>                 device_info = le32_to_cpu(sas_device_pg0.DeviceInfo);
>                 if (!(_scsih_is_end_device(device_info)))
>                         continue;
> -               _scsih_mark_responding_sas_device(ioc,
> -                   le64_to_cpu(sas_device_pg0.SASAddress),
> -                   le16_to_cpu(sas_device_pg0.Slot), handle);
> +               sas_device_pg0.SASAddress =
> +                               le64_to_cpu(sas_device_pg0.SASAddress);
> +               sas_device_pg0.Slot = le16_to_cpu(sas_device_pg0.Slot);
> +               _scsih_mark_responding_sas_device(ioc, &sas_device_pg0);
>         }
>
>   out:
> --
> 2.0.2
>
Johannes Thumshirn June 19, 2015, 9:19 a.m. UTC | #2
On Fri, Jun 12, 2015 at 03:12:18PM +0530, Sreekanth Reddy wrote:
> This Patch will provide more details of the devices such as slot number, enclosure logical id, enclosure level & connector name in the following scenarios,
> 
> - When end device is added in the topology,
> - When the end device is removed from the setup,
> - When the SCSI mid layer issues TASK ABORT/ DEVICE RESET/ TARGET RESET during error handling,
> - When any command to the device fails with Sense key Hardware error or Medium error or Unit Attention,
> - When firmware returns device error or device not ready status for the end device,
> - When a Predicted fault is detected on an end device.
> 
> This information can be used by the user to identify the location of the desired drive in the topology.
> 
> Driver will get these information by reading the sas device page0.
> 
> Signed-off-by: Sreekanth Reddy <Sreekanth.Reddy@avagotech.com>
> ---
>  drivers/scsi/mpt3sas/mpt3sas_base.h  |   2 +
>  drivers/scsi/mpt3sas/mpt3sas_scsih.c | 238 +++++++++++++++++++++++++++++------
>  2 files changed, 201 insertions(+), 39 deletions(-)
> 
> diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h b/drivers/scsi/mpt3sas/mpt3sas_base.h
> index b79ad4f..293ad23 100644
> --- a/drivers/scsi/mpt3sas/mpt3sas_base.h
> +++ b/drivers/scsi/mpt3sas/mpt3sas_base.h
> @@ -317,6 +317,8 @@ struct _sas_device {
>  	u8	fast_path;
>  	u8	pfa_led_on;
>  	u8	pend_sas_rphy_add;
> +	u8   enclosure_level;
> +	u8   connector_name[4];

Minor nit of different indent here, don't know if it is worth re-sending?

Other than that:

Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Sreekanth Reddy June 19, 2015, 10:53 a.m. UTC | #3
On Fri, Jun 19, 2015 at 2:49 PM, Johannes Thumshirn <jthumshirn@suse.de> wrote:
> On Fri, Jun 12, 2015 at 03:12:18PM +0530, Sreekanth Reddy wrote:
>> This Patch will provide more details of the devices such as slot number, enclosure logical id, enclosure level & connector name in the following scenarios,
>>
>> - When end device is added in the topology,
>> - When the end device is removed from the setup,
>> - When the SCSI mid layer issues TASK ABORT/ DEVICE RESET/ TARGET RESET during error handling,
>> - When any command to the device fails with Sense key Hardware error or Medium error or Unit Attention,
>> - When firmware returns device error or device not ready status for the end device,
>> - When a Predicted fault is detected on an end device.
>>
>> This information can be used by the user to identify the location of the desired drive in the topology.
>>
>> Driver will get these information by reading the sas device page0.
>>
>> Signed-off-by: Sreekanth Reddy <Sreekanth.Reddy@avagotech.com>
>> ---
>>  drivers/scsi/mpt3sas/mpt3sas_base.h  |   2 +
>>  drivers/scsi/mpt3sas/mpt3sas_scsih.c | 238 +++++++++++++++++++++++++++++------
>>  2 files changed, 201 insertions(+), 39 deletions(-)
>>
>> diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h b/drivers/scsi/mpt3sas/mpt3sas_base.h
>> index b79ad4f..293ad23 100644
>> --- a/drivers/scsi/mpt3sas/mpt3sas_base.h
>> +++ b/drivers/scsi/mpt3sas/mpt3sas_base.h
>> @@ -317,6 +317,8 @@ struct _sas_device {
>>       u8      fast_path;
>>       u8      pfa_led_on;
>>       u8      pend_sas_rphy_add;
>> +     u8   enclosure_level;
>> +     u8   connector_name[4];
>
> Minor nit of different indent here, don't know if it is worth re-sending?

Not an Issue. I will post the next version of this patch by adjusting
this indent.

Thanks,
Sreekanth
>
> Other than that:
>
> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
>
> --
> Johannes Thumshirn                                       Storage
> jthumshirn@suse.de                             +49 911 74053 689
> SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
> GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
> HRB 21284 (AG Nürnberg)
diff mbox

Patch

diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h b/drivers/scsi/mpt3sas/mpt3sas_base.h
index b79ad4f..293ad23 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.h
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.h
@@ -317,6 +317,8 @@  struct _sas_device {
 	u8	fast_path;
 	u8	pfa_led_on;
 	u8	pend_sas_rphy_add;
+	u8   enclosure_level;
+	u8   connector_name[4];
 };
 
 /**
diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
index d457dba..64dd90b 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
@@ -585,6 +585,22 @@  _scsih_sas_device_remove(struct MPT3SAS_ADAPTER *ioc,
 
 	if (!sas_device)
 		return;
+	pr_info(MPT3SAS_FMT
+	    "removing handle(0x%04x), sas_addr(0x%016llx)\n",
+	    ioc->name, sas_device->handle,
+	    (unsigned long long) sas_device->sas_address);
+
+	if (sas_device->enclosure_handle != 0)
+		pr_info(MPT3SAS_FMT
+		   "removing enclosure logical id(0x%016llx), slot(%d)\n",
+		   ioc->name, (unsigned long long)
+		   sas_device->enclosure_logical_id, sas_device->slot);
+
+	if (sas_device->connector_name[0] != '\0')
+		pr_info(MPT3SAS_FMT
+		   "removing enclosure level(0x%04x), connector name( %s)\n",
+		   ioc->name, sas_device->enclosure_level,
+		   sas_device->connector_name);
 
 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
 	list_del(&sas_device->list);
@@ -663,6 +679,18 @@  _scsih_sas_device_add(struct MPT3SAS_ADAPTER *ioc,
 		ioc->name, __func__, sas_device->handle,
 		(unsigned long long)sas_device->sas_address));
 
+	if (sas_device->enclosure_handle != 0)
+		dewtprintk(ioc, pr_info(MPT3SAS_FMT
+		    "%s: enclosure logical id(0x%016llx), slot( %d)\n",
+		    ioc->name, __func__, (unsigned long long)
+		    sas_device->enclosure_logical_id, sas_device->slot));
+
+	if (sas_device->connector_name[0] != '\0')
+		dewtprintk(ioc, pr_info(MPT3SAS_FMT
+		    "%s: enclosure level(0x%04x), connector name( %s)\n",
+		    ioc->name, __func__,
+		    sas_device->enclosure_level, sas_device->connector_name));
+
 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
 	list_add_tail(&sas_device->list, &ioc->sas_device_list);
 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
@@ -704,6 +732,18 @@  _scsih_sas_device_init_add(struct MPT3SAS_ADAPTER *ioc,
 		__func__, sas_device->handle,
 		(unsigned long long)sas_device->sas_address));
 
+	if (sas_device->enclosure_handle != 0)
+		dewtprintk(ioc, pr_info(MPT3SAS_FMT
+		    "%s: enclosure logical id(0x%016llx), slot( %d)\n",
+		    ioc->name, __func__, (unsigned long long)
+		    sas_device->enclosure_logical_id, sas_device->slot));
+
+	if (sas_device->connector_name[0] != '\0')
+		dewtprintk(ioc, pr_info(MPT3SAS_FMT
+		    "%s: enclosure level(0x%04x), connector name( %s)\n",
+		    ioc->name, __func__, sas_device->enclosure_level,
+		    sas_device->connector_name));
+
 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
 	list_add_tail(&sas_device->list, &ioc->sas_device_init_list);
 	_scsih_determine_boot_device(ioc, sas_device, 0);
@@ -1772,10 +1812,16 @@  _scsih_slave_configure(struct scsi_device *sdev)
 	    "sas_addr(0x%016llx), phy(%d), device_name(0x%016llx)\n",
 	    ds, handle, (unsigned long long)sas_device->sas_address,
 	    sas_device->phy, (unsigned long long)sas_device->device_name);
-	sdev_printk(KERN_INFO, sdev,
-		"%s: enclosure_logical_id(0x%016llx), slot(%d)\n",
-		ds, (unsigned long long)
-	    sas_device->enclosure_logical_id, sas_device->slot);
+	if (sas_device->enclosure_handle != 0)
+		sdev_printk(KERN_INFO, sdev,
+		     "%s: enclosure_logical_id(0x%016llx), slot(%d)\n",
+		     ds, (unsigned long long)
+		     sas_device->enclosure_logical_id, sas_device->slot);
+	if (sas_device->connector_name[0] != '\0')
+		sdev_printk(KERN_INFO, sdev,
+		     "%s: enclosure level(0x%04x), connector name( %s)\n",
+		     ds, sas_device->enclosure_level,
+		     sas_device->connector_name);
 
 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
 
@@ -2189,10 +2235,17 @@  _scsih_tm_display_info(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *scmd)
 			    sas_device->handle,
 			    (unsigned long long)sas_device->sas_address,
 			    sas_device->phy);
-			starget_printk(KERN_INFO, starget,
-			    "enclosure_logical_id(0x%016llx), slot(%d)\n",
-			   (unsigned long long)sas_device->enclosure_logical_id,
-			    sas_device->slot);
+			if (sas_device->enclosure_handle != 0)
+				starget_printk(KERN_INFO, starget,
+				 "enclosure_logical_id(0x%016llx), slot(%d)\n",
+				 (unsigned long long)
+				 sas_device->enclosure_logical_id,
+				 sas_device->slot);
+			if (sas_device->connector_name)
+				starget_printk(KERN_INFO, starget,
+				"enclosure level(0x%04x),connector name(%s)\n",
+				 sas_device->enclosure_level,
+				 sas_device->connector_name);
 		}
 		spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
 	}
@@ -2813,6 +2866,18 @@  _scsih_tm_tr_send(struct MPT3SAS_ADAPTER *ioc, u16 handle)
 			"setting delete flag: handle(0x%04x), sas_addr(0x%016llx)\n",
 			ioc->name, handle,
 		    (unsigned long long)sas_address));
+		if (sas_device->enclosure_handle != 0)
+			dewtprintk(ioc, pr_info(MPT3SAS_FMT
+			 "setting delete flag:enclosure logical id(0x%016llx),"
+			 " slot(%d)\n", ioc->name, (unsigned long long)
+			  sas_device->enclosure_logical_id,
+			  sas_device->slot));
+		if (sas_device->connector_name)
+			dewtprintk(ioc, pr_info(MPT3SAS_FMT
+			 "setting delete flag: enclosure level(0x%04x),"
+			 " connector name( %s)\n", ioc->name,
+			  sas_device->enclosure_level,
+			  sas_device->connector_name));
 		_scsih_ublock_io_device(ioc, sas_address);
 		sas_target_priv_data->handle = MPT3SAS_INVALID_DEVICE_HANDLE;
 	}
@@ -3828,10 +3893,19 @@  _scsih_scsi_ioc_info(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,
 				"\tsas_address(0x%016llx), phy(%d)\n",
 				ioc->name, (unsigned long long)
 			    sas_device->sas_address, sas_device->phy);
-			pr_warn(MPT3SAS_FMT
-			    "\tenclosure_logical_id(0x%016llx), slot(%d)\n",
-			    ioc->name, (unsigned long long)
-			    sas_device->enclosure_logical_id, sas_device->slot);
+			if (sas_device->enclosure_handle != 0)
+				pr_warn(MPT3SAS_FMT
+				  "\tenclosure_logical_id(0x%016llx),"
+				  "slot(%d)\n", ioc->name,
+				  (unsigned long long)
+				  sas_device->enclosure_logical_id,
+				  sas_device->slot);
+			if (sas_device->connector_name[0])
+				pr_warn(MPT3SAS_FMT
+				  "\tenclosure level(0x%04x),"
+				  " connector name( %s)\n", ioc->name,
+				  sas_device->enclosure_level,
+				  sas_device->connector_name);
 		}
 		spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
 	}
@@ -4006,7 +4080,16 @@  _scsih_smart_predicted_fault(struct MPT3SAS_ADAPTER *ioc, u16 handle)
 		spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
 		return;
 	}
-	starget_printk(KERN_WARNING, starget, "predicted fault\n");
+	if (sas_device->enclosure_handle != 0)
+		starget_printk(KERN_INFO, starget, "predicted fault, "
+			"enclosure logical id(0x%016llx), slot(%d)\n",
+			(unsigned long long)sas_device->enclosure_logical_id,
+			sas_device->slot);
+	if (sas_device->connector_name[0] != '\0')
+		starget_printk(KERN_WARNING, starget, "predicted fault, "
+			"enclosure level(0x%04x), connector name( %s)\n",
+			sas_device->enclosure_level,
+			sas_device->connector_name);
 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
 
 	if (ioc->pdev->subsystem_vendor == PCI_VENDOR_ID_IBM)
@@ -4126,8 +4209,13 @@  _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
 			_scsih_smart_predicted_fault(ioc,
 			    le16_to_cpu(mpi_reply->DevHandle));
 		mpt3sas_trigger_scsi(ioc, data.skey, data.asc, data.ascq);
-	}
 
+		if (!(ioc->logging_level & MPT_DEBUG_REPLY) &&
+		     ((scmd->sense_buffer[2] == UNIT_ATTENTION) ||
+		     (scmd->sense_buffer[2] == MEDIUM_ERROR) ||
+		     (scmd->sense_buffer[2] == HARDWARE_ERROR)))
+			_scsih_scsi_ioc_info(ioc, scmd, mpi_reply, smid);
+		}
 	switch (ioc_status) {
 	case MPI2_IOCSTATUS_BUSY:
 	case MPI2_IOCSTATUS_INSUFFICIENT_RESOURCES:
@@ -4795,6 +4883,16 @@  _scsih_check_device(struct MPT3SAS_ADAPTER *ioc,
 			sas_device->handle, handle);
 		sas_target_priv_data->handle = handle;
 		sas_device->handle = handle;
+		if (sas_device_pg0.Flags &
+		     MPI2_SAS_DEVICE0_FLAGS_ENCL_LEVEL_VALID) {
+			sas_device->enclosure_level =
+				le16_to_cpu(sas_device_pg0.EnclosureLevel);
+			memcpy(&sas_device->connector_name[0],
+				&sas_device_pg0.ConnectorName[0], 4);
+		} else {
+			sas_device->enclosure_level = 0;
+			sas_device->connector_name[0] = '\0';
+		}
 	}
 
 	/* check if device is present */
@@ -4901,14 +4999,24 @@  _scsih_add_device(struct MPT3SAS_ADAPTER *ioc, u16 handle, u8 phy_num,
 		    ioc->name, __FILE__, __LINE__, __func__);
 	sas_device->enclosure_handle =
 	    le16_to_cpu(sas_device_pg0.EnclosureHandle);
-	sas_device->slot =
-	    le16_to_cpu(sas_device_pg0.Slot);
+	if (sas_device->enclosure_handle != 0)
+		sas_device->slot =
+		    le16_to_cpu(sas_device_pg0.Slot);
 	sas_device->device_info = device_info;
 	sas_device->sas_address = sas_address;
 	sas_device->phy = sas_device_pg0.PhyNum;
 	sas_device->fast_path = (le16_to_cpu(sas_device_pg0.Flags) &
 	    MPI25_SAS_DEVICE0_FLAGS_FAST_PATH_CAPABLE) ? 1 : 0;
 
+	if (sas_device_pg0.Flags & MPI2_SAS_DEVICE0_FLAGS_ENCL_LEVEL_VALID) {
+		sas_device->enclosure_level =
+			le16_to_cpu(sas_device_pg0.EnclosureLevel);
+		memcpy(&sas_device->connector_name[0],
+			&sas_device_pg0.ConnectorName[0], 4);
+	} else {
+		sas_device->enclosure_level = 0;
+		sas_device->connector_name[0] = '\0';
+	}
 	/* get enclosure_logical_id */
 	if (sas_device->enclosure_handle && !(mpt3sas_config_get_enclosure_pg0(
 	   ioc, &mpi_reply, &enclosure_pg0, MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE,
@@ -4950,6 +5058,18 @@  _scsih_remove_device(struct MPT3SAS_ADAPTER *ioc,
 		ioc->name, __func__,
 	    sas_device->handle, (unsigned long long)
 	    sas_device->sas_address));
+	if (sas_device->enclosure_handle != 0)
+		dewtprintk(ioc, pr_info(MPT3SAS_FMT
+		    "%s: enter: enclosure logical id(0x%016llx), slot(%d)\n",
+		    ioc->name, __func__,
+		    (unsigned long long)sas_device->enclosure_logical_id,
+		    sas_device->slot));
+	if (sas_device->connector_name[0] != '\0')
+		dewtprintk(ioc, pr_info(MPT3SAS_FMT
+		  "%s: enter: enclosure level(0x%04x), connector name( %s)\n",
+		  ioc->name, __func__,
+		  sas_device->enclosure_level,
+		  sas_device->connector_name));
 
 	if (sas_device->starget && sas_device->starget->hostdata) {
 		sas_target_priv_data = sas_device->starget->hostdata;
@@ -4966,12 +5086,34 @@  _scsih_remove_device(struct MPT3SAS_ADAPTER *ioc,
 		"removing handle(0x%04x), sas_addr(0x%016llx)\n",
 		ioc->name, sas_device->handle,
 	    (unsigned long long) sas_device->sas_address);
+	if (sas_device->enclosure_handle != 0)
+		pr_info(MPT3SAS_FMT
+		  "removing : enclosure logical id(0x%016llx), slot(%d)\n",
+		  ioc->name,
+		  (unsigned long long)sas_device->enclosure_logical_id,
+		  sas_device->slot);
+	if (sas_device->connector_name[0] != '\0')
+		pr_info(MPT3SAS_FMT
+		  "removing enclosure level(0x%04x), connector name( %s)\n",
+		  ioc->name, sas_device->enclosure_level,
+		  sas_device->connector_name);
 
 	dewtprintk(ioc, pr_info(MPT3SAS_FMT
 		"%s: exit: handle(0x%04x), sas_addr(0x%016llx)\n",
 		ioc->name, __func__,
-	    sas_device->handle, (unsigned long long)
-	    sas_device->sas_address));
+		sas_device->handle, (unsigned long long)
+		sas_device->sas_address));
+	if (sas_device->enclosure_handle != 0)
+		dewtprintk(ioc, pr_info(MPT3SAS_FMT
+		    "%s: exit: enclosure logical id(0x%016llx), slot(%d)\n",
+		    ioc->name, __func__,
+		    (unsigned long long)sas_device->enclosure_logical_id,
+		    sas_device->slot));
+	if (sas_device->connector_name[0] != '\0')
+		dewtprintk(ioc, pr_info(MPT3SAS_FMT
+		    "%s: exit: enclosure level(0x%04x), connector name(%s)\n",
+		    ioc->name, __func__, sas_device->enclosure_level,
+		    sas_device->connector_name));
 
 	kfree(sas_device);
 }
@@ -6364,9 +6506,7 @@  _scsih_prep_device_scan(struct MPT3SAS_ADAPTER *ioc)
 /**
  * _scsih_mark_responding_sas_device - mark a sas_devices as responding
  * @ioc: per adapter object
- * @sas_address: sas address
- * @slot: enclosure slot id
- * @handle: device handle
+ * @sas_device_pg0: SAS Device page 0
  *
  * After host reset, find out whether devices are still responding.
  * Used in _scsih_remove_unresponsive_sas_devices.
@@ -6374,8 +6514,8 @@  _scsih_prep_device_scan(struct MPT3SAS_ADAPTER *ioc)
  * Return nothing.
  */
 static void
-_scsih_mark_responding_sas_device(struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
-	u16 slot, u16 handle)
+_scsih_mark_responding_sas_device(struct MPT3SAS_ADAPTER *ioc,
+Mpi2SasDevicePage0_t *sas_device_pg0)
 {
 	struct MPT3SAS_TARGET *sas_target_priv_data = NULL;
 	struct scsi_target *starget;
@@ -6384,8 +6524,8 @@  _scsih_mark_responding_sas_device(struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
 
 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
 	list_for_each_entry(sas_device, &ioc->sas_device_list, list) {
-		if (sas_device->sas_address == sas_address &&
-		    sas_device->slot == slot) {
+		if ((sas_device->sas_address == sas_device_pg0->SASAddress) &&
+			(sas_device->slot == sas_device_pg0->Slot)) {
 			sas_device->responding = 1;
 			starget = sas_device->starget;
 			if (starget && starget->hostdata) {
@@ -6394,22 +6534,40 @@  _scsih_mark_responding_sas_device(struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
 				sas_target_priv_data->deleted = 0;
 			} else
 				sas_target_priv_data = NULL;
-			if (starget)
+			if (starget) {
 				starget_printk(KERN_INFO, starget,
-				    "handle(0x%04x), sas_addr(0x%016llx), "
-				    "enclosure logical id(0x%016llx), "
-				    "slot(%d)\n", handle,
-				    (unsigned long long)sas_device->sas_address,
+				    "handle(0x%04x), sas_addr(0x%016llx)\n",
+				    sas_device_pg0->DevHandle,
 				    (unsigned long long)
-				    sas_device->enclosure_logical_id,
-				    sas_device->slot);
-			if (sas_device->handle == handle)
+				    sas_device->sas_address);
+
+				if (sas_device->enclosure_handle != 0)
+					starget_printk(KERN_INFO, starget,
+					 "enclosure logical id(0x%016llx),"
+					 " slot(%d)\n",
+					 (unsigned long long)
+					 sas_device->enclosure_logical_id,
+					 sas_device->slot);
+			}
+			if (sas_device_pg0->Flags &
+			      MPI2_SAS_DEVICE0_FLAGS_ENCL_LEVEL_VALID) {
+				sas_device->enclosure_level =
+				   le16_to_cpu(sas_device_pg0->EnclosureLevel);
+				memcpy(&sas_device->connector_name[0],
+					&sas_device_pg0->ConnectorName[0], 4);
+			} else {
+				sas_device->enclosure_level = 0;
+				sas_device->connector_name[0] = '\0';
+			}
+
+			if (sas_device->handle == sas_device_pg0->DevHandle)
 				goto out;
 			pr_info("\thandle changed from(0x%04x)!!!\n",
 			    sas_device->handle);
-			sas_device->handle = handle;
+			sas_device->handle = sas_device_pg0->DevHandle;
 			if (sas_target_priv_data)
-				sas_target_priv_data->handle = handle;
+				sas_target_priv_data->handle =
+					sas_device_pg0->DevHandle;
 			goto out;
 		}
 	}
@@ -6448,13 +6606,15 @@  _scsih_search_responding_sas_devices(struct MPT3SAS_ADAPTER *ioc)
 		    MPI2_IOCSTATUS_MASK;
 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
 			break;
-		handle = le16_to_cpu(sas_device_pg0.DevHandle);
+		handle = sas_device_pg0.DevHandle =
+				le16_to_cpu(sas_device_pg0.DevHandle);
 		device_info = le32_to_cpu(sas_device_pg0.DeviceInfo);
 		if (!(_scsih_is_end_device(device_info)))
 			continue;
-		_scsih_mark_responding_sas_device(ioc,
-		    le64_to_cpu(sas_device_pg0.SASAddress),
-		    le16_to_cpu(sas_device_pg0.Slot), handle);
+		sas_device_pg0.SASAddress =
+				le64_to_cpu(sas_device_pg0.SASAddress);
+		sas_device_pg0.Slot = le16_to_cpu(sas_device_pg0.Slot);
+		_scsih_mark_responding_sas_device(ioc, &sas_device_pg0);
 	}
 
  out: