Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid:
HID: handle cases of volume knobs generating relative values
HID: Logitech keyboard 0xc311 needs reset leds quirk
HID: support for logitech cordless desktop LX500 special mapping
HID: fix autocentering of PID devices
HID: separate quirks for report descriptor fixup
HID: Add NOGET quirk for all NCR devices
HID: support for Petalynx Maxter remote control
HID: fix mismatch between hid-input HUT find/search mapping and the HUT
HID: support for Gameron dual psx adaptor
USB HID: avoid flush_scheduled_work()
HID: Use menuconfig objects
HID: force hid-input for Microsoft SideWinder GameVoice device
HID: input mapping for Chicony KU-0418 tactical pad
HID: make debugging output runtime-configurable

+425 -199
+7 -3
drivers/hid/Kconfig
··· 1 1 # 2 2 # HID driver configuration 3 3 # 4 - menu "HID Devices" 4 + menuconfig HID_SUPPORT 5 + bool "HID Devices" 5 6 depends on INPUT 7 + default y 8 + 9 + if HID_SUPPORT 6 10 7 11 config HID 8 12 tristate "Generic HID support" ··· 28 24 29 25 config HID_DEBUG 30 26 bool "HID debugging support" 27 + default y if !EMBEDDED 31 28 depends on HID 32 29 ---help--- 33 30 This option lets the HID layer output diagnostics about its internal ··· 43 38 44 39 source "drivers/hid/usbhid/Kconfig" 45 40 46 - endmenu 47 - 41 + endif # HID_SUPPORT
+47 -46
drivers/hid/hid-core.c
··· 40 40 #define DRIVER_DESC "HID core driver" 41 41 #define DRIVER_LICENSE "GPL" 42 42 43 + #ifdef CONFIG_HID_DEBUG 44 + int hid_debug = 0; 45 + module_param_named(debug, hid_debug, bool, 0600); 46 + MODULE_PARM_DESC(debug, "Turn HID debugging mode on and off"); 47 + EXPORT_SYMBOL_GPL(hid_debug); 48 + #endif 49 + 43 50 /* 44 51 * Register a new report for a device. 45 52 */ ··· 85 78 struct hid_field *field; 86 79 87 80 if (report->maxfield == HID_MAX_FIELDS) { 88 - dbg("too many fields in report"); 81 + dbg_hid("too many fields in report\n"); 89 82 return NULL; 90 83 } 91 84 ··· 113 106 usage = parser->local.usage[0]; 114 107 115 108 if (parser->collection_stack_ptr == HID_COLLECTION_STACK_SIZE) { 116 - dbg("collection stack overflow"); 109 + dbg_hid("collection stack overflow\n"); 117 110 return -1; 118 111 } 119 112 ··· 121 114 collection = kmalloc(sizeof(struct hid_collection) * 122 115 parser->device->collection_size * 2, GFP_KERNEL); 123 116 if (collection == NULL) { 124 - dbg("failed to reallocate collection array"); 117 + dbg_hid("failed to reallocate collection array\n"); 125 118 return -1; 126 119 } 127 120 memcpy(collection, parser->device->collection, ··· 157 150 static int close_collection(struct hid_parser *parser) 158 151 { 159 152 if (!parser->collection_stack_ptr) { 160 - dbg("collection stack underflow"); 153 + dbg_hid("collection stack underflow\n"); 161 154 return -1; 162 155 } 163 156 parser->collection_stack_ptr--; ··· 185 178 static int hid_add_usage(struct hid_parser *parser, unsigned usage) 186 179 { 187 180 if (parser->local.usage_index >= HID_MAX_USAGES) { 188 - dbg("usage index exceeded"); 181 + dbg_hid("usage index exceeded\n"); 189 182 return -1; 190 183 } 191 184 parser->local.usage[parser->local.usage_index] = usage; ··· 209 202 int i; 210 203 211 204 if (!(report = hid_register_report(parser->device, report_type, parser->global.report_id))) { 212 - dbg("hid_register_report failed"); 205 + dbg_hid("hid_register_report failed\n"); 213 206 return -1; 214 207 } 215 208 216 209 if (parser->global.logical_maximum < parser->global.logical_minimum) { 217 - dbg("logical range invalid %d %d", parser->global.logical_minimum, parser->global.logical_maximum); 210 + dbg_hid("logical range invalid %d %d\n", parser->global.logical_minimum, parser->global.logical_maximum); 218 211 return -1; 219 212 } 220 213 ··· 294 287 case HID_GLOBAL_ITEM_TAG_PUSH: 295 288 296 289 if (parser->global_stack_ptr == HID_GLOBAL_STACK_SIZE) { 297 - dbg("global enviroment stack overflow"); 290 + dbg_hid("global enviroment stack overflow\n"); 298 291 return -1; 299 292 } 300 293 ··· 305 298 case HID_GLOBAL_ITEM_TAG_POP: 306 299 307 300 if (!parser->global_stack_ptr) { 308 - dbg("global enviroment stack underflow"); 301 + dbg_hid("global enviroment stack underflow\n"); 309 302 return -1; 310 303 } 311 304 ··· 349 342 350 343 case HID_GLOBAL_ITEM_TAG_REPORT_SIZE: 351 344 if ((parser->global.report_size = item_udata(item)) > 32) { 352 - dbg("invalid report_size %d", parser->global.report_size); 345 + dbg_hid("invalid report_size %d\n", parser->global.report_size); 353 346 return -1; 354 347 } 355 348 return 0; 356 349 357 350 case HID_GLOBAL_ITEM_TAG_REPORT_COUNT: 358 351 if ((parser->global.report_count = item_udata(item)) > HID_MAX_USAGES) { 359 - dbg("invalid report_count %d", parser->global.report_count); 352 + dbg_hid("invalid report_count %d\n", parser->global.report_count); 360 353 return -1; 361 354 } 362 355 return 0; 363 356 364 357 case HID_GLOBAL_ITEM_TAG_REPORT_ID: 365 358 if ((parser->global.report_id = item_udata(item)) == 0) { 366 - dbg("report_id 0 is invalid"); 359 + dbg_hid("report_id 0 is invalid\n"); 367 360 return -1; 368 361 } 369 362 return 0; 370 363 371 364 default: 372 - dbg("unknown global tag 0x%x", item->tag); 365 + dbg_hid("unknown global tag 0x%x\n", item->tag); 373 366 return -1; 374 367 } 375 368 } ··· 384 377 unsigned n; 385 378 386 379 if (item->size == 0) { 387 - dbg("item data expected for local item"); 380 + dbg_hid("item data expected for local item\n"); 388 381 return -1; 389 382 } 390 383 ··· 402 395 * items and the first delimiter set. 403 396 */ 404 397 if (parser->local.delimiter_depth != 0) { 405 - dbg("nested delimiters"); 398 + dbg_hid("nested delimiters\n"); 406 399 return -1; 407 400 } 408 401 parser->local.delimiter_depth++; 409 402 parser->local.delimiter_branch++; 410 403 } else { 411 404 if (parser->local.delimiter_depth < 1) { 412 - dbg("bogus close delimiter"); 405 + dbg_hid("bogus close delimiter\n"); 413 406 return -1; 414 407 } 415 408 parser->local.delimiter_depth--; ··· 419 412 case HID_LOCAL_ITEM_TAG_USAGE: 420 413 421 414 if (parser->local.delimiter_branch > 1) { 422 - dbg("alternative usage ignored"); 415 + dbg_hid("alternative usage ignored\n"); 423 416 return 0; 424 417 } 425 418 ··· 431 424 case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM: 432 425 433 426 if (parser->local.delimiter_branch > 1) { 434 - dbg("alternative usage ignored"); 427 + dbg_hid("alternative usage ignored\n"); 435 428 return 0; 436 429 } 437 430 ··· 444 437 case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM: 445 438 446 439 if (parser->local.delimiter_branch > 1) { 447 - dbg("alternative usage ignored"); 440 + dbg_hid("alternative usage ignored\n"); 448 441 return 0; 449 442 } 450 443 ··· 453 446 454 447 for (n = parser->local.usage_minimum; n <= data; n++) 455 448 if (hid_add_usage(parser, n)) { 456 - dbg("hid_add_usage failed\n"); 449 + dbg_hid("hid_add_usage failed\n"); 457 450 return -1; 458 451 } 459 452 return 0; 460 453 461 454 default: 462 455 463 - dbg("unknown local item tag 0x%x", item->tag); 456 + dbg_hid("unknown local item tag 0x%x\n", item->tag); 464 457 return 0; 465 458 } 466 459 return 0; ··· 494 487 ret = hid_add_field(parser, HID_FEATURE_REPORT, data); 495 488 break; 496 489 default: 497 - dbg("unknown main item tag 0x%x", item->tag); 490 + dbg_hid("unknown main item tag 0x%x\n", item->tag); 498 491 ret = 0; 499 492 } 500 493 ··· 509 502 510 503 static int hid_parser_reserved(struct hid_parser *parser, struct hid_item *item) 511 504 { 512 - dbg("reserved item type, tag 0x%x", item->tag); 505 + dbg_hid("reserved item type, tag 0x%x\n", item->tag); 513 506 return 0; 514 507 } 515 508 ··· 674 667 while ((start = fetch_item(start, end, &item)) != NULL) { 675 668 676 669 if (item.format != HID_ITEM_FORMAT_SHORT) { 677 - dbg("unexpected long global item"); 670 + dbg_hid("unexpected long global item\n"); 678 671 hid_free_device(device); 679 672 vfree(parser); 680 673 return NULL; 681 674 } 682 675 683 676 if (dispatch_type[item.type](parser, &item)) { 684 - dbg("item %u %u %u %u parsing failed\n", 677 + dbg_hid("item %u %u %u %u parsing failed\n", 685 678 item.format, (unsigned)item.size, (unsigned)item.type, (unsigned)item.tag); 686 679 hid_free_device(device); 687 680 vfree(parser); ··· 690 683 691 684 if (start == end) { 692 685 if (parser->collection_stack_ptr) { 693 - dbg("unbalanced collection at end of report description"); 686 + dbg_hid("unbalanced collection at end of report description\n"); 694 687 hid_free_device(device); 695 688 vfree(parser); 696 689 return NULL; 697 690 } 698 691 if (parser->local.delimiter_depth) { 699 - dbg("unbalanced delimiter at end of report description"); 692 + dbg_hid("unbalanced delimiter at end of report description\n"); 700 693 hid_free_device(device); 701 694 vfree(parser); 702 695 return NULL; ··· 706 699 } 707 700 } 708 701 709 - dbg("item fetching failed at offset %d\n", (int)(end - start)); 702 + dbg_hid("item fetching failed at offset %d\n", (int)(end - start)); 710 703 hid_free_device(device); 711 704 vfree(parser); 712 705 return NULL; ··· 922 915 hid_dump_input(field->usage + offset, value); 923 916 924 917 if (offset >= field->report_count) { 925 - dbg("offset (%d) exceeds report_count (%d)", offset, field->report_count); 918 + dbg_hid("offset (%d) exceeds report_count (%d)\n", offset, field->report_count); 926 919 hid_dump_field(field, 8); 927 920 return -1; 928 921 } 929 922 if (field->logical_minimum < 0) { 930 923 if (value != snto32(s32ton(value, size), size)) { 931 - dbg("value %d is out of range", value); 924 + dbg_hid("value %d is out of range\n", value); 932 925 return -1; 933 926 } 934 927 } ··· 941 934 { 942 935 struct hid_report_enum *report_enum = hid->report_enum + type; 943 936 struct hid_report *report; 944 - int n, rsize; 937 + int n, rsize, i; 945 938 946 939 if (!hid) 947 940 return -ENODEV; 948 941 949 942 if (!size) { 950 - dbg("empty report"); 943 + dbg_hid("empty report\n"); 951 944 return -1; 952 945 } 953 946 954 - #ifdef CONFIG_HID_DEBUG 955 - printk(KERN_DEBUG __FILE__ ": report (size %u) (%snumbered)\n", size, report_enum->numbered ? "" : "un"); 956 - #endif 947 + dbg_hid("report (size %u) (%snumbered)\n", size, report_enum->numbered ? "" : "un"); 957 948 958 949 n = 0; /* Normally report number is 0 */ 959 950 if (report_enum->numbered) { /* Device uses numbered reports, data[0] is report number */ ··· 959 954 size--; 960 955 } 961 956 962 - #ifdef CONFIG_HID_DEBUG 963 - { 964 - int i; 965 - printk(KERN_DEBUG __FILE__ ": report %d (size %u) = ", n, size); 966 - for (i = 0; i < size; i++) 967 - printk(" %02x", data[i]); 968 - printk("\n"); 969 - } 970 - #endif 957 + /* dump the report descriptor */ 958 + dbg_hid("report %d (size %u) = ", n, size); 959 + for (i = 0; i < size; i++) 960 + dbg_hid_line(" %02x", data[i]); 961 + dbg_hid_line("\n"); 971 962 972 963 if (!(report = report_enum->report_id_hash[n])) { 973 - dbg("undefined report_id %d received", n); 964 + dbg_hid("undefined report_id %d received\n", n); 974 965 return -1; 975 966 } 976 967 977 968 rsize = ((report->size - 1) >> 3) + 1; 978 969 979 970 if (size < rsize) { 980 - dbg("report %d is too short, (%d < %d)", report->id, size, rsize); 971 + dbg_hid("report %d is too short, (%d < %d)\n", report->id, size, rsize); 981 972 memset(data + size, 0, rsize - size); 982 973 } 983 974
+15
drivers/hid/hid-debug.c
··· 347 347 void hid_resolv_usage(unsigned usage) { 348 348 const struct hid_usage_entry *p; 349 349 350 + if (!hid_debug) 351 + return; 352 + 350 353 resolv_usage_page(usage >> 16); 351 354 printk("."); 352 355 for (p = hid_usage_table; p->description; p++) ··· 371 368 372 369 void hid_dump_field(struct hid_field *field, int n) { 373 370 int j; 371 + 372 + if (!hid_debug) 373 + return; 374 374 375 375 if (field->physical) { 376 376 tab(n); ··· 472 466 unsigned i,k; 473 467 static char *table[] = {"INPUT", "OUTPUT", "FEATURE"}; 474 468 469 + if (!hid_debug) 470 + return; 471 + 475 472 for (i = 0; i < HID_REPORT_TYPES; i++) { 476 473 report_enum = device->report_enum + i; 477 474 list = report_enum->report_list.next; ··· 498 489 EXPORT_SYMBOL_GPL(hid_dump_device); 499 490 500 491 void hid_dump_input(struct hid_usage *usage, __s32 value) { 492 + if (!hid_debug) 493 + return; 494 + 501 495 printk("hid-debug: input "); 502 496 hid_resolv_usage(usage->hid); 503 497 printk(" = %d\n", value); ··· 769 757 }; 770 758 771 759 void hid_resolv_event(__u8 type, __u16 code) { 760 + 761 + if (!hid_debug) 762 + return; 772 763 773 764 printk("%s.%s", events[type] ? events[type] : "?", 774 765 names[type] ? (names[type][code] ? names[type][code] : "?") : "?");
+104 -21
drivers/hid/hid-input.c
··· 60 60 150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk 61 61 }; 62 62 63 + /* extended mapping for certain Logitech hardware (Logitech cordless desktop LX500) */ 64 + #define LOGITECH_EXPANDED_KEYMAP_SIZE 80 65 + static int logitech_expanded_keymap[LOGITECH_EXPANDED_KEYMAP_SIZE] = { 66 + 0,216, 0,213,175,156, 0, 0, 0, 0, 67 + 144, 0, 0, 0, 0, 0, 0, 0, 0,212, 68 + 174,167,152,161,112, 0, 0, 0,154, 0, 69 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72 + 0, 0, 0, 0, 0,183,184,185,186,187, 73 + 188,189,190,191,192,193,194, 0, 0, 0 74 + }; 75 + 63 76 static const struct { 64 77 __s32 x; 65 78 __s32 y; ··· 321 308 322 309 clear_bit(old_keycode, dev->keybit); 323 310 set_bit(usage->code, dev->keybit); 324 - #ifdef CONFIG_HID_DEBUG 325 - printk (KERN_DEBUG "Assigned keycode %d to HID usage code %x\n", keycode, scancode); 326 - #endif 311 + dbg_hid(KERN_DEBUG "Assigned keycode %d to HID usage code %x\n", keycode, scancode); 327 312 /* Set the keybit for the old keycode if the old keycode is used 328 313 * by another key */ 329 314 if (hidinput_find_key (hid, 0, old_keycode)) ··· 344 333 345 334 field->hidinput = hidinput; 346 335 347 - #ifdef CONFIG_HID_DEBUG 348 - printk(KERN_DEBUG "Mapping: "); 336 + dbg_hid("Mapping: "); 349 337 hid_resolv_usage(usage->hid); 350 - printk(" ---> "); 351 - #endif 338 + dbg_hid_line(" ---> "); 352 339 353 340 if (field->flags & HID_MAIN_ITEM_CONSTANT) 354 341 goto ignore; ··· 385 376 case HID_GD_GAMEPAD: code += 0x130; break; 386 377 default: code += 0x100; 387 378 } 379 + } 380 + 381 + /* Special handling for Logitech Cordless Desktop */ 382 + if (field->application != HID_GD_MOUSE) { 383 + if (device->quirks & HID_QUIRK_LOGITECH_EXPANDED_KEYMAP) { 384 + int hid = usage->hid & HID_USAGE; 385 + if (hid < LOGITECH_EXPANDED_KEYMAP_SIZE && logitech_expanded_keymap[hid] != 0) 386 + code = logitech_expanded_keymap[hid]; 387 + } 388 + } else { 389 + if (device->quirks & HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL) { 390 + int hid = usage->hid & HID_USAGE; 391 + if (hid == 7 || hid == 8) 392 + goto ignore; 393 + } 388 394 } 389 395 390 396 map_key(code); ··· 590 566 case 0x0e5: map_key_clear(KEY_BASSBOOST); break; 591 567 case 0x0e9: map_key_clear(KEY_VOLUMEUP); break; 592 568 case 0x0ea: map_key_clear(KEY_VOLUMEDOWN); break; 569 + 570 + /* reserved in HUT 1.12. Reported on Petalynx remote */ 571 + case 0x0f6: map_key_clear(KEY_NEXT); break; 572 + case 0x0fa: map_key_clear(KEY_BACK); break; 573 + 593 574 case 0x183: map_key_clear(KEY_CONFIG); break; 594 575 case 0x184: map_key_clear(KEY_WORDPROCESSOR); break; 595 576 case 0x185: map_key_clear(KEY_EDITOR); break; ··· 627 598 case 0x21b: map_key_clear(KEY_COPY); break; 628 599 case 0x21c: map_key_clear(KEY_CUT); break; 629 600 case 0x21d: map_key_clear(KEY_PASTE); break; 630 - case 0x221: map_key_clear(KEY_FIND); break; 601 + case 0x21f: map_key_clear(KEY_FIND); break; 602 + case 0x221: map_key_clear(KEY_SEARCH); break; 603 + case 0x222: map_key_clear(KEY_GOTO); break; 631 604 case 0x223: map_key_clear(KEY_HOMEPAGE); break; 632 605 case 0x224: map_key_clear(KEY_BACK); break; 633 606 case 0x225: map_key_clear(KEY_FORWARD); break; ··· 719 688 break; 720 689 721 690 case HID_UP_MSVENDOR: 722 - goto ignore; 691 + 692 + /* special case - Chicony Chicony KU-0418 tactical pad */ 693 + if (device->vendor == 0x04f2 && device->product == 0x0418) { 694 + set_bit(EV_REP, input->evbit); 695 + switch(usage->hid & HID_USAGE) { 696 + case 0xff01: map_key_clear(BTN_1); break; 697 + case 0xff02: map_key_clear(BTN_2); break; 698 + case 0xff03: map_key_clear(BTN_3); break; 699 + case 0xff04: map_key_clear(BTN_4); break; 700 + case 0xff05: map_key_clear(BTN_5); break; 701 + case 0xff06: map_key_clear(BTN_6); break; 702 + case 0xff07: map_key_clear(BTN_7); break; 703 + case 0xff08: map_key_clear(BTN_8); break; 704 + case 0xff09: map_key_clear(BTN_9); break; 705 + case 0xff0a: map_key_clear(BTN_A); break; 706 + case 0xff0b: map_key_clear(BTN_B); break; 707 + default: goto ignore; 708 + } 709 + } else { 710 + goto ignore; 711 + } 712 + break; 723 713 724 714 case HID_UP_CUSTOM: /* Reported on Logitech and Powerbook USB keyboards */ 725 715 ··· 756 704 } 757 705 break; 758 706 759 - case HID_UP_LOGIVENDOR: /* Reported on Logitech Ultra X Media Remote */ 760 - 707 + case HID_UP_LOGIVENDOR: 761 708 set_bit(EV_REP, input->evbit); 762 709 switch(usage->hid & HID_USAGE) { 710 + /* Reported on Logitech Ultra X Media Remote */ 763 711 case 0x004: map_key_clear(KEY_AGAIN); break; 764 712 case 0x00d: map_key_clear(KEY_HOME); break; 765 713 case 0x024: map_key_clear(KEY_SHUFFLE); break; ··· 777 725 case 0x04d: map_key_clear(KEY_SUBTITLE); break; 778 726 case 0x051: map_key_clear(KEY_RED); break; 779 727 case 0x052: map_key_clear(KEY_CLOSE); break; 728 + 729 + /* Reported on Petalynx Maxter remote */ 730 + case 0x05a: map_key_clear(KEY_TEXT); break; 731 + case 0x05b: map_key_clear(KEY_RED); break; 732 + case 0x05c: map_key_clear(KEY_GREEN); break; 733 + case 0x05d: map_key_clear(KEY_YELLOW); break; 734 + case 0x05e: map_key_clear(KEY_BLUE); break; 735 + 780 736 default: goto ignore; 781 737 } 782 738 break; ··· 878 818 field->dpad = usage->code; 879 819 } 880 820 821 + /* for those devices which produce Consumer volume usage as relative, 822 + * we emulate pressing volumeup/volumedown appropriate number of times 823 + * in hidinput_hid_event() 824 + */ 825 + if ((usage->type == EV_ABS) && (field->flags & HID_MAIN_ITEM_RELATIVE) && 826 + (usage->code == ABS_VOLUME)) { 827 + set_bit(KEY_VOLUMEUP, input->keybit); 828 + set_bit(KEY_VOLUMEDOWN, input->keybit); 829 + } 830 + 881 831 hid_resolv_event(usage->type, usage->code); 882 - #ifdef CONFIG_HID_DEBUG 883 - printk("\n"); 884 - #endif 832 + 833 + dbg_hid_line("\n"); 834 + 885 835 return; 886 836 887 837 ignore: 888 - #ifdef CONFIG_HID_DEBUG 889 - printk("IGNORED\n"); 890 - #endif 838 + dbg_hid_line("IGNORED\n"); 891 839 return; 892 840 } 893 841 ··· 964 896 } 965 897 966 898 if (usage->hid == (HID_UP_PID | 0x83UL)) { /* Simultaneous Effects Max */ 967 - dbg("Maximum Effects - %d",value); 899 + dbg_hid("Maximum Effects - %d\n",value); 968 900 return; 969 901 } 970 902 971 903 if (usage->hid == (HID_UP_PID | 0x7fUL)) { 972 - dbg("PID Pool Report\n"); 904 + dbg_hid("PID Pool Report\n"); 973 905 return; 974 906 } 975 907 976 908 if ((usage->type == EV_KEY) && (usage->code == 0)) /* Key 0 is "unassigned", not KEY_UNKNOWN */ 977 909 return; 910 + 911 + if ((usage->type == EV_ABS) && (field->flags & HID_MAIN_ITEM_RELATIVE) && 912 + (usage->code == ABS_VOLUME)) { 913 + int count = abs(value); 914 + int direction = value > 0 ? KEY_VOLUMEUP : KEY_VOLUMEDOWN; 915 + int i; 916 + 917 + for (i = 0; i < count; i++) { 918 + input_event(input, EV_KEY, direction, 1); 919 + input_sync(input); 920 + input_event(input, EV_KEY, direction, 0); 921 + input_sync(input); 922 + } 923 + return; 924 + } 978 925 979 926 input_event(input, usage->type, usage->code, value); 980 927 ··· 1059 976 if (IS_INPUT_APPLICATION(hid->collection[i].usage)) 1060 977 break; 1061 978 1062 - if (i == hid->maxcollection) 979 + if (i == hid->maxcollection && (hid->quirks & HID_QUIRK_HIDINPUT) == 0) 1063 980 return -1; 1064 981 1065 982 if (hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORTS) ··· 1077 994 if (!hidinput || !input_dev) { 1078 995 kfree(hidinput); 1079 996 input_free_device(input_dev); 1080 - err("Out of memory during hid input probe"); 997 + err_hid("Out of memory during hid input probe"); 1081 998 return -1; 1082 999 } 1083 1000
+28 -83
drivers/hid/usbhid/hid-core.c
··· 60 60 " quirks=vendorID:productID:quirks" 61 61 " where vendorID, productID, and quirks are all in" 62 62 " 0x-prefixed hex"); 63 + static char *rdesc_quirks_param[MAX_USBHID_BOOT_QUIRKS] = { [ 0 ... (MAX_USBHID_BOOT_QUIRKS - 1) ] = NULL }; 64 + module_param_array_named(rdesc_quirks, rdesc_quirks_param, charp, NULL, 0444); 65 + MODULE_PARM_DESC(rdesc_quirks, "Add/modify report descriptor quirks by specifying " 66 + " rdesc_quirks=vendorID:productID:rdesc_quirks" 67 + " where vendorID, productID, and rdesc_quirks are all in" 68 + " 0x-prefixed hex"); 63 69 /* 64 70 * Input submission and I/O error handler. 65 71 */ ··· 133 127 hid_io_error(hid); 134 128 break; 135 129 default: 136 - err("can't reset device, %s-%s/input%d, status %d", 130 + err_hid("can't reset device, %s-%s/input%d, status %d", 137 131 hid_to_usb_dev(hid)->bus->bus_name, 138 132 hid_to_usb_dev(hid)->devpath, 139 133 usbhid->ifnum, rc); ··· 226 220 if (status) { 227 221 clear_bit(HID_IN_RUNNING, &usbhid->iofl); 228 222 if (status != -EPERM) { 229 - err("can't resubmit intr, %s-%s/input%d, status %d", 223 + err_hid("can't resubmit intr, %s-%s/input%d, status %d", 230 224 hid_to_usb_dev(hid)->bus->bus_name, 231 225 hid_to_usb_dev(hid)->devpath, 232 226 usbhid->ifnum, status); ··· 246 240 usbhid->urbout->transfer_buffer_length = ((report->size - 1) >> 3) + 1 + (report->id > 0); 247 241 usbhid->urbout->dev = hid_to_usb_dev(hid); 248 242 249 - dbg("submitting out urb"); 243 + dbg_hid("submitting out urb\n"); 250 244 251 245 if (usb_submit_urb(usbhid->urbout, GFP_ATOMIC)) { 252 - err("usb_submit_urb(out) failed"); 246 + err_hid("usb_submit_urb(out) failed"); 253 247 return -1; 254 248 } 255 249 ··· 293 287 usbhid->cr->wIndex = cpu_to_le16(usbhid->ifnum); 294 288 usbhid->cr->wLength = cpu_to_le16(len); 295 289 296 - dbg("submitting ctrl urb: %s wValue=0x%04x wIndex=0x%04x wLength=%u", 290 + dbg_hid("submitting ctrl urb: %s wValue=0x%04x wIndex=0x%04x wLength=%u\n", 297 291 usbhid->cr->bRequest == HID_REQ_SET_REPORT ? "Set_Report" : "Get_Report", 298 292 usbhid->cr->wValue, usbhid->cr->wIndex, usbhid->cr->wLength); 299 293 300 294 if (usb_submit_urb(usbhid->urbctrl, GFP_ATOMIC)) { 301 - err("usb_submit_urb(ctrl) failed"); 295 + err_hid("usb_submit_urb(ctrl) failed"); 302 296 return -1; 303 297 } 304 298 ··· 480 474 if (!wait_event_timeout(hid->wait, (!test_bit(HID_CTRL_RUNNING, &usbhid->iofl) && 481 475 !test_bit(HID_OUT_RUNNING, &usbhid->iofl)), 482 476 10*HZ)) { 483 - dbg("timeout waiting for ctrl or out queue to clear"); 477 + dbg_hid("timeout waiting for ctrl or out queue to clear\n"); 484 478 return -1; 485 479 } 486 480 ··· 639 633 } 640 634 641 635 /* 642 - * Cherry Cymotion keyboard have an invalid HID report descriptor, 643 - * that needs fixing before we can parse it. 644 - */ 645 - 646 - static void hid_fixup_cymotion_descriptor(char *rdesc, int rsize) 647 - { 648 - if (rsize >= 17 && rdesc[11] == 0x3c && rdesc[12] == 0x02) { 649 - info("Fixing up Cherry Cymotion report descriptor"); 650 - rdesc[11] = rdesc[16] = 0xff; 651 - rdesc[12] = rdesc[17] = 0x03; 652 - } 653 - } 654 - 655 - /* 656 636 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller 657 637 * to "operational". Without this, the ps3 controller will not report any 658 638 * events. ··· 659 667 USB_CTRL_GET_TIMEOUT); 660 668 661 669 if (result < 0) 662 - err("%s failed: %d\n", __func__, result); 670 + err_hid("%s failed: %d\n", __func__, result); 663 671 664 672 kfree(buf); 665 - } 666 - 667 - /* 668 - * Certain Logitech keyboards send in report #3 keys which are far 669 - * above the logical maximum described in descriptor. This extends 670 - * the original value of 0x28c of logical maximum to 0x104d 671 - */ 672 - static void hid_fixup_logitech_descriptor(unsigned char *rdesc, int rsize) 673 - { 674 - if (rsize >= 90 && rdesc[83] == 0x26 675 - && rdesc[84] == 0x8c 676 - && rdesc[85] == 0x02) { 677 - info("Fixing up Logitech keyboard report descriptor"); 678 - rdesc[84] = rdesc[89] = 0x4d; 679 - rdesc[85] = rdesc[90] = 0x10; 680 - } 681 - } 682 - 683 - /* 684 - * Some USB barcode readers from cypress have usage min and usage max in 685 - * the wrong order 686 - */ 687 - static void hid_fixup_cypress_descriptor(unsigned char *rdesc, int rsize) 688 - { 689 - short fixed = 0; 690 - int i; 691 - 692 - for (i = 0; i < rsize - 4; i++) { 693 - if (rdesc[i] == 0x29 && rdesc [i+2] == 0x19) { 694 - unsigned char tmp; 695 - 696 - rdesc[i] = 0x19; rdesc[i+2] = 0x29; 697 - tmp = rdesc[i+3]; 698 - rdesc[i+3] = rdesc[i+1]; 699 - rdesc[i+1] = tmp; 700 - } 701 - } 702 - 703 - if (fixed) 704 - info("Fixing up Cypress report descriptor"); 705 673 } 706 674 707 675 static struct hid_device *usb_hid_configure(struct usb_interface *intf) ··· 698 746 if (usb_get_extra_descriptor(interface, HID_DT_HID, &hdesc) && 699 747 (!interface->desc.bNumEndpoints || 700 748 usb_get_extra_descriptor(&interface->endpoint[0], HID_DT_HID, &hdesc))) { 701 - dbg("class descriptor not present\n"); 749 + dbg_hid("class descriptor not present\n"); 702 750 return NULL; 703 751 } 704 752 ··· 707 755 rsize = le16_to_cpu(hdesc->desc[n].wDescriptorLength); 708 756 709 757 if (!rsize || rsize > HID_MAX_DESCRIPTOR_SIZE) { 710 - dbg("weird size of report descriptor (%u)", rsize); 758 + dbg_hid("weird size of report descriptor (%u)\n", rsize); 711 759 return NULL; 712 760 } 713 761 714 762 if (!(rdesc = kmalloc(rsize, GFP_KERNEL))) { 715 - dbg("couldn't allocate rdesc memory"); 763 + dbg_hid("couldn't allocate rdesc memory\n"); 716 764 return NULL; 717 765 } 718 766 719 767 hid_set_idle(dev, interface->desc.bInterfaceNumber, 0, 0); 720 768 721 769 if ((n = hid_get_class_descriptor(dev, interface->desc.bInterfaceNumber, HID_DT_REPORT, rdesc, rsize)) < 0) { 722 - dbg("reading report descriptor failed"); 770 + dbg_hid("reading report descriptor failed\n"); 723 771 kfree(rdesc); 724 772 return NULL; 725 773 } 726 774 727 - if ((quirks & HID_QUIRK_CYMOTION)) 728 - hid_fixup_cymotion_descriptor(rdesc, rsize); 775 + usbhid_fixup_report_descriptor(le16_to_cpu(dev->descriptor.idVendor), 776 + le16_to_cpu(dev->descriptor.idProduct), rdesc, 777 + rsize, rdesc_quirks_param); 729 778 730 - if (quirks & HID_QUIRK_LOGITECH_DESCRIPTOR) 731 - hid_fixup_logitech_descriptor(rdesc, rsize); 732 - 733 - if (quirks & HID_QUIRK_SWAPPED_MIN_MAX) 734 - hid_fixup_cypress_descriptor(rdesc, rsize); 735 - 736 - #ifdef CONFIG_HID_DEBUG 737 - printk(KERN_DEBUG __FILE__ ": report descriptor (size %u, read %d) = ", rsize, n); 779 + dbg_hid("report descriptor (size %u, read %d) = ", rsize, n); 738 780 for (n = 0; n < rsize; n++) 739 - printk(" %02x", (unsigned char) rdesc[n]); 740 - printk("\n"); 741 - #endif 781 + dbg_hid_line(" %02x", (unsigned char) rdesc[n]); 782 + dbg_hid_line("\n"); 742 783 743 784 if (!(hid = hid_parse_report(rdesc, n))) { 744 - dbg("parsing report descriptor failed"); 785 + dbg_hid("parsing report descriptor failed\n"); 745 786 kfree(rdesc); 746 787 return NULL; 747 788 } ··· 806 861 } 807 862 808 863 if (!usbhid->urbin) { 809 - err("couldn't find an input interrupt endpoint"); 864 + err_hid("couldn't find an input interrupt endpoint"); 810 865 goto fail; 811 866 } 812 867 ··· 901 956 usb_kill_urb(usbhid->urbctrl); 902 957 903 958 del_timer_sync(&usbhid->io_retry); 904 - flush_scheduled_work(); 959 + cancel_work_sync(&usbhid->reset_work); 905 960 906 961 if (hid->claimed & HID_CLAIMED_INPUT) 907 962 hidinput_disconnect(hid); ··· 923 978 int i; 924 979 char *c; 925 980 926 - dbg("HID probe called for ifnum %d", 981 + dbg_hid("HID probe called for ifnum %d\n", 927 982 intf->altsetting->desc.bInterfaceNumber); 928 983 929 984 if (!(hid = usb_hid_configure(intf)))
+5 -5
drivers/hid/usbhid/hid-lgff.c
··· 78 78 report->field[0]->value[1] = 0x08; 79 79 report->field[0]->value[2] = x; 80 80 report->field[0]->value[3] = y; 81 - dbg("(x, y)=(%04x, %04x)", x, y); 81 + dbg_hid("(x, y)=(%04x, %04x)\n", x, y); 82 82 usbhid_submit_report(hid, report, USB_DIR_OUT); 83 83 break; 84 84 ··· 93 93 report->field[0]->value[1] = 0x00; 94 94 report->field[0]->value[2] = left; 95 95 report->field[0]->value[3] = right; 96 - dbg("(left, right)=(%04x, %04x)", left, right); 96 + dbg_hid("(left, right)=(%04x, %04x)\n", left, right); 97 97 usbhid_submit_report(hid, report, USB_DIR_OUT); 98 98 break; 99 99 } ··· 113 113 114 114 /* Find the report to use */ 115 115 if (list_empty(report_list)) { 116 - err("No output report found"); 116 + err_hid("No output report found"); 117 117 return -1; 118 118 } 119 119 120 120 /* Check that the report looks ok */ 121 121 report = list_entry(report_list->next, struct hid_report, list); 122 122 if (!report) { 123 - err("NULL output report"); 123 + err_hid("NULL output report"); 124 124 return -1; 125 125 } 126 126 127 127 field = report->field[0]; 128 128 if (!field) { 129 - err("NULL field"); 129 + err_hid("NULL field"); 130 130 return -1; 131 131 } 132 132
+1
drivers/hid/usbhid/hid-pidff.c
··· 738 738 pidff->set_effect[PID_TRIGGER_BUTTON].value[0] = 0; 739 739 pidff->set_effect[PID_TRIGGER_REPEAT_INT].value[0] = 0; 740 740 pidff_set(&pidff->set_effect[PID_GAIN], magnitude); 741 + pidff->set_effect[PID_DIRECTION_ENABLE].value[0] = 1; 741 742 pidff->set_effect[PID_START_DELAY].value[0] = 0; 742 743 743 744 usbhid_submit_report(pidff->hid, pidff->reports[PID_SET_EFFECT],
+173 -12
drivers/hid/usbhid/hid-quirks.c
··· 105 105 #define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f 106 106 #define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100 107 107 108 + #define USB_VENDOR_ID_GAMERON 0x0810 109 + #define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR 0x0001 110 + 108 111 #define USB_VENDOR_ID_GLAB 0x06c2 109 112 #define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038 110 113 #define USB_DEVICE_ID_1_PHIDGETSERVO_30 0x0039 ··· 199 196 #define USB_VENDOR_ID_LOGITECH 0x046d 200 197 #define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 201 198 #define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294 199 + #define USB_DEVICE_ID_LOGITECH_KBD 0xc311 202 200 #define USB_DEVICE_ID_S510_RECEIVER 0xc50c 203 201 #define USB_DEVICE_ID_S510_RECEIVER_2 0xc517 202 + #define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500 0xc512 204 203 #define USB_DEVICE_ID_MX3000_RECEIVER 0xc513 205 204 #define USB_DEVICE_ID_DINOVO_EDGE 0xc714 206 205 ··· 214 209 #define USB_DEVICE_ID_MGE_UPS 0xffff 215 210 #define USB_DEVICE_ID_MGE_UPS1 0x0001 216 211 212 + #define USB_VENDOR_ID_MICROSOFT 0x045e 213 + #define USB_DEVICE_ID_SIDEWINDER_GV 0x003b 214 + 215 + #define USB_VENDOR_ID_NCR 0x0404 216 + #define USB_DEVICE_ID_NCR_FIRST 0x0300 217 + #define USB_DEVICE_ID_NCR_LAST 0x03ff 218 + 217 219 #define USB_VENDOR_ID_NEC 0x073e 218 220 #define USB_DEVICE_ID_NEC_USB_GAME_PAD 0x0301 219 221 ··· 231 219 232 220 #define USB_VENDOR_ID_PANTHERLORD 0x0810 233 221 #define USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK 0x0001 222 + 223 + #define USB_VENDOR_ID_PETALYNX 0x18b1 224 + #define USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE 0x0037 234 225 235 226 #define USB_VENDOR_ID_PLAYDOTCOM 0x0b43 236 227 #define USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII 0x0003 ··· 293 278 { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR, HID_QUIRK_BADPAD }, 294 279 { USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD, HID_QUIRK_BADPAD }, 295 280 { USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD, HID_QUIRK_BADPAD }, 281 + { USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR, HID_QUIRK_MULTI_INPUT }, 296 282 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, 297 283 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, 298 284 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, ··· 301 285 { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD }, 302 286 { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD }, 303 287 304 - { USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION, HID_QUIRK_CYMOTION }, 305 - 306 288 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE, HID_QUIRK_DUPLICATE_USAGES }, 307 289 308 290 { USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM, HID_QUIRK_HIDDEV }, 291 + { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV, HID_QUIRK_HIDINPUT }, 309 292 310 293 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_01, HID_QUIRK_IGNORE }, 311 294 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_10, HID_QUIRK_IGNORE }, ··· 424 409 { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR, HID_QUIRK_IGNORE }, 425 410 { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302, HID_QUIRK_IGNORE }, 426 411 427 - { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER, HID_QUIRK_LOGITECH_DESCRIPTOR }, 428 - { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER, HID_QUIRK_LOGITECH_DESCRIPTOR }, 429 - { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2, HID_QUIRK_LOGITECH_DESCRIPTOR }, 412 + { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP }, 430 413 431 414 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL }, 432 415 ··· 439 426 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET }, 440 427 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET }, 441 428 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL, HID_QUIRK_NOGET }, 429 + { USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE, HID_QUIRK_NOGET }, 442 430 { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET }, 443 431 { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET }, 444 432 { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, ··· 462 448 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, 463 449 464 450 { USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658, HID_QUIRK_RESET_LEDS }, 451 + { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KBD, HID_QUIRK_RESET_LEDS }, 465 452 466 - { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1, HID_QUIRK_SWAPPED_MIN_MAX }, 467 - { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2, HID_QUIRK_SWAPPED_MIN_MAX }, 453 + { 0, 0 } 454 + }; 455 + 456 + /* Quirks for devices which require report descriptor fixup go here */ 457 + static const struct hid_rdesc_blacklist { 458 + __u16 idVendor; 459 + __u16 idProduct; 460 + __u32 quirks; 461 + } hid_rdesc_blacklist[] = { 462 + 463 + { USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION, HID_QUIRK_RDESC_CYMOTION }, 464 + 465 + { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER, HID_QUIRK_RDESC_LOGITECH }, 466 + { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER, HID_QUIRK_RDESC_LOGITECH }, 467 + { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2, HID_QUIRK_RDESC_LOGITECH }, 468 + 469 + { USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE, HID_QUIRK_RDESC_PETALYNX }, 470 + 471 + { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1, HID_QUIRK_RDESC_SWAPPED_MIN_MAX }, 472 + { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2, HID_QUIRK_RDESC_SWAPPED_MIN_MAX }, 468 473 469 474 { 0, 0 } 470 475 }; ··· 526 493 } 527 494 528 495 if (bl_entry != NULL) 529 - dbg("Found dynamic quirk 0x%x for USB HID vendor 0x%hx prod 0x%hx\n", 496 + dbg_hid("Found dynamic quirk 0x%x for USB HID vendor 0x%hx prod 0x%hx\n", 530 497 bl_entry->quirks, bl_entry->idVendor, 531 498 bl_entry->idProduct); 532 499 ··· 554 521 int list_edited = 0; 555 522 556 523 if (!idVendor) { 557 - dbg("Cannot add a quirk with idVendor = 0"); 524 + dbg_hid("Cannot add a quirk with idVendor = 0\n"); 558 525 return -EINVAL; 559 526 } 560 527 561 528 q_new = kmalloc(sizeof(struct quirks_list_struct), GFP_KERNEL); 562 529 if (!q_new) { 563 - dbg("Could not allocate quirks_list_struct"); 530 + dbg_hid("Could not allocate quirks_list_struct\n"); 564 531 return -ENOMEM; 565 532 } 566 533 ··· 591 558 592 559 return 0; 593 560 } 594 - 595 561 596 562 /** 597 563 * usbhid_remove_all_dquirks: remove all runtime HID quirks from memory ··· 675 643 bl_entry = &hid_blacklist[n]; 676 644 677 645 if (bl_entry != NULL) 678 - dbg("Found squirk 0x%x for USB HID vendor 0x%hx prod 0x%hx\n", 646 + dbg_hid("Found squirk 0x%x for USB HID vendor 0x%hx prod 0x%hx\n", 679 647 bl_entry->quirks, bl_entry->idVendor, 680 648 bl_entry->idProduct); 681 649 return bl_entry; ··· 707 675 idProduct <= USB_DEVICE_ID_CODEMERCS_IOW_LAST) 708 676 return HID_QUIRK_IGNORE; 709 677 678 + /* NCR devices must not be queried for reports */ 679 + if (idVendor == USB_VENDOR_ID_NCR && 680 + idProduct >= USB_DEVICE_ID_NCR_FIRST && 681 + idProduct <= USB_DEVICE_ID_NCR_LAST) 682 + return HID_QUIRK_NOGET; 683 + 710 684 down_read(&dquirks_rwsem); 711 685 bl_entry = usbhid_exists_dquirk(idVendor, idProduct); 712 686 if (!bl_entry) ··· 724 686 return quirks; 725 687 } 726 688 689 + /* 690 + * Cherry Cymotion keyboard have an invalid HID report descriptor, 691 + * that needs fixing before we can parse it. 692 + */ 693 + static void usbhid_fixup_cymotion_descriptor(char *rdesc, int rsize) 694 + { 695 + if (rsize >= 17 && rdesc[11] == 0x3c && rdesc[12] == 0x02) { 696 + printk(KERN_INFO "Fixing up Cherry Cymotion report descriptor\n"); 697 + rdesc[11] = rdesc[16] = 0xff; 698 + rdesc[12] = rdesc[17] = 0x03; 699 + } 700 + } 701 + 702 + 703 + /* 704 + * Certain Logitech keyboards send in report #3 keys which are far 705 + * above the logical maximum described in descriptor. This extends 706 + * the original value of 0x28c of logical maximum to 0x104d 707 + */ 708 + static void usbhid_fixup_logitech_descriptor(unsigned char *rdesc, int rsize) 709 + { 710 + if (rsize >= 90 && rdesc[83] == 0x26 711 + && rdesc[84] == 0x8c 712 + && rdesc[85] == 0x02) { 713 + printk(KERN_INFO "Fixing up Logitech keyboard report descriptor\n"); 714 + rdesc[84] = rdesc[89] = 0x4d; 715 + rdesc[85] = rdesc[90] = 0x10; 716 + } 717 + } 718 + 719 + /* Petalynx Maxter Remote has maximum for consumer page set too low */ 720 + static void usbhid_fixup_petalynx_descriptor(unsigned char *rdesc, int rsize) 721 + { 722 + if (rsize >= 60 && rdesc[39] == 0x2a 723 + && rdesc[40] == 0xf5 724 + && rdesc[41] == 0x00 725 + && rdesc[59] == 0x26 726 + && rdesc[60] == 0xf9 727 + && rdesc[61] == 0x00) { 728 + printk(KERN_INFO "Fixing up Petalynx Maxter Remote report descriptor\n"); 729 + rdesc[60] = 0xfa; 730 + rdesc[40] = 0xfa; 731 + } 732 + } 733 + 734 + /* 735 + * Some USB barcode readers from cypress have usage min and usage max in 736 + * the wrong order 737 + */ 738 + static void usbhid_fixup_cypress_descriptor(unsigned char *rdesc, int rsize) 739 + { 740 + short fixed = 0; 741 + int i; 742 + 743 + for (i = 0; i < rsize - 4; i++) { 744 + if (rdesc[i] == 0x29 && rdesc [i+2] == 0x19) { 745 + unsigned char tmp; 746 + 747 + rdesc[i] = 0x19; rdesc[i+2] = 0x29; 748 + tmp = rdesc[i+3]; 749 + rdesc[i+3] = rdesc[i+1]; 750 + rdesc[i+1] = tmp; 751 + } 752 + } 753 + 754 + if (fixed) 755 + printk(KERN_INFO "Fixing up Cypress report descriptor\n"); 756 + } 757 + 758 + 759 + static void __usbhid_fixup_report_descriptor(__u32 quirks, char *rdesc, unsigned rsize) 760 + { 761 + if ((quirks & HID_QUIRK_RDESC_CYMOTION)) 762 + usbhid_fixup_cymotion_descriptor(rdesc, rsize); 763 + 764 + if (quirks & HID_QUIRK_RDESC_LOGITECH) 765 + usbhid_fixup_logitech_descriptor(rdesc, rsize); 766 + 767 + if (quirks & HID_QUIRK_RDESC_SWAPPED_MIN_MAX) 768 + usbhid_fixup_cypress_descriptor(rdesc, rsize); 769 + 770 + if (quirks & HID_QUIRK_RDESC_PETALYNX) 771 + usbhid_fixup_petalynx_descriptor(rdesc, rsize); 772 + } 773 + 774 + /** 775 + * usbhid_fixup_report_descriptor: check if report descriptor needs fixup 776 + * 777 + * Description: 778 + * Walks the hid_rdesc_blacklist[] array and checks whether the device 779 + * is known to have broken report descriptor that needs to be fixed up 780 + * prior to entering the HID parser 781 + * 782 + * Returns: nothing 783 + */ 784 + void usbhid_fixup_report_descriptor(const u16 idVendor, const u16 idProduct, 785 + char *rdesc, unsigned rsize, char **quirks_param) 786 + { 787 + int n, m; 788 + u16 paramVendor, paramProduct; 789 + u32 quirks; 790 + 791 + /* static rdesc quirk entries */ 792 + for (n = 0; hid_rdesc_blacklist[n].idVendor; n++) 793 + if (hid_rdesc_blacklist[n].idVendor == idVendor && 794 + hid_rdesc_blacklist[n].idProduct == idProduct) 795 + __usbhid_fixup_report_descriptor(hid_rdesc_blacklist[n].quirks, 796 + rdesc, rsize); 797 + 798 + /* runtime rdesc quirk entries handling */ 799 + for (n = 0; quirks_param[n] && n < MAX_USBHID_BOOT_QUIRKS; n++) { 800 + m = sscanf(quirks_param[n], "0x%hx:0x%hx:0x%x", 801 + &paramVendor, &paramProduct, &quirks); 802 + 803 + if (m != 3) 804 + printk(KERN_WARNING 805 + "Could not parse HID quirk module param %s\n", 806 + quirks_param[n]); 807 + else if (paramVendor == idVendor && paramProduct == idProduct) 808 + __usbhid_fixup_report_descriptor(quirks, rdesc, rsize); 809 + } 810 + 811 + }
+1 -1
drivers/hid/usbhid/hid-tmff.c
··· 70 70 71 71 tmff->rumble->value[0] = left; 72 72 tmff->rumble->value[1] = right; 73 - dbg("(left,right)=(%08x, %08x)", left, right); 73 + dbg_hid("(left,right)=(%08x, %08x)\n", left, right); 74 74 usbhid_submit_report(hid, tmff->report, USB_DIR_OUT); 75 75 76 76 return 0;
+2 -6
drivers/hid/usbhid/hid-zpff.c
··· 21 21 */ 22 22 23 23 24 - /* #define DEBUG */ 25 - 26 - #define debug(format, arg...) pr_debug("hid-zpff: " format "\n" , ## arg) 27 - 28 24 #include <linux/input.h> 29 25 #include <linux/usb.h> 30 26 #include <linux/hid.h> ··· 45 49 46 50 left = effect->u.rumble.strong_magnitude; 47 51 right = effect->u.rumble.weak_magnitude; 48 - debug("called with 0x%04x 0x%04x", left, right); 52 + dbg_hid("called with 0x%04x 0x%04x\n", left, right); 49 53 50 54 left = left * 0x7f / 0xffff; 51 55 right = right * 0x7f / 0xffff; 52 56 53 57 zpff->report->field[2]->value[0] = left; 54 58 zpff->report->field[3]->value[0] = right; 55 - debug("running with 0x%02x 0x%02x", left, right); 59 + dbg_hid("running with 0x%02x 0x%02x\n", left, right); 56 60 usbhid_submit_report(hid, zpff->report, USB_DIR_OUT); 57 61 58 62 return 0;
+1 -1
drivers/hid/usbhid/hiddev.c
··· 779 779 780 780 retval = usb_register_dev(usbhid->intf, &hiddev_class); 781 781 if (retval) { 782 - err("Not able to get a minor for this device."); 782 + err_hid("Not able to get a minor for this device."); 783 783 kfree(hiddev); 784 784 return -1; 785 785 }
+3 -3
drivers/hid/usbhid/usbkbd.c
··· 125 125 resubmit: 126 126 i = usb_submit_urb (urb, GFP_ATOMIC); 127 127 if (i) 128 - err ("can't resubmit intr, %s-%s/input0, status %d", 128 + err_hid ("can't resubmit intr, %s-%s/input0, status %d", 129 129 kbd->usbdev->bus->bus_name, 130 130 kbd->usbdev->devpath, i); 131 131 } ··· 151 151 *(kbd->leds) = kbd->newleds; 152 152 kbd->led->dev = kbd->usbdev; 153 153 if (usb_submit_urb(kbd->led, GFP_ATOMIC)) 154 - err("usb_submit_urb(leds) failed"); 154 + err_hid("usb_submit_urb(leds) failed"); 155 155 156 156 return 0; 157 157 } ··· 169 169 *(kbd->leds) = kbd->newleds; 170 170 kbd->led->dev = kbd->usbdev; 171 171 if (usb_submit_urb(kbd->led, GFP_ATOMIC)) 172 - err("usb_submit_urb(leds) failed"); 172 + err_hid("usb_submit_urb(leds) failed"); 173 173 } 174 174 175 175 static int usb_kbd_open(struct input_dev *dev)
+38 -18
include/linux/hid.h
··· 263 263 #define HID_QUIRK_2WHEEL_MOUSE_HACK_5 0x00000100 264 264 #define HID_QUIRK_2WHEEL_MOUSE_HACK_ON 0x00000200 265 265 #define HID_QUIRK_MIGHTYMOUSE 0x00000400 266 - #define HID_QUIRK_CYMOTION 0x00000800 267 - #define HID_QUIRK_POWERBOOK_HAS_FN 0x00001000 268 - #define HID_QUIRK_POWERBOOK_FN_ON 0x00002000 269 - #define HID_QUIRK_INVERT_HWHEEL 0x00004000 270 - #define HID_QUIRK_POWERBOOK_ISO_KEYBOARD 0x00008000 271 - #define HID_QUIRK_BAD_RELATIVE_KEYS 0x00010000 272 - #define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00020000 273 - #define HID_QUIRK_IGNORE_MOUSE 0x00040000 274 - #define HID_QUIRK_SONY_PS3_CONTROLLER 0x00080000 275 - #define HID_QUIRK_LOGITECH_DESCRIPTOR 0x00100000 276 - #define HID_QUIRK_DUPLICATE_USAGES 0x00200000 277 - #define HID_QUIRK_RESET_LEDS 0x00400000 278 - #define HID_QUIRK_SWAPPED_MIN_MAX 0x00800000 266 + #define HID_QUIRK_POWERBOOK_HAS_FN 0x00000800 267 + #define HID_QUIRK_POWERBOOK_FN_ON 0x00001000 268 + #define HID_QUIRK_INVERT_HWHEEL 0x00002000 269 + #define HID_QUIRK_POWERBOOK_ISO_KEYBOARD 0x00004000 270 + #define HID_QUIRK_BAD_RELATIVE_KEYS 0x00008000 271 + #define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000 272 + #define HID_QUIRK_IGNORE_MOUSE 0x00020000 273 + #define HID_QUIRK_SONY_PS3_CONTROLLER 0x00040000 274 + #define HID_QUIRK_DUPLICATE_USAGES 0x00080000 275 + #define HID_QUIRK_RESET_LEDS 0x00100000 276 + #define HID_QUIRK_HIDINPUT 0x00200000 277 + #define HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL 0x00400000 278 + #define HID_QUIRK_LOGITECH_EXPANDED_KEYMAP 0x00800000 279 + 280 + /* 281 + * Separate quirks for runtime report descriptor fixup 282 + */ 283 + 284 + #define HID_QUIRK_RDESC_CYMOTION 0x00000001 285 + #define HID_QUIRK_RDESC_LOGITECH 0x00000002 286 + #define HID_QUIRK_RDESC_SWAPPED_MIN_MAX 0x00000004 287 + #define HID_QUIRK_RDESC_PETALYNX 0x00000008 279 288 280 289 /* 281 290 * This is the global environment of the parser. This information is ··· 497 488 #define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || (a == 0x000c0001)) 498 489 499 490 /* HID core API */ 491 + 492 + #ifdef CONFIG_HID_DEBUG 493 + extern int hid_debug; 494 + #endif 495 + 500 496 extern void hidinput_hid_event(struct hid_device *, struct hid_field *, struct hid_usage *, __s32); 501 497 extern void hidinput_report_event(struct hid_device *hid, struct hid_report *report); 502 498 extern int hidinput_connect(struct hid_device *); ··· 520 506 int usbhid_modify_dquirk(const u16 idVendor, const u16 idProduct, const u32 quirks); 521 507 int usbhid_quirks_init(char **quirks_param); 522 508 void usbhid_quirks_exit(void); 509 + void usbhid_fixup_report_descriptor(const u16, const u16, char *, unsigned, char **); 523 510 524 511 #ifdef CONFIG_HID_FF 525 512 int hid_ff_init(struct hid_device *hid); ··· 538 523 #else 539 524 static inline int hid_ff_init(struct hid_device *hid) { return -1; } 540 525 #endif 541 - #ifdef DEBUG 542 - #define dbg(format, arg...) printk(KERN_DEBUG "%s: " format "\n" , \ 543 - __FILE__ , ## arg) 526 + 527 + #ifdef CONFIG_HID_DEBUG 528 + #define dbg_hid(format, arg...) if (hid_debug) \ 529 + printk(KERN_DEBUG "%s: " format ,\ 530 + __FILE__ , ## arg) 531 + #define dbg_hid_line(format, arg...) if (hid_debug) \ 532 + printk(format, ## arg) 544 533 #else 545 - #define dbg(format, arg...) do {} while (0) 534 + #define dbg_hid(format, arg...) do {} while (0) 535 + #define dbg_hid_line dbg_hid 546 536 #endif 547 537 548 - #define err(format, arg...) printk(KERN_ERR "%s: " format "\n" , \ 538 + #define err_hid(format, arg...) printk(KERN_ERR "%s: " format "\n" , \ 549 539 __FILE__ , ## arg) 550 540 #endif 551 541