summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorMichael Brown2015-09-10 18:22:03 +0200
committerMichael Brown2015-09-14 23:11:37 +0200
commit5df081d6c039924506c07c0c7a2cf7e2c699709f (patch)
treebe5be151ecfc2372a1267372215dc49f3ca67340 /src/include
parent[usb] Allow for wildcard USB class IDs (diff)
downloadipxe-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.h80
-rw-r--r--src/include/ipxe/errfile.h1
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 )
/** @} */