aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libsas
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/libsas')
-rw-r--r--drivers/scsi/libsas/sas_expander.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c
index 7af776737b40..f42b0e15410f 100644
--- a/drivers/scsi/libsas/sas_expander.c
+++ b/drivers/scsi/libsas/sas_expander.c
@@ -235,6 +235,17 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id, void *rsp)
235 linkrate = phy->linkrate; 235 linkrate = phy->linkrate;
236 memcpy(sas_addr, phy->attached_sas_addr, SAS_ADDR_SIZE); 236 memcpy(sas_addr, phy->attached_sas_addr, SAS_ADDR_SIZE);
237 237
238 /* Handle vacant phy - rest of dr data is not valid so skip it */
239 if (phy->phy_state == PHY_VACANT) {
240 memset(phy->attached_sas_addr, 0, SAS_ADDR_SIZE);
241 phy->attached_dev_type = NO_DEVICE;
242 if (!test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state)) {
243 phy->phy_id = phy_id;
244 goto skip;
245 } else
246 goto out;
247 }
248
238 phy->attached_dev_type = to_dev_type(dr); 249 phy->attached_dev_type = to_dev_type(dr);
239 if (test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state)) 250 if (test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state))
240 goto out; 251 goto out;
@@ -272,6 +283,7 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id, void *rsp)
272 phy->phy->maximum_linkrate = dr->pmax_linkrate; 283 phy->phy->maximum_linkrate = dr->pmax_linkrate;
273 phy->phy->negotiated_linkrate = phy->linkrate; 284 phy->phy->negotiated_linkrate = phy->linkrate;
274 285
286 skip:
275 if (new_phy) 287 if (new_phy)
276 if (sas_phy_add(phy->phy)) { 288 if (sas_phy_add(phy->phy)) {
277 sas_phy_free(phy->phy); 289 sas_phy_free(phy->phy);
@@ -388,7 +400,7 @@ int sas_ex_phy_discover(struct domain_device *dev, int single)
388 if (!disc_req) 400 if (!disc_req)
389 return -ENOMEM; 401 return -ENOMEM;
390 402
391 disc_resp = alloc_smp_req(DISCOVER_RESP_SIZE); 403 disc_resp = alloc_smp_resp(DISCOVER_RESP_SIZE);
392 if (!disc_resp) { 404 if (!disc_resp) {
393 kfree(disc_req); 405 kfree(disc_req);
394 return -ENOMEM; 406 return -ENOMEM;