diff options
| author | Michael Brown | 2015-09-10 18:22:03 +0200 |
|---|---|---|
| committer | Michael Brown | 2015-09-14 23:11:37 +0200 |
| commit | 5df081d6c039924506c07c0c7a2cf7e2c699709f (patch) | |
| tree | be5be151ecfc2372a1267372215dc49f3ca67340 /src/include | |
| parent | [usb] Allow for wildcard USB class IDs (diff) | |
| download | ipxe-5df081d6c039924506c07c0c7a2cf7e2c699709f.tar.gz ipxe-5df081d6c039924506c07c0c7a2cf7e2c699709f.tar.xz ipxe-5df081d6c039924506c07c0c7a2cf7e2c699709f.zip | |
[efi] Expose unused USB devices via EFI_USB_IO_PROTOCOL
Allow the UEFI platform firmware to provide drivers for unrecognised
devices, by exposing our own implementation of EFI_USB_IO_PROTOCOL.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/ipxe/efi/efi_usb.h | 80 | ||||
| -rw-r--r-- | src/include/ipxe/errfile.h | 1 |
2 files changed, 81 insertions, 0 deletions
diff --git a/src/include/ipxe/efi/efi_usb.h b/src/include/ipxe/efi/efi_usb.h new file mode 100644 index 000000000..05b4fad00 --- /dev/null +++ b/src/include/ipxe/efi/efi_usb.h @@ -0,0 +1,80 @@ +#ifndef _IPXE_EFI_USB_H +#define _IPXE_EFI_USB_H + +/** @file + * + * USB I/O protocol + * + */ + +#include <ipxe/list.h> +#include <ipxe/efi/efi.h> +#include <ipxe/efi/efi_driver.h> +#include <ipxe/efi/Protocol/UsbIo.h> +#include <ipxe/usb.h> + +/** An EFI USB device */ +struct efi_usb_device { + /** Name */ + const char *name; + /** The underlying USB device */ + struct usb_device *usb; + /** The underlying EFI device */ + struct efi_device *efidev; + /** Configuration descriptor */ + struct usb_configuration_descriptor *config; + /** Supported languages */ + struct usb_descriptor_header *languages; + /** List of interfaces */ + struct list_head interfaces; +}; + +/** An EFI USB device interface */ +struct efi_usb_interface { + /** Name */ + char name[32]; + /** Containing USB device */ + struct efi_usb_device *usbdev; + /** List of interfaces */ + struct list_head list; + + /** Interface number */ + unsigned int interface; + /** Alternate setting */ + unsigned int alternate; + /** EFI handle */ + EFI_HANDLE handle; + /** USB I/O protocol */ + EFI_USB_IO_PROTOCOL usbio; + /** Device path */ + EFI_DEVICE_PATH_PROTOCOL *path; + + /** Opened endpoints */ + struct efi_usb_endpoint *endpoint[32]; +}; + +/** An EFI USB device endpoint */ +struct efi_usb_endpoint { + /** EFI USB device interface */ + struct efi_usb_interface *usbintf; + /** USB endpoint */ + struct usb_endpoint ep; + + /** Most recent synchronous completion status */ + int rc; + + /** Asynchronous timer event */ + EFI_EVENT event; + /** Asynchronous callback handler */ + EFI_ASYNC_USB_TRANSFER_CALLBACK callback; + /** Asynchronous callback context */ + void *context; +}; + +/** Asynchronous transfer fill level + * + * This is a policy decision. + */ +#define EFI_USB_ASYNC_FILL 2 + +#endif /* _IPXE_EFI_USB_H */ diff --git a/src/include/ipxe/errfile.h b/src/include/ipxe/errfile.h index aff911e3b..6c4dcf503 100644 --- a/src/include/ipxe/errfile.h +++ b/src/include/ipxe/errfile.h @@ -341,6 +341,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #define ERRFILE_efi_time ( ERRFILE_OTHER | 0x00480000 ) #define ERRFILE_efi_watchdog ( ERRFILE_OTHER | 0x00490000 ) #define ERRFILE_efi_pxe ( ERRFILE_OTHER | 0x004a0000 ) +#define ERRFILE_efi_usb ( ERRFILE_OTHER | 0x004b0000 ) /** @} */ |
