Commit 978c8394 authored by Ben Collins's avatar Ben Collins

[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.
parent 8a36b98f
...@@ -70,8 +70,11 @@ static struct input_dev *find_input(struct hid_device *hid, struct hid_field *fi ...@@ -70,8 +70,11 @@ static struct input_dev *find_input(struct hid_device *hid, struct hid_field *fi
hidinput = list_entry(lh, struct hid_input, list); hidinput = list_entry(lh, struct hid_input, list);
for (i = 0; i < hidinput->maxfield; i++) if (! hidinput->report)
if (hidinput->fields[i] == field) continue;
for (i = 0; i < hidinput->report->maxfield; i++)
if (hidinput->report->field[i] == field)
return &hidinput->input; return &hidinput->input;
} }
...@@ -527,7 +530,7 @@ int hidinput_connect(struct hid_device *hid) ...@@ -527,7 +530,7 @@ int hidinput_connect(struct hid_device *hid)
struct hid_report *report; struct hid_report *report;
struct list_head *list; struct list_head *list;
struct hid_input *hidinput = NULL; struct hid_input *hidinput = NULL;
int i, j; int i, j, k;
INIT_LIST_HEAD(&hid->inputs); INIT_LIST_HEAD(&hid->inputs);
...@@ -539,57 +542,57 @@ int hidinput_connect(struct hid_device *hid) ...@@ -539,57 +542,57 @@ int hidinput_connect(struct hid_device *hid)
if (i == hid->maxcollection) if (i == hid->maxcollection)
return -1; return -1;
report_enum = hid->report_enum + HID_INPUT_REPORT; for (k = HID_INPUT_REPORT; k <= HID_OUTPUT_REPORT; k++) {
list = report_enum->report_list.next; report_enum = hid->report_enum + k;
while (list != &report_enum->report_list) { list = report_enum->report_list.next;
report = (struct hid_report *) list; while (list != &report_enum->report_list) {
report = (struct hid_report *) list;
if (!report->maxfield) if (!report->maxfield)
continue; continue;
if (!hidinput) {
hidinput = kmalloc(sizeof(*hidinput), GFP_KERNEL);
if (!hidinput) { if (!hidinput) {
err("Out of memory during hid input probe"); hidinput = kmalloc(sizeof(*hidinput), GFP_KERNEL);
return -1; 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.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;
} }
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.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 (i = 0; i < report->maxfield; i++)
for (j = 0; j < report->field[i]->maxusage; j++) for (j = 0; j < report->field[i]->maxusage; j++)
hidinput_configure_usage(hidinput, report->field[i], hidinput_configure_usage(hidinput, report->field[i],
report->field[i]->usage + j); report->field[i]->usage + j);
if (hid->quirks & HID_QUIRK_MULTI_INPUT) { if (hid->quirks & HID_QUIRK_MULTI_INPUT) {
/* This will leave hidinput NULL, so that it /* This will leave hidinput NULL, so that it
* allocates another one if we have more inputs on * allocates another one if we have more inputs on
* the same interface. Some devices (e.g. Happ's * the same interface. Some devices (e.g. Happ's
* UGCI) cram a lot of unrelated inputs into the * UGCI) cram a lot of unrelated inputs into the
* same interface. */ * same interface. */
hidinput->fields = report->field; hidinput->report = report;
hidinput->maxfield = report->maxfield; 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 /* This only gets called when we are a single-input (most of the
......
...@@ -324,8 +324,7 @@ struct hid_control_fifo { ...@@ -324,8 +324,7 @@ struct hid_control_fifo {
struct hid_input { struct hid_input {
struct list_head list; struct list_head list;
struct hid_field **fields; struct hid_report *report;
int maxfield;
struct input_dev input; struct input_dev input;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment