iPXE
Data Structures | Macros | Enumerations | Functions | Variables
usb.h File Reference

Universal Serial Bus (USB) More...

#include <byteswap.h>
#include <ipxe/list.h>
#include <ipxe/device.h>
#include <ipxe/process.h>
#include <ipxe/iobuf.h>
#include <ipxe/tables.h>

Go to the source code of this file.

Data Structures

struct  usb_setup_packet
 A USB setup data packet. More...
 
struct  usb_class
 A USB class code tuple. More...
 
struct  usb_descriptor_header
 A USB descriptor header. More...
 
struct  usb_device_descriptor
 A USB device descriptor. More...
 
struct  usb_configuration_descriptor
 A USB configuration descriptor. More...
 
struct  usb_string_descriptor
 A USB string descriptor. More...
 
struct  usb_interface_descriptor
 A USB interface descriptor. More...
 
struct  usb_endpoint_descriptor
 A USB endpoint descriptor. More...
 
struct  usb_endpoint_companion_descriptor
 A USB endpoint companion descriptor. More...
 
struct  usb_interface_association_descriptor
 A USB interface association descriptor. More...
 
struct  usb_endpoint
 A USB endpoint. More...
 
struct  usb_endpoint_host_operations
 USB endpoint host controller operations. More...
 
struct  usb_endpoint_driver_operations
 USB endpoint driver operations. More...
 
union  usb_class_descriptor
 A USB class descriptor. More...
 
struct  usb_function_descriptor
 A USB function descriptor. More...
 
struct  usb_function
 A USB function. More...
 
struct  usb_device
 A USB device. More...
 
struct  usb_device_host_operations
 USB device host controller operations. More...
 
struct  usb_port
 A USB port. More...
 
struct  usb_hub
 A USB hub. More...
 
struct  usb_hub_host_operations
 USB hub host controller operations. More...
 
struct  usb_hub_driver_operations
 USB hub driver operations. More...
 
struct  usb_bus
 A USB bus. More...
 
struct  usb_bus_host_operations
 USB bus host controller operations. More...
 
struct  usb_host_operations
 USB host controller operations. More...
 
struct  usb_device_id
 A USB device ID. More...
 
struct  usb_class_id
 A USB class ID. More...
 
struct  usb_driver
 A USB driver. More...
 

Macros

#define USB_SPEED(mantissa, exponent)   ( (exponent << 16) | (mantissa) )
 Define a USB speed. More...
 
#define USB_SPEED_MANTISSA(speed)   ( (speed) & 0xffff )
 Extract USB speed mantissa. More...
 
#define USB_SPEED_EXPONENT(speed)   ( ( (speed) >> 16 ) & 0x3 )
 Extract USB speed exponent. More...
 
#define USB_DIR_OUT   ( 0 << 7 )
 Data transfer is from host to device. More...
 
#define USB_DIR_IN   ( 1 << 7 )
 Data transfer is from device to host. More...
 
#define USB_TYPE_STANDARD   ( 0 << 5 )
 Standard request type. More...
 
#define USB_TYPE_CLASS   ( 1 << 5 )
 Class-specific request type. More...
 
#define USB_TYPE_VENDOR   ( 2 << 5 )
 Vendor-specific request type. More...
 
#define USB_RECIP_MASK   ( 0x1f << 0 )
 Request recipient mask. More...
 
#define USB_RECIP_DEVICE   ( 0 << 0 )
 Request recipient is the device. More...
 
#define USB_RECIP_INTERFACE   ( 1 << 0 )
 Request recipient is an interface. More...
 
#define USB_RECIP_ENDPOINT   ( 2 << 0 )
 Request recipient is an endpoint. More...
 
#define USB_REQUEST_TYPE(type)   ( (type) << 8 )
 Construct USB request type. More...
 
#define USB_GET_STATUS   ( USB_DIR_IN | USB_REQUEST_TYPE ( 0 ) )
 Get status. More...
 
#define USB_CLEAR_FEATURE   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 1 ) )
 Clear feature. More...
 
#define USB_SET_FEATURE   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 3 ) )
 Set feature. More...
 
#define USB_SET_ADDRESS   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 5 ) )
 Set address. More...
 
#define USB_GET_DESCRIPTOR   ( USB_DIR_IN | USB_REQUEST_TYPE ( 6 ) )
 Get descriptor. More...
 
#define USB_SET_DESCRIPTOR   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 7 ) )
 Set descriptor. More...
 
#define USB_GET_CONFIGURATION   ( USB_DIR_IN | USB_REQUEST_TYPE ( 8 ) )
 Get configuration. More...
 
#define USB_SET_CONFIGURATION   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 9 ) )
 Set configuration. More...
 
#define USB_GET_INTERFACE   ( USB_DIR_IN | USB_RECIP_INTERFACE | USB_REQUEST_TYPE ( 10 ) )
 Get interface. More...
 
#define USB_SET_INTERFACE   ( USB_DIR_OUT | USB_RECIP_INTERFACE | USB_REQUEST_TYPE ( 11 ) )
 Set interface. More...
 
#define USB_ENDPOINT_HALT   0
 Endpoint halt feature. More...
 
#define USB_CLASS_HUB   9
 Class code for USB hubs. More...
 
#define USB_DEVICE_DESCRIPTOR   1
 A USB device descriptor. More...
 
#define USB_CONFIGURATION_DESCRIPTOR   2
 A USB configuration descriptor. More...
 
#define USB_STRING_DESCRIPTOR   3
 A USB string descriptor. More...
 
#define USB_LANG_ENGLISH   0x0409
 Language ID for English. More...
 
#define USB_INTERFACE_DESCRIPTOR   4
 A USB interface descriptor. More...
 
#define USB_ENDPOINT_DESCRIPTOR   5
 A USB endpoint descriptor. More...
 
#define USB_ENDPOINT_ATTR_TYPE_MASK   0x03
 Endpoint attribute transfer type mask. More...
 
#define USB_ENDPOINT_ATTR_PERIODIC   0x01
 Endpoint periodic type. More...
 
#define USB_ENDPOINT_ATTR_CONTROL   0x00
 Control endpoint transfer type. More...
 
#define USB_ENDPOINT_ATTR_BULK   0x02
 Bulk endpoint transfer type. More...
 
#define USB_ENDPOINT_ATTR_INTERRUPT   0x03
 Interrupt endpoint transfer type. More...
 
#define USB_BULK_OUT   ( USB_ENDPOINT_ATTR_BULK | USB_DIR_OUT )
 Bulk OUT endpoint (internal) type. More...
 
#define USB_BULK_IN   ( USB_ENDPOINT_ATTR_BULK | USB_DIR_IN )
 Bulk IN endpoint (internal) type. More...
 
#define USB_INTERRUPT_IN   ( USB_ENDPOINT_ATTR_INTERRUPT | USB_DIR_IN )
 Interrupt IN endpoint (internal) type. More...
 
#define USB_INTERRUPT_OUT   ( USB_ENDPOINT_ATTR_INTERRUPT | USB_DIR_OUT )
 Interrupt OUT endpoint (internal) type. More...
 
#define USB_ENDPOINT_MTU(sizes)   ( ( (sizes) >> 0 ) & 0x07ff )
 USB endpoint MTU. More...
 
#define USB_ENDPOINT_BURST(sizes)   ( ( (sizes) >> 11 ) & 0x0003 )
 USB endpoint maximum burst size. More...
 
#define USB_ENDPOINT_COMPANION_DESCRIPTOR   48
 A USB endpoint companion descriptor. More...
 
#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR   11
 A USB interface association descriptor. More...
 
#define USB_CS_INTERFACE_DESCRIPTOR   36
 A class-specific interface descriptor. More...
 
#define USB_CS_ENDPOINT_DESCRIPTOR   37
 A class-specific endpoint descriptor. More...
 
#define for_each_config_descriptor(desc, config)
 Iterate over all configuration descriptors. More...
 
#define for_each_interface_descriptor(desc, config, interface)
 Iterate over all configuration descriptors within an interface descriptor. More...
 
#define USB_EP0_ADDRESS   0x00
 Control endpoint address. More...
 
#define USB_EP0_ATTRIBUTES   0x00
 Control endpoint attributes. More...
 
#define USB_EP0_DEFAULT_MTU(speed)
 Calculate default MTU based on device speed. More...
 
#define USB_EP0_BURST   0
 Control endpoint maximum burst size. More...
 
#define USB_EP0_INTERVAL   0
 Control endpoint interval. More...
 
#define USB_ENDPOINT_MAX   0x0f
 Maximum endpoint number. More...
 
#define USB_ENDPOINT_IN   0x80
 Endpoint direction is in. More...
 
#define USB_ENDPOINT_IDX(address)
 Construct endpoint index from endpoint address. More...
 
#define for_each_usb_bus(bus)   list_for_each_entry ( (bus), &usb_buses, list )
 Iterate over all USB buses. More...
 
#define USB_RESET_DELAY_MS   50
 Minimum reset time. More...
 
#define USB_RESET_RECOVER_DELAY_MS   10
 Reset recovery time. More...
 
#define USB_CONTROL_MAX_WAIT_MS   5000
 Maximum time to wait for a control transaction to complete. More...
 
#define USB_SET_ADDRESS_RECOVER_DELAY_MS   2
 Set address recovery time. More...
 
#define USB_PORT_DELAY_MS   200
 Time to wait for ports to stabilise. More...
 
#define USB_ANY_ID   0xffff
 Match-anything ID. More...
 
#define USB_CLASS_ID(base, subclass, protocol)
 Construct USB class ID. More...
 
#define USB_DRIVERS   __table ( struct usb_driver, "usb_drivers" )
 USB driver table. More...
 
#define __usb_driver   __table_entry ( USB_DRIVERS, 01 )
 Declare a USB driver. More...
 

Enumerations

enum  usb_protocol { USB_PROTO_2_0 = 0x0200, USB_PROTO_3_0 = 0x0300, USB_PROTO_3_1 = 0x0301 }
 USB protocols. More...
 
enum  usb_speed {
  USB_SPEED_NONE = 0, USB_SPEED_LOW = USB_SPEED ( 1500, 1 ), USB_SPEED_FULL = USB_SPEED ( 12, 2 ), USB_SPEED_HIGH = USB_SPEED ( 480, 2 ),
  USB_SPEED_SUPER = USB_SPEED ( 5, 3 )
}
 USB device speeds. More...
 
enum  usb_pid { USB_PID_IN = 0x69, USB_PID_OUT = 0xe1, USB_PID_SETUP = 0x2d }
 USB packet IDs. More...
 
enum  usb_driver_score { USB_SCORE_FALLBACK = 0, USB_SCORE_DEPRECATED = 1, USB_SCORE_NORMAL = 2 }
 USB driver scores. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static struct usb_descriptor_headerusb_next_descriptor (struct usb_descriptor_header *desc)
 Get next USB descriptor. More...
 
static int usb_is_within_config (struct usb_configuration_descriptor *config, struct usb_descriptor_header *desc)
 Check that descriptor lies within a configuration descriptor. More...
 
static void usb_endpoint_init (struct usb_endpoint *ep, struct usb_device *usb, struct usb_endpoint_driver_operations *driver)
 Initialise USB endpoint. More...
 
static void usb_endpoint_describe (struct usb_endpoint *ep, unsigned int address, unsigned int attributes, size_t mtu, unsigned int burst, unsigned int interval)
 Describe USB endpoint. More...
 
static void usb_endpoint_set_hostdata (struct usb_endpoint *ep, void *priv)
 Set USB endpoint host controller private data. More...
 
static void * usb_endpoint_get_hostdata (struct usb_endpoint *ep)
 Get USB endpoint host controller private data. More...
 
const char * usb_endpoint_name (struct usb_endpoint *ep)
 Get USB endpoint name (for debugging) More...
 
int usb_endpoint_described (struct usb_endpoint *ep, struct usb_configuration_descriptor *config, struct usb_interface_descriptor *interface, unsigned int type, unsigned int index)
 Describe USB endpoint from device configuration. More...
 
int usb_endpoint_open (struct usb_endpoint *ep)
 Open USB endpoint. More...
 
void usb_endpoint_close (struct usb_endpoint *ep)
 Close USB endpoint. More...
 
int usb_message (struct usb_endpoint *ep, unsigned int request, unsigned int value, unsigned int index, struct io_buffer *iobuf)
 Enqueue USB message transfer. More...
 
int usb_stream (struct usb_endpoint *ep, struct io_buffer *iobuf, int terminate)
 Enqueue USB stream transfer. More...
 
void usb_complete_err (struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
 Complete transfer (possibly with error) More...
 
static void usb_refill_init (struct usb_endpoint *ep, size_t reserve, size_t len, unsigned int max)
 Initialise USB endpoint refill. More...
 
static void usb_recycle (struct usb_endpoint *ep, struct io_buffer *iobuf)
 Recycle I/O buffer. More...
 
int usb_prefill (struct usb_endpoint *ep)
 Prefill endpoint recycled buffer list. More...
 
int usb_refill (struct usb_endpoint *ep)
 Refill endpoint. More...
 
void usb_flush (struct usb_endpoint *ep)
 Discard endpoint recycled buffer list. More...
 
static void usb_func_set_drvdata (struct usb_function *func, void *priv)
 Set USB function driver private data. More...
 
static void * usb_func_get_drvdata (struct usb_function *func)
 Get USB function driver private data. More...
 
static void usb_set_hostdata (struct usb_device *usb, void *priv)
 Set USB device host controller private data. More...
 
static void * usb_get_hostdata (struct usb_device *usb)
 Get USB device host controller private data. More...
 
static struct usb_endpointusb_endpoint (struct usb_device *usb, unsigned int address)
 Get USB endpoint. More...
 
static void usb_hub_set_drvdata (struct usb_hub *hub, void *priv)
 Set USB hub driver private data. More...
 
static void * usb_hub_get_drvdata (struct usb_hub *hub)
 Get USB hub driver private data. More...
 
static struct usb_portusb_port (struct usb_hub *hub, unsigned int address)
 Get USB port. More...
 
static void usb_bus_set_hostdata (struct usb_bus *bus, void *priv)
 Set USB bus host controller private data. More...
 
static void * usb_bus_get_hostdata (struct usb_bus *bus)
 Get USB bus host controller private data. More...
 
static void usb_poll (struct usb_bus *bus)
 Poll USB bus. More...
 
static void usb_complete (struct usb_endpoint *ep, struct io_buffer *iobuf)
 Complete transfer (without error) More...
 
int usb_control (struct usb_device *usb, unsigned int request, unsigned int value, unsigned int index, void *data, size_t len)
 Issue USB control transaction. More...
 
int usb_get_string_descriptor (struct usb_device *usb, unsigned int index, unsigned int language, char *buf, size_t len)
 Get USB string descriptor. More...
 
static int usb_get_status (struct usb_device *usb, unsigned int type, unsigned int index, void *data, size_t len)
 Get status. More...
 
static int usb_clear_feature (struct usb_device *usb, unsigned int type, unsigned int feature, unsigned int index)
 Clear feature. More...
 
static int usb_set_feature (struct usb_device *usb, unsigned int type, unsigned int feature, unsigned int index)
 Set feature. More...
 
static int usb_set_address (struct usb_device *usb, unsigned int address)
 Set address. More...
 
static int usb_get_descriptor (struct usb_device *usb, unsigned int type, unsigned int desc, unsigned int index, unsigned int language, struct usb_descriptor_header *data, size_t len)
 Get USB descriptor. More...
 
static int usb_get_mtu (struct usb_device *usb, struct usb_device_descriptor *data)
 Get first part of USB device descriptor (up to and including MTU) More...
 
static int usb_get_device_descriptor (struct usb_device *usb, struct usb_device_descriptor *data)
 Get USB device descriptor. More...
 
static int usb_get_config_descriptor (struct usb_device *usb, unsigned int index, struct usb_configuration_descriptor *data, size_t len)
 Get USB configuration descriptor. More...
 
static int usb_set_configuration (struct usb_device *usb, unsigned int index)
 Set USB configuration. More...
 
static int usb_set_interface (struct usb_device *usb, unsigned int interface, unsigned int alternate)
 Set USB interface alternate setting. More...
 
struct usb_interface_descriptorusb_interface_descriptor (struct usb_configuration_descriptor *config, unsigned int interface, unsigned int alternate)
 Locate USB interface descriptor. More...
 
struct usb_endpoint_descriptorusb_endpoint_descriptor (struct usb_configuration_descriptor *config, struct usb_interface_descriptor *interface, unsigned int type, unsigned int index)
 Locate USB endpoint descriptor. More...
 
struct usb_endpoint_companion_descriptorusb_endpoint_companion_descriptor (struct usb_configuration_descriptor *config, struct usb_endpoint_descriptor *desc)
 Locate USB endpoint companion descriptor. More...
 
struct usb_huballoc_usb_hub (struct usb_bus *bus, struct usb_device *usb, unsigned int ports, struct usb_hub_driver_operations *op)
 Allocate USB hub. More...
 
int register_usb_hub (struct usb_hub *hub)
 Register USB hub. More...
 
void unregister_usb_hub (struct usb_hub *hub)
 Unregister USB hub. More...
 
void free_usb_hub (struct usb_hub *hub)
 Free USB hub. More...
 
void usb_port_changed (struct usb_port *port)
 Report port status change. More...
 
struct usb_busalloc_usb_bus (struct device *dev, unsigned int ports, size_t mtu, struct usb_host_operations *op)
 Allocate USB bus. More...
 
int register_usb_bus (struct usb_bus *bus)
 Register USB bus. More...
 
void unregister_usb_bus (struct usb_bus *bus)
 Unregister USB bus. More...
 
void free_usb_bus (struct usb_bus *bus)
 Free USB bus. More...
 
struct usb_busfind_usb_bus_by_location (unsigned int bus_type, unsigned int location)
 Find USB bus by device location. More...
 
int usb_alloc_address (struct usb_bus *bus)
 Allocate device address. More...
 
void usb_free_address (struct usb_bus *bus, unsigned int address)
 Free device address. More...
 
unsigned int usb_route_string (struct usb_device *usb)
 Get USB route string. More...
 
unsigned int usb_depth (struct usb_device *usb)
 Get USB depth. More...
 
struct usb_portusb_root_hub_port (struct usb_device *usb)
 Get USB root hub port. More...
 
struct usb_portusb_transaction_translator (struct usb_device *usb)
 Get USB transaction translator. More...
 
struct usb_driverusb_find_driver (struct usb_function_descriptor *desc, struct usb_device_id **id)
 Find USB device driver. More...
 

Variables

struct list_head usb_buses
 List of USB buses. More...
 

Detailed Description

Universal Serial Bus (USB)

Definition in file usb.h.

Macro Definition Documentation

◆ USB_SPEED

#define USB_SPEED (   mantissa,
  exponent 
)    ( (exponent << 16) | (mantissa) )

