aboutsummaryrefslogtreecommitdiffstats
path: root/usb
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2005-11-30 23:38:05 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2005-11-30 23:38:05 -0800
commitba7b60dbf1b49c0777e2ac9b7305ae95d7e24c5d (patch)
tree9c3f187f30b606d9eb240d38248be25b924e840a /usb
parentf72486aeeb282ba3eabd5ddb686bc18243e0f8a0 (diff)
downloadpatches-ba7b60dbf1b49c0777e2ac9b7305ae95d7e24c5d.tar.gz
2.6.15-rc4 sync
Diffstat (limited to 'usb')
-rw-r--r--usb/additional-device-id-for-conexant-accessrunner-usb-driver.patch30
-rw-r--r--usb/usb-documentation-update.patch32
-rw-r--r--usb/usb-ehci-fixups.patch76
-rw-r--r--usb/usb-fix-usb-suspend-resume-crasher.patch412
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);