diff mbox

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

Message ID 1434711391-10016-1-git-send-email-Sreekanth.Reddy@avagotech.com (mailing list archive)
State New, archived
Headers show

Commit Message

Sreekanth Reddy June 19, 2015, 10:56 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

Johannes Thumshirn June 19, 2015, 11:04 a.m. UTC | #1
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.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..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 <jthumshirn@suse.de>
Martin K. Petersen June 19, 2015, 8:22 p.m. UTC | #2
>>>>> Sreekanth Reddy <sreekanth.reddy@avagotech.com> writes:

> 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.

Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
diff mbox

Patch

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: