|
@@ -235,6 +235,17 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id, void *rsp)
|
|
|
linkrate = phy->linkrate;
|
|
|
memcpy(sas_addr, phy->attached_sas_addr, SAS_ADDR_SIZE);
|
|
|
|
|
|
+ /* Handle vacant phy - rest of dr data is not valid so skip it */
|
|
|
+ if (phy->phy_state == PHY_VACANT) {
|
|
|
+ memset(phy->attached_sas_addr, 0, SAS_ADDR_SIZE);
|
|
|
+ phy->attached_dev_type = NO_DEVICE;
|
|
|
+ if (!test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state)) {
|
|
|
+ phy->phy_id = phy_id;
|
|
|
+ goto skip;
|
|
|
+ } else
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
phy->attached_dev_type = to_dev_type(dr);
|
|
|
if (test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state))
|
|
|
goto out;
|
|
@@ -272,6 +283,7 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id, void *rsp)
|
|
|
phy->phy->maximum_linkrate = dr->pmax_linkrate;
|
|
|
phy->phy->negotiated_linkrate = phy->linkrate;
|
|
|
|
|
|
+ skip:
|
|
|
if (new_phy)
|
|
|
if (sas_phy_add(phy->phy)) {
|
|
|
sas_phy_free(phy->phy);
|