inet: frag: enforce memory limits earlier
[linux/fpc-iii.git] / drivers / usb / usbip / vudc_transfer.c
blobbc0296d937d0f628c16a04a544b14321a281af8c
1 /*
2 * Copyright (C) 2015 Karol Kosik <karo9@interia.eu>
3 * Copyright (C) 2015-2016 Samsung Electronics
4 * Igor Kotrasinski <i.kotrasinsk@samsung.com>
6 * Based on dummy_hcd.c, which is:
7 * Copyright (C) 2003 David Brownell
8 * Copyright (C) 2003-2005 Alan Stern
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
24 #include <linux/usb.h>
25 #include <linux/timer.h>
26 #include <linux/usb/ch9.h>
28 #include "vudc.h"
30 #define DEV_REQUEST (USB_TYPE_STANDARD | USB_RECIP_DEVICE)
31 #define DEV_INREQUEST (DEV_REQUEST | USB_DIR_IN)
32 #define INTF_REQUEST (USB_TYPE_STANDARD | USB_RECIP_INTERFACE)
33 #define INTF_INREQUEST (INTF_REQUEST | USB_DIR_IN)
34 #define EP_REQUEST (USB_TYPE_STANDARD | USB_RECIP_ENDPOINT)
35 #define EP_INREQUEST (EP_REQUEST | USB_DIR_IN)
37 static int get_frame_limit(enum usb_device_speed speed)
39 switch (speed) {
40 case USB_SPEED_LOW:
41 return 8 /*bytes*/ * 12 /*packets*/;
42 case USB_SPEED_FULL:
43 return 64 /*bytes*/ * 19 /*packets*/;
44 case USB_SPEED_HIGH:
45 return 512 /*bytes*/ * 13 /*packets*/ * 8 /*uframes*/;
46 case USB_SPEED_SUPER:
47 /* Bus speed is 500000 bytes/ms, so use a little less */
48 return 490000;
49 default:
50 /* error */
51 return -1;
57 * handle_control_request() - handles all control transfers
58 * @udc: pointer to vudc
59 * @urb: the urb request to handle
60 * @setup: pointer to the setup data for a USB device control
61 * request
62 * @status: pointer to request handling status
64 * Return 0 - if the request was handled
65 * 1 - if the request wasn't handles
66 * error code on error
68 * Adapted from drivers/usb/gadget/udc/dummy_hcd.c
70 static int handle_control_request(struct vudc *udc, struct urb *urb,
71 struct usb_ctrlrequest *setup,
72 int *status)
74 struct vep *ep2;
75 int ret_val = 1;
76 unsigned w_index;
77 unsigned w_value;
79 w_index = le16_to_cpu(setup->wIndex);
80 w_value = le16_to_cpu(setup->wValue);
81 switch (setup->bRequest) {
82 case USB_REQ_SET_ADDRESS:
83 if (setup->bRequestType != DEV_REQUEST)
84 break;
85 udc->address = w_value;
86 ret_val = 0;
87 *status = 0;
88 break;
89 case USB_REQ_SET_FEATURE:
90 if (setup->bRequestType == DEV_REQUEST) {
91 ret_val = 0;
92 switch (w_value) {
93 case USB_DEVICE_REMOTE_WAKEUP:
94 break;
95 case USB_DEVICE_B_HNP_ENABLE:
96 udc->gadget.b_hnp_enable = 1;
97 break;
98 case USB_DEVICE_A_HNP_SUPPORT:
99 udc->gadget.a_hnp_support = 1;
100 break;
101 case USB_DEVICE_A_ALT_HNP_SUPPORT:
102 udc->gadget.a_alt_hnp_support = 1;
103 break;
104 default:
105 ret_val = -EOPNOTSUPP;
107 if (ret_val == 0) {
108 udc->devstatus |= (1 << w_value);
109 *status = 0;
111 } else if (setup->bRequestType == EP_REQUEST) {
112 /* endpoint halt */
113 ep2 = vudc_find_endpoint(udc, w_index);
114 if (!ep2 || ep2->ep.name == udc->ep[0].ep.name) {
115 ret_val = -EOPNOTSUPP;
116 break;
118 ep2->halted = 1;
119 ret_val = 0;
120 *status = 0;
122 break;
123 case USB_REQ_CLEAR_FEATURE:
124 if (setup->bRequestType == DEV_REQUEST) {
125 ret_val = 0;
126 switch (w_value) {
127 case USB_DEVICE_REMOTE_WAKEUP:
128 w_value = USB_DEVICE_REMOTE_WAKEUP;
129 break;
131 case USB_DEVICE_U1_ENABLE:
132 case USB_DEVICE_U2_ENABLE:
133 case USB_DEVICE_LTM_ENABLE:
134 ret_val = -EOPNOTSUPP;
135 break;
136 default:
137 ret_val = -EOPNOTSUPP;
138 break;
140 if (ret_val == 0) {
141 udc->devstatus &= ~(1 << w_value);
142 *status = 0;
144 } else if (setup->bRequestType == EP_REQUEST) {
145 /* endpoint halt */
146 ep2 = vudc_find_endpoint(udc, w_index);
147 if (!ep2) {
148 ret_val = -EOPNOTSUPP;
149 break;
151 if (!ep2->wedged)
152 ep2->halted = 0;
153 ret_val = 0;
154 *status = 0;
156 break;
157 case USB_REQ_GET_STATUS:
158 if (setup->bRequestType == DEV_INREQUEST
159 || setup->bRequestType == INTF_INREQUEST
160 || setup->bRequestType == EP_INREQUEST) {
161 char *buf;
163 * device: remote wakeup, selfpowered
164 * interface: nothing
165 * endpoint: halt
167 buf = (char *)urb->transfer_buffer;
168 if (urb->transfer_buffer_length > 0) {
169 if (setup->bRequestType == EP_INREQUEST) {
170 ep2 = vudc_find_endpoint(udc, w_index);
171 if (!ep2) {
172 ret_val = -EOPNOTSUPP;
173 break;
175 buf[0] = ep2->halted;
176 } else if (setup->bRequestType ==
177 DEV_INREQUEST) {
178 buf[0] = (u8)udc->devstatus;
179 } else
180 buf[0] = 0;
182 if (urb->transfer_buffer_length > 1)
183 buf[1] = 0;
184 urb->actual_length = min_t(u32, 2,
185 urb->transfer_buffer_length);
186 ret_val = 0;
187 *status = 0;
189 break;
191 return ret_val;
194 /* Adapted from dummy_hcd.c ; caller must hold lock */
195 static int transfer(struct vudc *udc,
196 struct urb *urb, struct vep *ep, int limit)
198 struct vrequest *req;
199 int sent = 0;
200 top:
201 /* if there's no request queued, the device is NAKing; return */
202 list_for_each_entry(req, &ep->req_queue, req_entry) {
203 unsigned host_len, dev_len, len;
204 void *ubuf_pos, *rbuf_pos;
205 int is_short, to_host;
206 int rescan = 0;
209 * 1..N packets of ep->ep.maxpacket each ... the last one
210 * may be short (including zero length).
212 * writer can send a zlp explicitly (length 0) or implicitly
213 * (length mod maxpacket zero, and 'zero' flag); they always
214 * terminate reads.
216 host_len = urb->transfer_buffer_length - urb->actual_length;
217 dev_len = req->req.length - req->req.actual;
218 len = min(host_len, dev_len);
220 to_host = usb_pipein(urb->pipe);
221 if (unlikely(len == 0))
222 is_short = 1;
223 else {
224 /* send multiple of maxpacket first, then remainder */
225 if (len >= ep->ep.maxpacket) {
226 is_short = 0;
227 if (len % ep->ep.maxpacket > 0)
228 rescan = 1;
229 len -= len % ep->ep.maxpacket;
230 } else {
231 is_short = 1;
234 ubuf_pos = urb->transfer_buffer + urb->actual_length;
235 rbuf_pos = req->req.buf + req->req.actual;
237 if (urb->pipe & USB_DIR_IN)
238 memcpy(ubuf_pos, rbuf_pos, len);
239 else
240 memcpy(rbuf_pos, ubuf_pos, len);
242 urb->actual_length += len;
243 req->req.actual += len;
244 sent += len;
248 * short packets terminate, maybe with overflow/underflow.
249 * it's only really an error to write too much.
251 * partially filling a buffer optionally blocks queue advances
252 * (so completion handlers can clean up the queue) but we don't
253 * need to emulate such data-in-flight.
255 if (is_short) {
256 if (host_len == dev_len) {
257 req->req.status = 0;
258 urb->status = 0;
259 } else if (to_host) {
260 req->req.status = 0;
261 if (dev_len > host_len)
262 urb->status = -EOVERFLOW;
263 else
264 urb->status = 0;
265 } else {
266 urb->status = 0;
267 if (host_len > dev_len)
268 req->req.status = -EOVERFLOW;
269 else
270 req->req.status = 0;
273 /* many requests terminate without a short packet */
274 /* also check if we need to send zlp */
275 } else {
276 if (req->req.length == req->req.actual) {
277 if (req->req.zero && to_host)
278 rescan = 1;
279 else
280 req->req.status = 0;
282 if (urb->transfer_buffer_length == urb->actual_length) {
283 if (urb->transfer_flags & URB_ZERO_PACKET &&
284 !to_host)
285 rescan = 1;
286 else
287 urb->status = 0;
291 /* device side completion --> continuable */
292 if (req->req.status != -EINPROGRESS) {
294 list_del_init(&req->req_entry);
295 spin_unlock(&udc->lock);
296 usb_gadget_giveback_request(&ep->ep, &req->req);
297 spin_lock(&udc->lock);
299 /* requests might have been unlinked... */
300 rescan = 1;
303 /* host side completion --> terminate */
304 if (urb->status != -EINPROGRESS)
305 break;
307 /* rescan to continue with any other queued i/o */
308 if (rescan)
309 goto top;
311 return sent;
314 static void v_timer(unsigned long _vudc)
316 struct vudc *udc = (struct vudc *) _vudc;
317 struct transfer_timer *timer = &udc->tr_timer;
318 struct urbp *urb_p, *tmp;
319 unsigned long flags;
320 struct usb_ep *_ep;
321 struct vep *ep;
322 int ret = 0;
323 int total, limit;
325 spin_lock_irqsave(&udc->lock, flags);
327 total = get_frame_limit(udc->gadget.speed);
328 if (total < 0) { /* unknown speed, or not set yet */
329 timer->state = VUDC_TR_IDLE;
330 spin_unlock_irqrestore(&udc->lock, flags);
331 return;
333 /* is it next frame now? */
334 if (time_after(jiffies, timer->frame_start + msecs_to_jiffies(1))) {
335 timer->frame_limit = total;
336 /* FIXME: how to make it accurate? */
337 timer->frame_start = jiffies;
338 } else {
339 total = timer->frame_limit;
342 /* We have to clear ep0 flags separately as it's not on the list */
343 udc->ep[0].already_seen = 0;
344 list_for_each_entry(_ep, &udc->gadget.ep_list, ep_list) {
345 ep = to_vep(_ep);
346 ep->already_seen = 0;
349 restart:
350 list_for_each_entry_safe(urb_p, tmp, &udc->urb_queue, urb_entry) {
351 struct urb *urb = urb_p->urb;
353 ep = urb_p->ep;
354 if (urb->unlinked)
355 goto return_urb;
356 if (timer->state != VUDC_TR_RUNNING)
357 continue;
359 if (!ep) {
360 urb->status = -EPROTO;
361 goto return_urb;
364 /* Used up bandwidth? */
365 if (total <= 0 && ep->type == USB_ENDPOINT_XFER_BULK)
366 continue;
368 if (ep->already_seen)
369 continue;
370 ep->already_seen = 1;
371 if (ep == &udc->ep[0] && urb_p->new) {
372 ep->setup_stage = 1;
373 urb_p->new = 0;
375 if (ep->halted && !ep->setup_stage) {
376 urb->status = -EPIPE;
377 goto return_urb;
380 if (ep == &udc->ep[0] && ep->setup_stage) {
381 /* TODO - flush any stale requests */
382 ep->setup_stage = 0;
383 ep->halted = 0;
385 ret = handle_control_request(udc, urb,
386 (struct usb_ctrlrequest *) urb->setup_packet,
387 (&urb->status));
388 if (ret > 0) {
389 spin_unlock(&udc->lock);
390 ret = udc->driver->setup(&udc->gadget,
391 (struct usb_ctrlrequest *)
392 urb->setup_packet);
393 spin_lock(&udc->lock);
395 if (ret >= 0) {
396 /* no delays (max 64kb data stage) */
397 limit = 64 * 1024;
398 goto treat_control_like_bulk;
399 } else {
400 urb->status = -EPIPE;
401 urb->actual_length = 0;
402 goto return_urb;
406 limit = total;
407 switch (ep->type) {
408 case USB_ENDPOINT_XFER_ISOC:
409 /* TODO: support */
410 urb->status = -EXDEV;
411 break;
413 case USB_ENDPOINT_XFER_INT:
415 * TODO: figure out bandwidth guarantees
416 * for now, give unlimited bandwidth
418 limit += urb->transfer_buffer_length;
419 /* fallthrough */
420 default:
421 treat_control_like_bulk:
422 total -= transfer(udc, urb, ep, limit);
424 if (urb->status == -EINPROGRESS)
425 continue;
427 return_urb:
428 if (ep)
429 ep->already_seen = ep->setup_stage = 0;
431 spin_lock(&udc->lock_tx);
432 list_del(&urb_p->urb_entry);
433 if (!urb->unlinked) {
434 v_enqueue_ret_submit(udc, urb_p);
435 } else {
436 v_enqueue_ret_unlink(udc, urb_p->seqnum,
437 urb->unlinked);
438 free_urbp_and_urb(urb_p);
440 wake_up(&udc->tx_waitq);
441 spin_unlock(&udc->lock_tx);
443 goto restart;
446 /* TODO - also wait on empty usb_request queues? */
447 if (list_empty(&udc->urb_queue))
448 timer->state = VUDC_TR_IDLE;
449 else
450 mod_timer(&timer->timer,
451 timer->frame_start + msecs_to_jiffies(1));
453 spin_unlock_irqrestore(&udc->lock, flags);
456 /* All timer functions are run with udc->lock held */
458 void v_init_timer(struct vudc *udc)
460 struct transfer_timer *t = &udc->tr_timer;
462 setup_timer(&t->timer, v_timer, (unsigned long) udc);
463 t->state = VUDC_TR_STOPPED;
466 void v_start_timer(struct vudc *udc)
468 struct transfer_timer *t = &udc->tr_timer;
470 dev_dbg(&udc->pdev->dev, "timer start");
471 switch (t->state) {
472 case VUDC_TR_RUNNING:
473 return;
474 case VUDC_TR_IDLE:
475 return v_kick_timer(udc, jiffies);
476 case VUDC_TR_STOPPED:
477 t->state = VUDC_TR_IDLE;
478 t->frame_start = jiffies;
479 t->frame_limit = get_frame_limit(udc->gadget.speed);
480 return v_kick_timer(udc, jiffies);
484 void v_kick_timer(struct vudc *udc, unsigned long time)
486 struct transfer_timer *t = &udc->tr_timer;
488 dev_dbg(&udc->pdev->dev, "timer kick");
489 switch (t->state) {
490 case VUDC_TR_RUNNING:
491 return;
492 case VUDC_TR_IDLE:
493 t->state = VUDC_TR_RUNNING;
494 /* fallthrough */
495 case VUDC_TR_STOPPED:
496 /* we may want to kick timer to unqueue urbs */
497 mod_timer(&t->timer, time);
501 void v_stop_timer(struct vudc *udc)
503 struct transfer_timer *t = &udc->tr_timer;
505 /* timer itself will take care of stopping */
506 dev_dbg(&udc->pdev->dev, "timer stop");
507 t->state = VUDC_TR_STOPPED;