ChangeSet 1.1673.8.42, 2004/03/26 14:26:00-08:00, [EMAIL PROTECTED]

[PATCH] USB: ohci misc updates

Mostly from Benjamin Herrenschmidt:

  - prevent usbcore from asking the HCD root hub code
    to read registers on one more suspend path (some
    hardware gets upset in those cases);

  - try handling a "device died" cleanup case better

  - add some wmb() calls in spots that could matter
    on some hardware


 drivers/usb/core/hcd.c      |   11 ++++++++---
 drivers/usb/host/ohci-hcd.c |    5 ++++-
 drivers/usb/host/ohci-q.c   |    4 ++++
 3 files changed, 16 insertions(+), 4 deletions(-)


diff -Nru a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
--- a/drivers/usb/core/hcd.c    Wed Apr 14 14:36:41 2004
+++ b/drivers/usb/core/hcd.c    Wed Apr 14 14:36:41 2004
@@ -418,9 +418,14 @@
 
        default:
                /* non-generic request */
-               urb->status = hcd->driver->hub_control (hcd,
-                       typeReq, wValue, wIndex,
-                       ubuf, wLength);
+               if (HCD_IS_SUSPENDED (hcd->state))
+                       urb->status = -EAGAIN;
+               else if (!HCD_IS_RUNNING (hcd->state))
+                       urb->status = -ENODEV;
+               else
+                       urb->status = hcd->driver->hub_control (hcd,
+                               typeReq, wValue, wIndex,
+                               ubuf, wLength);
                break;
 error:
                /* "protocol stall" on error */
diff -Nru a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
--- a/drivers/usb/host/ohci-hcd.c       Wed Apr 14 14:36:41 2004
+++ b/drivers/usb/host/ohci-hcd.c       Wed Apr 14 14:36:41 2004
@@ -344,8 +344,11 @@
        if (!ed)
                goto done;
 
-       if (!HCD_IS_RUNNING (ohci->hcd.state))
+       if (!HCD_IS_RUNNING (ohci->hcd.state)) {
                ed->state = ED_IDLE;
+               finish_unlinks (ohci, 0, 0);
+       }
+
        switch (ed->state) {
        case ED_UNLINK:         /* wait for hw to finish? */
                /* major IRQ delivery trouble loses INTR_SF too... */
diff -Nru a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c
--- a/drivers/usb/host/ohci-q.c Wed Apr 14 14:36:41 2004
+++ b/drivers/usb/host/ohci-q.c Wed Apr 14 14:36:41 2004
@@ -156,6 +156,7 @@
                        wmb ();
                        *prev = ed;
                        *prev_p = cpu_to_le32p (&ed->dma);
+                       wmb();
                }
                ohci->load [i] += ed->load;
        }
@@ -195,6 +196,7 @@
                }
                ed->ed_prev = ohci->ed_controltail;
                if (!ohci->ed_controltail && !ohci->ed_rm_list) {
+                       wmb();
                        ohci->hc_control |= OHCI_CTRL_CLE;
                        writel (0, &ohci->regs->ed_controlcurrent);
                        writel (ohci->hc_control, &ohci->regs->control);
@@ -212,6 +214,7 @@
                }
                ed->ed_prev = ohci->ed_bulktail;
                if (!ohci->ed_bulktail && !ohci->ed_rm_list) {
+                       wmb();
                        ohci->hc_control |= OHCI_CTRL_BLE;
                        writel (0, &ohci->regs->ed_bulkcurrent);
                        writel (ohci->hc_control, &ohci->regs->control);
@@ -868,6 +871,7 @@
 
        td_dma = le32_to_cpup (&ohci->hcca->done_head);
        ohci->hcca->done_head = 0;
+       wmb();
 
        /* get TD from hc's singly linked list, and
         * prepend to ours.  ed->td_list changes later.



-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id70&alloc_id638&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to