On Mon, 13 Aug 2007, Steffen Koepf wrote:

> From: Steffen Koepf <[EMAIL PROTECTED]>
> 
> There is a USB-Device Init-Problem with the Apacer AE161 USB-Cardreader,
> which contains the Chip AU6375. The Cardreader init fails in about 50%
> of system boots, with the following lines:
> 
> usb 1-6: unable to read config index 0 descriptor/all
> usb 1-6: can't read configurations, error -71
> hub 1-0:1.0: Cannot enable port 6.  Maybe the USB cable is bad?
> 
> The patch let's the kernel stay in the loop if a usb_control_msg() fails, 
> the cardreader is detected properly and the loop is never executed more
> than two times. The second call of usb_control_msg succeeds always. Maybe 
> it was the developer's goal of the loop to fix such things?
> Kernel: 2.6.22.2
> 
> Signed-off-by: Steffen Koepf <[EMAIL PROTECTED]>
> 
> ---
> --- linux-2.6.22.2/drivers/usb/core/message.c.orig    Mon Aug 13 22:12:34 2007
> +++ linux-2.6.22.2/drivers/usb/core/message.c Mon Aug 13 22:12:52 2007
> @@ -634,6 +634,8 @@ int usb_get_descriptor(struct usb_device
>                       result = -EPROTO;
>                       continue;
>               }
> +             if (result < 0)
> +                     continue;
>               break;
>       }
>       return result;

This patch is the wrong way to do it.  You should try this patch 
instead.

Alan Stern


Index: 2.6.22/drivers/usb/core/message.c
===================================================================
--- 2.6.22.orig/drivers/usb/core/message.c
+++ 2.6.22/drivers/usb/core/message.c
@@ -623,12 +623,12 @@ int usb_get_descriptor(struct usb_device
        memset(buf,0,size);     // Make sure we parse really received data
 
        for (i = 0; i < 3; ++i) {
-               /* retry on length 0 or stall; some devices are flakey */
+               /* retry on length 0 or error; some devices are flakey */
                result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
                                USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
                                (type << 8) + index, 0, buf, size,
                                USB_CTRL_GET_TIMEOUT);
-               if (result == 0 || result == -EPIPE)
+               if (result <= 0)
                        continue;
                if (result > 1 && ((u8 *)buf)[1] != type) {
                        result = -EPROTO;


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
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