# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#                  ChangeSet    1.383.2.94 -> 1.383.20.1
#       drivers/usb/usb-ohci.c  1.22    -> 1.23   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/05/02      [EMAIL PROTECTED]     1.383.20.1
# [PATCH] PATCH 2.4.19-pre7 usb-ohci and wmb()
# 
# USB usb-ohci fix
# 
# This patch just adds a few strategic wmb() calls, to ensure
# that the HC and HCD agree on just what control and bulk
# requests are being made.
# 
# Seems restructuring "usb-ohci" into "ohci-hcd" made that
# failure become more common/visible. (Faster code?)  So
# this backports a 2.5 "ohci-hcd" fix into 2.4's "usb-ohci".
# 
# The effect of not having these calls was that some hardware
# could fail to enumerate devices ... kernel messages would
# report a "usb_control/bulk_msg: timeout" happened.  We've
# had such (infrequent) problem reports before, but until now
# nobody was able to confirm the wmb() calls mattered.
# --------------------------------------------
#
diff -Nru a/drivers/usb/usb-ohci.c b/drivers/usb/usb-ohci.c
--- a/drivers/usb/usb-ohci.c    Fri May  3 14:51:45 2002
+++ b/drivers/usb/usb-ohci.c    Fri May  3 14:51:45 2002
@@ -1336,6 +1336,7 @@
        td->hwPSW [0] = cpu_to_le16 ((data & 0x0FFF) | 0xE000);
 
        /* append to queue */
+       wmb();
        td->ed->hwTailP = td->hwNextTD;
 }
 
@@ -1399,8 +1400,10 @@
                                cnt++;
                        }
 
-                       if (!ohci->sleeping)
+                       if (!ohci->sleeping) {
+                               wmb();
                                writel (OHCI_BLF, &ohci->regs->cmdstatus); /* start 
bulk list */
+                       }
                        break;
 
                case PIPE_INTERRUPT:
@@ -1425,8 +1428,10 @@
                        info = usb_pipeout (urb->pipe)? 
                                TD_CC | TD_DP_IN | TD_T_DATA1: TD_CC | TD_DP_OUT | 
TD_T_DATA1;
                        td_fill (ohci, info, data, 0, urb, cnt++);
-                       if (!ohci->sleeping)
+                       if (!ohci->sleeping) {
+                               wmb();
                                writel (OHCI_CLF, &ohci->regs->cmdstatus); /* start 
Control list */
+                       }
                        break;
 
                case PIPE_ISOCHRONOUS:

_______________________________________________________________

Have big pipes? SourceForge.net is looking for download mirrors. We supply
the hardware. You get the recognition. Email Us: [EMAIL PROTECTED]
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to