diff -u linux/drivers/usb/input.orig/hid-core.c linux/drivers/usb/input/hid-core.c --- linux/drivers/usb/input.orig/hid-core.c 2006-11-29 22:57:37.000000000 +0100 +++ linux/drivers/usb/input/hid-core.c 2007-01-08 15:36:51.000000000 +0100 @@ -1089,6 +1089,9 @@ unsigned size = field->report_size; unsigned n; + /* make sure the unused bits in the last byte are zeros */ + data[(count*size-1)/8] = 0; + for (n = 0; n < count; n++) { if (field->logical_minimum < 0) /* signed values */ implement(data, offset + n * size, size, s32ton(field->value[n], size)); diff -u linux/drivers/usb/input.orig/hid-debug.h linux/drivers/usb/input/hid-debug.h --- linux/drivers/usb/input.orig/hid-debug.h 2006-11-29 22:57:37.000000000 +0100 +++ linux/drivers/usb/input/hid-debug.h 2007-01-08 15:36:51.000000000 +0100 @@ -700,9 +700,10 @@ static char *relatives[REL_MAX + 1] = { [REL_X] = "X", [REL_Y] = "Y", - [REL_Z] = "Z", [REL_HWHEEL] = "HWheel", - [REL_DIAL] = "Dial", [REL_WHEEL] = "Wheel", - [REL_MISC] = "Misc", + [REL_Z] = "Z", [REL_RX] = "Rx", + [REL_RY] = "Ry", [REL_RZ] = "Rz", + [REL_HWHEEL] = "HWheel", [REL_DIAL] = "Dial", + [REL_WHEEL] = "Wheel", [REL_MISC] = "Misc", }; static char *absolutes[ABS_MAX + 1] = { diff -u linux/drivers/usb/input.orig/hid-input.c linux/drivers/usb/input/hid-input.c --- linux/drivers/usb/input.orig/hid-input.c 2006-11-29 22:57:37.000000000 +0100 +++ linux/drivers/usb/input/hid-input.c 2007-01-08 17:20:16.000000000 +0100 @@ -366,9 +366,22 @@ break; case HID_UP_LED: - if (((usage->hid - 1) & 0xffff) >= LED_MAX) - goto ignore; - map_led((usage->hid - 1) & 0xffff); + + switch (usage->hid & 0xffff) { /* HID-Value: */ + case 0x01: map_led (LED_NUML); break; /* Num Lock */ + case 0x02: map_led (LED_CAPSL); break; /* Caps Lock */ + case 0x03: map_led (LED_SCROLLL); break; /* Scroll Lock */ + case 0x04: map_led (LED_COMPOSE); break; /* Compose */ + case 0x05: map_led (LED_KANA); break; /* Kana */ + case 0x27: map_led (LED_SLEEP); break; /* Stand-By */ + case 0x4c: map_led (LED_SUSPEND); break; /* System Suspend */ + case 0x09: map_led (LED_MUTE); break; /* Mute */ + case 0x4b: map_led (LED_MISC); break; /* Generic Indicator */ + case 0x19: map_led (LED_MAIL); break; /* Message Waiting */ + case 0x4d: map_led (LED_CHARGING); break; /* External Power Connected */ + + default: goto ignore; + } break; case HID_UP_DIGITIZER: