diff options
Diffstat (limited to 'wctdm24xxp/base.c')
-rw-r--r-- | wctdm24xxp/base.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/wctdm24xxp/base.c b/wctdm24xxp/base.c index 9a7a491..eef087d 100644 --- a/wctdm24xxp/base.c +++ b/wctdm24xxp/base.c @@ -3595,15 +3595,9 @@ static void __devexit wctdm_remove_one(struct pci_dev *pdev) clear_bit(VPM150M_ACTIVE, &vpm150m->control); flush_workqueue(vpm150m->wq); destroy_workqueue(vpm150m->wq); - - spin_lock_irqsave(&wc->reglock, flags); - wc->vpm150m = NULL; - vpm150m->wc = NULL; - spin_unlock_irqrestore(&wc->reglock, flags); - - kfree(wc->vpm150m); } #endif + /* Stop any DMA */ wctdm_stop_dma(wc); @@ -3611,9 +3605,19 @@ static void __devexit wctdm_remove_one(struct pci_dev *pdev) wctdm_disable_interrupts(wc); /* Immediately free resources */ - pci_free_consistent(pdev, PCI_WINDOW_SIZE, (void *)wc->writechunk, wc->writedma); free_irq(pdev->irq, wc); + pci_free_consistent(pdev, PCI_WINDOW_SIZE, (void *)wc->writechunk, wc->writedma); +#ifdef VPM150M_SUPPORT + if (vpm150m) { + spin_lock_irqsave(&wc->reglock, flags); + wc->vpm150m = NULL; + vpm150m->wc = NULL; + spin_unlock_irqrestore(&wc->reglock, flags); + + kfree(wc->vpm150m); + } +#endif /* Release span, possibly delayed */ if (!wc->usecount) wctdm_release(wc); |