diff options
| -rw-r--r-- | drivers/hid/uhid.c | 21 | ||||
| -rw-r--r-- | include/uapi/linux/uhid.h | 11 |
2 files changed, 31 insertions, 1 deletions
diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c index 19511481a7d3..f6ec5eaf6b89 100644 --- a/drivers/hid/uhid.c +++ b/drivers/hid/uhid.c | |||
| @@ -92,8 +92,27 @@ static int uhid_queue_event(struct uhid_device *uhid, __u32 event) | |||
| 92 | static int uhid_hid_start(struct hid_device *hid) | 92 | static int uhid_hid_start(struct hid_device *hid) |
| 93 | { | 93 | { |
| 94 | struct uhid_device *uhid = hid->driver_data; | 94 | struct uhid_device *uhid = hid->driver_data; |
| 95 | struct uhid_event *ev; | ||
| 96 | unsigned long flags; | ||
| 97 | |||
| 98 | ev = kzalloc(sizeof(*ev), GFP_KERNEL); | ||
| 99 | if (!ev) | ||
| 100 | return -ENOMEM; | ||
| 101 | |||
| 102 | ev->type = UHID_START; | ||
| 95 | 103 | ||
| 96 | return uhid_queue_event(uhid, UHID_START); | 104 | if (hid->report_enum[HID_FEATURE_REPORT].numbered) |
| 105 | ev->u.start.dev_flags |= UHID_DEV_NUMBERED_FEATURE_REPORTS; | ||
| 106 | if (hid->report_enum[HID_OUTPUT_REPORT].numbered) | ||
| 107 | ev->u.start.dev_flags |= UHID_DEV_NUMBERED_OUTPUT_REPORTS; | ||
| 108 | if (hid->report_enum[HID_INPUT_REPORT].numbered) | ||
| 109 | ev->u.start.dev_flags |= UHID_DEV_NUMBERED_INPUT_REPORTS; | ||
| 110 | |||
| 111 | spin_lock_irqsave(&uhid->qlock, flags); | ||
| 112 | uhid_queue(uhid, ev); | ||
| 113 | spin_unlock_irqrestore(&uhid->qlock, flags); | ||
| 114 | |||
| 115 | return 0; | ||
| 97 | } | 116 | } |
| 98 | 117 | ||
| 99 | static void uhid_hid_stop(struct hid_device *hid) | 118 | static void uhid_hid_stop(struct hid_device *hid) |
diff --git a/include/uapi/linux/uhid.h b/include/uapi/linux/uhid.h index 62aac0e4edf3..aaa86d6bd1dd 100644 --- a/include/uapi/linux/uhid.h +++ b/include/uapi/linux/uhid.h | |||
| @@ -54,6 +54,16 @@ struct uhid_create2_req { | |||
| 54 | __u8 rd_data[HID_MAX_DESCRIPTOR_SIZE]; | 54 | __u8 rd_data[HID_MAX_DESCRIPTOR_SIZE]; |
| 55 | } __attribute__((__packed__)); | 55 | } __attribute__((__packed__)); |
| 56 | 56 | ||
| 57 | enum uhid_dev_flag { | ||
| 58 | UHID_DEV_NUMBERED_FEATURE_REPORTS = (1ULL << 0), | ||
| 59 | UHID_DEV_NUMBERED_OUTPUT_REPORTS = (1ULL << 1), | ||
| 60 | UHID_DEV_NUMBERED_INPUT_REPORTS = (1ULL << 2), | ||
| 61 | }; | ||
| 62 | |||
| 63 | struct uhid_start_req { | ||
| 64 | __u64 dev_flags; | ||
| 65 | }; | ||
| 66 | |||
| 57 | #define UHID_DATA_MAX 4096 | 67 | #define UHID_DATA_MAX 4096 |
| 58 | 68 | ||
| 59 | enum uhid_report_type { | 69 | enum uhid_report_type { |
| @@ -182,6 +192,7 @@ struct uhid_event { | |||
| 182 | struct uhid_input2_req input2; | 192 | struct uhid_input2_req input2; |
| 183 | struct uhid_set_report_req set_report; | 193 | struct uhid_set_report_req set_report; |
| 184 | struct uhid_set_report_reply_req set_report_reply; | 194 | struct uhid_set_report_reply_req set_report_reply; |
| 195 | struct uhid_start_req start; | ||
| 185 | } u; | 196 | } u; |
| 186 | } __attribute__((__packed__)); | 197 | } __attribute__((__packed__)); |
| 187 | 198 | ||
