2 * Copyright (C) 2015 Michael Brown <mbrown@fensystems.co.uk>.
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.
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.
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
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.
24 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL
);
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>
34 #include <ipxe/efi/Protocol/UsbIo.h>
40 * EFI_USB_IO_PROTOCOL pseudo Host Controller Interface driver
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.
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.
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.)
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
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.
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.
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
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" )
107 /******************************************************************************
111 ******************************************************************************
115 * Determine endpoint interface number
117 * @v usbio USB I/O device
119 * @ret interface Interface number, or negative error
121 static 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
;
125 struct usb_configuration_descriptor
*config
;
126 struct usb_interface_descriptor
*interface
;
127 struct usb_endpoint_descriptor
*endpoint
;
128 struct usb_function
*func
;
131 /* The control endpoint is not part of a described interface */
132 if ( ep
->address
== USB_EP0_ADDRESS
)
135 /* Iterate over all interface descriptors looking for a match */
136 config
= usbio
->config
;
137 for_each_config_descriptor ( interface
, config
) {
139 /* Skip non-interface descriptors */
140 if ( interface
->header
.type
!= USB_INTERFACE_DESCRIPTOR
)
143 /* Iterate over all endpoint descriptors looking for a match */
144 for_each_interface_descriptor ( endpoint
, config
, interface
) {
146 /* Skip non-endpoint descriptors */
147 if ( endpoint
->header
.type
!= USB_ENDPOINT_DESCRIPTOR
)
150 /* Check endpoint address */
151 if ( endpoint
->endpoint
!= ep
->address
)
154 /* Check interface belongs to this function */
155 list_for_each_entry ( func
, &usb
->functions
, list
) {
157 /* Skip non-matching functions */
158 if ( func
->interface
[0] != usbio
->first
)
161 /* Iterate over all interfaces for a match */
162 for ( i
= 0 ; i
< func
->desc
.count
; i
++ ) {
163 if ( interface
->interface
==
165 return interface
->interface
;
171 DBGC ( usbio
, "USBIO %s cannot find interface for %s",
172 efi_handle_name ( handle
), usb_endpoint_name ( ep
) );
177 * Open USB I/O interface
179 * @v usbio USB I/O device
180 * @v interface Interface number
181 * @ret rc Return status code
183 static 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
];
187 EFI_DEVICE_PATH_PROTOCOL
*path
;
188 EFI_DEVICE_PATH_PROTOCOL
*end
;
189 USB_DEVICE_PATH
*usbpath
;
192 EFI_USB_IO_PROTOCOL
*io
;
198 assert ( interface
< usbio
->config
->interfaces
);
200 /* If interface is already open, just increment the usage count */
206 /* Construct device path for this interface */
208 usbpath
= usbio
->usbpath
;
209 usbpath
->InterfaceNumber
= interface
;
210 end
= efi_path_end ( path
);
212 /* Locate handle for this endpoint's interface */
213 if ( ( efirc
= bs
->LocateDevicePath ( &efi_usb_io_protocol_guid
, &path
,
214 &intf
->handle
) ) != 0 ) {
215 rc
= -EEFI ( efirc
);
216 DBGC ( usbio
, "USBIO %s could not locate ",
217 efi_handle_name ( handle
) );
218 DBGC ( usbio
, "%s: %s\n",
219 efi_devpath_text ( usbio
->path
), strerror ( rc
) );
223 /* Check that expected path was located */
225 DBGC ( usbio
, "USBIO %s located incomplete ",
226 efi_handle_name ( handle
) );
227 DBGC ( usbio
, "%s\n", efi_handle_name ( intf
->handle
) );
231 /* Open USB I/O protocol on this handle */
232 if ( ( efirc
= bs
->OpenProtocol ( intf
->handle
,
233 &efi_usb_io_protocol_guid
,
234 &u
.interface
, efi_image_handle
,
236 ( EFI_OPEN_PROTOCOL_BY_DRIVER
|
237 EFI_OPEN_PROTOCOL_EXCLUSIVE
)))!=0){
238 rc
= -EEFI ( efirc
);
239 DBGC ( usbio
, "USBIO %s cannot open ",
240 efi_handle_name ( handle
) );
241 DBGC ( usbio
, "%s: %s\n",
242 efi_handle_name ( intf
->handle
), strerror ( rc
) );
243 DBGC_EFI_OPENERS ( usbio
, intf
->handle
,
244 &efi_usb_io_protocol_guid
);
249 /* Increment usage count */
256 * Close USB I/O interface
258 * @v usbio USB I/O device
259 * @v interface Interface number
261 static void usbio_close ( struct usbio_device
*usbio
, unsigned int interface
) {
262 EFI_BOOT_SERVICES
*bs
= efi_systab
->BootServices
;
263 struct usbio_interface
*intf
= &usbio
->interface
[interface
];
266 assert ( interface
< usbio
->config
->interfaces
);
267 assert ( intf
->count
> 0 );
269 /* Decrement usage count */
272 /* Do nothing if interface is still in use */
276 /* Close USB I/O protocol */
277 bs
->CloseProtocol ( intf
->handle
, &efi_usb_io_protocol_guid
,
278 efi_image_handle
, intf
->handle
);
281 /******************************************************************************
285 ******************************************************************************
289 * Open control endpoint
291 * @v endpoint Endpoint
292 * @ret rc Return status code
294 static int usbio_control_open ( struct usbio_endpoint
*endpoint __unused
) {
301 * Close control endpoint
303 * @v endpoint Endpoint
305 static void usbio_control_close ( struct usbio_endpoint
*endpoint __unused
) {
311 * Poll control endpoint
313 * @v endpoint Endpoint
315 static void usbio_control_poll ( struct usbio_endpoint
*endpoint
) {
316 struct usbio_device
*usbio
= endpoint
->usbio
;
317 struct usb_endpoint
*ep
= endpoint
->ep
;
318 EFI_HANDLE handle
= usbio
->handle
;
319 EFI_USB_IO_PROTOCOL
*io
;
321 struct usb_setup_packet setup
;
322 EFI_USB_DEVICE_REQUEST efi
;
324 EFI_USB_DATA_DIRECTION direction
;
325 struct io_buffer
*iobuf
;
328 unsigned int recipient
;
329 unsigned int interface
;
337 /* Do nothing if ring is empty */
338 if ( endpoint
->cons
== endpoint
->prod
)
341 /* Consume next transfer */
342 index
= ( endpoint
->cons
++ % USBIO_RING_COUNT
);
343 iobuf
= endpoint
->iobuf
[index
];
344 flags
= endpoint
->flags
[index
];
347 if ( ! ( flags
& USBIO_MESSAGE
) ) {
348 DBGC ( usbio
, "USBIO %s %s non-message transfer\n",
349 efi_handle_name ( handle
), usb_endpoint_name ( ep
) );
351 goto err_not_message
;
354 /* Construct transfer */
355 msg
= iob_push ( iobuf
, sizeof ( *msg
) );
356 iob_pull ( iobuf
, sizeof ( *msg
) );
357 request
= le16_to_cpu ( msg
->setup
.request
);
358 len
= iob_len ( iobuf
);
361 direction
= ( ( request
& USB_DIR_IN
) ?
362 EfiUsbDataIn
: EfiUsbDataOut
);
365 direction
= EfiUsbNoData
;
368 /* Determine interface for this transfer */
369 recipient
= ( request
& USB_RECIP_MASK
);
370 if ( recipient
== USB_RECIP_INTERFACE
) {
371 /* Recipient is an interface: use interface number directly */
372 interface
= le16_to_cpu ( msg
->setup
.index
);
374 /* Route all other requests through the first interface */
379 if ( ( rc
= usbio_open ( usbio
, interface
) ) != 0 )
381 io
= usbio
->interface
[interface
].io
;
383 /* Due to the design of EFI_USB_IO_PROTOCOL, attempting to set
384 * the configuration to a non-default value is basically a
385 * self-destruct button.
387 if ( ( request
== USB_SET_CONFIGURATION
) &&
388 ( le16_to_cpu ( msg
->setup
.value
) != usbio
->config
->config
) ) {
389 rc
= -ENOTSUP_MORONIC_SPECIFICATION
;
390 DBGC ( usbio
, "USBIO %s cannot change configuration: %s\n",
391 efi_handle_name ( handle
), strerror ( rc
) );
392 goto err_moronic_specification
;
395 /* Submit transfer */
396 if ( ( efirc
= io
->UsbControlTransfer ( io
, &msg
->efi
, direction
, 0,
397 data
, len
, &status
) ) != 0 ) {
398 rc
= -EEFI ( efirc
);
399 DBGC ( usbio
, "USBIO %s %s could not submit control transfer ",
400 efi_handle_name ( handle
), usb_endpoint_name ( ep
) );
401 DBGC ( usbio
, "via %s: %s (status %04x)\n",
402 efi_handle_name ( usbio
->interface
[interface
].handle
),
403 strerror ( rc
), status
);
407 /* Close interface */
408 usbio_close ( usbio
, interface
);
410 /* Complete transfer */
411 usb_complete ( ep
, iobuf
);
416 err_moronic_specification
:
417 usbio_close ( usbio
, interface
);
420 usb_complete_err ( ep
, iobuf
, rc
);
423 /** Control endpoint operations */
424 static struct usbio_operations usbio_control_operations
= {
425 .open
= usbio_control_open
,
426 .close
= usbio_control_close
,
427 .poll
= usbio_control_poll
,
430 /******************************************************************************
434 ******************************************************************************
438 * Open bulk IN endpoint
440 * @v endpoint Endpoint
441 * @ret rc Return status code
443 static int usbio_bulk_in_open ( struct usbio_endpoint
*endpoint __unused
) {
450 * Close bulk IN endpoint
452 * @v endpoint Endpoint
454 static void usbio_bulk_in_close ( struct usbio_endpoint
*endpoint __unused
) {
460 * Poll bulk IN endpoint
462 * @v endpoint Endpoint
464 static void usbio_bulk_in_poll ( struct usbio_endpoint
*endpoint
) {
465 struct usbio_device
*usbio
= endpoint
->usbio
;
466 struct usb_endpoint
*ep
= endpoint
->ep
;
467 EFI_USB_IO_PROTOCOL
*io
= endpoint
->io
;
468 EFI_HANDLE handle
= usbio
->handle
;
469 struct io_buffer
*iobuf
;
476 /* Do nothing if ring is empty */
477 if ( endpoint
->cons
== endpoint
->prod
)
480 /* Attempt (but do not yet consume) next transfer */
481 index
= ( endpoint
->cons
% USBIO_RING_COUNT
);
482 iobuf
= endpoint
->iobuf
[index
];
484 /* Construct transfer */
485 len
= iob_len ( iobuf
);
487 /* Upon being turned on, the EFI_USB_IO_PROTOCOL did nothing
488 * for several minutes before firing a small ARP packet a few
489 * millimetres into the ether.
491 efirc
= io
->UsbBulkTransfer ( io
, ep
->address
, iobuf
->data
,
493 if ( efirc
== EFI_TIMEOUT
)
496 /* Consume transfer */
499 /* Check for failure */
501 rc
= -EEFI ( efirc
);
502 DBGC2 ( usbio
, "USBIO %s %s could not submit bulk IN transfer: "
503 "%s (status %04x)\n", efi_handle_name ( handle
),
504 usb_endpoint_name ( ep
), strerror ( rc
), status
);
505 usb_complete_err ( ep
, iobuf
, rc
);
510 iob_put ( iobuf
, ( len
- iob_len ( iobuf
) ) );
512 /* Complete transfer */
513 usb_complete ( ep
, iobuf
);
516 /** Bulk endpoint operations */
517 static struct usbio_operations usbio_bulk_in_operations
= {
518 .open
= usbio_bulk_in_open
,
519 .close
= usbio_bulk_in_close
,
520 .poll
= usbio_bulk_in_poll
,
523 /******************************************************************************
527 ******************************************************************************
531 * Open bulk OUT endpoint
533 * @v endpoint Endpoint
534 * @ret rc Return status code
536 static int usbio_bulk_out_open ( struct usbio_endpoint
*endpoint __unused
) {
543 * Close bulk OUT endpoint
545 * @v endpoint Endpoint
547 static void usbio_bulk_out_close ( struct usbio_endpoint
*endpoint __unused
) {
553 * Poll bulk OUT endpoint
555 * @v endpoint Endpoint
557 static void usbio_bulk_out_poll ( struct usbio_endpoint
*endpoint
) {
558 struct usbio_device
*usbio
= endpoint
->usbio
;
559 struct usb_endpoint
*ep
= endpoint
->ep
;
560 EFI_USB_IO_PROTOCOL
*io
= endpoint
->io
;
561 EFI_HANDLE handle
= usbio
->handle
;
562 struct io_buffer
*iobuf
;
570 /* Do nothing if ring is empty */
571 if ( endpoint
->cons
== endpoint
->prod
)
574 /* Consume next transfer */
575 index
= ( endpoint
->cons
++ % USBIO_RING_COUNT
);
576 iobuf
= endpoint
->iobuf
[index
];
577 flags
= endpoint
->flags
[index
];
579 /* Construct transfer */
580 len
= iob_len ( iobuf
);
582 /* Submit transfer */
583 if ( ( efirc
= io
->UsbBulkTransfer ( io
, ep
->address
, iobuf
->data
,
584 &len
, 0, &status
) ) != 0 ) {
585 rc
= -EEFI ( efirc
);
586 DBGC ( usbio
, "USBIO %s %s could not submit bulk OUT transfer: "
587 "%s (status %04x)\n", efi_handle_name ( handle
),
588 usb_endpoint_name ( ep
), strerror ( rc
), status
);
593 iob_put ( iobuf
, ( len
- iob_len ( iobuf
) ) );
595 /* Submit zero-length transfer if required */
597 if ( ( flags
& USBIO_ZLEN
) &&
598 ( efirc
= io
->UsbBulkTransfer ( io
, ep
->address
, NULL
, &len
, 0,
600 rc
= -EEFI ( efirc
);
601 DBGC ( usbio
, "USBIO %s %s could not submit zero-length "
602 "transfer: %s (status %04x)\n",
603 efi_handle_name ( handle
), usb_endpoint_name ( ep
),
604 strerror ( rc
), status
);
608 /* Complete transfer */
609 usb_complete ( ep
, iobuf
);
614 usb_complete_err ( ep
, iobuf
, rc
);
617 /** Bulk endpoint operations */
618 static struct usbio_operations usbio_bulk_out_operations
= {
619 .open
= usbio_bulk_out_open
,
620 .close
= usbio_bulk_out_close
,
621 .poll
= usbio_bulk_out_poll
,
624 /******************************************************************************
626 * Interrupt endpoints
628 ******************************************************************************
630 * The EFI_USB_IO_PROTOCOL provides two ways to interact with
631 * interrupt endpoints, neither of which naturally model the hardware
632 * interaction. The UsbSyncInterruptTransfer() method allows imposes
633 * a 1ms overhead for every interrupt transfer (which could result in
634 * up to a 50% decrease in overall throughput for the device). The
635 * UsbAsyncInterruptTransfer() method provides no way for us to
636 * prevent transfers when no I/O buffers are available.
638 * We work around this design by utilising a small, fixed ring buffer
639 * into which the interrupt callback delivers the data. This aims to
640 * provide buffer space even if no I/O buffers have yet been enqueued.
641 * The scheme is not guaranteed since the fixed ring buffer may also
642 * become full. However:
644 * - devices which send a constant stream of interrupts (and which
645 * therefore might exhaust the fixed ring buffer) tend to be
646 * responding to every interrupt request, and can tolerate lost
649 * - devices which cannot tolerate lost interrupt packets tend to send
650 * only a few small messages.
652 * The scheme should therefore work in practice.
656 * Interrupt endpoint callback
658 * @v data Received data
659 * @v len Length of received data
660 * @v context Callback context
661 * @v status Transfer status
662 * @ret efirc EFI status code
664 static EFI_STATUS EFIAPI
usbio_interrupt_callback ( VOID
*data
, UINTN len
,
667 struct usbio_interrupt_ring
*intr
= context
;
668 struct usbio_endpoint
*endpoint
= intr
->endpoint
;
669 struct usbio_device
*usbio
= endpoint
->usbio
;
670 struct usb_endpoint
*ep
= endpoint
->ep
;
671 EFI_HANDLE handle
= usbio
->handle
;
676 assert ( len
<= ep
->mtu
);
678 /* Do nothing if ring is empty */
679 fill
= ( intr
->prod
- intr
->cons
);
680 if ( fill
>= USBIO_INTR_COUNT
) {
681 DBGC ( usbio
, "USBIO %s %s dropped interrupt completion\n",
682 efi_handle_name ( handle
), usb_endpoint_name ( ep
) );
686 /* Do nothing if transfer was unsuccessful */
688 DBGC ( usbio
, "USBIO %s %s interrupt completion status %04x\n",
689 efi_handle_name ( handle
), usb_endpoint_name ( ep
),
691 return 0; /* Unclear what failure actually means here */
694 /* Copy data to buffer and increment producer counter */
695 index
= ( intr
->prod
% USBIO_INTR_COUNT
);
696 memcpy ( intr
->data
[index
], data
, len
);
697 intr
->len
[index
] = len
;
704 * Open interrupt endpoint
706 * @v endpoint Endpoint
707 * @ret rc Return status code
709 static int usbio_interrupt_open ( struct usbio_endpoint
*endpoint
) {
710 struct usbio_device
*usbio
= endpoint
->usbio
;
711 struct usbio_interrupt_ring
*intr
;
712 struct usb_endpoint
*ep
= endpoint
->ep
;
713 EFI_USB_IO_PROTOCOL
*io
= endpoint
->io
;
714 EFI_HANDLE handle
= usbio
->handle
;
715 unsigned int interval
;
721 /* Allocate interrupt ring buffer */
722 intr
= zalloc ( sizeof ( *intr
) + ( USBIO_INTR_COUNT
* ep
->mtu
) );
727 endpoint
->intr
= intr
;
728 intr
->endpoint
= endpoint
;
729 data
= ( ( ( void * ) intr
) + sizeof ( *intr
) );
730 for ( i
= 0 ; i
< USBIO_INTR_COUNT
; i
++ ) {
731 intr
->data
[i
] = data
;
735 /* Determine polling interval */
736 interval
= ( ep
->interval
>> 3 /* microframes -> milliseconds */ );
738 interval
= 1; /* May not be zero */
740 /* Add to periodic schedule */
741 if ( ( efirc
= io
->UsbAsyncInterruptTransfer ( io
, ep
->address
, TRUE
,
743 usbio_interrupt_callback
,
745 rc
= -EEFI ( efirc
);
746 DBGC ( usbio
, "USBIO %s %s could not schedule interrupt "
747 "transfer: %s\n", efi_handle_name ( handle
),
748 usb_endpoint_name ( ep
), strerror ( rc
) );
754 io
->UsbAsyncInterruptTransfer ( io
, ep
->address
, FALSE
, 0, 0,
763 * Close interrupt endpoint
765 * @v endpoint Endpoint
767 static void usbio_interrupt_close ( struct usbio_endpoint
*endpoint
) {
768 struct usb_endpoint
*ep
= endpoint
->ep
;
769 EFI_USB_IO_PROTOCOL
*io
= endpoint
->io
;
771 /* Remove from periodic schedule */
772 io
->UsbAsyncInterruptTransfer ( io
, ep
->address
, FALSE
, 0, 0,
775 /* Free interrupt ring buffer */
776 free ( endpoint
->intr
);
780 * Poll interrupt endpoint
782 * @v endpoint Endpoint
784 static void usbio_interrupt_poll ( struct usbio_endpoint
*endpoint
) {
785 struct usbio_interrupt_ring
*intr
= endpoint
->intr
;
786 struct usb_endpoint
*ep
= endpoint
->ep
;
787 struct io_buffer
*iobuf
;
789 unsigned int intr_index
;
792 /* Do nothing if ring is empty */
793 if ( endpoint
->cons
== endpoint
->prod
)
796 /* Do nothing if interrupt ring is empty */
797 if ( intr
->cons
== intr
->prod
)
800 /* Consume next transfer */
801 index
= ( endpoint
->cons
++ % USBIO_RING_COUNT
);
802 iobuf
= endpoint
->iobuf
[index
];
804 /* Populate I/O buffer */
805 intr_index
= ( intr
->cons
++ % USBIO_INTR_COUNT
);
806 len
= intr
->len
[intr_index
];
807 assert ( len
<= iob_len ( iobuf
) );
808 iob_put ( iobuf
, ( len
- iob_len ( iobuf
) ) );
809 memcpy ( iobuf
->data
, intr
->data
[intr_index
], len
);
811 /* Complete transfer */
812 usb_complete ( ep
, iobuf
);
815 /** Interrupt endpoint operations */
816 static struct usbio_operations usbio_interrupt_operations
= {
817 .open
= usbio_interrupt_open
,
818 .close
= usbio_interrupt_close
,
819 .poll
= usbio_interrupt_poll
,
822 /******************************************************************************
824 * Endpoint operations
826 ******************************************************************************
833 * @ret rc Return status code
835 static int usbio_endpoint_open ( struct usb_endpoint
*ep
) {
836 struct usb_bus
*bus
= ep
->usb
->port
->hub
->bus
;
837 struct usbio_device
*usbio
= usb_bus_get_hostdata ( bus
);
838 struct usbio_endpoint
*endpoint
;
839 EFI_HANDLE handle
= usbio
->handle
;
840 unsigned int attr
= ( ep
->attributes
& USB_ENDPOINT_ATTR_TYPE_MASK
);
844 /* Allocate and initialise structure */
845 endpoint
= zalloc ( sizeof ( *endpoint
) );
850 usb_endpoint_set_hostdata ( ep
, endpoint
);
851 endpoint
->usbio
= usbio
;
854 /* Identify endpoint operations */
855 if ( attr
== USB_ENDPOINT_ATTR_CONTROL
) {
856 endpoint
->op
= &usbio_control_operations
;
857 } else if ( attr
== USB_ENDPOINT_ATTR_BULK
) {
858 endpoint
->op
= ( ( ep
->address
& USB_DIR_IN
) ?
859 &usbio_bulk_in_operations
:
860 &usbio_bulk_out_operations
);
861 } else if ( attr
== USB_ENDPOINT_ATTR_INTERRUPT
) {
862 endpoint
->op
= &usbio_interrupt_operations
;
868 /* Identify interface for this endpoint */
869 interface
= usbio_interface ( usbio
, ep
);
870 if ( interface
< 0 ) {
874 endpoint
->interface
= interface
;
877 if ( ( rc
= usbio_open ( usbio
, interface
) ) != 0 )
878 goto err_open_interface
;
879 endpoint
->handle
= usbio
->interface
[interface
].handle
;
880 endpoint
->io
= usbio
->interface
[interface
].io
;
881 DBGC ( usbio
, "USBIO %s %s using ",
882 efi_handle_name ( handle
), usb_endpoint_name ( ep
) );
883 DBGC ( usbio
, "%s\n", efi_handle_name ( endpoint
->handle
) );
886 if ( ( rc
= endpoint
->op
->open ( endpoint
) ) != 0 )
887 goto err_open_endpoint
;
889 /* Add to list of endpoints */
890 list_add_tail ( &endpoint
->list
, &usbio
->endpoints
);
894 list_del ( &endpoint
->list
);
895 endpoint
->op
->close ( endpoint
);
897 usbio_close ( usbio
, interface
);
911 static void usbio_endpoint_close ( struct usb_endpoint
*ep
) {
912 struct usbio_endpoint
*endpoint
= usb_endpoint_get_hostdata ( ep
);
913 struct usbio_device
*usbio
= endpoint
->usbio
;
914 struct io_buffer
*iobuf
;
917 /* Remove from list of endpoints */
918 list_del ( &endpoint
->list
);
921 endpoint
->op
->close ( endpoint
);
923 /* Close interface */
924 usbio_close ( usbio
, endpoint
->interface
);
926 /* Cancel any incomplete transfers */
927 while ( endpoint
->cons
!= endpoint
->prod
) {
928 index
= ( endpoint
->cons
++ % USBIO_RING_COUNT
);
929 iobuf
= endpoint
->iobuf
[index
];
930 usb_complete_err ( ep
, iobuf
, -ECANCELED
);
941 * @ret rc Return status code
943 static int usbio_endpoint_reset ( struct usb_endpoint
*ep __unused
) {
953 * @ret rc Return status code
955 static int usbio_endpoint_mtu ( struct usb_endpoint
*ep __unused
) {
965 * @v iobuf I/O buffer
966 * @v flags Transfer flags
967 * @ret rc Return status code
969 static int usbio_endpoint_enqueue ( struct usb_endpoint
*ep
,
970 struct io_buffer
*iobuf
,
971 unsigned int flags
) {
972 struct usbio_endpoint
*endpoint
= usb_endpoint_get_hostdata ( ep
);
976 /* Fail if shutdown is in progress */
977 if ( efi_shutdown_in_progress
)
980 /* Fail if transfer ring is full */
981 fill
= ( endpoint
->prod
- endpoint
->cons
);
982 if ( fill
>= USBIO_RING_COUNT
)
986 index
= ( endpoint
->prod
++ % USBIO_RING_COUNT
);
987 endpoint
->iobuf
[index
] = iobuf
;
988 endpoint
->flags
[index
] = flags
;
994 * Enqueue message transfer
997 * @v iobuf I/O buffer
998 * @ret rc Return status code
1000 static int usbio_endpoint_message ( struct usb_endpoint
*ep
,
1001 struct io_buffer
*iobuf
) {
1002 struct usb_setup_packet
*setup
;
1004 /* Adjust I/O buffer to start of data payload */
1005 assert ( iob_len ( iobuf
) >= sizeof ( *setup
) );
1006 iob_pull ( iobuf
, sizeof ( *setup
) );
1008 /* Enqueue transfer */
1009 return usbio_endpoint_enqueue ( ep
, iobuf
, USBIO_MESSAGE
);
1013 * Enqueue stream transfer
1015 * @v ep USB endpoint
1016 * @v iobuf I/O buffer
1017 * @v zlp Append a zero-length packet
1018 * @ret rc Return status code
1020 static int usbio_endpoint_stream ( struct usb_endpoint
*ep
,
1021 struct io_buffer
*iobuf
, int zlp
) {
1023 /* Enqueue transfer */
1024 return usbio_endpoint_enqueue ( ep
, iobuf
, ( zlp ? USBIO_ZLEN
: 0 ) );
1028 * Poll for completions
1030 * @v endpoint Endpoint
1032 static void usbio_endpoint_poll ( struct usbio_endpoint
*endpoint
) {
1034 /* Do nothing if shutdown is in progress */
1035 if ( efi_shutdown_in_progress
)
1039 endpoint
->op
->poll ( endpoint
);
1042 /******************************************************************************
1046 ******************************************************************************
1053 * @ret rc Return status code
1055 static int usbio_device_open ( struct usb_device
*usb
) {
1056 struct usbio_device
*usbio
=
1057 usb_bus_get_hostdata ( usb
->port
->hub
->bus
);
1059 usb_set_hostdata ( usb
, usbio
);
1068 static void usbio_device_close ( struct usb_device
*usb __unused
) {
1074 * Assign device address
1077 * @ret rc Return status code
1079 static int usbio_device_address ( struct usb_device
*usb __unused
) {
1085 /******************************************************************************
1089 ******************************************************************************
1096 * @ret rc Return status code
1098 static int usbio_hub_open ( struct usb_hub
*hub
) {
1100 /* Disallow non-root hubs */
1113 static void usbio_hub_close ( struct usb_hub
*hub __unused
) {
1118 /******************************************************************************
1120 * Root hub operations
1122 ******************************************************************************
1129 * @ret rc Return status code
1131 static int usbio_root_open ( struct usb_hub
*hub __unused
) {
1142 static void usbio_root_close ( struct usb_hub
*hub __unused
) {
1152 * @ret rc Return status code
1154 static int usbio_root_enable ( struct usb_hub
*hub __unused
,
1155 struct usb_port
*port __unused
) {
1166 * @ret rc Return status code
1168 static int usbio_root_disable ( struct usb_hub
*hub __unused
,
1169 struct usb_port
*port __unused
) {
1176 * Update root hub port speed
1180 * @ret rc Return status code
1182 static int usbio_root_speed ( struct usb_hub
*hub __unused
,
1183 struct usb_port
*port
) {
1185 /* Not actually exposed via EFI_USB_IO_PROTOCOL */
1186 port
->speed
= USB_SPEED_HIGH
;
1191 * Clear transaction translator buffer
1195 * @v ep USB endpoint
1196 * @ret rc Return status code
1198 static int usbio_root_clear_tt ( struct usb_hub
*hub __unused
,
1199 struct usb_port
*port __unused
,
1200 struct usb_endpoint
*ep __unused
) {
1202 /* Should never be called; this is a root hub */
1206 /******************************************************************************
1210 ******************************************************************************
1217 * @ret rc Return status code
1219 static int usbio_bus_open ( struct usb_bus
*bus __unused
) {
1230 static void usbio_bus_close ( struct usb_bus
*bus __unused
) {
1240 static void usbio_bus_poll ( struct usb_bus
*bus
) {
1241 struct usbio_device
*usbio
= usb_bus_get_hostdata ( bus
);
1242 struct usbio_endpoint
*endpoint
;
1244 /* Poll all endpoints. We trust that completion handlers are
1245 * minimal and will not do anything that could plausibly
1246 * affect the endpoint list itself.
1248 list_for_each_entry ( endpoint
, &usbio
->endpoints
, list
)
1249 usbio_endpoint_poll ( endpoint
);
1252 /******************************************************************************
1254 * EFI driver interface
1256 ******************************************************************************
1259 /** USB I/O host controller driver operations */
1260 static struct usb_host_operations usbio_operations
= {
1262 .open
= usbio_endpoint_open
,
1263 .close
= usbio_endpoint_close
,
1264 .reset
= usbio_endpoint_reset
,
1265 .mtu
= usbio_endpoint_mtu
,
1266 .message
= usbio_endpoint_message
,
1267 .stream
= usbio_endpoint_stream
,
1270 .open
= usbio_device_open
,
1271 .close
= usbio_device_close
,
1272 .address
= usbio_device_address
,
1275 .open
= usbio_bus_open
,
1276 .close
= usbio_bus_close
,
1277 .poll
= usbio_bus_poll
,
1280 .open
= usbio_hub_open
,
1281 .close
= usbio_hub_close
,
1284 .open
= usbio_root_open
,
1285 .close
= usbio_root_close
,
1286 .enable
= usbio_root_enable
,
1287 .disable
= usbio_root_disable
,
1288 .speed
= usbio_root_speed
,
1289 .clear_tt
= usbio_root_clear_tt
,
1294 * Check to see if driver supports a device
1296 * @v handle EFI device handle
1297 * @ret rc Return status code
1299 static int usbio_supported ( EFI_HANDLE handle
) {
1300 EFI_BOOT_SERVICES
*bs
= efi_systab
->BootServices
;
1301 EFI_USB_DEVICE_DESCRIPTOR device
;
1302 EFI_USB_INTERFACE_DESCRIPTOR interface
;
1303 struct usb_function_descriptor desc
;
1304 struct usb_driver
*driver
;
1305 struct usb_device_id
*id
;
1308 EFI_USB_IO_PROTOCOL
*io
;
1314 if ( ( efirc
= bs
->OpenProtocol ( handle
, &efi_usb_io_protocol_guid
,
1315 &usb
.interface
, efi_image_handle
,
1317 EFI_OPEN_PROTOCOL_GET_PROTOCOL
))!=0){
1318 rc
= -EEFI ( efirc
);
1319 DBGCP ( handle
, "USB %s is not a USB device\n",
1320 efi_handle_name ( handle
) );
1321 goto err_open_protocol
;
1324 /* Get device descriptor */
1325 if ( ( efirc
= usb
.io
->UsbGetDeviceDescriptor ( usb
.io
,
1326 &device
) ) != 0 ) {
1327 rc
= -EEFI ( efirc
);
1328 DBGC ( handle
, "USB %s could not get device descriptor: "
1329 "%s\n", efi_handle_name ( handle
), strerror ( rc
) );
1330 goto err_get_device_descriptor
;
1332 memset ( &desc
, 0, sizeof ( desc
) );
1333 desc
.vendor
= device
.IdVendor
;
1334 desc
.product
= device
.IdProduct
;
1336 /* Get interface descriptor */
1337 if ( ( efirc
= usb
.io
->UsbGetInterfaceDescriptor ( usb
.io
,
1338 &interface
) ) !=0){
1339 rc
= -EEFI ( efirc
);
1340 DBGC ( handle
, "USB %s could not get interface descriptor: "
1341 "%s\n", efi_handle_name ( handle
), strerror ( rc
) );
1342 goto err_get_interface_descriptor
;
1344 desc
.class.class.class = interface
.InterfaceClass
;
1345 desc
.class.class.subclass
= interface
.InterfaceSubClass
;
1346 desc
.class.class.protocol
= interface
.InterfaceProtocol
;
1348 /* Look for a driver for this interface */
1349 driver
= usb_find_driver ( &desc
, &id
);
1352 goto err_unsupported
;
1359 err_get_interface_descriptor
:
1360 err_get_device_descriptor
:
1361 bs
->CloseProtocol ( handle
, &efi_usb_io_protocol_guid
,
1362 efi_image_handle
, handle
);
1368 * Fetch configuration descriptor
1370 * @v usbio USB I/O device
1371 * @ret rc Return status code
1373 static int usbio_config ( struct usbio_device
*usbio
) {
1374 EFI_HANDLE handle
= usbio
->handle
;
1375 EFI_USB_IO_PROTOCOL
*io
= usbio
->io
;
1376 EFI_USB_DEVICE_DESCRIPTOR device
;
1377 EFI_USB_CONFIG_DESCRIPTOR partial
;
1379 struct usb_setup_packet setup
;
1380 EFI_USB_DEVICE_REQUEST efi
;
1390 /* Get device descriptor */
1391 if ( ( efirc
= io
->UsbGetDeviceDescriptor ( io
, &device
) ) != 0 ) {
1392 rc
= -EEFI ( efirc
);
1393 DBGC ( usbio
, "USB %s could not get device descriptor: "
1394 "%s\n", efi_handle_name ( handle
), strerror ( rc
) );
1395 goto err_get_device_descriptor
;
1397 count
= device
.NumConfigurations
;
1399 /* Get current partial configuration descriptor */
1400 if ( ( efirc
= io
->UsbGetConfigDescriptor ( io
, &partial
) ) != 0 ) {
1401 rc
= -EEFI ( efirc
);
1402 DBGC ( usbio
, "USB %s could not get partial configuration "
1403 "descriptor: %s\n", efi_handle_name ( handle
),
1405 goto err_get_configuration_descriptor
;
1407 len
= le16_to_cpu ( partial
.TotalLength
);
1409 /* Allocate configuration descriptor */
1410 usbio
->config
= malloc ( len
);
1411 if ( ! usbio
->config
) {
1416 /* There is, naturally, no way to retrieve the entire device
1417 * configuration descriptor via EFI_USB_IO_PROTOCOL. Worse,
1418 * there is no way to even retrieve the index of the current
1419 * configuration descriptor. We have to iterate over all
1420 * possible configuration descriptors looking for the
1421 * descriptor that matches the current configuration value.
1423 for ( i
= 0 ; i
< count
; i
++ ) {
1425 /* Construct request */
1426 msg
.setup
.request
= cpu_to_le16 ( USB_GET_DESCRIPTOR
);
1427 value
= ( ( USB_CONFIGURATION_DESCRIPTOR
<< 8 ) | i
);
1428 msg
.setup
.value
= cpu_to_le16 ( value
);
1429 msg
.setup
.index
= 0;
1430 msg
.setup
.len
= cpu_to_le16 ( len
);
1432 /* Get full configuration descriptor */
1433 if ( ( efirc
= io
->UsbControlTransfer ( io
, &msg
.efi
,
1436 &status
) ) != 0 ) {
1437 rc
= -EEFI ( efirc
);
1438 DBGC ( usbio
, "USB %s could not get configuration %d "
1439 "descriptor: %s\n", efi_handle_name ( handle
),
1440 i
, strerror ( rc
) );
1441 goto err_control_transfer
;
1444 /* Ignore unless this is the current configuration */
1445 if ( usbio
->config
->config
!= partial
.ConfigurationValue
)
1449 if ( le16_to_cpu ( usbio
->config
->len
) != len
) {
1450 DBGC ( usbio
, "USB %s configuration descriptor length "
1451 "mismatch\n", efi_handle_name ( handle
) );
1459 /* No match found */
1460 DBGC ( usbio
, "USB %s could not find current configuration "
1461 "descriptor\n", efi_handle_name ( handle
) );
1465 err_control_transfer
:
1466 free ( usbio
->config
);
1468 err_get_configuration_descriptor
:
1469 err_get_device_descriptor
:
1474 * Construct device path for opening other interfaces
1476 * @v usbio USB I/O device
1477 * @ret rc Return status code
1479 static int usbio_path ( struct usbio_device
*usbio
) {
1480 EFI_BOOT_SERVICES
*bs
= efi_systab
->BootServices
;
1481 EFI_HANDLE handle
= usbio
->handle
;
1482 EFI_DEVICE_PATH_PROTOCOL
*path
;
1483 EFI_DEVICE_PATH_PROTOCOL
*end
;
1484 USB_DEVICE_PATH
*usbpath
;
1487 EFI_DEVICE_PATH_PROTOCOL
*path
;
1493 /* Open device path protocol */
1494 if ( ( efirc
= bs
->OpenProtocol ( handle
,
1495 &efi_device_path_protocol_guid
,
1496 &u
.interface
, efi_image_handle
,
1498 EFI_OPEN_PROTOCOL_GET_PROTOCOL
))!=0){
1499 rc
= -EEFI ( efirc
);
1500 DBGC ( usbio
, "USBIO %s cannot open device path protocol: "
1501 "%s\n", efi_handle_name ( handle
), strerror ( rc
) );
1502 goto err_open_protocol
;
1506 /* Locate end of device path and sanity check */
1507 len
= efi_path_len ( path
);
1508 if ( len
< sizeof ( *usbpath
) ) {
1509 DBGC ( usbio
, "USBIO %s underlength device path\n",
1510 efi_handle_name ( handle
) );
1512 goto err_underlength
;
1514 usbpath
= ( ( ( void * ) path
) + len
- sizeof ( *usbpath
) );
1515 if ( ! ( ( usbpath
->Header
.Type
== MESSAGING_DEVICE_PATH
) &&
1516 ( usbpath
->Header
.SubType
== MSG_USB_DP
) ) ) {
1517 DBGC ( usbio
, "USBIO %s not a USB device path: ",
1518 efi_handle_name ( handle
) );
1519 DBGC ( usbio
, "%s\n", efi_devpath_text ( path
) );
1524 /* Allocate copy of device path */
1525 usbio
->path
= malloc ( len
+ sizeof ( *end
) );
1526 if ( ! usbio
->path
) {
1530 memcpy ( usbio
->path
, path
, ( len
+ sizeof ( *end
) ) );
1531 usbio
->usbpath
= ( ( ( void * ) usbio
->path
) + len
-
1532 sizeof ( *usbpath
) );
1534 /* Close protocol */
1535 bs
->CloseProtocol ( handle
, &efi_device_path_protocol_guid
,
1536 efi_image_handle
, handle
);
1540 free ( usbio
->path
);
1544 bs
->CloseProtocol ( handle
, &efi_device_path_protocol_guid
,
1545 efi_image_handle
, handle
);
1551 * Construct interface list
1553 * @v usbio USB I/O device
1554 * @ret rc Return status code
1556 static int usbio_interfaces ( struct usbio_device
*usbio
) {
1557 EFI_HANDLE handle
= usbio
->handle
;
1558 EFI_USB_IO_PROTOCOL
*io
= usbio
->io
;
1559 EFI_USB_INTERFACE_DESCRIPTOR interface
;
1565 /* Get interface descriptor */
1566 if ( ( efirc
= io
->UsbGetInterfaceDescriptor ( io
, &interface
) ) != 0){
1567 rc
= -EEFI ( efirc
);
1568 DBGC ( usbio
, "USB %s could not get interface descriptor: "
1569 "%s\n", efi_handle_name ( handle
), strerror ( rc
) );
1570 goto err_get_interface_descriptor
;
1573 /* Record first interface number */
1574 first
= interface
.InterfaceNumber
;
1575 count
= usbio
->config
->interfaces
;
1576 assert ( first
< count
);
1577 usbio
->first
= first
;
1579 /* Allocate interface list */
1580 usbio
->interface
= zalloc ( count
* sizeof ( usbio
->interface
[0] ) );
1581 if ( ! usbio
->interface
) {
1586 /* Use already-opened protocol for control transfers and for
1587 * the first interface.
1589 usbio
->interface
[0].handle
= handle
;
1590 usbio
->interface
[0].io
= io
;
1591 usbio
->interface
[0].count
= 1;
1592 usbio
->interface
[first
].handle
= handle
;
1593 usbio
->interface
[first
].io
= io
;
1594 usbio
->interface
[first
].count
= 1;
1598 free ( usbio
->interface
);
1600 err_get_interface_descriptor
:
1605 * Attach driver to device
1607 * @v efidev EFI device
1608 * @ret rc Return status code
1610 static int usbio_start ( struct efi_device
*efidev
) {
1611 EFI_BOOT_SERVICES
*bs
= efi_systab
->BootServices
;
1612 EFI_HANDLE handle
= efidev
->device
;
1613 struct usbio_device
*usbio
;
1614 struct usb_port
*port
;
1617 EFI_USB_IO_PROTOCOL
*io
;
1622 /* Allocate and initialise structure */
1623 usbio
= zalloc ( sizeof ( *usbio
) );
1628 efidev_set_drvdata ( efidev
, usbio
);
1629 usbio
->handle
= handle
;
1630 INIT_LIST_HEAD ( &usbio
->endpoints
);
1632 /* Open USB I/O protocol */
1633 if ( ( efirc
= bs
->OpenProtocol ( handle
, &efi_usb_io_protocol_guid
,
1634 &u
.interface
, efi_image_handle
,
1636 ( EFI_OPEN_PROTOCOL_BY_DRIVER
|
1637 EFI_OPEN_PROTOCOL_EXCLUSIVE
)))!=0){
1638 rc
= -EEFI ( efirc
);
1639 DBGC ( usbio
, "USBIO %s cannot open USB I/O protocol: %s\n",
1640 efi_handle_name ( handle
), strerror ( rc
) );
1641 DBGC_EFI_OPENERS ( usbio
, handle
, &efi_usb_io_protocol_guid
);
1642 goto err_open_usbio
;
1646 /* Describe generic device */
1647 efi_device_info ( handle
, "USB", &usbio
->dev
);
1648 usbio
->dev
.parent
= &efidev
->dev
;
1649 list_add ( &usbio
->dev
.siblings
, &efidev
->dev
.children
);
1650 INIT_LIST_HEAD ( &usbio
->dev
.children
);
1652 /* Fetch configuration descriptor */
1653 if ( ( rc
= usbio_config ( usbio
) ) != 0 )
1656 /* Construct device path */
1657 if ( ( rc
= usbio_path ( usbio
) ) != 0 )
1660 /* Construct interface list */
1661 if ( ( rc
= usbio_interfaces ( usbio
) ) != 0 )
1662 goto err_interfaces
;
1664 /* Allocate USB bus */
1665 usbio
->bus
= alloc_usb_bus ( &usbio
->dev
, 1 /* single "port" */,
1666 USBIO_MTU
, &usbio_operations
);
1667 if ( ! usbio
->bus
) {
1671 usb_bus_set_hostdata ( usbio
->bus
, usbio
);
1672 usb_hub_set_drvdata ( usbio
->bus
->hub
, usbio
);
1674 /* Set port protocol */
1675 port
= usb_port ( usbio
->bus
->hub
, 1 );
1676 port
->protocol
= USB_PROTO_2_0
;
1678 /* Register USB bus */
1679 if ( ( rc
= register_usb_bus ( usbio
->bus
) ) != 0 )
1684 unregister_usb_bus ( usbio
->bus
);
1686 free_usb_bus ( usbio
->bus
);
1688 free ( usbio
->interface
);
1690 free ( usbio
->path
);
1692 free ( usbio
->config
);
1694 list_del ( &usbio
->dev
.siblings
);
1695 bs
->CloseProtocol ( handle
, &efi_usb_io_protocol_guid
,
1696 efi_image_handle
, handle
);
1704 * Detach driver from device
1706 * @v efidev EFI device
1708 static void usbio_stop ( struct efi_device
*efidev
) {
1709 EFI_BOOT_SERVICES
*bs
= efi_systab
->BootServices
;
1710 EFI_HANDLE handle
= efidev
->device
;
1711 struct usbio_device
*usbio
= efidev_get_drvdata ( efidev
);
1713 unregister_usb_bus ( usbio
->bus
);
1714 free_usb_bus ( usbio
->bus
);
1715 free ( usbio
->interface
);
1716 free ( usbio
->path
);
1717 free ( usbio
->config
);
1718 list_del ( &usbio
->dev
.siblings
);
1719 bs
->CloseProtocol ( handle
, &efi_usb_io_protocol_guid
,
1720 efi_image_handle
, handle
);
1724 /** EFI USB I/O driver */
1725 struct efi_driver usbio_driver
__efi_driver ( EFI_DRIVER_NORMAL
) = {
1727 .supported
= usbio_supported
,
1728 .start
= usbio_start
,