ipw2100: fix rebooting hang with driver loaded
authorZhu Yi <yi.zhu@intel.com>
Wed, 2 Dec 2009 06:24:37 +0000 (14:24 +0800)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 4 Dec 2009 19:16:25 +0000 (14:16 -0500)
Add PCI .shutdown method so that we can disable the device during
shutdown or reboot. Without this, the reboot doesn't work well on
some platforms.

This fixes http://bugzilla.intellinuxwireless.org/show_bug.cgi?id=2124

Tested-by: pablo <pablolm2005@gmail.com>
Signed-off-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ipw2x00/ipw2100.c

index 6c836c8..17a9cb3 100644 (file)
@@ -6573,6 +6573,16 @@ static int ipw2100_resume(struct pci_dev *pci_dev)
 }
 #endif
 
+static void ipw2100_shutdown(struct pci_dev *pci_dev)
+{
+       struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
+
+       /* Take down the device; powers it off, etc. */
+       ipw2100_down(priv);
+
+       pci_disable_device(pci_dev);
+}
+
 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
 
 static struct pci_device_id ipw2100_pci_id_table[] __devinitdata = {
@@ -6636,6 +6646,7 @@ static struct pci_driver ipw2100_pci_driver = {
        .suspend = ipw2100_suspend,
        .resume = ipw2100_resume,
 #endif
+       .shutdown = ipw2100_shutdown,
 };
 
 /**