aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/usbhid
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hid/usbhid')
-rw-r--r--drivers/hid/usbhid/hid-core.c12
-rw-r--r--drivers/hid/usbhid/hid-pidff.c5
-rw-r--r--drivers/hid/usbhid/hid-quirks.c4
-rw-r--r--drivers/hid/usbhid/hiddev.c5
4 files changed, 11 insertions, 15 deletions
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 03bd703255a3..0258289f3b3e 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -41,8 +41,6 @@
41 * Version Information 41 * Version Information
42 */ 42 */
43 43
44#define DRIVER_VERSION "v2.6"
45#define DRIVER_AUTHOR "Andreas Gal, Vojtech Pavlik, Jiri Kosina"
46#define DRIVER_DESC "USB HID core driver" 44#define DRIVER_DESC "USB HID core driver"
47#define DRIVER_LICENSE "GPL" 45#define DRIVER_LICENSE "GPL"
48 46
@@ -998,7 +996,8 @@ static int usbhid_start(struct hid_device *hid)
998 usbhid->urbctrl->transfer_dma = usbhid->ctrlbuf_dma; 996 usbhid->urbctrl->transfer_dma = usbhid->ctrlbuf_dma;
999 usbhid->urbctrl->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP); 997 usbhid->urbctrl->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP);
1000 998
1001 usbhid_init_reports(hid); 999 if (!(hid->quirks & HID_QUIRK_NO_INIT_REPORTS))
1000 usbhid_init_reports(hid);
1002 1001
1003 set_bit(HID_STARTED, &usbhid->iofl); 1002 set_bit(HID_STARTED, &usbhid->iofl);
1004 1003
@@ -1395,8 +1394,7 @@ static int __init hid_init(void)
1395 retval = usb_register(&hid_driver); 1394 retval = usb_register(&hid_driver);
1396 if (retval) 1395 if (retval)
1397 goto usb_register_fail; 1396 goto usb_register_fail;
1398 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" 1397 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
1399 DRIVER_DESC "\n");
1400 1398
1401 return 0; 1399 return 0;
1402usb_register_fail: 1400usb_register_fail:
@@ -1423,6 +1421,8 @@ static void __exit hid_exit(void)
1423module_init(hid_init); 1421module_init(hid_init);
1424module_exit(hid_exit); 1422module_exit(hid_exit);
1425 1423
1426MODULE_AUTHOR(DRIVER_AUTHOR); 1424MODULE_AUTHOR("Andreas Gal");
1425MODULE_AUTHOR("Vojtech Pavlik");
1426MODULE_AUTHOR("Jiri Kosina");
1427MODULE_DESCRIPTION(DRIVER_DESC); 1427MODULE_DESCRIPTION(DRIVER_DESC);
1428MODULE_LICENSE(DRIVER_LICENSE); 1428MODULE_LICENSE(DRIVER_LICENSE);
diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c
index 484e3eec2f88..e565dbe91d97 100644
--- a/drivers/hid/usbhid/hid-pidff.c
+++ b/drivers/hid/usbhid/hid-pidff.c
@@ -1181,12 +1181,11 @@ static void pidff_reset(struct pidff_device *pidff)
1181 usbhid_wait_io(hid); 1181 usbhid_wait_io(hid);
1182 1182
1183 if (pidff->pool[PID_SIMULTANEOUS_MAX].value) { 1183 if (pidff->pool[PID_SIMULTANEOUS_MAX].value) {
1184 int sim_effects = pidff->pool[PID_SIMULTANEOUS_MAX].value[0]; 1184 while (pidff->pool[PID_SIMULTANEOUS_MAX].value[0] < 2) {
1185 while (sim_effects < 2) {
1186 if (i++ > 20) { 1185 if (i++ > 20) {
1187 printk(KERN_WARNING "hid-pidff: device reports " 1186 printk(KERN_WARNING "hid-pidff: device reports "
1188 "%d simultaneous effects\n", 1187 "%d simultaneous effects\n",
1189 sim_effects); 1188 pidff->pool[PID_SIMULTANEOUS_MAX].value[0]);
1190 break; 1189 break;
1191 } 1190 }
1192 debug("pid_pool requested again"); 1191 debug("pid_pool requested again");
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
index 0d9045aa2c4b..38773dc2821b 100644
--- a/drivers/hid/usbhid/hid-quirks.c
+++ b/drivers/hid/usbhid/hid-quirks.c
@@ -37,6 +37,7 @@ static const struct hid_blacklist {
37 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, 37 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
38 { USB_VENDOR_ID_NATSU, USB_DEVICE_ID_NATSU_GAMEPAD, HID_QUIRK_BADPAD }, 38 { USB_VENDOR_ID_NATSU, USB_DEVICE_ID_NATSU_GAMEPAD, HID_QUIRK_BADPAD },
39 { USB_VENDOR_ID_NEC, USB_DEVICE_ID_NEC_USB_GAME_PAD, HID_QUIRK_BADPAD }, 39 { USB_VENDOR_ID_NEC, USB_DEVICE_ID_NEC_USB_GAME_PAD, HID_QUIRK_BADPAD },
40 { USB_VENDOR_ID_NEXTWINDOW, USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN, HID_QUIRK_MULTI_INPUT},
40 { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD }, 41 { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD },
41 { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD }, 42 { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD },
42 43
@@ -53,6 +54,7 @@ static const struct hid_blacklist {
53 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_COMBATSTICK, HID_QUIRK_NOGET }, 54 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_COMBATSTICK, HID_QUIRK_NOGET },
54 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE, HID_QUIRK_NOGET }, 55 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE, HID_QUIRK_NOGET },
55 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_PRO_PEDALS, HID_QUIRK_NOGET }, 56 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_PRO_PEDALS, HID_QUIRK_NOGET },
57 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK, HID_QUIRK_NOGET },
56 { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, 58 { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
57 { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, 59 { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET },
58 { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET }, 60 { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET },
@@ -280,7 +282,7 @@ u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct)
280 if (idVendor == USB_VENDOR_ID_NCR && 282 if (idVendor == USB_VENDOR_ID_NCR &&
281 idProduct >= USB_DEVICE_ID_NCR_FIRST && 283 idProduct >= USB_DEVICE_ID_NCR_FIRST &&
282 idProduct <= USB_DEVICE_ID_NCR_LAST) 284 idProduct <= USB_DEVICE_ID_NCR_LAST)
283 return HID_QUIRK_NOGET; 285 return HID_QUIRK_NO_INIT_REPORTS;
284 286
285 down_read(&dquirks_rwsem); 287 down_read(&dquirks_rwsem);
286 bl_entry = usbhid_exists_dquirk(idVendor, idProduct); 288 bl_entry = usbhid_exists_dquirk(idVendor, idProduct);
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c
index 8b6ee247bfe4..867e08433e4b 100644
--- a/drivers/hid/usbhid/hiddev.c
+++ b/drivers/hid/usbhid/hiddev.c
@@ -450,7 +450,6 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
450 uref_multi = kmalloc(sizeof(struct hiddev_usage_ref_multi), GFP_KERNEL); 450 uref_multi = kmalloc(sizeof(struct hiddev_usage_ref_multi), GFP_KERNEL);
451 if (!uref_multi) 451 if (!uref_multi)
452 return -ENOMEM; 452 return -ENOMEM;
453 lock_kernel();
454 uref = &uref_multi->uref; 453 uref = &uref_multi->uref;
455 if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) { 454 if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) {
456 if (copy_from_user(uref_multi, user_arg, 455 if (copy_from_user(uref_multi, user_arg,
@@ -528,7 +527,6 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
528 527
529 case HIDIOCGCOLLECTIONINDEX: 528 case HIDIOCGCOLLECTIONINDEX:
530 i = field->usage[uref->usage_index].collection_index; 529 i = field->usage[uref->usage_index].collection_index;
531 unlock_kernel();
532 kfree(uref_multi); 530 kfree(uref_multi);
533 return i; 531 return i;
534 case HIDIOCGUSAGES: 532 case HIDIOCGUSAGES:
@@ -547,15 +545,12 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
547 } 545 }
548 546
549goodreturn: 547goodreturn:
550 unlock_kernel();
551 kfree(uref_multi); 548 kfree(uref_multi);
552 return 0; 549 return 0;
553fault: 550fault:
554 unlock_kernel();
555 kfree(uref_multi); 551 kfree(uref_multi);
556 return -EFAULT; 552 return -EFAULT;
557inval: 553inval:
558 unlock_kernel();
559 kfree(uref_multi); 554 kfree(uref_multi);
560 return -EINVAL; 555 return -EINVAL;
561 } 556 }