Define a USB speed.

Parameters
mantissaMantissa
exponentExponent (in engineering terms: 1=k, 2=M, 3=G)
Return values
speedUSB speed

Definition at line 35 of file usb.h.

◆ USB_SPEED_MANTISSA

#define USB_SPEED_MANTISSA (   speed)    ( (speed) & 0xffff )

Extract USB speed mantissa.

Definition at line 38 of file usb.h.

◆ USB_SPEED_EXPONENT

#define USB_SPEED_EXPONENT (   speed)    ( ( (speed) >> 16 ) & 0x3 )

Extract USB speed exponent.

Definition at line 41 of file usb.h.

◆ USB_DIR_OUT

#define USB_DIR_OUT   ( 0 << 7 )

Data transfer is from host to device.

Definition at line 80 of file usb.h.

◆ USB_DIR_IN

#define USB_DIR_IN   ( 1 << 7 )

Data transfer is from device to host.

Definition at line 83 of file usb.h.

◆ USB_TYPE_STANDARD

#define USB_TYPE_STANDARD   ( 0 << 5 )

Standard request type.

Definition at line 86 of file usb.h.

◆ USB_TYPE_CLASS

#define USB_TYPE_CLASS   ( 1 << 5 )

Class-specific request type.

Definition at line 89 of file usb.h.

◆ USB_TYPE_VENDOR

#define USB_TYPE_VENDOR   ( 2 << 5 )

Vendor-specific request type.

Definition at line 92 of file usb.h.

◆ USB_RECIP_MASK

#define USB_RECIP_MASK   ( 0x1f << 0 )

Request recipient mask.

Definition at line 95 of file usb.h.

◆ USB_RECIP_DEVICE

#define USB_RECIP_DEVICE   ( 0 << 0 )

Request recipient is the device.

Definition at line 98 of file usb.h.

◆ USB_RECIP_INTERFACE

#define USB_RECIP_INTERFACE   ( 1 << 0 )

Request recipient is an interface.

Definition at line 101 of file usb.h.

◆ USB_RECIP_ENDPOINT

#define USB_RECIP_ENDPOINT   ( 2 << 0 )

Request recipient is an endpoint.

Definition at line 104 of file usb.h.

◆ USB_REQUEST_TYPE

#define USB_REQUEST_TYPE (   type)    ( (type) << 8 )

Construct USB request type.

Definition at line 107 of file usb.h.

◆ USB_GET_STATUS

#define USB_GET_STATUS   ( USB_DIR_IN | USB_REQUEST_TYPE ( 0 ) )

Get status.

Definition at line 110 of file usb.h.

◆ USB_CLEAR_FEATURE

#define USB_CLEAR_FEATURE   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 1 ) )

Clear feature.

Definition at line 113 of file usb.h.

◆ USB_SET_FEATURE

#define USB_SET_FEATURE   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 3 ) )

Set feature.

Definition at line 116 of file usb.h.

◆ USB_SET_ADDRESS

#define USB_SET_ADDRESS   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 5 ) )

Set address.

Definition at line 119 of file usb.h.

◆ USB_GET_DESCRIPTOR

#define USB_GET_DESCRIPTOR   ( USB_DIR_IN | USB_REQUEST_TYPE ( 6 ) )

Get descriptor.

Definition at line 122 of file usb.h.

◆ USB_SET_DESCRIPTOR

#define USB_SET_DESCRIPTOR   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 7 ) )

Set descriptor.

Definition at line 125 of file usb.h.

◆ USB_GET_CONFIGURATION

#define USB_GET_CONFIGURATION   ( USB_DIR_IN | USB_REQUEST_TYPE ( 8 ) )

Get configuration.

Definition at line 128 of file usb.h.

◆ USB_SET_CONFIGURATION

#define USB_SET_CONFIGURATION   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 9 ) )

Set configuration.

Definition at line 131 of file usb.h.

◆ USB_GET_INTERFACE

#define USB_GET_INTERFACE   ( USB_DIR_IN | USB_RECIP_INTERFACE | USB_REQUEST_TYPE ( 10 ) )

Get interface.

Definition at line 134 of file usb.h.

◆ USB_SET_INTERFACE

#define USB_SET_INTERFACE   ( USB_DIR_OUT | USB_RECIP_INTERFACE | USB_REQUEST_TYPE ( 11 ) )

Set interface.

Definition at line 138 of file usb.h.

◆ USB_ENDPOINT_HALT

#define USB_ENDPOINT_HALT   0

Endpoint halt feature.

Definition at line 142 of file usb.h.

◆ USB_CLASS_HUB

#define USB_CLASS_HUB   9

Class code for USB hubs.

Definition at line 155 of file usb.h.

◆ USB_DEVICE_DESCRIPTOR

#define USB_DEVICE_DESCRIPTOR   1

A USB device descriptor.

Definition at line 192 of file usb.h.

◆ USB_CONFIGURATION_DESCRIPTOR

#define USB_CONFIGURATION_DESCRIPTOR   2

A USB configuration descriptor.

Definition at line 213 of file usb.h.

◆ USB_STRING_DESCRIPTOR

#define USB_STRING_DESCRIPTOR   3

A USB string descriptor.

Definition at line 224 of file usb.h.

◆ USB_LANG_ENGLISH

#define USB_LANG_ENGLISH   0x0409

Language ID for English.

Definition at line 227 of file usb.h.

◆ USB_INTERFACE_DESCRIPTOR

#define USB_INTERFACE_DESCRIPTOR   4

A USB interface descriptor.

Definition at line 246 of file usb.h.

◆ USB_ENDPOINT_DESCRIPTOR

#define USB_ENDPOINT_DESCRIPTOR   5

A USB endpoint descriptor.

Definition at line 263 of file usb.h.

◆ USB_ENDPOINT_ATTR_TYPE_MASK

#define USB_ENDPOINT_ATTR_TYPE_MASK   0x03

Endpoint attribute transfer type mask.

Definition at line 266 of file usb.h.

◆ USB_ENDPOINT_ATTR_PERIODIC

#define USB_ENDPOINT_ATTR_PERIODIC   0x01

Endpoint periodic type.

Definition at line 269 of file usb.h.

◆ USB_ENDPOINT_ATTR_CONTROL

#define USB_ENDPOINT_ATTR_CONTROL   0x00

Control endpoint transfer type.

Definition at line 272 of file usb.h.

◆ USB_ENDPOINT_ATTR_BULK

#define USB_ENDPOINT_ATTR_BULK   0x02

Bulk endpoint transfer type.

Definition at line 275 of file usb.h.

◆ USB_ENDPOINT_ATTR_INTERRUPT

#define USB_ENDPOINT_ATTR_INTERRUPT   0x03

Interrupt endpoint transfer type.

Definition at line 278 of file usb.h.

◆ USB_BULK_OUT

#define USB_BULK_OUT   ( USB_ENDPOINT_ATTR_BULK | USB_DIR_OUT )

Bulk OUT endpoint (internal) type.

Definition at line 281 of file usb.h.

◆ USB_BULK_IN

#define USB_BULK_IN   ( USB_ENDPOINT_ATTR_BULK | USB_DIR_IN )

Bulk IN endpoint (internal) type.

Definition at line 284 of file usb.h.

◆ USB_INTERRUPT_IN

#define USB_INTERRUPT_IN   ( USB_ENDPOINT_ATTR_INTERRUPT | USB_DIR_IN )

Interrupt IN endpoint (internal) type.

Definition at line 287 of file usb.h.

◆ USB_INTERRUPT_OUT

#define USB_INTERRUPT_OUT   ( USB_ENDPOINT_ATTR_INTERRUPT | USB_DIR_OUT )

Interrupt OUT endpoint (internal) type.

Definition at line 290 of file usb.h.

◆ USB_ENDPOINT_MTU

#define USB_ENDPOINT_MTU (   sizes)    ( ( (sizes) >> 0 ) & 0x07ff )

USB endpoint MTU.

Definition at line 293 of file usb.h.

◆ USB_ENDPOINT_BURST

#define USB_ENDPOINT_BURST (   sizes)    ( ( (sizes) >> 11 ) & 0x0003 )

USB endpoint maximum burst size.

Definition at line 296 of file usb.h.

◆ USB_ENDPOINT_COMPANION_DESCRIPTOR

#define USB_ENDPOINT_COMPANION_DESCRIPTOR   48

A USB endpoint companion descriptor.

Definition at line 311 of file usb.h.

◆ USB_INTERFACE_ASSOCIATION_DESCRIPTOR

#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR   11

A USB interface association descriptor.

Definition at line 328 of file usb.h.

◆ USB_CS_INTERFACE_DESCRIPTOR

#define USB_CS_INTERFACE_DESCRIPTOR   36

A class-specific interface descriptor.

Definition at line 331 of file usb.h.

◆ USB_CS_ENDPOINT_DESCRIPTOR

#define USB_CS_ENDPOINT_DESCRIPTOR   37

A class-specific endpoint descriptor.

Definition at line 334 of file usb.h.

◆ for_each_config_descriptor

#define for_each_config_descriptor (   desc,
  config 
)
Value:
for ( desc = container_of ( &(config)->header, \
typeof ( *desc ), header ) ; \
usb_is_within_config ( (config), &desc->header ) ; \
desc = container_of ( usb_next_descriptor ( &desc->header ), \
typeof ( *desc ), header ) )
static struct usb_descriptor_header * usb_next_descriptor(struct usb_descriptor_header *desc)
Get next USB descriptor.
Definition: usb.h:343
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
struct ena_aq_header header
Header.
Definition: ena.h:12

Iterate over all configuration descriptors.

Definition at line 371 of file usb.h.

◆ for_each_interface_descriptor

#define for_each_interface_descriptor (   desc,
  config,
  interface 
)
Value:
header ), \
typeof ( *desc ), header ) ; \
( usb_is_within_config ( (config), &desc->header ) && \
( desc->header.type != USB_INTERFACE_DESCRIPTOR ) ) ; \
desc = container_of ( usb_next_descriptor ( &desc->header ), \
typeof ( *desc ), header ) )
static struct usb_descriptor_header * usb_next_descriptor(struct usb_descriptor_header *desc)
Get next USB descriptor.
Definition: usb.h:343
#define USB_INTERFACE_DESCRIPTOR
A USB interface descriptor.
Definition: usb.h:246
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
An object interface.
Definition: interface.h:109
struct ena_aq_header header
Header.
Definition: ena.h:12
static int usb_is_within_config(struct usb_configuration_descriptor *config, struct usb_descriptor_header *desc)
Check that descriptor lies within a configuration descriptor.
Definition: usb.h:356

Iterate over all configuration descriptors within an interface descriptor.

Definition at line 379 of file usb.h.

◆ USB_EP0_ADDRESS

#define USB_EP0_ADDRESS   0x00

Control endpoint address.

Definition at line 486 of file usb.h.

◆ USB_EP0_ATTRIBUTES

#define USB_EP0_ATTRIBUTES   0x00

Control endpoint attributes.

Definition at line 489 of file usb.h.

◆ USB_EP0_DEFAULT_MTU

#define USB_EP0_DEFAULT_MTU (   speed)
Value:
( ( (speed) >= USB_SPEED_SUPER ) ? 512 : \
( ( (speed) >= USB_SPEED_FULL ) ? 64 : 8 ) )
Super speed (5Gbps)
Definition: usb.h:54
Full speed (12Mbps)
Definition: usb.h:50

Calculate default MTU based on device speed.

Parameters
speedDevice speed
Return values
mtuDefault MTU

Definition at line 496 of file usb.h.

◆ USB_EP0_BURST

#define USB_EP0_BURST   0

Control endpoint maximum burst size.

Definition at line 501 of file usb.h.

◆ USB_EP0_INTERVAL

#define USB_EP0_INTERVAL   0

Control endpoint interval.

Definition at line 504 of file usb.h.

◆ USB_ENDPOINT_MAX

#define USB_ENDPOINT_MAX   0x0f

Maximum endpoint number.

Definition at line 507 of file usb.h.

◆ USB_ENDPOINT_IN

#define USB_ENDPOINT_IN   0x80

Endpoint direction is in.

Definition at line 510 of file usb.h.

◆ USB_ENDPOINT_IDX

#define USB_ENDPOINT_IDX (   address)
Value:
( ( (address) & USB_ENDPOINT_IN ) >> 3 ) )
uint64_t address
Base address.
Definition: ena.h:24
#define USB_ENDPOINT_MAX
Maximum endpoint number.
Definition: usb.h:507
#define USB_ENDPOINT_IN
Endpoint direction is in.
Definition: usb.h:510

Construct endpoint index from endpoint address.

Definition at line 513 of file usb.h.

◆ for_each_usb_bus

#define for_each_usb_bus (   bus)    list_for_each_entry ( (bus), &usb_buses, list )

Iterate over all USB buses.

Definition at line 1054 of file usb.h.

◆ USB_RESET_DELAY_MS

#define USB_RESET_DELAY_MS   50

Minimum reset time.

Section 7.1.7.5 of the USB2 specification states that root hub ports should assert reset signalling for at least 50ms.

Definition at line 1284 of file usb.h.

◆ USB_RESET_RECOVER_DELAY_MS

#define USB_RESET_RECOVER_DELAY_MS   10

Reset recovery time.

Section 9.2.6.2 of the USB2 specification states that the "recovery" interval after a port reset is 10ms.

Definition at line 1291 of file usb.h.

◆ USB_CONTROL_MAX_WAIT_MS

#define USB_CONTROL_MAX_WAIT_MS   5000

Maximum time to wait for a control transaction to complete.

Section 9.2.6.1 of the USB2 specification states that the upper limit for commands to be processed is 5 seconds.

Definition at line 1298 of file usb.h.

◆ USB_SET_ADDRESS_RECOVER_DELAY_MS

#define USB_SET_ADDRESS_RECOVER_DELAY_MS   2

Set address recovery time.

Section 9.2.6.3 of the USB2 specification states that devices are allowed a 2ms recovery interval after receiving a new address.

Definition at line 1305 of file usb.h.

◆ USB_PORT_DELAY_MS

#define USB_PORT_DELAY_MS   200

Time to wait for ports to stabilise.

Section 7.1.7.3 of the USB specification states that we must allow 100ms for devices to signal attachment, and an additional 100ms for connection debouncing. (This delay is parallelised across all ports on a hub; we do not delay separately for each port.)

Definition at line 1314 of file usb.h.

◆ USB_ANY_ID

#define USB_ANY_ID   0xffff

Match-anything ID.

Definition at line 1329 of file usb.h.

◆ USB_CLASS_ID

#define USB_CLASS_ID (   base,
  subclass,
  protocol 
)
Value:
{ \
.class = { \
.class = { \
( (base) & 0xff ), \
( (subclass) & 0xff ), \
( (protocol) & 0xff ), \
}, \
}, \
.mask = { \
.class = { \
( ( (base) == USB_ANY_ID ) ? 0x00 : 0xff ), \
( ( (subclass) == USB_ANY_ID ) ? 0x00 : 0xff ), \
( ( (protocol) == USB_ANY_ID ) ? 0x00 : 0xff ), \
}, \
}, \
}
uint16_t base
Base address.
Definition: edd.h:14
#define USB_ANY_ID
Match-anything ID.
Definition: usb.h:1329
uint16_t protocol
Protocol ID.
Definition: stp.h:18

Construct USB class ID.

Parameters
baseBase class code (or USB_ANY_ID)
subclassSubclass code (or USB_ANY_ID)
protocolProtocol code (or USB_ANY_ID)

Definition at line 1345 of file usb.h.

◆ USB_DRIVERS

#define USB_DRIVERS   __table ( struct usb_driver, "usb_drivers" )

USB driver table.

Definition at line 1394 of file usb.h.

◆ __usb_driver

struct usb_driver rf_rndis_driver __usb_driver   __table_entry ( USB_DRIVERS, 01 )

Declare a USB driver.

USB RF-RNDIS driver.

Definition at line 1397 of file usb.h.

Enumeration Type Documentation

◆ usb_protocol

USB protocols.

Enumerator
USB_PROTO_2_0 

USB 2.0.

USB_PROTO_3_0 

USB 3.0.

USB_PROTO_3_1 

USB 3.1.

Definition at line 20 of file usb.h.

20  {
21  /** USB 2.0 */
22  USB_PROTO_2_0 = 0x0200,
23  /** USB 3.0 */
24  USB_PROTO_3_0 = 0x0300,
25  /** USB 3.1 */
26  USB_PROTO_3_1 = 0x0301,
27 };
USB 2.0.
Definition: usb.h:22
USB 3.0.
Definition: usb.h:24
USB 3.1.
Definition: usb.h:26

◆ usb_speed

enum usb_speed

USB device speeds.

Enumerator
USB_SPEED_NONE 

Not connected.

USB_SPEED_LOW 

Low speed (1.5Mbps)

USB_SPEED_FULL 

Full speed (12Mbps)

USB_SPEED_HIGH 

High speed (480Mbps)

USB_SPEED_SUPER 

Super speed (5Gbps)

Definition at line 44 of file usb.h.

44  {
45  /** Not connected */
46  USB_SPEED_NONE = 0,
47  /** Low speed (1.5Mbps) */
48  USB_SPEED_LOW = USB_SPEED ( 1500, 1 ),
49  /** Full speed (12Mbps) */
50  USB_SPEED_FULL = USB_SPEED ( 12, 2 ),
51  /** High speed (480Mbps) */
52  USB_SPEED_HIGH = USB_SPEED ( 480, 2 ),
53  /** Super speed (5Gbps) */
54  USB_SPEED_SUPER = USB_SPEED ( 5, 3 ),
55 };
Low speed (1.5Mbps)
Definition: usb.h:48
Super speed (5Gbps)
Definition: usb.h:54
Not connected.
Definition: usb.h:46
#define USB_SPEED(mantissa, exponent)
Define a USB speed.
Definition: usb.h:35
High speed (480Mbps)
Definition: usb.h:52
Full speed (12Mbps)
Definition: usb.h:50

◆ usb_pid

enum usb_pid

USB packet IDs.

Enumerator
USB_PID_IN 

IN PID.

USB_PID_OUT 

OUT PID.

USB_PID_SETUP 

SETUP PID.

Definition at line 58 of file usb.h.

58  {
59  /** IN PID */
60  USB_PID_IN = 0x69,
61  /** OUT PID */
62  USB_PID_OUT = 0xe1,
63  /** SETUP PID */
64  USB_PID_SETUP = 0x2d,
65 };
OUT PID.
Definition: usb.h:62
SETUP PID.
Definition: usb.h:64
IN PID.
Definition: usb.h:60

◆ usb_driver_score

USB driver scores.

Enumerator
USB_SCORE_FALLBACK 

Fallback driver (has no effect on overall score)

USB_SCORE_DEPRECATED 

Deprecated driver.

USB_SCORE_NORMAL 

Normal driver.

Definition at line 1400 of file usb.h.

1400  {
1401  /** Fallback driver (has no effect on overall score) */
1402  USB_SCORE_FALLBACK = 0,
1403  /** Deprecated driver */
1405  /** Normal driver */
1406  USB_SCORE_NORMAL = 2,
1407 };
Deprecated driver.
Definition: usb.h:1404
Normal driver.
Definition: usb.h:1406
Fallback driver (has no effect on overall score)
Definition: usb.h:1402

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ usb_next_descriptor()

static struct usb_descriptor_header* usb_next_descriptor ( struct usb_descriptor_header desc)
inlinestatic

Get next USB descriptor.

Parameters
descUSB descriptor header
Return values
nextNext USB descriptor header

Definition at line 343 of file usb.h.

343  {
344 
345  return ( ( ( void * ) desc ) + desc->len );
346 }

Referenced by usb_endpoint_companion_descriptor(), and usb_is_within_config().

◆ usb_is_within_config()

static int usb_is_within_config ( struct usb_configuration_descriptor config,
struct usb_descriptor_header desc 
)
inlinestatic

Check that descriptor lies within a configuration descriptor.

Parameters
configConfiguration descriptor
descDescriptor header
is_withinDescriptor is within the configuration descriptor

Definition at line 356 of file usb.h.

357  {
358  struct usb_descriptor_header *end =
359  ( ( ( void * ) config ) + le16_to_cpu ( config->len ) );
360 
361  /* Check that descriptor starts within the configuration
362  * descriptor, and that the length does not exceed the
363  * configuration descriptor. This relies on the fact that
364  * usb_next_descriptor() needs to access only the first byte
365  * of the descriptor in order to determine the length.
366  */
367  return ( ( desc < end ) && ( usb_next_descriptor ( desc ) <= end ) );
368 }
static struct usb_descriptor_header * usb_next_descriptor(struct usb_descriptor_header *desc)
Get next USB descriptor.
Definition: usb.h:343
#define le16_to_cpu(value)
Definition: byteswap.h:112
A USB descriptor header.
Definition: usb.h:158
uint32_t end
Ending offset.
Definition: netvsc.h:18
uint16_t len
Total length.
Definition: usb.h:199

References end, le16_to_cpu, usb_configuration_descriptor::len, and usb_next_descriptor().

Referenced by usb_endpoint_companion_descriptor().

◆ usb_endpoint_init()

static void usb_endpoint_init ( struct usb_endpoint ep,
struct usb_device usb,
struct usb_endpoint_driver_operations driver 
)
inlinestatic

Initialise USB endpoint.

Parameters
epUSB endpoint
usbUSB device
driverDriver operations

Definition at line 525 of file usb.h.

526  {
527 
528  ep->usb = usb;
529  ep->driver = driver;
530 }
struct usb_device * usb
USB device.
Definition: usb.h:391
struct usb_endpoint_driver_operations * driver
Driver operations.
Definition: usb.h:416

References usb_endpoint::driver, and usb_endpoint::usb.

Referenced by alloc_usb(), efi_usb_open(), hub_probe(), usbhid_init(), and usbnet_init().

◆ usb_endpoint_describe()

static void usb_endpoint_describe ( struct usb_endpoint ep,
unsigned int  address,
unsigned int  attributes,
size_t  mtu,
unsigned int  burst,
unsigned int  interval 
)
inlinestatic

Describe USB endpoint.

Parameters
epUSB endpoint
addressEndpoint address
attributesAttributes
mtuMaximum packet size
burstMaximum burst size
intervalInterval (in microframes)

Definition at line 543 of file usb.h.

545  {
546 
547  ep->address = address;
548  ep->attributes = attributes;
549  ep->mtu = mtu;
550  ep->burst = burst;
551  ep->interval = interval;
552 }
uint64_t address
Base address.
Definition: ena.h:24
unsigned int burst
Maximum burst size.
Definition: usb.h:399
size_t mtu
Maximum transfer size.
Definition: usb.h:397
uint32_t mtu
Maximum MTU.
Definition: ena.h:28
unsigned int interval
Interval (in microframes)
Definition: usb.h:401
unsigned int attributes
Attributes.
Definition: usb.h:395
unsigned int address
Endpoint address.
Definition: usb.h:393

References address, usb_endpoint::address, usb_endpoint::attributes, usb_endpoint::burst, usb_endpoint::interval, mtu, and usb_endpoint::mtu.

Referenced by efi_usb_open(), register_usb(), and usb_endpoint_described().

◆ usb_endpoint_set_hostdata()

static void usb_endpoint_set_hostdata ( struct usb_endpoint ep,
void *  priv 
)
inlinestatic

Set USB endpoint host controller private data.

Parameters
epUSB endpoint
privHost controller private data

Definition at line 561 of file usb.h.

561  {
562  ep->priv = priv;
563 }
void * priv
Host controller private data.
Definition: usb.h:414
static struct tlan_private * priv
Definition: tlan.c:224

References priv, and usb_endpoint::priv.

Referenced by ehci_endpoint_open(), uhci_endpoint_open(), usbio_endpoint_open(), and xhci_endpoint_open().

◆ usb_endpoint_get_hostdata()

static void* usb_endpoint_get_hostdata ( struct usb_endpoint ep)
inlinestatic

Get USB endpoint host controller private data.

Parameters
epUSB endpoint
Return values
privHost controller private data

Definition at line 572 of file usb.h.

572  {
573  return ep->priv;
574 }
void * priv
Host controller private data.
Definition: usb.h:414

References usb_endpoint::priv.

Referenced by ehci_endpoint_close(), ehci_endpoint_message(), ehci_endpoint_reset(), ehci_endpoint_stream(), ehci_endpoint_update(), uhci_device_address(), uhci_endpoint_close(), uhci_endpoint_message(), uhci_endpoint_mtu(), uhci_endpoint_reset(), uhci_endpoint_stream(), usbio_endpoint_close(), usbio_endpoint_enqueue(), xhci_endpoint_close(), xhci_endpoint_message(), xhci_endpoint_mtu(), xhci_endpoint_reset(), and xhci_endpoint_stream().

◆ usb_endpoint_name()

const char* usb_endpoint_name ( struct usb_endpoint ep)

Get USB endpoint name (for debugging)

Parameters
epUSB endpoint
Return values
nameEndpoint name

Definition at line 220 of file usb.c.

220  {
221  static char buf[ 9 /* "EPxx OUT" + NUL */ ];
222  unsigned int address = ep->address;
223 
224  snprintf ( buf, sizeof ( buf ), "EP%d%s",
226  ( address ?
227  ( ( address & USB_ENDPOINT_IN ) ? " IN" : " OUT" ) : "" ));
228  return buf;
229 }
uint64_t address
Base address.
Definition: ena.h:24
#define USB_ENDPOINT_MAX
Maximum endpoint number.
Definition: usb.h:507
#define USB_ENDPOINT_IN
Endpoint direction is in.
Definition: usb.h:510
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382
unsigned int address
Endpoint address.
Definition: usb.h:393

References address, usb_endpoint::address, snprintf(), USB_ENDPOINT_IN, and USB_ENDPOINT_MAX.

Referenced by efi_usb_async_start(), efi_usb_close(), efi_usb_open(), efi_usb_sync_transfer(), ehci_endpoint_close(), ehci_endpoint_poll(), ehci_root_clear_tt(), uhci_endpoint_poll(), uhci_root_clear_tt(), usb_complete_err(), usb_endpoint_clear_tt(), usb_endpoint_mtu(), usb_endpoint_open(), usb_endpoint_reset(), usb_message(), usb_stream(), usbio_bulk_in_poll(), usbio_bulk_out_poll(), usbio_control_poll(), usbio_endpoint_open(), usbio_interface(), usbio_interrupt_callback(), usbio_interrupt_open(), usbkbd_probe(), and xhci_root_clear_tt().

◆ usb_endpoint_described()

int usb_endpoint_described ( struct usb_endpoint ep,
struct usb_configuration_descriptor config,
struct usb_interface_descriptor interface,
unsigned int  type,
unsigned int  index 
)

Describe USB endpoint from device configuration.

Parameters
epUSB endpoint
configConfiguration descriptor
interfaceInterface descriptor
typeEndpoint (internal) type
indexEndpoint index
Return values
rcReturn status code

Definition at line 241 of file usb.c.

244  {
245  struct usb_device *usb = ep->usb;
246  struct usb_endpoint_descriptor *desc;
247  struct usb_endpoint_companion_descriptor *descx;
248  unsigned int sizes;
249  unsigned int burst;
250  unsigned int interval;
251  size_t mtu;
252 
253  /* Locate endpoint descriptor */
254  desc = usb_endpoint_descriptor ( config, interface, type, index );
255  if ( ! desc )
256  return -ENOENT;
257 
258  /* Locate companion descriptor, if any */
259  descx = usb_endpoint_companion_descriptor ( config, desc );
260 
261  /* Calculate MTU and burst size */
262  sizes = le16_to_cpu ( desc->sizes );
263  mtu = USB_ENDPOINT_MTU ( sizes );
264  burst = ( descx ? descx->burst : USB_ENDPOINT_BURST ( sizes ) );
265 
266  /* Calculate interval */
267  if ( ( type & USB_ENDPOINT_ATTR_TYPE_MASK ) ==
269  if ( usb->speed >= USB_SPEED_HIGH ) {
270  /* 2^(desc->interval-1) is a microframe count */
271  interval = ( 1 << ( desc->interval - 1 ) );
272  } else {
273  /* desc->interval is a (whole) frame count */
274  interval = ( desc->interval << 3 );
275  }
276  } else {
277  /* desc->interval is a microframe count */
278  interval = desc->interval;
279  }
280 
281  /* Describe endpoint */
282  usb_endpoint_describe ( ep, desc->endpoint, desc->attributes,
283  mtu, burst, interval );
284  return 0;
285 }
static void usb_endpoint_describe(struct usb_endpoint *ep, unsigned int address, unsigned int attributes, size_t mtu, unsigned int burst, unsigned int interval)
Describe USB endpoint.
Definition: usb.h:543
uint8_t interval
Polling interval.
Definition: usb.h:259
#define USB_ENDPOINT_ATTR_TYPE_MASK
Endpoint attribute transfer type mask.
Definition: usb.h:266
uint8_t type
Type.
Definition: ena.h:16
#define ENOENT
No such file or directory.
Definition: errno.h:514
uint8_t endpoint
Endpoint address.
Definition: usb.h:253
unsigned int speed
Device speed.
Definition: usb.h:712
An object interface.
Definition: interface.h:109
#define USB_ENDPOINT_BURST(sizes)
USB endpoint maximum burst size.
Definition: usb.h:296
A USB device.
Definition: usb.h:706
#define USB_ENDPOINT_ATTR_INTERRUPT
Interrupt endpoint transfer type.
Definition: usb.h:278
uint8_t attributes
Attributes.
Definition: usb.h:255
#define le16_to_cpu(value)
Definition: byteswap.h:112
struct usb_endpoint_companion_descriptor * usb_endpoint_companion_descriptor(struct usb_configuration_descriptor *config, struct usb_endpoint_descriptor *desc)
Locate USB endpoint companion descriptor.
Definition: usb.c:194
struct usb_endpoint_descriptor * usb_endpoint_descriptor(struct usb_configuration_descriptor *config, struct usb_interface_descriptor *interface, unsigned int type, unsigned int index)
Locate USB endpoint descriptor.
Definition: usb.c:167
A USB endpoint descriptor.
Definition: usb.h:249
uint32_t mtu
Maximum MTU.
Definition: ena.h:28
A USB endpoint companion descriptor.
Definition: usb.h:299
High speed (480Mbps)
Definition: usb.h:52
struct usb_endpoint * ep[32]
Endpoint list.
Definition: usb.h:728
struct usb_device * usb
USB device.
Definition: usb.h:391
#define USB_ENDPOINT_MTU(sizes)
USB endpoint MTU.
Definition: usb.h:293
uint16_t sizes
Maximum packet size and burst size.
Definition: usb.h:257
uint64_t index
Index of the first segment within the content.
Definition: pccrc.h:21
uint8_t burst
Maximum burst size.
Definition: usb.h:303

References usb_endpoint_descriptor::attributes, usb_endpoint_companion_descriptor::burst, usb_endpoint_descriptor::endpoint, ENOENT, usb_device::ep, index, usb_endpoint_descriptor::interval, le16_to_cpu, mtu, usb_endpoint_descriptor::sizes, usb_device::speed, type, usb_endpoint::usb, USB_ENDPOINT_ATTR_INTERRUPT, USB_ENDPOINT_ATTR_TYPE_MASK, USB_ENDPOINT_BURST, usb_endpoint_companion_descriptor(), usb_endpoint_describe(), usb_endpoint_descriptor(), USB_ENDPOINT_MTU, and USB_SPEED_HIGH.

Referenced by hub_probe(), usbhid_describe(), usbnet_comms_describe(), and usbnet_data_describe().

◆ usb_endpoint_open()

int usb_endpoint_open ( struct usb_endpoint ep)

Open USB endpoint.

Parameters
epUSB endpoint
Return values
rcReturn status code

Definition at line 293 of file usb.c.

