blob: 1d02876f6093aa0656411d837f0f5960cd3b8053 [file] [log] [blame]
#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 */