USB: automatically enable wakeup for PCI host controllers
authorAlan Stern <stern@rowland.harvard.edu>
Wed, 17 Dec 2008 22:20:38 +0000 (17:20 -0500)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 7 Jan 2009 18:00:12 +0000 (10:00 -0800)
This patch (as1193b) enables wakeup during initialization for all PCI
host controllers, and it removes some code (and comments!) that are no
longer needed now that the PCI core automatically initializes wakeup
settings for all new devices.

The idea is that the bus should initialize wakeup, and the bus glue
or controller driver should enable it.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/core/hcd-pci.c
drivers/usb/host/ehci-pci.c
drivers/usb/host/ohci-hcd.c
drivers/usb/host/ohci-pci.c

index 99432785f438bd34e0670fd1fb644949d1b0750b..507741ed448271e8dcd50782e16034e0360ef7a4 100644 (file)
@@ -128,6 +128,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
        }
 
        pci_set_master(dev);
+       device_set_wakeup_enable(&dev->dev, 1);
 
        retval = usb_add_hcd(hcd, dev->irq, IRQF_DISABLED | IRQF_SHARED);
        if (retval != 0)
index 6af47a0937b85659bab53cb156978d93bd857ca0..bdc6e86e1f8b0aed2a6d505f618ed1bdd0a43b50 100644 (file)
@@ -219,15 +219,19 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
        /* Serial Bus Release Number is at PCI 0x60 offset */
        pci_read_config_byte(pdev, 0x60, &ehci->sbrn);
 
-       /* Workaround current PCI init glitch:  wakeup bits aren't
-        * being set from PCI PM capability.
+       /* Keep this around for a while just in case some EHCI
+        * implementation uses legacy PCI PM support.  This test
+        * can be removed on 17 Dec 2009 if the dev_warn() hasn't
+        * been triggered by then.
         */
        if (!device_can_wakeup(&pdev->dev)) {
                u16     port_wake;
 
                pci_read_config_word(pdev, 0x62, &port_wake);
-               if (port_wake & 0x0001)
+               if (port_wake & 0x0001) {
+                       dev_warn(&pdev->dev, "Enabling legacy PCI PM\n");
                        device_init_wakeup(&pdev->dev, 1);
+               }
        }
 
 #ifdef CONFIG_USB_SUSPEND
index 8aa3f4556a32fb91b1f2878aded3d9f918dee260..65a9609f4ad667f9a287c1b5a47f4420a674eb0e 100644 (file)
@@ -589,13 +589,15 @@ static int ohci_run (struct ohci_hcd *ohci)
                /* also: power/overcurrent flags in roothub.a */
        }
 
-       /* Reset USB nearly "by the book".  RemoteWakeupConnected was
-        * saved if boot firmware (BIOS/SMM/...) told us it's connected,
-        * or if bus glue did the same (e.g. for PCI add-in cards with
-        * PCI PM support).
+       /* Reset USB nearly "by the book".  RemoteWakeupConnected has
+        * to be checked in case boot firmware (BIOS/SMM/...) has set up
+        * wakeup in a way the bus isn't aware of (e.g., legacy PCI PM).
+        * If the bus glue detected wakeup capability then it should
+        * already be enabled.  Either way, if wakeup should be enabled
+        * but isn't, we'll enable it now.
         */
        if ((ohci->hc_control & OHCI_CTRL_RWC) != 0
-                       && !device_may_wakeup(hcd->self.controller))
+                       && !device_can_wakeup(hcd->self.controller))
                device_init_wakeup(hcd->self.controller, 1);
 
        switch (ohci->hc_control & OHCI_CTRL_HCFS) {
index 8380cc2e961a8092ebf110b22557600615f85a43..8b28ae7865ba6d4c4d07ac2962d91f7d52d572b8 100644 (file)
@@ -355,9 +355,9 @@ static int __devinit ohci_pci_start (struct usb_hcd *hcd)
 
                /* RWC may not be set for add-in PCI cards, since boot
                 * firmware probably ignored them.  This transfers PCI
-                * PM wakeup capabilities (once the PCI layer is fixed).
+                * PM wakeup capabilities.
                 */
-               if (device_may_wakeup(&pdev->dev))
+               if (device_can_wakeup(&pdev->dev))
                        ohci->hc_control |= OHCI_CTRL_RWC;
        }
 #endif /* CONFIG_PM */