
From: Nico Huber <nico.h@gmx.de>

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 <akpm@osdl.org>
---

 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;
_
