diff options
Diffstat (limited to 'drivers/scsi/bfa/bfad_im.c')
-rw-r--r-- | drivers/scsi/bfa/bfad_im.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/scsi/bfa/bfad_im.c b/drivers/scsi/bfa/bfad_im.c index ffbec9ba21b7..678120b70460 100644 --- a/drivers/scsi/bfa/bfad_im.c +++ b/drivers/scsi/bfa/bfad_im.c | |||
@@ -554,7 +554,7 @@ bfad_im_scsi_host_alloc(struct bfad_s *bfad, struct bfad_im_port_s *im_port, | |||
554 | im_port->shost->transportt = | 554 | im_port->shost->transportt = |
555 | bfad_im_scsi_vport_transport_template; | 555 | bfad_im_scsi_vport_transport_template; |
556 | 556 | ||
557 | error = scsi_add_host(im_port->shost, dev); | 557 | error = scsi_add_host_with_dma(im_port->shost, dev, &bfad->pcidev->dev); |
558 | if (error) { | 558 | if (error) { |
559 | printk(KERN_WARNING "scsi_add_host failure %d\n", error); | 559 | printk(KERN_WARNING "scsi_add_host failure %d\n", error); |
560 | goto out_fc_rel; | 560 | goto out_fc_rel; |
@@ -598,10 +598,12 @@ bfad_im_port_delete_handler(struct work_struct *work) | |||
598 | { | 598 | { |
599 | struct bfad_im_port_s *im_port = | 599 | struct bfad_im_port_s *im_port = |
600 | container_of(work, struct bfad_im_port_s, port_delete_work); | 600 | container_of(work, struct bfad_im_port_s, port_delete_work); |
601 | struct bfad_s *bfad = im_port->bfad; | ||
601 | 602 | ||
602 | if (im_port->port->pvb_type != BFAD_PORT_PHYS_BASE) { | 603 | if (im_port->port->pvb_type != BFAD_PORT_PHYS_BASE) { |
603 | im_port->flags |= BFAD_PORT_DELETE; | 604 | im_port->flags |= BFAD_PORT_DELETE; |
604 | fc_vport_terminate(im_port->fc_vport); | 605 | fc_vport_terminate(im_port->fc_vport); |
606 | atomic_dec(&bfad->wq_reqcnt); | ||
605 | } | 607 | } |
606 | 608 | ||
607 | } | 609 | } |
@@ -634,8 +636,11 @@ bfad_im_port_delete(struct bfad_s *bfad, struct bfad_port_s *port) | |||
634 | { | 636 | { |
635 | struct bfad_im_port_s *im_port = port->im_port; | 637 | struct bfad_im_port_s *im_port = port->im_port; |
636 | 638 | ||
637 | queue_work(bfad->im->drv_workq, | 639 | if (im_port->port->pvb_type != BFAD_PORT_PHYS_BASE) { |
640 | atomic_inc(&bfad->wq_reqcnt); | ||
641 | queue_work(bfad->im->drv_workq, | ||
638 | &im_port->port_delete_work); | 642 | &im_port->port_delete_work); |
643 | } | ||
639 | } | 644 | } |
640 | 645 | ||
641 | void | 646 | void |
@@ -696,6 +701,12 @@ void | |||
696 | bfad_im_probe_undo(struct bfad_s *bfad) | 701 | bfad_im_probe_undo(struct bfad_s *bfad) |
697 | { | 702 | { |
698 | if (bfad->im) { | 703 | if (bfad->im) { |
704 | while (atomic_read(&bfad->wq_reqcnt)) { | ||
705 | printk(KERN_INFO "bfa %s: waiting workq processing," | ||
706 | " wq_reqcnt:%x\n", bfad->pci_name, | ||
707 | atomic_read(&bfad->wq_reqcnt)); | ||
708 | schedule_timeout_uninterruptible(HZ); | ||
709 | } | ||
699 | bfad_os_destroy_workq(bfad->im); | 710 | bfad_os_destroy_workq(bfad->im); |
700 | kfree(bfad->im); | 711 | kfree(bfad->im); |
701 | bfad->im = NULL; | 712 | bfad->im = NULL; |