aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hid/uhid.c83
1 files changed, 0 insertions, 83 deletions
diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c
index 12439e1eeae2..89de2fef46b2 100644
--- a/drivers/hid/uhid.c
+++ b/drivers/hid/uhid.c
@@ -123,89 +123,6 @@ static int uhid_hid_parse(struct hid_device *hid)
123 return hid_parse_report(hid, uhid->rd_data, uhid->rd_size); 123 return hid_parse_report(hid, uhid->rd_data, uhid->rd_size);
124} 124}
125 125
126static int uhid_hid_get_raw(struct hid_device *hid, unsigned char rnum,
127 __u8 *buf, size_t count, unsigned char rtype)
128{
129 struct uhid_device *uhid = hid->driver_data;
130 __u8 report_type;
131 struct uhid_event *ev;
132 unsigned long flags;
133 int ret;
134 size_t uninitialized_var(len);
135 struct uhid_feature_answer_req *req;
136
137 if (!uhid->running)
138 return -EIO;
139
140 switch (rtype) {
141 case HID_FEATURE_REPORT:
142 report_type = UHID_FEATURE_REPORT;
143 break;
144 case HID_OUTPUT_REPORT:
145 report_type = UHID_OUTPUT_REPORT;
146 break;
147 case HID_INPUT_REPORT:
148 report_type = UHID_INPUT_REPORT;
149 break;
150 default:
151 return -EINVAL;
152 }
153
154 ret = mutex_lock_interruptible(&uhid->report_lock);
155 if (ret)
156 return ret;
157
158 ev = kzalloc(sizeof(*ev), GFP_KERNEL);
159 if (!ev) {
160 ret = -ENOMEM;
161 goto unlock;
162 }
163
164 spin_lock_irqsave(&uhid->qlock, flags);
165 ev->type = UHID_FEATURE;
166 ev->u.feature.id = atomic_inc_return(&uhid->report_id);
167 ev->u.feature.rnum = rnum;
168 ev->u.feature.rtype = report_type;
169
170 atomic_set(&uhid->report_done, 0);
171 uhid_queue(uhid, ev);
172 spin_unlock_irqrestore(&uhid->qlock, flags);
173
174 ret = wait_event_interruptible_timeout(uhid->report_wait,
175 atomic_read(&uhid->report_done), 5 * HZ);
176
177 /*
178 * Make sure "uhid->running" is cleared on shutdown before
179 * "uhid->report_done" is set.
180 */
181 smp_rmb();
182 if (!ret || !uhid->running) {
183 ret = -EIO;
184 } else if (ret < 0) {
185 ret = -ERESTARTSYS;
186 } else {
187 spin_lock_irqsave(&uhid->qlock, flags);
188 req = &uhid->report_buf.u.feature_answer;
189
190 if (req->err) {
191 ret = -EIO;
192 } else {
193 ret = 0;
194 len = min(count,
195 min_t(size_t, req->size, UHID_DATA_MAX));
196 memcpy(buf, req->data, len);
197 }
198
199 spin_unlock_irqrestore(&uhid->qlock, flags);
200 }
201
202 atomic_set(&uhid->report_done, 1);
203
204unlock:
205 mutex_unlock(&uhid->report_lock);
206 return ret ? ret : len;
207}
208
209static int uhid_hid_output_raw(struct hid_device *hid, __u8 *buf, size_t count, 126static int uhid_hid_output_raw(struct hid_device *hid, __u8 *buf, size_t count,
210 unsigned char report_type) 127 unsigned char report_type)
211{ 128{