154 lines
3.2 KiB
C
154 lines
3.2 KiB
C
#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 */
|