diff options
Diffstat (limited to 'drivers/scsi/libsas/sas_discover.c')
-rw-r--r-- | drivers/scsi/libsas/sas_discover.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c index 14f714d05767..e4fd078e4175 100644 --- a/drivers/scsi/libsas/sas_discover.c +++ b/drivers/scsi/libsas/sas_discover.c | |||
@@ -212,13 +212,9 @@ void sas_notify_lldd_dev_gone(struct domain_device *dev) | |||
212 | } | 212 | } |
213 | } | 213 | } |
214 | 214 | ||
215 | static void sas_probe_devices(struct work_struct *work) | 215 | static void sas_probe_devices(struct asd_sas_port *port) |
216 | { | 216 | { |
217 | struct domain_device *dev, *n; | 217 | struct domain_device *dev, *n; |
218 | struct sas_discovery_event *ev = to_sas_discovery_event(work); | ||
219 | struct asd_sas_port *port = ev->port; | ||
220 | |||
221 | clear_bit(DISCE_PROBE, &port->disc.pending); | ||
222 | 218 | ||
223 | /* devices must be domain members before link recovery and probe */ | 219 | /* devices must be domain members before link recovery and probe */ |
224 | list_for_each_entry(dev, &port->disco_list, disco_list_node) { | 220 | list_for_each_entry(dev, &port->disco_list, disco_list_node) { |
@@ -294,7 +290,6 @@ int sas_discover_end_dev(struct domain_device *dev) | |||
294 | res = sas_notify_lldd_dev_found(dev); | 290 | res = sas_notify_lldd_dev_found(dev); |
295 | if (res) | 291 | if (res) |
296 | return res; | 292 | return res; |
297 | sas_discover_event(dev->port, DISCE_PROBE); | ||
298 | 293 | ||
299 | return 0; | 294 | return 0; |
300 | } | 295 | } |
@@ -353,13 +348,9 @@ static void sas_unregister_common_dev(struct asd_sas_port *port, struct domain_d | |||
353 | sas_put_device(dev); | 348 | sas_put_device(dev); |
354 | } | 349 | } |
355 | 350 | ||
356 | static void sas_destruct_devices(struct work_struct *work) | 351 | void sas_destruct_devices(struct asd_sas_port *port) |
357 | { | 352 | { |
358 | struct domain_device *dev, *n; | 353 | struct domain_device *dev, *n; |
359 | struct sas_discovery_event *ev = to_sas_discovery_event(work); | ||
360 | struct asd_sas_port *port = ev->port; | ||
361 | |||
362 | clear_bit(DISCE_DESTRUCT, &port->disc.pending); | ||
363 | 354 | ||
364 | list_for_each_entry_safe(dev, n, &port->destroy_list, disco_list_node) { | 355 | list_for_each_entry_safe(dev, n, &port->destroy_list, disco_list_node) { |
365 | list_del_init(&dev->disco_list_node); | 356 | list_del_init(&dev->disco_list_node); |
@@ -370,6 +361,16 @@ static void sas_destruct_devices(struct work_struct *work) | |||
370 | } | 361 | } |
371 | } | 362 | } |
372 | 363 | ||
364 | static void sas_destruct_ports(struct asd_sas_port *port) | ||
365 | { | ||
366 | struct sas_port *sas_port, *p; | ||
367 | |||
368 | list_for_each_entry_safe(sas_port, p, &port->sas_port_del_list, del_list) { | ||
369 | list_del_init(&sas_port->del_list); | ||
370 | sas_port_delete(sas_port); | ||
371 | } | ||
372 | } | ||
373 | |||
373 | void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev) | 374 | void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev) |
374 | { | 375 | { |
375 | if (!test_bit(SAS_DEV_DESTROY, &dev->state) && | 376 | if (!test_bit(SAS_DEV_DESTROY, &dev->state) && |
@@ -384,7 +385,6 @@ void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev) | |||
384 | if (!test_and_set_bit(SAS_DEV_DESTROY, &dev->state)) { | 385 | if (!test_and_set_bit(SAS_DEV_DESTROY, &dev->state)) { |
385 | sas_rphy_unlink(dev->rphy); | 386 | sas_rphy_unlink(dev->rphy); |
386 | list_move_tail(&dev->disco_list_node, &port->destroy_list); | 387 | list_move_tail(&dev->disco_list_node, &port->destroy_list); |
387 | sas_discover_event(dev->port, DISCE_DESTRUCT); | ||
388 | } | 388 | } |
389 | } | 389 | } |
390 | 390 | ||
@@ -490,6 +490,8 @@ static void sas_discover_domain(struct work_struct *work) | |||
490 | port->port_dev = NULL; | 490 | port->port_dev = NULL; |
491 | } | 491 | } |
492 | 492 | ||
493 | sas_probe_devices(port); | ||
494 | |||
493 | SAS_DPRINTK("DONE DISCOVERY on port %d, pid:%d, result:%d\n", port->id, | 495 | SAS_DPRINTK("DONE DISCOVERY on port %d, pid:%d, result:%d\n", port->id, |
494 | task_pid_nr(current), error); | 496 | task_pid_nr(current), error); |
495 | } | 497 | } |
@@ -523,6 +525,10 @@ static void sas_revalidate_domain(struct work_struct *work) | |||
523 | port->id, task_pid_nr(current), res); | 525 | port->id, task_pid_nr(current), res); |
524 | out: | 526 | out: |
525 | mutex_unlock(&ha->disco_mutex); | 527 | mutex_unlock(&ha->disco_mutex); |
528 | |||
529 | sas_destruct_devices(port); | ||
530 | sas_destruct_ports(port); | ||
531 | sas_probe_devices(port); | ||
526 | } | 532 | } |
527 | 533 | ||
528 | /* ---------- Events ---------- */ | 534 | /* ---------- Events ---------- */ |
@@ -578,10 +584,8 @@ void sas_init_disc(struct sas_discovery *disc, struct asd_sas_port *port) | |||
578 | static const work_func_t sas_event_fns[DISC_NUM_EVENTS] = { | 584 | static const work_func_t sas_event_fns[DISC_NUM_EVENTS] = { |
579 | [DISCE_DISCOVER_DOMAIN] = sas_discover_domain, | 585 | [DISCE_DISCOVER_DOMAIN] = sas_discover_domain, |
580 | [DISCE_REVALIDATE_DOMAIN] = sas_revalidate_domain, | 586 | [DISCE_REVALIDATE_DOMAIN] = sas_revalidate_domain, |
581 | [DISCE_PROBE] = sas_probe_devices, | ||
582 | [DISCE_SUSPEND] = sas_suspend_devices, | 587 | [DISCE_SUSPEND] = sas_suspend_devices, |
583 | [DISCE_RESUME] = sas_resume_devices, | 588 | [DISCE_RESUME] = sas_resume_devices, |
584 | [DISCE_DESTRUCT] = sas_destruct_devices, | ||
585 | }; | 589 | }; |
586 | 590 | ||
587 | disc->pending = 0; | 591 | disc->pending = 0; |