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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxx> 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@xxxxxxxxxxxxx>
> ---
>  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
>



-- 

Regards,
Sreekanth
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux