Linux Audio

Check our new training course

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