iPXE
usbio.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2015 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 );
25
26#include <stdlib.h>
27#include <string.h>
28#include <errno.h>
29#include <assert.h>
30#include <ipxe/efi/efi.h>
31#include <ipxe/efi/efi_driver.h>
32#include <ipxe/efi/efi_path.h>
33#include <ipxe/efi/efi_utils.h>
35#include <ipxe/usb.h>
36#include "usbio.h"
37
38/** @file
39 *
40 * EFI_USB_IO_PROTOCOL pseudo Host Controller Interface driver
41 *
42 *
43 * The EFI_USB_IO_PROTOCOL is an almost unbelievably poorly designed
44 * abstraction of a USB device. It would be just about forgivable for
45 * an API to support only synchronous operation for bulk OUT
46 * endpoints. It is imbecilic to support only synchronous operation
47 * for bulk IN endpoints. This apparently intern-designed API
48 * throttles a typical NIC down to 1.5% of its maximum throughput.
49 * That isn't a typo. It really is that slow.
50 *
51 * We can't even work around this stupidity by talking to the host
52 * controller abstraction directly, because an identical limitation
53 * exists in the EFI_USB2_HC_PROTOCOL.
54 *
55 * Unless you derive therapeutic value from watching download progress
56 * indicators lethargically creep through every single integer from 0
57 * to 100, you should use iPXE's native USB host controller drivers
58 * instead. (Or just upgrade from UEFI to "legacy" BIOS, which will
59 * produce a similar speed increase.)
60 *
61 *
62 * For added excitement, the EFI_USB_IO_PROTOCOL makes the
63 * (demonstrably incorrect) assumption that a USB driver needs to
64 * attach to exactly one interface within a USB device, and provides a
65 * helper method to retrieve "the" interface descriptor. Since pretty
66 * much every USB network device requires binding to a pair of
67 * control+data interfaces, this aspect of EFI_USB_IO_PROTOCOL is of
68 * no use to us.
69 *
70 * We have our own existing code for reading USB descriptors, so we
71 * don't actually care that the UsbGetInterfaceDescriptor() method
72 * provided by EFI_USB_IO_PROTOCOL is useless for network devices. We
73 * can read the descriptors ourselves (via UsbControlTransfer()) and
74 * get all of the information we need this way. We can even work
75 * around the fact that EFI_USB_IO_PROTOCOL provides separate handles
76 * for each of the two interfaces comprising our network device.
77 *
78 * However, if we discover that we need to select an alternative
79 * device configuration (e.g. for devices exposing both RNDIS and
80 * ECM), then all hell breaks loose. EFI_USB_IO_PROTOCOL starts to
81 * panic because its cached interface and endpoint descriptors will no
82 * longer be valid. As mentioned above, the cached descriptors are
83 * useless for network devices anyway so we _really_ don't care about
84 * this, but EFI_USB_IO_PROTOCOL certainly cares. It prints out a
85 * manic warning message containing no fewer than six exclamation
86 * marks and then literally commits seppuku in the middle of the
87 * UsbControlTransfer() method by attempting to uninstall itself.
88 * Quite how the caller is supposed to react when asked to stop using
89 * the EFI_USB_IO_PROTOCOL instance while in the middle of an
90 * uninterruptible call to said instance is left as an exercise for
91 * the interested reader.
92 *
93 * There is no sensible way to work around this, so we just
94 * preemptively fail if asked to change the device configuration, on
95 * the basis that reporting a sarcastic error message is often
96 * preferable to jumping through a NULL pointer and crashing the
97 * system.
98 */
99
100/* Disambiguate the various error causes */
101#define ENOTSUP_MORONIC_SPECIFICATION \
102 __einfo_error ( EINFO_ENOTSUP_MORONIC_SPECIFICATION )
103#define EINFO_ENOTSUP_MORONIC_SPECIFICATION \
104 __einfo_uniqify ( EINFO_ENOTSUP, 0x01, \
105 "EFI_USB_IO_PROTOCOL was designed by morons" )
106
107/******************************************************************************
108 *
109 * Device model
110 *
111 ******************************************************************************
112 */
113
114/**
115 * Determine endpoint interface number
116 *
117 * @v usbio USB I/O device
118 * @v ep USB Endpoint
119 * @ret interface Interface number, or negative error
120 */
121static int usbio_interface ( struct usbio_device *usbio,
122 struct usb_endpoint *ep ) {
123 EFI_HANDLE handle = usbio->handle;
124 struct usb_device *usb = ep->usb;
128 struct usb_function *func;
129 unsigned int i;
130
131 /* The control endpoint is not part of a described interface */
132 if ( ep->address == USB_EP0_ADDRESS )
133 return 0;
134
135 /* Iterate over all interface descriptors looking for a match */
136 config = usbio->config;
138
139 /* Skip non-interface descriptors */
140 if ( interface->header.type != USB_INTERFACE_DESCRIPTOR )
141 continue;
142
143 /* Iterate over all endpoint descriptors looking for a match */
144 for_each_interface_descriptor ( endpoint, config, interface ) {
145
146 /* Skip non-endpoint descriptors */
147 if ( endpoint->header.type != USB_ENDPOINT_DESCRIPTOR )
148 continue;
149
150 /* Check endpoint address */
151 if ( endpoint->endpoint != ep->address )
152 continue;
153
154 /* Check interface belongs to this function */
156
157 /* Skip non-matching functions */
158 if ( func->interface[0] != usbio->first )
159 continue;
160
161 /* Iterate over all interfaces for a match */
162 for ( i = 0 ; i < func->desc.count ; i++ ) {
163 if ( interface->interface ==
164 func->interface[i] )
165 return interface->interface;
166 }
167 }
168 }
169 }
170
171 DBGC ( usbio, "USBIO %s cannot find interface for %s",
173 return -ENOENT;
174}
175
176/**
177 * Open USB I/O interface
178 *
179 * @v usbio USB I/O device
180 * @v interface Interface number
181 * @ret rc Return status code
182 */
183static int usbio_open ( struct usbio_device *usbio, unsigned int interface ) {
184 EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
185 EFI_HANDLE handle = usbio->handle;
186 struct usbio_interface *intf = &usbio->interface[interface];
189 USB_DEVICE_PATH *usbpath;
190 EFI_STATUS efirc;
191 int rc;
192
193 /* Sanity check */
194 assert ( interface < usbio->config->interfaces );
195
196 /* If interface is already open, just increment the usage count */
197 if ( intf->count ) {
198 intf->count++;
199 return 0;
200 }
201
202 /* Construct device path for this interface */
203 path = usbio->path;
204 usbpath = usbio->usbpath;
205 usbpath->InterfaceNumber = interface;
206 end = efi_path_end ( path );
207
208 /* Locate handle for this endpoint's interface */
209 if ( ( efirc = bs->LocateDevicePath ( &efi_usb_io_protocol_guid, &path,
210 &intf->handle ) ) != 0 ) {
211 rc = -EEFI ( efirc );
212 DBGC ( usbio, "USBIO %s could not locate ",
214 DBGC ( usbio, "%s: %s\n",
215 efi_devpath_text ( usbio->path ), strerror ( rc ) );
216 return rc;
217 }
218
219 /* Check that expected path was located */
220 if ( path != end ) {
221 DBGC ( usbio, "USBIO %s located incomplete ",
223 DBGC ( usbio, "%s\n", efi_handle_name ( intf->handle ) );
224 return -EXDEV;
225 }
226
227 /* Open USB I/O protocol on this handle */
228 if ( ( rc = efi_open_by_driver ( intf->handle,
230 &intf->io ) ) != 0 ) {
231 DBGC ( usbio, "USBIO %s cannot open ",
233 DBGC ( usbio, "%s: %s\n",
234 efi_handle_name ( intf->handle ), strerror ( rc ) );
235 DBGC_EFI_OPENERS ( usbio, intf->handle,
237 return rc;
238 }
239
240 /* Increment usage count */
241 intf->count++;
242
243 return 0;
244}
245
246/**
247 * Close USB I/O interface
248 *
249 * @v usbio USB I/O device
250 * @v interface Interface number
251 */
252static void usbio_close ( struct usbio_device *usbio, unsigned int interface ) {
253 struct usbio_interface *intf = &usbio->interface[interface];
254
255 /* Sanity checks */
256 assert ( interface < usbio->config->interfaces );
257 assert ( intf->count > 0 );
258
259 /* Decrement usage count */
260 intf->count--;
261
262 /* Do nothing if interface is still in use */
263 if ( intf->count )
264 return;
265
266 /* Close USB I/O protocol */
268}
269
270/******************************************************************************
271 *
272 * Control endpoints
273 *
274 ******************************************************************************
275 */
276
277/**
278 * Open control endpoint
279 *
280 * @v endpoint Endpoint
281 * @ret rc Return status code
282 */
283static int usbio_control_open ( struct usbio_endpoint *endpoint __unused ) {
284
285 /* Nothing to do */
286 return 0;
287}
288
289/**
290 * Close control endpoint
291 *
292 * @v endpoint Endpoint
293 */
294static void usbio_control_close ( struct usbio_endpoint *endpoint __unused ) {
295
296 /* Nothing to do */
297}
298
299/**
300 * Poll control endpoint
301 *
302 * @v endpoint Endpoint
303 */
304static void usbio_control_poll ( struct usbio_endpoint *endpoint ) {
305 struct usbio_device *usbio = endpoint->usbio;
306 struct usb_endpoint *ep = endpoint->ep;
307 EFI_HANDLE handle = usbio->handle;
309 union {
310 struct usb_setup_packet setup;
312 } *msg;
314 struct io_buffer *iobuf;
315 unsigned int index;
316 unsigned int flags;
317 unsigned int recipient;
318 unsigned int interface;
320 void *data;
321 size_t len;
323 EFI_STATUS efirc;
324 int rc;
325
326 /* Do nothing if ring is empty */
327 if ( endpoint->cons == endpoint->prod )
328 return;
329
330 /* Consume next transfer */
331 index = ( endpoint->cons++ % USBIO_RING_COUNT );
332 iobuf = endpoint->iobuf[index];
333 flags = endpoint->flags[index];
334
335 /* Sanity check */
336 if ( ! ( flags & USBIO_MESSAGE ) ) {
337 DBGC ( usbio, "USBIO %s %s non-message transfer\n",
339 rc = -ENOTSUP;
340 goto err_not_message;
341 }
342
343 /* Construct transfer */
344 msg = iob_push ( iobuf, sizeof ( *msg ) );
345 iob_pull ( iobuf, sizeof ( *msg ) );
346 request = le16_to_cpu ( msg->setup.request );
347 len = iob_len ( iobuf );
348 if ( len ) {
349 data = iobuf->data;
350 direction = ( ( request & USB_DIR_IN ) ?
352 } else {
353 data = NULL;
355 }
356
357 /* Determine interface for this transfer */
358 recipient = ( request & USB_RECIP_MASK );
359 if ( recipient == USB_RECIP_INTERFACE ) {
360 /* Recipient is an interface: use interface number directly */
361 interface = le16_to_cpu ( msg->setup.index );
362 } else {
363 /* Route all other requests through the first interface */
364 interface = 0;
365 }
366
367 /* Open interface */
368 if ( ( rc = usbio_open ( usbio, interface ) ) != 0 )
369 goto err_open;
370 io = usbio->interface[interface].io;
371
372 /* Due to the design of EFI_USB_IO_PROTOCOL, attempting to set
373 * the configuration to a non-default value is basically a
374 * self-destruct button.
375 */
376 if ( ( request == USB_SET_CONFIGURATION ) &&
377 ( le16_to_cpu ( msg->setup.value ) != usbio->config->config ) ) {
379 DBGC ( usbio, "USBIO %s cannot change configuration: %s\n",
381 goto err_moronic_specification;
382 }
383
384 /* Submit transfer */
385 if ( ( efirc = io->UsbControlTransfer ( io, &msg->efi, direction, 0,
386 data, len, &status ) ) != 0 ) {
387 rc = -EEFI ( efirc );
388 DBGC ( usbio, "USBIO %s %s could not submit control transfer ",
390 DBGC ( usbio, "via %s: %s (status %04x)\n",
392 strerror ( rc ), status );
393 goto err_transfer;
394 }
395
396 /* Close interface */
397 usbio_close ( usbio, interface );
398
399 /* Complete transfer */
400 usb_complete ( ep, iobuf );
401
402 return;
403
404 err_transfer:
405 err_moronic_specification:
406 usbio_close ( usbio, interface );
407 err_open:
408 err_not_message:
409 usb_complete_err ( ep, iobuf, rc );
410}
411
412/** Control endpoint operations */
414 .open = usbio_control_open,
415 .close = usbio_control_close,
416 .poll = usbio_control_poll,
417};
418
419/******************************************************************************
420 *
421 * Bulk IN endpoints
422 *
423 ******************************************************************************
424 */
425
426/**
427 * Open bulk IN endpoint
428 *
429 * @v endpoint Endpoint
430 * @ret rc Return status code
431 */
432static int usbio_bulk_in_open ( struct usbio_endpoint *endpoint __unused ) {
433
434 /* Nothing to do */
435 return 0;
436}
437
438/**
439 * Close bulk IN endpoint
440 *
441 * @v endpoint Endpoint
442 */
443static void usbio_bulk_in_close ( struct usbio_endpoint *endpoint __unused ) {
444
445 /* Nothing to do */
446}
447
448/**
449 * Poll bulk IN endpoint
450 *
451 * @v endpoint Endpoint
452 */
453static void usbio_bulk_in_poll ( struct usbio_endpoint *endpoint ) {
454 struct usbio_device *usbio = endpoint->usbio;
455 struct usb_endpoint *ep = endpoint->ep;
456 EFI_USB_IO_PROTOCOL *io = endpoint->io;
457 EFI_HANDLE handle = usbio->handle;
458 struct io_buffer *iobuf;
459 unsigned int index;
460 UINTN len;
462 EFI_STATUS efirc;
463 int rc;
464
465 /* Do nothing if ring is empty */
466 if ( endpoint->cons == endpoint->prod )
467 return;
468
469 /* Attempt (but do not yet consume) next transfer */
470 index = ( endpoint->cons % USBIO_RING_COUNT );
471 iobuf = endpoint->iobuf[index];
472
473 /* Construct transfer */
474 len = iob_len ( iobuf );
475
476 /* Upon being turned on, the EFI_USB_IO_PROTOCOL did nothing
477 * for several minutes before firing a small ARP packet a few
478 * millimetres into the ether.
479 */
480 efirc = io->UsbBulkTransfer ( io, ep->address, iobuf->data,
481 &len, 1, &status );
482 if ( efirc == EFI_TIMEOUT )
483 return;
484
485 /* Consume transfer */
486 endpoint->cons++;
487
488 /* Check for failure */
489 if ( efirc != 0 ) {
490 rc = -EEFI ( efirc );
491 DBGC2 ( usbio, "USBIO %s %s could not submit bulk IN transfer: "
492 "%s (status %04x)\n", efi_handle_name ( handle ),
493 usb_endpoint_name ( ep ), strerror ( rc ), status );
494 usb_complete_err ( ep, iobuf, rc );
495 return;
496 }
497
498 /* Update length */
499 iob_put ( iobuf, ( len - iob_len ( iobuf ) ) );
500
501 /* Complete transfer */
502 usb_complete ( ep, iobuf );
503}
504
505/** Bulk endpoint operations */
507 .open = usbio_bulk_in_open,
508 .close = usbio_bulk_in_close,
509 .poll = usbio_bulk_in_poll,
510};
511
512/******************************************************************************
513 *
514 * Bulk OUT endpoints
515 *
516 ******************************************************************************
517 */
518
519/**
520 * Open bulk OUT endpoint
521 *
522 * @v endpoint Endpoint
523 * @ret rc Return status code
524 */
525static int usbio_bulk_out_open ( struct usbio_endpoint *endpoint __unused ) {
526
527 /* Nothing to do */
528 return 0;
529}
530
531/**
532 * Close bulk OUT endpoint
533 *
534 * @v endpoint Endpoint
535 */
536static void usbio_bulk_out_close ( struct usbio_endpoint *endpoint __unused ) {
537
538 /* Nothing to do */
539}
540
541/**
542 * Poll bulk OUT endpoint
543 *
544 * @v endpoint Endpoint
545 */
546static void usbio_bulk_out_poll ( struct usbio_endpoint *endpoint ) {
547 struct usbio_device *usbio = endpoint->usbio;
548 struct usb_endpoint *ep = endpoint->ep;
549 EFI_USB_IO_PROTOCOL *io = endpoint->io;
550 EFI_HANDLE handle = usbio->handle;
551 struct io_buffer *iobuf;
552 unsigned int index;
553 unsigned int flags;
554 UINTN len;
556 EFI_STATUS efirc;
557 int rc;
558
559 /* Do nothing if ring is empty */
560 if ( endpoint->cons == endpoint->prod )
561 return;
562
563 /* Consume next transfer */
564 index = ( endpoint->cons++ % USBIO_RING_COUNT );
565 iobuf = endpoint->iobuf[index];
566 flags = endpoint->flags[index];
567
568 /* Construct transfer */
569 len = iob_len ( iobuf );
570
571 /* Submit transfer */
572 if ( ( efirc = io->UsbBulkTransfer ( io, ep->address, iobuf->data,
573 &len, 0, &status ) ) != 0 ) {
574 rc = -EEFI ( efirc );
575 DBGC ( usbio, "USBIO %s %s could not submit bulk OUT transfer: "
576 "%s (status %04x)\n", efi_handle_name ( handle ),
577 usb_endpoint_name ( ep ), strerror ( rc ), status );
578 goto err;
579 }
580
581 /* Update length */
582 iob_put ( iobuf, ( len - iob_len ( iobuf ) ) );
583
584 /* Submit zero-length transfer if required */
585 len = 0;
586 if ( ( flags & USBIO_ZLEN ) &&
587 ( efirc = io->UsbBulkTransfer ( io, ep->address, NULL, &len, 0,
588 &status ) ) != 0 ) {
589 rc = -EEFI ( efirc );
590 DBGC ( usbio, "USBIO %s %s could not submit zero-length "
591 "transfer: %s (status %04x)\n",
593 strerror ( rc ), status );
594 goto err;
595 }
596
597 /* Complete transfer */
598 usb_complete ( ep, iobuf );
599
600 return;
601
602 err:
603 usb_complete_err ( ep, iobuf, rc );
604}
605
606/** Bulk endpoint operations */
608 .open = usbio_bulk_out_open,
609 .close = usbio_bulk_out_close,
610 .poll = usbio_bulk_out_poll,
611};
612
613/******************************************************************************
614 *
615 * Interrupt endpoints
616 *
617 ******************************************************************************
618 *
619 * The EFI_USB_IO_PROTOCOL provides two ways to interact with
620 * interrupt endpoints, neither of which naturally model the hardware
621 * interaction. The UsbSyncInterruptTransfer() method allows imposes
622 * a 1ms overhead for every interrupt transfer (which could result in
623 * up to a 50% decrease in overall throughput for the device). The
624 * UsbAsyncInterruptTransfer() method provides no way for us to
625 * prevent transfers when no I/O buffers are available.
626 *
627 * We work around this design by utilising a small, fixed ring buffer
628 * into which the interrupt callback delivers the data. This aims to
629 * provide buffer space even if no I/O buffers have yet been enqueued.
630 * The scheme is not guaranteed since the fixed ring buffer may also
631 * become full. However:
632 *
633 * - devices which send a constant stream of interrupts (and which
634 * therefore might exhaust the fixed ring buffer) tend to be
635 * responding to every interrupt request, and can tolerate lost
636 * packets, and
637 *
638 * - devices which cannot tolerate lost interrupt packets tend to send
639 * only a few small messages.
640 *
641 * The scheme should therefore work in practice.
642 */
643
644/**
645 * Interrupt endpoint callback
646 *
647 * @v data Received data
648 * @v len Length of received data
649 * @v context Callback context
650 * @v status Transfer status
651 * @ret efirc EFI status code
652 */
654 VOID *context,
655 UINT32 status ) {
656 struct usbio_interrupt_ring *intr = context;
657 struct usbio_endpoint *endpoint = intr->endpoint;
658 struct usbio_device *usbio = endpoint->usbio;
659 struct usb_endpoint *ep = endpoint->ep;
660 EFI_HANDLE handle = usbio->handle;
661 unsigned int fill;
662 unsigned int index;
663
664 /* Sanity check */
666
667 /* Do nothing if ring is empty */
668 fill = ( intr->prod - intr->cons );
669 if ( fill >= USBIO_INTR_COUNT ) {
670 DBGC ( usbio, "USBIO %s %s dropped interrupt completion\n",
672 return 0;
673 }
674
675 /* Do nothing if transfer was unsuccessful */
676 if ( status != 0 ) {
677 DBGC ( usbio, "USBIO %s %s interrupt completion status %04x\n",
679 status );
680 return 0; /* Unclear what failure actually means here */
681 }
682
683 /* Copy data to buffer and increment producer counter */
684 index = ( intr->prod % USBIO_INTR_COUNT );
685 memcpy ( intr->data[index], data, len );
686 intr->len[index] = len;
687 intr->prod++;
688
689 return 0;
690}
691
692/**
693 * Open interrupt endpoint
694 *
695 * @v endpoint Endpoint
696 * @ret rc Return status code
697 */
698static int usbio_interrupt_open ( struct usbio_endpoint *endpoint ) {
699 struct usbio_device *usbio = endpoint->usbio;
701 struct usb_endpoint *ep = endpoint->ep;
702 EFI_USB_IO_PROTOCOL *io = endpoint->io;
703 EFI_HANDLE handle = usbio->handle;
704 unsigned int interval;
705 unsigned int i;
706 void *data;
707 EFI_STATUS efirc;
708 int rc;
709
710 /* Allocate interrupt ring buffer */
711 intr = zalloc ( sizeof ( *intr ) + ( USBIO_INTR_COUNT * ep->mtu ) );
712 if ( ! intr ) {
713 rc = -ENOMEM;
714 goto err_alloc;
715 }
716 endpoint->intr = intr;
717 intr->endpoint = endpoint;
718 data = ( ( ( void * ) intr ) + sizeof ( *intr ) );
719 for ( i = 0 ; i < USBIO_INTR_COUNT ; i++ ) {
720 intr->data[i] = data;
721 data += ep->mtu;
722 }
723
724 /* Determine polling interval */
725 interval = ( ep->interval >> 3 /* microframes -> milliseconds */ );
726 if ( ! interval )
727 interval = 1; /* May not be zero */
728
729 /* Add to periodic schedule */
730 if ( ( efirc = io->UsbAsyncInterruptTransfer ( io, ep->address, TRUE,
731 interval, ep->mtu,
733 intr ) ) != 0 ) {
734 rc = -EEFI ( efirc );
735 DBGC ( usbio, "USBIO %s %s could not schedule interrupt "
736 "transfer: %s\n", efi_handle_name ( handle ),
737 usb_endpoint_name ( ep ), strerror ( rc ) );
738 goto err_schedule;
739 }
740
741 return 0;
742
743 io->UsbAsyncInterruptTransfer ( io, ep->address, FALSE, 0, 0,
744 NULL, NULL );
745 err_schedule:
746 free ( intr );
747 err_alloc:
748 return rc;
749}
750
751/**
752 * Close interrupt endpoint
753 *
754 * @v endpoint Endpoint
755 */
756static void usbio_interrupt_close ( struct usbio_endpoint *endpoint ) {
757 struct usb_endpoint *ep = endpoint->ep;
758 EFI_USB_IO_PROTOCOL *io = endpoint->io;
759
760 /* Remove from periodic schedule */
761 io->UsbAsyncInterruptTransfer ( io, ep->address, FALSE, 0, 0,
762 NULL, NULL );
763
764 /* Free interrupt ring buffer */
765 free ( endpoint->intr );
766}
767
768/**
769 * Poll interrupt endpoint
770 *
771 * @v endpoint Endpoint
772 */
773static void usbio_interrupt_poll ( struct usbio_endpoint *endpoint ) {
775 struct usb_endpoint *ep = endpoint->ep;
776 struct io_buffer *iobuf;
777 unsigned int index;
778 unsigned int intr_index;
779 size_t len;
780
781 /* Do nothing if ring is empty */
782 if ( endpoint->cons == endpoint->prod )
783 return;
784
785 /* Do nothing if interrupt ring is empty */
786 if ( intr->cons == intr->prod )
787 return;
788
789 /* Consume next transfer */
790 index = ( endpoint->cons++ % USBIO_RING_COUNT );
791 iobuf = endpoint->iobuf[index];
792
793 /* Populate I/O buffer */
794 intr_index = ( intr->cons++ % USBIO_INTR_COUNT );
795 len = intr->len[intr_index];
796 assert ( len <= iob_len ( iobuf ) );
797 iob_put ( iobuf, ( len - iob_len ( iobuf ) ) );
798 memcpy ( iobuf->data, intr->data[intr_index], len );
799
800 /* Complete transfer */
801 usb_complete ( ep, iobuf );
802}
803
804/** Interrupt endpoint operations */
810
811/******************************************************************************
812 *
813 * Endpoint operations
814 *
815 ******************************************************************************
816 */
817
818/**
819 * Open endpoint
820 *
821 * @v ep USB endpoint
822 * @ret rc Return status code
823 */
824static int usbio_endpoint_open ( struct usb_endpoint *ep ) {
825 struct usb_bus *bus = ep->usb->port->hub->bus;
826 struct usbio_device *usbio = usb_bus_get_hostdata ( bus );
827 struct usbio_endpoint *endpoint;
829 unsigned int attr = ( ep->attributes & USB_ENDPOINT_ATTR_TYPE_MASK );
830 int interface;
831 int rc;
832
833 /* Allocate and initialise structure */
834 endpoint = zalloc ( sizeof ( *endpoint ) );
835 if ( ! endpoint ) {
836 rc = -ENOMEM;
837 goto err_alloc;
838 }
839 usb_endpoint_set_hostdata ( ep, endpoint );
840 endpoint->usbio = usbio;
841 endpoint->ep = ep;
842
843 /* Identify endpoint operations */
845 endpoint->op = &usbio_control_operations;
846 } else if ( attr == USB_ENDPOINT_ATTR_BULK ) {
847 endpoint->op = ( ( ep->address & USB_DIR_IN ) ?
850 } else if ( attr == USB_ENDPOINT_ATTR_INTERRUPT ) {
851 endpoint->op = &usbio_interrupt_operations;
852 } else {
853 rc = -ENOTSUP;
854 goto err_operations;
855 }
856
857 /* Identify interface for this endpoint */
858 interface = usbio_interface ( usbio, ep );
859 if ( interface < 0 ) {
860 rc = interface;
861 goto err_interface;
862 }
863 endpoint->interface = interface;
864
865 /* Open interface */
866 if ( ( rc = usbio_open ( usbio, interface ) ) != 0 )
867 goto err_open_interface;
868 endpoint->handle = usbio->interface[interface].handle;
869 endpoint->io = usbio->interface[interface].io;
870 DBGC ( usbio, "USBIO %s %s using ",
872 DBGC ( usbio, "%s\n", efi_handle_name ( endpoint->handle ) );
873
874 /* Open endpoint */
875 if ( ( rc = endpoint->op->open ( endpoint ) ) != 0 )
876 goto err_open_endpoint;
877
878 /* Add to list of endpoints */
879 list_add_tail ( &endpoint->list, &usbio->endpoints );
880
881 return 0;
882
883 list_del ( &endpoint->list );
884 endpoint->op->close ( endpoint );
885 err_open_endpoint:
886 usbio_close ( usbio, interface );
887 err_open_interface:
888 err_interface:
889 err_operations:
890 free ( endpoint );
891 err_alloc:
892 return rc;
893}
894
895/**
896 * Close endpoint
897 *
898 * @v ep USB endpoint
899 */
900static void usbio_endpoint_close ( struct usb_endpoint *ep ) {
901 struct usbio_endpoint *endpoint = usb_endpoint_get_hostdata ( ep );
902 struct usbio_device *usbio = endpoint->usbio;
903 struct io_buffer *iobuf;
904 unsigned int index;
905
906 /* Remove from list of endpoints */
907 list_del ( &endpoint->list );
908
909 /* Close endpoint */
910 endpoint->op->close ( endpoint );
911
912 /* Close interface */
913 usbio_close ( usbio, endpoint->interface );
914
915 /* Cancel any incomplete transfers */
916 while ( endpoint->cons != endpoint->prod ) {
917 index = ( endpoint->cons++ % USBIO_RING_COUNT );
918 iobuf = endpoint->iobuf[index];
919 usb_complete_err ( ep, iobuf, -ECANCELED );
920 }
921
922 /* Free endpoint */
923 free ( endpoint );
924}
925
926/**
927 * Reset endpoint
928 *
929 * @v ep USB endpoint
930 * @ret rc Return status code
931 */
932static int usbio_endpoint_reset ( struct usb_endpoint *ep __unused ) {
933
934 /* Nothing to do */
935 return 0;
936}
937
938/**
939 * Update MTU
940 *
941 * @v ep USB endpoint
942 * @ret rc Return status code
943 */
944static int usbio_endpoint_mtu ( struct usb_endpoint *ep __unused ) {
945
946 /* Nothing to do */
947 return 0;
948}
949
950/**
951 * Enqueue transfer
952 *
953 * @v ep USB endpoint
954 * @v iobuf I/O buffer
955 * @v flags Transfer flags
956 * @ret rc Return status code
957 */
958static int usbio_endpoint_enqueue ( struct usb_endpoint *ep,
959 struct io_buffer *iobuf,
960 unsigned int flags ) {
961 struct usbio_endpoint *endpoint = usb_endpoint_get_hostdata ( ep );
962 unsigned int fill;
963 unsigned int index;
964
965 /* Fail if shutdown is in progress */
967 return -ECANCELED;
968
969 /* Fail if transfer ring is full */
970 fill = ( endpoint->prod - endpoint->cons );
971 if ( fill >= USBIO_RING_COUNT )
972 return -ENOBUFS;
973
974 /* Add to ring */
975 index = ( endpoint->prod++ % USBIO_RING_COUNT );
976 endpoint->iobuf[index] = iobuf;
977 endpoint->flags[index] = flags;
978
979 return 0;
980}
981
982/**
983 * Enqueue message transfer
984 *
985 * @v ep USB endpoint
986 * @v iobuf I/O buffer
987 * @ret rc Return status code
988 */
990 struct io_buffer *iobuf ) {
991 struct usb_setup_packet *setup;
992
993 /* Adjust I/O buffer to start of data payload */
994 assert ( iob_len ( iobuf ) >= sizeof ( *setup ) );
995 iob_pull ( iobuf, sizeof ( *setup ) );
996
997 /* Enqueue transfer */
998 return usbio_endpoint_enqueue ( ep, iobuf, USBIO_MESSAGE );
999}
1000
1001/**
1002 * Enqueue stream transfer
1003 *
1004 * @v ep USB endpoint
1005 * @v iobuf I/O buffer
1006 * @v zlp Append a zero-length packet
1007 * @ret rc Return status code
1008 */
1009static int usbio_endpoint_stream ( struct usb_endpoint *ep,
1010 struct io_buffer *iobuf, int zlp ) {
1011
1012 /* Enqueue transfer */
1013 return usbio_endpoint_enqueue ( ep, iobuf, ( zlp ? USBIO_ZLEN : 0 ) );
1014}
1015
1016/**
1017 * Poll for completions
1018 *
1019 * @v endpoint Endpoint
1020 */
1021static void usbio_endpoint_poll ( struct usbio_endpoint *endpoint ) {
1022
1023 /* Do nothing if shutdown is in progress */
1025 return;
1026
1027 /* Poll endpoint */
1028 endpoint->op->poll ( endpoint );
1029}
1030
1031/******************************************************************************
1032 *
1033 * Device operations
1034 *
1035 ******************************************************************************
1036 */
1037
1038/**
1039 * Open device
1040 *
1041 * @v usb USB device
1042 * @ret rc Return status code
1043 */
1044static int usbio_device_open ( struct usb_device *usb ) {
1045 struct usbio_device *usbio =
1046 usb_bus_get_hostdata ( usb->port->hub->bus );
1047
1048 usb_set_hostdata ( usb, usbio );
1049 return 0;
1050}
1051
1052/**
1053 * Close device
1054 *
1055 * @v usb USB device
1056 */
1057static void usbio_device_close ( struct usb_device *usb __unused ) {
1058
1059 /* Nothing to do */
1060}
1061
1062/**
1063 * Assign device address
1064 *
1065 * @v usb USB device
1066 * @ret rc Return status code
1067 */
1068static int usbio_device_address ( struct usb_device *usb __unused ) {
1069
1070 /* Nothing to do */
1071 return 0;
1072}
1073
1074/******************************************************************************
1075 *
1076 * Hub operations
1077 *
1078 ******************************************************************************
1079 */
1080
1081/**
1082 * Open hub
1083 *
1084 * @v hub USB hub
1085 * @ret rc Return status code
1086 */
1087static int usbio_hub_open ( struct usb_hub *hub ) {
1088
1089 /* Disallow non-root hubs */
1090 if ( hub->usb )
1091 return -ENOTSUP;
1092
1093 /* Nothing to do */
1094 return 0;
1095}
1096
1097/**
1098 * Close hub
1099 *
1100 * @v hub USB hub
1101 */
1102static void usbio_hub_close ( struct usb_hub *hub __unused ) {
1103
1104 /* Nothing to do */
1105}
1106
1107/******************************************************************************
1108 *
1109 * Root hub operations
1110 *
1111 ******************************************************************************
1112 */
1113
1114/**
1115 * Open root hub
1116 *
1117 * @v hub USB hub
1118 * @ret rc Return status code
1119 */
1120static int usbio_root_open ( struct usb_hub *hub __unused ) {
1121
1122 /* Nothing to do */
1123 return 0;
1124}
1125
1126/**
1127 * Close root hub
1128 *
1129 * @v hub USB hub
1130 */
1131static void usbio_root_close ( struct usb_hub *hub __unused ) {
1132
1133 /* Nothing to do */
1134}
1135
1136/**
1137 * Enable port
1138 *
1139 * @v hub USB hub
1140 * @v port USB port
1141 * @ret rc Return status code
1142 */
1143static int usbio_root_enable ( struct usb_hub *hub __unused,
1144 struct usb_port *port __unused ) {
1145
1146 /* Nothing to do */
1147 return 0;
1148}
1149
1150/**
1151 * Disable port
1152 *
1153 * @v hub USB hub
1154 * @v port USB port
1155 * @ret rc Return status code
1156 */
1157static int usbio_root_disable ( struct usb_hub *hub __unused,
1158 struct usb_port *port __unused ) {
1159
1160 /* Nothing to do */
1161 return 0;
1162}
1163
1164/**
1165 * Update root hub port speed
1166 *
1167 * @v hub USB hub
1168 * @v port USB port
1169 * @ret rc Return status code
1170 */
1171static int usbio_root_speed ( struct usb_hub *hub __unused,
1172 struct usb_port *port ) {
1173
1174 /* Not actually exposed via EFI_USB_IO_PROTOCOL */
1175 port->speed = USB_SPEED_HIGH;
1176 return 0;
1177}
1178
1179/**
1180 * Clear transaction translator buffer
1181 *
1182 * @v hub USB hub
1183 * @v port USB port
1184 * @v ep USB endpoint
1185 * @ret rc Return status code
1186 */
1187static int usbio_root_clear_tt ( struct usb_hub *hub __unused,
1188 struct usb_port *port __unused,
1189 struct usb_endpoint *ep __unused ) {
1190
1191 /* Should never be called; this is a root hub */
1192 return -ENOTSUP;
1193}
1194
1195/******************************************************************************
1196 *
1197 * Bus operations
1198 *
1199 ******************************************************************************
1200 */
1201
1202/**
1203 * Open USB bus
1204 *
1205 * @v bus USB bus
1206 * @ret rc Return status code
1207 */
1208static int usbio_bus_open ( struct usb_bus *bus __unused ) {
1209
1210 /* Nothing to do */
1211 return 0;
1212}
1213
1214/**
1215 * Close USB bus
1216 *
1217 * @v bus USB bus
1218 */
1219static void usbio_bus_close ( struct usb_bus *bus __unused ) {
1220
1221 /* Nothing to do */
1222}
1223
1224/**
1225 * Poll USB bus
1226 *
1227 * @v bus USB bus
1228 */
1229static void usbio_bus_poll ( struct usb_bus *bus ) {
1230 struct usbio_device *usbio = usb_bus_get_hostdata ( bus );
1231 struct usbio_endpoint *endpoint;
1232
1233 /* Poll all endpoints. We trust that completion handlers are
1234 * minimal and will not do anything that could plausibly
1235 * affect the endpoint list itself.
1236 */
1237 list_for_each_entry ( endpoint, &usbio->endpoints, list )
1238 usbio_endpoint_poll ( endpoint );
1239}
1240
1241/******************************************************************************
1242 *
1243 * EFI driver interface
1244 *
1245 ******************************************************************************
1246 */
1247
1248/** USB I/O host controller driver operations */
1250 .endpoint = {
1251 .open = usbio_endpoint_open,
1252 .close = usbio_endpoint_close,
1253 .reset = usbio_endpoint_reset,
1254 .mtu = usbio_endpoint_mtu,
1255 .message = usbio_endpoint_message,
1256 .stream = usbio_endpoint_stream,
1257 },
1258 .device = {
1259 .open = usbio_device_open,
1260 .close = usbio_device_close,
1261 .address = usbio_device_address,
1262 },
1263 .bus = {
1264 .open = usbio_bus_open,
1265 .close = usbio_bus_close,
1266 .poll = usbio_bus_poll,
1267 },
1268 .hub = {
1269 .open = usbio_hub_open,
1270 .close = usbio_hub_close,
1271 },
1272 .root = {
1273 .open = usbio_root_open,
1274 .close = usbio_root_close,
1275 .enable = usbio_root_enable,
1276 .disable = usbio_root_disable,
1277 .speed = usbio_root_speed,
1278 .clear_tt = usbio_root_clear_tt,
1279 },
1280};
1281
1282/**
1283 * Check to see if driver supports a device
1284 *
1285 * @v handle EFI device handle
1286 * @ret rc Return status code
1287 */
1292 struct usb_driver *driver;
1293 struct usb_device_id *id;
1295 EFI_STATUS efirc;
1296 int rc;
1297
1298 /* Get protocol */
1300 &io ) ) != 0 ) {
1301 DBGCP ( handle, "USB %s is not a USB device\n",
1302 efi_handle_name ( handle ) );
1303 return rc;
1304 }
1305
1306 /* Get device descriptor */
1307 if ( ( efirc = io->UsbGetDeviceDescriptor ( io, &device ) ) != 0 ) {
1308 rc = -EEFI ( efirc );
1309 DBGC ( handle, "USB %s could not get device descriptor: "
1310 "%s\n", efi_handle_name ( handle ), strerror ( rc ) );
1311 return rc;
1312 }
1313 memset ( &desc, 0, sizeof ( desc ) );
1314 desc.vendor = device.IdVendor;
1315 desc.product = device.IdProduct;
1316
1317 /* Get interface descriptor */
1318 if ( ( efirc = io->UsbGetInterfaceDescriptor ( io, &interface ) ) != 0){
1319 rc = -EEFI ( efirc );
1320 DBGC ( handle, "USB %s could not get interface descriptor: "
1321 "%s\n", efi_handle_name ( handle ), strerror ( rc ) );
1322 return rc;
1323 }
1324 desc.class.class.class = interface.InterfaceClass;
1325 desc.class.class.subclass = interface.InterfaceSubClass;
1326 desc.class.class.protocol = interface.InterfaceProtocol;
1327
1328 /* Look for a driver for this interface */
1329 driver = usb_find_driver ( &desc, &id );
1330 if ( ! driver )
1331 return -ENOTSUP;
1332
1333 return 0;
1334}
1335
1336/**
1337 * Fetch configuration descriptor
1338 *
1339 * @v usbio USB I/O device
1340 * @ret rc Return status code
1341 */
1342static int usbio_config ( struct usbio_device *usbio ) {
1343 EFI_HANDLE handle = usbio->handle;
1344 EFI_USB_IO_PROTOCOL *io = usbio->io;
1347 union {
1348 struct usb_setup_packet setup;
1350 } msg;
1351 UINT32 status;
1352 size_t len;
1353 unsigned int count;
1354 unsigned int value;
1355 unsigned int i;
1356 EFI_STATUS efirc;
1357 int rc;
1358
1359 /* Get device descriptor */
1360 if ( ( efirc = io->UsbGetDeviceDescriptor ( io, &device ) ) != 0 ) {
1361 rc = -EEFI ( efirc );
1362 DBGC ( usbio, "USB %s could not get device descriptor: "
1363 "%s\n", efi_handle_name ( handle ), strerror ( rc ) );
1364 goto err_get_device_descriptor;
1365 }
1366 count = device.NumConfigurations;
1367
1368 /* Get current partial configuration descriptor */
1369 if ( ( efirc = io->UsbGetConfigDescriptor ( io, &partial ) ) != 0 ) {
1370 rc = -EEFI ( efirc );
1371 DBGC ( usbio, "USB %s could not get partial configuration "
1372 "descriptor: %s\n", efi_handle_name ( handle ),
1373 strerror ( rc ) );
1374 goto err_get_configuration_descriptor;
1375 }
1376 len = le16_to_cpu ( partial.TotalLength );
1377
1378 /* Allocate configuration descriptor */
1379 usbio->config = malloc ( len );
1380 if ( ! usbio->config ) {
1381 rc = -ENOMEM;
1382 goto err_alloc;
1383 }
1384
1385 /* There is, naturally, no way to retrieve the entire device
1386 * configuration descriptor via EFI_USB_IO_PROTOCOL. Worse,
1387 * there is no way to even retrieve the index of the current
1388 * configuration descriptor. We have to iterate over all
1389 * possible configuration descriptors looking for the
1390 * descriptor that matches the current configuration value.
1391 */
1392 for ( i = 0 ; i < count ; i++ ) {
1393
1394 /* Construct request */
1395 msg.setup.request = cpu_to_le16 ( USB_GET_DESCRIPTOR );
1396 value = ( ( USB_CONFIGURATION_DESCRIPTOR << 8 ) | i );
1397 msg.setup.value = cpu_to_le16 ( value );
1398 msg.setup.index = 0;
1399 msg.setup.len = cpu_to_le16 ( len );
1400
1401 /* Get full configuration descriptor */
1402 if ( ( efirc = io->UsbControlTransfer ( io, &msg.efi,
1403 EfiUsbDataIn, 0,
1404 usbio->config, len,
1405 &status ) ) != 0 ) {
1406 rc = -EEFI ( efirc );
1407 DBGC ( usbio, "USB %s could not get configuration %d "
1408 "descriptor: %s\n", efi_handle_name ( handle ),
1409 i, strerror ( rc ) );
1410 goto err_control_transfer;
1411 }
1412
1413 /* Ignore unless this is the current configuration */
1414 if ( usbio->config->config != partial.ConfigurationValue )
1415 continue;
1416
1417 /* Check length */
1418 if ( le16_to_cpu ( usbio->config->len ) != len ) {
1419 DBGC ( usbio, "USB %s configuration descriptor length "
1420 "mismatch\n", efi_handle_name ( handle ) );
1421 rc = -EINVAL;
1422 goto err_len;
1423 }
1424
1425 return 0;
1426 }
1427
1428 /* No match found */
1429 DBGC ( usbio, "USB %s could not find current configuration "
1430 "descriptor\n", efi_handle_name ( handle ) );
1431 rc = -ENOENT;
1432
1433 err_len:
1434 err_control_transfer:
1435 free ( usbio->config );
1436 err_alloc:
1437 err_get_configuration_descriptor:
1438 err_get_device_descriptor:
1439 return rc;
1440}
1441
1442/**
1443 * Construct device path for opening other interfaces
1444 *
1445 * @v usbio USB I/O device
1446 * @ret rc Return status code
1447 */
1448static int usbio_path ( struct usbio_device *usbio ) {
1449 EFI_HANDLE handle = usbio->handle;
1452 USB_DEVICE_PATH *usbpath;
1453 size_t len;
1454 int rc;
1455
1456 /* Open device path protocol */
1458 &path ) ) != 0 ) {
1459 DBGC ( usbio, "USBIO %s cannot open device path protocol: "
1460 "%s\n", efi_handle_name ( handle ), strerror ( rc ) );
1461 return rc;
1462 }
1463
1464 /* Locate end of device path and sanity check */
1465 len = efi_path_len ( path );
1466 if ( len < sizeof ( *usbpath ) ) {
1467 DBGC ( usbio, "USBIO %s underlength device path\n",
1468 efi_handle_name ( handle ) );
1469 return -EINVAL;
1470 }
1471 usbpath = ( ( ( void * ) path ) + len - sizeof ( *usbpath ) );
1472 if ( ! ( ( usbpath->Header.Type == MESSAGING_DEVICE_PATH ) &&
1473 ( usbpath->Header.SubType == MSG_USB_DP ) ) ) {
1474 DBGC ( usbio, "USBIO %s not a USB device path: ",
1475 efi_handle_name ( handle ) );
1476 DBGC ( usbio, "%s\n", efi_devpath_text ( path ) );
1477 return -EINVAL;
1478 }
1479
1480 /* Allocate copy of device path */
1481 usbio->path = malloc ( len + sizeof ( *end ) );
1482 if ( ! usbio->path )
1483 return -ENOMEM;
1484 memcpy ( usbio->path, path, ( len + sizeof ( *end ) ) );
1485 usbio->usbpath = ( ( ( void * ) usbio->path ) + len -
1486 sizeof ( *usbpath ) );
1487
1488 return 0;
1489}
1490
1491/**
1492 * Construct interface list
1493 *
1494 * @v usbio USB I/O device
1495 * @ret rc Return status code
1496 */
1497static int usbio_interfaces ( struct usbio_device *usbio ) {
1498 EFI_HANDLE handle = usbio->handle;
1499 EFI_USB_IO_PROTOCOL *io = usbio->io;
1501 unsigned int first;
1502 unsigned int count;
1503 EFI_STATUS efirc;
1504 int rc;
1505
1506 /* Get interface descriptor */
1507 if ( ( efirc = io->UsbGetInterfaceDescriptor ( io, &interface ) ) != 0){
1508 rc = -EEFI ( efirc );
1509 DBGC ( usbio, "USB %s could not get interface descriptor: "
1510 "%s\n", efi_handle_name ( handle ), strerror ( rc ) );
1511 goto err_get_interface_descriptor;
1512 }
1513
1514 /* Record first interface number */
1515 first = interface.InterfaceNumber;
1516 count = usbio->config->interfaces;
1517 assert ( first < count );
1518 usbio->first = first;
1519
1520 /* Allocate interface list */
1521 usbio->interface = zalloc ( count * sizeof ( usbio->interface[0] ) );
1522 if ( ! usbio->interface ) {
1523 rc = -ENOMEM;
1524 goto err_alloc;
1525 }
1526
1527 /* Use already-opened protocol for control transfers and for
1528 * the first interface.
1529 */
1530 usbio->interface[0].handle = handle;
1531 usbio->interface[0].io = io;
1532 usbio->interface[0].count = 1;
1533 usbio->interface[first].handle = handle;
1534 usbio->interface[first].io = io;
1535 usbio->interface[first].count = 1;
1536
1537 return 0;
1538
1539 free ( usbio->interface );
1540 err_alloc:
1541 err_get_interface_descriptor:
1542 return rc;
1543}
1544
1545/**
1546 * Exclude existing drivers
1547 *
1548 * @v device EFI device handle
1549 * @ret rc Return status code
1550 */
1553 int rc;
1554
1555 /* Exclude existing USB I/O protocol drivers */
1556 if ( ( rc = efi_driver_exclude ( device, protocol ) ) != 0 ) {
1557 DBGC ( device, "USBIO %s could not exclude drivers: %s\n",
1558 efi_handle_name ( device ), strerror ( rc ) );
1559 return rc;
1560 }
1561
1562 return 0;
1563}
1564
1565/**
1566 * Attach driver to device
1567 *
1568 * @v efidev EFI device
1569 * @ret rc Return status code
1570 */
1571static int usbio_start ( struct efi_device *efidev ) {
1572 EFI_HANDLE handle = efidev->device;
1573 struct usbio_device *usbio;
1574 struct usb_port *port;
1575 int rc;
1576
1577 /* Allocate and initialise structure */
1578 usbio = zalloc ( sizeof ( *usbio ) );
1579 if ( ! usbio ) {
1580 rc = -ENOMEM;
1581 goto err_alloc;
1582 }
1583 efidev_set_drvdata ( efidev, usbio );
1584 usbio->handle = handle;
1585 INIT_LIST_HEAD ( &usbio->endpoints );
1586
1587 /* Open USB I/O protocol */
1589 &usbio->io ) ) != 0 ) {
1590 DBGC ( usbio, "USBIO %s cannot open USB I/O protocol: %s\n",
1591 efi_handle_name ( handle ), strerror ( rc ) );
1593 goto err_open_usbio;
1594 }
1595
1596 /* Describe generic device */
1597 efi_device_info ( handle, "USB", &usbio->dev );
1598 usbio->dev.parent = &efidev->dev;
1599 list_add ( &usbio->dev.siblings, &efidev->dev.children );
1600 INIT_LIST_HEAD ( &usbio->dev.children );
1601
1602 /* Fetch configuration descriptor */
1603 if ( ( rc = usbio_config ( usbio ) ) != 0 )
1604 goto err_config;
1605
1606 /* Construct device path */
1607 if ( ( rc = usbio_path ( usbio ) ) != 0 )
1608 goto err_path;
1609
1610 /* Construct interface list */
1611 if ( ( rc = usbio_interfaces ( usbio ) ) != 0 )
1612 goto err_interfaces;
1613
1614 /* Allocate USB bus */
1615 usbio->bus = alloc_usb_bus ( &usbio->dev, 1 /* single "port" */,
1617 if ( ! usbio->bus ) {
1618 rc = -ENOMEM;
1619 goto err_alloc_bus;
1620 }
1621 usb_bus_set_hostdata ( usbio->bus, usbio );
1622 usb_hub_set_drvdata ( usbio->bus->hub, usbio );
1623
1624 /* Set port protocol */
1625 port = usb_port ( usbio->bus->hub, 1 );
1626 port->protocol = USB_PROTO_2_0;
1627
1628 /* Register USB bus */
1629 if ( ( rc = register_usb_bus ( usbio->bus ) ) != 0 )
1630 goto err_register;
1631
1632 return 0;
1633
1634 unregister_usb_bus ( usbio->bus );
1635 err_register:
1636 free_usb_bus ( usbio->bus );
1637 err_alloc_bus:
1638 free ( usbio->interface );
1639 err_interfaces:
1640 free ( usbio->path );
1641 err_path:
1642 free ( usbio->config );
1643 err_config:
1644 list_del ( &usbio->dev.siblings );
1646 err_open_usbio:
1647 free ( usbio );
1648 err_alloc:
1649 return rc;
1650}
1651
1652/**
1653 * Detach driver from device
1654 *
1655 * @v efidev EFI device
1656 */
1657static void usbio_stop ( struct efi_device *efidev ) {
1658 EFI_HANDLE handle = efidev->device;
1659 struct usbio_device *usbio = efidev_get_drvdata ( efidev );
1660
1661 unregister_usb_bus ( usbio->bus );
1662 free_usb_bus ( usbio->bus );
1663 free ( usbio->interface );
1664 free ( usbio->path );
1665 free ( usbio->config );
1666 list_del ( &usbio->dev.siblings );
1668 free ( usbio );
1669}
1670
1671/** EFI USB I/O driver */
1673 .name = "USBIO",
1674 .supported = usbio_supported,
1675 .exclude = usbio_exclude,
1676 .start = usbio_start,
1677 .stop = usbio_stop,
1678};
UINT64 UINTN
Unsigned value of native width.
#define EFIAPI
unsigned int UINT32
4-byte unsigned value.
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
#define VOID
Undeclared type.
Definition Base.h:272
u8 port
Port number.
Definition CIB_PRM.h:3
#define MSG_USB_DP
USB Device Path SubType.
Definition DevicePath.h:421
#define MESSAGING_DEVICE_PATH
Messaging Device Paths.
Definition DevicePath.h:324
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
#define EFI_TIMEOUT
Enumeration of EFI_STATUS.
GUID EFI_GUID
128-bit buffer containing a unique identifier value.
EFI Usb I/O Protocol as defined in UEFI specification.
USB_DEVICE_DESCRIPTOR EFI_USB_DEVICE_DESCRIPTOR
Definition UsbIo.h:39
EFI_USB_DATA_DIRECTION
USB data transfer direction.
Definition UsbIo.h:47
@ EfiUsbNoData
Definition UsbIo.h:50
@ EfiUsbDataIn
Definition UsbIo.h:48
@ EfiUsbDataOut
Definition UsbIo.h:49
struct _EFI_USB_IO_PROTOCOL EFI_USB_IO_PROTOCOL
Definition UsbIo.h:29
USB_CONFIG_DESCRIPTOR EFI_USB_CONFIG_DESCRIPTOR
Definition UsbIo.h:40
USB_INTERFACE_DESCRIPTOR EFI_USB_INTERFACE_DESCRIPTOR
Definition UsbIo.h:41
USB_DEVICE_REQUEST EFI_USB_DEVICE_REQUEST
Definition UsbIo.h:38
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
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
ring len
Length.
Definition dwmac.h:226
uint8_t bus
Bus.
Definition edd.h:1
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition efi_debug.c:652
const char * efi_devpath_text(EFI_DEVICE_PATH_PROTOCOL *path)
Get textual representation of device path.
Definition efi_debug.c:247
int efi_driver_exclude(EFI_HANDLE device, EFI_GUID *protocol)
Try to disconnect an existing EFI driver.
Definition efi_driver.c:438
EFI driver interface.
#define EFI_DRIVER_HARDWARE
Hardware drivers.
Definition efi_driver.h:73
#define __efi_driver(order)
Declare an EFI driver.
Definition efi_driver.h:70
static void * efidev_get_drvdata(struct efi_device *efidev)
Get EFI driver-private data.
Definition efi_driver.h:98
static void efidev_set_drvdata(struct efi_device *efidev, void *priv)
Set EFI driver-private data.
Definition efi_driver.h:87
EFI_GUID efi_device_path_protocol_guid
Device path protocol GUID.
Definition efi_guid.c:169
EFI_GUID efi_usb_io_protocol_guid
USB I/O protocol GUID.
Definition efi_guid.c:429
int efi_shutdown_in_progress
EFI shutdown is in progress.
Definition efi_init.c:60
void efi_close_by_driver(EFI_HANDLE handle, EFI_GUID *protocol)
Close protocol opened for persistent use by a driver.
Definition efi_open.c:279
size_t efi_path_len(EFI_DEVICE_PATH_PROTOCOL *path)
Find length of device path (excluding terminator)
Definition efi_path.c:174
EFI_DEVICE_PATH_PROTOCOL * efi_path_end(EFI_DEVICE_PATH_PROTOCOL *path)
Find end of device path.
Definition efi_path.c:163
EFI device paths.
void efi_device_info(EFI_HANDLE device, const char *prefix, struct device *dev)
Get underlying device information.
Definition efi_utils.c:189
EFI utilities.
uint8_t direction
Direction.
Definition ena.h:3
uint8_t id
Request identifier.
Definition ena.h:1
uint8_t data[48]
Additional event data.
Definition ena.h:11
uint32_t mtu
Maximum MTU.
Definition ena.h:17
uint8_t flags
Flags.
Definition ena.h:7
uint8_t status
Status.
Definition ena.h:5
struct ena_llq_option desc
Descriptor counts.
Definition ena.h:9
uint8_t intr
Interrupts enabled.
Definition ena.h:3
Error codes.
#define __unused
Declare a variable or data structure as unused.
Definition compiler.h:573
#define DBGC2(...)
Definition compiler.h:522
#define DBGCP(...)
Definition compiler.h:539
#define DBGC(...)
Definition compiler.h:505
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 ENOENT
No such file or directory.
Definition errno.h:515
#define EINVAL
Invalid argument.
Definition errno.h:429
#define EXDEV
Improper link.
Definition errno.h:685
#define ENOMEM
Not enough space.
Definition errno.h:535
#define ENOTSUP
Operation not supported.
Definition errno.h:590
#define ECANCELED
Operation canceled.
Definition errno.h:344
#define ENOBUFS
No buffer space available.
Definition errno.h:499
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
EFI API.
#define efi_open_by_driver(handle, protocol, interface)
Open protocol for persistent use by a driver.
Definition efi.h:474
#define efi_open(handle, protocol, interface)
Open protocol for ephemeral use.
Definition efi.h:444
#define EFI_HANDLE
Definition efi.h:53
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition efi.h:175
#define DBGC_EFI_OPENERS(...)
Definition efi.h:345
EFI_SYSTEM_TABLE * efi_systab
uint16_t handle
Handle.
Definition smbios.h:5
Universal Serial Bus (USB)
#define USB_ENDPOINT_DESCRIPTOR
A USB endpoint descriptor.
Definition usb.h:278
#define USB_ENDPOINT_ATTR_BULK
Bulk endpoint transfer type.
Definition usb.h:290
@ USB_PROTO_2_0
USB 2.0.
Definition usb.h:23
#define USB_INTERFACE_DESCRIPTOR
A USB interface descriptor.
Definition usb.h:261
#define USB_CONFIGURATION_DESCRIPTOR
A USB configuration descriptor.
Definition usb.h:228
#define USB_DIR_IN
Data transfer is from device to host.
Definition usb.h:98
static struct usb_port * usb_port(struct usb_hub *hub, unsigned int address)
Get USB port.
Definition usb.h:960
#define for_each_interface_descriptor(desc, config, interface)
Iterate over all configuration descriptors within an interface descriptor.
Definition usb.h:394
static void * usb_endpoint_get_hostdata(struct usb_endpoint *ep)
Get USB endpoint host controller private data.
Definition usb.h:587
static void usb_complete(struct usb_endpoint *ep, struct io_buffer *iobuf)
Complete transfer (without error)
Definition usb.h:1087
#define for_each_config_descriptor(desc, config)
Iterate over all configuration descriptors.
Definition usb.h:386
static void usb_endpoint_set_hostdata(struct usb_endpoint *ep, void *priv)
Set USB endpoint host controller private data.
Definition usb.h:576
#define USB_ENDPOINT_ATTR_INTERRUPT
Interrupt endpoint transfer type.
Definition usb.h:293
static void * usb_bus_get_hostdata(struct usb_bus *bus)
Get USB bus host controller private data.
Definition usb.h:1062
#define USB_ENDPOINT_ATTR_TYPE_MASK
Endpoint attribute transfer type mask.
Definition usb.h:281
@ USB_SPEED_HIGH
High speed (480Mbps)
Definition usb.h:53
#define USB_ENDPOINT_ATTR_CONTROL
Control endpoint transfer type.
Definition usb.h:287
#define USB_GET_DESCRIPTOR
Get descriptor.
Definition usb.h:137
#define USB_RECIP_MASK
Request recipient mask.
Definition usb.h:110
static void usb_set_hostdata(struct usb_device *usb, void *priv)
Set USB device host controller private data.
Definition usb.h:784
#define USB_EP0_ADDRESS
Control endpoint address.
Definition usb.h:501
static void usb_hub_set_drvdata(struct usb_hub *hub, void *priv)
Set USB hub driver private data.
Definition usb.h:937
#define USB_SET_CONFIGURATION
Set configuration.
Definition usb.h:146
static void usb_bus_set_hostdata(struct usb_bus *bus, void *priv)
Set USB bus host controller private data.
Definition usb.h:1051
#define USB_RECIP_INTERFACE
Request recipient is an interface.
Definition usb.h:116
String functions.
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void * memset(void *dest, int character, size_t len) __nonnull
#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_pull(iobuf, len)
Definition iobuf.h:107
uint8_t attr
Type and attributes.
Definition librm.h:7
#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_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
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition message.c:62
uint32_t end
Ending offset.
Definition netvsc.h:7
uint32_t first
First block in range.
Definition pccrr.h:1
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
uint16_t protocol
Protocol ID.
Definition stp.h:7
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
EFI Boot Services Table.
Definition UefiSpec.h:1931
EFI_LOCATE_DEVICE_PATH LocateDevicePath
Definition UefiSpec.h:1972
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition DevicePath.h:46
UINT8 Type
0x01 Hardware Device Path.
Definition DevicePath.h:47
UINT8 SubType
Varies by Type 0xFF End Entire Device Path, or 0x01 End This Instance of a Device Path and start a ne...
Definition DevicePath.h:54
UINT8 ConfigurationValue
Definition Usb.h:133
UINT16 TotalLength
Definition Usb.h:131
UINT8 InterfaceNumber
USB Interface Number.
Definition DevicePath.h:431
EFI_DEVICE_PATH_PROTOCOL Header
Definition DevicePath.h:423
EFI_USB_IO_GET_CONFIG_DESCRIPTOR UsbGetConfigDescriptor
Definition UsbIo.h:494
EFI_USB_IO_GET_INTERFACE_DESCRIPTOR UsbGetInterfaceDescriptor
Definition UsbIo.h:495
EFI_USB_IO_CONTROL_TRANSFER UsbControlTransfer
Definition UsbIo.h:483
EFI_USB_IO_BULK_TRANSFER UsbBulkTransfer
Definition UsbIo.h:484
EFI_USB_IO_GET_DEVICE_DESCRIPTOR UsbGetDeviceDescriptor
Definition UsbIo.h:493
EFI_USB_IO_ASYNC_INTERRUPT_TRANSFER UsbAsyncInterruptTransfer
Definition UsbIo.h:485
A hardware device.
Definition device.h:77
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
An EFI device.
Definition efi_driver.h:18
EFI_HANDLE device
EFI device handle.
Definition efi_driver.h:22
struct device dev
Generic device.
Definition efi_driver.h:20
An EFI driver.
Definition efi_driver.h:34
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
A USB bus.
Definition usb.h:966
struct usb_hub * hub
Root hub.
Definition usb.h:995
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
uint8_t type
Descriptor type.
Definition usb.h:177
A USB device ID.
Definition usb.h:1361
A USB device.
Definition usb.h:723
struct usb_port * port
USB port.
Definition usb.h:727
struct list_head functions
List of functions.
Definition usb.h:737
struct usb_endpoint * ep[32]
Endpoint list.
Definition usb.h:745
A USB driver.
Definition usb.h:1419
A USB endpoint descriptor.
Definition usb.h:264
uint8_t endpoint
Endpoint address.
Definition usb.h:268
struct usb_descriptor_header header
Descriptor header.
Definition usb.h:266
A USB endpoint.
Definition usb.h:404
size_t mtu
Maximum transfer size.
Definition usb.h:412
struct usb_device * usb
USB device.
Definition usb.h:406
unsigned int attributes
Attributes.
Definition usb.h:410
unsigned int interval
Interval (in microframes)
Definition usb.h:416
unsigned int address
Endpoint address.
Definition usb.h:408
A USB function descriptor.
Definition usb.h:657
unsigned int count
Number of interfaces.
Definition usb.h:665
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
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
USB host controller operations.
Definition usb.h:1031
A USB hub.
Definition usb.h:841
struct usb_bus * bus
USB bus.
Definition usb.h:845
struct usb_device * usb
Underlying USB device, if any.
Definition usb.h:847
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
A USB setup data packet.
Definition usb.h:83
A USB I/O protocol device.
Definition usbio.h:126
uint8_t first
First interface number.
Definition usbio.h:143
struct list_head endpoints
List of endpoints.
Definition usbio.h:150
struct usb_bus * bus
USB bus.
Definition usbio.h:148
struct usbio_interface * interface
USB I/O protocol interfaces.
Definition usbio.h:145
struct device dev
Generic device.
Definition usbio.h:132
EFI_HANDLE handle
EFI device handle.
Definition usbio.h:128
USB_DEVICE_PATH * usbpath
Final component of USB device path.
Definition usbio.h:140
struct usb_configuration_descriptor * config
Configuration descriptor.
Definition usbio.h:135
EFI_DEVICE_PATH_PROTOCOL * path
Device path.
Definition usbio.h:138
EFI_USB_IO_PROTOCOL * io
USB I/O protocol.
Definition usbio.h:130
A USB I/O endpoint.
Definition usbio.h:53
EFI_USB_IO_PROTOCOL * io
USB I/O protocol.
Definition usbio.h:68
EFI_HANDLE handle
EFI handle.
Definition usbio.h:66
struct usbio_interrupt_ring * intr
Interrupt ring buffer (if applicable)
Definition usbio.h:80
unsigned int cons
Consumer counter.
Definition usbio.h:73
struct usb_endpoint * ep
USB endpoint.
Definition usbio.h:57
struct io_buffer * iobuf[USBIO_RING_COUNT]
I/O buffers.
Definition usbio.h:75
struct usbio_operations * op
USB I/O endpoint operations.
Definition usbio.h:61
struct usbio_device * usbio
USB I/O device.
Definition usbio.h:55
unsigned int interface
Containing interface number.
Definition usbio.h:64
struct list_head list
List of endpoints.
Definition usbio.h:59
unsigned int prod
Producer counter.
Definition usbio.h:71
uint8_t flags[USBIO_RING_COUNT]
Flags.
Definition usbio.h:77
A USB I/O protocol interface.
Definition usbio.h:112
unsigned int count
Usage count.
Definition usbio.h:118
EFI_USB_IO_PROTOCOL * io
USB I/O protocol.
Definition usbio.h:116
EFI_HANDLE handle
EFI device handle.
Definition usbio.h:114
A USB interrupt ring buffer.
Definition usbio.h:33
struct usbio_endpoint * endpoint
USB I/O endpoint.
Definition usbio.h:35
USB I/O endpoint operations.
Definition usbio.h:92
void(* close)(struct usbio_endpoint *endpoint)
Close endpoint.
Definition usbio.h:103
int(* open)(struct usbio_endpoint *endpoint)
Open endpoint.
Definition usbio.h:98
void(* poll)(struct usbio_endpoint *endpoint)
Poll endpoint.
Definition usbio.h:108
#define TRUE
Definition tlan.h:46
#define FALSE
Definition tlan.h:45
struct usb_driver * usb_find_driver(struct usb_function_descriptor *desc, struct usb_device_id **id)
Find USB device driver.
Definition usb.c:1167
const char * usb_endpoint_name(struct usb_endpoint *ep)
Get USB endpoint name (for debugging)
Definition usb.c:221
void unregister_usb_bus(struct usb_bus *bus)
Unregister USB bus.
Definition usb.c:2171
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
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 usbio_path(struct usbio_device *usbio)
Construct device path for opening other interfaces.
Definition usbio.c:1448
static int usbio_device_address(struct usb_device *usb __unused)
Assign device address.
Definition usbio.c:1068
static int usbio_endpoint_open(struct usb_endpoint *ep)
Open endpoint.
Definition usbio.c:824
static int usbio_supported(EFI_HANDLE handle)
Check to see if driver supports a device.
Definition usbio.c:1288
static int usbio_exclude(EFI_HANDLE device)
Exclude existing drivers.
Definition usbio.c:1551
static int usbio_endpoint_message(struct usb_endpoint *ep, struct io_buffer *iobuf)
Enqueue message transfer.
Definition usbio.c:989
static int usbio_root_disable(struct usb_hub *hub __unused, struct usb_port *port __unused)
Disable port.
Definition usbio.c:1157
static void usbio_bulk_in_poll(struct usbio_endpoint *endpoint)
Poll bulk IN endpoint.
Definition usbio.c:453
static void usbio_control_close(struct usbio_endpoint *endpoint __unused)
Close control endpoint.
Definition usbio.c:294
static EFI_STATUS EFIAPI usbio_interrupt_callback(VOID *data, UINTN len, VOID *context, UINT32 status)
Interrupt endpoint callback.
Definition usbio.c:653
static void usbio_interrupt_close(struct usbio_endpoint *endpoint)
Close interrupt endpoint.
Definition usbio.c:756
static int usbio_endpoint_mtu(struct usb_endpoint *ep __unused)
Update MTU.
Definition usbio.c:944
static int usbio_root_clear_tt(struct usb_hub *hub __unused, struct usb_port *port __unused, struct usb_endpoint *ep __unused)
Clear transaction translator buffer.
Definition usbio.c:1187
static int usbio_interrupt_open(struct usbio_endpoint *endpoint)
Open interrupt endpoint.
Definition usbio.c:698
static int usbio_endpoint_enqueue(struct usb_endpoint *ep, struct io_buffer *iobuf, unsigned int flags)
Enqueue transfer.
Definition usbio.c:958
static void usbio_root_close(struct usb_hub *hub __unused)
Close root hub.
Definition usbio.c:1131
static void usbio_close(struct usbio_device *usbio, unsigned int interface)
Close USB I/O interface.
Definition usbio.c:252
static int usbio_interface(struct usbio_device *usbio, struct usb_endpoint *ep)
Determine endpoint interface number.
Definition usbio.c:121
static int usbio_bus_open(struct usb_bus *bus __unused)
Open USB bus.
Definition usbio.c:1208
static void usbio_bulk_in_close(struct usbio_endpoint *endpoint __unused)
Close bulk IN endpoint.
Definition usbio.c:443
static struct usbio_operations usbio_control_operations
Control endpoint operations.
Definition usbio.c:413
static int usbio_device_open(struct usb_device *usb)
Open device.
Definition usbio.c:1044
static struct usbio_operations usbio_interrupt_operations
Interrupt endpoint operations.
Definition usbio.c:805
static struct usbio_operations usbio_bulk_in_operations
Bulk endpoint operations.
Definition usbio.c:506
static int usbio_bulk_in_open(struct usbio_endpoint *endpoint __unused)
Open bulk IN endpoint.
Definition usbio.c:432
static int usbio_hub_open(struct usb_hub *hub)
Open hub.
Definition usbio.c:1087
static void usbio_bus_close(struct usb_bus *bus __unused)
Close USB bus.
Definition usbio.c:1219
static int usbio_root_open(struct usb_hub *hub __unused)
Open root hub.
Definition usbio.c:1120
static int usbio_start(struct efi_device *efidev)
Attach driver to device.
Definition usbio.c:1571
static int usbio_config(struct usbio_device *usbio)
Fetch configuration descriptor.
Definition usbio.c:1342
static int usbio_root_enable(struct usb_hub *hub __unused, struct usb_port *port __unused)
Enable port.
Definition usbio.c:1143
static int usbio_interfaces(struct usbio_device *usbio)
Construct interface list.
Definition usbio.c:1497
static void usbio_endpoint_poll(struct usbio_endpoint *endpoint)
Poll for completions.
Definition usbio.c:1021
static int usbio_endpoint_stream(struct usb_endpoint *ep, struct io_buffer *iobuf, int zlp)
Enqueue stream transfer.
Definition usbio.c:1009
static void usbio_interrupt_poll(struct usbio_endpoint *endpoint)
Poll interrupt endpoint.
Definition usbio.c:773
static int usbio_root_speed(struct usb_hub *hub __unused, struct usb_port *port)
Update root hub port speed.
Definition usbio.c:1171
static int usbio_open(struct usbio_device *usbio, unsigned int interface)
Open USB I/O interface.
Definition usbio.c:183
static void usbio_bus_poll(struct usb_bus *bus)
Poll USB bus.
Definition usbio.c:1229
static void usbio_hub_close(struct usb_hub *hub __unused)
Close hub.
Definition usbio.c:1102
static int usbio_endpoint_reset(struct usb_endpoint *ep __unused)
Reset endpoint.
Definition usbio.c:932
static struct usbio_operations usbio_bulk_out_operations
Bulk endpoint operations.
Definition usbio.c:607
static int usbio_control_open(struct usbio_endpoint *endpoint __unused)
Open control endpoint.
Definition usbio.c:283
static void usbio_control_poll(struct usbio_endpoint *endpoint)
Poll control endpoint.
Definition usbio.c:304
static void usbio_bulk_out_close(struct usbio_endpoint *endpoint __unused)
Close bulk OUT endpoint.
Definition usbio.c:536
static void usbio_stop(struct efi_device *efidev)
Detach driver from device.
Definition usbio.c:1657
static int usbio_bulk_out_open(struct usbio_endpoint *endpoint __unused)
Open bulk OUT endpoint.
Definition usbio.c:525
static void usbio_device_close(struct usb_device *usb __unused)
Close device.
Definition usbio.c:1057
#define ENOTSUP_MORONIC_SPECIFICATION
Definition usbio.c:101
static void usbio_bulk_out_poll(struct usbio_endpoint *endpoint)
Poll bulk OUT endpoint.
Definition usbio.c:546
static void usbio_endpoint_close(struct usb_endpoint *ep)
Close endpoint.
Definition usbio.c:900
EFI_USB_IO_PROTOCOL pseudo Host Controller Interface driver.
@ USBIO_MESSAGE
This is a message transfer.
Definition usbio.h:86
@ USBIO_ZLEN
This transfer requires zero-length packet termination.
Definition usbio.h:88
#define USBIO_RING_COUNT
USB I/O ring buffer size.
Definition usbio.h:50
#define USBIO_MTU
USB I/O maximum transfer size.
Definition usbio.h:24
#define USBIO_INTR_COUNT
USB I/O interrupt ring buffer size.
Definition usbio.h:30