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