[usb] Provide generic framework for refilling receive endpoints

Provide a generic framework for allocating, refilling, and optionally
recycling I/O buffers used by bulk IN and interrupt endpoints.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2015-02-12 15:14:04 +00:00
parent 5de134662d
commit 17fc79425e
2 changed files with 168 additions and 0 deletions

View File

@@ -379,6 +379,8 @@ struct usb_endpoint {
int open;
/** Current failure state (if any) */
int rc;
/** Buffer fill level */
unsigned int fill;
/** Host controller operations */
struct usb_endpoint_host_operations *host;
@@ -386,6 +388,13 @@ struct usb_endpoint {
void *priv;
/** Driver operations */
struct usb_endpoint_driver_operations *driver;
/** Recycled I/O buffer list */
struct list_head recycled;
/** Refill buffer length */
size_t len;
/** Maximum fill level */
unsigned int max;
};
/** USB endpoint host controller operations */
@@ -553,6 +562,37 @@ extern int usb_stream ( struct usb_endpoint *ep, struct io_buffer *iobuf,
extern void usb_complete_err ( struct usb_endpoint *ep,
struct io_buffer *iobuf, int rc );
/**
* Initialise USB endpoint refill
*
* @v ep USB endpoint
* @v len Refill buffer length (or zero to use endpoint's MTU)
* @v max Maximum fill level
*/
static inline __attribute__ (( always_inline )) void
usb_refill_init ( struct usb_endpoint *ep, size_t len, unsigned int max ) {
INIT_LIST_HEAD ( &ep->recycled );
ep->len = len;
ep->max = max;
}
/**
* Recycle I/O buffer
*
* @v ep USB endpoint
* @v iobuf I/O buffer
*/
static inline __attribute__ (( always_inline )) void
usb_recycle ( struct usb_endpoint *ep, struct io_buffer *iobuf ) {
list_add_tail ( &iobuf->list, &ep->recycled );
}
extern int usb_prefill ( struct usb_endpoint *ep );
extern int usb_refill ( struct usb_endpoint *ep );
extern void usb_flush ( struct usb_endpoint *ep );
/**
* A USB function
*