diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2005-11-30 23:38:05 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-11-30 23:38:05 -0800 |
commit | ba7b60dbf1b49c0777e2ac9b7305ae95d7e24c5d (patch) | |
tree | 9c3f187f30b606d9eb240d38248be25b924e840a /usb | |
parent | f72486aeeb282ba3eabd5ddb686bc18243e0f8a0 (diff) | |
download | patches-ba7b60dbf1b49c0777e2ac9b7305ae95d7e24c5d.tar.gz |
2.6.15-rc4 sync
Diffstat (limited to 'usb')
-rw-r--r-- | usb/additional-device-id-for-conexant-accessrunner-usb-driver.patch | 30 | ||||
-rw-r--r-- | usb/usb-documentation-update.patch | 32 | ||||
-rw-r--r-- | usb/usb-ehci-fixups.patch | 76 | ||||
-rw-r--r-- | usb/usb-fix-usb-suspend-resume-crasher.patch | 412 |
4 files changed, 0 insertions, 550 deletions
diff --git a/usb/additional-device-id-for-conexant-accessrunner-usb-driver.patch b/usb/additional-device-id-for-conexant-accessrunner-usb-driver.patch deleted file mode 100644 index 38ef63551c62a0..00000000000000 --- a/usb/additional-device-id-for-conexant-accessrunner-usb-driver.patch +++ /dev/null @@ -1,30 +0,0 @@ -From davej@redhat.com Mon Nov 28 10:50:35 2005 -Date: Mon, 28 Nov 2005 13:44:52 -0500 -From: Dave Jones <davej@redhat.com> -Cc: gregkh@suse.de, petr.tuma@mff.cuni.cz -Subject: Additional device ID for Conexant AccessRunner USB driver -Message-ID: <20051128184452.GA25570@redhat.com> -Content-Disposition: inline - -Reported as working in Fedora bugzilla by Petr. - -From: Petr Tuma <petr.tuma@mff.cuni.cz> -Signed-off-by: Dave Jones <davej@redhat.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/atm/cxacru.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- gregkh-2.6.orig/drivers/usb/atm/cxacru.c -+++ gregkh-2.6/drivers/usb/atm/cxacru.c -@@ -787,6 +787,9 @@ static const struct usb_device_id cxacru - { /* V = Conexant P = ADSL modem (Hasbani project) */ - USB_DEVICE(0x0572, 0xcb00), .driver_info = (unsigned long) &cxacru_cb00 - }, -+ { /* V = Conexant P = ADSL modem (Well PTI-800 */ -+ USB_DEVICE(0x0572, 0xcb02), .driver_info = (unsigned long) &cxacru_cb00 -+ }, - { /* V = Conexant P = ADSL modem */ - USB_DEVICE(0x0572, 0xcb01), .driver_info = (unsigned long) &cxacru_cb00 - }, diff --git a/usb/usb-documentation-update.patch b/usb/usb-documentation-update.patch deleted file mode 100644 index 30bc31de9e0185..00000000000000 --- a/usb/usb-documentation-update.patch +++ /dev/null @@ -1,32 +0,0 @@ -From stern@rowland.harvard.edu Mon Nov 28 12:26:20 2005 -Date: Mon, 28 Nov 2005 15:22:55 -0500 (EST) -From: Alan Stern <stern@rowland.harvard.edu> -To: Greg KH <greg@kroah.com> -cc: David Brownell <david-b@pacbell.net>, Chris Humbert <mahadri-usb@drigon.com> -Subject: USB: documentation update -Message-ID: <Pine.LNX.4.44L0.0511281521290.4910-100000@iolanthe.rowland.org> - -This patch (as611) fixes a minor mistake and misspelling in the USB -documentation. - -Signed-off-by: Alan Stern <stern@rowland.harvard.edu> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - Documentation/usb/error-codes.txt | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - ---- gregkh-2.6.orig/Documentation/usb/error-codes.txt -+++ gregkh-2.6/Documentation/usb/error-codes.txt -@@ -46,8 +46,9 @@ USB-specific: - - -EMSGSIZE (a) endpoint maxpacket size is zero; it is not usable - in the current interface altsetting. -- (b) ISO packet is biger than endpoint maxpacket -- (c) requested data transfer size is invalid (negative) -+ (b) ISO packet is larger than the endpoint maxpacket. -+ (c) requested data transfer length is invalid: negative -+ or too large for the host controller. - - -ENOSPC This request would overcommit the usb bandwidth reserved - for periodic transfers (interrupt, isochronous). diff --git a/usb/usb-ehci-fixups.patch b/usb/usb-ehci-fixups.patch deleted file mode 100644 index 9092ca80546a36..00000000000000 --- a/usb/usb-ehci-fixups.patch +++ /dev/null @@ -1,76 +0,0 @@ -From david-b@pacbell.net Mon Nov 28 08:44:20 2005 -From: David Brownell <david-b@pacbell.net> -To: Benjamin Herrenschmidt <benh@kernel.crashing.org> -Subject: USB: ehci fixups -Date: Mon, 28 Nov 2005 08:40:38 -0800 -Cc: Michael Buesch <mbuesch@freenet.de>, Alan Stern <stern@rowland.harvard.edu>, Greg KH <greg@kroah.com> -Message-Id: <200511280840.39002.david-b@pacbell.net> - - -Rename the EHCI "reset" routine so it better matches what it does (setup); -and move the one-time data structure setup earlier, before doing anything -that implicitly relies on it having been completed already. - -From: David Brownell <david-b@pacbell.net> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/usb/host/ehci-pci.c | 19 ++++++++++++------- - 1 file changed, 12 insertions(+), 7 deletions(-) - ---- gregkh-2.6.orig/drivers/usb/host/ehci-pci.c -+++ gregkh-2.6/drivers/usb/host/ehci-pci.c -@@ -121,8 +121,8 @@ static int ehci_pci_reinit(struct ehci_h - return 0; - } - --/* called by khubd or root hub (re)init threads; leaves HC in halt state */ --static int ehci_pci_reset(struct usb_hcd *hcd) -+/* called during probe() after chip reset completes */ -+static int ehci_pci_setup(struct usb_hcd *hcd) - { - struct ehci_hcd *ehci = hcd_to_ehci(hcd); - struct pci_dev *pdev = to_pci_dev(hcd->self.controller); -@@ -141,6 +141,11 @@ static int ehci_pci_reset(struct usb_hcd - if (retval) - return retval; - -+ /* data structure init */ -+ retval = ehci_init(hcd); -+ if (retval) -+ return retval; -+ - /* NOTE: only the parts below this line are PCI-specific */ - - switch (pdev->vendor) { -@@ -154,7 +159,8 @@ static int ehci_pci_reset(struct usb_hcd - /* AMD8111 EHCI doesn't work, according to AMD errata */ - if (pdev->device == 0x7463) { - ehci_info(ehci, "ignoring AMD8111 (errata)\n"); -- return -EIO; -+ retval = -EIO; -+ goto done; - } - break; - case PCI_VENDOR_ID_NVIDIA: -@@ -207,9 +213,8 @@ static int ehci_pci_reset(struct usb_hcd - /* REVISIT: per-port wake capability (PCI 0x62) currently unused */ - - retval = ehci_pci_reinit(ehci, pdev); -- -- /* finish init */ -- return ehci_init(hcd); -+done: -+ return retval; - } - - /*-------------------------------------------------------------------------*/ -@@ -344,7 +349,7 @@ static const struct hc_driver ehci_pci_h - /* - * basic lifecycle operations - */ -- .reset = ehci_pci_reset, -+ .reset = ehci_pci_setup, - .start = ehci_run, - #ifdef CONFIG_PM - .suspend = ehci_pci_suspend, diff --git a/usb/usb-fix-usb-suspend-resume-crasher.patch b/usb/usb-fix-usb-suspend-resume-crasher.patch deleted file mode 100644 index 9d2e6101b99716..00000000000000 --- a/usb/usb-fix-usb-suspend-resume-crasher.patch +++ /dev/null @@ -1,412 +0,0 @@ -From benh@kernel.crashing.org Thu Nov 24 15:05:54 2005 -Subject: [PATCH] USB: Fix USB suspend/resume crasher (#2) -From: Benjamin Herrenschmidt <benh@kernel.crashing.org> -To: Greg KH <greg@kroah.com> -Cc: Alan Stern <stern@rowland.harvard.edu>, David Brownell <david-b@pacbell.net>, Andrew Morton <akpm@osdl.org> -Date: Fri, 25 Nov 2005 09:59:46 +1100 -Message-Id: <1132873186.26560.487.camel@gaston> - -This patch closes the IRQ race and makes various other OHCI & EHCI code -path safer vs. suspend/resume. -I've been able to (finally !) successfully suspend and resume various -Mac models, with or without USB mouse plugged, or plugging while asleep, -or unplugging while asleep etc... all without a crash. - -Alan, please verify the UHCI bit I did, I only verified that it builds. -It's very simple so I wouldn't expect any issue there. If you aren't -confident, then just drop the hunks that change uhci-hcd.c - -I also made the patch a little bit more "safer" by making sure the store -to the interrupt register that disables interrupts is not posted before -I set the flag and drop the spinlock. - -Without this patch, you cannot reliably sleep/wakeup any recent Mac, and -I suspect PCs have some more sneaky issues too (they don't frankly crash -with machine checks because x86 tend to silently swallow PCI errors but -that won't last afaik, at least PCI Express will blow up in those -situations, but the USB code may still misbehave). - -Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> ---- - drivers/usb/core/hcd-pci.c | 3 ++- - drivers/usb/core/hcd.c | 15 ++++++++++----- - drivers/usb/core/hcd.h | 7 ++++++- - drivers/usb/host/ehci-pci.c | 27 ++++++++++++++++++++++++++- - drivers/usb/host/ehci-q.c | 24 ++++++++++++++++-------- - drivers/usb/host/ehci-sched.c | 18 ++++++++++++++++-- - drivers/usb/host/ohci-hcd.c | 6 +++++- - drivers/usb/host/ohci-hub.c | 24 ++++++++++++++++++++---- - drivers/usb/host/ohci-pci.c | 27 +++++++++++++++++++++++++-- - drivers/usb/host/uhci-hcd.c | 6 ++++++ - 10 files changed, 132 insertions(+), 25 deletions(-) - ---- gregkh-2.6.orig/drivers/usb/core/hcd-pci.c -+++ gregkh-2.6/drivers/usb/core/hcd-pci.c -@@ -219,6 +219,7 @@ int usb_hcd_pci_suspend (struct pci_dev - goto done; - } - } -+ synchronize_irq(dev->irq); - - /* FIXME until the generic PM interfaces change a lot more, this - * can't use PCI D1 and D2 states. For example, the confusion -@@ -392,7 +393,7 @@ int usb_hcd_pci_resume (struct pci_dev * - - dev->dev.power.power_state = PMSG_ON; - -- hcd->saw_irq = 0; -+ clear_bit(HCD_FLAG_SAW_IRQ, &hcd->flags); - - if (hcd->driver->resume) { - retval = hcd->driver->resume(hcd); ---- gregkh-2.6.orig/drivers/usb/core/hcd.c -+++ gregkh-2.6/drivers/usb/core/hcd.c -@@ -1315,11 +1315,12 @@ static int hcd_unlink_urb (struct urb *u - * finish unlinking the initial failed usb_set_address() - * or device descriptor fetch. - */ -- if (!hcd->saw_irq && hcd->self.root_hub != urb->dev) { -+ if (!test_bit(HCD_FLAG_SAW_IRQ, &hcd->flags) -+ && hcd->self.root_hub != urb->dev) { - dev_warn (hcd->self.controller, "Unlink after no-IRQ? " - "Controller is probably using the wrong IRQ." - "\n"); -- hcd->saw_irq = 1; -+ set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags); - } - - urb->status = status; -@@ -1649,13 +1650,15 @@ irqreturn_t usb_hcd_irq (int irq, void * - struct usb_hcd *hcd = __hcd; - int start = hcd->state; - -- if (start == HC_STATE_HALT) -+ if (unlikely(start == HC_STATE_HALT || -+ !test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))) - return IRQ_NONE; - if (hcd->driver->irq (hcd, r) == IRQ_NONE) - return IRQ_NONE; - -- hcd->saw_irq = 1; -- if (hcd->state == HC_STATE_HALT) -+ set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags); -+ -+ if (unlikely(hcd->state == HC_STATE_HALT)) - usb_hc_died (hcd); - return IRQ_HANDLED; - } -@@ -1768,6 +1771,8 @@ int usb_add_hcd(struct usb_hcd *hcd, - - dev_info(hcd->self.controller, "%s\n", hcd->product_desc); - -+ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); -+ - /* till now HC has been in an indeterminate state ... */ - if (hcd->driver->reset && (retval = hcd->driver->reset(hcd)) < 0) { - dev_err(hcd->self.controller, "can't reset\n"); ---- gregkh-2.6.orig/drivers/usb/core/hcd.h -+++ gregkh-2.6/drivers/usb/core/hcd.h -@@ -72,7 +72,12 @@ struct usb_hcd { /* usb_bus.hcpriv point - * hardware info/state - */ - const struct hc_driver *driver; /* hw-specific hooks */ -- unsigned saw_irq : 1; -+ -+ /* Flags that need to be manipulated atomically */ -+ unsigned long flags; -+#define HCD_FLAG_HW_ACCESSIBLE 0x00000001 -+#define HCD_FLAG_SAW_IRQ 0x00000002 -+ - unsigned can_wakeup:1; /* hw supports wakeup? */ - unsigned remote_wakeup:1;/* sw should use wakeup? */ - unsigned rh_registered:1;/* is root hub registered? */ ---- gregkh-2.6.orig/drivers/usb/host/ehci-pci.c -+++ gregkh-2.6/drivers/usb/host/ehci-pci.c -@@ -228,14 +228,36 @@ static int ehci_pci_reset(struct usb_hcd - static int ehci_pci_suspend(struct usb_hcd *hcd, pm_message_t message) - { - struct ehci_hcd *ehci = hcd_to_ehci(hcd); -+ unsigned long flags; -+ int rc = 0; - - if (time_before(jiffies, ehci->next_statechange)) - msleep(10); - -+ /* Root hub was already suspended. Disable irq emission and -+ * mark HW unaccessible, bail out if RH has been resumed. Use -+ * the spinlock to properly synchronize with possible pending -+ * RH suspend or resume activity. -+ * -+ * This is still racy as hcd->state is manipulated outside of -+ * any locks =P But that will be a different fix. -+ */ -+ spin_lock_irqsave (&ehci->lock, flags); -+ if (hcd->state != HC_STATE_SUSPENDED) { -+ rc = -EINVAL; -+ goto bail; -+ } -+ writel (0, &ehci->regs->intr_enable); -+ (void)readl(&ehci->regs->intr_enable); -+ -+ clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); -+ bail: -+ spin_unlock_irqrestore (&ehci->lock, flags); -+ - // could save FLADJ in case of Vaux power loss - // ... we'd only use it to handle clock skew - -- return 0; -+ return rc; - } - - static int ehci_pci_resume(struct usb_hcd *hcd) -@@ -251,6 +273,9 @@ static int ehci_pci_resume(struct usb_hc - if (time_before(jiffies, ehci->next_statechange)) - msleep(100); - -+ /* Mark hardware accessible again as we are out of D3 state by now */ -+ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); -+ - /* If CF is clear, we lost PCI Vaux power and need to restart. */ - if (readl(&ehci->regs->configured_flag) != FLAG_CF) - goto restart; ---- gregkh-2.6.orig/drivers/usb/host/ehci-q.c -+++ gregkh-2.6/drivers/usb/host/ehci-q.c -@@ -912,6 +912,7 @@ submit_async ( - int epnum; - unsigned long flags; - struct ehci_qh *qh = NULL; -+ int rc = 0; - - qtd = list_entry (qtd_list->next, struct ehci_qtd, qtd_list); - epnum = ep->desc.bEndpointAddress; -@@ -926,21 +927,28 @@ submit_async ( - #endif - - spin_lock_irqsave (&ehci->lock, flags); -+ if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, -+ &ehci_to_hcd(ehci)->flags))) { -+ rc = -ESHUTDOWN; -+ goto done; -+ } -+ - qh = qh_append_tds (ehci, urb, qtd_list, epnum, &ep->hcpriv); -+ if (unlikely(qh == NULL)) { -+ rc = -ENOMEM; -+ goto done; -+ } - - /* Control/bulk operations through TTs don't need scheduling, - * the HC and TT handle it when the TT has a buffer ready. - */ -- if (likely (qh != NULL)) { -- if (likely (qh->qh_state == QH_STATE_IDLE)) -- qh_link_async (ehci, qh_get (qh)); -- } -+ if (likely (qh->qh_state == QH_STATE_IDLE)) -+ qh_link_async (ehci, qh_get (qh)); -+ done: - spin_unlock_irqrestore (&ehci->lock, flags); -- if (unlikely (qh == NULL)) { -+ if (unlikely (qh == NULL)) - qtd_list_free (ehci, urb, qtd_list); -- return -ENOMEM; -- } -- return 0; -+ return rc; - } - - /*-------------------------------------------------------------------------*/ ---- gregkh-2.6.orig/drivers/usb/host/ehci-sched.c -+++ gregkh-2.6/drivers/usb/host/ehci-sched.c -@@ -602,6 +602,12 @@ static int intr_submit ( - - spin_lock_irqsave (&ehci->lock, flags); - -+ if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, -+ &ehci_to_hcd(ehci)->flags))) { -+ status = -ESHUTDOWN; -+ goto done; -+ } -+ - /* get qh and force any scheduling errors */ - INIT_LIST_HEAD (&empty); - qh = qh_append_tds (ehci, urb, &empty, epnum, &ep->hcpriv); -@@ -1456,7 +1462,11 @@ static int itd_submit (struct ehci_hcd * - - /* schedule ... need to lock */ - spin_lock_irqsave (&ehci->lock, flags); -- status = iso_stream_schedule (ehci, urb, stream); -+ if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, -+ &ehci_to_hcd(ehci)->flags))) -+ status = -ESHUTDOWN; -+ else -+ status = iso_stream_schedule (ehci, urb, stream); - if (likely (status == 0)) - itd_link_urb (ehci, urb, ehci->periodic_size << 3, stream); - spin_unlock_irqrestore (&ehci->lock, flags); -@@ -1815,7 +1825,11 @@ static int sitd_submit (struct ehci_hcd - - /* schedule ... need to lock */ - spin_lock_irqsave (&ehci->lock, flags); -- status = iso_stream_schedule (ehci, urb, stream); -+ if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, -+ &ehci_to_hcd(ehci)->flags))) -+ status = -ESHUTDOWN; -+ else -+ status = iso_stream_schedule (ehci, urb, stream); - if (status == 0) - sitd_link_urb (ehci, urb, ehci->periodic_size << 3, stream); - spin_unlock_irqrestore (&ehci->lock, flags); ---- gregkh-2.6.orig/drivers/usb/host/ohci-hcd.c -+++ gregkh-2.6/drivers/usb/host/ohci-hcd.c -@@ -115,7 +115,7 @@ - - /*-------------------------------------------------------------------------*/ - --// #define OHCI_VERBOSE_DEBUG /* not always helpful */ -+#undef OHCI_VERBOSE_DEBUG /* not always helpful */ - - /* For initializing controller (mask in an HCFS mode too) */ - #define OHCI_CONTROL_INIT OHCI_CTRL_CBSR -@@ -253,6 +253,10 @@ static int ohci_urb_enqueue ( - spin_lock_irqsave (&ohci->lock, flags); - - /* don't submit to a dead HC */ -+ if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { -+ retval = -ENODEV; -+ goto fail; -+ } - if (!HC_IS_RUNNING(hcd->state)) { - retval = -ENODEV; - goto fail; ---- gregkh-2.6.orig/drivers/usb/host/ohci-hub.c -+++ gregkh-2.6/drivers/usb/host/ohci-hub.c -@@ -53,6 +53,11 @@ static int ohci_bus_suspend (struct usb_ - - spin_lock_irqsave (&ohci->lock, flags); - -+ if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))) { -+ spin_unlock_irqrestore (&ohci->lock, flags); -+ return -ESHUTDOWN; -+ } -+ - ohci->hc_control = ohci_readl (ohci, &ohci->regs->control); - switch (ohci->hc_control & OHCI_CTRL_HCFS) { - case OHCI_USB_RESUME: -@@ -140,11 +145,19 @@ static int ohci_bus_resume (struct usb_h - struct ohci_hcd *ohci = hcd_to_ohci (hcd); - u32 temp, enables; - int status = -EINPROGRESS; -+ unsigned long flags; - - if (time_before (jiffies, ohci->next_statechange)) - msleep(5); - -- spin_lock_irq (&ohci->lock); -+ spin_lock_irqsave (&ohci->lock, flags); -+ -+ if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))) { -+ spin_unlock_irqrestore (&ohci->lock, flags); -+ return -ESHUTDOWN; -+ } -+ -+ - ohci->hc_control = ohci_readl (ohci, &ohci->regs->control); - - if (ohci->hc_control & (OHCI_CTRL_IR | OHCI_SCHED_ENABLES)) { -@@ -179,7 +192,7 @@ static int ohci_bus_resume (struct usb_h - ohci_dbg (ohci, "lost power\n"); - status = -EBUSY; - } -- spin_unlock_irq (&ohci->lock); -+ spin_unlock_irqrestore (&ohci->lock, flags); - if (status == -EBUSY) { - (void) ohci_init (ohci); - return ohci_restart (ohci); -@@ -297,8 +310,8 @@ ohci_hub_status_data (struct usb_hcd *hc - /* handle autosuspended root: finish resuming before - * letting khubd or root hub timer see state changes. - */ -- if ((ohci->hc_control & OHCI_CTRL_HCFS) != OHCI_USB_OPER -- || !HC_IS_RUNNING(hcd->state)) { -+ if (unlikely((ohci->hc_control & OHCI_CTRL_HCFS) != OHCI_USB_OPER -+ || !HC_IS_RUNNING(hcd->state))) { - can_suspend = 0; - goto done; - } -@@ -508,6 +521,9 @@ static int ohci_hub_control ( - u32 temp; - int retval = 0; - -+ if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))) -+ return -ESHUTDOWN; -+ - switch (typeReq) { - case ClearHubFeature: - switch (wValue) { ---- gregkh-2.6.orig/drivers/usb/host/ohci-pci.c -+++ gregkh-2.6/drivers/usb/host/ohci-pci.c -@@ -105,13 +105,36 @@ ohci_pci_start (struct usb_hcd *hcd) - - static int ohci_pci_suspend (struct usb_hcd *hcd, pm_message_t message) - { -- /* root hub was already suspended */ -- return 0; -+ struct ohci_hcd *ohci = hcd_to_ohci (hcd); -+ unsigned long flags; -+ int rc = 0; -+ -+ /* Root hub was already suspended. Disable irq emission and -+ * mark HW unaccessible, bail out if RH has been resumed. Use -+ * the spinlock to properly synchronize with possible pending -+ * RH suspend or resume activity. -+ * -+ * This is still racy as hcd->state is manipulated outside of -+ * any locks =P But that will be a different fix. -+ */ -+ spin_lock_irqsave (&ohci->lock, flags); -+ if (hcd->state != HC_STATE_SUSPENDED) { -+ rc = -EINVAL; -+ goto bail; -+ } -+ ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable); -+ (void)ohci_readl(ohci, &ohci->regs->intrdisable); -+ clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); -+ bail: -+ spin_unlock_irqrestore (&ohci->lock, flags); -+ -+ return rc; - } - - - static int ohci_pci_resume (struct usb_hcd *hcd) - { -+ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); - usb_hcd_resume_root_hub(hcd); - return 0; - } ---- gregkh-2.6.orig/drivers/usb/host/uhci-hcd.c -+++ gregkh-2.6/drivers/usb/host/uhci-hcd.c -@@ -717,6 +717,7 @@ static int uhci_suspend(struct usb_hcd * - * at the source, so we must turn off PIRQ. - */ - pci_write_config_word(to_pci_dev(uhci_dev(uhci)), USBLEGSUP, 0); -+ clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); - uhci->hc_inaccessible = 1; - hcd->poll_rh = 0; - -@@ -733,6 +734,11 @@ static int uhci_resume(struct usb_hcd *h - - dev_dbg(uhci_dev(uhci), "%s\n", __FUNCTION__); - -+ /* We aren't in D3 state anymore, we do that even if dead as I -+ * really don't want to keep a stale HCD_FLAG_HW_ACCESSIBLE=0 -+ */ -+ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); -+ - if (uhci->rh_state == UHCI_RH_RESET) /* Dead */ - return 0; - spin_lock_irq(&uhci->lock); |