#ifndef _USBIO_H #define _USBIO_H /** @file * * EFI_USB_IO_PROTOCOL pseudo Host Controller Interface driver * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include #include #include #include /** 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 */