On Fri, Jun 19, 2015 at 04:26:31PM +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.re...@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..fc694f1 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
> 

Reviewed-by: Johannes Thumshirn <jthumsh...@suse.de>

-- 
Johannes Thumshirn                                       Storage
jthumsh...@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)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in

Reply via email to