iPXE
usb.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 * 02110-1301, USA.
18 *
19 * You can also choose to distribute this program under the terms of
20 * the Unmodified Binary Distribution Licence (as given in the file
21 * COPYING.UBDL), provided that you have satisfied its requirements.
22 */
23
24FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25FILE_SECBOOT ( PERMITTED );
26
27#include <stdlib.h>
28#include <stdio.h>
29#include <string.h>
30#include <strings.h>
31#include <unistd.h>
32#include <errno.h>
33#include <assert.h>
34#include <byteswap.h>
35#include <ipxe/usb.h>
36#include <ipxe/cdc.h>
37
38/** @file
39 *
40 * Universal Serial Bus (USB)
41 *
42 */
43
44/** List of USB buses */
46
47/** List of changed ports */
49
50/** List of halted endpoints */
52
53/******************************************************************************
54 *
55 * Utility functions
56 *
57 ******************************************************************************
58 */
59
60/**
61 * Get USB speed name (for debugging)
62 *
63 * @v speed Speed
64 * @ret name Speed name
65 */
66static inline const char * usb_speed_name ( unsigned int speed ) {
67 static const char *exponents[4] = { "", "k", "M", "G" };
68 static char buf[ 10 /* "xxxxxXbps" + NUL */ ];
69 unsigned int mantissa;
70 unsigned int exponent;
71
72 /* Extract mantissa and exponent */
73 mantissa = USB_SPEED_MANTISSA ( speed );
74 exponent = USB_SPEED_EXPONENT ( speed );
75
76 /* Name speed */
77 switch ( speed ) {
78 case USB_SPEED_NONE: return "DETACHED";
79 case USB_SPEED_LOW: return "low";
80 case USB_SPEED_FULL: return "full";
81 case USB_SPEED_HIGH: return "high";
82 case USB_SPEED_SUPER: return "super";
83 default:
84 snprintf ( buf, sizeof ( buf ), "%d%sbps",
85 mantissa, exponents[exponent] );
86 return buf;
87 }
88}
89
90/**
91 * Transcribe USB BCD-coded value (for debugging)
92 *
93 * @v bcd BCD-coded value
94 * @ret string Transcribed value
95 */
96static inline const char * usb_bcd ( uint16_t bcd ) {
97 static char buf[ 6 /* "xx.xx" + NUL */ ];
98 uint8_t high = ( bcd >> 8 );
99 uint8_t low = ( bcd >> 0 );
100
101 snprintf ( buf, sizeof ( buf ), "%x.%02x", high, low );
102 return buf;
103}
104
105/******************************************************************************
106 *
107 * USB descriptors
108 *
109 ******************************************************************************
110 */
111
112/**
113 * Locate USB interface association descriptor
114 *
115 * @v config Configuraton descriptor
116 * @v first First interface number
117 * @ret desc Interface association descriptor, or NULL if not found
118 */
121 *config,
122 unsigned int first ) {
124
125 /* Find a matching interface association descriptor */
126 for_each_config_descriptor ( desc, config ) {
127 if ( ( desc->header.type ==
129 ( desc->first == first ) )
130 return desc;
131 }
132 return NULL;
133}
134
135/**
136 * Locate USB interface descriptor
137 *
138 * @v config Configuraton descriptor
139 * @v interface Interface number
140 * @v alternate Alternate setting
141 * @ret desc Interface descriptor, or NULL if not found
142 */
145 unsigned int interface, unsigned int alternate ) {
147
148 /* Find a matching interface descriptor */
149 for_each_config_descriptor ( desc, config ) {
150 if ( ( desc->header.type == USB_INTERFACE_DESCRIPTOR ) &&
151 ( desc->interface == interface ) &&
152 ( desc->alternate == alternate ) )
153 return desc;
154 }
155 return NULL;
156}
157
158/**
159 * Locate USB endpoint descriptor
160 *
161 * @v config Configuration descriptor
162 * @v interface Interface descriptor
163 * @v type Endpoint (internal) type
164 * @v index Endpoint index
165 * @ret desc Descriptor, or NULL if not found
166 */
170 unsigned int type, unsigned int index ) {
172 unsigned int attributes = ( type & USB_ENDPOINT_ATTR_TYPE_MASK );
173 unsigned int direction = ( type & USB_DIR_IN );
174
175 /* Find a matching endpoint descriptor */
177 if ( ( desc->header.type == USB_ENDPOINT_DESCRIPTOR ) &&
178 ( ( desc->attributes &
180 ( ( desc->endpoint & USB_DIR_IN ) == direction ) &&
181 ( index-- == 0 ) )
182 return desc;
183 }
184 return NULL;
185}
186
187/**
188 * Locate USB endpoint companion descriptor
189 *
190 * @v config Configuration descriptor
191 * @v desc Endpoint descriptor
192 * @ret descx Companion descriptor, or NULL if not found
193 */
196 struct usb_endpoint_descriptor *desc ) {
198
199 /* Get companion descriptor, if present */
200 descx = container_of ( usb_next_descriptor ( &desc->header ),
202 header );
203 return ( ( usb_is_within_config ( config, &descx->header ) &&
205 ? descx : NULL );
206}
207
208/******************************************************************************
209 *
210 * USB endpoint
211 *
212 ******************************************************************************
213 */
214
215/**
216 * Get USB endpoint name (for debugging)
217 *
218 * @v ep USB endpoint
219 * @ret name Endpoint name
220 */
221const char * usb_endpoint_name ( struct usb_endpoint *ep ) {
222 static char buf[ 9 /* "EPxx OUT" + NUL */ ];
223 unsigned int address = ep->address;
224
225 snprintf ( buf, sizeof ( buf ), "EP%d%s",
227 ( address ?
228 ( ( address & USB_ENDPOINT_IN ) ? " IN" : " OUT" ) : "" ));
229 return buf;
230}
231
232/**
233 * Describe USB endpoint from device configuration
234 *
235 * @v ep USB endpoint
236 * @v config Configuration descriptor
237 * @v interface Interface descriptor
238 * @v type Endpoint (internal) type
239 * @v index Endpoint index
240 * @ret rc Return status code
241 */
243 struct usb_configuration_descriptor *config,
245 unsigned int type, unsigned int index ) {
246 struct usb_device *usb = ep->usb;
249 unsigned int sizes;
250 unsigned int burst;
251 unsigned int interval;
252 size_t mtu;
253
254 /* Locate endpoint descriptor */
256 if ( ! desc )
257 return -ENOENT;
258
259 /* Locate companion descriptor, if any */
260 descx = usb_endpoint_companion_descriptor ( config, desc );
261
262 /* Calculate MTU and burst size */
263 sizes = le16_to_cpu ( desc->sizes );
264 mtu = USB_ENDPOINT_MTU ( sizes );
265 burst = ( descx ? descx->burst : USB_ENDPOINT_BURST ( sizes ) );
266
267 /* Calculate interval */
270 if ( usb->speed >= USB_SPEED_HIGH ) {
271 /* 2^(desc->interval-1) is a microframe count */
272 interval = ( 1 << ( desc->interval - 1 ) );
273 } else {
274 /* desc->interval is a (whole) frame count */
275 interval = ( desc->interval << 3 );
276 }
277 } else {
278 /* desc->interval is a microframe count */
279 interval = desc->interval;
280 }
281
282 /* Describe endpoint */
283 usb_endpoint_describe ( ep, desc->endpoint, desc->attributes,
284 mtu, burst, interval );
285 return 0;
286}
287
288/**
289 * Open USB endpoint
290 *
291 * @v ep USB endpoint
292 * @ret rc Return status code
293 */
294int usb_endpoint_open ( struct usb_endpoint *ep ) {
295 struct usb_device *usb = ep->usb;
296 unsigned int idx = USB_ENDPOINT_IDX ( ep->address );
297 int rc;
298
299 /* Populate host controller operations */
300 ep->host = &usb->port->hub->bus->op->endpoint;
301
302 /* Add to endpoint list */
303 if ( usb->ep[idx] != NULL ) {
304 DBGC ( usb, "USB %s %s is already open\n",
305 usb->name, usb_endpoint_name ( ep ) );
306 rc = -EALREADY;
307 goto err_already;
308 }
309 usb->ep[idx] = ep;
311
312 /* Open endpoint */
313 if ( ( rc = ep->host->open ( ep ) ) != 0 ) {
314 DBGC ( usb, "USB %s %s could not open: %s\n", usb->name,
315 usb_endpoint_name ( ep ), strerror ( rc ) );
316 goto err_open;
317 }
318 ep->open = 1;
319
320 DBGC2 ( usb, "USB %s %s opened with MTU %zd, burst %d, interval %d\n",
321 usb->name, usb_endpoint_name ( ep ), ep->mtu, ep->burst,
322 ep->interval );
323 return 0;
324
325 ep->open = 0;
326 ep->host->close ( ep );
327 err_open:
328 usb->ep[idx] = NULL;
329 err_already:
330 if ( ep->max )
331 usb_flush ( ep );
332 return rc;
333}
334
335/**
336 * Clear transaction translator (if applicable)
337 *
338 * @v ep USB endpoint
339 * @ret rc Return status code
340 */
341static int usb_endpoint_clear_tt ( struct usb_endpoint *ep ) {
342 struct usb_device *usb = ep->usb;
343 struct usb_port *tt;
344 int rc;
345
346 /* Do nothing if this is a periodic endpoint */
348 return 0;
349
350 /* Do nothing if this endpoint is not behind a transaction translator */
352 if ( ! tt )
353 return 0;
354
355 /* Clear transaction translator buffer */
356 if ( ( rc = tt->hub->driver->clear_tt ( tt->hub, tt, ep ) ) != 0 ) {
357 DBGC ( usb, "USB %s %s could not clear transaction translator: "
358 "%s\n", usb->name, usb_endpoint_name ( ep ),
359 strerror ( rc ) );
360 return rc;
361 }
362
363 return 0;
364}
365
366/**
367 * Clear endpoint halt (if applicable)
368 *
369 * @v ep USB endpoint
370 * @ret rc Return status code
371 */
373 struct usb_device *usb = ep->usb;
374 unsigned int type;
375 int rc;
376
377 /* Clear transaction translator, if applicable */
378 if ( ( rc = usb_endpoint_clear_tt ( ep ) ) != 0 )
379 return rc;
380
381 /* Clear endpoint halt (if applicable) */
383 if ( ( type != USB_ENDPOINT_ATTR_CONTROL ) &&
386 ep->address ) ) != 0 ) ) {
387 DBGC ( usb, "USB %s %s could not clear endpoint halt: %s\n",
388 usb->name, usb_endpoint_name ( ep ), strerror ( rc ) );
389 return rc;
390 }
391
392 return 0;
393}
394
395/**
396 * Close USB endpoint
397 *
398 * @v ep USB endpoint
399 */
401 struct usb_device *usb = ep->usb;
402 unsigned int idx = USB_ENDPOINT_IDX ( ep->address );
403
404 /* Sanity checks */
405 assert ( usb->ep[idx] == ep );
406
407 /* Close endpoint */
408 ep->open = 0;
409 ep->host->close ( ep );
410 assert ( ep->fill == 0 );
411
412 /* Remove from endpoint list */
413 usb->ep[idx] = NULL;
414 list_del ( &ep->halted );
415
416 /* Discard any recycled buffers, if applicable */
417 if ( ep->max )
418 usb_flush ( ep );
419
420 /* Clear transaction translator, if applicable */
422}
423
424/**
425 * Reset USB endpoint
426 *
427 * @v ep USB endpoint
428 * @ret rc Return status code
429 */
430static int usb_endpoint_reset ( struct usb_endpoint *ep ) {
431 struct usb_device *usb = ep->usb;
432 int rc;
433
434 /* Sanity check */
435 assert ( ! list_empty ( &ep->halted ) );
436
437 /* Clear device halt, if applicable */
438 if ( ( rc = usb_endpoint_clear_halt ( ep ) ) != 0 )
439 return rc;
440
441 /* Reset endpoint */
442 if ( ( rc = ep->host->reset ( ep ) ) != 0 ) {
443 DBGC ( usb, "USB %s %s could not reset: %s\n",
444 usb->name, usb_endpoint_name ( ep ), strerror ( rc ) );
445 return rc;
446 }
447
448 /* Remove from list of halted endpoints */
449 list_del ( &ep->halted );
451
452 DBGC ( usb, "USB %s %s reset\n",
453 usb->name, usb_endpoint_name ( ep ) );
454 return 0;
455}
456
457/**
458 * Update endpoint MTU
459 *
460 * @v ep USB endpoint
461 * @v mtu New MTU
462 * @ret rc Return status code
463 */
464static int usb_endpoint_mtu ( struct usb_endpoint *ep, size_t mtu ) {
465 struct usb_device *usb = ep->usb;
466 int rc;
467
468 /* Update MTU */
469 ep->mtu = mtu;
470 if ( ( rc = ep->host->mtu ( ep ) ) != 0 ) {
471 DBGC ( usb, "USB %s %s could not update MTU: %s\n",
472 usb->name, usb_endpoint_name ( ep ), strerror ( rc ) );
473 return rc;
474 }
475
476 return 0;
477}
478
479/**
480 * Enqueue USB message transfer
481 *
482 * @v ep USB endpoint
483 * @v request Request
484 * @v value Value parameter
485 * @v index Index parameter
486 * @v iobuf I/O buffer
487 * @ret rc Return status code
488 *
489 * The I/O buffer must have sufficient headroom to contain a setup
490 * packet.
491 */
492int usb_message ( struct usb_endpoint *ep, unsigned int request,
493 unsigned int value, unsigned int index,
494 struct io_buffer *iobuf ) {
495 struct usb_device *usb = ep->usb;
496 struct usb_port *port = usb->port;
497 struct usb_setup_packet *packet;
498 size_t len = iob_len ( iobuf );
499 int rc;
500
501 /* Sanity check */
502 assert ( iob_headroom ( iobuf ) >= sizeof ( *packet ) );
503
504 /* Fail immediately if device has been unplugged */
505 if ( port->disconnected )
506 return -ENODEV;
507
508 /* Reset endpoint if required */
509 if ( ( ! list_empty ( &ep->halted ) ) &&
510 ( ( rc = usb_endpoint_reset ( ep ) ) != 0 ) )
511 return rc;
512
513 /* Zero input data buffer (if applicable) */
514 if ( request & USB_DIR_IN )
515 memset ( iobuf->data, 0, len );
516
517 /* Construct setup packet */
518 packet = iob_push ( iobuf, sizeof ( *packet ) );
519 packet->request = cpu_to_le16 ( request );
520 packet->value = cpu_to_le16 ( value );
521 packet->index = cpu_to_le16 ( index );
522 packet->len = cpu_to_le16 ( len );
523
524 /* Enqueue message transfer */
525 if ( ( rc = ep->host->message ( ep, iobuf ) ) != 0 ) {
526 DBGC ( usb, "USB %s %s could not enqueue message transfer: "
527 "%s\n", usb->name, usb_endpoint_name ( ep ),
528 strerror ( rc ) );
529 return rc;
530 }
531
532 /* Increment fill level */
533 ep->fill++;
534
535 return 0;
536}
537
538/**
539 * Enqueue USB stream transfer
540 *
541 * @v ep USB endpoint
542 * @v iobuf I/O buffer
543 * @v terminate Terminate using a short packet
544 * @ret rc Return status code
545 */
546int usb_stream ( struct usb_endpoint *ep, struct io_buffer *iobuf,
547 int terminate ) {
548 struct usb_device *usb = ep->usb;
549 struct usb_port *port = usb->port;
550 int zlp;
551 int rc;
552
553 /* Fail immediately if device has been unplugged */
554 if ( port->disconnected )
555 return -ENODEV;
556
557 /* Reset endpoint if required */
558 if ( ( ! list_empty ( &ep->halted ) ) &&
559 ( ( rc = usb_endpoint_reset ( ep ) ) != 0 ) )
560 return rc;
561
562 /* Append a zero-length packet if necessary */
563 zlp = terminate;
564 if ( iob_len ( iobuf ) & ( ep->mtu - 1 ) )
565 zlp = 0;
566
567 /* Enqueue stream transfer */
568 if ( ( rc = ep->host->stream ( ep, iobuf, zlp ) ) != 0 ) {
569 DBGC ( usb, "USB %s %s could not enqueue stream transfer: %s\n",
570 usb->name, usb_endpoint_name ( ep ), strerror ( rc ) );
571 return rc;
572 }
573
574 /* Increment fill level */
575 ep->fill++;
576
577 return 0;
578}
579
580/**
581 * Complete transfer (possibly with error)
582 *
583 * @v ep USB endpoint
584 * @v iobuf I/O buffer
585 * @v rc Completion status code
586 */
587void usb_complete_err ( struct usb_endpoint *ep, struct io_buffer *iobuf,
588 int rc ) {
589 struct usb_device *usb = ep->usb;
590
591 /* Decrement fill level */
592 assert ( ep->fill > 0 );
593 ep->fill--;
594
595 /* Schedule reset, if applicable */
596 if ( ( rc != 0 ) && ep->open ) {
597 DBGC ( usb, "USB %s %s completion failed: %s\n",
598 usb->name, usb_endpoint_name ( ep ), strerror ( rc ) );
599 list_del ( &ep->halted );
601 }
602
603 /* Report completion */
604 ep->driver->complete ( ep, iobuf, rc );
605}
606
607/******************************************************************************
608 *
609 * Endpoint refilling
610 *
611 ******************************************************************************
612 */
613
614/**
615 * Prefill endpoint recycled buffer list
616 *
617 * @v ep USB endpoint
618 * @ret rc Return status code
619 */
620int usb_prefill ( struct usb_endpoint *ep ) {
621 struct io_buffer *iobuf;
622 size_t reserve = ep->reserve;
623 size_t len = ( ep->len ? ep->len : ep->mtu );
624 unsigned int fill;
625 int rc;
626
627 /* Sanity checks */
628 assert ( ep->fill == 0 );
629 assert ( ep->max > 0 );
630 assert ( list_empty ( &ep->recycled ) );
631
632 /* Fill recycled buffer list */
633 for ( fill = 0 ; fill < ep->max ; fill++ ) {
634
635 /* Allocate I/O buffer */
636 iobuf = alloc_iob ( reserve + len );
637 if ( ! iobuf ) {
638 rc = -ENOMEM;
639 goto err_alloc;
640 }
641 iob_reserve ( iobuf, reserve );
642
643 /* Add to recycled buffer list */
644 list_add_tail ( &iobuf->list, &ep->recycled );
645 }
646
647 return 0;
648
649 err_alloc:
650 usb_flush ( ep );
651 return rc;
652}
653
654/**
655 * Refill endpoint up to specified limit
656 *
657 * @v ep USB endpoint
658 * @v max Fill limit
659 * @ret rc Return status code
660 */
661int usb_refill_limit ( struct usb_endpoint *ep, unsigned int max ) {
662 struct io_buffer *iobuf;
663 size_t reserve = ep->reserve;
664 size_t len = ( ep->len ? ep->len : ep->mtu );
665 int rc;
666
667 /* Sanity checks */
668 assert ( ep->open );
669 assert ( ep->max > 0 );
670
671 /* Refill endpoint */
672 if ( max > ep->max )
673 max = ep->max;
674 while ( ep->fill < max ) {
675
676 /* Get or allocate buffer */
677 if ( list_empty ( &ep->recycled ) ) {
678 /* Recycled buffer list is empty; allocate new buffer */
679 iobuf = alloc_iob ( reserve + len );
680 if ( ! iobuf )
681 return -ENOMEM;
682 iob_reserve ( iobuf, reserve );
683 } else {
684 /* Get buffer from recycled buffer list */
685 iobuf = list_first_entry ( &ep->recycled,
686 struct io_buffer, list );
687 assert ( iobuf != NULL );
688 list_del ( &iobuf->list );
689 }
690
691 /* Reset buffer to maximum size */
692 assert ( iob_len ( iobuf ) <= len );
693 iob_put ( iobuf, ( len - iob_len ( iobuf ) ) );
694
695 /* Enqueue buffer */
696 if ( ( rc = usb_stream ( ep, iobuf, 0 ) ) != 0 ) {
697 list_add ( &iobuf->list, &ep->recycled );
698 return rc;
699 }
700 }
701
702 return 0;
703}
704
705/**
706 * Refill endpoint
707 *
708 * @v ep USB endpoint
709 * @ret rc Return status code
710 */
711int usb_refill ( struct usb_endpoint *ep ) {
712 return usb_refill_limit ( ep, ep->max );
713}
714
715/**
716 * Discard endpoint recycled buffer list
717 *
718 * @v ep USB endpoint
719 */
720void usb_flush ( struct usb_endpoint *ep ) {
721 struct io_buffer *iobuf;
722 struct io_buffer *tmp;
723
724 /* Sanity checks */
725 assert ( ! ep->open );
726 assert ( ep->max > 0 );
727
728 /* Free all I/O buffers */
729 list_for_each_entry_safe ( iobuf, tmp, &ep->recycled, list ) {
730 list_del ( &iobuf->list );
731 free_iob ( iobuf );
732 }
733}
734
735/******************************************************************************
736 *
737 * Control endpoint
738 *
739 ******************************************************************************
740 */
741
742/** USB control transfer pseudo-header */
744 /** Completion status */
745 int rc;
746};
747
748/**
749 * Complete USB control transfer
750 *
751 * @v ep USB endpoint
752 * @v iobuf I/O buffer
753 * @v rc Completion status code
754 */
755static void usb_control_complete ( struct usb_endpoint *ep,
756 struct io_buffer *iobuf, int rc ) {
757 struct usb_device *usb = ep->usb;
758 struct usb_control_pseudo_header *pshdr;
759
760 /* Record completion status in buffer */
761 pshdr = iob_push ( iobuf, sizeof ( *pshdr ) );
762 pshdr->rc = rc;
763
764 /* Add to list of completed I/O buffers */
765 list_add_tail ( &iobuf->list, &usb->complete );
766}
767
768/** USB control endpoint driver operations */
772
773/**
774 * Issue USB control transaction
775 *
776 * @v usb USB device
777 * @v request Request
778 * @v value Value parameter
779 * @v index Index parameter
780 * @v data Data buffer (if any)
781 * @v len Length of data
782 * @ret rc Return status code
783 */
784int usb_control ( struct usb_device *usb, unsigned int request,
785 unsigned int value, unsigned int index, void *data,
786 size_t len ) {
787 struct usb_bus *bus = usb->port->hub->bus;
788 struct usb_endpoint *ep = &usb->control;
789 struct io_buffer *iobuf;
790 struct io_buffer *cmplt;
791 union {
792 struct usb_setup_packet setup;
793 struct usb_control_pseudo_header pshdr;
794 } *headroom;
795 struct usb_control_pseudo_header *pshdr;
796 unsigned int i;
797 int rc;
798
799 /* Allocate I/O buffer */
800 iobuf = alloc_iob ( sizeof ( *headroom ) + len );
801 if ( ! iobuf ) {
802 rc = -ENOMEM;
803 goto err_alloc;
804 }
805 iob_reserve ( iobuf, sizeof ( *headroom ) );
806 iob_put ( iobuf, len );
807 if ( request & USB_DIR_IN ) {
808 memset ( data, 0, len );
809 } else {
810 memcpy ( iobuf->data, data, len );
811 }
812
813 /* Enqueue message */
814 if ( ( rc = usb_message ( ep, request, value, index, iobuf ) ) != 0 )
815 goto err_message;
816
817 /* Wait for completion */
818 for ( i = 0 ; i < USB_CONTROL_MAX_WAIT_MS ; i++ ) {
819
820 /* Poll bus */
821 usb_poll ( bus );
822
823 /* Check for completion */
824 while ( ( cmplt = list_first_entry ( &usb->complete,
825 struct io_buffer,
826 list ) ) ) {
827
828 /* Remove from completion list */
829 list_del ( &cmplt->list );
830
831 /* Extract and strip completion status */
832 pshdr = cmplt->data;
833 iob_pull ( cmplt, sizeof ( *pshdr ) );
834 rc = pshdr->rc;
835
836 /* Discard stale completions */
837 if ( cmplt != iobuf ) {
838 DBGC ( usb, "USB %s stale control completion: "
839 "%s\n", usb->name, strerror ( rc ) );
840 DBGC_HDA ( usb, 0, cmplt->data,
841 iob_len ( cmplt ) );
842 free_iob ( cmplt );
843 continue;
844 }
845
846 /* Fail immediately if completion was in error */
847 if ( rc != 0 ) {
848 DBGC ( usb, "USB %s control %04x:%04x:%04x "
849 "failed: %s\n", usb->name, request,
850 value, index, strerror ( rc ) );
851 free_iob ( cmplt );
852 usb_endpoint_reset ( ep );
853 return rc;
854 }
855
856 /* Copy completion to data buffer, if applicable */
857 assert ( iob_len ( cmplt ) <= len );
858 if ( request & USB_DIR_IN )
859 memcpy ( data, cmplt->data, iob_len ( cmplt ) );
860 free_iob ( cmplt );
861 return 0;
862 }
863
864 /* Delay */
865 mdelay ( 1 );
866 }
867
868 DBGC ( usb, "USB %s timed out waiting for control %04x:%04x:%04x\n",
869 usb->name, request, value, index );
870 return -ETIMEDOUT;
871
872 err_message:
873 free_iob ( iobuf );
874 err_alloc:
875 return rc;
876}
877
878/**
879 * Get default language ID
880 *
881 * @v usb USB device
882 * @ret language Language ID
883 */
884static unsigned int usb_get_default_language ( struct usb_device *usb ) {
885 struct {
887 uint16_t language[1];
888 } __attribute__ (( packed )) desc;
889 unsigned int language;
890 int rc;
891
892 /* Get descriptor */
893 if ( ( rc = usb_get_descriptor ( usb, 0, USB_STRING_DESCRIPTOR, 0, 0,
894 &desc.header, sizeof ( desc ) ) ) !=0){
895 DBGC ( usb, "USB %s has no default language: %s\n",
896 usb->name, strerror ( rc ) );
897 return USB_LANG_ENGLISH;
898 }
899
900 /* Use first language ID */
901 language = le16_to_cpu ( desc.language[0] );
902 DBGC2 ( usb, "USB %s default language %#04x\n", usb->name, language );
903 return language;
904}
905
906/**
907 * Get USB string descriptor
908 *
909 * @v usb USB device
910 * @v index String index
911 * @v language Language ID, or 0 to use default
912 * @v buf Data buffer
913 * @v len Length of buffer
914 * @ret len String length (excluding NUL), or negative error
915 */
916int usb_get_string_descriptor ( struct usb_device *usb, unsigned int index,
917 unsigned int language, char *buf, size_t len ) {
918 struct {
920 uint16_t character[len];
921 } __attribute__ (( packed )) *desc;
922 unsigned int actual;
923 unsigned int i;
924 int rc;
925
926 /* Use default language ID, if applicable */
927 if ( ( language == 0 ) && ( index != 0 ) ) {
928 if ( ! usb->language )
929 usb->language = usb_get_default_language ( usb );
930 language = usb->language;
931 }
932
933 /* Allocate buffer for string */
934 desc = malloc ( sizeof ( *desc ) );
935 if ( ! desc ) {
936 rc = -ENOMEM;
937 goto err_alloc;
938 }
939
940 /* Get descriptor */
942 language, &desc->header,
943 sizeof ( *desc ) ) ) != 0 )
944 goto err_get_descriptor;
945
946 /* Calculate string length */
947 if ( desc->header.len < sizeof ( desc->header ) ) {
948 rc = -EINVAL;
949 goto err_len;
950 }
951 actual = ( ( desc->header.len - sizeof ( desc->header ) ) /
952 sizeof ( desc->character[0] ) );
953
954 /* Copy to buffer */
955 memset ( buf, 0, len );
956 for ( i = 0 ; ( ( i < actual ) && ( i < len ) ) ; i++ )
957 buf[i] = le16_to_cpu ( desc->character[i] );
958
959 /* Free buffer */
960 free ( desc );
961
962 return actual;
963
964 err_len:
965 err_get_descriptor:
966 free ( desc );
967 err_alloc:
968 return rc;
969}
970
971/******************************************************************************
972 *
973 * USB device driver
974 *
975 ******************************************************************************
976 */
977
978/**
979 * Get USB configuration descriptor
980 *
981 * @v usb USB device
982 * @v index Configuration index
983 * @ret config Configuration descriptor
984 * @ret rc Return status code
985 *
986 * The configuration descriptor is dynamically allocated and must
987 * eventually be freed by the caller.
988 */
989static int
990usb_config_descriptor ( struct usb_device *usb, unsigned int index,
991 struct usb_configuration_descriptor **config ) {
992 struct usb_configuration_descriptor partial;
993 size_t len;
994 int rc;
995
996 /* Read first part of configuration descriptor to get size */
997 if ( ( rc = usb_get_config_descriptor ( usb, index, &partial,
998 sizeof ( partial ) ) ) != 0 ) {
999 DBGC ( usb, "USB %s could not get configuration descriptor %d: "
1000 "%s\n", usb->name, index, strerror ( rc ) );
1001 goto err_get_partial;
1002 }
1003 len = le16_to_cpu ( partial.len );
1004 if ( len < sizeof ( partial ) ) {
1005 DBGC ( usb, "USB %s underlength configuraton descriptor %d\n",
1006 usb->name, index );
1007 rc = -EINVAL;
1008 goto err_partial_len;
1009 }
1010
1011 /* Allocate buffer for whole configuration descriptor */
1012 *config = malloc ( len );
1013 if ( ! *config ) {
1014 rc = -ENOMEM;
1015 goto err_alloc_config;
1016 }
1017
1018 /* Read whole configuration descriptor */
1019 if ( ( rc = usb_get_config_descriptor ( usb, index, *config,
1020 len ) ) != 0 ) {
1021 DBGC ( usb, "USB %s could not get configuration descriptor %d: "
1022 "%s\n", usb->name, index, strerror ( rc ) );
1023 goto err_get_config_descriptor;
1024 }
1025 if ( (*config)->len != partial.len ) {
1026 DBGC ( usb, "USB %s bad configuration descriptor %d length\n",
1027 usb->name, index );
1028 rc = -EINVAL;
1029 goto err_config_len;
1030 }
1031
1032 return 0;
1033
1034 err_config_len:
1035 err_get_config_descriptor:
1036 free ( *config );
1037 err_alloc_config:
1038 err_partial_len:
1039 err_get_partial:
1040 return rc;
1041}
1042
1043/**
1044 * Describe USB function
1045 *
1046 * @v usb USB device
1047 * @v config Configuration descriptor
1048 * @v first First interface number
1049 * @v interfaces Interface list to fill in
1050 * @v desc Function descriptor to fill in
1051 * @ret rc Return status code
1052 */
1053static int usb_describe ( struct usb_device *usb,
1055 unsigned int first, uint8_t *interfaces,
1056 struct usb_function_descriptor *desc ) {
1057 struct usb_interface_association_descriptor *association;
1059 struct cdc_union_descriptor *cdc_union;
1060 unsigned int i;
1061
1062 /* Fill in vendor and product ID */
1063 memset ( desc, 0, sizeof ( *desc ) );
1064 desc->vendor = le16_to_cpu ( usb->device.vendor );
1065 desc->product = le16_to_cpu ( usb->device.product );
1066
1067 /* First, look for an interface association descriptor */
1068 association = usb_interface_association_descriptor ( config, first );
1069 if ( association ) {
1070
1071 /* Sanity check */
1072 assert ( association->first == first );
1073 if ( ( first + association->count ) > config->interfaces ) {
1074 DBGC ( usb, "USB %s has invalid association [%d-%d)\n",
1075 usb->name, first, ( first + association->count));
1076 return -ERANGE;
1077 }
1078
1079 /* Describe function */
1080 memcpy ( &desc->class.class, &association->class,
1081 sizeof ( desc->class.class ) );
1082 desc->count = association->count;
1083 for ( i = 0 ; i < association->count ; i++ )
1084 interfaces[i] = ( first + i );
1085 return 0;
1086 }
1087
1088 /* Next, look for an interface descriptor */
1089 interface = usb_interface_descriptor ( config, first, 0 );
1090 if ( ! interface ) {
1091 DBGC ( usb, "USB %s has no descriptor for interface %d\n",
1092 usb->name, first );
1093 return -ENOENT;
1094 }
1095
1096 /* Describe function */
1097 memcpy ( &desc->class.class, &interface->class,
1098 sizeof ( desc->class.class ) );
1099 desc->count = 1;
1100 interfaces[0] = first;
1101
1102 /* Look for a CDC union descriptor, if applicable */
1103 if ( ( desc->class.class.class == USB_CLASS_CDC ) &&
1104 ( cdc_union = cdc_union_descriptor ( config, interface ) ) ) {
1105
1106 /* Determine interface count */
1107 desc->count = ( ( cdc_union->header.len -
1108 offsetof ( typeof ( *cdc_union ),
1109 interface[0] ) ) /
1110 sizeof ( cdc_union->interface[0] ) );
1111 if ( desc->count > config->interfaces ) {
1112 DBGC ( usb, "USB %s has invalid union functional "
1113 "descriptor with %d interfaces\n",
1114 usb->name, desc->count );
1115 return -ERANGE;
1116 }
1117
1118 /* Describe function */
1119 for ( i = 0 ; i < desc->count ; i++ ) {
1120 if ( cdc_union->interface[i] >= config->interfaces ) {
1121 DBGC ( usb, "USB %s has invalid union "
1122 "functional descriptor covering "
1123 "interface %d\n", usb->name,
1124 cdc_union->interface[i] );
1125 return -ERANGE;
1126 }
1127 interfaces[i] = cdc_union->interface[i];
1128 }
1129
1130 return 0;
1131 }
1132
1133 return 0;
1134}
1135
1136/**
1137 * Update list of used interface
1138 *
1139 * @v usb USB device
1140 * @v count Number of interfaces
1141 * @v interface List of interfaces
1142 * @v used List of already-used interfaces
1143 * @ret rc Return status code
1144 */
1145static int usb_used ( struct usb_device *usb, unsigned int count,
1146 uint8_t *interface, uint8_t *used ) {
1147 unsigned int i;
1148
1149 for ( i = 0 ; i < count ; i++ ) {
1150 if ( used[interface[i]] ) {
1151 DBGC ( usb, "USB %s interface %d already in use\n",
1152 usb->name, interface[i] );
1153 return -EINVAL;
1154 }
1155 used[interface[i]] = 1;
1156 }
1157 return 0;
1158}
1159
1160/**
1161 * Find USB device driver
1162 *
1163 * @v desc Function descriptor
1164 * @ret id USB device ID, or NULL
1165 * @ret driver USB device driver, or NULL
1166 */
1168 struct usb_device_id **id ) {
1169 struct usb_driver *driver;
1170 unsigned int i;
1171
1172 /* Look for a matching driver */
1173 for_each_table_entry ( driver, USB_DRIVERS ) {
1174 for ( i = 0 ; i < driver->id_count ; i++ ) {
1175
1176 /* Ignore non-matching driver class */
1177 if ( ( driver->class.class.scalar ^ desc->class.scalar )
1178 & driver->class.mask.scalar )
1179 continue;
1180
1181 /* Look for a matching ID */
1182 *id = &driver->ids[i];
1183 if ( ( ( (*id)->vendor == desc->vendor ) ||
1184 ( (*id)->vendor == USB_ANY_ID ) ) &&
1185 ( ( (*id)->product == desc->product ) ||
1186 ( (*id)->product == USB_ANY_ID ) ) )
1187 return driver;
1188 }
1189 }
1190
1191 /* Not found */
1192 *id = NULL;
1193 return NULL;
1194}
1195
1196/**
1197 * Get USB device configuration score
1198 *
1199 * @v usb USB device
1200 * @v config Configuration descriptor
1201 * @ret score Device configuration score, or negative error
1202 */
1203static int usb_score ( struct usb_device *usb,
1204 struct usb_configuration_descriptor *config ) {
1205 uint8_t used[config->interfaces];
1206 uint8_t interface[config->interfaces];
1208 struct usb_driver *driver;
1209 struct usb_device_id *id;
1210 unsigned int first;
1211 unsigned int score = 0;
1212 int rc;
1213
1214 /* Identify each function in turn */
1215 memset ( used, 0, sizeof ( used ) );
1216 for ( first = 0 ; first < config->interfaces ; first++ ) {
1217
1218 /* Skip interfaces already used */
1219 if ( used[first] )
1220 continue;
1221
1222 /* Describe function */
1223 if ( ( rc = usb_describe ( usb, config, first, interface,
1224 &desc ) ) != 0 )
1225 return rc;
1226
1227 /* Update used interfaces */
1228 if ( ( rc = usb_used ( usb, desc.count, interface,
1229 used ) ) != 0 )
1230 return rc;
1231
1232 /* Look for a driver for this function */
1233 driver = usb_find_driver ( &desc, &id );
1234 if ( driver )
1235 score += driver->score;
1236 }
1237
1238 return score;
1239}
1240
1241/**
1242 * Probe USB device driver
1243 *
1244 * @v func USB function
1245 * @v config Configuration descriptor
1246 * @ret rc Return status code
1247 */
1248static int usb_probe ( struct usb_function *func,
1249 struct usb_configuration_descriptor *config ) {
1250 struct usb_device *usb = func->usb;
1251 struct usb_driver *driver;
1252 struct usb_device_id *id;
1253 int rc;
1254
1255 /* Identify driver */
1256 driver = usb_find_driver ( &func->desc, &id );
1257 if ( ! driver ) {
1258 DBGC ( usb, "USB %s %04x:%04x class %d:%d:%d has no driver\n",
1259 func->name, func->desc.vendor, func->desc.product,
1260 func->desc.class.class.class,
1261 func->desc.class.class.subclass,
1262 func->desc.class.class.protocol );
1263 return -ENOENT;
1264 }
1265
1266 /* Record driver */
1267 func->driver = driver;
1268 func->id = id;
1269 func->dev.driver_name = id->name;
1270
1271 /* Probe driver */
1272 if ( ( rc = driver->probe ( func, config ) ) != 0 ) {
1273 DBGC ( usb, "USB %s failed to probe driver %s: %s\n",
1274 func->name, id->name, strerror ( rc ) );
1275 return rc;
1276 }
1277
1278 return 0;
1279}
1280
1281/**
1282 * Remove USB device driver
1283 *
1284 * @v func USB function
1285 */
1286static void usb_remove ( struct usb_function *func ) {
1287
1288 /* Remove driver */
1289 func->driver->remove ( func );
1290}
1291
1292/**
1293 * Probe all USB device drivers
1294 *
1295 * @v usb USB device
1296 * @v config Configuration descriptor
1297 */
1298static void
1300 struct usb_configuration_descriptor *config ) {
1301 struct usb_bus *bus = usb->port->hub->bus;
1302 struct usb_function *func;
1303 uint8_t used[config->interfaces];
1304 unsigned int first;
1305 unsigned int i;
1306 int rc;
1307
1308 /* Identify each function in turn */
1309 memset ( used, 0, sizeof ( used ) );
1310 for ( first = 0 ; first < config->interfaces ; first++ ) {
1311
1312 /* Skip interfaces already used */
1313 if ( used[first] )
1314 continue;
1315
1316 /* Allocate and initialise structure */
1317 func = zalloc ( sizeof ( *func ) +
1318 ( config->interfaces *
1319 sizeof ( func->interface[0] ) ) );
1320 if ( ! func )
1321 goto err_alloc;
1322 func->name = func->dev.name;
1323 func->usb = usb;
1324 func->dev.desc.bus_type = BUS_TYPE_USB;
1325 func->dev.desc.location =
1326 USB_BUSDEV ( bus->address, usb->address );
1327 func->dev.desc.vendor = le16_to_cpu ( usb->device.vendor );
1329 snprintf ( func->dev.name, sizeof ( func->dev.name ),
1330 "%s-%d.%d", usb->name, config->config, first );
1331 INIT_LIST_HEAD ( &func->dev.children );
1332 func->dev.parent = bus->dev;
1333 list_add_tail ( &func->list, &usb->functions );
1334
1335 /* Identify function */
1336 if ( ( rc = usb_describe ( usb, config, first, func->interface,
1337 &func->desc ) ) != 0 )
1338 goto err_describe;
1339 assert ( func->desc.count <= config->interfaces );
1340
1341 /* Mark interfaces as used */
1342 if ( ( rc = usb_used ( usb, func->desc.count, func->interface,
1343 used ) ) != 0 )
1344 goto err_used;
1345
1346 /* Probe device driver */
1347 if ( ( rc = usb_probe ( func, config ) ) != 0 )
1348 goto err_probe;
1349 DBGC ( usb, "USB %s %04x:%04x class %d:%d:%d interfaces ",
1350 func->name, func->desc.vendor, func->desc.product,
1351 func->desc.class.class.class,
1352 func->desc.class.class.subclass,
1353 func->desc.class.class.protocol );
1354 for ( i = 0 ; i < func->desc.count ; i++ )
1355 DBGC ( usb, "%s%d", ( i ? "," : "" ),
1356 func->interface[i] );
1357 DBGC ( usb, " using driver %s\n", func->dev.driver_name );
1358
1359 /* Add to device hierarchy */
1360 list_add_tail ( &func->dev.siblings, &bus->dev->children );
1361
1362 continue;
1363
1364 list_del ( &func->dev.siblings );
1365 usb_remove ( func );
1366 err_probe:
1367 err_used:
1368 err_describe:
1369 list_del ( &func->list );
1370 free ( func );
1371 err_alloc:
1372 /* Continue registering other functions */
1373 continue;
1374 }
1375}
1376
1377/**
1378 * Remove all device drivers
1379 *
1380 * @v usb USB device
1381 */
1382static void usb_remove_all ( struct usb_device *usb ) {
1383 struct usb_function *func;
1384 struct usb_function *tmp;
1385
1386 /* Remove all functions */
1388
1389 /* Remove device driver */
1390 usb_remove ( func );
1391
1392 /* Remove from device hierarchy */
1393 assert ( list_empty ( &func->dev.children ) );
1394 list_del ( &func->dev.siblings );
1395
1396 /* Remove from list of functions */
1397 list_del ( &func->list );
1398
1399 /* Free function */
1400 free ( func );
1401 }
1402}
1403
1404/**
1405 * Clear USB device configuration
1406 *
1407 * @v usb USB device
1408 */
1409static void usb_deconfigure ( struct usb_device *usb ) {
1410 unsigned int i;
1411
1412 /* Remove device drivers */
1413 usb_remove_all ( usb );
1414
1415 /* Sanity checks */
1416 for ( i = 0 ; i < ( sizeof ( usb->ep ) / sizeof ( usb->ep[0] ) ) ; i++){
1417 if ( i != USB_ENDPOINT_IDX ( USB_EP0_ADDRESS ) )
1418 assert ( usb->ep[i] == NULL );
1419 }
1420
1421 /* Clear device configuration */
1423}
1424
1425/**
1426 * Choose our preferred USB device configuration
1427 *
1428 * @v usb USB device
1429 * @ret rc Return status code
1430 */
1431static int usb_autoconfigure ( struct usb_device *usb ) {
1433 unsigned int preferred = 0;
1434 unsigned int index;
1435 int score;
1436 int best = 0;
1437 int rc;
1438
1439 /* Calculate driver score for each configuration index */
1440 for ( index = 0 ; index < usb->device.configurations ; index++ ) {
1441
1442 /* Read configuration descriptor */
1443 if ( ( rc = usb_config_descriptor ( usb, index,
1444 &config ) ) != 0 )
1445 goto err_config;
1446
1447 /* Get score for this configuration */
1448 score = usb_score ( usb, config );
1449 if ( score < 0 ) {
1450 rc = score;
1451 goto err_score;
1452 }
1453 DBGC2 ( usb, "USB %s configuration %d score %d\n",
1454 usb->name, config->config, score );
1455
1456 /* Record as preferred configuration, if applicable */
1457 if ( score > best ) {
1458 best = score;
1459 preferred = index;
1460 }
1461
1462 /* Free configuration descriptor */
1463 free ( config );
1464 config = NULL;
1465 }
1466
1467 /* Read preferred configuration descriptor */
1468 if ( ( rc = usb_config_descriptor ( usb, preferred, &config ) ) != 0 )
1469 goto err_preferred;
1470
1471 /* Set configuration */
1472 if ( ( rc = usb_set_configuration ( usb, config->config ) ) != 0){
1473 DBGC ( usb, "USB %s could not set configuration %d: %s\n",
1474 usb->name, config->config, strerror ( rc ) );
1475 goto err_set_configuration;
1476 }
1477
1478 /* Probe USB device drivers */
1479 usb_probe_all ( usb, config );
1480
1481 /* Free configuration descriptor */
1482 free ( config );
1483
1484 return 0;
1485
1486 usb_remove_all ( usb );
1487 usb_set_configuration ( usb, 0 );
1488 err_set_configuration:
1489 free ( config );
1490 err_preferred:
1491 return rc;
1492
1493 err_score:
1494 free ( config );
1495 err_config:
1496 return rc;
1497}
1498
1499/******************************************************************************
1500 *
1501 * USB device
1502 *
1503 ******************************************************************************
1504 */
1505
1506/**
1507 * Allocate USB device
1508 *
1509 * @v port USB port
1510 * @ret usb USB device, or NULL on allocation failure
1511 */
1512static struct usb_device * alloc_usb ( struct usb_port *port ) {
1513 struct usb_hub *hub = port->hub;
1514 struct usb_bus *bus = hub->bus;
1515 struct usb_device *usb;
1516
1517 /* Allocate and initialise structure */
1518 usb = zalloc ( sizeof ( *usb ) );
1519 if ( ! usb )
1520 return NULL;
1521 snprintf ( usb->name, sizeof ( usb->name ), "%s%c%d", hub->name,
1522 ( hub->usb ? '.' : '-' ), port->address );
1523 usb->port = port;
1524 INIT_LIST_HEAD ( &usb->functions );
1525 usb->host = &bus->op->device;
1527 INIT_LIST_HEAD ( &usb->complete );
1528
1529 return usb;
1530}
1531
1532/**
1533 * Register USB device
1534 *
1535 * @v usb USB device
1536 * @ret rc Return status code
1537 */
1538static int register_usb ( struct usb_device *usb ) {
1539 struct usb_port *port = usb->port;
1540 struct usb_hub *hub = port->hub;
1541 struct usb_bus *bus = hub->bus;
1542 unsigned int protocol;
1543 size_t mtu;
1544 int rc;
1545
1546 /* Add to port */
1547 if ( port->usb != NULL ) {
1548 DBGC ( hub, "USB hub %s port %d is already registered to %s\n",
1549 hub->name, port->address, port->usb->name );
1550 rc = -EALREADY;
1551 goto err_already;
1552 }
1553 port->usb = usb;
1554
1555 /* Add to bus device list */
1556 list_add_tail ( &usb->list, &bus->devices );
1557
1558 /* Enable device */
1559 if ( ( rc = hub->driver->enable ( hub, port ) ) != 0 ) {
1560 DBGC ( hub, "USB hub %s port %d could not enable: %s\n",
1561 hub->name, port->address, strerror ( rc ) );
1562 goto err_enable;
1563 }
1564
1565 /* Allow recovery interval since port may have been reset */
1567
1568 /* Get device speed */
1569 if ( ( rc = hub->driver->speed ( hub, port ) ) != 0 ) {
1570 DBGC ( hub, "USB hub %s port %d could not get speed: %s\n",
1571 hub->name, port->address, strerror ( rc ) );
1572 goto err_speed;
1573 }
1574 usb->speed = port->speed;
1575 DBGC2 ( usb, "USB %s attached as %s-speed device\n",
1576 usb->name, usb_speed_name ( usb->speed ) );
1577
1578 /* Open device */
1579 if ( ( rc = usb->host->open ( usb ) ) != 0 ) {
1580 DBGC ( usb, "USB %s could not open: %s\n",
1581 usb->name, strerror ( rc ) );
1582 goto err_open;
1583 }
1584
1585 /* Describe control endpoint */
1586 mtu = USB_EP0_DEFAULT_MTU ( usb->speed );
1590
1591 /* Open control endpoint */
1592 if ( ( rc = usb_endpoint_open ( &usb->control ) ) != 0 )
1593 goto err_open_control;
1594 assert ( usb_endpoint ( usb, USB_EP0_ADDRESS ) == &usb->control );
1595
1596 /* Assign device address */
1597 if ( ( rc = usb->host->address ( usb ) ) != 0 ) {
1598 DBGC ( usb, "USB %s could not set address: %s\n",
1599 usb->name, strerror ( rc ) );
1600 goto err_address;
1601 }
1602 DBGC2 ( usb, "USB %s assigned address %d\n", usb->name, usb->address );
1603
1604 /* Allow recovery interval after Set Address command */
1606
1607 /* Read first part of device descriptor to get EP0 MTU */
1608 if ( ( rc = usb_get_mtu ( usb, &usb->device ) ) != 0 ) {
1609 DBGC ( usb, "USB %s could not get MTU: %s\n",
1610 usb->name, strerror ( rc ) );
1611 goto err_get_mtu;
1612 }
1613
1614 /* Calculate EP0 MTU */
1616 mtu = ( ( protocol < USB_PROTO_3_0 ) ?
1617 usb->device.mtu : ( 1 << usb->device.mtu ) );
1618 DBGC2 ( usb, "USB %s has control MTU %zd (guessed %zd)\n",
1619 usb->name, mtu, usb->control.mtu );
1620
1621 /* Update MTU */
1622 if ( ( rc = usb_endpoint_mtu ( &usb->control, mtu ) ) != 0 )
1623 goto err_mtu;
1624
1625 /* Read whole device descriptor */
1626 if ( ( rc = usb_get_device_descriptor ( usb, &usb->device ) ) != 0 ) {
1627 DBGC ( usb, "USB %s could not get device descriptor: %s\n",
1628 usb->name, strerror ( rc ) );
1629 goto err_get_device_descriptor;
1630 }
1631 DBGC ( usb, "USB %s addr %d %04x:%04x class %d:%d:%d (v%s, %s-speed, "
1632 "MTU %zd)\n", usb->name, usb->address,
1633 le16_to_cpu ( usb->device.vendor ),
1634 le16_to_cpu ( usb->device.product ), usb->device.class.class,
1636 usb_bcd ( le16_to_cpu ( usb->device.protocol ) ),
1637 usb_speed_name ( usb->speed ), usb->control.mtu );
1638
1639 /* Configure device */
1640 if ( ( rc = usb_autoconfigure ( usb ) ) != 0 )
1641 goto err_autoconfigure;
1642
1643 return 0;
1644
1645 usb_deconfigure ( usb );
1646 err_autoconfigure:
1647 err_get_device_descriptor:
1648 err_mtu:
1649 err_get_mtu:
1650 err_address:
1651 usb_endpoint_close ( &usb->control );
1652 err_open_control:
1653 usb->host->close ( usb );
1654 err_open:
1655 err_speed:
1656 /* Leave port enabled on failure, to avoid an endless loop of
1657 * failed device registrations.
1658 */
1659 err_enable:
1660 list_del ( &usb->list );
1661 port->usb = NULL;
1662 err_already:
1663 return rc;
1664}
1665
1666/**
1667 * Unregister USB device
1668 *
1669 * @v usb USB device
1670 */
1671static void unregister_usb ( struct usb_device *usb ) {
1672 struct usb_port *port = usb->port;
1673 struct usb_hub *hub = port->hub;
1674 struct io_buffer *iobuf;
1675 struct io_buffer *tmp;
1676
1677 DBGC ( usb, "USB %s addr %d %04x:%04x class %d:%d:%d removed\n",
1678 usb->name, usb->address, le16_to_cpu ( usb->device.vendor ),
1679 le16_to_cpu ( usb->device.product ), usb->device.class.class,
1681
1682 /* Sanity checks */
1683 assert ( port->usb == usb );
1684
1685 /* Clear device configuration */
1686 usb_deconfigure ( usb );
1687
1688 /* Close control endpoint */
1689 usb_endpoint_close ( &usb->control );
1690
1691 /* Discard any stale control completions */
1692 list_for_each_entry_safe ( iobuf, tmp, &usb->complete, list ) {
1693 list_del ( &iobuf->list );
1694 free_iob ( iobuf );
1695 }
1696
1697 /* Close device */
1698 usb->host->close ( usb );
1699
1700 /* Disable port */
1701 hub->driver->disable ( hub, port );
1702
1703 /* Remove from bus device list */
1704 list_del ( &usb->list );
1705
1706 /* Remove from port */
1707 port->usb = NULL;
1708}
1709
1710/**
1711 * Free USB device
1712 *
1713 * @v usb USB device
1714 */
1715static void free_usb ( struct usb_device *usb ) {
1716 unsigned int i;
1717
1718 /* Sanity checks */
1719 for ( i = 0 ; i < ( sizeof ( usb->ep ) / sizeof ( usb->ep[0] ) ) ; i++ )
1720 assert ( usb->ep[i] == NULL );
1721 assert ( list_empty ( &usb->functions ) );
1722 assert ( list_empty ( &usb->complete ) );
1723
1724 /* Free device */
1725 free ( usb );
1726}
1727
1728/**
1729 * Find USB device by address
1730 *
1731 * @v bus USB bus
1732 * @v address Device address
1733 * @ret usb USB device, or NULL if not found
1734 */
1735struct usb_device * find_usb ( struct usb_bus *bus, unsigned int address ) {
1736 struct usb_device *usb;
1737
1738 /* Search for a matching non-zero address */
1739 list_for_each_entry ( usb, &bus->devices, list ) {
1740 if ( address && ( usb->address == address ) )
1741 return usb;
1742 }
1743
1744 return NULL;
1745}
1746
1747/******************************************************************************
1748 *
1749 * USB device hotplug event handling
1750 *
1751 ******************************************************************************
1752 */
1753
1754/**
1755 * Handle newly attached USB device
1756 *
1757 * @v port USB port
1758 * @ret rc Return status code
1759 */
1760static int usb_attached ( struct usb_port *port ) {
1761 struct usb_device *usb;
1762 int rc;
1763
1764 /* Mark port as attached */
1765 port->attached = 1;
1766
1767 /* Sanity checks */
1768 assert ( port->usb == NULL );
1769
1770 /* Allocate USB device */
1771 usb = alloc_usb ( port );
1772 if ( ! usb ) {
1773 rc = -ENOMEM;
1774 goto err_alloc;
1775 }
1776
1777 /* Register USB device */
1778 if ( ( rc = register_usb ( usb ) ) != 0 )
1779 goto err_register;
1780
1781 return 0;
1782
1783 unregister_usb ( usb );
1784 err_register:
1785 free_usb ( usb );
1786 err_alloc:
1787 return rc;
1788}
1789
1790/**
1791 * Handle newly detached USB device
1792 *
1793 * @v port USB port
1794 */
1795static void usb_detached ( struct usb_port *port ) {
1796 struct usb_device *usb = port->usb;
1797
1798 /* Mark port as detached */
1799 port->attached = 0;
1800
1801 /* Do nothing if we have no USB device */
1802 if ( ! usb )
1803 return;
1804
1805 /* Unregister USB device */
1806 unregister_usb ( usb );
1807
1808 /* Free USB device */
1809 free_usb ( usb );
1810}
1811
1812/**
1813 * Handle newly attached or detached USB device
1814 *
1815 * @v port USB port
1816 * @ret rc Return status code
1817 */
1818static int usb_hotplugged ( struct usb_port *port ) {
1819 struct usb_hub *hub = port->hub;
1820 int rc;
1821
1822 /* Get current port speed */
1823 if ( ( rc = hub->driver->speed ( hub, port ) ) != 0 ) {
1824 DBGC ( hub, "USB hub %s port %d could not get speed: %s\n",
1825 hub->name, port->address, strerror ( rc ) );
1826 /* Treat as a disconnection */
1827 port->disconnected = 1;
1828 port->speed = USB_SPEED_NONE;
1829 }
1830
1831 /* Detach device, if applicable */
1832 if ( port->attached && ( port->disconnected || ! port->speed ) )
1833 usb_detached ( port );
1834
1835 /* Clear any recorded disconnections */
1836 port->disconnected = 0;
1837
1838 /* Attach device, if applicable */
1839 if ( port->speed && ( ! port->attached ) &&
1840 ( ( rc = usb_attached ( port ) ) != 0 ) )
1841 return rc;
1842
1843 return 0;
1844}
1845
1846/******************************************************************************
1847 *
1848 * USB process
1849 *
1850 ******************************************************************************
1851 */
1852
1853/**
1854 * Report port status change
1855 *
1856 * @v port USB port
1857 */
1859
1860 /* Record hub port status change */
1861 list_del ( &port->changed );
1862 list_add_tail ( &port->changed, &usb_changed );
1863}
1864
1865/**
1866 * Handle newly attached or detached USB device
1867 *
1868 */
1869static void usb_hotplug ( void ) {
1870 struct usb_port *port;
1871
1872 /* Handle any changed ports, allowing for the fact that the
1873 * port list may change as we perform hotplug actions.
1874 */
1875 while ( ! list_empty ( &usb_changed ) ) {
1876
1877 /* Get first changed port */
1879 changed );
1880 assert ( port != NULL );
1881
1882 /* Remove from list of changed ports */
1883 list_del ( &port->changed );
1884 INIT_LIST_HEAD ( &port->changed );
1885
1886 /* Perform appropriate hotplug action */
1887 usb_hotplugged ( port );
1888 }
1889}
1890
1891/**
1892 * USB process
1893 *
1894 * @v process USB process
1895 */
1896static void usb_step ( struct process *process __unused ) {
1897 struct usb_bus *bus;
1898 struct usb_endpoint *ep;
1899
1900 /* Poll all buses */
1902 usb_poll ( bus );
1903
1904 /* Attempt to reset first halted endpoint in list, if any. We
1905 * do not attempt to process the complete list, since this
1906 * would require extra code to allow for the facts that the
1907 * halted endpoint list may change as we do so, and that
1908 * resetting an endpoint may fail.
1909 */
1910 if ( ( ep = list_first_entry ( &usb_halted, struct usb_endpoint,
1911 halted ) ) != NULL )
1912 usb_endpoint_reset ( ep );
1913
1914 /* Handle any changed ports */
1915 usb_hotplug();
1916}
1917
1918/** USB process */
1920
1921/******************************************************************************
1922 *
1923 * USB hub
1924 *
1925 ******************************************************************************
1926 */
1927
1928/**
1929 * Allocate USB hub
1930 *
1931 * @v bus USB bus
1932 * @v usb Underlying USB device, if any
1933 * @v ports Number of ports
1934 * @v driver Hub driver operations
1935 * @ret hub USB hub, or NULL on allocation failure
1936 */
1937struct usb_hub * alloc_usb_hub ( struct usb_bus *bus, struct usb_device *usb,
1938 unsigned int ports,
1940 struct usb_hub *hub;
1941 struct usb_port *port;
1942 unsigned int i;
1943
1944 /* Allocate and initialise structure */
1945 hub = zalloc ( sizeof ( *hub ) + ( ports * sizeof ( hub->port[0] ) ) );
1946 if ( ! hub )
1947 return NULL;
1948 hub->name = ( usb ? usb->name : bus->name );
1949 hub->bus = bus;
1950 hub->usb = usb;
1951 if ( usb )
1953 hub->ports = ports;
1954 hub->driver = driver;
1955 hub->host = &bus->op->hub;
1956
1957 /* Initialise port list */
1958 for ( i = 1 ; i <= hub->ports ; i++ ) {
1959 port = usb_port ( hub, i );
1960 port->hub = hub;
1961 port->address = i;
1962 if ( usb )
1963 port->protocol = usb->port->protocol;
1964 INIT_LIST_HEAD ( &port->changed );
1965 }
1966
1967 return hub;
1968}
1969
1970/**
1971 * Register USB hub
1972 *
1973 * @v hub USB hub
1974 * @ret rc Return status code
1975 */
1977 struct usb_bus *bus = hub->bus;
1978 struct usb_port *port;
1979 unsigned int i;
1980 int rc;
1981
1982 /* Add to hub list */
1983 list_add_tail ( &hub->list, &bus->hubs );
1984
1985 /* Open hub (host controller) */
1986 if ( ( rc = hub->host->open ( hub ) ) != 0 ) {
1987 DBGC ( hub, "USB hub %s could not open: %s\n",
1988 hub->name, strerror ( rc ) );
1989 goto err_host_open;
1990 }
1991
1992 /* Open hub (driver) */
1993 if ( ( rc = hub->driver->open ( hub ) ) != 0 ) {
1994 DBGC ( hub, "USB hub %s could not open: %s\n",
1995 hub->name, strerror ( rc ) );
1996 goto err_driver_open;
1997 }
1998
1999 /* Delay to allow ports to stabilise */
2001
2002 /* Mark all ports as changed */
2003 for ( i = 1 ; i <= hub->ports ; i++ ) {
2004 port = usb_port ( hub, i );
2006 }
2007
2008 /* Some hubs seem to defer reporting device connections until
2009 * their interrupt endpoint is polled for the first time.
2010 * Poll the bus once now in order to pick up any such
2011 * connections.
2012 */
2013 usb_poll ( bus );
2014
2015 return 0;
2016
2017 hub->driver->close ( hub );
2018 err_driver_open:
2019 hub->host->close ( hub );
2020 err_host_open:
2021 list_del ( &hub->list );
2022 return rc;
2023}
2024
2025/**
2026 * Unregister USB hub
2027 *
2028 * @v hub USB hub
2029 */
2031 struct usb_port *port;
2032 unsigned int i;
2033
2034 /* Detach all devices */
2035 for ( i = 1 ; i <= hub->ports ; i++ ) {
2036 port = usb_port ( hub, i );
2037 if ( port->attached )
2038 usb_detached ( port );
2039 }
2040
2041 /* Close hub (driver) */
2042 hub->driver->close ( hub );
2043
2044 /* Close hub (host controller) */
2045 hub->host->close ( hub );
2046
2047 /* Cancel any pending port status changes */
2048 for ( i = 1 ; i <= hub->ports ; i++ ) {
2049 port = usb_port ( hub, i );
2050 list_del ( &port->changed );
2051 INIT_LIST_HEAD ( &port->changed );
2052 }
2053
2054 /* Remove from hub list */
2055 list_del ( &hub->list );
2056}
2057
2058/**
2059 * Free USB hub
2060 *
2061 * @v hub USB hub
2062 */
2063void free_usb_hub ( struct usb_hub *hub ) {
2064 struct usb_port *port;
2065 unsigned int i;
2066
2067 /* Sanity checks */
2068 for ( i = 1 ; i <= hub->ports ; i++ ) {
2069 port = usb_port ( hub, i );
2070 assert ( ! port->attached );
2071 assert ( port->usb == NULL );
2072 assert ( list_empty ( &port->changed ) );
2073 }
2074
2075 /* Free hub */
2076 free ( hub );
2077}
2078
2079/******************************************************************************
2080 *
2081 * USB bus
2082 *
2083 ******************************************************************************
2084 */
2085
2086/**
2087 * Allocate USB bus
2088 *
2089 * @v dev Underlying hardware device
2090 * @v ports Number of root hub ports
2091 * @v mtu Largest transfer allowed on the bus
2092 * @v op Host controller operations
2093 * @ret bus USB bus, or NULL on allocation failure
2094 */
2095struct usb_bus * alloc_usb_bus ( struct device *dev, unsigned int ports,
2096 size_t mtu, struct usb_host_operations *op ) {
2097 struct usb_bus *bus;
2098
2099 /* Allocate and initialise structure */
2100 bus = zalloc ( sizeof ( *bus ) );
2101 if ( ! bus )
2102 goto err_alloc_bus;
2103 bus->name = dev->name;
2104 bus->dev = dev;
2105 bus->mtu = mtu;
2106 bus->op = op;
2107 INIT_LIST_HEAD ( &bus->devices );
2108 INIT_LIST_HEAD ( &bus->hubs );
2109 bus->host = &bus->op->bus;
2110
2111 /* Allocate root hub */
2112 bus->hub = alloc_usb_hub ( bus, NULL, ports, &op->root );
2113 if ( ! bus->hub )
2114 goto err_alloc_hub;
2115
2116 return bus;
2117
2118 free_usb_hub ( bus->hub );
2119 err_alloc_hub:
2120 free ( bus );
2121 err_alloc_bus:
2122 return NULL;
2123}
2124
2125/**
2126 * Register USB bus
2127 *
2128 * @v bus USB bus
2129 * @ret rc Return status code
2130 */
2132 int rc;
2133
2134 /* Sanity checks */
2135 assert ( bus->hub != NULL );
2136
2137 /* Assign the first available bus address */
2138 bus->address = 0;
2139 while ( find_usb_bus ( bus->address ) != NULL )
2140 bus->address++;
2141
2142 /* Open bus */
2143 if ( ( rc = bus->host->open ( bus ) ) != 0 )
2144 goto err_open;
2145
2146 /* Add to list of USB buses */
2147 list_add_tail ( &bus->list, &usb_buses );
2148
2149 /* Register root hub */
2150 if ( ( rc = register_usb_hub ( bus->hub ) ) != 0 )
2151 goto err_register_hub;
2152
2153 /* Attach any devices already present */
2154 usb_hotplug();
2155
2156 return 0;
2157
2158 unregister_usb_hub ( bus->hub );
2159 err_register_hub:
2160 list_del ( &bus->list );
2161 bus->host->close ( bus );
2162 err_open:
2163 return rc;
2164}
2165
2166/**
2167 * Unregister USB bus
2168 *
2169 * @v bus USB bus
2170 */
2172
2173 /* Sanity checks */
2174 assert ( bus->hub != NULL );
2175
2176 /* Unregister root hub */
2177 unregister_usb_hub ( bus->hub );
2178
2179 /* Remove from list of USB buses */
2180 list_del ( &bus->list );
2181
2182 /* Close bus */
2183 bus->host->close ( bus );
2184
2185 /* Sanity checks */
2186 assert ( list_empty ( &bus->devices ) );
2187 assert ( list_empty ( &bus->hubs ) );
2188}
2189
2190/**
2191 * Free USB bus
2192 *
2193 * @v bus USB bus
2194 */
2195void free_usb_bus ( struct usb_bus *bus ) {
2196 struct usb_endpoint *ep;
2197 struct usb_port *port;
2198
2199 /* Sanity checks */
2200 assert ( list_empty ( &bus->devices ) );
2201 assert ( list_empty ( &bus->hubs ) );
2202 list_for_each_entry ( ep, &usb_halted, halted )
2203 assert ( ep->usb->port->hub->bus != bus );
2205 assert ( port->hub->bus != bus );
2206
2207 /* Free root hub */
2208 free_usb_hub ( bus->hub );
2209
2210 /* Free bus */
2211 free ( bus );
2212}
2213
2214/**
2215 * Find USB bus by address
2216 *
2217 * @v address Bus address
2218 * @ret bus USB bus, or NULL
2219 */
2220struct usb_bus * find_usb_bus ( unsigned int address ) {
2221 struct usb_bus *bus;
2222
2223 for_each_usb_bus ( bus ) {
2224 if ( bus->address == address )
2225 return bus;
2226 }
2227
2228 return NULL;
2229}
2230
2231/**
2232 * Find USB bus by device location
2233 *
2234 * @v bus_type Bus type
2235 * @v location Bus location
2236 * @ret bus USB bus, or NULL
2237 */
2238struct usb_bus * find_usb_bus_by_location ( unsigned int bus_type,
2239 unsigned int location ) {
2240 struct usb_bus *bus;
2241
2242 for_each_usb_bus ( bus ) {
2243 if ( ( bus->dev->desc.bus_type == bus_type ) &&
2244 ( bus->dev->desc.location == location ) )
2245 return bus;
2246 }
2247
2248 return NULL;
2249}
2250
2251/******************************************************************************
2252 *
2253 * USB device addressing
2254 *
2255 ******************************************************************************
2256 */
2257
2258/**
2259 * Allocate device address
2260 *
2261 * @v bus USB bus
2262 * @ret address Device address, or negative error
2263 */
2265 unsigned int address;
2266
2267 /* Find first free device address */
2268 address = ffsll ( ~bus->addresses );
2269 if ( ! address )
2270 return -ENOENT;
2271
2272 /* Mark address as used */
2273 bus->addresses |= ( 1ULL << ( address - 1 ) );
2274
2275 return address;
2276}
2277
2278/**
2279 * Free device address
2280 *
2281 * @v bus USB bus
2282 * @v address Device address
2283 */
2284void usb_free_address ( struct usb_bus *bus, unsigned int address ) {
2285
2286 /* Sanity check */
2287 assert ( address > 0 );
2288 assert ( bus->addresses & ( 1ULL << ( address - 1 ) ) );
2289
2290 /* Mark address as free */
2291 bus->addresses &= ~( 1ULL << ( address - 1 ) );
2292}
2293
2294/**
2295 * Find next USB device
2296 *
2297 * @v usb USB device to fill in
2298 * @v busdev Starting bus:dev address
2299 * @ret busdev Bus:dev address of next USB device
2300 * @ret rc Return status code
2301 */
2302int usb_find_next ( struct usb_device **usb, uint16_t *busdev ) {
2303 struct usb_bus *bus;
2304
2305 do {
2306 /* Find USB bus, if any */
2307 bus = find_usb_bus ( USB_BUS ( *busdev ) );
2308 if ( ! bus ) {
2309 *busdev |= ( USB_BUS ( 1 ) - 1 );
2310 continue;
2311 }
2312
2313 /* Find USB device, if any */
2314 *usb = find_usb ( bus, USB_DEV ( *busdev ) );
2315 if ( *usb )
2316 return 0;
2317
2318 } while ( ++(*busdev) );
2319
2320 return -ENODEV;
2321}
2322
2323/******************************************************************************
2324 *
2325 * USB bus topology
2326 *
2327 ******************************************************************************
2328 */
2329
2330/**
2331 * Get USB route string
2332 *
2333 * @v usb USB device
2334 * @ret route USB route string
2335 */
2336unsigned int usb_route_string ( struct usb_device *usb ) {
2337 struct usb_device *parent;
2338 unsigned int route;
2339
2340 /* Navigate up to root hub, constructing route string as we go */
2341 for ( route = 0 ; ( parent = usb->port->hub->usb ) ; usb = parent ) {
2342 route <<= 4;
2343 route |= ( ( usb->port->address > 0xf ) ?
2344 0xf : usb->port->address );
2345 }
2346
2347 return route;
2348}
2349
2350/**
2351 * Get USB root hub port
2352 *
2353 * @v usb USB device
2354 * @ret port Root hub port
2355 */
2357 struct usb_device *parent;
2358
2359 /* Navigate up to root hub */
2360 while ( ( parent = usb->port->hub->usb ) )
2361 usb = parent;
2362
2363 return usb->port;
2364}
2365
2366/**
2367 * Get USB transaction translator
2368 *
2369 * @v usb USB device
2370 * @ret port Transaction translator port, or NULL
2371 */
2373 struct usb_device *parent;
2374
2375 /* Navigate up to root hub. If we find a low-speed or
2376 * full-speed device with a higher-speed parent hub, then that
2377 * device's port is the transaction translator.
2378 */
2379 for ( ; ( parent = usb->port->hub->usb ) ; usb = parent ) {
2380 if ( ( usb->speed <= USB_SPEED_FULL ) &&
2381 ( parent->speed > USB_SPEED_FULL ) )
2382 return usb->port;
2383 }
2384
2385 return NULL;
2386}
2387
2388/* Drag in objects via register_usb_bus() */
2390
2391/* Drag in USB configuration */
2392REQUIRE_OBJECT ( config_usb );
2393
2394/* Drag in hub driver */
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
u8 port
Port number.
Definition CIB_PRM.h:3
typeof(acpi_finder=acpi_find)
ACPI table finder.
Definition acpi.c:48
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
pseudo_bit_t value[0x00020]
Definition arbel.h:2
unsigned short uint16_t
Definition stdint.h:11
unsigned char uint8_t
Definition stdint.h:10
long index
Definition bigint.h:65
static int fill
Definition string.h:209
Assertions.
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
#define max(x, y)
Definition ath.h:41
USB Communications Device Class (CDC)
#define USB_CLASS_CDC
Class code for communications devices.
Definition cdc.h:16
#define BUS_TYPE_USB
USB bus type.
Definition device.h:71
ring len
Length.
Definition dwmac.h:226
uint8_t bus
Bus.
Definition edd.h:1
uint8_t direction
Direction.
Definition ena.h:3
uint8_t id
Request identifier.
Definition ena.h:1
uint16_t burst
Maximum burst size.
Definition ena.h:17
uint32_t type
Operating system type.
Definition ena.h:1
uint8_t data[48]
Additional event data.
Definition ena.h:11
uint32_t mtu
Maximum MTU.
Definition ena.h:17
struct ena_llq_option header
Header locations.
Definition ena.h:5
uint64_t address
Base address.
Definition ena.h:13
struct ena_llq_option desc
Descriptor counts.
Definition ena.h:9
Error codes.
#define __unused
Declare a variable or data structure as unused.
Definition compiler.h:573
#define DBGC2(...)
Definition compiler.h:522
#define DBGC(...)
Definition compiler.h:505
#define DBGC_HDA(...)
Definition compiler.h:506
static unsigned int count
Number of entries.
Definition dwmac.h:220
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define REQUIRE_OBJECT(object)
Require an object.
Definition compiler.h:202
#define ENOENT
No such file or directory.
Definition errno.h:515
#define EINVAL
Invalid argument.
Definition errno.h:429
#define ETIMEDOUT
Connection timed out.
Definition errno.h:670
#define ENOMEM
Not enough space.
Definition errno.h:535
#define ERANGE
Result too large.
Definition errno.h:640
#define EALREADY
Connection already in progress.
Definition errno.h:324
#define ENODEV
No such device.
Definition errno.h:510
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:926
#define REQUIRING_SYMBOL(symbol)
Specify the file's requiring symbol.
Definition compiler.h:140
struct ib_cm_path alternate
Alternate path.
Definition ib_mad.h:31
u8 request[0]
List of IEs requested.
Definition ieee80211.h:2
#define le16_to_cpu(value)
Definition byteswap.h:113
#define cpu_to_le16(value)
Definition byteswap.h:107
#define __attribute__(x)
Definition compiler.h:10
Universal Serial Bus (USB)
#define USB_ENDPOINT_DESCRIPTOR
A USB endpoint descriptor.
Definition usb.h:278
#define for_each_usb_bus(bus)
Iterate over all USB buses.
Definition usb.h:1077
@ USB_PROTO_3_0
USB 3.0.
Definition usb.h:25
#define USB_EP0_BURST
Control endpoint maximum burst size.
Definition usb.h:516
#define USB_INTERFACE_DESCRIPTOR
A USB interface descriptor.
Definition usb.h:261
static int usb_is_within_config(struct usb_configuration_descriptor *config, struct usb_descriptor_header *desc)
Check that descriptor lies within a configuration descriptor.
Definition usb.h:371
#define USB_EP0_INTERVAL
Control endpoint interval.
Definition usb.h:519
#define USB_BUSDEV(bus, dev)
Define a USB bus:device address.
Definition usb.h:64
#define USB_DIR_IN
Data transfer is from device to host.
Definition usb.h:98
static void usb_endpoint_init(struct usb_endpoint *ep, struct usb_device *usb, struct usb_endpoint_driver_operations *driver)
Initialise USB endpoint.
Definition usb.h:540
#define USB_RECIP_ENDPOINT
Request recipient is an endpoint.
Definition usb.h:119
static struct usb_port * usb_port(struct usb_hub *hub, unsigned int address)
Get USB port.
Definition usb.h:960
#define USB_ENDPOINT_IDX(address)
Construct endpoint index from endpoint address.
Definition usb.h:528
#define USB_ENDPOINT_MAX
Maximum endpoint number.
Definition usb.h:522
#define USB_BUS(busdev)
Extract USB bus address.
Definition usb.h:67
#define USB_SPEED_MANTISSA(speed)
Extract USB speed mantissa.
Definition usb.h:39
static int usb_clear_feature(struct usb_device *usb, unsigned int type, unsigned int feature, unsigned int index)
Clear feature.
Definition usb.h:1127
#define USB_ENDPOINT_ATTR_PERIODIC
Endpoint periodic type.
Definition usb.h:284
#define USB_ENDPOINT_COMPANION_DESCRIPTOR
A USB endpoint companion descriptor.
Definition usb.h:326
#define USB_ANY_ID
Match-anything ID.
Definition usb.h:1385
#define for_each_interface_descriptor(desc, config, interface)
Iterate over all configuration descriptors within an interface descriptor.
Definition usb.h:394
#define USB_DEV(busdev)
Extract USB device address.
Definition usb.h:70
#define USB_ENDPOINT_IN
Endpoint direction is in.
Definition usb.h:525
static int usb_get_config_descriptor(struct usb_device *usb, unsigned int index, struct usb_configuration_descriptor *data, size_t len)
Get USB configuration descriptor.
Definition usb.h:1226
#define for_each_config_descriptor(desc, config)
Iterate over all configuration descriptors.
Definition usb.h:386
static int usb_get_mtu(struct usb_device *usb, struct usb_device_descriptor *data)
Get first part of USB device descriptor (up to and including MTU)
Definition usb.h:1194
#define USB_CONTROL_MAX_WAIT_MS
Maximum time to wait for a control transaction to complete.
Definition usb.h:1342
static void usb_poll(struct usb_bus *bus)
Poll USB bus.
Definition usb.h:1072
#define USB_STRING_DESCRIPTOR
A USB string descriptor.
Definition usb.h:239
#define USB_ENDPOINT_ATTR_INTERRUPT
Interrupt endpoint transfer type.
Definition usb.h:293
#define USB_RESET_RECOVER_DELAY_MS
Reset recovery time.
Definition usb.h:1335
#define USB_DRIVERS
USB driver table.
Definition usb.h:1450
static void usb_endpoint_describe(struct usb_endpoint *ep, unsigned int address, unsigned int attributes, size_t mtu, unsigned int burst, unsigned int interval)
Describe USB endpoint.
Definition usb.h:558
#define USB_ENDPOINT_ATTR_TYPE_MASK
Endpoint attribute transfer type mask.
Definition usb.h:281
#define USB_SET_ADDRESS_RECOVER_DELAY_MS
Set address recovery time.
Definition usb.h:1349
static int usb_set_configuration(struct usb_device *usb, unsigned int index)
Set USB configuration.
Definition usb.h:1242
#define USB_ENDPOINT_HALT
Endpoint halt feature.
Definition usb.h:157
#define USB_EP0_DEFAULT_MTU(speed)
Calculate default MTU based on device speed.
Definition usb.h:511
@ USB_SPEED_LOW
Low speed (1.5Mbps)
Definition usb.h:49
@ USB_SPEED_FULL
Full speed (12Mbps)
Definition usb.h:51
@ USB_SPEED_HIGH
High speed (480Mbps)
Definition usb.h:53
@ USB_SPEED_NONE
Not connected.
Definition usb.h:47
@ USB_SPEED_SUPER
Super speed (5Gbps)
Definition usb.h:55
#define USB_ENDPOINT_ATTR_CONTROL
Control endpoint transfer type.
Definition usb.h:287
static int usb_get_device_descriptor(struct usb_device *usb, struct usb_device_descriptor *data)
Get USB device descriptor.
Definition usb.h:1210
static struct usb_descriptor_header * usb_next_descriptor(struct usb_descriptor_header *desc)
Get next USB descriptor.
Definition usb.h:358
#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR
A USB interface association descriptor.
Definition usb.h:343
#define USB_EP0_ADDRESS
Control endpoint address.
Definition usb.h:501
#define USB_LANG_ENGLISH
Language ID for English.
Definition usb.h:242
#define USB_EP0_ATTRIBUTES
Control endpoint attributes.
Definition usb.h:504
static int usb_get_descriptor(struct usb_device *usb, unsigned int type, unsigned int desc, unsigned int index, unsigned int language, struct usb_descriptor_header *data, size_t len)
Get USB descriptor.
Definition usb.h:1177
#define USB_ENDPOINT_MTU(sizes)
USB endpoint MTU.
Definition usb.h:308
#define USB_PORT_DELAY_MS
Time to wait for ports to stabilise.
Definition usb.h:1358
#define USB_SPEED_EXPONENT(speed)
Extract USB speed exponent.
Definition usb.h:42
#define USB_ENDPOINT_BURST(sizes)
USB endpoint maximum burst size.
Definition usb.h:311
String functions.
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void * memset(void *dest, int character, size_t len) __nonnull
String functions.
#define ffsll(x)
Find first (i.e.
Definition strings.h:123
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition iobuf.c:153
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition iobuf.c:131
static size_t iob_headroom(struct io_buffer *iobuf)
Calculate available space at start of an I/O buffer.
Definition iobuf.h:170
#define iob_push(iobuf, len)
Definition iobuf.h:89
#define iob_put(iobuf, len)
Definition iobuf.h:125
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition iobuf.h:160
#define iob_reserve(iobuf, len)
Definition iobuf.h:72
#define iob_pull(iobuf, len)
Definition iobuf.h:107
unsigned long tmp
Definition linux_pci.h:65
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition list.h:334
#define LIST_HEAD_INIT(list)
Initialise a static list head.
Definition list.h:31
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
Definition list.h:459
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition list.h:94
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition list.h:432
#define list_del(list)
Delete an entry from a list.
Definition list.h:120
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition list.h:46
#define list_empty(list)
Test whether a list is empty.
Definition list.h:137
#define list_add(new, head)
Add a new entry to the head of a list.
Definition list.h:70
void * zalloc(size_t size)
Allocate cleared memory.
Definition malloc.c:662
void * malloc(size_t size)
Allocate memory.
Definition malloc.c:621
uint32_t high
High 32 bits of address.
Definition myson.h:1
uint32_t low
Low 16 bits of address.
Definition myson.h:0
static uint16_t struct vmbus_xfer_pages_operations * op
Definition netvsc.h:327
uint32_t first
First block in range.
Definition pccrr.h:1
#define PERMANENT_PROCESS(name, step)
Define a permanent process.
Definition process.h:194
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
void route(void)
Print routing table.
Definition route.c:40
static const char * interfaces[2]
Definition smc9000.c:52
#define offsetof(type, field)
Get offset of a field within a structure.
Definition stddef.h:25
#define container_of(ptr, type, field)
Get containing structure.
Definition stddef.h:36
uint16_t protocol
Protocol ID.
Definition stp.h:7
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
Union functional descriptor.
Definition cdc.h:29
uint8_t interface[1]
Interfaces (variable-length)
Definition cdc.h:35
struct usb_descriptor_header header
Descriptor header.
Definition cdc.h:31
unsigned int bus_type
Bus type.
Definition device.h:25
unsigned int device
Device ID.
Definition device.h:34
unsigned int vendor
Vendor ID.
Definition device.h:32
unsigned int location
Location.
Definition device.h:30
A hardware device.
Definition device.h:77
struct device_description desc
Device description.
Definition device.h:83
struct device * parent
Bus device.
Definition device.h:89
struct list_head children
Devices attached to this device.
Definition device.h:87
struct list_head siblings
Devices on the same bus.
Definition device.h:85
const char * driver_name
Driver name.
Definition device.h:81
char name[40]
Name.
Definition device.h:79
An object interface.
Definition interface.h:125
A persistent I/O buffer.
Definition iobuf.h:38
void * data
Start of data.
Definition iobuf.h:53
struct list_head list
List of which this buffer is a member.
Definition iobuf.h:45
A doubly-linked list entry (or list head)
Definition list.h:19
A process.
Definition process.h:18
A USB bus.
Definition usb.h:966
struct usb_hub * hub
Root hub.
Definition usb.h:995
struct device * dev
Underlying hardware device.
Definition usb.h:970
struct usb_host_operations * op
Host controller operations set.
Definition usb.h:972
union usb_class_descriptor class
Class.
Definition usb.h:1390
union usb_class_descriptor mask
Class mask.
Definition usb.h:1392
uint8_t protocol
Protocol code.
Definition usb.h:166
uint8_t class
Class code.
Definition usb.h:162
uint8_t subclass
Subclass code.
Definition usb.h:164
A USB configuration descriptor.
Definition usb.h:210
uint8_t config
Configuration value.
Definition usb.h:218
uint8_t interfaces
Number of interfaces.
Definition usb.h:216
uint16_t len
Total length.
Definition usb.h:214
USB control transfer pseudo-header.
Definition usb.c:743
int rc
Completion status.
Definition usb.c:745
A USB descriptor header.
Definition usb.h:173
uint8_t type
Descriptor type.
Definition usb.h:177
uint8_t len
Length of descriptor.
Definition usb.h:175
uint8_t configurations
Number of possible configurations.
Definition usb.h:203
uint16_t product
Product ID.
Definition usb.h:193
uint16_t vendor
Vendor ID.
Definition usb.h:191
uint16_t protocol
USB specification release number in BCD.
Definition usb.h:185
struct usb_class class
Device class.
Definition usb.h:187
uint8_t mtu
Maximum packet size for endpoint zero.
Definition usb.h:189
void(* close)(struct usb_device *usb)
Close device.
Definition usb.h:768
int(* address)(struct usb_device *usb)
Assign device address.
Definition usb.h:774
int(* open)(struct usb_device *usb)
Open device.
Definition usb.h:763
A USB device ID.
Definition usb.h:1361
A USB device.
Definition usb.h:723
char name[32]
Name.
Definition usb.h:725
struct usb_port * port
USB port.
Definition usb.h:727
struct list_head functions
List of functions.
Definition usb.h:737
struct list_head list
List of devices on this bus.
Definition usb.h:731
struct usb_device_descriptor device
Device descriptor.
Definition usb.h:735
struct list_head complete
Completed control transfers.
Definition usb.h:750
struct usb_endpoint control
Control endpoint.
Definition usb.h:748
unsigned int address
Device address, if assigned.
Definition usb.h:733
struct usb_device_host_operations * host
Host controller operations.
Definition usb.h:740
unsigned int language
Default language ID (if known)
Definition usb.h:753
struct usb_endpoint * ep[32]
Endpoint list.
Definition usb.h:745
unsigned int speed
Device speed.
Definition usb.h:729
A USB driver.
Definition usb.h:1419
unsigned int score
Driver score.
Definition usb.h:1431
struct usb_class_id class
Class ID.
Definition usb.h:1425
unsigned int id_count
Number of entries in ID table.
Definition usb.h:1423
void(* remove)(struct usb_function *func)
Remove device.
Definition usb.h:1446
struct usb_device_id * ids
USB ID table.
Definition usb.h:1421
int(* probe)(struct usb_function *func, struct usb_configuration_descriptor *config)
Probe device.
Definition usb.h:1439
A USB endpoint companion descriptor.
Definition usb.h:314
struct usb_descriptor_header header
Descriptor header.
Definition usb.h:316
uint8_t burst
Maximum burst size.
Definition usb.h:318
A USB endpoint descriptor.
Definition usb.h:264
uint8_t attributes
Attributes.
Definition usb.h:270
USB endpoint driver operations.
Definition usb.h:489
void(* complete)(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete transfer.
Definition usb.h:496
int(* reset)(struct usb_endpoint *ep)
Reset endpoint.
Definition usb.h:462
int(* open)(struct usb_endpoint *ep)
Open endpoint.
Definition usb.h:450
void(* close)(struct usb_endpoint *ep)
Close endpoint.
Definition usb.h:455
int(* mtu)(struct usb_endpoint *ep)
Update MTU.
Definition usb.h:468
int(* message)(struct usb_endpoint *ep, struct io_buffer *iobuf)
Enqueue message transfer.
Definition usb.h:475
int(* stream)(struct usb_endpoint *ep, struct io_buffer *iobuf, int zlp)
Enqueue stream transfer.
Definition usb.h:484
A USB endpoint.
Definition usb.h:404
size_t mtu
Maximum transfer size.
Definition usb.h:412
unsigned int max
Maximum fill level.
Definition usb.h:440
size_t len
Refill buffer payload length.
Definition usb.h:438
struct list_head halted
List of halted endpoints.
Definition usb.h:424
size_t reserve
Refill buffer reserved header length.
Definition usb.h:436
struct list_head recycled
Recycled I/O buffer list.
Definition usb.h:434
struct usb_device * usb
USB device.
Definition usb.h:406
unsigned int attributes
Attributes.
Definition usb.h:410
unsigned int burst
Maximum burst size.
Definition usb.h:414
unsigned int fill
Buffer fill level.
Definition usb.h:421
int open
Endpoint is open.
Definition usb.h:419
struct usb_endpoint_host_operations * host
Host controller operations.
Definition usb.h:427
unsigned int interval
Interval (in microframes)
Definition usb.h:416
unsigned int address
Endpoint address.
Definition usb.h:408
struct usb_endpoint_driver_operations * driver
Driver operations.
Definition usb.h:431
A USB function descriptor.
Definition usb.h:657
union usb_class_descriptor class
Class.
Definition usb.h:663
unsigned int count
Number of interfaces.
Definition usb.h:665
uint16_t product
Product ID.
Definition usb.h:661
uint16_t vendor
Vendor ID.
Definition usb.h:659
A USB function.
Definition usb.h:674
struct usb_device * usb
USB device.
Definition usb.h:678
struct usb_function_descriptor desc
Function descriptor.
Definition usb.h:680
struct usb_device_id * id
Driver device ID.
Definition usb.h:691
struct usb_driver * driver
Driver.
Definition usb.h:687
struct device dev
Generic device.
Definition usb.h:682
uint8_t interface[0]
List of interface numbers.
Definition usb.h:697
struct list_head list
List of functions within this USB device.
Definition usb.h:684
const char * name
Name.
Definition usb.h:676
USB host controller operations.
Definition usb.h:1031
struct usb_endpoint_host_operations endpoint
Endpoint operations.
Definition usb.h:1033
USB hub driver operations.
Definition usb.h:886
int(* open)(struct usb_hub *hub)
Open hub.
Definition usb.h:892
int(* disable)(struct usb_hub *hub, struct usb_port *port)
Disable port.
Definition usb.h:911
int(* enable)(struct usb_hub *hub, struct usb_port *port)
Enable port.
Definition usb.h:904
int(* speed)(struct usb_hub *hub, struct usb_port *port)
Update port speed.
Definition usb.h:918
void(* close)(struct usb_hub *hub)
Close hub.
Definition usb.h:897
int(* clear_tt)(struct usb_hub *hub, struct usb_port *port, struct usb_endpoint *ep)
Clear transaction translator buffer.
Definition usb.h:926
int(* open)(struct usb_hub *hub)
Open hub.
Definition usb.h:877
void(* close)(struct usb_hub *hub)
Close hub.
Definition usb.h:882
A USB hub.
Definition usb.h:841
const char * name
Name.
Definition usb.h:843
unsigned int protocol
Hub protocol.
Definition usb.h:849
struct usb_hub_driver_operations * driver
Driver operations.
Definition usb.h:859
struct list_head list
List of hubs.
Definition usb.h:854
struct usb_bus * bus
USB bus.
Definition usb.h:845
unsigned int ports
Number of ports.
Definition usb.h:851
struct usb_port port[0]
Port list.
Definition usb.h:867
struct usb_hub_host_operations * host
Host controller operations.
Definition usb.h:857
struct usb_device * usb
Underlying USB device, if any.
Definition usb.h:847
A USB interface association descriptor.
Definition usb.h:329
struct usb_class class
Association class.
Definition usb.h:337
uint8_t count
Interface count.
Definition usb.h:335
uint8_t first
First interface number.
Definition usb.h:333
A USB interface descriptor.
Definition usb.h:245
A USB port.
Definition usb.h:813
struct usb_hub * hub
USB hub.
Definition usb.h:815
unsigned int protocol
Port protocol.
Definition usb.h:819
struct usb_device * usb
Currently attached device (if in use)
Definition usb.h:835
struct list_head changed
List of changed ports.
Definition usb.h:837
unsigned int address
Port address.
Definition usb.h:817
A USB setup data packet.
Definition usb.h:83
uint16_t request
Request.
Definition usb.h:85
uint16_t value
Value parameter.
Definition usb.h:87
uint16_t index
Index parameter.
Definition usb.h:89
uint16_t len
Length of data stage.
Definition usb.h:91
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition tables.h:386
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition timer.c:79
struct usb_class class
Class.
Definition usb.h:646
uint32_t scalar
Scalar value.
Definition usb.h:648
static int usb_used(struct usb_device *usb, unsigned int count, uint8_t *interface, uint8_t *used)
Update list of used interface.
Definition usb.c:1145
struct list_head usb_buses
List of USB buses.
Definition usb.c:45
static void unregister_usb(struct usb_device *usb)
Unregister USB device.
Definition usb.c:1671
struct usb_driver * usb_find_driver(struct usb_function_descriptor *desc, struct usb_device_id **id)
Find USB device driver.
Definition usb.c:1167
static void free_usb(struct usb_device *usb)
Free USB device.
Definition usb.c:1715
static struct list_head usb_changed
List of changed ports.
Definition usb.c:48
struct usb_bus * find_usb_bus_by_location(unsigned int bus_type, unsigned int location)
Find USB bus by device location.
Definition usb.c:2238
int usb_endpoint_open(struct usb_endpoint *ep)
Open USB endpoint.
Definition usb.c:294
void usb_flush(struct usb_endpoint *ep)
Discard endpoint recycled buffer list.
Definition usb.c:720
int usb_alloc_address(struct usb_bus *bus)
Allocate device address.
Definition usb.c:2264
struct usb_endpoint_companion_descriptor * usb_endpoint_companion_descriptor(struct usb_configuration_descriptor *config, struct usb_endpoint_descriptor *desc)
Locate USB endpoint companion descriptor.
Definition usb.c:195
struct usb_endpoint_descriptor * usb_endpoint_descriptor(struct usb_configuration_descriptor *config, struct usb_interface_descriptor *interface, unsigned int type, unsigned int index)
Locate USB endpoint descriptor.
Definition usb.c:168
struct usb_port * usb_transaction_translator(struct usb_device *usb)
Get USB transaction translator.
Definition usb.c:2372
static int usb_hotplugged(struct usb_port *port)
Handle newly attached or detached USB device.
Definition usb.c:1818
struct usb_device * find_usb(struct usb_bus *bus, unsigned int address)
Find USB device by address.
Definition usb.c:1735
static void usb_detached(struct usb_port *port)
Handle newly detached USB device.
Definition usb.c:1795
static const char * usb_bcd(uint16_t bcd)
Transcribe USB BCD-coded value (for debugging)
Definition usb.c:96
void usb_endpoint_close(struct usb_endpoint *ep)
Close USB endpoint.
Definition usb.c:400
static int usb_endpoint_reset(struct usb_endpoint *ep)
Reset USB endpoint.
Definition usb.c:430
void usb_free_address(struct usb_bus *bus, unsigned int address)
Free device address.
Definition usb.c:2284
int usb_message(struct usb_endpoint *ep, unsigned int request, unsigned int value, unsigned int index, struct io_buffer *iobuf)
Enqueue USB message transfer.
Definition usb.c:492
static void usb_hotplug(void)
Handle newly attached or detached USB device.
Definition usb.c:1869
int usb_prefill(struct usb_endpoint *ep)
Prefill endpoint recycled buffer list.
Definition usb.c:620
int usb_endpoint_clear_halt(struct usb_endpoint *ep)
Clear endpoint halt (if applicable)
Definition usb.c:372
static int usb_attached(struct usb_port *port)
Handle newly attached USB device.
Definition usb.c:1760
static int usb_score(struct usb_device *usb, struct usb_configuration_descriptor *config)
Get USB device configuration score.
Definition usb.c:1203
int usb_endpoint_described(struct usb_endpoint *ep, struct usb_configuration_descriptor *config, struct usb_interface_descriptor *interface, unsigned int type, unsigned int index)
Describe USB endpoint from device configuration.
Definition usb.c:242
void free_usb_hub(struct usb_hub *hub)
Free USB hub.
Definition usb.c:2063
unsigned int usb_route_string(struct usb_device *usb)
Get USB route string.
Definition usb.c:2336
const char * usb_endpoint_name(struct usb_endpoint *ep)
Get USB endpoint name (for debugging)
Definition usb.c:221
void usb_port_changed(struct usb_port *port)
Report port status change.
Definition usb.c:1858
int usb_control(struct usb_device *usb, unsigned int request, unsigned int value, unsigned int index, void *data, size_t len)
Issue USB control transaction.
Definition usb.c:784
int usb_refill_limit(struct usb_endpoint *ep, unsigned int max)
Refill endpoint up to specified limit.
Definition usb.c:661
int usb_get_string_descriptor(struct usb_device *usb, unsigned int index, unsigned int language, char *buf, size_t len)
Get USB string descriptor.
Definition usb.c:916
struct usb_hub * alloc_usb_hub(struct usb_bus *bus, struct usb_device *usb, unsigned int ports, struct usb_hub_driver_operations *driver)
Allocate USB hub.
Definition usb.c:1937
static void usb_control_complete(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete USB control transfer.
Definition usb.c:755
static int usb_probe(struct usb_function *func, struct usb_configuration_descriptor *config)
Probe USB device driver.
Definition usb.c:1248
static unsigned int usb_get_default_language(struct usb_device *usb)
Get default language ID.
Definition usb.c:884
void unregister_usb_bus(struct usb_bus *bus)
Unregister USB bus.
Definition usb.c:2171
struct usb_bus * find_usb_bus(unsigned int address)
Find USB bus by address.
Definition usb.c:2220
static int usb_config_descriptor(struct usb_device *usb, unsigned int index, struct usb_configuration_descriptor **config)
Get USB configuration descriptor.
Definition usb.c:990
static int usb_endpoint_clear_tt(struct usb_endpoint *ep)
Clear transaction translator (if applicable)
Definition usb.c:341
static int usb_describe(struct usb_device *usb, struct usb_configuration_descriptor *config, unsigned int first, uint8_t *interfaces, struct usb_function_descriptor *desc)
Describe USB function.
Definition usb.c:1053
static void usb_remove(struct usb_function *func)
Remove USB device driver.
Definition usb.c:1286
static void usb_step(struct process *process __unused)
USB process.
Definition usb.c:1896
int usb_refill(struct usb_endpoint *ep)
Refill endpoint.
Definition usb.c:711
struct usb_interface_descriptor * usb_interface_descriptor(struct usb_configuration_descriptor *config, unsigned int interface, unsigned int alternate)
Locate USB interface descriptor.
Definition usb.c:144
int usb_find_next(struct usb_device **usb, uint16_t *busdev)
Find next USB device.
Definition usb.c:2302
static struct usb_endpoint_driver_operations usb_control_operations
USB control endpoint driver operations.
Definition usb.c:769
int register_usb_bus(struct usb_bus *bus)
Register USB bus.
Definition usb.c:2131
struct usb_bus * alloc_usb_bus(struct device *dev, unsigned int ports, size_t mtu, struct usb_host_operations *op)
Allocate USB bus.
Definition usb.c:2095
static void usb_remove_all(struct usb_device *usb)
Remove all device drivers.
Definition usb.c:1382
void free_usb_bus(struct usb_bus *bus)
Free USB bus.
Definition usb.c:2195
void usb_complete_err(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete transfer (possibly with error)
Definition usb.c:587
static int register_usb(struct usb_device *usb)
Register USB device.
Definition usb.c:1538
int usb_stream(struct usb_endpoint *ep, struct io_buffer *iobuf, int terminate)
Enqueue USB stream transfer.
Definition usb.c:546
static struct usb_device * alloc_usb(struct usb_port *port)
Allocate USB device.
Definition usb.c:1512
void unregister_usb_hub(struct usb_hub *hub)
Unregister USB hub.
Definition usb.c:2030
struct usb_port * usb_root_hub_port(struct usb_device *usb)
Get USB root hub port.
Definition usb.c:2356
static int usb_endpoint_mtu(struct usb_endpoint *ep, size_t mtu)
Update endpoint MTU.
Definition usb.c:464
static void usb_probe_all(struct usb_device *usb, struct usb_configuration_descriptor *config)
Probe all USB device drivers.
Definition usb.c:1299
static int usb_autoconfigure(struct usb_device *usb)
Choose our preferred USB device configuration.
Definition usb.c:1431
static struct usb_interface_association_descriptor * usb_interface_association_descriptor(struct usb_configuration_descriptor *config, unsigned int first)
Locate USB interface association descriptor.
Definition usb.c:120
static const char * usb_speed_name(unsigned int speed)
Get USB speed name (for debugging)
Definition usb.c:66
static struct list_head usb_halted
List of halted endpoints.
Definition usb.c:51
static void usb_deconfigure(struct usb_device *usb)
Clear USB device configuration.
Definition usb.c:1409
int register_usb_hub(struct usb_hub *hub)
Register USB hub.
Definition usb.c:1976
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition vsprintf.c:383