ChangeSet 1.1455.1.22, 2003/07/15 14:53:20-07:00, [EMAIL PROTECTED]

[PATCH] USB: ohci minor tweaks

Two small updates:

  - Report short control reads correctly in an exotic case
    that our regression tests cover.  (Haven't run them with
    ohci for a long time, it seems...)

  - IRQ non-delivery bugs (ACPI, APIC, etc) can prevent urbs
    from unlinking.  This prints a warning when that sort of
    non-USB bug is biting.


 drivers/usb/host/ohci-hcd.c |    3 +++
 drivers/usb/host/ohci-q.c   |   10 ++++++++++
 2 files changed, 13 insertions(+)


diff -Nru a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
--- a/drivers/usb/host/ohci-hcd.c       Thu Jul 17 17:05:01 2003
+++ b/drivers/usb/host/ohci-hcd.c       Thu Jul 17 17:05:01 2003
@@ -319,6 +319,7 @@
        int                     epnum = ep & USB_ENDPOINT_NUMBER_MASK;
        unsigned long           flags;
        struct ed               *ed;
+       unsigned                limit = 1000;
 
        /* ASSERT:  any requests/urbs are being unlinked */
        /* ASSERT:  nobody can be submitting urbs for this any more */
@@ -337,6 +338,8 @@
                ed->state = ED_IDLE;
        switch (ed->state) {
        case ED_UNLINK:         /* wait for hw to finish? */
+               /* major IRQ delivery trouble loses INTR_SF too... */
+               WARN_ON (limit-- == 0);
                spin_unlock_irqrestore (&ohci->lock, flags);
                set_current_state (TASK_UNINTERRUPTIBLE);
                schedule_timeout (1);
diff -Nru a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c
--- a/drivers/usb/host/ohci-q.c Thu Jul 17 17:05:01 2003
+++ b/drivers/usb/host/ohci-q.c Thu Jul 17 17:05:01 2003
@@ -43,6 +43,16 @@
        spin_lock (&urb->lock);
        if (likely (urb->status == -EINPROGRESS))
                urb->status = 0;
+       /* report short control reads right even though the data TD always
+        * has TD_R set.  (much simpler, but creates the 1-td limit.)
+        */
+       if (unlikely (urb->transfer_flags & URB_SHORT_NOT_OK)
+                       && unlikely (usb_pipecontrol (urb->pipe))
+                       && urb->actual_length < urb->transfer_buffer_length
+                       && usb_pipein (urb->pipe)
+                       && urb->status == 0) {
+               urb->status = -EREMOTEIO;
+       }
        spin_unlock (&urb->lock);
 
        // what lock protects these?



-------------------------------------------------------
This SF.net email is sponsored by: VM Ware
With VMware you can run multiple operating systems on a single machine.
WITHOUT REBOOTING! Mix Linux / Windows / Novell virtual machines at the
same time. Free trial click here: http://www.vmware.com/wl/offer/345/0
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to