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 
24 FILE_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  */
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;
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 */
155  list_for_each_entry ( func, &usb->functions, list ) {
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  */
183 static int usbio_open ( struct usbio_device *usbio, unsigned int interface ) {
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 ",
213  efi_handle_name ( handle ) );
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 ",
222  efi_handle_name ( handle ) );
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 ",
232  efi_handle_name ( handle ) );
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  */
252 static 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  */
283 static 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  */
294 static 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  */
304 static 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;
322  UINT32 status;
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",
380  efi_handle_name ( handle ), strerror ( rc ) );
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 */
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  */
432 static 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  */
443 static 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  */
453 static 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;
461  UINT32 status;
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 */
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  */
525 static 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  */
536 static 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  */
546 static 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;
555  UINT32 status;
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 */
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 */
665  assert ( len <= ep->mtu );
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  */
698 static int usbio_interrupt_open ( struct usbio_endpoint *endpoint ) {
699  struct usbio_device *usbio = endpoint->usbio;
700  struct usbio_interrupt_ring *intr;
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  */
756 static 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  */
773 static 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 */
807  .close = usbio_interrupt_close,
808  .poll = usbio_interrupt_poll,
809 };
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  */
824 static 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 */
844  if ( attr == USB_ENDPOINT_ATTR_CONTROL ) {
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  */
900 static 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  */
932 static 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  */
944 static 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  */
958 static 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  */
1009 static 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  */
1021 static 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  */
1044 static 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  */
1057 static 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  */
1068 static 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  */
1087 static 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  */
1102 static 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  */
1120 static 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  */
1131 static 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  */
1143 static 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  */
1157 static 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  */
1171 static 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  */
1187 static 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  */
1208 static 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  */
1219 static 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  */
1229 static 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 = {
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;
1294  EFI_USB_IO_PROTOCOL *io;
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  */
1342 static int usbio_config ( struct usbio_device *usbio ) {
1343  EFI_HANDLE handle = usbio->handle;
1344  EFI_USB_IO_PROTOCOL *io = usbio->io;
1346  EFI_USB_CONFIG_DESCRIPTOR partial;
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  */
1448 static 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  */
1497 static 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  */
1571 static 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  */
1657 static 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 */
1672 struct efi_driver usbio_driver __efi_driver ( EFI_DRIVER_HARDWARE ) = {
1673  .name = "USBIO",
1674  .supported = usbio_supported,
1675  .exclude = usbio_exclude,
1676  .start = usbio_start,
1677  .stop = usbio_stop,
1678 };
#define iob_pull(iobuf, len)
Definition: iobuf.h:106
A USB driver.
Definition: usb.h:1406
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2098
#define EINVAL
Invalid argument.
Definition: errno.h:428
static void usbio_bulk_out_poll(struct usbio_endpoint *endpoint)
Poll bulk OUT endpoint.
Definition: usbio.c:546
static void usb_endpoint_set_hostdata(struct usb_endpoint *ep, void *priv)
Set USB endpoint host controller private data.
Definition: usb.h:575
A USB I/O protocol interface.
Definition: usbio.h:112
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
unsigned short uint16_t
Definition: stdint.h:11
struct efi_driver usbio_driver __efi_driver(EFI_DRIVER_HARDWARE)
EFI USB I/O driver.
static int usbio_root_open(struct usb_hub *hub __unused)
Open root hub.
Definition: usbio.c:1120
A USB device ID.
Definition: usb.h:1360
struct usbio_interrupt_ring * intr
Interrupt ring buffer (if applicable)
Definition: usbio.h:80
static int usbio_device_address(struct usb_device *usb __unused)
Assign device address.
Definition: usbio.c:1068
#define iob_put(iobuf, len)
Definition: iobuf.h:124
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:174
#define USB_RECIP_MASK
Request recipient mask.
Definition: usb.h:109
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:61
struct usbio_device * usbio
USB I/O device.
Definition: usbio.h:55
static void usbio_interrupt_poll(struct usbio_endpoint *endpoint)
Poll interrupt endpoint.
Definition: usbio.c:773
struct device dev
Generic device.
Definition: usbio.h:132
EFI driver interface.
static int usbio_endpoint_open(struct usb_endpoint *ep)
Open endpoint.
Definition: usbio.c:824
uint8_t interface[0]
List of interface numbers.
Definition: usb.h:696
A USB hub.
Definition: usb.h:840
static void usbio_bus_close(struct usb_bus *bus __unused)
Close USB bus.
Definition: usbio.c:1219
#define USB_RECIP_INTERFACE
Request recipient is an interface.
Definition: usb.h:115
static int usbio_path(struct usbio_device *usbio)
Construct device path for opening other interfaces.
Definition: usbio.c:1448
unsigned int count
Number of interfaces.
Definition: usb.h:664
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:69
128 bit buffer containing a unique identifier value.
Definition: Base.h:215
uint32_t first
First block in range.
Definition: pccrr.h:14
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:2094
Error codes.
#define USB_GET_DESCRIPTOR
Get descriptor.
Definition: usb.h:136
#define USB_ENDPOINT_ATTR_TYPE_MASK
Endpoint attribute transfer type mask.
Definition: usb.h:280
USB 2.0.
Definition: usb.h:22
#define iob_push(iobuf, len)
Definition: iobuf.h:88
static void usbio_device_close(struct usb_device *usb __unused)
Close device.
Definition: usbio.c:1057
static void usb_set_hostdata(struct usb_device *usb, void *priv)
Set USB device host controller private data.
Definition: usb.h:783
uint8_t attr
Type and attributes.
Definition: librm.h:142
static void usbio_control_close(struct usbio_endpoint *endpoint __unused)
Close control endpoint.
Definition: usbio.c:294
static void usbio_root_close(struct usb_hub *hub __unused)
Close root hub.
Definition: usbio.c:1131
static void usbio_bulk_in_close(struct usbio_endpoint *endpoint __unused)
Close bulk IN endpoint.
Definition: usbio.c:443
EFI_USB_IO_PROTOCOL pseudo Host Controller Interface driver.
static int usbio_interface(struct usbio_device *usbio, struct usb_endpoint *ep)
Determine endpoint interface number.
Definition: usbio.c:121
EFI_USB_IO_ASYNC_INTERRUPT_TRANSFER UsbAsyncInterruptTransfer
Definition: UsbIo.h:484
static void usbio_hub_close(struct usb_hub *hub __unused)
Close hub.
Definition: usbio.c:1102
#define DBGC(...)
Definition: compiler.h:505
static struct usbio_operations usbio_control_operations
Control endpoint operations.
Definition: usbio.c:413
static int usbio_start(struct efi_device *efidev)
Attach driver to device.
Definition: usbio.c:1571
long index
Definition: bigint.h:62
#define ENOENT
No such file or directory.
Definition: errno.h:514
Standard Interface Descriptor USB 2.0 spec, Section 9.6.5.
Definition: Usb.h:157
unsigned int UINT32
Definition: ProcessorBind.h:98
The EFI_USB_IO_PROTOCOL provides four basic transfers types described in the USB 1....
Definition: UsbIo.h:478
#define for_each_interface_descriptor(desc, config, interface)
Iterate over all configuration descriptors within an interface descriptor.
Definition: usb.h:393
size_t efi_path_len(EFI_DEVICE_PATH_PROTOCOL *path)
Find length of device path (excluding terminator)
Definition: efi_path.c:173
uint8_t interfaces
Number of interfaces.
Definition: usb.h:215
static void usbio_endpoint_close(struct usb_endpoint *ep)
Close endpoint.
Definition: usbio.c:900
#define for_each_config_descriptor(desc, config)
Iterate over all configuration descriptors.
Definition: usb.h:385
uint8_t direction
Direction.
Definition: ena.h:14
#define USB_ENDPOINT_ATTR_BULK
Bulk endpoint transfer type.
Definition: usb.h:289
uint8_t endpoint
Endpoint address.
Definition: usb.h:267
#define DBGC_EFI_OPENERS(...)
Definition: efi.h:344
EFI_HANDLE device
EFI device handle.
Definition: efi_driver.h:21
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
uint16_t device
Device ID.
Definition: ena.h:24
EFI_USB_DATA_DIRECTION
USB data transfer direction.
Definition: UsbIo.h:46
static void usbio_close(struct usbio_device *usbio, unsigned int interface)
Close USB I/O interface.
Definition: usbio.c:252
static int usbio_bus_open(struct usb_bus *bus __unused)
Open USB bus.
Definition: usbio.c:1208
#define USBIO_RING_COUNT
USB I/O ring buffer size.
Definition: usbio.h:50
#define MESSAGING_DEVICE_PATH
Messaging Device Paths.
Definition: DevicePath.h:323
EFI_USB_IO_PROTOCOL * io
USB I/O protocol.
Definition: usbio.h:116
struct device * parent
Bus device.
Definition: device.h:88
#define EXDEV
Improper link.
Definition: errno.h:684
static int usbio_endpoint_reset(struct usb_endpoint *ep __unused)
Reset endpoint.
Definition: usbio.c:932
EFI utilities.
static void usbio_bus_poll(struct usb_bus *bus)
Poll USB bus.
Definition: usbio.c:1229
#define ECANCELED
Operation canceled.
Definition: errno.h:343
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
static void usbio_interrupt_close(struct usbio_endpoint *endpoint)
Close interrupt endpoint.
Definition: usbio.c:756
static void usbio_bulk_in_poll(struct usbio_endpoint *endpoint)
Poll bulk IN endpoint.
Definition: usbio.c:453
A USB interrupt ring buffer.
Definition: usbio.h:33
uint8_t flags[USBIO_RING_COUNT]
Flags.
Definition: usbio.h:77
static void usb_bus_set_hostdata(struct usb_bus *bus, void *priv)
Set USB bus host controller private data.
Definition: usb.h:1050
#define USBIO_MTU
USB I/O maximum transfer size.
Definition: usbio.h:24
static void usbio_endpoint_poll(struct usbio_endpoint *endpoint)
Poll for completions.
Definition: usbio.c:1021
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
struct ena_llq_option desc
Descriptor counts.
Definition: ena.h:20
A USB port.
Definition: usb.h:812
static int usbio_root_speed(struct usb_hub *hub __unused, struct usb_port *port)
Update root hub port speed.
Definition: usbio.c:1171
#define ENOMEM
Not enough space.
Definition: errno.h:534
A hardware device.
Definition: device.h:76
A USB endpoint.
Definition: usb.h:403
struct usb_device * usb
Underlying USB device, if any.
Definition: usb.h:846
unsigned int interface
Containing interface number.
Definition: usbio.h:64
void(* poll)(struct usbio_endpoint *endpoint)
Poll endpoint.
Definition: usbio.h:108
static int usbio_endpoint_message(struct usb_endpoint *ep, struct io_buffer *iobuf)
Enqueue message transfer.
Definition: usbio.c:989
void * memcpy(void *dest, const void *src, size_t len) __nonnull
u8 port
Port number.
Definition: CIB_PRM.h:31
A USB interface descriptor.
Definition: usb.h:244
A USB function descriptor.
Definition: usb.h:656
static int usbio_interrupt_open(struct usbio_endpoint *endpoint)
Open interrupt endpoint.
Definition: usbio.c:698
void unregister_usb_bus(struct usb_bus *bus)
Unregister USB bus.
Definition: usb.c:2170
Format of Setup Data for USB Device Requests USB 2.0 spec, Section 9.3.
Definition: Usb.h:94
struct usb_port * port
USB port.
Definition: usb.h:726
Assertions.
struct usb_driver * usb_find_driver(struct usb_function_descriptor *desc, struct usb_device_id **id)
Find USB device driver.
Definition: usb.c:1166
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static int usbio_endpoint_enqueue(struct usb_endpoint *ep, struct io_buffer *iobuf, unsigned int flags)
Enqueue transfer.
Definition: usbio.c:958
An object interface.
Definition: interface.h:124
EFI_HANDLE handle
EFI handle.
Definition: usbio.h:66
void efi_close_by_driver(EFI_HANDLE handle, EFI_GUID *protocol)
Close protocol opened for persistent use by a driver.
Definition: efi_open.c:278
uint8_t intr
Interrupts enabled.
Definition: ena.h:14
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
This transfer requires zero-length packet termination.
Definition: usbio.h:88
#define __unused
Declare a variable or data structure as unused.
Definition: compiler.h:573
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
static int usbio_control_open(struct usbio_endpoint *endpoint __unused)
Open control endpoint.
Definition: usbio.c:283
struct list_head endpoints
List of endpoints.
Definition: usbio.h:150
#define efi_open_by_driver(handle, protocol, interface)
Open protocol for persistent use by a driver.
Definition: efi.h:473
ring len
Length.
Definition: dwmac.h:231
static struct usbio_operations usbio_bulk_in_operations
Bulk endpoint operations.
Definition: usbio.c:506
unsigned int count
Usage count.
Definition: usbio.h:118
static int usbio_config(struct usbio_device *usbio)
Fetch configuration descriptor.
Definition: usbio.c:1342
static unsigned int count
Number of entries.
Definition: dwmac.h:225
static int usbio_endpoint_mtu(struct usb_endpoint *ep __unused)
Update MTU.
Definition: usbio.c:944
static int usbio_exclude(EFI_HANDLE device)
Exclude existing drivers.
Definition: usbio.c:1551
#define USB_DIR_IN
Data transfer is from device to host.
Definition: usb.h:97
const char * efi_devpath_text(EFI_DEVICE_PATH_PROTOCOL *path)
Get textual representation of device path.
Definition: efi_debug.c:247
#define USB_CONFIGURATION_DESCRIPTOR
A USB configuration descriptor.
Definition: usb.h:227
uint8_t id
Request identifier.
Definition: ena.h:12
A USB device.
Definition: usb.h:722
struct usb_bus * bus
USB bus.
Definition: usbio.h:148
uint8_t type
Descriptor type.
Definition: usb.h:176
EFI_DEVICE_PATH_PROTOCOL Header
Definition: DevicePath.h:422
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:652
EFI_USB_IO_PROTOCOL * io
USB I/O protocol.
Definition: usbio.h:68
#define USB_ENDPOINT_ATTR_INTERRUPT
Interrupt endpoint transfer type.
Definition: usb.h:292
uint8_t flags
Flags.
Definition: ena.h:18
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI_GUID efi_usb_io_protocol_guid
USB I/O protocol GUID.
Definition: efi_guid.c:428
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
static int usbio_supported(EFI_HANDLE handle)
Check to see if driver supports a device.
Definition: usbio.c:1288
#define EFIAPI
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:661
EFI Boot Services Table.
Definition: UefiSpec.h:1930
uint8_t first
First interface number.
Definition: usbio.h:143
void(* close)(struct usbio_endpoint *endpoint)
Close endpoint.
Definition: usbio.h:103
UINT8 InterfaceNumber
USB Interface Number.
Definition: DevicePath.h:430
struct list_head siblings
Devices on the same bus.
Definition: device.h:84
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:159
static void * efidev_get_drvdata(struct efi_device *efidev)
Get EFI driver-private data.
Definition: efi_driver.h:94
EFI_DEVICE_PATH_PROTOCOL * path
Device path.
Definition: usbio.h:138
#define efi_open(handle, protocol, interface)
Open protocol for ephemeral use.
Definition: efi.h:443
int efi_driver_exclude(EFI_HANDLE device, EFI_GUID *protocol)
Try to disconnect an existing EFI driver.
Definition: efi_driver.c:437
static int usbio_bulk_in_open(struct usbio_endpoint *endpoint __unused)
Open bulk IN endpoint.
Definition: usbio.c:432
static void usbio_control_poll(struct usbio_endpoint *endpoint)
Poll control endpoint.
Definition: usbio.c:304
EFI device paths.
UINT64 UINTN
Unsigned value of native width.
An EFI device.
Definition: efi_driver.h:17
Standard Endpoint Descriptor USB 2.0 spec, Section 9.6.6.
Definition: Usb.h:173
EFI_GUID efi_device_path_protocol_guid
Device path protocol GUID.
Definition: efi_guid.c:168
struct usbio_operations * op
USB I/O endpoint operations.
Definition: usbio.h:61
struct usb_device * usb
USB device.
Definition: usb.h:677
#define le16_to_cpu(value)
Definition: byteswap.h:112
#define VOID
Undeclared type.
Definition: Base.h:271
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:620
A USB setup data packet.
Definition: usb.h:82
struct usb_configuration_descriptor * config
Configuration descriptor.
Definition: usbio.h:135
struct usbio_endpoint * endpoint
USB I/O endpoint.
Definition: usbio.h:35
const char * usb_endpoint_name(struct usb_endpoint *ep)
Get USB endpoint name (for debugging)
Definition: usb.c:220
#define TRUE
Definition: tlan.h:46
static int usbio_hub_open(struct usb_hub *hub)
Open hub.
Definition: usbio.c:1087
EFI_USB_IO_CONTROL_TRANSFER UsbControlTransfer
Definition: UsbIo.h:482
EFI API.
unsigned int prod
Producer counter.
Definition: usbio.h:71
EFI_USB_IO_BULK_TRANSFER UsbBulkTransfer
Definition: UsbIo.h:483
size_t mtu
Maximum transfer size.
Definition: usb.h:411
uint8_t status
Status.
Definition: ena.h:16
EFI Usb I/O Protocol as defined in UEFI specification.
#define EFI_DRIVER_HARDWARE
Hardware drivers.
Definition: efi_driver.h:72
static int usbio_endpoint_stream(struct usb_endpoint *ep, struct io_buffer *iobuf, int zlp)
Enqueue stream transfer.
Definition: usbio.c:1009
An EFI driver.
Definition: efi_driver.h:33
A USB I/O endpoint.
Definition: usbio.h:53
UINT16 TotalLength
Definition: Usb.h:130
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
A USB configuration descriptor.
Definition: usb.h:209
struct usbio_interface * interface
USB I/O protocol interfaces.
Definition: usbio.h:145
#define USBIO_INTR_COUNT
USB I/O interrupt ring buffer size.
Definition: usbio.h:30
A USB endpoint descriptor.
Definition: usb.h:263
static void * usb_bus_get_hostdata(struct usb_bus *bus)
Get USB bus host controller private data.
Definition: usb.h:1061
static int usbio_bulk_out_open(struct usbio_endpoint *endpoint __unused)
Open bulk OUT endpoint.
Definition: usbio.c:525
USB_DEVICE_PATH * usbpath
Final component of USB device path.
Definition: usbio.h:140
uint8_t config
Configuration value.
Definition: usb.h:217
#define ENOBUFS
No buffer space available.
Definition: errno.h:498
EFI_USB_IO_GET_DEVICE_DESCRIPTOR UsbGetDeviceDescriptor
Definition: UsbIo.h:492
#define DBGC2(...)
Definition: compiler.h:522
static int usbio_device_open(struct usb_device *usb)
Open device.
Definition: usbio.c:1044
Universal Serial Bus (USB)
int register_usb_bus(struct usb_bus *bus)
Register USB bus.
Definition: usb.c:2130
uint32_t mtu
Maximum MTU.
Definition: ena.h:28
EFI_USB_IO_PROTOCOL * io
USB I/O protocol.
Definition: usbio.h:130
unsigned int cons
Consumer counter.
Definition: usbio.h:73
static void usb_complete(struct usb_endpoint *ep, struct io_buffer *iobuf)
Complete transfer (without error)
Definition: usb.h:1086
void * data
Start of data.
Definition: iobuf.h:52
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
static int usbio_root_disable(struct usb_hub *hub __unused, struct usb_port *port __unused)
Disable port.
Definition: usbio.c:1157
struct list_head children
Devices attached to this device.
Definition: device.h:86
struct usb_hub * hub
USB hub.
Definition: usb.h:814
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:53
int(* open)(struct usbio_endpoint *endpoint)
Open endpoint.
Definition: usbio.h:98
High speed (480Mbps)
Definition: usb.h:52
struct usb_endpoint * ep[32]
Endpoint list.
Definition: usb.h:744
unsigned int interval
Interval (in microframes)
Definition: usb.h:415
u8 request[0]
List of IEs requested.
Definition: ieee80211.h:16
UINT8 ConfigurationValue
Definition: Usb.h:132
#define cpu_to_le16(value)
Definition: byteswap.h:106
static struct usbio_operations usbio_interrupt_operations
Interrupt endpoint operations.
Definition: usbio.c:805
Standard Configuration Descriptor USB 2.0 spec, Section 9.6.3.
Definition: Usb.h:127
const char * name
Name.
Definition: efi_driver.h:35
uint32_t end
Ending offset.
Definition: netvsc.h:18
uint8_t data[48]
Additional event data.
Definition: ena.h:22
USB host controller operations.
Definition: usb.h:1030
#define USB_ENDPOINT_ATTR_CONTROL
Control endpoint transfer type.
Definition: usb.h:286
struct list_head list
List of endpoints.
Definition: usbio.h:59
#define DBGCP(...)
Definition: compiler.h:539
#define FALSE
Definition: tlan.h:45
struct usb_descriptor_header header
Descriptor header.
Definition: usb.h:265
struct usb_hub * hub
Root hub.
Definition: usb.h:994
struct usb_endpoint * ep
USB endpoint.
Definition: usbio.h:57
uint16_t len
Total length.
Definition: usb.h:213
UINT8 Type
0x01 Hardware Device Path.
Definition: DevicePath.h:46
struct usb_function_descriptor desc
Function descriptor.
Definition: usb.h:679
static void usb_hub_set_drvdata(struct usb_hub *hub, void *priv)
Set USB hub driver private data.
Definition: usb.h:936
struct usb_device * usb
USB device.
Definition: usb.h:405
static void usbio_stop(struct efi_device *efidev)
Detach driver from device.
Definition: usbio.c:1657
static struct usb_port * usb_port(struct usb_hub *hub, unsigned int address)
Get USB port.
Definition: usb.h:959
EFI_SYSTEM_TABLE * efi_systab
uint16_t protocol
Protocol ID.
Definition: stp.h:18
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
EFI_HANDLE handle
EFI device handle.
Definition: usbio.h:128
A USB function.
Definition: usb.h:673
static EFI_STATUS EFIAPI usbio_interrupt_callback(VOID *data, UINTN len, VOID *context, UINT32 status)
Interrupt endpoint callback.
Definition: usbio.c:653
static struct usbio_operations usbio_bulk_out_operations
Bulk endpoint operations.
Definition: usbio.c:607
struct usb_bus * bus
USB bus.
Definition: usb.h:844
static void efidev_set_drvdata(struct efi_device *efidev, void *priv)
Set EFI driver-private data.
Definition: efi_driver.h:83
A USB I/O protocol device.
Definition: usbio.h:126
USB I/O endpoint operations.
Definition: usbio.h:92
struct device dev
Generic device.
Definition: efi_driver.h:19
struct list_head functions
List of functions.
Definition: usb.h:736
EFI_HANDLE handle
EFI device handle.
Definition: usbio.h:114
uint16_t handle
Handle.
Definition: smbios.h:16
#define USB_EP0_ADDRESS
Control endpoint address.
Definition: usb.h:500
static int usbio_root_enable(struct usb_hub *hub __unused, struct usb_port *port __unused)
Enable port.
Definition: usbio.c:1143
#define USB_SET_CONFIGURATION
Set configuration.
Definition: usb.h:145
static int usbio_interfaces(struct usbio_device *usbio)
Construct interface list.
Definition: usbio.c:1497
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
EFI_USB_IO_GET_INTERFACE_DESCRIPTOR UsbGetInterfaceDescriptor
Definition: UsbIo.h:494
Standard Device Descriptor USB 2.0 spec, Section 9.6.1.
Definition: Usb.h:106
String functions.
struct list_head list
List of functions within this USB device.
Definition: usb.h:683
A USB bus.
Definition: usb.h:965
unsigned int attributes
Attributes.
Definition: usb.h:409
static int usbio_open(struct usbio_device *usbio, unsigned int interface)
Open USB I/O interface.
Definition: usbio.c:183
static int fill
Definition: string.h:208
EFI_DEVICE_PATH_PROTOCOL * efi_path_end(EFI_DEVICE_PATH_PROTOCOL *path)
Find end of device path.
Definition: efi_path.c:162
uint8_t interface
Interface number.
Definition: usb.h:248
uint8_t bus
Bus.
Definition: edd.h:14
unsigned int address
Endpoint address.
Definition: usb.h:407
This is a message transfer.
Definition: usbio.h:86
void free_usb_bus(struct usb_bus *bus)
Free USB bus.
Definition: usb.c:2194
#define MSG_USB_DP
USB Device Path SubType.
Definition: DevicePath.h:420
struct io_buffer * iobuf[USBIO_RING_COUNT]
I/O buffers.
Definition: usbio.h:75
Definition: efi.h:61
void usb_complete_err(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete transfer (possibly with error)
Definition: usb.c:586
static void usbio_bulk_out_close(struct usbio_endpoint *endpoint __unused)
Close bulk OUT endpoint.
Definition: usbio.c:536
EFI_LOCATE_DEVICE_PATH LocateDevicePath
Definition: UefiSpec.h:1971
void efi_device_info(EFI_HANDLE device, const char *prefix, struct device *dev)
Get underlying device information.
Definition: efi_utils.c:188
#define EFI_TIMEOUT
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:132
static void * usb_endpoint_get_hostdata(struct usb_endpoint *ep)
Get USB endpoint host controller private data.
Definition: usb.h:586
EFI_USB_IO_GET_CONFIG_DESCRIPTOR UsbGetConfigDescriptor
Definition: UsbIo.h:493
void * memset(void *dest, int character, size_t len) __nonnull
#define ENOTSUP_MORONIC_SPECIFICATION
Definition: usbio.c:101
int efi_shutdown_in_progress
EFI shutdown is in progress.
Definition: efi_init.c:59
A persistent I/O buffer.
Definition: iobuf.h:37