# 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.564   -> 1.565  
#       drivers/usb/host/ohci-hub.c     1.6     -> 1.7    
#       drivers/usb/host/ohci-q.c       1.6     -> 1.7    
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/04/30      [EMAIL PROTECTED]     1.565
# [PATCH] Re: ohci-hcd and that NCR implementation ...
# 
# The attached patch makes the one SiS controller behave
# like the other... the key fix being wmb() to make sure that
# no writes are still in CPU caches before telling the HC it's
# OK to fetch the data.  (And a minor tweak to access PCI
# less often through the hub driver.)
# 
# But the OPTi problem seems to be different.  Could you
# try this patch to see if it affects the problem your seeing
# with that NCR implementation?  And in any case, please
# integrate it to Linus' latest.  (Against 2.5.10, might be
# some fuzz on the pci tweak due to that warning fix.)
# 
# Those missing wmb() statements have likely been the root
# cause of various usb-ohci flakes reported over time, too.
# The drivers are still almost identical in those areas.  (Though
# something made ohci-hcd consistently lose that cache flush
# race; maybe it's a bit faster.)
# --------------------------------------------
#
diff -Nru a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c
--- a/drivers/usb/host/ohci-hub.c       Thu May  2 16:48:29 2002
+++ b/drivers/usb/host/ohci-hub.c       Thu May  2 16:48:29 2002
@@ -154,12 +154,10 @@
        u16             wLength
 ) {
        struct ohci_hcd *ohci = hcd_to_ohci (hcd);
-       int             ports;
+       int             ports = hcd->self.root_hub->maxchild;
        u32             temp;
        int             retval = 0;
 
-       // if (port request)
-               ports = roothub_a (ohci) & RH_A_NDP; 
        switch (typeReq) {
        case ClearHubFeature:
                switch (wValue) {
diff -Nru a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c
--- a/drivers/usb/host/ohci-q.c Thu May  2 16:48:29 2002
+++ b/drivers/usb/host/ohci-q.c Thu May  2 16:48:29 2002
@@ -569,6 +569,9 @@
        td->hwNextTD = cpu_to_le32 (td_pt->td_dma);
        td->hwPSW [0] = cpu_to_le16 ((data & 0x0FFF) | 0xE000);
 
+       /* HC might read the TD right after we link it ... */
+       wmb ();
+
        /* append to queue */
        td->ed->hwTailP = td->hwNextTD;
 }
@@ -641,8 +644,10 @@
                                cnt++;
                        }
                        /* start bulk list */
-                       if (!ohci->sleeping)
+                       if (!ohci->sleeping) {
+                               wmb ();
                                writel (OHCI_BLF, &ohci->regs->cmdstatus);
+                       }
                        break;
 
                case PIPE_INTERRUPT:
@@ -654,6 +659,7 @@
                        break;
 
                case PIPE_CONTROL:
+                       /* control requests don't use toggle state  */
                        info = TD_CC | TD_DP_SETUP | TD_T_DATA0;
                        td_fill (ohci, info,
 #ifdef CONFIG_PCI
@@ -678,8 +684,10 @@
                                : TD_CC | TD_DP_OUT | TD_T_DATA1;
                        td_fill (ohci, info, data, 0, urb, cnt++);
                        /* start control list */
-                       if (!ohci->sleeping)
+                       if (!ohci->sleeping) {
+                               wmb ();
                                writel (OHCI_CLF, &ohci->regs->cmdstatus);
+                       }
                        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