diff options
Diffstat (limited to 'drivers/misc/hpilo.c')
-rw-r--r-- | drivers/misc/hpilo.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/misc/hpilo.c b/drivers/misc/hpilo.c index 6df0da4085e3..12ccdf94e4fa 100644 --- a/drivers/misc/hpilo.c +++ b/drivers/misc/hpilo.c | |||
@@ -736,7 +736,14 @@ static void ilo_remove(struct pci_dev *pdev) | |||
736 | free_irq(pdev->irq, ilo_hw); | 736 | free_irq(pdev->irq, ilo_hw); |
737 | ilo_unmap_device(pdev, ilo_hw); | 737 | ilo_unmap_device(pdev, ilo_hw); |
738 | pci_release_regions(pdev); | 738 | pci_release_regions(pdev); |
739 | pci_disable_device(pdev); | 739 | /* |
740 | * pci_disable_device(pdev) used to be here. But this PCI device has | ||
741 | * two functions with interrupt lines connected to a single pin. The | ||
742 | * other one is a USB host controller. So when we disable the PIN here | ||
743 | * e.g. by rmmod hpilo, the controller stops working. It is because | ||
744 | * the interrupt link is disabled in ACPI since it is not refcounted | ||
745 | * yet. See acpi_pci_link_free_irq called from acpi_pci_irq_disable. | ||
746 | */ | ||
740 | kfree(ilo_hw); | 747 | kfree(ilo_hw); |
741 | ilo_hwdev[(minor / max_ccb)] = 0; | 748 | ilo_hwdev[(minor / max_ccb)] = 0; |
742 | } | 749 | } |
@@ -826,7 +833,7 @@ unmap: | |||
826 | free_regions: | 833 | free_regions: |
827 | pci_release_regions(pdev); | 834 | pci_release_regions(pdev); |
828 | disable: | 835 | disable: |
829 | pci_disable_device(pdev); | 836 | /* pci_disable_device(pdev); see comment in ilo_remove */ |
830 | free: | 837 | free: |
831 | kfree(ilo_hw); | 838 | kfree(ilo_hw); |
832 | out: | 839 | out: |