The receiver of my Logitech Cordeless Desktop fails to report the keyboard's class descriptor most times I insert the usb-hid module since I changed to linux 2.6. The modell of the receiver is C-BD9-DUAL REV C.
The request seems not to fail but the count of received characters is zero.


As I said it only fails most times, I worked around making the following changes in drivers/usb/input/hid-core.c from linux-2.6.11-rc2:

Following the good example of drivers/usb/core/message.c line 575, I initialized the buffer in hid_get_class_descriptor() to zero.
In the loop of hid_get_class_descriptor() not waiting for any result but waiting for a result wich is lower the requested size of the class descriptor (line 1290).
usb_hid_configure() should not try to parse the expected length but the received (line 1653).


attached is a patch to linux-2.6.11-rc2 with these changes

Nico Huber
.
--- a/drivers/usb/input/hid-core.c      2005-01-27 23:59:52.000000000 +0100
+++ b/drivers/usb/input/hid-core.c      2005-01-28 00:06:31.000000000 +0100
@@ -1282,12 +1282,15 @@
                unsigned char type, void *buf, int size)
 {
        int result, retries = 4;
+
+       memset(buf,0,size);     // Make sure we parse really received data
+
        do {
                result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
                                USB_REQ_GET_DESCRIPTOR, USB_RECIP_INTERFACE | 
USB_DIR_IN,
                                (type << 8), ifnum, buf, size, HZ * 
USB_CTRL_GET_TIMEOUT);
                retries--;
-       } while (result < 0 && retries);
+       } while (result < size && retries);
        return result;
 }
 
@@ -1650,7 +1653,7 @@
        printk("\n");
 #endif
 
-       if (!(hid = hid_parse_report(rdesc, rsize))) {
+       if (!(hid = hid_parse_report(rdesc, n))) {
                dbg("parsing report descriptor failed");
                kfree(rdesc);
                return NULL;

Reply via email to