3 * Gerry Hamel, geh@ti.com, Texas Instruments
6 * linux/drivers/usbd/usbd.c.c - USB Device Core Layer
8 * Copyright (c) 2000, 2001, 2002 Lineo
9 * Copyright (c) 2001 Hewlett Packard
12 * Stuart Lynne <sl@lineo.com>,
13 * Tom Rushworth <tbr@lineo.com>,
14 * Bruce Balden <balden@lineo.com>
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.
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.
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.
35 #define MAX_INTERFACES 2
40 /* Global variables ************************************************************************** */
42 struct usb_string_descriptor **usb_strings;
46 extern struct usb_function_driver ep0_driver;
48 int registered_functions;
49 int registered_devices;
51 char *usbd_device_events[] = {
55 "DEVICE_HUB_CONFIGURED",
57 "DEVICE_ADDRESS_ASSIGNED",
59 "DEVICE_SET_INTERFACE",
61 "DEVICE_CLEAR_FEATURE",
62 "DEVICE_DE_CONFIGURED",
63 "DEVICE_BUS_INACTIVE",
64 "DEVICE_BUS_ACTIVITY",
65 "DEVICE_POWER_INTERRUPTION",
68 "DEVICE_FUNCTION_PRIVATE",
71 char *usbd_device_states[] = {
82 char *usbd_device_requests[] = {
84 "CLEAR FEATURE", /* 1 */
86 "SET FEATURE", /* 3 */
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 */
98 char *usbd_device_descriptors[] = {
105 "DEVICE QUALIFIER", /* 6 */
106 "OTHER SPEED", /* 7 */
107 "INTERFACE POWER", /* 8 */
110 char *usbd_device_status[] = {
118 /* Descriptor support functions ************************************************************** */
122 * usbd_get_string - find and return a string descriptor
123 * @index: string index to return
125 * Find an indexed string and return a pointer to a it.
127 struct usb_string_descriptor *usbd_get_string (__u8 index)
129 if (index >= maxstrings) {
132 return usb_strings[index];
136 /* Access to device descriptor functions ***************************************************** */
140 * usbd_device_configuration_instance - find a configuration instance for this device
142 * @configuration: index to configuration, 0 - N-1
144 * Get specifed device configuration. Index should be bConfigurationValue-1.
146 static struct usb_configuration_instance *usbd_device_configuration_instance (struct usb_device_instance *device,
147 unsigned int port, unsigned int configuration)
149 if (configuration >= device->configurations)
152 return device->configuration_instance_array + configuration;
157 * usbd_device_interface_instance
159 * @configuration: index to configuration, 0 - N-1
160 * @interface: index to interface
162 * Return the specified interface descriptor for the specified device.
164 struct usb_interface_instance *usbd_device_interface_instance (struct usb_device_instance *device, int port, int configuration, int interface)
166 struct usb_configuration_instance *configuration_instance;
168 if ((configuration_instance = usbd_device_configuration_instance (device, port, configuration)) == NULL) {
171 if (interface >= configuration_instance->interfaces) {
174 return configuration_instance->interface_instance_array + interface;
178 * usbd_device_alternate_descriptor_list
180 * @configuration: index to configuration, 0 - N-1
181 * @interface: index to interface
182 * @alternate: alternate setting
184 * Return the specified alternate descriptor for the specified device.
186 struct usb_alternate_instance *usbd_device_alternate_instance (struct usb_device_instance *device, int port, int configuration, int interface, int alternate)
188 struct usb_interface_instance *interface_instance;
190 if ((interface_instance = usbd_device_interface_instance (device, port, configuration, interface)) == NULL) {
194 if (alternate >= interface_instance->alternates) {
198 return interface_instance->alternates_instance_array + alternate;
203 * usbd_device_device_descriptor
204 * @device: which device
205 * @configuration: index to configuration, 0 - N-1
208 * Return the specified configuration descriptor for the specified device.
210 struct usb_device_descriptor *usbd_device_device_descriptor (struct usb_device_instance *device, int port)
212 return (device->device_descriptor);
217 * usbd_device_configuration_descriptor
218 * @device: which device
220 * @configuration: index to configuration, 0 - N-1
222 * Return the specified configuration descriptor for the specified device.
224 struct usb_configuration_descriptor *usbd_device_configuration_descriptor (struct
226 *device, int port, int configuration)
228 struct usb_configuration_instance *configuration_instance;
229 if (!(configuration_instance = usbd_device_configuration_instance (device, port, configuration))) {
232 return (configuration_instance->configuration_descriptor);
237 * usbd_device_interface_descriptor
238 * @device: which device
240 * @configuration: index to configuration, 0 - N-1
241 * @interface: index to interface
242 * @alternate: alternate setting
244 * Return the specified interface descriptor for the specified device.
246 struct usb_interface_descriptor *usbd_device_interface_descriptor (struct usb_device_instance
247 *device, int port, int configuration, int interface, int alternate)
249 struct usb_interface_instance *interface_instance;
250 if (!(interface_instance = usbd_device_interface_instance (device, port, configuration, interface))) {
253 if ((alternate < 0) || (alternate >= interface_instance->alternates)) {
256 return (interface_instance->alternates_instance_array[alternate].interface_descriptor);
260 * usbd_device_endpoint_descriptor_index
261 * @device: which device
263 * @configuration: index to configuration, 0 - N-1
264 * @interface: index to interface
265 * @alternate: index setting
266 * @index: which index
268 * Return the specified endpoint descriptor for the specified device.
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)
273 struct usb_alternate_instance *alternate_instance;
275 if (!(alternate_instance = usbd_device_alternate_instance (device, port, configuration, interface, alternate))) {
278 if (index >= alternate_instance->endpoints) {
281 return *(alternate_instance->endpoints_descriptor_array + index);
286 * usbd_device_endpoint_transfersize
287 * @device: which device
289 * @configuration: index to configuration, 0 - N-1
290 * @interface: index to interface
291 * @index: which index
293 * Return the specified endpoint transfer size;
295 int usbd_device_endpoint_transfersize (struct usb_device_instance *device, int port, int configuration, int interface, int alternate, int index)
297 struct usb_alternate_instance *alternate_instance;
299 if (!(alternate_instance = usbd_device_alternate_instance (device, port, configuration, interface, alternate))) {
302 if (index >= alternate_instance->endpoints) {
305 return *(alternate_instance->endpoint_transfersize_array + index);
310 * usbd_device_endpoint_descriptor
311 * @device: which device
313 * @configuration: index to configuration, 0 - N-1
314 * @interface: index to interface
315 * @alternate: alternate setting
316 * @endpoint: which endpoint
318 * Return the specified endpoint descriptor for the specified device.
320 struct usb_endpoint_descriptor *usbd_device_endpoint_descriptor (struct usb_device_instance *device, int port, int configuration, int interface, int alternate, int endpoint)
322 struct usb_endpoint_descriptor *endpoint_descriptor;
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;
334 * usbd_endpoint_halted
335 * @device: point to struct usb_device_instance
336 * @endpoint: endpoint to check
338 * Return non-zero if endpoint is halted.
340 int usbd_endpoint_halted (struct usb_device_instance *device, int endpoint)
342 return (device->status == USB_STATUS_HALT);
347 * usbd_rcv_complete - complete a receive
352 * Called from rcv interrupt to complete.
354 void usbd_rcv_complete(struct usb_endpoint_instance *endpoint, int len, int urb_bad)
359 /*usbdbg("len: %d urb: %p\n", len, endpoint->rcv_urb); */
361 /* if we had an urb then update actual_length, dispatch if neccessary */
362 if ((rcv_urb = endpoint->rcv_urb)) {
364 /*usbdbg("actual: %d buffer: %d\n", */
365 /*rcv_urb->actual_length, rcv_urb->buffer_length); */
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); */
371 /* increment the received data size */
372 rcv_urb->actual_length += len;
375 usberr(" RECV_ERROR actual: %d buffer: %d urb_bad: %d\n",
376 rcv_urb->actual_length, rcv_urb->buffer_length, urb_bad);
378 rcv_urb->actual_length = 0;
379 rcv_urb->status = RECV_ERROR;
382 usberr("no rcv_urb!");
385 usberr("no endpoint!");
391 * usbd_tx_complete - complete a transmit
395 * Called from tx interrupt to complete.
397 void usbd_tx_complete (struct usb_endpoint_instance *endpoint)
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;
408 if( (endpoint->tx_urb->actual_length - endpoint->sent) <= 0 ) {
409 tx_urb->actual_length = 0;
413 /* Remove from active, save for re-use */
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); */
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");
424 if( !endpoint->tx_urb ) {
425 /*usbdbg("taking urb from done list"); */
426 endpoint->tx_urb = first_urb_detached(&endpoint->done);
428 if( !endpoint->tx_urb ) {
429 usbdbg("allocating new urb for tx_urb");
430 endpoint->tx_urb = usbd_alloc_urb(tx_urb->device, endpoint);
437 /* URB linked list functions ***************************************************** */
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.
444 void urb_link_init (urb_link * ul)
447 ul->prev = ul->next = ul;
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.
457 void urb_detach (struct urb *urb)
460 urb_link *ul = &urb->link;
461 ul->next->prev = ul->prev;
462 ul->prev->next = ul->next;
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
473 urb_link *first_urb_link (urb_link * hd)
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). */
481 /* The list is empty */
486 * Return the first urb in a list with a distinguished
487 * head "hd", or NULL if the list is empty.
489 struct urb *first_urb (urb_link * hd)
492 if (NULL == (nx = first_urb_link (hd))) {
493 /* The list is empty */
496 return (p2surround (struct urb, link, nx));
500 * Detach and return the first urb in a list with a distinguished
501 * head "hd", or NULL if the list is empty.
504 struct urb *first_urb_detached (urb_link * hd)
507 if ((urb = first_urb (hd))) {
515 * Append an urb_link (or a whole list of
516 * urb_links) to the tail of another list
519 void urb_append (urb_link * hd, struct urb *urb)
522 urb_link *new = &urb->link;
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;
536 /* URB create/destroy functions ***************************************************** */
539 * usbd_alloc_urb - allocate an URB appropriate for specified endpoint
540 * @device: device instance
541 * @endpoint: endpoint
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
547 * NOTE: endpoint_address MUST contain a direction flag.
549 struct urb *usbd_alloc_urb (struct usb_device_instance *device,
550 struct usb_endpoint_instance *endpoint)
554 if (!(urb = (struct urb *) malloc (sizeof (struct urb)))) {
555 usberr (" F A T A L: malloc(%zu) FAILED!!!!",
556 sizeof (struct urb));
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);
567 urb_link_init (&urb->link);
573 * usbd_dealloc_urb - deallocate an URB and associated buffer
574 * @urb: pointer to an urb structure
576 * Deallocate an urb structure and associated data.
578 void usbd_dealloc_urb (struct urb *urb)
585 /* Event signaling functions ***************************************************** */
588 * usbd_device_event - called to respond to various usb events
589 * @device: pointer to struct device
590 * @event: event to respond to
592 * Used by a Bus driver to indicate an event.
594 void usbd_device_event_irq (struct usb_device_instance *device, usb_device_event_t event, int data)
596 usb_device_state_t state;
598 if (!device || !device->bus) {
599 usberr("(%p,%d) NULL device or device->bus", device, event);
603 state = device->device_state;
605 usbinfo("%s", usbd_device_events[event]);
611 device->device_state = STATE_INIT;
615 device->device_state = STATE_ATTACHED;
618 case DEVICE_HUB_CONFIGURED:
619 device->device_state = STATE_POWERED;
623 device->device_state = STATE_DEFAULT;
627 case DEVICE_ADDRESS_ASSIGNED:
628 device->device_state = STATE_ADDRESSED;
631 case DEVICE_CONFIGURED:
632 device->device_state = STATE_CONFIGURED;
635 case DEVICE_DE_CONFIGURED:
636 device->device_state = STATE_ADDRESSED;
639 case DEVICE_BUS_INACTIVE:
640 if (device->status != USBD_CLOSING) {
641 device->status = USBD_SUSPENDED;
644 case DEVICE_BUS_ACTIVITY:
645 if (device->status != USBD_CLOSING) {
646 device->status = USBD_OK;
650 case DEVICE_SET_INTERFACE:
652 case DEVICE_SET_FEATURE:
654 case DEVICE_CLEAR_FEATURE:
657 case DEVICE_POWER_INTERRUPTION:
658 device->device_state = STATE_POWERED;
660 case DEVICE_HUB_RESET:
661 device->device_state = STATE_ATTACHED;
664 device->device_state = STATE_UNKNOWN;
667 case DEVICE_FUNCTION_PRIVATE:
671 usbdbg("event %d - not handled",event);
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); */
678 /* tell the bus interface driver */
679 if( device->event ) {
680 /* usbdbg("calling device->event"); */
681 device->event(device, event, data);