ChangeSet 1.1303.2.1, 2003/06/05 01:12:30-07:00, [EMAIL PROTECTED]

[PATCH] USB: fix keyboard leds

> Ben, it looks like your patch broke something for USB keyboards, any
> idea?

Yep, my patch killed hid-input from scanning HID_OUTPUT_REPORT's. Fixed
with this patch for 2.5.70+bk. I'll send one for 2.4.x in a few minutes.


 drivers/usb/input/hid-input.c |   97 +++++++++++++++++++++---------------------
 drivers/usb/input/hid.h       |    3 -
 2 files changed, 51 insertions(+), 49 deletions(-)


diff -Nru a/drivers/usb/input/hid-input.c b/drivers/usb/input/hid-input.c
--- a/drivers/usb/input/hid-input.c     Thu Jun  5 13:45:14 2003
+++ b/drivers/usb/input/hid-input.c     Thu Jun  5 13:45:14 2003
@@ -70,8 +70,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;
        }
 
@@ -527,7 +530,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);
 
@@ -539,57 +542,57 @@
        if (i == hid->maxcollection)
                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 + k;
+               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;
-                       }
-                       memset(hidinput, 0, sizeof(*hidinput));
-
-                       list_add_tail(&hidinput->list, &hid->inputs);
+                               hidinput = kmalloc(sizeof(*hidinput), GFP_KERNEL);
+                               if (!hidinput) {
+                                       err("Out of memory during hid input probe");
+                                       return -1;
+                               }
+                               memset(hidinput, 0, sizeof(*hidinput));
 
-                       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.phys = hid->phys;
-                       hidinput->input.uniq = hid->uniq;
-                       hidinput->input.id.bustype = BUS_USB;
-                       hidinput->input.id.vendor = dev->descriptor.idVendor;
-                       hidinput->input.id.product = dev->descriptor.idProduct;
-                       hidinput->input.id.version = dev->descriptor.bcdDevice;
-               }
+                               list_add_tail(&hidinput->list, &hid->inputs);
 
-               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;
+                               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.phys = hid->phys;
+                               hidinput->input.uniq = hid->uniq;
+                               hidinput->input.id.bustype = BUS_USB;
+                               hidinput->input.id.vendor = dev->descriptor.idVendor;
+                               hidinput->input.id.product = dev->descriptor.idProduct;
+                               hidinput->input.id.version = 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;
+                       }
 
-                       input_register_device(&hidinput->input);
-                       hidinput = NULL;
+                       list = list->next;
                }
-
-               list = list->next;
        }
 
        /* This only gets called when we are a single-input (most of the
diff -Nru a/drivers/usb/input/hid.h b/drivers/usb/input/hid.h
--- a/drivers/usb/input/hid.h   Thu Jun  5 13:45:14 2003
+++ b/drivers/usb/input/hid.h   Thu Jun  5 13:45:14 2003
@@ -324,8 +324,7 @@
 
 struct hid_input {
        struct list_head list;
-       struct hid_field **fields;
-       int maxfield;
+       struct hid_report *report;
        struct input_dev input;
 };
 



-------------------------------------------------------
This SF.net email is sponsored by:  Etnus, makers of TotalView, The best
thread debugger on the planet. Designed with thread debugging features
you've never dreamed of, try TotalView 6 free at www.etnus.com.
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to