Lines Matching full:hid

3  *  USB HID support for Linux
33 #include <linux/hid.h>
35 #include <linux/hid-debug.h>
38 #include "hid-pidff.h"
44 #define DRIVER_DESC "USB HID core driver"
69 MODULE_PARM_DESC(quirks, "Add/modify USB HID quirks by specifying "
76 static void hid_io_error(struct hid_device *hid);
77 static int hid_submit_out(struct hid_device *hid);
78 static int hid_submit_ctrl(struct hid_device *hid);
82 static int hid_start_in(struct hid_device *hid) in hid_start_in() argument
86 struct usbhid_device *usbhid = hid->driver_data; in hid_start_in()
110 struct hid_device *hid = usbhid->hid; in hid_retry_timeout() local
113 if (hid_start_in(hid)) in hid_retry_timeout()
114 hid_io_error(hid); in hid_retry_timeout()
122 struct hid_device *hid = usbhid->hid; in hid_reset() local
127 rc = usb_clear_halt(hid_to_usb_dev(hid), usbhid->urbin->pipe); in hid_reset()
130 hid_start_in(hid); in hid_reset()
145 static void hid_io_error(struct hid_device *hid) in hid_io_error() argument
148 struct usbhid_device *usbhid = hid->driver_data; in hid_io_error()
194 struct hid_device *hid = usb_get_intfdata(usbhid->intf); in usbhid_restart_out_queue() local
198 if (!hid || test_bit(HID_RESET_PENDING, &usbhid->iofl) || in usbhid_restart_out_queue()
203 hid_dbg(hid, "Kicking head %d tail %d", usbhid->outhead, usbhid->outtail); in usbhid_restart_out_queue()
221 if (hid_submit_out(hid)) { in usbhid_restart_out_queue()
232 struct hid_device *hid = usb_get_intfdata(usbhid->intf); in usbhid_restart_ctrl_queue() local
236 WARN_ON(hid == NULL); in usbhid_restart_ctrl_queue()
237 if (!hid || test_bit(HID_RESET_PENDING, &usbhid->iofl) || in usbhid_restart_ctrl_queue()
242 hid_dbg(hid, "Kicking head %d tail %d", usbhid->ctrlhead, usbhid->ctrltail); in usbhid_restart_ctrl_queue()
260 if (hid_submit_ctrl(hid)) { in usbhid_restart_ctrl_queue()
275 struct hid_device *hid = urb->context; in hid_irq_in() local
276 struct usbhid_device *usbhid = hid->driver_data; in hid_irq_in()
294 if (hid_check_keys_pressed(hid)) in hid_irq_in()
317 hid_io_error(hid); in hid_irq_in()
328 hid_err(hid, "can't resubmit intr, %s-%s/input%d, status %d\n", in hid_irq_in()
329 hid_to_usb_dev(hid)->bus->bus_name, in hid_irq_in()
330 hid_to_usb_dev(hid)->devpath, in hid_irq_in()
332 hid_io_error(hid); in hid_irq_in()
337 static int hid_submit_out(struct hid_device *hid) in hid_submit_out() argument
341 struct usbhid_device *usbhid = hid->driver_data; in hid_submit_out()
348 usbhid->urbout->dev = hid_to_usb_dev(hid); in hid_submit_out()
360 hid_err(hid, "usb_submit_urb(out) failed: %d\n", r); in hid_submit_out()
367 static int hid_submit_ctrl(struct hid_device *hid) in hid_submit_ctrl() argument
373 struct usbhid_device *usbhid = hid->driver_data; in hid_submit_ctrl()
381 usbhid->urbctrl->pipe = usb_sndctrlpipe(hid_to_usb_dev(hid), 0); in hid_submit_ctrl()
390 usbhid->urbctrl->pipe = usb_rcvctrlpipe(hid_to_usb_dev(hid), 0); in hid_submit_ctrl()
391 maxpacket = usb_maxpacket(hid_to_usb_dev(hid), in hid_submit_ctrl()
399 usbhid->urbctrl->dev = hid_to_usb_dev(hid); in hid_submit_ctrl()
416 hid_err(hid, "usb_submit_urb(ctrl) failed: %d\n", r); in hid_submit_ctrl()
429 struct hid_device *hid = urb->context; in hid_irq_out() local
430 struct usbhid_device *usbhid = hid->driver_data; in hid_irq_out()
458 hid_submit_out(hid) == 0) { in hid_irq_out()
477 struct hid_device *hid = urb->context; in hid_ctrl() local
478 struct usbhid_device *usbhid = hid->driver_data; in hid_ctrl()
510 hid_submit_ctrl(hid) == 0) { in hid_ctrl()
523 static void __usbhid_submit_report(struct hid_device *hid, struct hid_report *report, in __usbhid_submit_report() argument
527 struct usbhid_device *usbhid = hid->driver_data; in __usbhid_submit_report()
529 if (((hid->quirks & HID_QUIRK_NOGET) && dir == USB_DIR_IN) || in __usbhid_submit_report()
535 hid_warn(hid, "output queue full\n"); in __usbhid_submit_report()
541 hid_warn(hid, "output queueing failed\n"); in __usbhid_submit_report()
583 hid_warn(hid, "control queue full\n"); in __usbhid_submit_report()
590 hid_warn(hid, "control queueing failed\n"); in __usbhid_submit_report()
632 static void usbhid_submit_report(struct hid_device *hid, struct hid_report *report, unsigned char d… in usbhid_submit_report() argument
634 struct usbhid_device *usbhid = hid->driver_data; in usbhid_submit_report()
638 __usbhid_submit_report(hid, report, dir); in usbhid_submit_report()
642 static int usbhid_wait_io(struct hid_device *hid) in usbhid_wait_io() argument
644 struct usbhid_device *usbhid = hid->driver_data; in usbhid_wait_io()
680 static int usbhid_open(struct hid_device *hid) in usbhid_open() argument
682 struct usbhid_device *usbhid = hid->driver_data; in usbhid_open()
689 if (hid->quirks & HID_QUIRK_ALWAYS_POLL) { in usbhid_open()
707 res = hid_start_in(hid); in usbhid_open()
710 hid_io_error(hid); in usbhid_open()
727 * to go through hid. in usbhid_open()
739 static void usbhid_close(struct hid_device *hid) in usbhid_close() argument
741 struct usbhid_device *usbhid = hid->driver_data; in usbhid_close()
752 if (!(hid->quirks & HID_QUIRK_ALWAYS_POLL)) in usbhid_close()
756 if (!(hid->quirks & HID_QUIRK_ALWAYS_POLL)) { in usbhid_close()
769 void usbhid_init_reports(struct hid_device *hid) in usbhid_init_reports() argument
772 struct usbhid_device *usbhid = hid->driver_data; in usbhid_init_reports()
776 report_enum = &hid->report_enum[HID_INPUT_REPORT]; in usbhid_init_reports()
778 usbhid_submit_report(hid, report, USB_DIR_IN); in usbhid_init_reports()
780 report_enum = &hid->report_enum[HID_FEATURE_REPORT]; in usbhid_init_reports()
782 usbhid_submit_report(hid, report, USB_DIR_IN); in usbhid_init_reports()
785 ret = usbhid_wait_io(hid); in usbhid_init_reports()
792 ret = usbhid_wait_io(hid); in usbhid_init_reports()
796 hid_warn(hid, "timeout initializing reports\n"); in usbhid_init_reports()
802 static int hid_find_field_early(struct hid_device *hid, unsigned int page, in hid_find_field_early() argument
810 list_for_each_entry(report, &hid->report_enum[HID_OUTPUT_REPORT].report_list, list) { in hid_find_field_early()
815 if ((usage->hid & HID_USAGE_PAGE) == page && in hid_find_field_early()
816 (usage->hid & 0xFFFF) == hid_code) { in hid_find_field_early()
826 static void usbhid_set_leds(struct hid_device *hid) in usbhid_set_leds() argument
831 if ((offset = hid_find_field_early(hid, HID_UP_LED, 0x01, &field)) != -1) { in usbhid_set_leds()
833 usbhid_submit_report(hid, field->report, USB_DIR_OUT); in usbhid_set_leds()
840 static void hid_find_max_report(struct hid_device *hid, unsigned int type, in hid_find_max_report() argument
846 list_for_each_entry(report, &hid->report_enum[type].report_list, list) { in hid_find_max_report()
847 size = ((report->size - 1) >> 3) + 1 + hid->report_enum[type].numbered; in hid_find_max_report()
853 static int hid_alloc_buffers(struct usb_device *dev, struct hid_device *hid) in hid_alloc_buffers() argument
855 struct usbhid_device *usbhid = hid->driver_data; in hid_alloc_buffers()
871 static int usbhid_get_raw_report(struct hid_device *hid, in usbhid_get_raw_report() argument
875 struct usbhid_device *usbhid = hid->driver_data; in usbhid_get_raw_report()
876 struct usb_device *dev = hid_to_usb_dev(hid); in usbhid_get_raw_report()
905 static int usbhid_set_raw_report(struct hid_device *hid, unsigned int reportnum, in usbhid_set_raw_report() argument
908 struct usbhid_device *usbhid = hid->driver_data; in usbhid_set_raw_report()
909 struct usb_device *dev = hid_to_usb_dev(hid); in usbhid_set_raw_report()
916 (hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORT_ID)) in usbhid_set_raw_report()
941 static int usbhid_output_report(struct hid_device *hid, __u8 *buf, size_t count) in usbhid_output_report() argument
943 struct usbhid_device *usbhid = hid->driver_data; in usbhid_output_report()
944 struct usb_device *dev = hid_to_usb_dev(hid); in usbhid_output_report()
971 static void hid_free_buffers(struct usb_device *dev, struct hid_device *hid) in hid_free_buffers() argument
973 struct usbhid_device *usbhid = hid->driver_data; in hid_free_buffers()
981 static int usbhid_parse(struct hid_device *hid) in usbhid_parse() argument
983 struct usb_interface *intf = to_usb_interface(hid->dev.parent); in usbhid_parse()
994 quirks = hid_lookup_quirk(hid); in usbhid_parse()
1015 dbg_hid("hid descriptor is too short\n"); in usbhid_parse()
1019 hid->version = le16_to_cpu(hdesc->bcdHID); in usbhid_parse()
1020 hid->country = hdesc->bCountryCode; in usbhid_parse()
1048 ret = hid_parse_report(hid, rdesc, rsize); in usbhid_parse()
1055 hid->quirks |= quirks; in usbhid_parse()
1062 static int usbhid_start(struct hid_device *hid) in usbhid_start() argument
1064 struct usb_interface *intf = to_usb_interface(hid->dev.parent); in usbhid_start()
1067 struct usbhid_device *usbhid = hid->driver_data; in usbhid_start()
1076 hid_find_max_report(hid, HID_INPUT_REPORT, &usbhid->bufsize); in usbhid_start()
1077 hid_find_max_report(hid, HID_OUTPUT_REPORT, &usbhid->bufsize); in usbhid_start()
1078 hid_find_max_report(hid, HID_FEATURE_REPORT, &usbhid->bufsize); in usbhid_start()
1083 hid_find_max_report(hid, HID_INPUT_REPORT, &insize); in usbhid_start()
1088 if (hid_alloc_buffers(dev, hid)) { in usbhid_start()
1105 if (hid->quirks & HID_QUIRK_FULLSPEED_INTERVAL && in usbhid_start()
1109 hid->name, endpoint->bInterval, interval); in usbhid_start()
1115 switch (hid->collection->usage) { in usbhid_start()
1138 hid_irq_in, hid, interval); in usbhid_start()
1148 hid_irq_out, hid, interval); in usbhid_start()
1161 usbhid->ctrlbuf, 1, hid_ctrl, hid); in usbhid_start()
1167 if (hid->quirks & HID_QUIRK_ALWAYS_POLL) { in usbhid_start()
1173 ret = hid_start_in(hid); in usbhid_start()
1175 dev_err(&hid->dev, in usbhid_start()
1190 usbhid_set_leds(hid); in usbhid_start()
1204 hid_free_buffers(dev, hid); in usbhid_start()
1209 static void usbhid_stop(struct hid_device *hid) in usbhid_stop() argument
1211 struct usbhid_device *usbhid = hid->driver_data; in usbhid_stop()
1216 if (hid->quirks & HID_QUIRK_ALWAYS_POLL) { in usbhid_stop()
1244 hid->claimed = 0; in usbhid_stop()
1253 hid_free_buffers(hid_to_usb_dev(hid), hid); in usbhid_stop()
1258 static int usbhid_power(struct hid_device *hid, int lvl) in usbhid_power() argument
1260 struct usbhid_device *usbhid = hid->driver_data; in usbhid_power()
1276 static void usbhid_request(struct hid_device *hid, struct hid_report *rep, int reqtype) in usbhid_request() argument
1280 usbhid_submit_report(hid, rep, USB_DIR_IN); in usbhid_request()
1283 usbhid_submit_report(hid, rep, USB_DIR_OUT); in usbhid_request()
1288 static int usbhid_raw_request(struct hid_device *hid, unsigned char reportnum, in usbhid_raw_request() argument
1294 return usbhid_get_raw_report(hid, reportnum, buf, len, rtype); in usbhid_raw_request()
1296 return usbhid_set_raw_report(hid, reportnum, buf, len, rtype); in usbhid_raw_request()
1302 static int usbhid_idle(struct hid_device *hid, int report, int idle, in usbhid_idle() argument
1305 struct usb_device *dev = hid_to_usb_dev(hid); in usbhid_idle()
1306 struct usb_interface *intf = to_usb_interface(hid->dev.parent); in usbhid_idle()
1316 static bool usbhid_may_wakeup(struct hid_device *hid) in usbhid_may_wakeup() argument
1318 struct usb_device *dev = hid_to_usb_dev(hid); in usbhid_may_wakeup()
1349 struct hid_device *hid; in usbhid_probe() local
1354 dbg_hid("HID probe called for ifnum %d\n", in usbhid_probe()
1365 hid = hid_allocate_device(); in usbhid_probe()
1366 if (IS_ERR(hid)) in usbhid_probe()
1367 return PTR_ERR(hid); in usbhid_probe()
1369 usb_set_intfdata(intf, hid); in usbhid_probe()
1370 hid->ll_driver = &usb_hid_driver; in usbhid_probe()
1371 hid->ff_init = hid_pidff_init; in usbhid_probe()
1373 hid->hiddev_connect = hiddev_connect; in usbhid_probe()
1374 hid->hiddev_disconnect = hiddev_disconnect; in usbhid_probe()
1375 hid->hiddev_hid_event = hiddev_hid_event; in usbhid_probe()
1376 hid->hiddev_report_event = hiddev_report_event; in usbhid_probe()
1378 hid->dev.parent = &intf->dev; in usbhid_probe()
1379 device_set_node(&hid->dev, dev_fwnode(&intf->dev)); in usbhid_probe()
1380 hid->bus = BUS_USB; in usbhid_probe()
1381 hid->vendor = le16_to_cpu(dev->descriptor.idVendor); in usbhid_probe()
1382 hid->product = le16_to_cpu(dev->descriptor.idProduct); in usbhid_probe()
1383 hid->version = le16_to_cpu(dev->descriptor.bcdDevice); in usbhid_probe()
1384 hid->name[0] = 0; in usbhid_probe()
1387 hid->type = HID_TYPE_USBMOUSE; in usbhid_probe()
1389 hid->type = HID_TYPE_USBNONE; in usbhid_probe()
1392 strscpy(hid->name, dev->manufacturer, sizeof(hid->name)); in usbhid_probe()
1396 strlcat(hid->name, " ", sizeof(hid->name)); in usbhid_probe()
1397 strlcat(hid->name, dev->product, sizeof(hid->name)); in usbhid_probe()
1400 if (!strlen(hid->name)) in usbhid_probe()
1401 snprintf(hid->name, sizeof(hid->name), "HID %04x:%04x", in usbhid_probe()
1405 usb_make_path(dev, hid->phys, sizeof(hid->phys)); in usbhid_probe()
1406 strlcat(hid->phys, "/input", sizeof(hid->phys)); in usbhid_probe()
1407 len = strlen(hid->phys); in usbhid_probe()
1408 if (len < sizeof(hid->phys) - 1) in usbhid_probe()
1409 snprintf(hid->phys + len, sizeof(hid->phys) - len, in usbhid_probe()
1412 if (usb_string(dev, dev->descriptor.iSerialNumber, hid->uniq, 64) <= 0) in usbhid_probe()
1413 hid->uniq[0] = 0; in usbhid_probe()
1421 hid->driver_data = usbhid; in usbhid_probe()
1422 usbhid->hid = hid; in usbhid_probe()
1432 ret = hid_add_device(hid); in usbhid_probe()
1435 hid_err(intf, "can't add hid device: %d\n", ret); in usbhid_probe()
1443 hid_destroy_device(hid); in usbhid_probe()
1449 struct hid_device *hid = usb_get_intfdata(intf); in usbhid_disconnect() local
1452 if (WARN_ON(!hid)) in usbhid_disconnect()
1455 usbhid = hid->driver_data; in usbhid_disconnect()
1459 hid_destroy_device(hid); in usbhid_disconnect()
1477 static void hid_restart_io(struct hid_device *hid) in hid_restart_io() argument
1479 struct usbhid_device *usbhid = hid->driver_data; in hid_restart_io()
1496 if (hid_start_in(hid) < 0) in hid_restart_io()
1497 hid_io_error(hid); in hid_restart_io()
1511 struct hid_device *hid = usb_get_intfdata(intf); in hid_pre_reset() local
1512 struct usbhid_device *usbhid = hid->driver_data; in hid_pre_reset()
1526 struct hid_device *hid = usb_get_intfdata(intf); in hid_post_reset() local
1527 struct usbhid_device *usbhid = hid->driver_data; in hid_post_reset()
1532 /* Fetch and examine the HID report descriptor. If this in hid_post_reset()
1535 * the size of the HID report descriptor has not changed. in hid_post_reset()
1537 rdesc = kmalloc(hid->dev_rsize, GFP_KERNEL); in hid_post_reset()
1543 HID_DT_REPORT, rdesc, hid->dev_rsize); in hid_post_reset()
1549 status = memcmp(rdesc, hid->dev_rdesc, hid->dev_rsize); in hid_post_reset()
1563 hid_restart_io(hid); in hid_post_reset()
1568 static int hid_resume_common(struct hid_device *hid, bool driver_suspended) in hid_resume_common() argument
1572 hid_restart_io(hid); in hid_resume_common()
1574 status = hid_driver_resume(hid); in hid_resume_common()
1580 struct hid_device *hid = usb_get_intfdata(intf); in hid_suspend() local
1581 struct usbhid_device *usbhid = hid->driver_data; in hid_suspend()
1587 ledcount = hidinput_count_leds(hid); in hid_suspend()
1598 status = hid_driver_suspend(hid, message); in hid_suspend()
1610 status = hid_driver_suspend(hid, message); in hid_suspend()
1615 if (usbhid_wait_io(hid) < 0) in hid_suspend()
1631 hid_resume_common(hid, driver_suspended); in hid_suspend()
1637 struct hid_device *hid = usb_get_intfdata (intf); in hid_resume() local
1640 status = hid_resume_common(hid, true); in hid_resume()
1647 struct hid_device *hid = usb_get_intfdata(intf); in hid_reset_resume() local
1652 int ret = hid_driver_reset_resume(hid); in hid_reset_resume()