293  {
294  struct usb_device *usb = ep->usb;
295  unsigned int idx = USB_ENDPOINT_IDX ( ep->address );
296  int rc;
297 
298  /* Populate host controller operations */
299  ep->host = &usb->port->hub->bus->op->endpoint;
300 
301  /* Add to endpoint list */
302  if ( usb->ep[idx] != NULL ) {
303  DBGC ( usb, "USB %s %s is already open\n",
304  usb->name, usb_endpoint_name ( ep ) );
305  rc = -EALREADY;
306  goto err_already;
307  }
308  usb->ep[idx] = ep;
309  INIT_LIST_HEAD ( &ep->halted );
310 
311  /* Open endpoint */
312  if ( ( rc = ep->host->open ( ep ) ) != 0 ) {
313  DBGC ( usb, "USB %s %s could not open: %s\n", usb->name,
314  usb_endpoint_name ( ep ), strerror ( rc ) );
315  goto err_open;
316  }
317  ep->open = 1;
318 
319  DBGC2 ( usb, "USB %s %s opened with MTU %zd, burst %d, interval %d\n",
320  usb->name, usb_endpoint_name ( ep ), ep->mtu, ep->burst,
321  ep->interval );
322  return 0;
323 
324  ep->open = 0;
325  ep->host->close ( ep );
326  err_open:
327  usb->ep[idx] = NULL;
328  err_already:
329  if ( ep->max )
330  usb_flush ( ep );
331  return rc;
332 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void(* close)(struct usb_endpoint *ep)
Close endpoint.
Definition: usb.h:440
#define DBGC(...)
Definition: compiler.h:505
int open
Endpoint is open.
Definition: usb.h:404
struct usb_port * port
USB port.
Definition: usb.h:710
struct list_head halted
List of halted endpoints.
Definition: usb.h:409
unsigned int burst
Maximum burst size.
Definition: usb.h:399
char name[32]
Name.
Definition: usb.h:708
A USB device.
Definition: usb.h:706
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define USB_ENDPOINT_IDX(address)
Construct endpoint index from endpoint address.
Definition: usb.h:513
#define EALREADY
Connection already in progress.
Definition: errno.h:323
const char * usb_endpoint_name(struct usb_endpoint *ep)
Get USB endpoint name (for debugging)
Definition: usb.c:220
size_t mtu
Maximum transfer size.
Definition: usb.h:397
struct usb_host_operations * op
Host controller operations set.
Definition: usb.h:955
unsigned int max
Maximum fill level.
Definition: usb.h:425
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
#define DBGC2(...)
Definition: compiler.h:522
struct usb_hub * hub
USB hub.
Definition: usb.h:798
struct usb_endpoint * ep[32]
Endpoint list.
Definition: usb.h:728
unsigned int interval
Interval (in microframes)
Definition: usb.h:401
struct usb_endpoint_host_operations endpoint
Endpoint operations.
Definition: usb.h:1010
struct usb_device * usb
USB device.
Definition: usb.h:391
int(* open)(struct usb_endpoint *ep)
Open endpoint.
Definition: usb.h:435
void usb_flush(struct usb_endpoint *ep)
Discard endpoint recycled buffer list.
Definition: usb.c:689
struct usb_endpoint_host_operations * host
Host controller operations.
Definition: usb.h:412
struct usb_bus * bus
USB bus.
Definition: usb.h:828
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
unsigned int address
Endpoint address.
Definition: usb.h:393

References usb_endpoint::address, usb_endpoint::burst, usb_hub::bus, usb_endpoint_host_operations::close, DBGC, DBGC2, EALREADY, usb_host_operations::endpoint, usb_device::ep, usb_endpoint::halted, usb_endpoint::host, usb_port::hub, INIT_LIST_HEAD, usb_endpoint::interval, usb_endpoint::max, usb_endpoint::mtu, usb_device::name, NULL, usb_bus::op, usb_endpoint::open, usb_endpoint_host_operations::open, usb_device::port, rc, strerror(), usb_endpoint::usb, USB_ENDPOINT_IDX, usb_endpoint_name(), and usb_flush().

Referenced by efi_usb_open(), hub_open(), register_usb(), usbhid_open(), and usbnet_open().

◆ usb_endpoint_close()

void usb_endpoint_close ( struct usb_endpoint ep)

Close USB endpoint.

Parameters
epUSB endpoint

Definition at line 370 of file usb.c.

370  {
371  struct usb_device *usb = ep->usb;
372  unsigned int idx = USB_ENDPOINT_IDX ( ep->address );
373 
374  /* Sanity checks */
375  assert ( usb->ep[idx] == ep );
376 
377  /* Close endpoint */
378  ep->open = 0;
379  ep->host->close ( ep );
380  assert ( ep->fill == 0 );
381 
382  /* Remove from endpoint list */
383  usb->ep[idx] = NULL;
384  list_del ( &ep->halted );
385 
386  /* Discard any recycled buffers, if applicable */
387  if ( ep->max )
388  usb_flush ( ep );
389 
390  /* Clear transaction translator, if applicable */
392 }
void(* close)(struct usb_endpoint *ep)
Close endpoint.
Definition: usb.h:440
int open
Endpoint is open.
Definition: usb.h:404
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
struct list_head halted
List of halted endpoints.
Definition: usb.h:409
A USB device.
Definition: usb.h:706
unsigned int fill
Buffer fill level.
Definition: usb.h:406
#define USB_ENDPOINT_IDX(address)
Construct endpoint index from endpoint address.
Definition: usb.h:513
static int usb_endpoint_clear_tt(struct usb_endpoint *ep)
Clear transaction translator (if applicable)
Definition: usb.c:340
unsigned int max
Maximum fill level.
Definition: usb.h:425
struct usb_endpoint * ep[32]
Endpoint list.
Definition: usb.h:728
struct usb_device * usb
USB device.
Definition: usb.h:391
void usb_flush(struct usb_endpoint *ep)
Discard endpoint recycled buffer list.
Definition: usb.c:689
struct usb_endpoint_host_operations * host
Host controller operations.
Definition: usb.h:412
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
unsigned int address
Endpoint address.
Definition: usb.h:393

References usb_endpoint::address, assert(), usb_endpoint_host_operations::close, usb_device::ep, usb_endpoint::fill, usb_endpoint::halted, usb_endpoint::host, list_del, usb_endpoint::max, NULL, usb_endpoint::open, usb_endpoint::usb, usb_endpoint_clear_tt(), USB_ENDPOINT_IDX, and usb_flush().

Referenced by efi_usb_close(), efi_usb_open(), hub_close(), hub_open(), register_usb(), unregister_usb(), usbhid_close(), usbhid_open(), usbnet_close(), and usbnet_open().

◆ usb_message()

int usb_message ( struct usb_endpoint ep,
unsigned int  request,
unsigned int  value,
unsigned int  index,
struct io_buffer iobuf 
)

Enqueue USB message transfer.

Parameters
epUSB endpoint
requestRequest
valueValue parameter
indexIndex parameter
iobufI/O buffer
Return values
rcReturn status code

The I/O buffer must have sufficient headroom to contain a setup packet.

Definition at line 474 of file usb.c.

476  {
477  struct usb_device *usb = ep->usb;
478  struct usb_port *port = usb->port;
479  struct usb_setup_packet *packet;
480  size_t len = iob_len ( iobuf );
481  int rc;
482 
483  /* Sanity check */
484  assert ( iob_headroom ( iobuf ) >= sizeof ( *packet ) );
485 
486  /* Fail immediately if device has been unplugged */
487  if ( port->disconnected )
488  return -ENODEV;
489 
490  /* Reset endpoint if required */
491  if ( ( ! list_empty ( &ep->halted ) ) &&
492  ( ( rc = usb_endpoint_reset ( ep ) ) != 0 ) )
493  return rc;
494 
495  /* Zero input data buffer (if applicable) */
496  if ( request & USB_DIR_IN )
497  memset ( iobuf->data, 0, len );
498 
499  /* Construct setup packet */
500  packet = iob_push ( iobuf, sizeof ( *packet ) );
501  packet->request = cpu_to_le16 ( request );
502  packet->value = cpu_to_le16 ( value );
503  packet->index = cpu_to_le16 ( index );
504  packet->len = cpu_to_le16 ( len );
505 
506  /* Enqueue message transfer */
507  if ( ( rc = ep->host->message ( ep, iobuf ) ) != 0 ) {
508  DBGC ( usb, "USB %s %s could not enqueue message transfer: "
509  "%s\n", usb->name, usb_endpoint_name ( ep ),
510  strerror ( rc ) );
511  return rc;
512  }
513 
514  /* Increment fill level */
515  ep->fill++;
516 
517  return 0;
518 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_push(iobuf, len)
Definition: iobuf.h:80
#define DBGC(...)
Definition: compiler.h:505
struct usb_device * usb
Currently attached device (if in use)
Definition: usb.h:818
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:136
A USB port.
Definition: usb.h:796
u8 port
Port number.
Definition: CIB_PRM.h:31
struct usb_port * port
USB port.
Definition: usb.h:710
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
uint16_t index
Index parameter.
Definition: usb.h:74
struct list_head halted
List of halted endpoints.
Definition: usb.h:409
#define USB_DIR_IN
Data transfer is from device to host.
Definition: usb.h:83
char name[32]
Name.
Definition: usb.h:708
A USB device.
Definition: usb.h:706
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:151
#define ENODEV
No such device.
Definition: errno.h:509
static int usb_endpoint_reset(struct usb_endpoint *ep)
Reset USB endpoint.
Definition: usb.c:400
unsigned int fill
Buffer fill level.
Definition: usb.h:406
A USB setup data packet.
Definition: usb.h:68
const char * usb_endpoint_name(struct usb_endpoint *ep)
Get USB endpoint name (for debugging)
Definition: usb.c:220
uint16_t request
Request.
Definition: usb.h:70
static size_t iob_headroom(struct io_buffer *iobuf)
Calculate available space at start of an I/O buffer.
Definition: iobuf.h:161
uint32_t len
Length.
Definition: ena.h:14
void * data
Start of data.
Definition: iobuf.h:44
struct usb_endpoint * ep[32]
Endpoint list.
Definition: usb.h:728
u8 request[0]
List of IEs requested.
Definition: ieee80211.h:16
#define cpu_to_le16(value)
Definition: byteswap.h:106
uint16_t len
Length of data stage.
Definition: usb.h:76
struct usb_device * usb
USB device.
Definition: usb.h:391
int(* message)(struct usb_endpoint *ep, struct io_buffer *iobuf)
Enqueue message transfer.
Definition: usb.h:460
struct usb_endpoint_host_operations * host
Host controller operations.
Definition: usb.h:412
uint16_t value
Value parameter.
Definition: usb.h:72
uint64_t index
Index of the first segment within the content.
Definition: pccrc.h:21
void * memset(void *dest, int character, size_t len) __nonnull

References assert(), cpu_to_le16, io_buffer::data, DBGC, ENODEV, usb_device::ep, usb_endpoint::fill, usb_endpoint::halted, usb_endpoint::host, index, usb_setup_packet::index, iob_headroom(), iob_len(), iob_push, len, usb_setup_packet::len, list_empty, memset(), usb_endpoint_host_operations::message, usb_device::name, port, usb_device::port, rc, request, usb_setup_packet::request, strerror(), usb_endpoint::usb, usb_port::usb, USB_DIR_IN, usb_endpoint_name(), usb_endpoint_reset(), value, and usb_setup_packet::value.

Referenced by usb_control().

◆ usb_stream()

int usb_stream ( struct usb_endpoint ep,
struct io_buffer iobuf,
int  terminate 
)

Enqueue USB stream transfer.

Parameters
epUSB endpoint
iobufI/O buffer
terminateTerminate using a short packet
Return values
rcReturn status code

Definition at line 528 of file usb.c.

529  {
530  struct usb_device *usb = ep->usb;
531  struct usb_port *port = usb->port;
532  int zlp;
533  int rc;
534 
535  /* Fail immediately if device has been unplugged */
536  if ( port->disconnected )
537  return -ENODEV;
538 
539  /* Reset endpoint if required */
540  if ( ( ! list_empty ( &ep->halted ) ) &&
541  ( ( rc = usb_endpoint_reset ( ep ) ) != 0 ) )
542  return rc;
543 
544  /* Append a zero-length packet if necessary */
545  zlp = terminate;
546  if ( iob_len ( iobuf ) & ( ep->mtu - 1 ) )
547  zlp = 0;
548 
549  /* Enqueue stream transfer */
550  if ( ( rc = ep->host->stream ( ep, iobuf, zlp ) ) != 0 ) {
551  DBGC ( usb, "USB %s %s could not enqueue stream transfer: %s\n",
552  usb->name, usb_endpoint_name ( ep ), strerror ( rc ) );
553  return rc;
554  }
555 
556  /* Increment fill level */
557  ep->fill++;
558 
559  return 0;
560 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
struct usb_device * usb
Currently attached device (if in use)
Definition: usb.h:818
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:136
A USB port.
Definition: usb.h:796
u8 port
Port number.
Definition: CIB_PRM.h:31
struct usb_port * port
USB port.
Definition: usb.h:710
struct list_head halted
List of halted endpoints.
Definition: usb.h:409
char name[32]
Name.
Definition: usb.h:708
A USB device.
Definition: usb.h:706
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:151
#define ENODEV
No such device.
Definition: errno.h:509
static int usb_endpoint_reset(struct usb_endpoint *ep)
Reset USB endpoint.
Definition: usb.c:400
unsigned int fill
Buffer fill level.
Definition: usb.h:406
const char * usb_endpoint_name(struct usb_endpoint *ep)
Get USB endpoint name (for debugging)
Definition: usb.c:220
size_t mtu
Maximum transfer size.
Definition: usb.h:397
struct usb_endpoint * ep[32]
Endpoint list.
Definition: usb.h:728
struct usb_device * usb
USB device.
Definition: usb.h:391
struct usb_endpoint_host_operations * host
Host controller operations.
Definition: usb.h:412
int(* stream)(struct usb_endpoint *ep, struct io_buffer *iobuf, int zlp)
Enqueue stream transfer.
Definition: usb.h:469

References DBGC, ENODEV, usb_device::ep, usb_endpoint::fill, usb_endpoint::halted, usb_endpoint::host, iob_len(), list_empty, usb_endpoint::mtu, usb_device::name, port, usb_device::port, rc, usb_endpoint_host_operations::stream, strerror(), usb_endpoint::usb, usb_port::usb, usb_endpoint_name(), and usb_endpoint_reset().

Referenced by acm_out_transmit(), axge_out_transmit(), dm96xx_out_transmit(), ecm_out_transmit(), efi_usb_sync_transfer(), ncm_out_transmit(), smsc75xx_out_transmit(), smsc95xx_out_transmit(), and usb_refill().

◆ usb_complete_err()

void usb_complete_err ( struct usb_endpoint ep,
struct io_buffer iobuf,
int  rc 
)

Complete transfer (possibly with error)

Parameters
epUSB endpoint
iobufI/O buffer
rcCompletion status code

Definition at line 569 of file usb.c.

570  {
571  struct usb_device *usb = ep->usb;
572 
573  /* Decrement fill level */
574  assert ( ep->fill > 0 );
575  ep->fill--;
576 
577  /* Schedule reset, if applicable */
578  if ( ( rc != 0 ) && ep->open ) {
579  DBGC ( usb, "USB %s %s completion failed: %s\n",
580  usb->name, usb_endpoint_name ( ep ), strerror ( rc ) );
581  list_del ( &ep->halted );
583  }
584 
585  /* Report completion */
586  ep->driver->complete ( ep, iobuf, rc );
587 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void(* complete)(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete transfer.
Definition: usb.h:481
#define DBGC(...)
Definition: compiler.h:505
int open
Endpoint is open.
Definition: usb.h:404
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
struct list_head halted
List of halted endpoints.
Definition: usb.h:409
char name[32]
Name.
Definition: usb.h:708
A USB device.
Definition: usb.h:706
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
unsigned int fill
Buffer fill level.
Definition: usb.h:406
const char * usb_endpoint_name(struct usb_endpoint *ep)
Get USB endpoint name (for debugging)
Definition: usb.c:220
static struct list_head usb_halted
List of halted endpoints.
Definition: usb.c:50
struct usb_endpoint * ep[32]
Endpoint list.
Definition: usb.h:728
struct usb_device * usb
USB device.
Definition: usb.h:391
struct usb_endpoint_driver_operations * driver
Driver operations.
Definition: usb.h:416

References assert(), usb_endpoint_driver_operations::complete, DBGC, usb_endpoint::driver, usb_device::ep, usb_endpoint::fill, usb_endpoint::halted, list_add_tail, list_del, usb_device::name, usb_endpoint::open, rc, strerror(), usb_endpoint::usb, usb_endpoint_name(), and usb_halted.

Referenced by ehci_endpoint_close(), ehci_endpoint_poll(), uhci_endpoint_close(), uhci_endpoint_poll(), usb_complete(), usbio_bulk_in_poll(), usbio_bulk_out_poll(), usbio_control_poll(), usbio_endpoint_close(), xhci_endpoint_close(), and xhci_transfer().

◆ usb_refill_init()

static void usb_refill_init ( struct usb_endpoint ep,
size_t  reserve,
size_t  len,
unsigned int  max 
)
inlinestatic

Initialise USB endpoint refill.

Parameters
epUSB endpoint
reserveRefill buffer reserved header length
lenRefill buffer payload length (zero for endpoint's MTU)
maxMaximum fill level

Definition at line 601 of file usb.h.

602  {
603 
604  INIT_LIST_HEAD ( &ep->recycled );
605  ep->reserve = reserve;
606  ep->len = len;
607  ep->max = max;
608 }
#define max(x, y)
Definition: ath.h:39
struct list_head recycled
Recycled I/O buffer list.
Definition: usb.h:419
size_t len
Refill buffer payload length.
Definition: usb.h:423
size_t reserve
Refill buffer reserved header length.
Definition: usb.h:421
unsigned int max
Maximum fill level.
Definition: usb.h:425
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
uint32_t len
Length.
Definition: ena.h:14
struct usb_endpoint * ep[32]
Endpoint list.
Definition: usb.h:728

References INIT_LIST_HEAD, len, usb_endpoint::len, max, usb_endpoint::max, usb_endpoint::recycled, and usb_endpoint::reserve.

Referenced by acm_probe(), axge_probe(), dm96xx_probe(), ecm_probe(), efi_usb_async_start(), hub_probe(), lan78xx_probe(), ncm_in_prefill(), ncm_probe(), smsc75xx_probe(), smsc95xx_probe(), and usbkbd_probe().

◆ usb_recycle()

static void usb_recycle ( struct usb_endpoint ep,
struct io_buffer iobuf 
)
inlinestatic

Recycle I/O buffer.

Parameters
epUSB endpoint
iobufI/O buffer

Definition at line 617 of file usb.h.

617  {
618 
619  list_add_tail ( &iobuf->list, &ep->recycled );
620 }
struct list_head recycled
Recycled I/O buffer list.
Definition: usb.h:419
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:39
struct usb_endpoint * ep[32]
Endpoint list.
Definition: usb.h:728

References io_buffer::list, list_add_tail, and usb_endpoint::recycled.

Referenced by efi_usb_async_complete(), hub_complete(), ncm_in_complete(), and usbkbd_complete().

◆ usb_prefill()

int usb_prefill ( struct usb_endpoint ep)

Prefill endpoint recycled buffer list.

Parameters
epUSB endpoint
Return values
rcReturn status code

Definition at line 602 of file usb.c.

602  {
603  struct io_buffer *iobuf;
604  size_t reserve = ep->reserve;
605  size_t len = ( ep->len ? ep->len : ep->mtu );
606  unsigned int fill;
607  int rc;
608 
609  /* Sanity checks */
610  assert ( ep->fill == 0 );
611  assert ( ep->max > 0 );
612  assert ( list_empty ( &ep->recycled ) );
613 
614  /* Fill recycled buffer list */
615  for ( fill = 0 ; fill < ep->max ; fill++ ) {
616 
617  /* Allocate I/O buffer */
618  iobuf = alloc_iob ( reserve + len );
619  if ( ! iobuf ) {
620  rc = -ENOMEM;
621  goto err_alloc;
622  }
623  iob_reserve ( iobuf, reserve );
624 
625  /* Add to recycled buffer list */
626  list_add_tail ( &iobuf->list, &ep->recycled );
627  }
628 
629  return 0;
630 
631  err_alloc:
632  usb_flush ( ep );
633  return rc;
634 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct list_head recycled
Recycled I/O buffer list.
Definition: usb.h:419
size_t len
Refill buffer payload length.
Definition: usb.h:423
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:128
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:136
#define ENOMEM
Not enough space.
Definition: errno.h:534
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
size_t reserve
Refill buffer reserved header length.
Definition: usb.h:421
unsigned int fill
Buffer fill level.
Definition: usb.h:406
size_t mtu
Maximum transfer size.
Definition: usb.h:397
#define iob_reserve(iobuf, len)
Definition: iobuf.h:63
unsigned int max
Maximum fill level.
Definition: usb.h:425
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:39
uint32_t len
Length.
Definition: ena.h:14
uint8_t fill
Length pair.
Definition: deflate.h:12
void usb_flush(struct usb_endpoint *ep)
Discard endpoint recycled buffer list.
Definition: usb.c:689
A persistent I/O buffer.
Definition: iobuf.h:32

References alloc_iob(), assert(), ENOMEM, fill, usb_endpoint::fill, iob_reserve, len, usb_endpoint::len, io_buffer::list, list_add_tail, list_empty, usb_endpoint::max, usb_endpoint::mtu, rc, usb_endpoint::recycled, usb_endpoint::reserve, and usb_flush().

Referenced by efi_usb_async_start(), and ncm_in_prefill().

◆ usb_refill()

int usb_refill ( struct usb_endpoint ep)

Refill endpoint.

Parameters
epUSB endpoint
Return values
rcReturn status code

Definition at line 642 of file usb.c.

642  {
643  struct io_buffer *iobuf;
644  size_t reserve = ep->reserve;
645  size_t len = ( ep->len ? ep->len : ep->mtu );
646  int rc;
647 
648  /* Sanity checks */
649  assert ( ep->open );
650  assert ( ep->max > 0 );
651 
652  /* Refill endpoint */
653  while ( ep->fill < ep->max ) {
654 
655  /* Get or allocate buffer */
656  if ( list_empty ( &ep->recycled ) ) {
657  /* Recycled buffer list is empty; allocate new buffer */
658  iobuf = alloc_iob ( reserve + len );
659  if ( ! iobuf )
660  return -ENOMEM;
661  iob_reserve ( iobuf, reserve );
662  } else {
663  /* Get buffer from recycled buffer list */
664  iobuf = list_first_entry ( &ep->recycled,
665  struct io_buffer, list );
666  assert ( iobuf != NULL );
667  list_del ( &iobuf->list );
668  }
669 
670  /* Reset buffer to maximum size */
671  assert ( iob_len ( iobuf ) <= len );
672  iob_put ( iobuf, ( len - iob_len ( iobuf ) ) );
673 
674  /* Enqueue buffer */
675  if ( ( rc = usb_stream ( ep, iobuf, 0 ) ) != 0 ) {
676  list_add ( &iobuf->list, &ep->recycled );
677  return rc;
678  }
679  }
680 
681  return 0;
682 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_put(iobuf, len)
Definition: iobuf.h:116
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:69
struct list_head recycled
Recycled I/O buffer list.
Definition: usb.h:419
size_t len
Refill buffer payload length.
Definition: usb.h:423
int usb_stream(struct usb_endpoint *ep, struct io_buffer *iobuf, int terminate)
Enqueue USB stream transfer.
Definition: usb.c:528
int open
Endpoint is open.
Definition: usb.h:404
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:128
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:136
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition: list.h:333
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
#define ENOMEM
Not enough space.
Definition: errno.h:534
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
size_t reserve
Refill buffer reserved header length.
Definition: usb.h:421
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:151
unsigned int fill
Buffer fill level.
Definition: usb.h:406
size_t mtu
Maximum transfer size.
Definition: usb.h:397
#define iob_reserve(iobuf, len)
Definition: iobuf.h:63
unsigned int max
Maximum fill level.
Definition: usb.h:425
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:39
uint32_t len
Length.
Definition: ena.h:14
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
A persistent I/O buffer.
Definition: iobuf.h:32

References alloc_iob(), assert(), ENOMEM, usb_endpoint::fill, iob_len(), iob_put, iob_reserve, len, usb_endpoint::len, io_buffer::list, list_add, list_del, list_empty, list_first_entry, usb_endpoint::max, usb_endpoint::mtu, NULL, usb_endpoint::open, rc, usb_endpoint::recycled, usb_endpoint::reserve, and usb_stream().

Referenced by efi_usb_timer(), hub_refill(), usbhid_open(), usbhid_refill(), usbkbd_iskey(), usbnet_open(), and usbnet_refill().

◆ usb_flush()

void usb_flush ( struct usb_endpoint ep)

Discard endpoint recycled buffer list.

Parameters
epUSB endpoint

Definition at line 689 of file usb.c.

689  {
690  struct io_buffer *iobuf;
691  struct io_buffer *tmp;
692 
693  /* Sanity checks */
694  assert ( ! ep->open );
695  assert ( ep->max > 0 );
696 
697  /* Free all I/O buffers */
698  list_for_each_entry_safe ( iobuf, tmp, &ep->recycled, list ) {
699  list_del ( &iobuf->list );
700  free_iob ( iobuf );
701  }
702 }
struct list_head recycled
Recycled I/O buffer list.
Definition: usb.h:419
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:145
int open
Endpoint is open.
Definition: usb.h:404
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
Definition: list.h:447
uint8_t * tmp
Definition: entropy.h:156
unsigned int max
Maximum fill level.
Definition: usb.h:425
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:39
A persistent I/O buffer.
Definition: iobuf.h:32

References assert(), free_iob(), io_buffer::list, list_del, list_for_each_entry_safe, usb_endpoint::max, usb_endpoint::open, usb_endpoint::recycled, and tmp.

Referenced by ncm_open(), usb_endpoint_close(), usb_endpoint_open(), and usb_prefill().

◆ usb_func_set_drvdata()

static void usb_func_set_drvdata ( struct usb_function func,
void *  priv 
)
inlinestatic

Set USB function driver private data.

Parameters
funcUSB function
privDriver private data

Definition at line 690 of file usb.h.

690  {
691  func->priv = priv;
692 }
void * priv
Driver private data.
Definition: usb.h:672
static struct tlan_private * priv
Definition: tlan.c:224

References priv, and usb_function::priv.

Referenced by acm_probe(), axge_probe(), dm96xx_probe(), ecm_probe(), efi_usb_probe(), hub_probe(), lan78xx_probe(), ncm_probe(), smsc75xx_probe(), smsc95xx_probe(), and usbkbd_probe().

◆ usb_func_get_drvdata()

static void* usb_func_get_drvdata ( struct usb_function func)
inlinestatic

Get USB function driver private data.

Parameters
functionUSB function
Return values
privDriver private data

Definition at line 701 of file usb.h.

701  {
702  return func->priv;
703 }
void * priv
Driver private data.
Definition: usb.h:672

References usb_function::priv.

Referenced by acm_remove(), axge_remove(), dm96xx_remove(), ecm_remove(), efi_usb_remove(), hub_remove(), lan78xx_remove(), ncm_remove(), smsc75xx_remove(), smsc95xx_remove(), and usbkbd_remove().

◆ usb_set_hostdata()

static void usb_set_hostdata ( struct usb_device usb,
void *  priv 
)
inlinestatic

Set USB device host controller private data.

Parameters
usbUSB device
privHost controller private data

Definition at line 767 of file usb.h.

767  {
768  usb->priv = priv;
769 }
void * priv
Host controller private data.
Definition: usb.h:725
static struct tlan_private * priv
Definition: tlan.c:224

References priv, and usb_device::priv.

Referenced by ehci_device_open(), uhci_device_open(), usbio_device_open(), and xhci_device_open().

◆ usb_get_hostdata()

static void* usb_get_hostdata ( struct usb_device usb)
inlinestatic

Get USB device host controller private data.

Parameters
usbUSB device
Return values
privHost controller private data

Definition at line 778 of file usb.h.

778  {
779  return usb->priv;
780 }
void * priv
Host controller private data.
Definition: usb.h:725

References usb_device::priv.

Referenced by ehci_device_address(), ehci_device_close(), ehci_endpoint_open(), uhci_device_address(), uhci_device_close(), uhci_endpoint_open(), xhci_device_address(), xhci_device_close(), xhci_device_open(), xhci_endpoint_open(), and xhci_hub_open().

◆ usb_endpoint()

static struct usb_endpoint* usb_endpoint ( struct usb_device usb,
unsigned int  address 
)
inlinestatic

Get USB endpoint.

Parameters
usbUSB device
addressEndpoint address
Return values
epUSB endpoint, or NULL if not opened

Definition at line 789 of file usb.h.

790  {
791 
792  return usb->ep[ USB_ENDPOINT_IDX ( address ) ];
793 }
uint64_t address
Base address.
Definition: ena.h:24
#define USB_ENDPOINT_IDX(address)
Construct endpoint index from endpoint address.
Definition: usb.h:513
struct usb_endpoint * ep[32]
Endpoint list.
Definition: usb.h:728

References address, usb_device::ep, usb_endpoint::usb, and USB_ENDPOINT_IDX.

Referenced by ehci_device_address(), and uhci_device_address().

◆ usb_hub_set_drvdata()

static void usb_hub_set_drvdata ( struct usb_hub hub,
void *  priv 
)
inlinestatic

Set USB hub driver private data.

Parameters
hubUSB hub
privDriver private data

Definition at line 920 of file usb.h.

920  {
921  hub->priv = priv;
922 }
void * priv
Driver private data.
Definition: usb.h:844
static struct tlan_private * priv
Definition: tlan.c:224

References priv, and usb_hub::priv.

Referenced by ehci_probe(), hub_probe(), uhci_probe(), usbio_start(), and xhci_probe().

◆ usb_hub_get_drvdata()

static void* usb_hub_get_drvdata ( struct usb_hub hub)
inlinestatic

◆ usb_port()

static struct usb_port* usb_port ( struct usb_hub hub,
unsigned int  address 
)
inlinestatic

Get USB port.

Parameters
hubUSB hub
addressPort address
Return values
portUSB port

Definition at line 943 of file usb.h.

943  {
944 
945  return &hub->port[ address - 1 ];
946 }
uint64_t address
Base address.
Definition: ena.h:24
struct usb_port port[0]
Port list.
Definition: usb.h:850

References address, usb_port::hub, and usb_hub::port.

Referenced by alloc_usb_hub(), ehci_probe(), free_usb_hub(), hub_remove(), register_usb_hub(), uhci_probe(), unregister_usb_hub(), usbio_start(), xhci_port_status(), xhci_probe(), and xhci_root_open().

◆ usb_bus_set_hostdata()

static void usb_bus_set_hostdata ( struct usb_bus bus,
void *  priv 
)
inlinestatic

Set USB bus host controller private data.

Parameters
busUSB bus
privHost controller private data

Definition at line 1028 of file usb.h.

1028  {
1029  bus->priv = priv;
1030 }
static struct tlan_private * priv
Definition: tlan.c:224
uint8_t bus
Bus.
Definition: edd.h:14

References bus, and priv.

Referenced by ehci_probe(), uhci_probe(), usbio_start(), and xhci_probe().

◆ usb_bus_get_hostdata()

static void* usb_bus_get_hostdata ( struct usb_bus bus)
inlinestatic

Get USB bus host controller private data.

Parameters
busUSB bus
Return values
privHost controller private data

Definition at line 1039 of file usb.h.

1039  {
1040  return bus->priv;
1041 }
uint8_t bus
Bus.
Definition: edd.h:14

References bus.

Referenced by ehci_bus_close(), ehci_bus_open(), ehci_bus_poll(), ehci_device_open(), uhci_bus_close(), uhci_bus_open(), uhci_bus_poll(), uhci_device_open(), usbio_bus_poll(), usbio_device_open(), usbio_endpoint_open(), xhci_bus_close(), xhci_bus_open(), xhci_bus_poll(), and xhci_device_open().

◆ usb_poll()

static void usb_poll ( struct usb_bus bus)
inlinestatic

Poll USB bus.

Parameters
busUSB bus

Definition at line 1049 of file usb.h.

1049  {
1050  bus->host->poll ( bus );
1051 }
uint8_t bus
Bus.
Definition: edd.h:14

References bus.

Referenced by acm_poll(), axge_poll(), dm96xx_poll(), ecm_poll(), efi_usb_sync_transfer(), efi_usb_timer(), ehci_poll_companions(), ncm_poll(), register_usb_hub(), smsc75xx_poll(), smsc95xx_poll(), usb_control(), usb_step(), and usbkbd_iskey().

◆ usb_complete()

static void usb_complete ( struct usb_endpoint ep,
struct io_buffer iobuf 
)
inlinestatic

Complete transfer (without error)

Parameters
epUSB endpoint
iobufI/O buffer

Definition at line 1064 of file usb.h.

1064  {
1065  usb_complete_err ( ep, iobuf, 0 );
1066 }
void usb_complete_err(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete transfer (possibly with error)
Definition: usb.c:569

References usb_complete_err().

Referenced by ehci_endpoint_poll(), uhci_endpoint_poll(), usbio_bulk_in_poll(), usbio_bulk_out_poll(), usbio_control_poll(), usbio_interrupt_poll(), and xhci_transfer().

◆ usb_control()

int usb_control ( struct usb_device usb,
unsigned int  request,
unsigned int  value,
unsigned int  index,
void *  data,
size_t  len 
)

Issue USB control transaction.

Parameters
usbUSB device
requestRequest
valueValue parameter
indexIndex parameter
dataData buffer (if any)
lenLength of data
Return values
rcReturn status code

Definition at line 753 of file usb.c.

755  {
756  struct usb_bus *bus = usb->port->hub->bus;
757  struct usb_endpoint *ep = &usb->control;
758  struct io_buffer *iobuf;
759  struct io_buffer *cmplt;
760  union {
761  struct usb_setup_packet setup;
762  struct usb_control_pseudo_header pshdr;
763  } *headroom;
764  struct usb_control_pseudo_header *pshdr;
765  unsigned int i;
766  int rc;
767 
768  /* Allocate I/O buffer */
769  iobuf = alloc_iob ( sizeof ( *headroom ) + len );
770  if ( ! iobuf ) {
771  rc = -ENOMEM;
772  goto err_alloc;
773  }
774  iob_reserve ( iobuf, sizeof ( *headroom ) );
775  iob_put ( iobuf, len );
776  if ( request & USB_DIR_IN ) {
777  memset ( data, 0, len );
778  } else {
779  memcpy ( iobuf->data, data, len );
780  }
781 
782  /* Enqueue message */
783  if ( ( rc = usb_message ( ep, request, value, index, iobuf ) ) != 0 )
784  goto err_message;
785 
786  /* Wait for completion */
787  for ( i = 0 ; i < USB_CONTROL_MAX_WAIT_MS ; i++ ) {
788 
789  /* Poll bus */
790  usb_poll ( bus );
791 
792  /* Check for completion */
793  while ( ( cmplt = list_first_entry ( &usb->complete,
794  struct io_buffer,
795  list ) ) ) {
796 
797  /* Remove from completion list */
798  list_del ( &cmplt->list );
799 
800  /* Extract and strip completion status */
801  pshdr = cmplt->data;
802  iob_pull ( cmplt, sizeof ( *pshdr ) );
803  rc = pshdr->rc;
804 
805  /* Discard stale completions */
806  if ( cmplt != iobuf ) {
807  DBGC ( usb, "USB %s stale control completion: "
808  "%s\n", usb->name, strerror ( rc ) );
809  DBGC_HDA ( usb, 0, cmplt->data,
810  iob_len ( cmplt ) );
811  free_iob ( cmplt );
812  continue;
813  }
814 
815  /* Fail immediately if completion was in error */
816  if ( rc != 0 ) {
817  DBGC ( usb, "USB %s control %04x:%04x:%04x "
818  "failed: %s\n", usb->name, request,
819  value, index, strerror ( rc ) );
820  free_iob ( cmplt );
821  return rc;
822  }
823 
824  /* Copy completion to data buffer, if applicable */
825  assert ( iob_len ( cmplt ) <= len );
826  if ( request & USB_DIR_IN )
827  memcpy ( data, cmplt->data, iob_len ( cmplt ) );
828  free_iob ( cmplt );
829  return 0;
830  }
831 
832  /* Delay */
833  mdelay ( 1 );
834  }
835 
836  DBGC ( usb, "USB %s timed out waiting for control %04x:%04x:%04x\n",
837  usb->name, request, value, index );
838  return -ETIMEDOUT;
839 
840  err_message:
841  free_iob ( iobuf );
842  err_alloc:
843  return rc;
844 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:98
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_put(iobuf, len)
Definition: iobuf.h:116
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:145
#define DBGC(...)
Definition: compiler.h:505
int rc
Completion status.
Definition: usb.c:714
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:128
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition: list.h:333
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
#define ENOMEM
Not enough space.
Definition: errno.h:534
A USB endpoint.
Definition: usb.h:389
void * memcpy(void *dest, const void *src, size_t len) __nonnull
int usb_message(struct usb_endpoint *ep, unsigned int request, unsigned int value, unsigned int index, struct io_buffer *iobuf)
Enqueue USB message transfer.
Definition: usb.c:474
struct usb_port * port
USB port.
Definition: usb.h:710
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define DBGC_HDA(...)
Definition: compiler.h:506
#define USB_CONTROL_MAX_WAIT_MS
Maximum time to wait for a control transaction to complete.
Definition: usb.h:1298
#define USB_DIR_IN
Data transfer is from device to host.
Definition: usb.h:83
char name[32]
Name.
Definition: usb.h:708
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
struct usb_endpoint control
Control endpoint.
Definition: usb.h:731
static void usb_poll(struct usb_bus *bus)
Poll USB bus.
Definition: usb.h:1049
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:151
USB control transfer pseudo-header.
Definition: usb.c:712
A USB setup data packet.
Definition: usb.h:68
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
#define iob_reserve(iobuf, len)
Definition: iobuf.h:63
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:39
uint32_t len
Length.
Definition: ena.h:14
struct list_head complete
Completed control transfers.
Definition: usb.h:733
void * data
Start of data.
Definition: iobuf.h:44
struct usb_hub * hub
USB hub.
Definition: usb.h:798
u8 request[0]
List of IEs requested.
Definition: ieee80211.h:16
struct usb_device * usb
USB device.
Definition: usb.h:391
struct arbelprm_port_state_change_st data
Message.
Definition: arbel.h:12
struct usb_bus * bus
USB bus.
Definition: usb.h:828
uint64_t index
Index of the first segment within the content.
Definition: pccrc.h:21
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669
A USB bus.
Definition: usb.h:949
uint8_t bus
Bus.
Definition: edd.h:14
void * memset(void *dest, int character, size_t len) __nonnull
A persistent I/O buffer.
Definition: iobuf.h:32

References alloc_iob(), assert(), bus, usb_hub::bus, usb_device::complete, usb_device::control, data, io_buffer::data, DBGC, DBGC_HDA, ENOMEM, ETIMEDOUT, free_iob(), usb_port::hub, index, iob_len(), iob_pull, iob_put, iob_reserve, len, io_buffer::list, list_del, list_first_entry, mdelay(), memcpy(), memset(), usb_device::name, usb_device::port, rc, usb_control_pseudo_header::rc, request, strerror(), usb_endpoint::usb, USB_CONTROL_MAX_WAIT_MS, USB_DIR_IN, usb_message(), usb_poll(), and value.

Referenced by axge_read_register(), axge_write_register(), cdc_get_encapsulated_response(), cdc_send_encapsulated_command(), dm96xx_read_registers(), dm96xx_write_register(), dm96xx_write_registers(), ecm_open(), efi_usb_control_transfer(), ncm_open(), ncm_probe(), smscusb_raw_readl(), smscusb_raw_writel(), usb_clear_feature(), usb_get_descriptor(), usb_get_status(), usb_hub_clear_tt_buffer(), usb_hub_set_hub_depth(), usb_set_address(), usb_set_configuration(), usb_set_feature(), usb_set_interface(), usbhid_set_idle(), usbhid_set_protocol(), and usbhid_set_report().

◆ usb_get_string_descriptor()

int usb_get_string_descriptor ( struct usb_device usb,
unsigned int  index,
unsigned int  language,
char *  buf,
size_t  len 
)

Get USB string descriptor.

Parameters
usbUSB device
indexString index
languageLanguage ID, or 0 to use default
bufData buffer
lenLength of buffer
Return values
lenString length (excluding NUL), or negative error

Definition at line 884 of file usb.c.

885  {
886  size_t max = ( len ? ( len - 1 /* NUL */ ) : 0 );
887  struct {
889  uint16_t character[max];
890  } __attribute__ (( packed )) *desc;
891  unsigned int actual;
892  unsigned int i;
893  int rc;
894 
895  /* Use default language ID, if applicable */
896  if ( ( language == 0 ) && ( index != 0 ) ) {
897  if ( ! usb->language )
898  usb->language = usb_get_default_language ( usb );
899  language = usb->language;
900  }
901 
902  /* Allocate buffer for string */
903  desc = malloc ( sizeof ( *desc ) );
904  if ( ! desc ) {
905  rc = -ENOMEM;
906  goto err_alloc;
907  }
908 
909  /* Get descriptor */
910  if ( ( rc = usb_get_descriptor ( usb, 0, USB_STRING_DESCRIPTOR, index,
911  language, &desc->header,
912  sizeof ( *desc ) ) ) != 0 )
913  goto err_get_descriptor;
914 
915  /* Copy to buffer */
916  actual = ( ( desc->header.len - sizeof ( desc->header ) ) /
917  sizeof ( desc->character[0] ) );
918  for ( i = 0 ; ( ( i < actual ) && ( i < max ) ) ; i++ )
919  buf[i] = le16_to_cpu ( desc->character[i] );
920  if ( len )
921  buf[i] = '\0';
922 
923  /* Free buffer */
924  free ( desc );
925 
926  return actual;
927 
928  err_get_descriptor:
929  free ( desc );
930  err_alloc:
931  return rc;
932 }
#define __attribute__(x)
Definition: compiler.h:10
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
unsigned short uint16_t
Definition: stdint.h:11
static unsigned int usb_get_default_language(struct usb_device *usb)
Get default language ID.
Definition: usb.c:852
#define max(x, y)
Definition: ath.h:39
#define USB_STRING_DESCRIPTOR
A USB string descriptor.
Definition: usb.h:224
#define ENOMEM
Not enough space.
Definition: errno.h:534
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
#define le16_to_cpu(value)
Definition: byteswap.h:112
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:583
A USB descriptor header.
Definition: usb.h:158
unsigned int language
Default language ID (if known)
Definition: usb.h:736
uint32_t len
Length.
Definition: ena.h:14
struct ena_aq_header header
Header.
Definition: ena.h:12
static int usb_get_descriptor(struct usb_device *usb, unsigned int type, unsigned int desc, unsigned int index, unsigned int language, struct usb_descriptor_header *data, size_t len)
Get USB descriptor.
Definition: usb.h:1154
uint64_t index
Index of the first segment within the content.
Definition: pccrc.h:21

References __attribute__, ENOMEM, free, header, index, usb_device::language, le16_to_cpu, len, malloc(), max, rc, usb_get_default_language(), usb_get_descriptor(), and USB_STRING_DESCRIPTOR.

Referenced by ecm_fetch_mac().

◆ usb_get_status()

static int usb_get_status ( struct usb_device usb,
unsigned int  type,
unsigned int  index,
void *  data,
size_t  len 
)
inlinestatic

Get status.

Parameters
usbUSB device
typeRequest type
indexTarget index
dataStatus to fill in
lenLength of status descriptor
Return values
rcReturn status code

Definition at line 1087 of file usb.h.

1088  {
1089 
1090  return usb_control ( usb, ( USB_GET_STATUS | type ), 0, index,
1091  data, len );
1092 }
uint8_t type
Type.
Definition: ena.h:16
int usb_control(struct usb_device *usb, unsigned int request, unsigned int value, unsigned int index, void *data, size_t len)
Issue USB control transaction.
Definition: usb.c:753
#define USB_GET_STATUS
Get status.
Definition: usb.h:110
uint32_t len
Length.
Definition: ena.h:14
struct arbelprm_port_state_change_st data
Message.
Definition: arbel.h:12
uint64_t index
Index of the first segment within the content.
Definition: pccrc.h:21

References data, index, len, type, usb_control(), and USB_GET_STATUS.

Referenced by usb_hub_get_port_status().

◆ usb_clear_feature()

static int usb_clear_feature ( struct usb_device usb,
unsigned int  type,
unsigned int  feature,
unsigned int  index 
)
inlinestatic

Clear feature.

Parameters
usbUSB device
typeRequest type
featureFeature selector
indexTarget index
Return values
rcReturn status code

Definition at line 1104 of file usb.h.

1105  {
1106 
1107  return usb_control ( usb, ( USB_CLEAR_FEATURE | type ),
1108  feature, index, NULL, 0 );
1109 }
uint8_t type
Type.
Definition: ena.h:16
int usb_control(struct usb_device *usb, unsigned int request, unsigned int value, unsigned int index, void *data, size_t len)
Issue USB control transaction.
Definition: usb.c:753
#define USB_CLEAR_FEATURE
Clear feature.
Definition: usb.h:113
A named feature.
Definition: features.h:78
uint64_t index
Index of the first segment within the content.
Definition: pccrc.h:21
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References index, NULL, type, USB_CLEAR_FEATURE, and usb_control().

Referenced by usb_endpoint_reset(), and usb_hub_clear_port_feature().

◆ usb_set_feature()

static int usb_set_feature ( struct usb_device usb,
unsigned int  type,
unsigned int  feature,
unsigned int  index 
)
inlinestatic

Set feature.

Parameters
usbUSB device
typeRequest type
featureFeature selector
indexTarget index
Return values
rcReturn status code

Definition at line 1121 of file usb.h.

1122  {
1123 
1124  return usb_control ( usb, ( USB_SET_FEATURE | type ),
1125  feature, index, NULL, 0 );
1126 }
uint8_t type
Type.
Definition: ena.h:16
int usb_control(struct usb_device *usb, unsigned int request, unsigned int value, unsigned int index, void *data, size_t len)
Issue USB control transaction.
Definition: usb.c:753
A named feature.
Definition: features.h:78
#define USB_SET_FEATURE
Set feature.
Definition: usb.h:116
uint64_t index
Index of the first segment within the content.
Definition: pccrc.h:21
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References index, NULL, type, usb_control(), and USB_SET_FEATURE.

Referenced by usb_hub_set_port_feature().

◆ usb_set_address()

static int usb_set_address ( struct usb_device usb,
unsigned int  address 
)
inlinestatic

Set address.

Parameters
usbUSB device
addressDevice address
Return values
rcReturn status code

Definition at line 1136 of file usb.h.

1136  {
1137 
1138  return usb_control ( usb, USB_SET_ADDRESS, address, 0, NULL, 0 );
1139 }
uint64_t address
Base address.
Definition: ena.h:24
int usb_control(struct usb_device *usb, unsigned int request, unsigned int value, unsigned int index, void *data, size_t len)
Issue USB control transaction.
Definition: usb.c:753
#define USB_SET_ADDRESS
Set address.
Definition: usb.h:119
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References address, NULL, usb_control(), and USB_SET_ADDRESS.

Referenced by ehci_device_address(), and uhci_device_address().

◆ usb_get_descriptor()

static int usb_get_descriptor ( struct usb_device usb,
unsigned int  type,
unsigned int  desc,
unsigned int  index,
unsigned int  language,
struct usb_descriptor_header data,
size_t  len 
)
inlinestatic

Get USB descriptor.

Parameters
usbUSB device
typeRequest type
descDescriptor type
indexDescriptor index
languageLanguage ID (for string descriptors)
dataDescriptor to fill in
lenMaximum length of descriptor
Return values
rcReturn status code

Definition at line 1154 of file usb.h.

1157  {
1158 
1159  return usb_control ( usb, ( USB_GET_DESCRIPTOR | type ),
1160  ( ( desc << 8 ) | index ), language, data, len );
1161 }
#define USB_GET_DESCRIPTOR
Get descriptor.
Definition: usb.h:122
uint8_t type
Type.
Definition: ena.h:16
int usb_control(struct usb_device *usb, unsigned int request, unsigned int value, unsigned int index, void *data, size_t len)
Issue USB control transaction.
Definition: usb.c:753
uint32_t len
Length.
Definition: ena.h:14
struct arbelprm_port_state_change_st data
Message.
Definition: arbel.h:12
uint64_t index
Index of the first segment within the content.
Definition: pccrc.h:21

References data, index, len, type, usb_control(), and USB_GET_DESCRIPTOR.

Referenced by efi_usb_get_string_descriptor(), efi_usb_probe(), usb_get_config_descriptor(), usb_get_default_language(), usb_get_device_descriptor(), usb_get_mtu(), usb_get_string_descriptor(), and usb_hub_get_descriptor().

◆ usb_get_mtu()

static int usb_get_mtu ( struct usb_device usb,
struct usb_device_descriptor data 
)
inlinestatic

Get first part of USB device descriptor (up to and including MTU)

Parameters
usbUSB device
dataDevice descriptor to (partially) fill in
Return values
rcReturn status code

Definition at line 1171 of file usb.h.

1171  {
1172 
1173  return usb_get_descriptor ( usb, 0, USB_DEVICE_DESCRIPTOR, 0, 0,
1174  &data->header,
1175  ( offsetof ( typeof ( *data ), mtu ) +
1176  sizeof ( data->mtu ) ) );
1177 }
#define offsetof(type, field)
Get offset of a field within a structure.
Definition: stddef.h:24
uint32_t mtu
Maximum MTU.
Definition: ena.h:28
struct arbelprm_port_state_change_st data
Message.
Definition: arbel.h:12
static int usb_get_descriptor(struct usb_device *usb, unsigned int type, unsigned int desc, unsigned int index, unsigned int language, struct usb_descriptor_header *data, size_t len)
Get USB descriptor.
Definition: usb.h:1154
Standard Device Descriptor USB 2.0 spec, Section 9.6.1.
Definition: Usb.h:111

References data, mtu, offsetof, and usb_get_descriptor().

Referenced by register_usb().

◆ usb_get_device_descriptor()

static int usb_get_device_descriptor ( struct usb_device usb,
struct usb_device_descriptor data 
)
inlinestatic

Get USB device descriptor.

Parameters
usbUSB device
dataDevice descriptor to fill in
Return values
rcReturn status code

Definition at line 1187 of file usb.h.

1188  {
1189 
1190  return usb_get_descriptor ( usb, 0, USB_DEVICE_DESCRIPTOR, 0, 0,
1191  &data->header, sizeof ( *data ) );
1192 }
struct arbelprm_port_state_change_st data
Message.
Definition: arbel.h:12
static int usb_get_descriptor(struct usb_device *usb, unsigned int type, unsigned int desc, unsigned int index, unsigned int language, struct usb_descriptor_header *data, size_t len)
Get USB descriptor.
Definition: usb.h:1154
Standard Device Descriptor USB 2.0 spec, Section 9.6.1.
Definition: Usb.h:111

References data, and usb_get_descriptor().

Referenced by register_usb().

◆ usb_get_config_descriptor()

static int usb_get_config_descriptor ( struct usb_device usb,
unsigned int  index,
struct usb_configuration_descriptor data,
size_t  len 
)
inlinestatic

Get USB configuration descriptor.

Parameters
usbUSB device
indexConfiguration index
dataConfiguration descriptor to fill in
Return values
rcReturn status code

Definition at line 1203 of file usb.h.

1205  {
1206 
1208  0, &data->header, len );
1209 }
#define USB_CONFIGURATION_DESCRIPTOR
A USB configuration descriptor.
Definition: usb.h:213
uint32_t len
Length.
Definition: ena.h:14
struct arbelprm_port_state_change_st data
Message.
Definition: arbel.h:12
static int usb_get_descriptor(struct usb_device *usb, unsigned int type, unsigned int desc, unsigned int index, unsigned int language, struct usb_descriptor_header *data, size_t len)
Get USB descriptor.
Definition: usb.h:1154
uint64_t index
Index of the first segment within the content.
Definition: pccrc.h:21

References data, index, len, USB_CONFIGURATION_DESCRIPTOR, and usb_get_descriptor().

Referenced by usb_config_descriptor().

◆ usb_set_configuration()

static int usb_set_configuration ( struct usb_device usb,
unsigned int  index 
)
inlinestatic

Set USB configuration.

Parameters
usbUSB device
indexConfiguration index
Return values
rcReturn status code

Definition at line 1219 of file usb.h.

1219  {
1220 
1221  return usb_control ( usb, USB_SET_CONFIGURATION, index, 0, NULL, 0 );
1222 }
int usb_control(struct usb_device *usb, unsigned int request, unsigned int value, unsigned int index, void *data, size_t len)
Issue USB control transaction.
Definition: usb.c:753
uint64_t index
Index of the first segment within the content.
Definition: pccrc.h:21
#define USB_SET_CONFIGURATION
Set configuration.
Definition: usb.h:131
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References index, NULL, usb_control(), and USB_SET_CONFIGURATION.

Referenced by axge_open(), usb_autoconfigure(), and usb_deconfigure().

◆ usb_set_interface()

static int usb_set_interface ( struct usb_device usb,
unsigned int  interface,
unsigned int  alternate 
)
inlinestatic

Set USB interface alternate setting.

Parameters
usbUSB device
interfaceInterface number
alternateAlternate setting
Return values
rcReturn status code

Definition at line 1233 of file usb.h.

1234  {
1235 
1237  NULL, 0 );
1238 }
int usb_control(struct usb_device *usb, unsigned int request, unsigned int value, unsigned int index, void *data, size_t len)
Issue USB control transaction.
Definition: usb.c:753
An object interface.
Definition: interface.h:109
struct ib_cm_path alternate
Alternate path.
Definition: ib_mad.h:42
#define USB_SET_INTERFACE
Set interface.
Definition: usb.h:138
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References alternate, NULL, usb_control(), and USB_SET_INTERFACE.

Referenced by usbnet_close(), and usbnet_open().

◆ usb_interface_descriptor()

struct usb_interface_descriptor* usb_interface_descriptor ( struct usb_configuration_descriptor config,
unsigned int  interface,
unsigned int  alternate 
)

Locate USB interface descriptor.

Parameters
configConfiguraton descriptor
interfaceInterface number
alternateAlternate setting
Return values
descInterface descriptor, or NULL if not found

Definition at line 143 of file usb.c.

144  {
145  struct usb_interface_descriptor *desc;
146 
147  /* Find a matching interface descriptor */
148  for_each_config_descriptor ( desc, config ) {
149  if ( ( desc->header.type == USB_INTERFACE_DESCRIPTOR ) &&
150  ( desc->interface == interface ) &&
151  ( desc->alternate == alternate ) )
152  return desc;
153  }
154  return NULL;
155 }
struct usb_descriptor_header header
Descriptor header.
Definition: usb.h:232
Standard Interface Descriptor USB 2.0 spec, Section 9.6.5.
Definition: Usb.h:147
#define for_each_config_descriptor(desc, config)
Iterate over all configuration descriptors.
Definition: usb.h:371
A USB interface descriptor.
Definition: usb.h:230
An object interface.
Definition: interface.h:109
struct ib_cm_path alternate
Alternate path.
Definition: ib_mad.h:42
uint8_t type
Descriptor type.
Definition: usb.h:162
uint8_t alternate
Alternate setting.
Definition: usb.h:236
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
uint8_t interface
Interface number.
Definition: usb.h:234

References alternate, usb_interface_descriptor::alternate, for_each_config_descriptor, usb_interface_descriptor::header, usb_interface_descriptor::interface, NULL, and usb_descriptor_header::type.

Referenced by ecm_probe(), efi_usb_get_interface_descriptor(), ncm_probe(), usbhid_describe(), usbnet_comms_describe(), and usbnet_data_describe().

◆ usb_endpoint_descriptor()

struct usb_endpoint_descriptor* usb_endpoint_descriptor ( struct usb_configuration_descriptor config,
struct usb_interface_descriptor interface,
unsigned int  type,
unsigned int  index 
)

Locate USB endpoint descriptor.

Parameters
configConfiguration descriptor
interfaceInterface descriptor
typeEndpoint (internal) type
indexEndpoint index
Return values
descDescriptor, or NULL if not found

Definition at line 167 of file usb.c.

169  {
170  struct usb_endpoint_descriptor *desc;
171  unsigned int attributes = ( type & USB_ENDPOINT_ATTR_TYPE_MASK );
172  unsigned int direction = ( type & USB_DIR_IN );
173 
174  /* Find a matching endpoint descriptor */
175  for_each_interface_descriptor ( desc, config, interface ) {
176  if ( ( desc->header.type == USB_ENDPOINT_DESCRIPTOR ) &&
177  ( ( desc->attributes &
179  ( ( desc->endpoint & USB_DIR_IN ) == direction ) &&
180  ( index-- == 0 ) )
181  return desc;
182  }
183  return NULL;
184 }
#define USB_ENDPOINT_ATTR_TYPE_MASK
Endpoint attribute transfer type mask.
Definition: usb.h:266
uint8_t type
Type.
Definition: ena.h:16
#define for_each_interface_descriptor(desc, config, interface)
Iterate over all configuration descriptors within an interface descriptor.
Definition: usb.h:379
uint8_t direction
Direction.
Definition: ena.h:14
uint8_t endpoint
Endpoint address.
Definition: usb.h:253
An object interface.
Definition: interface.h:109
#define USB_DIR_IN
Data transfer is from device to host.
Definition: usb.h:83
uint8_t type
Descriptor type.
Definition: usb.h:162
uint8_t attributes
Attributes.
Definition: usb.h:255
Standard Endpoint Descriptor USB 2.0 spec, Section 9.6.6.
Definition: Usb.h:163
A USB endpoint descriptor.
Definition: usb.h:249
struct usb_descriptor_header header
Descriptor header.
Definition: usb.h:251
uint64_t index
Index of the first segment within the content.
Definition: pccrc.h:21
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References usb_endpoint_descriptor::attributes, direction, usb_endpoint_descriptor::endpoint, for_each_interface_descriptor, usb_endpoint_descriptor::header, index, NULL, type, usb_descriptor_header::type, USB_DIR_IN, and USB_ENDPOINT_ATTR_TYPE_MASK.

Referenced by usb_endpoint_described().

◆ usb_endpoint_companion_descriptor()

Locate USB endpoint companion descriptor.

Parameters
configConfiguration descriptor
descEndpoint descriptor
Return values
descxCompanion descriptor, or NULL if not found

Definition at line 194 of file usb.c.

195  {
196  struct usb_endpoint_companion_descriptor *descx;
197 
198  /* Get companion descriptor, if present */
199  descx = container_of ( usb_next_descriptor ( &desc->header ),
201  header );
202  return ( ( usb_is_within_config ( config, &descx->header ) &&
204  ? descx : NULL );
205 }
struct usb_descriptor_header header
Descriptor header.
Definition: usb.h:301
static struct usb_descriptor_header * usb_next_descriptor(struct usb_descriptor_header *desc)
Get next USB descriptor.
Definition: usb.h:343
#define USB_ENDPOINT_COMPANION_DESCRIPTOR
A USB endpoint companion descriptor.
Definition: usb.h:311
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
uint8_t type
Descriptor type.
Definition: usb.h:162
A USB endpoint companion descriptor.
Definition: usb.h:299
struct ena_aq_header header
Header.
Definition: ena.h:12
struct usb_descriptor_header header
Descriptor header.
Definition: usb.h:251
static int usb_is_within_config(struct usb_configuration_descriptor *config, struct usb_descriptor_header *desc)
Check that descriptor lies within a configuration descriptor.
Definition: usb.h:356
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References container_of, header, usb_endpoint_descriptor::header, usb_endpoint_companion_descriptor::header, NULL, usb_descriptor_header::type, USB_ENDPOINT_COMPANION_DESCRIPTOR, usb_is_within_config(), and usb_next_descriptor().

Referenced by usb_endpoint_described().

◆ alloc_usb_hub()

struct usb_hub* alloc_usb_hub ( struct usb_bus bus,
struct usb_device usb,
unsigned int  ports,
struct usb_hub_driver_operations driver 
)

Allocate USB hub.

Parameters
busUSB bus
usbUnderlying USB device, if any
portsNumber of ports
driverHub driver operations
Return values
hubUSB hub, or NULL on allocation failure

Definition at line 1875 of file usb.c.

1877  {
1878  struct usb_hub *hub;
1879  struct usb_port *port;
1880  unsigned int i;
1881 
1882  /* Allocate and initialise structure */
1883  hub = zalloc ( sizeof ( *hub ) + ( ports * sizeof ( hub->port[0] ) ) );
1884  if ( ! hub )
1885  return NULL;
1886  hub->name = ( usb ? usb->name : bus->name );
1887  hub->bus = bus;
1888  hub->usb = usb;
1889  if ( usb )
1890  hub->protocol = usb->port->protocol;
1891  hub->ports = ports;
1892  hub->driver = driver;
1893  hub->host = &bus->op->hub;
1894 
1895  /* Initialise port list */
1896  for ( i = 1 ; i <= hub->ports ; i++ ) {
1897  port = usb_port ( hub, i );
1898  port->hub = hub;
1899  port->address = i;
1900  if ( usb )
1901  port->protocol = usb->port->protocol;
1902  INIT_LIST_HEAD ( &port->changed );
1903  }
1904 
1905  return hub;
1906 }
A USB hub.
Definition: usb.h:824
struct usb_hub_host_operations * host
Host controller operations.
Definition: usb.h:840
struct usb_device * usb
Currently attached device (if in use)
Definition: usb.h:818
unsigned int protocol
Port protocol.
Definition: usb.h:802
A USB port.
Definition: usb.h:796
struct usb_device * usb
Underlying USB device, if any.
Definition: usb.h:830
u8 port
Port number.
Definition: CIB_PRM.h:31
struct usb_port * port
USB port.
Definition: usb.h:710
struct usb_hub_driver_operations * driver
Driver operations.
Definition: usb.h:842
char name[32]
Name.
Definition: usb.h:708
unsigned int ports
Number of ports.
Definition: usb.h:834
const char * name
Name.
Definition: usb.h:826
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
struct usb_hub * hub
USB hub.
Definition: usb.h:798
static struct usb_port * usb_port(struct usb_hub *hub, unsigned int address)
Get USB port.
Definition: usb.h:943
unsigned int protocol
Hub protocol.
Definition: usb.h:832
struct usb_bus * bus
USB bus.
Definition: usb.h:828
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
uint8_t bus
Bus.
Definition: edd.h:14
struct usb_port port[0]
Port list.
Definition: usb.h:850

References bus, usb_hub::bus, usb_hub::driver, usb_hub::host, usb_port::hub, INIT_LIST_HEAD, usb_device::name, usb_hub::name, NULL, port, usb_device::port, usb_hub::port, usb_hub::ports, usb_port::protocol, usb_hub::protocol, usb_port::usb, usb_hub::usb, usb_port(), and zalloc().

Referenced by alloc_usb_bus(), and hub_probe().

◆ register_usb_hub()

int register_usb_hub ( struct usb_hub hub)

Register USB hub.

Parameters
hubUSB hub
Return values
rcReturn status code

Definition at line 1914 of file usb.c.

1914  {
1915  struct usb_bus *bus = hub->bus;
1916  struct usb_port *port;
1917  unsigned int i;
1918  int rc;
1919 
1920  /* Add to hub list */
1921  list_add_tail ( &hub->list, &bus->hubs );
1922 
1923  /* Open hub (host controller) */
1924  if ( ( rc = hub->host->open ( hub ) ) != 0 ) {
1925  DBGC ( hub, "USB hub %s could not open: %s\n",
1926  hub->name, strerror ( rc ) );
1927  goto err_host_open;
1928  }
1929 
1930  /* Open hub (driver) */
1931  if ( ( rc = hub->driver->open ( hub ) ) != 0 ) {
1932  DBGC ( hub, "USB hub %s could not open: %s\n",
1933  hub->name, strerror ( rc ) );
1934  goto err_driver_open;
1935  }
1936 
1937  /* Delay to allow ports to stabilise */
1939 
1940  /* Mark all ports as changed */
1941  for ( i = 1 ; i <= hub->ports ; i++ ) {
1942  port = usb_port ( hub, i );
1943  usb_port_changed ( port );
1944  }
1945 
1946  /* Some hubs seem to defer reporting device connections until
1947  * their interrupt endpoint is polled for the first time.
1948  * Poll the bus once now in order to pick up any such
1949  * connections.
1950  */
1951  usb_poll ( bus );
1952 
1953  return 0;
1954 
1955  hub->driver->close ( hub );
1956  err_driver_open:
1957  hub->host->close ( hub );
1958  err_host_open:
1959  list_del ( &hub->list );
1960  return rc;
1961 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct usb_hub_host_operations * host
Host controller operations.
Definition: usb.h:840
#define DBGC(...)
Definition: compiler.h:505
void usb_port_changed(struct usb_port *port)
Report port status change.
Definition: usb.c:1796
int(* open)(struct usb_hub *hub)
Open hub.
Definition: usb.h:860
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
A USB port.
Definition: usb.h:796
u8 port
Port number.
Definition: CIB_PRM.h:31
struct usb_hub_driver_operations * driver
Driver operations.
Definition: usb.h:842
void(* close)(struct usb_hub *hub)
Close hub.
Definition: usb.h:865
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
unsigned int ports
Number of ports.
Definition: usb.h:834
const char * name
Name.
Definition: usb.h:826
static void usb_poll(struct usb_bus *bus)
Poll USB bus.
Definition: usb.h:1049
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
void(* close)(struct usb_hub *hub)
Close hub.
Definition: usb.h:880
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
struct list_head list
List of hubs.
Definition: usb.h:837
struct usb_hub * hub
USB hub.
Definition: usb.h:798
#define USB_PORT_DELAY_MS
Time to wait for ports to stabilise.
Definition: usb.h:1314
struct usb_hub * hub
Root hub.
Definition: usb.h:972
static struct usb_port * usb_port(struct usb_hub *hub, unsigned int address)
Get USB port.
Definition: usb.h:943
struct usb_bus * bus
USB bus.
Definition: usb.h:828
A USB bus.
Definition: usb.h:949
uint8_t bus
Bus.
Definition: edd.h:14
int(* open)(struct usb_hub *hub)
Open hub.
Definition: usb.h:875

References bus, usb_hub::bus, usb_hub_host_operations::close, usb_hub_driver_operations::close, DBGC, usb_hub::driver, usb_hub::host, usb_port::hub, usb_bus::hub, usb_hub::list, list_add_tail, list_del, mdelay(), usb_hub::name, usb_hub_host_operations::open, usb_hub_driver_operations::open, port, usb_hub::ports, rc, strerror(), usb_poll(), usb_port(), usb_port_changed(), and USB_PORT_DELAY_MS.

Referenced by hub_probe(), and register_usb_bus().

◆ unregister_usb_hub()

void unregister_usb_hub ( struct usb_hub hub)

Unregister USB hub.

Parameters
hubUSB hub

Definition at line 1968 of file usb.c.

1968  {
1969  struct usb_port *port;
1970  unsigned int i;
1971 
1972  /* Detach all devices */
1973  for ( i = 1 ; i <= hub->ports ; i++ ) {
1974  port = usb_port ( hub, i );
1975  if ( port->attached )
1976  usb_detached ( port );
1977  }
1978 
1979  /* Close hub (driver) */
1980  hub->driver->close ( hub );
1981 
1982  /* Close hub (host controller) */
1983  hub->host->close ( hub );
1984 
1985  /* Cancel any pending port status changes */
1986  for ( i = 1 ; i <= hub->ports ; i++ ) {
1987  port = usb_port ( hub, i );
1988  list_del ( &port->changed );
1989  INIT_LIST_HEAD ( &port->changed );
1990  }
1991 
1992  /* Remove from hub list */
1993  list_del ( &hub->list );
1994 }
static void usb_detached(struct usb_port *port)
Handle newly detached USB device.
Definition: usb.c:1733
struct usb_hub_host_operations * host
Host controller operations.
Definition: usb.h:840
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
A USB port.
Definition: usb.h:796
u8 port
Port number.
Definition: CIB_PRM.h:31
struct usb_hub_driver_operations * driver
Driver operations.
Definition: usb.h:842
void(* close)(struct usb_hub *hub)
Close hub.
Definition: usb.h:865
unsigned int ports
Number of ports.
Definition: usb.h:834
void(* close)(struct usb_hub *hub)
Close hub.
Definition: usb.h:880
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
struct list_head list
List of hubs.
Definition: usb.h:837
struct usb_hub * hub
USB hub.
Definition: usb.h:798
static struct usb_port * usb_port(struct usb_hub *hub, unsigned int address)
Get USB port.
Definition: usb.h:943

References usb_hub_host_operations::close, usb_hub_driver_operations::close, usb_hub::driver, usb_hub::host, usb_port::hub, INIT_LIST_HEAD, usb_hub::list, list_del, port, usb_hub::ports, usb_detached(), and usb_port().

Referenced by hub_probe(), hub_remove(), register_usb_bus(), and unregister_usb_bus().

◆ free_usb_hub()

void free_usb_hub ( struct usb_hub hub)

Free USB hub.

Parameters
hubUSB hub

Definition at line 2001 of file usb.c.

2001  {
2002  struct usb_port *port;
2003  unsigned int i;
2004 
2005  /* Sanity checks */
2006  for ( i = 1 ; i <= hub->ports ; i++ ) {
2007  port = usb_port ( hub, i );
2008  assert ( ! port->attached );
2009  assert ( port->usb == NULL );
2010  assert ( list_empty ( &port->changed ) );
2011  }
2012 
2013  /* Free hub */
2014  free ( hub );
2015 }
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:136
A USB port.
Definition: usb.h:796
u8 port
Port number.
Definition: CIB_PRM.h:31
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
unsigned int ports
Number of ports.
Definition: usb.h:834
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
struct usb_hub * hub
USB hub.
Definition: usb.h:798
static struct usb_port * usb_port(struct usb_hub *hub, unsigned int address)
Get USB port.
Definition: usb.h:943
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References assert(), free, usb_port::hub, list_empty, NULL, port, usb_hub::ports, and usb_port().

Referenced by alloc_usb_bus(), free_usb_bus(), hub_probe(), and hub_remove().

◆ usb_port_changed()

void usb_port_changed ( struct usb_port port)

Report port status change.

Parameters
portUSB port

Definition at line 1796 of file usb.c.

1796  {
1797 
1798  /* Record hub port status change */
1799  list_del ( &port->changed );
1800  list_add_tail ( &port->changed, &usb_changed );
1801 }
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
u8 port
Port number.
Definition: CIB_PRM.h:31
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
static struct list_head usb_changed
List of changed ports.
Definition: usb.c:47

References list_add_tail, list_del, port, and usb_changed.

Referenced by ehci_root_poll(), hub_complete(), register_usb_hub(), uhci_root_poll(), and xhci_port_status().

◆ alloc_usb_bus()

struct usb_bus* alloc_usb_bus ( struct device dev,
unsigned int  ports,
size_t  mtu,
struct usb_host_operations op 
)

Allocate USB bus.

Parameters
devUnderlying hardware device
portsNumber of root hub ports
mtuLargest transfer allowed on the bus
opHost controller operations
Return values
busUSB bus, or NULL on allocation failure

Definition at line 2033 of file usb.c.

2034  {
2035  struct usb_bus *bus;
2036 
2037  /* Allocate and initialise structure */
2038  bus = zalloc ( sizeof ( *bus ) );
2039  if ( ! bus )
2040  goto err_alloc_bus;
2041  bus->name = dev->name;
2042  bus->dev = dev;
2043  bus->mtu = mtu;
2044  bus->op = op;
2045  INIT_LIST_HEAD ( &bus->devices );
2046  INIT_LIST_HEAD ( &bus->hubs );
2047  bus->host = &bus->op->bus;
2048 
2049  /* Allocate root hub */
2050  bus->hub = alloc_usb_hub ( bus, NULL, ports, &op->root );
2051  if ( ! bus->hub )
2052  goto err_alloc_hub;
2053 
2054  return bus;
2055 
2056  free_usb_hub ( bus->hub );
2057  err_alloc_hub:
2058  free ( bus );
2059  err_alloc_bus:
2060  return NULL;
2061 }
char name[40]
Name.
Definition: device.h:75
struct device * dev
Underlying hardware device.
Definition: usb.h:953
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
void free_usb_hub(struct usb_hub *hub)
Free USB hub.
Definition: usb.c:2001
static uint16_t struct vmbus_xfer_pages_operations * op
Definition: netvsc.h:327
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
uint32_t mtu
Maximum MTU.
Definition: ena.h:28
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
A USB bus.
Definition: usb.h:949
uint8_t bus
Bus.
Definition: edd.h:14
struct usb_hub * alloc_usb_hub(struct usb_bus *bus, struct usb_device *usb, unsigned int ports, struct usb_hub_driver_operations *driver)
Allocate USB hub.
Definition: usb.c:1875

References alloc_usb_hub(), bus, usb_bus::dev, free, free_usb_hub(), INIT_LIST_HEAD, mtu, device::name, NULL, op, and zalloc().

Referenced by ehci_probe(), uhci_probe(), usbio_start(), and xhci_probe().

◆ register_usb_bus()

int register_usb_bus ( struct usb_bus bus)

Register USB bus.

Parameters
busUSB bus
Return values
rcReturn status code

Definition at line 2069 of file usb.c.

2069  {
2070  int rc;
2071 
2072  /* Sanity checks */
2073  assert ( bus->hub != NULL );
2074 
2075  /* Open bus */
2076  if ( ( rc = bus->host->open ( bus ) ) != 0 )
2077  goto err_open;
2078 
2079  /* Add to list of USB buses */
2080  list_add_tail ( &bus->list, &usb_buses );
2081 
2082  /* Register root hub */
2083  if ( ( rc = register_usb_hub ( bus->hub ) ) != 0 )
2084  goto err_register_hub;
2085 
2086  /* Attach any devices already present */
2087  usb_hotplug();
2088 
2089  return 0;
2090 
2091  unregister_usb_hub ( bus->hub );
2092  err_register_hub:
2093  list_del ( &bus->list );
2094  bus->host->close ( bus );
2095  err_open:
2096  return rc;
2097 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void usb_hotplug(void)
Handle newly attached or detached USB device.
Definition: usb.c:1807
void unregister_usb_hub(struct usb_hub *hub)
Unregister USB hub.
Definition: usb.c:1968
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
struct list_head usb_buses
List of USB buses.
Definition: usb.c:44
int register_usb_hub(struct usb_hub *hub)
Register USB hub.
Definition: usb.c:1914
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
uint8_t bus
Bus.
Definition: edd.h:14

References assert(), bus, list_add_tail, list_del, NULL, rc, register_usb_hub(), unregister_usb_hub(), usb_buses, and usb_hotplug().

Referenced by ehci_probe(), uhci_probe(), usbio_start(), and xhci_probe().

◆ unregister_usb_bus()

void unregister_usb_bus ( struct usb_bus bus)

Unregister USB bus.

Parameters
busUSB bus

Definition at line 2104 of file usb.c.

2104  {
2105 
2106  /* Sanity checks */
2107  assert ( bus->hub != NULL );
2108 
2109  /* Unregister root hub */
2110  unregister_usb_hub ( bus->hub );
2111 
2112  /* Remove from list of USB buses */
2113  list_del ( &bus->list );
2114 
2115  /* Close bus */
2116  bus->host->close ( bus );
2117 
2118  /* Sanity checks */
2119  assert ( list_empty ( &bus->devices ) );
2120  assert ( list_empty ( &bus->hubs ) );
2121 }
void unregister_usb_hub(struct usb_hub *hub)
Unregister USB hub.
Definition: usb.c:1968
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:136
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
uint8_t bus
Bus.
Definition: edd.h:14

References assert(), bus, list_del, list_empty, NULL, and unregister_usb_hub().

Referenced by ehci_probe(), ehci_remove(), uhci_probe(), uhci_remove(), usbio_start(), usbio_stop(), xhci_probe(), and xhci_remove().

◆ free_usb_bus()

void free_usb_bus ( struct usb_bus bus)

Free USB bus.

Parameters
busUSB bus

Definition at line 2128 of file usb.c.

2128  {
2129  struct usb_endpoint *ep;
2130  struct usb_port *port;
2131 
2132  /* Sanity checks */
2133  assert ( list_empty ( &bus->devices ) );
2134  assert ( list_empty ( &bus->hubs ) );
2135  list_for_each_entry ( ep, &usb_halted, halted )
2136  assert ( ep->usb->port->hub->bus != bus );
2138  assert ( port->hub->bus != bus );
2139 
2140  /* Free root hub */
2141  free_usb_hub ( bus->hub );
2142 
2143  /* Free bus */
2144  free ( bus );
2145 }
struct list_head changed
List of changed ports.
Definition: usb.h:820
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:136
A USB port.
Definition: usb.h:796
A USB endpoint.
Definition: usb.h:389
u8 port
Port number.
Definition: CIB_PRM.h:31
struct usb_port * port
USB port.
Definition: usb.h:710
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:420
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
void free_usb_hub(struct usb_hub *hub)
Free USB hub.
Definition: usb.c:2001
static struct list_head usb_halted
List of halted endpoints.
Definition: usb.c:50
struct usb_hub * hub
USB hub.
Definition: usb.h:798
struct usb_device * usb
USB device.
Definition: usb.h:391
static struct list_head usb_changed
List of changed ports.
Definition: usb.c:47
struct usb_bus * bus
USB bus.
Definition: usb.h:828
uint8_t bus
Bus.
Definition: edd.h:14

References assert(), bus, usb_hub::bus, usb_port::changed, free, free_usb_hub(), usb_port::hub, list_empty, list_for_each_entry, port, usb_device::port, usb_endpoint::usb, usb_changed, and usb_halted.

Referenced by ehci_probe(), ehci_remove(), uhci_probe(), uhci_remove(), usbio_start(), usbio_stop(), xhci_probe(), and xhci_remove().

◆ find_usb_bus_by_location()

struct usb_bus* find_usb_bus_by_location ( unsigned int  bus_type,
unsigned int  location 
)

Find USB bus by device location.

Parameters
bus_typeBus type
locationBus location
Return values
busUSB bus, or NULL

Definition at line 2154 of file usb.c.

2155  {
2156  struct usb_bus *bus;
2157 
2158  for_each_usb_bus ( bus ) {
2159  if ( ( bus->dev->desc.bus_type == bus_type ) &&
2160  ( bus->dev->desc.location == location ) )
2161  return bus;
2162  }
2163 
2164  return NULL;
2165 }
#define for_each_usb_bus(bus)
Iterate over all USB buses.
Definition: usb.h:1054
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
A USB bus.
Definition: usb.h:949
uint8_t bus
Bus.
Definition: edd.h:14

References bus, for_each_usb_bus, and NULL.

Referenced by uhci_root_speed().

◆ usb_alloc_address()

int usb_alloc_address ( struct usb_bus bus)

Allocate device address.

Parameters
busUSB bus
Return values
addressDevice address, or negative error

Definition at line 2180 of file usb.c.

2180  {
2181  unsigned int address;
2182 
2183  /* Find first free device address */
2184  address = ffsll ( ~bus->addresses );
2185  if ( ! address )
2186  return -ENOENT;
2187 
2188  /* Mark address as used */
2189  bus->addresses |= ( 1ULL << ( address - 1 ) );
2190 
2191  return address;
2192 }
uint64_t address
Base address.
Definition: ena.h:24
#define ENOENT
No such file or directory.
Definition: errno.h:514
#define ffsll(x)
Find first (i.e.
Definition: strings.h:122
uint8_t bus
Bus.
Definition: edd.h:14

References address, bus, ENOENT, and ffsll.

Referenced by ehci_device_address(), and uhci_device_address().

◆ usb_free_address()

void usb_free_address ( struct usb_bus bus,
unsigned int  address 
)

Free device address.

Parameters
busUSB bus
addressDevice address

Definition at line 2200 of file usb.c.

2200  {
2201 
2202  /* Sanity check */
2203  assert ( address > 0 );
2204  assert ( bus->addresses & ( 1ULL << ( address - 1 ) ) );
2205 
2206  /* Mark address as free */
2207  bus->addresses &= ~( 1ULL << ( address - 1 ) );
2208 }
uint64_t address
Base address.
Definition: ena.h:24
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
uint8_t bus
Bus.
Definition: edd.h:14

References address, assert(), and bus.

Referenced by ehci_device_address(), ehci_device_close(), uhci_device_address(), and uhci_device_close().

◆ usb_route_string()

unsigned int usb_route_string ( struct usb_device usb)

Get USB route string.

Parameters
usbUSB device
Return values
routeUSB route string

Definition at line 2223 of file usb.c.

2223  {
2224  struct usb_device *parent;
2225  unsigned int route;
2226 
2227  /* Navigate up to root hub, constructing route string as we go */
2228  for ( route = 0 ; ( parent = usb->port->hub->usb ) ; usb = parent ) {
2229  route <<= 4;
2230  route |= ( ( usb->port->address > 0xf ) ?
2231  0xf : usb->port->address );
2232  }
2233 
2234  return route;
2235 }
struct usb_device * usb
Underlying USB device, if any.
Definition: usb.h:830
struct usb_port * port
USB port.
Definition: usb.h:710
void route(void)
Print routing table.
Definition: route.c:39
A USB device.
Definition: usb.h:706
unsigned int address
Port address.
Definition: usb.h:800
struct usb_hub * hub
USB hub.
Definition: usb.h:798

References usb_port::address, usb_port::hub, usb_device::port, route(), and usb_hub::usb.

Referenced by xhci_device_address().

◆ usb_depth()

unsigned int usb_depth ( struct usb_device usb)

Get USB depth.

Parameters
usbUSB device
Return values
depthHub depth

Definition at line 2243 of file usb.c.

2243  {
2244  struct usb_device *parent;
2245  unsigned int depth;
2246 
2247  /* Navigate up to root hub, constructing depth as we go */
2248  for ( depth = 0 ; ( parent = usb->port->hub->usb ) ; usb = parent )
2249  depth++;
2250 
2251  return depth;
2252 }
struct usb_device * usb
Underlying USB device, if any.
Definition: usb.h:830
struct usb_port * port
USB port.
Definition: usb.h:710
A USB device.
Definition: usb.h:706
struct usb_hub * hub
USB hub.
Definition: usb.h:798

References usb_port::hub, usb_device::port, and usb_hub::usb.

Referenced by efi_usb_install(), and hub_probe().

◆ usb_root_hub_port()

struct usb_port* usb_root_hub_port ( struct usb_device usb)

Get USB root hub port.

Parameters
usbUSB device
Return values
portRoot hub port

Definition at line 2260 of file usb.c.

2260  {
2261  struct usb_device *parent;
2262 
2263  /* Navigate up to root hub */
2264  while ( ( parent = usb->port->hub->usb ) )
2265  usb = parent;
2266 
2267  return usb->port;
2268 }
struct usb_device * usb
Underlying USB device, if any.
Definition: usb.h:830
struct usb_port * port
USB port.
Definition: usb.h:710
A USB device.
Definition: usb.h:706
struct usb_hub * hub
USB hub.
Definition: usb.h:798

References usb_port::hub, usb_device::port, and usb_hub::usb.

Referenced by xhci_device_address().

◆ usb_transaction_translator()

struct usb_port* usb_transaction_translator ( struct usb_device usb)

Get USB transaction translator.

Parameters
usbUSB device
Return values
portTransaction translator port, or NULL

Definition at line 2276 of file usb.c.

2276  {
2277  struct usb_device *parent;
2278 
2279  /* Navigate up to root hub. If we find a low-speed or
2280  * full-speed device with a higher-speed parent hub, then that
2281  * device's port is the transaction translator.
2282  */
2283  for ( ; ( parent = usb->port->hub->usb ) ; usb = parent ) {
2284  if ( ( usb->speed <= USB_SPEED_FULL ) &&
2285  ( parent->speed > USB_SPEED_FULL ) )
2286  return usb->port;
2287  }
2288 
2289  return NULL;
2290 }
unsigned int speed
Device speed.
Definition: usb.h:712
struct usb_device * usb
Underlying USB device, if any.
Definition: usb.h:830
struct usb_port * port
USB port.
Definition: usb.h:710
A USB device.
Definition: usb.h:706
struct usb_hub * hub
USB hub.
Definition: usb.h:798
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
Full speed (12Mbps)
Definition: usb.h:50

References usb_port::hub, NULL, usb_device::port, usb_device::speed, usb_hub::usb, and USB_SPEED_FULL.

Referenced by ehci_endpoint_capabilities(), usb_endpoint_clear_tt(), and xhci_device_open().

◆ usb_find_driver()

struct usb_driver* usb_find_driver ( struct usb_function_descriptor desc,
struct usb_device_id **  id 
)

Find USB device driver.

Parameters
descFunction descriptor
Return values
idUSB device ID, or NULL
driverUSB device driver, or NULL

Definition at line 1130 of file usb.c.

1131  {
1132  struct usb_driver *driver;
1133  unsigned int i;
1134 
1135  /* Look for a matching driver */
1136  for_each_table_entry ( driver, USB_DRIVERS ) {
1137  for ( i = 0 ; i < driver->id_count ; i++ ) {
1138 
1139  /* Ignore non-matching driver class */
1140  if ( ( driver->class.class.scalar ^ desc->class.scalar )
1141  & driver->class.mask.scalar )
1142  continue;
1143 
1144  /* Look for a matching ID */
1145  *id = &driver->ids[i];
1146  if ( ( ( (*id)->vendor == desc->vendor ) ||
1147  ( (*id)->vendor == USB_ANY_ID ) ) &&
1148  ( ( (*id)->product == desc->product ) ||
1149  ( (*id)->product == USB_ANY_ID ) ) )
1150  return driver;
1151  }
1152  }
1153 
1154  /* Not found */
1155  *id = NULL;
1156  return NULL;
1157 }
A USB driver.
Definition: usb.h:1363
union usb_class_descriptor mask
Class mask.
Definition: usb.h:1336
uint16_t vendor
Vendor ID.
Definition: usb.h:642
union usb_class_descriptor class
Class.
Definition: usb.h:646
union usb_class_descriptor class
Class.
Definition: usb.h:1334
uint16_t product
Product ID.
Definition: usb.h:644
struct usb_class_id class
Class ID.
Definition: usb.h:1369
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:358
uint32_t scalar
Scalar value.
Definition: usb.h:631
#define USB_ANY_ID
Match-anything ID.
Definition: usb.h:1329
unsigned int id_count
Number of entries in ID table.
Definition: usb.h:1367
#define USB_DRIVERS
USB driver table.
Definition: usb.h:1394
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
struct usb_device_id * ids
USB ID table.
Definition: usb.h:1365

References usb_function_descriptor::class, usb_class_id::class, usb_driver::class, for_each_table_entry, usb_driver::id_count, usb_driver::ids, usb_class_id::mask, NULL, usb_function_descriptor::product, usb_class_descriptor::scalar, USB_ANY_ID, USB_DRIVERS, and usb_function_descriptor::vendor.

Referenced by usb_probe(), usb_score(), and usbio_supported().

Variable Documentation

◆ usb_buses

struct list_head usb_buses

List of USB buses.

Definition at line 44 of file usb.c.

Referenced by register_usb_bus().