xref: /openbmc/u-boot/drivers/usb/gadget/core.c (revision efc05ae1)
1 /*
2  * (C) Copyright 2003
3  * Gerry Hamel, geh@ti.com, Texas Instruments
4  *
5  * Based on
6  * linux/drivers/usbd/usbd.c.c - USB Device Core Layer
7  *
8  * Copyright (c) 2000, 2001, 2002 Lineo
9  * Copyright (c) 2001 Hewlett Packard
10  *
11  * By:
12  *	Stuart Lynne <sl@lineo.com>,
13  *	Tom Rushworth <tbr@lineo.com>,
14  *	Bruce Balden <balden@lineo.com>
15  *
16  * This program is free software; you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License as published by
18  * the Free Software Foundation; either version 2 of the License, or
19  * (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program; if not, write to the Free Software
28  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29  *
30  */
31 
32 #include <malloc.h>
33 #include <usbdevice.h>
34 
35 #define MAX_INTERFACES 2
36 
37 
38 int maxstrings = 20;
39 
40 /* Global variables ************************************************************************** */
41 
42 struct usb_string_descriptor **usb_strings;
43 
44 int usb_devices;
45 
46 extern struct usb_function_driver ep0_driver;
47 
48 int registered_functions;
49 int registered_devices;
50 
51 char *usbd_device_events[] = {
52 	"DEVICE_UNKNOWN",
53 	"DEVICE_INIT",
54 	"DEVICE_CREATE",
55 	"DEVICE_HUB_CONFIGURED",
56 	"DEVICE_RESET",
57 	"DEVICE_ADDRESS_ASSIGNED",
58 	"DEVICE_CONFIGURED",
59 	"DEVICE_SET_INTERFACE",
60 	"DEVICE_SET_FEATURE",
61 	"DEVICE_CLEAR_FEATURE",
62 	"DEVICE_DE_CONFIGURED",
63 	"DEVICE_BUS_INACTIVE",
64 	"DEVICE_BUS_ACTIVITY",
65 	"DEVICE_POWER_INTERRUPTION",
66 	"DEVICE_HUB_RESET",
67 	"DEVICE_DESTROY",
68 	"DEVICE_FUNCTION_PRIVATE",
69 };
70 
71 char *usbd_device_states[] = {
72 	"STATE_INIT",
73 	"STATE_CREATED",
74 	"STATE_ATTACHED",
75 	"STATE_POWERED",
76 	"STATE_DEFAULT",
77 	"STATE_ADDRESSED",
78 	"STATE_CONFIGURED",
79 	"STATE_UNKNOWN",
80 };
81 
82 char *usbd_device_requests[] = {
83 	"GET STATUS",		/* 0 */
84 	"CLEAR FEATURE",	/* 1 */
85 	"RESERVED",		/* 2 */
86 	"SET FEATURE",		/* 3 */
87 	"RESERVED",		/* 4 */
88 	"SET ADDRESS",		/* 5 */
89 	"GET DESCRIPTOR",	/* 6 */
90 	"SET DESCRIPTOR",	/* 7 */
91 	"GET CONFIGURATION",	/* 8 */
92 	"SET CONFIGURATION",	/* 9 */
93 	"GET INTERFACE",	/* 10 */
94 	"SET INTERFACE",	/* 11 */
95 	"SYNC FRAME",		/* 12 */
96 };
97 
98 char *usbd_device_descriptors[] = {
99 	"UNKNOWN",		/* 0 */
100 	"DEVICE",		/* 1 */
101 	"CONFIG",		/* 2 */
102 	"STRING",		/* 3 */
103 	"INTERFACE",		/* 4 */
104 	"ENDPOINT",		/* 5 */
105 	"DEVICE QUALIFIER",	/* 6 */
106 	"OTHER SPEED",		/* 7 */
107 	"INTERFACE POWER",	/* 8 */
108 };
109 
110 char *usbd_device_status[] = {
111 	"USBD_OPENING",
112 	"USBD_OK",
113 	"USBD_SUSPENDED",
114 	"USBD_CLOSING",
115 };
116 
117 
118 /* Descriptor support functions ************************************************************** */
119 
120 
121 /**
122  * usbd_get_string - find and return a string descriptor
123  * @index: string index to return
124  *
125  * Find an indexed string and return a pointer to a it.
126  */
127 struct usb_string_descriptor *usbd_get_string (__u8 index)
128 {
129 	if (index >= maxstrings) {
130 		return NULL;
131 	}
132 	return usb_strings[index];
133 }
134 
135 
136 /* Access to device descriptor functions ***************************************************** */
137 
138 
139 /* *
140  * usbd_device_configuration_instance - find a configuration instance for this device
141  * @device:
142  * @configuration: index to configuration, 0 - N-1
143  *
144  * Get specifed device configuration. Index should be bConfigurationValue-1.
145  */
146 static struct usb_configuration_instance *usbd_device_configuration_instance (struct usb_device_instance *device,
147 		unsigned int port, unsigned int configuration)
148 {
149 	if (configuration >= device->configurations)
150 		return NULL;
151 
152 	return device->configuration_instance_array + configuration;
153 }
154 
155 
156 /* *
157  * usbd_device_interface_instance
158  * @device:
159  * @configuration: index to configuration, 0 - N-1
160  * @interface: index to interface
161  *
162  * Return the specified interface descriptor for the specified device.
163  */
164 struct usb_interface_instance *usbd_device_interface_instance (struct usb_device_instance *device, int port, int configuration, int interface)
165 {
166 	struct usb_configuration_instance *configuration_instance;
167 
168 	if ((configuration_instance = usbd_device_configuration_instance (device, port, configuration)) == NULL) {
169 		return NULL;
170 	}
171 	if (interface >= configuration_instance->interfaces) {
172 		return NULL;
173 	}
174 	return configuration_instance->interface_instance_array + interface;
175 }
176 
177 /* *
178  * usbd_device_alternate_descriptor_list
179  * @device:
180  * @configuration: index to configuration, 0 - N-1
181  * @interface: index to interface
182  * @alternate: alternate setting
183  *
184  * Return the specified alternate descriptor for the specified device.
185  */
186 struct usb_alternate_instance *usbd_device_alternate_instance (struct usb_device_instance *device, int port, int configuration, int interface, int alternate)
187 {
188 	struct usb_interface_instance *interface_instance;
189 
190 	if ((interface_instance = usbd_device_interface_instance (device, port, configuration, interface)) == NULL) {
191 		return NULL;
192 	}
193 
194 	if (alternate >= interface_instance->alternates) {
195 		return NULL;
196 	}
197 
198 	return interface_instance->alternates_instance_array + alternate;
199 }
200 
201 
202 /* *
203  * usbd_device_device_descriptor
204  * @device: which device
205  * @configuration: index to configuration, 0 - N-1
206  * @port: which port
207  *
208  * Return the specified configuration descriptor for the specified device.
209  */
210 struct usb_device_descriptor *usbd_device_device_descriptor (struct usb_device_instance *device, int port)
211 {
212 	return (device->device_descriptor);
213 }
214 
215 
216 /**
217  * usbd_device_configuration_descriptor
218  * @device: which device
219  * @port: which port
220  * @configuration: index to configuration, 0 - N-1
221  *
222  * Return the specified configuration descriptor for the specified device.
223  */
224 struct usb_configuration_descriptor *usbd_device_configuration_descriptor (struct
225 									   usb_device_instance
226 									   *device, int port, int configuration)
227 {
228 	struct usb_configuration_instance *configuration_instance;
229 	if (!(configuration_instance = usbd_device_configuration_instance (device, port, configuration))) {
230 		return NULL;
231 	}
232 	return (configuration_instance->configuration_descriptor);
233 }
234 
235 
236 /**
237  * usbd_device_interface_descriptor
238  * @device: which device
239  * @port: which port
240  * @configuration: index to configuration, 0 - N-1
241  * @interface: index to interface
242  * @alternate: alternate setting
243  *
244  * Return the specified interface descriptor for the specified device.
245  */
246 struct usb_interface_descriptor *usbd_device_interface_descriptor (struct usb_device_instance
247 								   *device, int port, int configuration, int interface, int alternate)
248 {
249 	struct usb_interface_instance *interface_instance;
250 	if (!(interface_instance = usbd_device_interface_instance (device, port, configuration, interface))) {
251 		return NULL;
252 	}
253 	if ((alternate < 0) || (alternate >= interface_instance->alternates)) {
254 		return NULL;
255 	}
256 	return (interface_instance->alternates_instance_array[alternate].interface_descriptor);
257 }
258 
259 /**
260  * usbd_device_endpoint_descriptor_index
261  * @device: which device
262  * @port: which port
263  * @configuration: index to configuration, 0 - N-1
264  * @interface: index to interface
265  * @alternate: index setting
266  * @index: which index
267  *
268  * Return the specified endpoint descriptor for the specified device.
269  */
270 struct usb_endpoint_descriptor *usbd_device_endpoint_descriptor_index (struct usb_device_instance
271 								       *device, int port, int configuration, int interface, int alternate, int index)
272 {
273 	struct usb_alternate_instance *alternate_instance;
274 
275 	if (!(alternate_instance = usbd_device_alternate_instance (device, port, configuration, interface, alternate))) {
276 		return NULL;
277 	}
278 	if (index >= alternate_instance->endpoints) {
279 		return NULL;
280 	}
281 	return *(alternate_instance->endpoints_descriptor_array + index);
282 }
283 
284 
285 /**
286  * usbd_device_endpoint_transfersize
287  * @device: which device
288  * @port: which port
289  * @configuration: index to configuration, 0 - N-1
290  * @interface: index to interface
291  * @index: which index
292  *
293  * Return the specified endpoint transfer size;
294  */
295 int usbd_device_endpoint_transfersize (struct usb_device_instance *device, int port, int configuration, int interface, int alternate, int index)
296 {
297 	struct usb_alternate_instance *alternate_instance;
298 
299 	if (!(alternate_instance = usbd_device_alternate_instance (device, port, configuration, interface, alternate))) {
300 		return 0;
301 	}
302 	if (index >= alternate_instance->endpoints) {
303 		return 0;
304 	}
305 	return *(alternate_instance->endpoint_transfersize_array + index);
306 }
307 
308 
309 /**
310  * usbd_device_endpoint_descriptor
311  * @device: which device
312  * @port: which port
313  * @configuration: index to configuration, 0 - N-1
314  * @interface: index to interface
315  * @alternate: alternate setting
316  * @endpoint: which endpoint
317  *
318  * Return the specified endpoint descriptor for the specified device.
319  */
320 struct usb_endpoint_descriptor *usbd_device_endpoint_descriptor (struct usb_device_instance *device, int port, int configuration, int interface, int alternate, int endpoint)
321 {
322 	struct usb_endpoint_descriptor *endpoint_descriptor;
323 	int i;
324 
325 	for (i = 0; !(endpoint_descriptor = usbd_device_endpoint_descriptor_index (device, port, configuration, interface, alternate, i)); i++) {
326 		if (endpoint_descriptor->bEndpointAddress == endpoint) {
327 			return endpoint_descriptor;
328 		}
329 	}
330 	return NULL;
331 }
332 
333 /**
334  * usbd_endpoint_halted
335  * @device: point to struct usb_device_instance
336  * @endpoint: endpoint to check
337  *
338  * Return non-zero if endpoint is halted.
339  */
340 int usbd_endpoint_halted (struct usb_device_instance *device, int endpoint)
341 {
342 	return (device->status == USB_STATUS_HALT);
343 }
344 
345 
346 /**
347  * usbd_rcv_complete - complete a receive
348  * @endpoint:
349  * @len:
350  * @urb_bad:
351  *
352  * Called from rcv interrupt to complete.
353  */
354 void usbd_rcv_complete(struct usb_endpoint_instance *endpoint, int len, int urb_bad)
355 {
356 	if (endpoint) {
357 		struct urb *rcv_urb;
358 
359 		/*usbdbg("len: %d urb: %p\n", len, endpoint->rcv_urb); */
360 
361 		/* if we had an urb then update actual_length, dispatch if neccessary */
362 		if ((rcv_urb = endpoint->rcv_urb)) {
363 
364 			/*usbdbg("actual: %d buffer: %d\n", */
365 			/*rcv_urb->actual_length, rcv_urb->buffer_length); */
366 
367 			/* check the urb is ok, are we adding data less than the packetsize */
368 			if (!urb_bad && (len <= endpoint->rcv_packetSize)) {
369 			  /*usbdbg("updating actual_length by %d\n",len); */
370 
371 				/* increment the received data size */
372 				rcv_urb->actual_length += len;
373 
374 			} else {
375 				usberr(" RECV_ERROR actual: %d buffer: %d urb_bad: %d\n",
376 				       rcv_urb->actual_length, rcv_urb->buffer_length, urb_bad);
377 
378 				rcv_urb->actual_length = 0;
379 				rcv_urb->status = RECV_ERROR;
380 			}
381 		} else {
382 			usberr("no rcv_urb!");
383 		}
384 	} else {
385 		usberr("no endpoint!");
386 	}
387 
388 }
389 
390 /**
391  * usbd_tx_complete - complete a transmit
392  * @endpoint:
393  * @resetart:
394  *
395  * Called from tx interrupt to complete.
396  */
397 void usbd_tx_complete (struct usb_endpoint_instance *endpoint)
398 {
399 	if (endpoint) {
400 		struct urb *tx_urb;
401 
402 		/* if we have a tx_urb advance or reset, finish if complete */
403 		if ((tx_urb = endpoint->tx_urb)) {
404 			int sent = endpoint->last;
405 			endpoint->sent += sent;
406 			endpoint->last -= sent;
407 
408 			if( (endpoint->tx_urb->actual_length - endpoint->sent) <= 0 ) {
409 				tx_urb->actual_length = 0;
410 				endpoint->sent = 0;
411 				endpoint->last = 0;
412 
413 				/* Remove from active, save for re-use */
414 				urb_detach(tx_urb);
415 				urb_append(&endpoint->done, tx_urb);
416 				/*usbdbg("done->next %p, tx_urb %p, done %p", */
417 				/*	 endpoint->done.next, tx_urb, &endpoint->done); */
418 
419 				endpoint->tx_urb = first_urb_detached(&endpoint->tx);
420 				if( endpoint->tx_urb ) {
421 					endpoint->tx_queue--;
422 					usbdbg("got urb from tx list");
423 				}
424 				if( !endpoint->tx_urb ) {
425 					/*usbdbg("taking urb from done list"); */
426 					endpoint->tx_urb = first_urb_detached(&endpoint->done);
427 				}
428 				if( !endpoint->tx_urb ) {
429 					usbdbg("allocating new urb for tx_urb");
430 					endpoint->tx_urb = usbd_alloc_urb(tx_urb->device, endpoint);
431 				}
432 			}
433 		}
434 	}
435 }
436 
437 /* URB linked list functions ***************************************************** */
438 
439 /*
440  * Initialize an urb_link to be a single element list.
441  * If the urb_link is being used as a distinguished list head
442  * the list is empty when the head is the only link in the list.
443  */
444 void urb_link_init (urb_link * ul)
445 {
446 	if (ul) {
447 		ul->prev = ul->next = ul;
448 	}
449 }
450 
451 /*
452  * Detach an urb_link from a list, and set it
453  * up as a single element list, so no dangling
454  * pointers can be followed, and so it can be
455  * joined to another list if so desired.
456  */
457 void urb_detach (struct urb *urb)
458 {
459 	if (urb) {
460 		urb_link *ul = &urb->link;
461 		ul->next->prev = ul->prev;
462 		ul->prev->next = ul->next;
463 		urb_link_init (ul);
464 	}
465 }
466 
467 /*
468  * Return the first urb_link in a list with a distinguished
469  * head "hd", or NULL if the list is empty.  This will also
470  * work as a predicate, returning NULL if empty, and non-NULL
471  * otherwise.
472  */
473 urb_link *first_urb_link (urb_link * hd)
474 {
475 	urb_link *nx;
476 	if (NULL != hd && NULL != (nx = hd->next) && nx != hd) {
477 		/* There is at least one element in the list */
478 		/* (besides the distinguished head). */
479 		return (nx);
480 	}
481 	/* The list is empty */
482 	return (NULL);
483 }
484 
485 /*
486  * Return the first urb in a list with a distinguished
487  * head "hd", or NULL if the list is empty.
488  */
489 struct urb *first_urb (urb_link * hd)
490 {
491 	urb_link *nx;
492 	if (NULL == (nx = first_urb_link (hd))) {
493 		/* The list is empty */
494 		return (NULL);
495 	}
496 	return (p2surround (struct urb, link, nx));
497 }
498 
499 /*
500  * Detach and return the first urb in a list with a distinguished
501  * head "hd", or NULL if the list is empty.
502  *
503  */
504 struct urb *first_urb_detached (urb_link * hd)
505 {
506 	struct urb *urb;
507 	if ((urb = first_urb (hd))) {
508 		urb_detach (urb);
509 	}
510 	return urb;
511 }
512 
513 
514 /*
515  * Append an urb_link (or a whole list of
516  * urb_links) to the tail of another list
517  * of urb_links.
518  */
519 void urb_append (urb_link * hd, struct urb *urb)
520 {
521 	if (hd && urb) {
522 		urb_link *new = &urb->link;
523 
524 		/* This allows the new urb to be a list of urbs, */
525 		/* with new pointing at the first, but the link */
526 		/* must be initialized. */
527 		/* Order is important here... */
528 		urb_link *pul = hd->prev;
529 		new->prev->next = hd;
530 		hd->prev = new->prev;
531 		new->prev = pul;
532 		pul->next = new;
533 	}
534 }
535 
536 /* URB create/destroy functions ***************************************************** */
537 
538 /**
539  * usbd_alloc_urb - allocate an URB appropriate for specified endpoint
540  * @device: device instance
541  * @endpoint: endpoint
542  *
543  * Allocate an urb structure. The usb device urb structure is used to
544  * contain all data associated with a transfer, including a setup packet for
545  * control transfers.
546  *
547  * NOTE: endpoint_address MUST contain a direction flag.
548  */
549 struct urb *usbd_alloc_urb (struct usb_device_instance *device,
550 			    struct usb_endpoint_instance *endpoint)
551 {
552 	struct urb *urb;
553 
554 	if (!(urb = (struct urb *) malloc (sizeof (struct urb)))) {
555 		usberr (" F A T A L:  malloc(%zu) FAILED!!!!",
556 			sizeof (struct urb));
557 		return NULL;
558 	}
559 
560 	/* Fill in known fields */
561 	memset (urb, 0, sizeof (struct urb));
562 	urb->endpoint = endpoint;
563 	urb->device = device;
564 	urb->buffer = (u8 *) urb->buffer_data;
565 	urb->buffer_length = sizeof (urb->buffer_data);
566 
567 	urb_link_init (&urb->link);
568 
569 	return urb;
570 }
571 
572 /**
573  * usbd_dealloc_urb - deallocate an URB and associated buffer
574  * @urb: pointer to an urb structure
575  *
576  * Deallocate an urb structure and associated data.
577  */
578 void usbd_dealloc_urb (struct urb *urb)
579 {
580 	if (urb) {
581 		free (urb);
582 	}
583 }
584 
585 /* Event signaling functions ***************************************************** */
586 
587 /**
588  * usbd_device_event - called to respond to various usb events
589  * @device: pointer to struct device
590  * @event: event to respond to
591  *
592  * Used by a Bus driver to indicate an event.
593  */
594 void usbd_device_event_irq (struct usb_device_instance *device, usb_device_event_t event, int data)
595 {
596 	usb_device_state_t state;
597 
598 	if (!device || !device->bus) {
599 		usberr("(%p,%d) NULL device or device->bus", device, event);
600 		return;
601 	}
602 
603 	state = device->device_state;
604 
605 	usbinfo("%s", usbd_device_events[event]);
606 
607 	switch (event) {
608 	case DEVICE_UNKNOWN:
609 		break;
610 	case DEVICE_INIT:
611 		device->device_state = STATE_INIT;
612 		break;
613 
614 	case DEVICE_CREATE:
615 		device->device_state = STATE_ATTACHED;
616 		break;
617 
618 	case DEVICE_HUB_CONFIGURED:
619 		device->device_state = STATE_POWERED;
620 		break;
621 
622 	case DEVICE_RESET:
623 		device->device_state = STATE_DEFAULT;
624 		device->address = 0;
625 		break;
626 
627 	case DEVICE_ADDRESS_ASSIGNED:
628 		device->device_state = STATE_ADDRESSED;
629 		break;
630 
631 	case DEVICE_CONFIGURED:
632 		device->device_state = STATE_CONFIGURED;
633 		break;
634 
635 	case DEVICE_DE_CONFIGURED:
636 		device->device_state = STATE_ADDRESSED;
637 		break;
638 
639 	case DEVICE_BUS_INACTIVE:
640 		if (device->status != USBD_CLOSING) {
641 			device->status = USBD_SUSPENDED;
642 		}
643 		break;
644 	case DEVICE_BUS_ACTIVITY:
645 		if (device->status != USBD_CLOSING) {
646 			device->status = USBD_OK;
647 		}
648 		break;
649 
650 	case DEVICE_SET_INTERFACE:
651 		break;
652 	case DEVICE_SET_FEATURE:
653 		break;
654 	case DEVICE_CLEAR_FEATURE:
655 		break;
656 
657 	case DEVICE_POWER_INTERRUPTION:
658 		device->device_state = STATE_POWERED;
659 		break;
660 	case DEVICE_HUB_RESET:
661 		device->device_state = STATE_ATTACHED;
662 		break;
663 	case DEVICE_DESTROY:
664 		device->device_state = STATE_UNKNOWN;
665 		break;
666 
667 	case DEVICE_FUNCTION_PRIVATE:
668 		break;
669 
670 	default:
671 		usbdbg("event %d - not handled",event);
672 		break;
673 	}
674 	/*usbdbg("%s event: %d oldstate: %d newstate: %d status: %d address: %d",
675 		device->name, event, state,
676 		device->device_state, device->status, device->address); */
677 
678 	/* tell the bus interface driver */
679 	if( device->event ) {
680 		/* usbdbg("calling device->event"); */
681 		device->event(device, event, data);
682 	}
683 }
684