ChangeSet 1.1251, 2003/06/18 16:55:08-07:00, bcollins@debian.org [PATCH] USB: fix keyboard leds drivers/usb/hid-input.c | 90 +++++++++++++++++++++++++----------------------- drivers/usb/hid.h | 3 - 2 files changed, 48 insertions(+), 45 deletions(-) diff -Nru a/drivers/usb/hid-input.c b/drivers/usb/hid-input.c --- a/drivers/usb/hid-input.c Wed Jun 18 17:35:04 2003 +++ b/drivers/usb/hid-input.c Wed Jun 18 17:35:04 2003 @@ -73,8 +73,11 @@ hidinput = list_entry(lh, struct hid_input, list); - for (i = 0; i < hidinput->maxfield; i++) - if (hidinput->fields[i] == field) + if (! hidinput->report) + continue; + + for (i = 0; i < hidinput->report->maxfield; i++) + if (hidinput->report->field[i] == field) return &hidinput->input; } @@ -423,7 +426,7 @@ struct hid_report *report; struct list_head *list; struct hid_input *hidinput = NULL; - int i, j; + int i, j, k; INIT_LIST_HEAD(&hid->inputs); @@ -434,53 +437,54 @@ if (i == hid->maxapplication) return -1; - report_enum = hid->report_enum + HID_INPUT_REPORT; - list = report_enum->report_list.next; - while (list != &report_enum->report_list) { - report = (struct hid_report *) list; + for (k = HID_INPUT_REPORT; k <= HID_OUTPUT_REPORT; k++) { + report_enum = hid->report_enum + HID_INPUT_REPORT; + list = report_enum->report_list.next; + while (list != &report_enum->report_list) { + report = (struct hid_report *) list; - if (!report->maxfield) - continue; + if (!report->maxfield) + continue; - if (!hidinput) { - hidinput = kmalloc(sizeof(*hidinput), GFP_KERNEL); if (!hidinput) { - err("Out of memory during hid input probe"); - return -1; + hidinput = kmalloc(sizeof(*hidinput), GFP_KERNEL); + if (!hidinput) { + err("Out of memory during hid input probe"); + return -1; + } + memset(hidinput, 0, sizeof(*hidinput)); + list_add_tail(&hidinput->list, &hid->inputs); + + hidinput->input.private = hid; + hidinput->input.event = hidinput_input_event; + hidinput->input.open = hidinput_open; + hidinput->input.close = hidinput_close; + + hidinput->input.name = hid->name; + hidinput->input.idbus = BUS_USB; + hidinput->input.idvendor = dev->descriptor.idVendor; + hidinput->input.idproduct = dev->descriptor.idProduct; + hidinput->input.idversion = dev->descriptor.bcdDevice; } - memset(hidinput, 0, sizeof(*hidinput)); - list_add_tail(&hidinput->list, &hid->inputs); - hidinput->input.private = hid; - hidinput->input.event = hidinput_input_event; - hidinput->input.open = hidinput_open; - hidinput->input.close = hidinput_close; - - hidinput->input.name = hid->name; - hidinput->input.idbus = BUS_USB; - hidinput->input.idvendor = dev->descriptor.idVendor; - hidinput->input.idproduct = dev->descriptor.idProduct; - hidinput->input.idversion = dev->descriptor.bcdDevice; - } + for (i = 0; i < report->maxfield; i++) + for (j = 0; j < report->field[i]->maxusage; j++) + hidinput_configure_usage(hidinput, report->field[i], + report->field[i]->usage + j); + + if (hid->quirks & HID_QUIRK_MULTI_INPUT) { + /* This will leave hidinput NULL, so that it + * allocates another one if we have more inputs on + * the same interface. Some devices (e.g. Happ's + * UGCI) cram a lot of unrelated inputs into the + * same interface. */ + hidinput->report = report; + input_register_device(&hidinput->input); + hidinput = NULL; + } - for (i = 0; i < report->maxfield; i++) - for (j = 0; j < report->field[i]->maxusage; j++) - hidinput_configure_usage(hidinput, report->field[i], - report->field[i]->usage + j); - - if (hid->quirks & HID_QUIRK_MULTI_INPUT) { - /* This will leave hidinput NULL, so that it - * allocates another one if we have more inputs on - * the same interface. Some devices (e.g. Happ's - * UGCI) cram a lot of unrelated inputs into the - * same interface. */ - hidinput->fields = report->field; - hidinput->maxfield = report->maxfield; - input_register_device(&hidinput->input); - hidinput = NULL; + list = list->next; } - - list = list->next; } if (hidinput) diff -Nru a/drivers/usb/hid.h b/drivers/usb/hid.h --- a/drivers/usb/hid.h Wed Jun 18 17:35:04 2003 +++ b/drivers/usb/hid.h Wed Jun 18 17:35:04 2003 @@ -299,8 +299,7 @@ struct hid_input { struct list_head list; - struct hid_field **fields; - int maxfield; + struct hid_report *report; struct input_dev input; };