--- drivers/usb/hid-core.c.ORIG 2007-07-11 10:00:16.000000000 -0400 +++ drivers/usb/hid-core.c 2007-07-11 09:55:58.000000000 -0400 @@ -1118,7 +1118,7 @@ */ void hid_init_reports(struct hid_device *hid) { - int i; + int i, err; struct hid_report *report; struct hid_report_enum *report_enum; struct list_head *list; @@ -1128,9 +1128,27 @@ report_enum = hid->report_enum + i; list = report_enum->report_list.next; while (list != &report_enum->report_list) { + err = 0; report = (struct hid_report *) list; - hid_read_report(hid, report); - usb_set_idle(hid->dev, hid->ifnum, 0, report->id); + // XXX TP: special case *our* CH PRODUCTS joystick + // vendor and product id can be gleaned from: + // cat /proc/bus/usb/devices + if ((hid->dev->descriptor.idVendor == 0x068e) && + (hid->dev->descriptor.idProduct == 0x00a6)) { + err = -911; + } + else { + err = usb_set_idle(hid->dev, + hid->ifnum, 0, report->id); + } + + if (err) { + printk(KERN_INFO "hid_init_reports: usb_set_idle()=%d\n", err); + } + else { + hid_read_report(hid, report); + } + list = list->next; } }