123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- #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 */
|