| #ifndef _USBIO_H | |
| #define _USBIO_H | |
| /** @file | |
| * | |
| * EFI_USB_IO_PROTOCOL pseudo Host Controller Interface driver | |
| * | |
| */ | |
| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); | |
| #include <ipxe/list.h> | |
| #include <ipxe/device.h> | |
| #include <ipxe/efi/efi.h> | |
| #include <ipxe/efi/Protocol/UsbIo.h> | |
| #include <ipxe/efi/Protocol/DevicePath.h> | |
| #include <ipxe/usb.h> | |
| /** USB I/O maximum transfer size | |
| * | |
| * The API provides no way to discover the maximum transfer size. | |
| * Assume the 16kB supported by EHCI. | |
| */ | |
| #define USBIO_MTU 16384 | |
| /** USB I/O interrupt ring buffer size | |
| * | |
| * This is a policy decision. | |
| */ | |
| #define USBIO_INTR_COUNT 4 | |
| /** A USB interrupt ring buffer */ | |
| struct usbio_interrupt_ring { | |
| /** USB I/O endpoint */ | |
| struct usbio_endpoint *endpoint; | |
| /** Producer counter */ | |
| unsigned int prod; | |
| /** Consumer counter */ | |
| unsigned int cons; | |
| /** Data buffers */ | |
| void *data[USBIO_INTR_COUNT]; | |
| /** Lengths */ | |
| size_t len[USBIO_INTR_COUNT]; | |
| }; | |
| /** USB I/O ring buffer size | |
| * | |
| * This is a policy decision. | |
| */ | |
| #define USBIO_RING_COUNT 64 | |
| /** A USB I/O endpoint */ | |
| struct usbio_endpoint { | |
| /** USB I/O device */ | |
| struct usbio_device *usbio; | |
| /** USB endpoint */ | |
| struct usb_endpoint *ep; | |
| /** List of endpoints */ | |
| struct list_head list; | |
| /** USB I/O endpoint operations */ | |
| struct usbio_operations *op; | |
| /** Containing interface number */ | |
| unsigned int interface; | |
| /** EFI handle */ | |
| EFI_HANDLE handle; | |
| /** USB I/O protocol */ | |
| EFI_USB_IO_PROTOCOL *io; | |
| /** Producer counter */ | |
| unsigned int prod; | |
| /** Consumer counter */ | |
| unsigned int cons; | |
| /** I/O buffers */ | |
| struct io_buffer *iobuf[USBIO_RING_COUNT]; | |
| /** Flags */ | |
| uint8_t flags[USBIO_RING_COUNT]; | |
| /** Interrupt ring buffer (if applicable) */ | |
| struct usbio_interrupt_ring *intr; | |
| }; | |
| /** USB I/O transfer flags */ | |
| enum usbio_flags { | |
| /** This is a message transfer */ | |
| USBIO_MESSAGE = 0x01, | |
| /** This transfer requires zero-length packet termination */ | |
| USBIO_ZLEN = 0x02, | |
| }; | |
| /** USB I/O endpoint operations */ | |
| struct usbio_operations { | |
| /** Open endpoint | |
| * | |
| * @v endpoint Endpoint | |
| * @ret rc Return status code | |
| */ | |
| int ( * open ) ( struct usbio_endpoint *endpoint ); | |
| /** Close endpoint | |
| * | |
| * @v endpoint Endpoint | |
| */ | |
| void ( * close ) ( struct usbio_endpoint *endpoint ); | |
| /** Poll endpoint | |
| * | |
| * @v endpoint Endpoint | |
| */ | |
| void ( * poll ) ( struct usbio_endpoint *endpoint ); | |
| }; | |
| /** A USB I/O protocol interface */ | |
| struct usbio_interface { | |
| /** EFI device handle */ | |
| EFI_HANDLE handle; | |
| /** USB I/O protocol */ | |
| EFI_USB_IO_PROTOCOL *io; | |
| /** Usage count */ | |
| unsigned int count; | |
| }; | |
| /** A USB I/O protocol device | |
| * | |
| * We model each externally-provided USB I/O protocol device as a host | |
| * controller containing a root hub with a single port. | |
| */ | |
| struct usbio_device { | |
| /** EFI device handle */ | |
| EFI_HANDLE handle; | |
| /** USB I/O protocol */ | |
| EFI_USB_IO_PROTOCOL *io; | |
| /** Generic device */ | |
| struct device dev; | |
| /** Configuration descriptor */ | |
| struct usb_configuration_descriptor *config; | |
| /** Device path */ | |
| EFI_DEVICE_PATH_PROTOCOL *path; | |
| /** Final component of USB device path */ | |
| USB_DEVICE_PATH *usbpath; | |
| /** First interface number */ | |
| uint8_t first; | |
| /** USB I/O protocol interfaces */ | |
| struct usbio_interface *interface; | |
| /** USB bus */ | |
| struct usb_bus *bus; | |
| /** List of endpoints */ | |
| struct list_head endpoints; | |
| }; | |
| #endif /* _USBIO_H */ |