From: Nico Huber 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 with these changes Signed-off-by: Andrew Morton --- 25-akpm/drivers/usb/input/hid-core.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff -puN drivers/usb/input/hid-core.c~logitech-cordeless-desktop-keyboard-fails-to-report-class-descriptor drivers/usb/input/hid-core.c --- 25/drivers/usb/input/hid-core.c~logitech-cordeless-desktop-keyboard-fails-to-report-class-descriptor Thu Jan 27 17:06:21 2005 +++ 25-akpm/drivers/usb/input/hid-core.c Thu Jan 27 17:06:21 2005 @@ -1282,12 +1282,15 @@ static int hid_get_class_descriptor(stru 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 @@ static struct hid_device *usb_hid_config 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; _