diff options
-rw-r--r-- | drivers/message/fusion/mptbase.h | 1 | ||||
-rw-r--r-- | drivers/message/fusion/mptsas.c | 24 |
2 files changed, 25 insertions, 0 deletions
diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h index 7bf0855f9349..2697b70653f2 100644 --- a/drivers/message/fusion/mptbase.h +++ b/drivers/message/fusion/mptbase.h | |||
@@ -632,6 +632,7 @@ typedef struct _MPT_ADAPTER | |||
632 | struct mutex sas_discovery_mutex; | 632 | struct mutex sas_discovery_mutex; |
633 | u8 sas_discovery_runtime; | 633 | u8 sas_discovery_runtime; |
634 | u8 sas_discovery_ignore_events; | 634 | u8 sas_discovery_ignore_events; |
635 | u16 handle; | ||
635 | int sas_index; /* index refrencing */ | 636 | int sas_index; /* index refrencing */ |
636 | MPT_SAS_MGMT sas_mgmt; | 637 | MPT_SAS_MGMT sas_mgmt; |
637 | int num_ports; | 638 | int num_ports; |
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index 85eff1509d66..f7bd8b11ed3b 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c | |||
@@ -1635,8 +1635,10 @@ static int mptsas_probe_one_phy(struct device *dev, | |||
1635 | if (!mptsas_get_rphy(phy_info) && port && !port->rphy) { | 1635 | if (!mptsas_get_rphy(phy_info) && port && !port->rphy) { |
1636 | 1636 | ||
1637 | struct sas_rphy *rphy; | 1637 | struct sas_rphy *rphy; |
1638 | struct device *parent; | ||
1638 | struct sas_identify identify; | 1639 | struct sas_identify identify; |
1639 | 1640 | ||
1641 | parent = dev->parent->parent; | ||
1640 | /* | 1642 | /* |
1641 | * Let the hotplug_work thread handle processing | 1643 | * Let the hotplug_work thread handle processing |
1642 | * the adding/removing of devices that occur | 1644 | * the adding/removing of devices that occur |
@@ -1647,6 +1649,27 @@ static int mptsas_probe_one_phy(struct device *dev, | |||
1647 | goto out; | 1649 | goto out; |
1648 | 1650 | ||
1649 | mptsas_parse_device_info(&identify, &phy_info->attached); | 1651 | mptsas_parse_device_info(&identify, &phy_info->attached); |
1652 | if (scsi_is_host_device(parent)) { | ||
1653 | struct mptsas_portinfo *port_info; | ||
1654 | int i; | ||
1655 | |||
1656 | mutex_lock(&ioc->sas_topology_mutex); | ||
1657 | port_info = mptsas_find_portinfo_by_handle(ioc, | ||
1658 | ioc->handle); | ||
1659 | mutex_unlock(&ioc->sas_topology_mutex); | ||
1660 | |||
1661 | for (i = 0; i < port_info->num_phys; i++) | ||
1662 | if (port_info->phy_info[i].identify.sas_address == | ||
1663 | identify.sas_address) | ||
1664 | goto out; | ||
1665 | |||
1666 | } else if (scsi_is_sas_rphy(parent)) { | ||
1667 | struct sas_rphy *parent_rphy = dev_to_rphy(parent); | ||
1668 | if (identify.sas_address == | ||
1669 | parent_rphy->identify.sas_address) | ||
1670 | goto out; | ||
1671 | } | ||
1672 | |||
1650 | switch (identify.device_type) { | 1673 | switch (identify.device_type) { |
1651 | case SAS_END_DEVICE: | 1674 | case SAS_END_DEVICE: |
1652 | rphy = sas_end_device_alloc(port); | 1675 | rphy = sas_end_device_alloc(port); |
@@ -1698,6 +1721,7 @@ mptsas_probe_hba_phys(MPT_ADAPTER *ioc) | |||
1698 | goto out_free_port_info; | 1721 | goto out_free_port_info; |
1699 | 1722 | ||
1700 | mutex_lock(&ioc->sas_topology_mutex); | 1723 | mutex_lock(&ioc->sas_topology_mutex); |
1724 | ioc->handle = hba->handle; | ||
1701 | port_info = mptsas_find_portinfo_by_handle(ioc, hba->handle); | 1725 | port_info = mptsas_find_portinfo_by_handle(ioc, hba->handle); |
1702 | if (!port_info) { | 1726 | if (!port_info) { |
1703 | port_info = hba; | 1727 | port_info = hba; |