diff options
| -rw-r--r-- | drivers/scsi/mpt3sas/mpt3sas_ctl.c | 88 | 
1 files changed, 58 insertions, 30 deletions
| diff --git a/drivers/scsi/mpt3sas/mpt3sas_ctl.c b/drivers/scsi/mpt3sas/mpt3sas_ctl.c index 205c4435aa88..b4c374b08e5e 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_ctl.c +++ b/drivers/scsi/mpt3sas/mpt3sas_ctl.c @@ -79,32 +79,6 @@ enum block_state {  };  /** - * _ctl_sas_device_find_by_handle - sas device search - * @ioc: per adapter object - * @handle: sas device handle (assigned by firmware) - * Context: Calling function should acquire ioc->sas_device_lock - * - * This searches for sas_device based on sas_address, then return sas_device - * object. - */ -static struct _sas_device * -_ctl_sas_device_find_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle) -{ -	struct _sas_device *sas_device, *r; - -	r = NULL; -	list_for_each_entry(sas_device, &ioc->sas_device_list, list) { -		if (sas_device->handle != handle) -			continue; -		r = sas_device; -		goto out; -	} - - out: -	return r; -} - -/**   * _ctl_display_some_debug - debug routine   * @ioc: per adapter object   * @smid: system request message index @@ -229,10 +203,9 @@ _ctl_display_some_debug(struct MPT3SAS_ADAPTER *ioc, u16 smid,  		Mpi2SCSIIOReply_t *scsi_reply =  		    (Mpi2SCSIIOReply_t *)mpi_reply;  		struct _sas_device *sas_device = NULL; -		unsigned long flags; +		struct _pcie_device *pcie_device = NULL; -		spin_lock_irqsave(&ioc->sas_device_lock, flags); -		sas_device = _ctl_sas_device_find_by_handle(ioc, +		sas_device = mpt3sas_get_sdev_by_handle(ioc,  		    le16_to_cpu(scsi_reply->DevHandle));  		if (sas_device) {  			pr_warn(MPT3SAS_FMT "\tsas_address(0x%016llx), phy(%d)\n", @@ -242,8 +215,25 @@ _ctl_display_some_debug(struct MPT3SAS_ADAPTER *ioc, u16 smid,  			    "\tenclosure_logical_id(0x%016llx), slot(%d)\n",  			    ioc->name, (unsigned long long)  			    sas_device->enclosure_logical_id, sas_device->slot); +			sas_device_put(sas_device); +		} +		if (!sas_device) { +			pcie_device = mpt3sas_get_pdev_by_handle(ioc, +				le16_to_cpu(scsi_reply->DevHandle)); +			if (pcie_device) { +				pr_warn(MPT3SAS_FMT +				    "\tWWID(0x%016llx), port(%d)\n", ioc->name, +				    (unsigned long long)pcie_device->wwid, +				    pcie_device->port_num); +				if (pcie_device->enclosure_handle != 0) +					pr_warn(MPT3SAS_FMT +					    "\tenclosure_logical_id(0x%016llx), slot(%d)\n", +					    ioc->name, (unsigned long long) +					    pcie_device->enclosure_logical_id, +					    pcie_device->slot); +				pcie_device_put(pcie_device); +			}  		} -		spin_unlock_irqrestore(&ioc->sas_device_lock, flags);  		if (scsi_reply->SCSIState || scsi_reply->SCSIStatus)  			pr_info(MPT3SAS_FMT  			    "\tscsi_state(0x%02x), scsi_status" @@ -1347,6 +1337,42 @@ _ctl_btdh_search_sas_device(struct MPT3SAS_ADAPTER *ioc,  }  /** + * _ctl_btdh_search_pcie_device - searching for pcie device + * @ioc: per adapter object + * @btdh: btdh ioctl payload + */ +static int +_ctl_btdh_search_pcie_device(struct MPT3SAS_ADAPTER *ioc, +	struct mpt3_ioctl_btdh_mapping *btdh) +{ +	struct _pcie_device *pcie_device; +	unsigned long flags; +	int rc = 0; + +	if (list_empty(&ioc->pcie_device_list)) +		return rc; + +	spin_lock_irqsave(&ioc->pcie_device_lock, flags); +	list_for_each_entry(pcie_device, &ioc->pcie_device_list, list) { +		if (btdh->bus == 0xFFFFFFFF && btdh->id == 0xFFFFFFFF && +			   btdh->handle == pcie_device->handle) { +			btdh->bus = pcie_device->channel; +			btdh->id = pcie_device->id; +			rc = 1; +			goto out; +		} else if (btdh->bus == pcie_device->channel && btdh->id == +			   pcie_device->id && btdh->handle == 0xFFFF) { +			btdh->handle = pcie_device->handle; +			rc = 1; +			goto out; +		} +	} + out: +	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags); +	return rc; +} + +/**   * _ctl_btdh_search_raid_device - searching for raid device   * @ioc: per adapter object   * @btdh: btdh ioctl payload @@ -1404,6 +1430,8 @@ _ctl_btdh_mapping(struct MPT3SAS_ADAPTER *ioc, void __user *arg)  	rc = _ctl_btdh_search_sas_device(ioc, &karg);  	if (!rc) +		rc = _ctl_btdh_search_pcie_device(ioc, &karg); +	if (!rc)  		_ctl_btdh_search_raid_device(ioc, &karg);  	if (copy_to_user(arg, &karg, sizeof(karg))) { | 
