blob: a7276eba590c2e7cbef926309a6fd8261b024bb8 [file] [log] [blame]
#ifndef _IPXE_USBNET_H
#define _IPXE_USBNET_H
/** @file
*
* USB network devices
*
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/usb.h>
/** A USB network device */
struct usbnet_device {
/** USB function */
struct usb_function *func;
/** Communications interface */
unsigned int comms;
/** Data interface */
unsigned int data;
/** Alternate setting for data interface */
unsigned int alternate;
/** Interrupt endpoint */
struct usb_endpoint intr;
/** Bulk IN endpoint */
struct usb_endpoint in;
/** Bulk OUT endpoint */
struct usb_endpoint out;
};
/**
* Initialise USB network device
*
* @v usbnet USB network device
* @v func USB function
* @v intr Interrupt endpoint operations, or NULL
* @v in Bulk IN endpoint operations
* @v out Bulk OUT endpoint operations
*/
static inline __attribute__ (( always_inline )) void
usbnet_init ( struct usbnet_device *usbnet, struct usb_function *func,
struct usb_endpoint_driver_operations *intr,
struct usb_endpoint_driver_operations *in,
struct usb_endpoint_driver_operations *out ) {
struct usb_device *usb = func->usb;
usbnet->func = func;
usb_endpoint_init ( &usbnet->intr, usb, intr );
usb_endpoint_init ( &usbnet->in, usb, in );
usb_endpoint_init ( &usbnet->out, usb, out );
}
/**
* Check if USB network device has an interrupt endpoint
*
* @v usbnet USB network device
* @ret has_intr Device has an interrupt endpoint
*/
static inline __attribute__ (( always_inline )) int
usbnet_has_intr ( struct usbnet_device *usbnet ) {
return ( usbnet->intr.driver != NULL );
}
extern int usbnet_open ( struct usbnet_device *usbnet );
extern void usbnet_close ( struct usbnet_device *usbnet );
extern int usbnet_refill ( struct usbnet_device *usbnet );
extern int usbnet_describe ( struct usbnet_device *usbnet,
struct usb_configuration_descriptor *config );
#endif /* _IPXE_USBNET_H */