Skip to content

Commit

Permalink
scsi: mpt3sas: Get sas_device objects using device's rphy
Browse files Browse the repository at this point in the history
In the following scsi_host_template and sas_function_template callback
functions the driver does not have PhysicalPort number information to
retrieve the sas_device object using SAS Address & PhysicalPort number. In
these callback functions the device's rphy object is used to retrieve
sas_device object for the device.

.target_alloc,
.get_enclosure_identifier
.get_bay_identifier

When a rphy (of type sas_rphy) object is allocated then its address is
saved in corresponding sas_device object's rphy field. In
__mpt3sas_get_sdev_by_rphy(), the driver loops over all the sas_device
objects from sas_device_list list to retrieve the sas_device objects whose
rphy matches the provided rphy.

Link: https://lore.kernel.org/r/20201027130847.9962-8-sreekanth.reddy@broadcom.com
Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
Sreekanth Reddy authored and Martin K. Petersen committed Nov 4, 2020
1 parent c71ccf9 commit 6df6be9
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 6 deletions.
5 changes: 5 additions & 0 deletions drivers/scsi/mpt3sas/mpt3sas_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -537,6 +537,8 @@ struct _internal_cmd {
* @chassis_slot: chassis slot
* @is_chassis_slot_valid: chassis slot valid or not
* @port: hba port entry containing device's port number info
* @rphy: device's sas_rphy address used to identify this device structure in
* target_alloc callback function
*/
struct _sas_device {
struct list_head list;
Expand Down Expand Up @@ -564,6 +566,7 @@ struct _sas_device {
u8 connector_name[5];
struct kref refcount;
struct hba_port *port;
struct sas_rphy *rphy;
};

static inline void sas_device_get(struct _sas_device *s)
Expand Down Expand Up @@ -1681,6 +1684,8 @@ void mpt3sas_port_enable_complete(struct MPT3SAS_ADAPTER *ioc);
struct _raid_device *
mpt3sas_raid_device_find_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle);
void mpt3sas_scsih_change_queue_depth(struct scsi_device *sdev, int qdepth);
struct _sas_device *
__mpt3sas_get_sdev_by_rphy(struct MPT3SAS_ADAPTER *ioc, struct sas_rphy *rphy);

/* config shared API */
u8 mpt3sas_config_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
Expand Down
41 changes: 39 additions & 2 deletions drivers/scsi/mpt3sas/mpt3sas_scsih.c
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,44 @@ mpt3sas_get_pdev_from_target(struct MPT3SAS_ADAPTER *ioc,
return ret;
}


/**
* __mpt3sas_get_sdev_by_rphy - sas device search
* @ioc: per adapter object
* @rphy: sas_rphy pointer
*
* Context: This function will acquire ioc->sas_device_lock and will release
* before returning the sas_device object.
*
* This searches for sas_device from rphy object
* then return sas_device object.
*/
struct _sas_device *
__mpt3sas_get_sdev_by_rphy(struct MPT3SAS_ADAPTER *ioc,
struct sas_rphy *rphy)
{
struct _sas_device *sas_device;

assert_spin_locked(&ioc->sas_device_lock);

list_for_each_entry(sas_device, &ioc->sas_device_list, list) {
if (sas_device->rphy != rphy)
continue;
sas_device_get(sas_device);
return sas_device;
}

sas_device = NULL;
list_for_each_entry(sas_device, &ioc->sas_device_init_list, list) {
if (sas_device->rphy != rphy)
continue;
sas_device_get(sas_device);
return sas_device;
}

return NULL;
}

/**
* mpt3sas_get_sdev_by_addr - get _sas_device object corresponding to provided
* sas address from sas_device_list list
Expand Down Expand Up @@ -1815,8 +1853,7 @@ scsih_target_alloc(struct scsi_target *starget)
/* sas/sata devices */
spin_lock_irqsave(&ioc->sas_device_lock, flags);
rphy = dev_to_rphy(starget->dev.parent);
sas_device = __mpt3sas_get_sdev_by_addr(ioc,
rphy->identify.sas_address, NULL);
sas_device = __mpt3sas_get_sdev_by_rphy(ioc, rphy);

if (sas_device) {
sas_target_priv_data->handle = sas_device->handle;
Expand Down
7 changes: 3 additions & 4 deletions drivers/scsi/mpt3sas/mpt3sas_transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -733,6 +733,7 @@ mpt3sas_transport_port_add(struct MPT3SAS_ADAPTER *ioc, u16 handle,
mpt3sas_port->port = port;
if (mpt3sas_port->remote_identify.device_type == SAS_END_DEVICE) {
rphy = sas_end_device_alloc(port);
sas_device->rphy = rphy;
if (sas_node->handle <= ioc->sas_hba.num_phys)
hba_port->sas_address = sas_device->sas_address;
} else {
Expand Down Expand Up @@ -1342,8 +1343,7 @@ _transport_get_enclosure_identifier(struct sas_rphy *rphy, u64 *identifier)
int rc;

spin_lock_irqsave(&ioc->sas_device_lock, flags);
sas_device = __mpt3sas_get_sdev_by_addr(ioc,
rphy->identify.sas_address, 0);
sas_device = __mpt3sas_get_sdev_by_rphy(ioc, rphy);
if (sas_device) {
*identifier = sas_device->enclosure_logical_id;
rc = 0;
Expand Down Expand Up @@ -1372,8 +1372,7 @@ _transport_get_bay_identifier(struct sas_rphy *rphy)
int rc;

spin_lock_irqsave(&ioc->sas_device_lock, flags);
sas_device = __mpt3sas_get_sdev_by_addr(ioc,
rphy->identify.sas_address, 0);
sas_device = __mpt3sas_get_sdev_by_rphy(ioc, rphy);
if (sas_device) {
rc = sas_device->slot;
sas_device_put(sas_device);
Expand Down

0 comments on commit 6df6be9

Please sign in to comment.