On Sun, 25 Feb 2007, Guilherme Salgado wrote:

> On 2/25/07, Alan Stern <[EMAIL PROTECTED]> wrote:
> > On Sun, 25 Feb 2007, Guilherme Salgado wrote:
> >
> > > I had some problems with the 2.6.20 kernel on my distribution and so I
> > > wasn't able to test the patch for some time. Fortunately, everything
> > > is working now and I'm running 2.6.20 with the patch you provided, and
> > > the "can't resume" problem is gone. I can easily reproduce it with the
> > > unpatched module loaded, but it never occurred when I had the patched
> > > module loaded.
> >
> > Great!  Can you post the dmesg output with the new patch applied, so I can
> > see exactly what it does?
> >
> 
> Sure thing; here it is.

That looks fine.  Below is that actual patch I propose for 2.6.20.  Can 
you please try it out and make sure that it really does fix the problem?  
Be sure to remove the test patch first, since this wants to go on top of 
plain old 2.6.20.

Thanks,

Alan Stern


Index: usb-2.6/drivers/usb/host/uhci-hub.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/uhci-hub.c
+++ usb-2.6/drivers/usb/host/uhci-hub.c
@@ -33,6 +33,9 @@ static __u8 root_hub_hub_des[] =
 /* status change bits:  nonzero writes will clear */
 #define RWC_BITS       (USBPORTSC_OCC | USBPORTSC_PEC | USBPORTSC_CSC)
 
+/* suspend/resume bits: port suspended or port resuming */
+#define SUSPEND_BITS   (USBPORTSC_SUSP | USBPORTSC_RD)
+
 /* A port that either is connected or has a changed-bit set will prevent
  * us from AUTO_STOPPING.
  */
@@ -96,8 +99,8 @@ static void uhci_finish_suspend(struct u
        int status;
        int i;
 
-       if (inw(port_addr) & (USBPORTSC_SUSP | USBPORTSC_RD)) {
-               CLR_RH_PORTSTAT(USBPORTSC_SUSP | USBPORTSC_RD);
+       if (inw(port_addr) & SUSPEND_BITS) {
+               CLR_RH_PORTSTAT(SUSPEND_BITS);
                if (test_bit(port, &uhci->resuming_ports))
                        set_bit(port, &uhci->port_c_suspend);
 
@@ -107,7 +110,7 @@ static void uhci_finish_suspend(struct u
                 * Experiments show that some controllers take longer, so
                 * we'll poll for completion. */
                for (i = 0; i < 10; ++i) {
-                       if (!(inw(port_addr) & USBPORTSC_RD))
+                       if (!(inw(port_addr) & SUSPEND_BITS))
                                break;
                        udelay(1);
                }
@@ -289,7 +292,7 @@ static int uhci_hub_control(struct usb_h
                        wPortStatus |= USB_PORT_STAT_CONNECTION;
                if (status & USBPORTSC_PE) {
                        wPortStatus |= USB_PORT_STAT_ENABLE;
-                       if (status & (USBPORTSC_SUSP | USBPORTSC_RD))
+                       if (status & SUSPEND_BITS)
                                wPortStatus |= USB_PORT_STAT_SUSPEND;
                }
                if (status & USBPORTSC_OC)


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to