aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/uhid.c
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2014-07-29 11:14:21 -0400
committerJiri Kosina <jkosina@suse.cz>2014-08-25 04:28:07 -0400
commitfa71f32b5de2be1644ee671ddbe211d79be7847f (patch)
tree2e7e01d5bfe3bde23e1de3275f393b34bcbb793d /drivers/hid/uhid.c
parent5942b849b124c54002346e699f50db3714e300ed (diff)
HID: uhid: add ABI compatible UHID_GET_REPORT replacing UHID_FEATURE
The old hdev->hid_get_raw_report() was broken by design. It was never clear what kind of HW request it should trigger. Benjamin fixed that with the core HID cleanup, though we never really adjusted uhid. Unfortunately, our old UHID_FEATURE command was modelled around the broken hid_get_raw_report(). We converted it silently to the new GET_REPORT and nothing broke. Make this explicit by renaming UHID_FEATURE to UHID_GET_REPORT and UHID_FEATURE_ANSWER to UHID_GET_REPORT_REPLY. Note that this is 100% ABI compatible to UHID_FEATURE. This is just a rename. But we have to keep the old definitions around to not break API. >From now on, UHID_GET_REPORT must trigger a GET_REPORT request on the user-space hardware layer. All the ambiguity due to the weird "feature" name should be gone now. Signed-off-by: David Herrmann <dh.herrmann@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/uhid.c')
-rw-r--r--drivers/hid/uhid.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c
index 2d2025a027fe..8f5e46b1bb46 100644
--- a/drivers/hid/uhid.c
+++ b/drivers/hid/uhid.c
@@ -124,8 +124,8 @@ static int uhid_hid_parse(struct hid_device *hid)
124 return hid_parse_report(hid, uhid->rd_data, uhid->rd_size); 124 return hid_parse_report(hid, uhid->rd_data, uhid->rd_size);
125} 125}
126 126
127static int uhid_hid_get_raw(struct hid_device *hid, unsigned char rnum, 127static int uhid_hid_get_report(struct hid_device *hid, unsigned char rnum,
128 __u8 *buf, size_t count, unsigned char rtype) 128 __u8 *buf, size_t count, unsigned char rtype)
129{ 129{
130 struct uhid_device *uhid = hid->driver_data; 130 struct uhid_device *uhid = hid->driver_data;
131 __u8 report_type; 131 __u8 report_type;
@@ -133,7 +133,7 @@ static int uhid_hid_get_raw(struct hid_device *hid, unsigned char rnum,
133 unsigned long flags; 133 unsigned long flags;
134 int ret; 134 int ret;
135 size_t uninitialized_var(len); 135 size_t uninitialized_var(len);
136 struct uhid_feature_answer_req *req; 136 struct uhid_get_report_reply_req *req;
137 137
138 if (!uhid->running) 138 if (!uhid->running)
139 return -EIO; 139 return -EIO;
@@ -163,10 +163,10 @@ static int uhid_hid_get_raw(struct hid_device *hid, unsigned char rnum,
163 } 163 }
164 164
165 spin_lock_irqsave(&uhid->qlock, flags); 165 spin_lock_irqsave(&uhid->qlock, flags);
166 ev->type = UHID_FEATURE; 166 ev->type = UHID_GET_REPORT;
167 ev->u.feature.id = ++uhid->report_id; 167 ev->u.get_report.id = ++uhid->report_id;
168 ev->u.feature.rnum = rnum; 168 ev->u.get_report.rnum = rnum;
169 ev->u.feature.rtype = report_type; 169 ev->u.get_report.rtype = report_type;
170 170
171 uhid->report_running = true; 171 uhid->report_running = true;
172 uhid_queue(uhid, ev); 172 uhid_queue(uhid, ev);
@@ -182,7 +182,7 @@ static int uhid_hid_get_raw(struct hid_device *hid, unsigned char rnum,
182 ret = -ERESTARTSYS; 182 ret = -ERESTARTSYS;
183 } else { 183 } else {
184 spin_lock_irqsave(&uhid->qlock, flags); 184 spin_lock_irqsave(&uhid->qlock, flags);
185 req = &uhid->report_buf.u.feature_answer; 185 req = &uhid->report_buf.u.get_report_reply;
186 186
187 if (req->err) { 187 if (req->err) {
188 ret = -EIO; 188 ret = -EIO;
@@ -253,7 +253,7 @@ static int uhid_raw_request(struct hid_device *hid, unsigned char reportnum,
253{ 253{
254 switch (reqtype) { 254 switch (reqtype) {
255 case HID_REQ_GET_REPORT: 255 case HID_REQ_GET_REPORT:
256 return uhid_hid_get_raw(hid, reportnum, buf, len, rtype); 256 return uhid_hid_get_report(hid, reportnum, buf, len, rtype);
257 case HID_REQ_SET_REPORT: 257 case HID_REQ_SET_REPORT:
258 /* TODO: implement proper SET_REPORT functionality */ 258 /* TODO: implement proper SET_REPORT functionality */
259 return -ENOSYS; 259 return -ENOSYS;
@@ -487,8 +487,8 @@ static int uhid_dev_input2(struct uhid_device *uhid, struct uhid_event *ev)
487 return 0; 487 return 0;
488} 488}
489 489
490static int uhid_dev_feature_answer(struct uhid_device *uhid, 490static int uhid_dev_get_report_reply(struct uhid_device *uhid,
491 struct uhid_event *ev) 491 struct uhid_event *ev)
492{ 492{
493 unsigned long flags; 493 unsigned long flags;
494 494
@@ -498,7 +498,7 @@ static int uhid_dev_feature_answer(struct uhid_device *uhid,
498 spin_lock_irqsave(&uhid->qlock, flags); 498 spin_lock_irqsave(&uhid->qlock, flags);
499 499
500 /* id for old report; drop it silently */ 500 /* id for old report; drop it silently */
501 if (uhid->report_id != ev->u.feature_answer.id) 501 if (uhid->report_id != ev->u.get_report_reply.id)
502 goto unlock; 502 goto unlock;
503 if (!uhid->report_running) 503 if (!uhid->report_running)
504 goto unlock; 504 goto unlock;
@@ -634,8 +634,8 @@ static ssize_t uhid_char_write(struct file *file, const char __user *buffer,
634 case UHID_INPUT2: 634 case UHID_INPUT2:
635 ret = uhid_dev_input2(uhid, &uhid->input_buf); 635 ret = uhid_dev_input2(uhid, &uhid->input_buf);
636 break; 636 break;
637 case UHID_FEATURE_ANSWER: 637 case UHID_GET_REPORT_REPLY:
638 ret = uhid_dev_feature_answer(uhid, &uhid->input_buf); 638 ret = uhid_dev_get_report_reply(uhid, &uhid->input_buf);
639 break; 639 break;
640 default: 640 default:
641 ret = -EOPNOTSUPP; 641 ret = -EOPNOTSUPP;