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

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)
 FILE_SECBOOT (PERMITTED)
static struct usb_descriptor_headerusb_next_descriptor (struct usb_descriptor_header *desc)
 Get next USB descriptor.
static int usb_is_within_config (struct usb_configuration_descriptor *config, struct usb_descriptor_header *desc)
 Check that descriptor lies within a configuration descriptor.
static void usb_endpoint_init (struct usb_endpoint *ep, struct usb_device *usb, struct usb_endpoint_driver_operations *driver)
 Initialise USB endpoint.
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.
static void usb_endpoint_set_hostdata (struct usb_endpoint *ep, void *priv)
 Set USB endpoint host controller private data.
static void * usb_endpoint_get_hostdata (struct usb_endpoint *ep)
 Get USB endpoint host controller private data.
const char * usb_endpoint_name (struct usb_endpoint *ep)
 Get USB endpoint name (for debugging)
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.
int usb_endpoint_open (struct usb_endpoint *ep)
 Open USB endpoint.
int usb_endpoint_clear_halt (struct usb_endpoint *ep)
 Clear endpoint halt (if applicable)
void usb_endpoint_close (struct usb_endpoint *ep)
 Close USB endpoint.
int usb_message (struct usb_endpoint *ep, unsigned int request, unsigned int value, unsigned int index, struct io_buffer *iobuf)
 Enqueue USB message transfer.
int usb_stream (struct usb_endpoint *ep, struct io_buffer *iobuf, int terminate)
 Enqueue USB stream transfer.
void usb_complete_err (struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
 Complete transfer (possibly with error)
static void usb_refill_init (struct usb_endpoint *ep, size_t reserve, size_t len, unsigned int max)
 Initialise USB endpoint refill.
static void usb_recycle (struct usb_endpoint *ep, struct io_buffer *iobuf)
 Recycle I/O buffer.
int usb_prefill (struct usb_endpoint *ep)
 Prefill endpoint recycled buffer list.
int usb_refill_limit (struct usb_endpoint *ep, unsigned int max)
 Refill endpoint up to specified limit.
int usb_refill (struct usb_endpoint *ep)
 Refill endpoint.
void usb_flush (struct usb_endpoint *ep)
 Discard endpoint recycled buffer list.
static void usb_func_set_drvdata (struct usb_function *func, void *priv)
 Set USB function driver private data.
static void * usb_func_get_drvdata (struct usb_function *func)
 Get USB function driver private data.
static void usb_set_hostdata (struct usb_device *usb, void *priv)
 Set USB device host controller private data.
static void * usb_get_hostdata (struct usb_device *usb)
 Get USB device host controller private data.
static struct usb_endpoint * usb_endpoint (struct usb_device *usb, unsigned int address)
 Get USB endpoint.
static void usb_hub_set_drvdata (struct usb_hub *hub, void *priv)
 Set USB hub driver private data.
static void * usb_hub_get_drvdata (struct usb_hub *hub)
 Get USB hub driver private data.
static struct usb_port * usb_port (struct usb_hub *hub, unsigned int address)
 Get USB port.
static void usb_bus_set_hostdata (struct usb_bus *bus, void *priv)
 Set USB bus host controller private data.
static void * usb_bus_get_hostdata (struct usb_bus *bus)
 Get USB bus host controller private data.
static void usb_poll (struct usb_bus *bus)
 Poll USB bus.
static void usb_complete (struct usb_endpoint *ep, struct io_buffer *iobuf)
 Complete transfer (without error)
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.
int usb_get_string_descriptor (struct usb_device *usb, unsigned int index, unsigned int language, char *buf, size_t len)
 Get USB string descriptor.
static int usb_get_status (struct usb_device *usb, unsigned int type, unsigned int index, void *data, size_t len)
 Get status.
static int usb_clear_feature (struct usb_device *usb, unsigned int type, unsigned int feature, unsigned int index)
 Clear feature.
static int usb_set_feature (struct usb_device *usb, unsigned int type, unsigned int feature, unsigned int index)
 Set feature.
static int usb_set_address (struct usb_device *usb, unsigned int address)
 Set address.
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.
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)
static int usb_get_device_descriptor (struct usb_device *usb, struct usb_device_descriptor *data)
 Get USB device descriptor.
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.
static int usb_set_configuration (struct usb_device *usb, unsigned int index)
 Set USB configuration.
static int usb_set_interface (struct usb_device *usb, unsigned int interface, unsigned int alternate)
 Set USB interface alternate setting.
static unsigned int usb_depth (struct usb_device *usb)
 Get USB depth.
struct usb_interface_descriptor * usb_interface_descriptor (struct usb_configuration_descriptor *config, unsigned int interface, unsigned int alternate)
 Locate USB interface 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.
struct usb_endpoint_companion_descriptor * usb_endpoint_companion_descriptor (struct usb_configuration_descriptor *config, struct usb_endpoint_descriptor *desc)
 Locate USB endpoint companion descriptor.
struct usb_devicefind_usb (struct usb_bus *bus, unsigned int address)
 Find USB device by address.
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.
int register_usb_hub (struct usb_hub *hub)
 Register USB hub.
void unregister_usb_hub (struct usb_hub *hub)
 Unregister USB hub.
void free_usb_hub (struct usb_hub *hub)
 Free USB hub.
void usb_port_changed (struct usb_port *port)
 Report port status change.
struct usb_busalloc_usb_bus (struct device *dev, unsigned int ports, size_t mtu, struct usb_host_operations *op)
 Allocate USB bus.
int register_usb_bus (struct usb_bus *bus)
 Register USB bus.
void unregister_usb_bus (struct usb_bus *bus)
 Unregister USB bus.
void free_usb_bus (struct usb_bus *bus)
 Free USB bus.
struct usb_busfind_usb_bus (unsigned int address)
 Find USB bus by address.
struct usb_busfind_usb_bus_by_location (unsigned int bus_type, unsigned int location)
 Find USB bus by device location.
int usb_alloc_address (struct usb_bus *bus)
 Allocate device address.
void usb_free_address (struct usb_bus *bus, unsigned int address)
 Free device address.
int usb_find_next (struct usb_device **usb, uint16_t *busdev)
 Find next USB device.
unsigned int usb_route_string (struct usb_device *usb)
 Get USB route string.
struct usb_portusb_root_hub_port (struct usb_device *usb)
 Get USB root hub port.
struct usb_portusb_transaction_translator (struct usb_device *usb)
 Get USB transaction translator.
struct usb_driverusb_find_driver (struct usb_function_descriptor *desc, struct usb_device_id **id)
 Find USB device driver.

Variables

struct list_head usb_buses
 List of USB buses.

Detailed Description

Universal Serial Bus (USB)

Definition in file usb.h.

Macro Definition Documentation

◆ USB_SPEED

#define USB_SPEED ( mantissa,
exponent )
Value:
( (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 36 of file usb.h.

Referenced by xhci_port_psiv(), and xhci_port_speed().

◆ USB_SPEED_MANTISSA

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

Extract USB speed mantissa.

Definition at line 39 of file usb.h.

Referenced by usb_speed_name().

◆ USB_SPEED_EXPONENT

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

Extract USB speed exponent.

Definition at line 42 of file usb.h.

Referenced by usb_speed_name().

◆ USB_BUSDEV

#define USB_BUSDEV ( bus,
dev )
Value:
( ( (bus) << 8 ) | (dev) )
uint8_t bus
Bus.
Definition edd.h:1

Define a USB bus:device address.

Parameters
busBus address
devDevice address
Return values
busdevBus:device address

Definition at line 64 of file usb.h.

Referenced by usb_probe_all().

◆ USB_BUS

#define USB_BUS ( busdev)
Value:
( (busdev) >> 8 )

Extract USB bus address.

Definition at line 67 of file usb.h.

Referenced by usb_find_next(), and usb_settings_fetch().

◆ USB_DEV

#define USB_DEV ( busdev)
Value:
( (busdev) & 0xff )

Extract USB device address.

Definition at line 70 of file usb.h.

Referenced by usb_find_next(), and usb_settings_fetch().

◆ USB_DIR_OUT

#define USB_DIR_OUT   ( 0 << 7 )

Data transfer is from host to device.

Definition at line 95 of file usb.h.

◆ USB_DIR_IN

◆ USB_TYPE_STANDARD

#define USB_TYPE_STANDARD   ( 0 << 5 )

Standard request type.

Definition at line 101 of file usb.h.

◆ USB_TYPE_CLASS

#define USB_TYPE_CLASS   ( 1 << 5 )

Class-specific request type.

Definition at line 104 of file usb.h.

Referenced by usb_hub_clear_port_feature(), usb_hub_get_descriptor(), usb_hub_get_port_status(), and usb_hub_set_port_feature().

◆ USB_TYPE_VENDOR

#define USB_TYPE_VENDOR   ( 2 << 5 )

Vendor-specific request type.

Definition at line 107 of file usb.h.

◆ USB_RECIP_MASK

#define USB_RECIP_MASK   ( 0x1f << 0 )

Request recipient mask.

Definition at line 110 of file usb.h.

Referenced by usbio_control_poll().

◆ USB_RECIP_DEVICE

#define USB_RECIP_DEVICE   ( 0 << 0 )

Request recipient is the device.

Definition at line 113 of file usb.h.

◆ USB_RECIP_INTERFACE

#define USB_RECIP_INTERFACE   ( 1 << 0 )

Request recipient is an interface.

Definition at line 116 of file usb.h.

Referenced by usbio_control_poll().

◆ USB_RECIP_ENDPOINT

#define USB_RECIP_ENDPOINT   ( 2 << 0 )

Request recipient is an endpoint.

Definition at line 119 of file usb.h.

Referenced by usb_endpoint_clear_halt().

◆ USB_REQUEST_TYPE

#define USB_REQUEST_TYPE ( type)
Value:
( (type) << 8 )
uint32_t type
Operating system type.
Definition ena.h:1

Construct USB request type.

Definition at line 122 of file usb.h.

Referenced by efi_usb_control_transfer().

◆ USB_GET_STATUS

#define USB_GET_STATUS   ( USB_DIR_IN | USB_REQUEST_TYPE ( 0 ) )

Get status.

Definition at line 125 of file usb.h.

Referenced by usb_get_status().

◆ USB_CLEAR_FEATURE

#define USB_CLEAR_FEATURE   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 1 ) )

Clear feature.

Definition at line 128 of file usb.h.

Referenced by usb_clear_feature().

◆ USB_SET_FEATURE

#define USB_SET_FEATURE   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 3 ) )

Set feature.

Definition at line 131 of file usb.h.

Referenced by usb_set_feature().

◆ USB_SET_ADDRESS

#define USB_SET_ADDRESS   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 5 ) )

Set address.

Definition at line 134 of file usb.h.

Referenced by usb_set_address().

◆ USB_GET_DESCRIPTOR

#define USB_GET_DESCRIPTOR   ( USB_DIR_IN | USB_REQUEST_TYPE ( 6 ) )

Get descriptor.

Definition at line 137 of file usb.h.

Referenced by usb_get_descriptor(), and usbio_config().

◆ USB_SET_DESCRIPTOR

#define USB_SET_DESCRIPTOR   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 7 ) )

Set descriptor.

Definition at line 140 of file usb.h.

◆ USB_GET_CONFIGURATION

#define USB_GET_CONFIGURATION   ( USB_DIR_IN | USB_REQUEST_TYPE ( 8 ) )

Get configuration.

Definition at line 143 of file usb.h.

◆ USB_SET_CONFIGURATION

#define USB_SET_CONFIGURATION   ( USB_DIR_OUT | USB_REQUEST_TYPE ( 9 ) )

Set configuration.

Definition at line 146 of file usb.h.

Referenced by efi_usb_control_transfer(), usb_set_configuration(), and usbio_control_poll().

◆ USB_GET_INTERFACE

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

Get interface.

Definition at line 149 of file usb.h.

149#define USB_GET_INTERFACE \
150 ( USB_DIR_IN | USB_RECIP_INTERFACE | USB_REQUEST_TYPE ( 10 ) )

◆ USB_SET_INTERFACE

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

Set interface.

Definition at line 153 of file usb.h.

153#define USB_SET_INTERFACE \
154 ( USB_DIR_OUT | USB_RECIP_INTERFACE | USB_REQUEST_TYPE ( 11 ) )

Referenced by efi_usb_control_transfer(), and usb_set_interface().

◆ USB_ENDPOINT_HALT

#define USB_ENDPOINT_HALT   0

Endpoint halt feature.

Definition at line 157 of file usb.h.

Referenced by usb_endpoint_clear_halt().

◆ USB_CLASS_HUB

#define USB_CLASS_HUB   9

Class code for USB hubs.

Definition at line 170 of file usb.h.

◆ USB_DEVICE_DESCRIPTOR

#define USB_DEVICE_DESCRIPTOR   1

A USB device descriptor.

Definition at line 207 of file usb.h.

Referenced by usb_get_device_descriptor(), and usb_get_mtu().

◆ USB_CONFIGURATION_DESCRIPTOR

#define USB_CONFIGURATION_DESCRIPTOR   2

A USB configuration descriptor.

Definition at line 228 of file usb.h.

Referenced by usb_get_config_descriptor(), and usbio_config().

◆ USB_STRING_DESCRIPTOR

#define USB_STRING_DESCRIPTOR   3

A USB string descriptor.

Definition at line 239 of file usb.h.

Referenced by efi_usb_get_string_descriptor(), efi_usb_probe(), usb_get_default_language(), and usb_get_string_descriptor().

◆ USB_LANG_ENGLISH

#define USB_LANG_ENGLISH   0x0409

Language ID for English.

Definition at line 242 of file usb.h.

Referenced by usb_get_default_language().

◆ USB_INTERFACE_DESCRIPTOR

#define USB_INTERFACE_DESCRIPTOR   4

A USB interface descriptor.

Definition at line 261 of file usb.h.

Referenced by usb_interface_descriptor(), and usbio_interface().

◆ USB_ENDPOINT_DESCRIPTOR

#define USB_ENDPOINT_DESCRIPTOR   5

A USB endpoint descriptor.

Definition at line 278 of file usb.h.

Referenced by efi_usb_get_endpoint_descriptor(), efi_usb_mtu(), usb_endpoint_descriptor(), and usbio_interface().

◆ USB_ENDPOINT_ATTR_TYPE_MASK

◆ USB_ENDPOINT_ATTR_PERIODIC

#define USB_ENDPOINT_ATTR_PERIODIC   0x01

Endpoint periodic type.

Definition at line 284 of file usb.h.

Referenced by usb_endpoint_clear_tt().

◆ USB_ENDPOINT_ATTR_CONTROL

#define USB_ENDPOINT_ATTR_CONTROL   0x00

Control endpoint transfer type.

Definition at line 287 of file usb.h.

Referenced by ehci_endpoint_characteristics(), usb_endpoint_clear_halt(), usbio_endpoint_open(), and xhci_endpoint_open().

◆ USB_ENDPOINT_ATTR_BULK

#define USB_ENDPOINT_ATTR_BULK   0x02

Bulk endpoint transfer type.

Definition at line 290 of file usb.h.

Referenced by efi_usb_bulk_transfer(), and usbio_endpoint_open().

◆ USB_ENDPOINT_ATTR_INTERRUPT

#define USB_ENDPOINT_ATTR_INTERRUPT   0x03

◆ USB_BULK_OUT

#define USB_BULK_OUT   ( USB_ENDPOINT_ATTR_BULK | USB_DIR_OUT )

Bulk OUT endpoint (internal) type.

Definition at line 296 of file usb.h.

Referenced by usbblk_probe(), and usbnet_data_describe().

◆ USB_BULK_IN

#define USB_BULK_IN   ( USB_ENDPOINT_ATTR_BULK | USB_DIR_IN )

Bulk IN endpoint (internal) type.

Definition at line 299 of file usb.h.

Referenced by usbblk_probe(), and usbnet_data_describe().

◆ USB_INTERRUPT_IN

#define USB_INTERRUPT_IN   ( USB_ENDPOINT_ATTR_INTERRUPT | USB_DIR_IN )

Interrupt IN endpoint (internal) type.

Definition at line 302 of file usb.h.

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

◆ USB_INTERRUPT_OUT

#define USB_INTERRUPT_OUT   ( USB_ENDPOINT_ATTR_INTERRUPT | USB_DIR_OUT )

Interrupt OUT endpoint (internal) type.

Definition at line 305 of file usb.h.

Referenced by usbhid_describe().

◆ USB_ENDPOINT_MTU

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

USB endpoint MTU.

Definition at line 308 of file usb.h.

Referenced by efi_usb_mtu(), and usb_endpoint_described().

◆ USB_ENDPOINT_BURST

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

USB endpoint maximum burst size.

Definition at line 311 of file usb.h.

Referenced by usb_endpoint_described().

◆ USB_ENDPOINT_COMPANION_DESCRIPTOR

#define USB_ENDPOINT_COMPANION_DESCRIPTOR   48

A USB endpoint companion descriptor.

Definition at line 326 of file usb.h.

Referenced by usb_endpoint_companion_descriptor().

◆ USB_INTERFACE_ASSOCIATION_DESCRIPTOR

#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR   11

A USB interface association descriptor.

Definition at line 343 of file usb.h.

Referenced by usb_interface_association_descriptor().

◆ USB_CS_INTERFACE_DESCRIPTOR

#define USB_CS_INTERFACE_DESCRIPTOR   36

A class-specific interface descriptor.

Definition at line 346 of file usb.h.

Referenced by cdc_union_descriptor(), and ecm_ethernet_descriptor().

◆ USB_CS_ENDPOINT_DESCRIPTOR

#define USB_CS_ENDPOINT_DESCRIPTOR   37

A class-specific endpoint descriptor.

Definition at line 349 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 ) ; \
typeof ( *desc ), header ) )
typeof(acpi_finder=acpi_find)
ACPI table finder.
Definition acpi.c:48
struct ena_llq_option header
Header locations.
Definition ena.h:5
struct ena_llq_option desc
Descriptor counts.
Definition ena.h:9
static struct usb_descriptor_header * usb_next_descriptor(struct usb_descriptor_header *desc)
Get next USB descriptor.
Definition usb.h:358
#define container_of(ptr, type, field)
Get containing structure.
Definition stddef.h:36

Iterate over all configuration descriptors.

Definition at line 386 of file usb.h.

386#define for_each_config_descriptor( desc, config ) \
387 for ( desc = container_of ( &(config)->header, \
388 typeof ( *desc ), header ) ; \
389 usb_is_within_config ( (config), &desc->header ) ; \
390 desc = container_of ( usb_next_descriptor ( &desc->header ), \
391 typeof ( *desc ), header ) )

Referenced by usb_interface_association_descriptor(), usb_interface_descriptor(), and usbio_interface().

◆ 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 ) ) ; \
typeof ( *desc ), header ) )
#define USB_INTERFACE_DESCRIPTOR
A USB interface descriptor.
Definition usb.h:261
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:371
An object interface.
Definition interface.h:125

Iterate over all configuration descriptors within an interface descriptor.

Definition at line 394 of file usb.h.

394#define for_each_interface_descriptor( desc, config, interface ) \
395 for ( desc = container_of ( usb_next_descriptor ( &(interface)-> \
396 header ), \
397 typeof ( *desc ), header ) ; \
398 ( usb_is_within_config ( (config), &desc->header ) && \
399 ( desc->header.type != USB_INTERFACE_DESCRIPTOR ) ) ; \
400 desc = container_of ( usb_next_descriptor ( &desc->header ), \
401 typeof ( *desc ), header ) )

Referenced by cdc_union_descriptor(), ecm_ethernet_descriptor(), efi_usb_get_endpoint_descriptor(), efi_usb_mtu(), usb_endpoint_descriptor(), and usbio_interface().

◆ USB_EP0_ADDRESS

#define USB_EP0_ADDRESS   0x00

Control endpoint address.

Definition at line 501 of file usb.h.

Referenced by ehci_device_address(), register_usb(), uhci_device_address(), usb_deconfigure(), and usbio_interface().

◆ USB_EP0_ATTRIBUTES

#define USB_EP0_ATTRIBUTES   0x00

Control endpoint attributes.

Definition at line 504 of file usb.h.

Referenced by register_usb().

◆ USB_EP0_DEFAULT_MTU

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

Calculate default MTU based on device speed.

Parameters
speedDevice speed
Return values
mtuDefault MTU

Definition at line 511 of file usb.h.

511#define USB_EP0_DEFAULT_MTU(speed) \
512 ( ( (speed) >= USB_SPEED_SUPER ) ? 512 : \
513 ( ( (speed) >= USB_SPEED_FULL ) ? 64 : 8 ) )

Referenced by register_usb().

◆ USB_EP0_BURST

#define USB_EP0_BURST   0

Control endpoint maximum burst size.

Definition at line 516 of file usb.h.

Referenced by register_usb().

◆ USB_EP0_INTERVAL

#define USB_EP0_INTERVAL   0

Control endpoint interval.

Definition at line 519 of file usb.h.

Referenced by register_usb().

◆ USB_ENDPOINT_MAX

#define USB_ENDPOINT_MAX   0x0f

Maximum endpoint number.

Definition at line 522 of file usb.h.

Referenced by usb_endpoint_name(), and usb_hub_clear_tt_buffer().

◆ USB_ENDPOINT_IN

◆ USB_ENDPOINT_IDX

#define USB_ENDPOINT_IDX ( address)
Value:
( ( (address) & USB_ENDPOINT_MAX ) | \
( ( (address) & USB_ENDPOINT_IN ) >> 3 ) )
uint64_t address
Base address.
Definition ena.h:13
#define USB_ENDPOINT_MAX
Maximum endpoint number.
Definition usb.h:522
#define USB_ENDPOINT_IN
Endpoint direction is in.
Definition usb.h:525

Construct endpoint index from endpoint address.

Definition at line 528 of file usb.h.

528#define USB_ENDPOINT_IDX(address) \
529 ( ( (address) & USB_ENDPOINT_MAX ) | \
530 ( ( (address) & USB_ENDPOINT_IN ) >> 3 ) )

Referenced by efi_usb_async_start(), efi_usb_async_stop(), efi_usb_close(), efi_usb_is_open(), efi_usb_open(), efi_usb_sync_transfer(), usb_deconfigure(), usb_endpoint(), usb_endpoint_close(), and usb_endpoint_open().

◆ for_each_usb_bus

#define for_each_usb_bus ( bus)
Value:
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition list.h:432
struct list_head usb_buses
List of USB buses.
Definition usb.c:45

Iterate over all USB buses.

Definition at line 1077 of file usb.h.

1077#define for_each_usb_bus( bus ) \
1078 list_for_each_entry ( (bus), &usb_buses, list )

Referenced by ehci_poll_companions(), find_usb_bus(), find_usb_bus_by_location(), and usb_step().

◆ 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 1328 of file usb.h.

Referenced by ehci_root_enable(), and uhci_root_enable().

◆ 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 1335 of file usb.h.

Referenced by register_usb(), and uhci_root_enable().

◆ 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 1342 of file usb.h.

Referenced by usb_control().

◆ 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 1349 of file usb.h.

Referenced by register_usb().

◆ 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 1358 of file usb.h.

Referenced by register_usb_hub().

◆ USB_ID

#define USB_ID ( _vendor,
_product,
_name,
_description,
_data )
Value:
{ \
.vendor = _vendor, \
.product = _product, \
.name = _name, \
.driver_data = _data \
}

Definition at line 1373 of file usb.h.

1373#define USB_ID( _vendor, _product, _name, _description, _data ) { \
1374 .vendor = _vendor, \
1375 .product = _product, \
1376 .name = _name, \
1377 .driver_data = _data \
1378}

◆ USB_ROM

#define USB_ROM ( _vendor,
_product,
_name,
_description,
_data )
Value:
USB_ID ( _vendor, _product, _name, _description, _data )
#define USB_ID(_vendor, _product, _name, _description, _data)
Definition usb.h:1373

Definition at line 1381 of file usb.h.

1381#define USB_ROM( _vendor, _product, _name, _description, _data ) \
1382 USB_ID ( _vendor, _product, _name, _description, _data )

◆ USB_ANY_ID

#define USB_ANY_ID   0xffff

Match-anything ID.

Definition at line 1385 of file usb.h.

Referenced by usb_find_driver().

◆ 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 ), \
}, \
}, \
}
#define USB_ANY_ID
Match-anything ID.
Definition usb.h:1385
uint32_t base
Base.
Definition librm.h:3
uint16_t protocol
Protocol ID.
Definition stp.h:7

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 1401 of file usb.h.

1401#define USB_CLASS_ID( base, subclass, protocol ) { \
1402 .class = { \
1403 .class = { \
1404 ( (base) & 0xff ), \
1405 ( (subclass) & 0xff ), \
1406 ( (protocol) & 0xff ), \
1407 }, \
1408 }, \
1409 .mask = { \
1410 .class = { \
1411 ( ( (base) == USB_ANY_ID ) ? 0x00 : 0xff ), \
1412 ( ( (subclass) == USB_ANY_ID ) ? 0x00 : 0xff ), \
1413 ( ( (protocol) == USB_ANY_ID ) ? 0x00 : 0xff ), \
1414 }, \
1415 }, \
1416 }

◆ USB_DRIVERS

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

USB driver table.

Definition at line 1450 of file usb.h.

Referenced by usb_find_driver().

◆ __usb_driver

struct usb_driver iphone_driver __usb_driver   __table_entry ( USB_DRIVERS, 01 )

Declare a USB driver.

iPhone driver

USB RF-RNDIS driver.

Definition at line 1453 of file usb.h.

◆ __usb_fallback_driver

#define __usb_fallback_driver   __table_entry ( USB_DRIVERS, 02 )

Declare a USB fallback driver.

Definition at line 1456 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 21 of file usb.h.

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

◆ 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 45 of file usb.h.

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

◆ 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 73 of file usb.h.

73 {
74 /** IN PID */
75 USB_PID_IN = 0x69,
76 /** OUT PID */
77 USB_PID_OUT = 0xe1,
78 /** SETUP PID */
79 USB_PID_SETUP = 0x2d,
80};
@ USB_PID_IN
IN PID.
Definition usb.h:75
@ USB_PID_OUT
OUT PID.
Definition usb.h:77
@ USB_PID_SETUP
SETUP PID.
Definition usb.h:79

◆ 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 1459 of file usb.h.

1459 {
1460 /** Fallback driver (has no effect on overall score) */
1462 /** Deprecated driver */
1464 /** Normal driver */
1465 USB_SCORE_NORMAL = 2,
1466};
@ USB_SCORE_FALLBACK
Fallback driver (has no effect on overall score)
Definition usb.h:1461
@ USB_SCORE_NORMAL
Normal driver.
Definition usb.h:1465
@ USB_SCORE_DEPRECATED
Deprecated driver.
Definition usb.h:1463

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ usb_next_descriptor()

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 358 of file usb.h.

358 {
359
360 return ( ( ( void * ) desc ) + desc->len );
361}

References desc.

Referenced by usb_endpoint_companion_descriptor(), and usb_is_within_config().

◆ usb_is_within_config()

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 371 of file usb.h.

372 {
373 struct usb_descriptor_header *end =
374 ( ( ( void * ) config ) + le16_to_cpu ( config->len ) );
375
376 /* Check that descriptor starts within the configuration
377 * descriptor, and that the length does not exceed the
378 * configuration descriptor. This relies on the fact that
379 * usb_next_descriptor() needs to access only the first byte
380 * of the descriptor in order to determine the length.
381 */
382 return ( ( desc < end ) && ( usb_next_descriptor ( desc ) <= end ) );
383}
#define le16_to_cpu(value)
Definition byteswap.h:113
uint32_t end
Ending offset.
Definition netvsc.h:7
uint16_t len
Total length.
Definition usb.h:214
A USB descriptor header.
Definition usb.h:173

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

Referenced by usb_endpoint_companion_descriptor().

◆ usb_endpoint_init()

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 540 of file usb.h.

541 {
542
543 ep->usb = usb;
544 ep->driver = driver;
545}
struct usb_device * usb
USB device.
Definition usb.h:406
struct usb_endpoint_driver_operations * driver
Driver operations.
Definition usb.h:431

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

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

◆ usb_endpoint_describe()

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 558 of file usb.h.

560 {
561
562 ep->address = address;
563 ep->attributes = attributes;
564 ep->mtu = mtu;
565 ep->burst = burst;
566 ep->interval = interval;
567}
uint16_t burst
Maximum burst size.
Definition ena.h:17
uint32_t mtu
Maximum MTU.
Definition ena.h:17
size_t mtu
Maximum transfer size.
Definition usb.h:412
unsigned int attributes
Attributes.
Definition usb.h:410
unsigned int burst
Maximum burst size.
Definition usb.h:414
unsigned int interval
Interval (in microframes)
Definition usb.h:416
unsigned int address
Endpoint address.
Definition usb.h:408

References address, usb_endpoint::address, usb_endpoint::attributes, burst, 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()

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 576 of file usb.h.

576 {
577 ep->priv = priv;
578}
void * priv
Host controller private data.
Definition usb.h:429
static struct tlan_private * priv
Definition tlan.c:225

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()

void * usb_endpoint_get_hostdata ( struct usb_endpoint * ep)
inlinestatic

◆ usb_endpoint_name()

const char * usb_endpoint_name ( struct usb_endpoint * ep)
extern

Get USB endpoint name (for debugging)

Parameters
epUSB endpoint
Return values
nameEndpoint name

Definition at line 221 of file usb.c.

221 {
222 static char buf[ 9 /* "EPxx OUT" + NUL */ ];
223 unsigned int address = ep->address;
224
225 snprintf ( buf, sizeof ( buf ), "EP%d%s",
227 ( address ?
228 ( ( address & USB_ENDPOINT_IN ) ? " IN" : " OUT" ) : "" ));
229 return buf;
230}
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition vsprintf.c:383

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_halt(), 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 )
extern

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 242 of file usb.c.

245 {
246 struct usb_device *usb = ep->usb;
249 unsigned int sizes;
250 unsigned int burst;
251 unsigned int interval;
252 size_t mtu;
253
254 /* Locate endpoint descriptor */
256 if ( ! desc )
257 return -ENOENT;
258
259 /* Locate companion descriptor, if any */
260 descx = usb_endpoint_companion_descriptor ( config, desc );
261
262 /* Calculate MTU and burst size */
263 sizes = le16_to_cpu ( desc->sizes );
264 mtu = USB_ENDPOINT_MTU ( sizes );
265 burst = ( descx ? descx->burst : USB_ENDPOINT_BURST ( sizes ) );
266
267 /* Calculate interval */
270 if ( usb->speed >= USB_SPEED_HIGH ) {
271 /* 2^(desc->interval-1) is a microframe count */
272 interval = ( 1 << ( desc->interval - 1 ) );
273 } else {
274 /* desc->interval is a (whole) frame count */
275 interval = ( desc->interval << 3 );
276 }
277 } else {
278 /* desc->interval is a microframe count */
279 interval = desc->interval;
280 }
281
282 /* Describe endpoint */
283 usb_endpoint_describe ( ep, desc->endpoint, desc->attributes,
284 mtu, burst, interval );
285 return 0;
286}
long index
Definition bigint.h:65
#define ENOENT
No such file or directory.
Definition errno.h:515
#define USB_ENDPOINT_ATTR_INTERRUPT
Interrupt endpoint transfer type.
Definition usb.h:293
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:558
#define USB_ENDPOINT_ATTR_TYPE_MASK
Endpoint attribute transfer type mask.
Definition usb.h:281
#define USB_ENDPOINT_MTU(sizes)
USB endpoint MTU.
Definition usb.h:308
#define USB_ENDPOINT_BURST(sizes)
USB endpoint maximum burst size.
Definition usb.h:311
A USB device.
Definition usb.h:723
struct usb_endpoint * ep[32]
Endpoint list.
Definition usb.h:745
unsigned int speed
Device speed.
Definition usb.h:729
A USB endpoint companion descriptor.
Definition usb.h:314
uint8_t burst
Maximum burst size.
Definition usb.h:318
A USB endpoint descriptor.
Definition usb.h:264
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:195
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:168

References burst, usb_endpoint_companion_descriptor::burst, desc, ENOENT, usb_device::ep, index, le16_to_cpu, mtu, 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(), usbblk_probe(), usbhid_describe(), usbnet_comms_describe(), and usbnet_data_describe().

◆ usb_endpoint_open()

int usb_endpoint_open ( struct usb_endpoint * ep)
extern

Open USB endpoint.

Parameters
epUSB endpoint
Return values
rcReturn status code

Definition at line 294 of file usb.c.

294 {
295 struct usb_device *usb = ep->usb;
296 unsigned int idx = USB_ENDPOINT_IDX ( ep->address );
297 int rc;
298
299 /* Populate host controller operations */
300 ep->host = &usb->port->hub->bus->op->endpoint;
301
302 /* Add to endpoint list */
303 if ( usb->ep[idx] != NULL ) {
304 DBGC ( usb, "USB %s %s is already open\n",
305 usb->name, usb_endpoint_name ( ep ) );
306 rc = -EALREADY;
307 goto err_already;
308 }
309 usb->ep[idx] = ep;
311
312 /* Open endpoint */
313 if ( ( rc = ep->host->open ( ep ) ) != 0 ) {
314 DBGC ( usb, "USB %s %s could not open: %s\n", usb->name,
315 usb_endpoint_name ( ep ), strerror ( rc ) );
316 goto err_open;
317 }
318 ep->open = 1;
319
320 DBGC2 ( usb, "USB %s %s opened with MTU %zd, burst %d, interval %d\n",
321 usb->name, usb_endpoint_name ( ep ), ep->mtu, ep->burst,
322 ep->interval );
323 return 0;
324
325 ep->open = 0;
326 ep->host->close ( ep );
327 err_open:
328 usb->ep[idx] = NULL;
329 err_already:
330 if ( ep->max )
331 usb_flush ( ep );
332 return rc;
333}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
#define DBGC2(...)
Definition compiler.h:522
#define DBGC(...)
Definition compiler.h:505
#define EALREADY
Connection already in progress.
Definition errno.h:324
#define USB_ENDPOINT_IDX(address)
Construct endpoint index from endpoint address.
Definition usb.h:528
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition list.h:46
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
struct usb_host_operations * op
Host controller operations set.
Definition usb.h:972
char name[32]
Name.
Definition usb.h:725
struct usb_port * port
USB port.
Definition usb.h:727
int(* open)(struct usb_endpoint *ep)
Open endpoint.
Definition usb.h:450
void(* close)(struct usb_endpoint *ep)
Close endpoint.
Definition usb.h:455
unsigned int max
Maximum fill level.
Definition usb.h:440
struct list_head halted
List of halted endpoints.
Definition usb.h:424
int open
Endpoint is open.
Definition usb.h:419
struct usb_endpoint_host_operations * host
Host controller operations.
Definition usb.h:427
struct usb_endpoint_host_operations endpoint
Endpoint operations.
Definition usb.h:1033
struct usb_bus * bus
USB bus.
Definition usb.h:845
struct usb_hub * hub
USB hub.
Definition usb.h:815
void usb_flush(struct usb_endpoint *ep)
Discard endpoint recycled buffer list.
Definition usb.c:720
const char * usb_endpoint_name(struct usb_endpoint *ep)
Get USB endpoint name (for debugging)
Definition usb.c:221

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(), usbblk_open(), usbhid_open(), and usbnet_open().

◆ usb_endpoint_clear_halt()

int usb_endpoint_clear_halt ( struct usb_endpoint * ep)
extern

Clear endpoint halt (if applicable)

Parameters
epUSB endpoint
Return values
rcReturn status code

Definition at line 372 of file usb.c.

372 {
373 struct usb_device *usb = ep->usb;
374 unsigned int type;
375 int rc;
376
377 /* Clear transaction translator, if applicable */
378 if ( ( rc = usb_endpoint_clear_tt ( ep ) ) != 0 )
379 return rc;
380
381 /* Clear endpoint halt (if applicable) */
383 if ( ( type != USB_ENDPOINT_ATTR_CONTROL ) &&
386 ep->address ) ) != 0 ) ) {
387 DBGC ( usb, "USB %s %s could not clear endpoint halt: %s\n",
388 usb->name, usb_endpoint_name ( ep ), strerror ( rc ) );
389 return rc;
390 }
391
392 return 0;
393}
#define USB_RECIP_ENDPOINT
Request recipient is an endpoint.
Definition usb.h:119
static int usb_clear_feature(struct usb_device *usb, unsigned int type, unsigned int feature, unsigned int index)
Clear feature.
Definition usb.h:1127
#define USB_ENDPOINT_HALT
Endpoint halt feature.
Definition usb.h:157
#define USB_ENDPOINT_ATTR_CONTROL
Control endpoint transfer type.
Definition usb.h:287
static int usb_endpoint_clear_tt(struct usb_endpoint *ep)
Clear transaction translator (if applicable)
Definition usb.c:341

References usb_endpoint::address, usb_endpoint::attributes, DBGC, usb_device::ep, usb_device::name, rc, strerror(), type, usb_endpoint::usb, usb_clear_feature(), USB_ENDPOINT_ATTR_CONTROL, USB_ENDPOINT_ATTR_TYPE_MASK, usb_endpoint_clear_tt(), USB_ENDPOINT_HALT, usb_endpoint_name(), and USB_RECIP_ENDPOINT.

Referenced by usb_endpoint_reset(), and usbblk_open().

◆ usb_endpoint_close()

void usb_endpoint_close ( struct usb_endpoint * ep)
extern

Close USB endpoint.

Parameters
epUSB endpoint

Definition at line 400 of file usb.c.

400 {
401 struct usb_device *usb = ep->usb;
402 unsigned int idx = USB_ENDPOINT_IDX ( ep->address );
403
404 /* Sanity checks */
405 assert ( usb->ep[idx] == ep );
406
407 /* Close endpoint */
408 ep->open = 0;
409 ep->host->close ( ep );
410 assert ( ep->fill == 0 );
411
412 /* Remove from endpoint list */
413 usb->ep[idx] = NULL;
414 list_del ( &ep->halted );
415
416 /* Discard any recycled buffers, if applicable */
417 if ( ep->max )
418 usb_flush ( ep );
419
420 /* Clear transaction translator, if applicable */
422}
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
#define list_del(list)
Delete an entry from a list.
Definition list.h:120
unsigned int fill
Buffer fill level.
Definition usb.h:421

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(), usbblk_close(), usbblk_open(), 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 )
extern

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 492 of file usb.c.

494 {
495 struct usb_device *usb = ep->usb;
496 struct usb_port *port = usb->port;
497 struct usb_setup_packet *packet;
498 size_t len = iob_len ( iobuf );
499 int rc;
500
501 /* Sanity check */
502 assert ( iob_headroom ( iobuf ) >= sizeof ( *packet ) );
503
504 /* Fail immediately if device has been unplugged */
505 if ( port->disconnected )
506 return -ENODEV;
507
508 /* Reset endpoint if required */
509 if ( ( ! list_empty ( &ep->halted ) ) &&
510 ( ( rc = usb_endpoint_reset ( ep ) ) != 0 ) )
511 return rc;
512
513 /* Zero input data buffer (if applicable) */
514 if ( request & USB_DIR_IN )
515 memset ( iobuf->data, 0, len );
516
517 /* Construct setup packet */
518 packet = iob_push ( iobuf, sizeof ( *packet ) );
519 packet->request = cpu_to_le16 ( request );
520 packet->value = cpu_to_le16 ( value );
521 packet->index = cpu_to_le16 ( index );
522 packet->len = cpu_to_le16 ( len );
523
524 /* Enqueue message transfer */
525 if ( ( rc = ep->host->message ( ep, iobuf ) ) != 0 ) {
526 DBGC ( usb, "USB %s %s could not enqueue message transfer: "
527 "%s\n", usb->name, usb_endpoint_name ( ep ),
528 strerror ( rc ) );
529 return rc;
530 }
531
532 /* Increment fill level */
533 ep->fill++;
534
535 return 0;
536}
u8 port
Port number.
Definition CIB_PRM.h:3
pseudo_bit_t value[0x00020]
Definition arbel.h:2
ring len
Length.
Definition dwmac.h:226
#define ENODEV
No such device.
Definition errno.h:510
u8 request[0]
List of IEs requested.
Definition ieee80211.h:2
#define cpu_to_le16(value)
Definition byteswap.h:107
#define USB_DIR_IN
Data transfer is from device to host.
Definition usb.h:98
void * memset(void *dest, int character, size_t len) __nonnull
static size_t iob_headroom(struct io_buffer *iobuf)
Calculate available space at start of an I/O buffer.
Definition iobuf.h:170
#define iob_push(iobuf, len)
Definition iobuf.h:89
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition iobuf.h:160
#define list_empty(list)
Test whether a list is empty.
Definition list.h:137
void * data
Start of data.
Definition iobuf.h:53
int(* message)(struct usb_endpoint *ep, struct io_buffer *iobuf)
Enqueue message transfer.
Definition usb.h:475
A USB port.
Definition usb.h:813
struct usb_device * usb
Currently attached device (if in use)
Definition usb.h:835
A USB setup data packet.
Definition usb.h:83
uint16_t request
Request.
Definition usb.h:85
uint16_t value
Value parameter.
Definition usb.h:87
uint16_t index
Index parameter.
Definition usb.h:89
uint16_t len
Length of data stage.
Definition usb.h:91
static int usb_endpoint_reset(struct usb_endpoint *ep)
Reset USB endpoint.
Definition usb.c:430

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(), usb_setup_packet::value, and value.

Referenced by usb_control().

◆ usb_stream()

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

Enqueue USB stream transfer.

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

Definition at line 546 of file usb.c.

547 {
548 struct usb_device *usb = ep->usb;
549 struct usb_port *port = usb->port;
550 int zlp;
551 int rc;
552
553 /* Fail immediately if device has been unplugged */
554 if ( port->disconnected )
555 return -ENODEV;
556
557 /* Reset endpoint if required */
558 if ( ( ! list_empty ( &ep->halted ) ) &&
559 ( ( rc = usb_endpoint_reset ( ep ) ) != 0 ) )
560 return rc;
561
562 /* Append a zero-length packet if necessary */
563 zlp = terminate;
564 if ( iob_len ( iobuf ) & ( ep->mtu - 1 ) )
565 zlp = 0;
566
567 /* Enqueue stream transfer */
568 if ( ( rc = ep->host->stream ( ep, iobuf, zlp ) ) != 0 ) {
569 DBGC ( usb, "USB %s %s could not enqueue stream transfer: %s\n",
570 usb->name, usb_endpoint_name ( ep ), strerror ( rc ) );
571 return rc;
572 }
573
574 /* Increment fill level */
575 ep->fill++;
576
577 return 0;
578}
int(* stream)(struct usb_endpoint *ep, struct io_buffer *iobuf, int zlp)
Enqueue stream transfer.
Definition usb.h:484

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(), imux_tx(), iphone_out_transmit(), ncm_out_transmit(), smsc75xx_out_transmit(), smsc95xx_out_transmit(), usb_refill_limit(), usbblk_out_command(), and usbblk_out_data().

◆ usb_complete_err()

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

Complete transfer (possibly with error)

Parameters
epUSB endpoint
iobufI/O buffer
rcCompletion status code

Definition at line 587 of file usb.c.

588 {
589 struct usb_device *usb = ep->usb;
590
591 /* Decrement fill level */
592 assert ( ep->fill > 0 );
593 ep->fill--;
594
595 /* Schedule reset, if applicable */
596 if ( ( rc != 0 ) && ep->open ) {
597 DBGC ( usb, "USB %s %s completion failed: %s\n",
598 usb->name, usb_endpoint_name ( ep ), strerror ( rc ) );
599 list_del ( &ep->halted );
601 }
602
603 /* Report completion */
604 ep->driver->complete ( ep, iobuf, rc );
605}
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition list.h:94
void(* complete)(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete transfer.
Definition usb.h:496
static struct list_head usb_halted
List of halted endpoints.
Definition usb.c:51

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()

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 617 of file usb.h.

618 {
619
620 INIT_LIST_HEAD ( &ep->recycled );
621 ep->reserve = reserve;
622 ep->len = len;
623 ep->max = max;
624}
#define max(x, y)
Definition ath.h:41
size_t len
Refill buffer payload length.
Definition usb.h:438
size_t reserve
Refill buffer reserved header length.
Definition usb.h:436
struct list_head recycled
Recycled I/O buffer list.
Definition usb.h:434

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(), imux_probe(), iphone_probe(), lan78xx_probe(), ncm_in_prefill(), ncm_probe(), smsc75xx_probe(), smsc95xx_probe(), smscusb_init(), usbblk_probe(), and usbkbd_probe().

◆ usb_recycle()

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 633 of file usb.h.

633 {
634
635 list_add_tail ( &iobuf->list, &ep->recycled );
636}
struct list_head list
List of which this buffer is a member.
Definition iobuf.h:45

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)
extern

Prefill endpoint recycled buffer list.

Parameters
epUSB endpoint
Return values
rcReturn status code

Definition at line 620 of file usb.c.

620 {
621 struct io_buffer *iobuf;
622 size_t reserve = ep->reserve;
623 size_t len = ( ep->len ? ep->len : ep->mtu );
624 unsigned int fill;
625 int rc;
626
627 /* Sanity checks */
628 assert ( ep->fill == 0 );
629 assert ( ep->max > 0 );
630 assert ( list_empty ( &ep->recycled ) );
631
632 /* Fill recycled buffer list */
633 for ( fill = 0 ; fill < ep->max ; fill++ ) {
634
635 /* Allocate I/O buffer */
636 iobuf = alloc_iob ( reserve + len );
637 if ( ! iobuf ) {
638 rc = -ENOMEM;
639 goto err_alloc;
640 }
641 iob_reserve ( iobuf, reserve );
642
643 /* Add to recycled buffer list */
644 list_add_tail ( &iobuf->list, &ep->recycled );
645 }
646
647 return 0;
648
649 err_alloc:
650 usb_flush ( ep );
651 return rc;
652}
static int fill
Definition string.h:209
#define ENOMEM
Not enough space.
Definition errno.h:535
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition iobuf.c:131
#define iob_reserve(iobuf, len)
Definition iobuf.h:72
A persistent I/O buffer.
Definition iobuf.h:38

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_limit()

int usb_refill_limit ( struct usb_endpoint * ep,
unsigned int max )
extern

Refill endpoint up to specified limit.

Parameters
epUSB endpoint
maxFill limit
Return values
rcReturn status code

Definition at line 661 of file usb.c.

661 {
662 struct io_buffer *iobuf;
663 size_t reserve = ep->reserve;
664 size_t len = ( ep->len ? ep->len : ep->mtu );
665 int rc;
666
667 /* Sanity checks */
668 assert ( ep->open );
669 assert ( ep->max > 0 );
670
671 /* Refill endpoint */
672 if ( max > ep->max )
673 max = ep->max;
674 while ( ep->fill < max ) {
675
676 /* Get or allocate buffer */
677 if ( list_empty ( &ep->recycled ) ) {
678 /* Recycled buffer list is empty; allocate new buffer */
679 iobuf = alloc_iob ( reserve + len );
680 if ( ! iobuf )
681 return -ENOMEM;
682 iob_reserve ( iobuf, reserve );
683 } else {
684 /* Get buffer from recycled buffer list */
685 iobuf = list_first_entry ( &ep->recycled,
686 struct io_buffer, list );
687 assert ( iobuf != NULL );
688 list_del ( &iobuf->list );
689 }
690
691 /* Reset buffer to maximum size */
692 assert ( iob_len ( iobuf ) <= len );
693 iob_put ( iobuf, ( len - iob_len ( iobuf ) ) );
694
695 /* Enqueue buffer */
696 if ( ( rc = usb_stream ( ep, iobuf, 0 ) ) != 0 ) {
697 list_add ( &iobuf->list, &ep->recycled );
698 return rc;
699 }
700 }
701
702 return 0;
703}
#define iob_put(iobuf, len)
Definition iobuf.h:125
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition list.h:334
#define list_add(new, head)
Add a new entry to the head of a list.
Definition list.h:70
int usb_stream(struct usb_endpoint *ep, struct io_buffer *iobuf, int terminate)
Enqueue USB stream transfer.
Definition usb.c:546

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, max, usb_endpoint::max, usb_endpoint::mtu, NULL, usb_endpoint::open, rc, usb_endpoint::recycled, usb_endpoint::reserve, and usb_stream().

Referenced by usb_refill(), and usbblk_in_refill().

◆ usb_refill()

int usb_refill ( struct usb_endpoint * ep)
extern

Refill endpoint.

Parameters
epUSB endpoint
Return values
rcReturn status code

Definition at line 711 of file usb.c.

711 {
712 return usb_refill_limit ( ep, ep->max );
713}
int usb_refill_limit(struct usb_endpoint *ep, unsigned int max)
Refill endpoint up to specified limit.
Definition usb.c:661

References usb_endpoint::max, and usb_refill_limit().

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)
extern

Discard endpoint recycled buffer list.

Parameters
epUSB endpoint

Definition at line 720 of file usb.c.

720 {
721 struct io_buffer *iobuf;
722 struct io_buffer *tmp;
723
724 /* Sanity checks */
725 assert ( ! ep->open );
726 assert ( ep->max > 0 );
727
728 /* Free all I/O buffers */
729 list_for_each_entry_safe ( iobuf, tmp, &ep->recycled, list ) {
730 list_del ( &iobuf->list );
731 free_iob ( iobuf );
732 }
733}
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition iobuf.c:153
unsigned long tmp
Definition linux_pci.h:65
#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:459

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()

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 707 of file usb.h.

707 {
708 func->priv = priv;
709}
void * priv
Driver private data.
Definition usb.h:689

References priv, and usb_function::priv.

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

◆ usb_func_get_drvdata()

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 718 of file usb.h.

718 {
719 return func->priv;
720}

References usb_function::priv.

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

◆ usb_set_hostdata()

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 784 of file usb.h.

784 {
785 usb->priv = priv;
786}
void * priv
Host controller private data.
Definition usb.h:742

References priv, and usb_device::priv.

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

◆ usb_get_hostdata()

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 795 of file usb.h.

795 {
796 return usb->priv;
797}

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()

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 806 of file usb.h.

807 {
808
809 return usb->ep[ USB_ENDPOINT_IDX ( address ) ];
810}

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()

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 937 of file usb.h.

937 {
938 hub->priv = priv;
939}
void * priv
Driver private data.
Definition usb.h:861

References priv, and usb_hub::priv.

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

◆ usb_hub_get_drvdata()

void * usb_hub_get_drvdata ( struct usb_hub * hub)
inlinestatic

◆ usb_port()

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 960 of file usb.h.

960 {
961
962 return &hub->port[ address - 1 ];
963}
struct usb_port port[0]
Port list.
Definition usb.h:867

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_register(), and xhci_root_open().

◆ usb_bus_set_hostdata()

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 1051 of file usb.h.

1051 {
1052 bus->priv = priv;
1053}

References bus, and priv.

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

◆ usb_bus_get_hostdata()

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 1062 of file usb.h.

1062 {
1063 return bus->priv;
1064}

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()

void usb_poll ( struct usb_bus * bus)
inlinestatic

Poll USB bus.

Parameters
busUSB bus

Definition at line 1072 of file usb.h.

1072 {
1073 bus->host->poll ( bus );
1074}

References bus.

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

◆ usb_complete()

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 1087 of file usb.h.

1087 {
1088 usb_complete_err ( ep, iobuf, 0 );
1089}
void usb_complete_err(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete transfer (possibly with error)
Definition usb.c:587

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 )
extern

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 784 of file usb.c.

786 {
787 struct usb_bus *bus = usb->port->hub->bus;
788 struct usb_endpoint *ep = &usb->control;
789 struct io_buffer *iobuf;
790 struct io_buffer *cmplt;
791 union {
792 struct usb_setup_packet setup;
793 struct usb_control_pseudo_header pshdr;
794 } *headroom;
795 struct usb_control_pseudo_header *pshdr;
796 unsigned int i;
797 int rc;
798
799 /* Allocate I/O buffer */
800 iobuf = alloc_iob ( sizeof ( *headroom ) + len );
801 if ( ! iobuf ) {
802 rc = -ENOMEM;
803 goto err_alloc;
804 }
805 iob_reserve ( iobuf, sizeof ( *headroom ) );
806 iob_put ( iobuf, len );
807 if ( request & USB_DIR_IN ) {
808 memset ( data, 0, len );
809 } else {
810 memcpy ( iobuf->data, data, len );
811 }
812
813 /* Enqueue message */
814 if ( ( rc = usb_message ( ep, request, value, index, iobuf ) ) != 0 )
815 goto err_message;
816
817 /* Wait for completion */
818 for ( i = 0 ; i < USB_CONTROL_MAX_WAIT_MS ; i++ ) {
819
820 /* Poll bus */
821 usb_poll ( bus );
822
823 /* Check for completion */
824 while ( ( cmplt = list_first_entry ( &usb->complete,
825 struct io_buffer,
826 list ) ) ) {
827
828 /* Remove from completion list */
829 list_del ( &cmplt->list );
830
831 /* Extract and strip completion status */
832 pshdr = cmplt->data;
833 iob_pull ( cmplt, sizeof ( *pshdr ) );
834 rc = pshdr->rc;
835
836 /* Discard stale completions */
837 if ( cmplt != iobuf ) {
838 DBGC ( usb, "USB %s stale control completion: "
839 "%s\n", usb->name, strerror ( rc ) );
840 DBGC_HDA ( usb, 0, cmplt->data,
841 iob_len ( cmplt ) );
842 free_iob ( cmplt );
843 continue;
844 }
845
846 /* Fail immediately if completion was in error */
847 if ( rc != 0 ) {
848 DBGC ( usb, "USB %s control %04x:%04x:%04x "
849 "failed: %s\n", usb->name, request,
850 value, index, strerror ( rc ) );
851 free_iob ( cmplt );
852 usb_endpoint_reset ( ep );
853 return rc;
854 }
855
856 /* Copy completion to data buffer, if applicable */
857 assert ( iob_len ( cmplt ) <= len );
858 if ( request & USB_DIR_IN )
859 memcpy ( data, cmplt->data, iob_len ( cmplt ) );
860 free_iob ( cmplt );
861 return 0;
862 }
863
864 /* Delay */
865 mdelay ( 1 );
866 }
867
868 DBGC ( usb, "USB %s timed out waiting for control %04x:%04x:%04x\n",
869 usb->name, request, value, index );
870 return -ETIMEDOUT;
871
872 err_message:
873 free_iob ( iobuf );
874 err_alloc:
875 return rc;
876}
uint8_t data[48]
Additional event data.
Definition ena.h:11
#define DBGC_HDA(...)
Definition compiler.h:506
#define ETIMEDOUT
Connection timed out.
Definition errno.h:670
#define USB_CONTROL_MAX_WAIT_MS
Maximum time to wait for a control transaction to complete.
Definition usb.h:1342
static void usb_poll(struct usb_bus *bus)
Poll USB bus.
Definition usb.h:1072
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define iob_pull(iobuf, len)
Definition iobuf.h:107
A USB bus.
Definition usb.h:966
USB control transfer pseudo-header.
Definition usb.c:743
int rc
Completion status.
Definition usb.c:745
struct list_head complete
Completed control transfers.
Definition usb.h:750
struct usb_endpoint control
Control endpoint.
Definition usb.h:748
A USB endpoint.
Definition usb.h:404
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition timer.c:79
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:492

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_endpoint_reset(), 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(), iphone_check_link(), iphone_probe(), ncm_open(), ncm_probe(), smscusb_get_statistics(), 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(), usbblk_open(), 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 )
extern

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 916 of file usb.c.

917 {
918 struct {
920 uint16_t character[len];
921 } __attribute__ (( packed )) *desc;
922 unsigned int actual;
923 unsigned int i;
924 int rc;
925
926 /* Use default language ID, if applicable */
927 if ( ( language == 0 ) && ( index != 0 ) ) {
928 if ( ! usb->language )
929 usb->language = usb_get_default_language ( usb );
930 language = usb->language;
931 }
932
933 /* Allocate buffer for string */
934 desc = malloc ( sizeof ( *desc ) );
935 if ( ! desc ) {
936 rc = -ENOMEM;
937 goto err_alloc;
938 }
939
940 /* Get descriptor */
942 language, &desc->header,
943 sizeof ( *desc ) ) ) != 0 )
944 goto err_get_descriptor;
945
946 /* Calculate string length */
947 if ( desc->header.len < sizeof ( desc->header ) ) {
948 rc = -EINVAL;
949 goto err_len;
950 }
951 actual = ( ( desc->header.len - sizeof ( desc->header ) ) /
952 sizeof ( desc->character[0] ) );
953
954 /* Copy to buffer */
955 memset ( buf, 0, len );
956 for ( i = 0 ; ( ( i < actual ) && ( i < len ) ) ; i++ )
957 buf[i] = le16_to_cpu ( desc->character[i] );
958
959 /* Free buffer */
960 free ( desc );
961
962 return actual;
963
964 err_len:
965 err_get_descriptor:
966 free ( desc );
967 err_alloc:
968 return rc;
969}
unsigned short uint16_t
Definition stdint.h:11
#define EINVAL
Invalid argument.
Definition errno.h:429
#define __attribute__(x)
Definition compiler.h:10
#define USB_STRING_DESCRIPTOR
A USB string descriptor.
Definition usb.h:239
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:1177
void * malloc(size_t size)
Allocate memory.
Definition malloc.c:621
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
unsigned int language
Default language ID (if known)
Definition usb.h:753
static unsigned int usb_get_default_language(struct usb_device *usb)
Get default language ID.
Definition usb.c:884

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

Referenced by ecm_fetch_mac(), and usb_settings_fetch().

◆ usb_get_status()

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 1110 of file usb.h.

1111 {
1112
1113 return usb_control ( usb, ( USB_GET_STATUS | type ), 0, index,
1114 data, len );
1115}
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:784
#define USB_GET_STATUS
Get status.
Definition usb.h:125

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

Referenced by usb_hub_get_port_status().

◆ usb_clear_feature()

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 1127 of file usb.h.

1128 {
1129
1130 return usb_control ( usb, ( USB_CLEAR_FEATURE | type ),
1131 feature, index, NULL, 0 );
1132}
#define USB_CLEAR_FEATURE
Clear feature.
Definition usb.h:128
A named feature.
Definition features.h:79

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

Referenced by usb_endpoint_clear_halt(), and usb_hub_clear_port_feature().

◆ usb_set_feature()

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 1144 of file usb.h.

1145 {
1146
1147 return usb_control ( usb, ( USB_SET_FEATURE | type ),
1148 feature, index, NULL, 0 );
1149}
#define USB_SET_FEATURE
Set feature.
Definition usb.h:131

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

Referenced by usb_hub_set_port_feature().

◆ usb_set_address()

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 1159 of file usb.h.

1159 {
1160
1161 return usb_control ( usb, USB_SET_ADDRESS, address, 0, NULL, 0 );
1162}
#define USB_SET_ADDRESS
Set address.
Definition usb.h:134

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

Referenced by ehci_device_address(), and uhci_device_address().

◆ usb_get_descriptor()

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 1177 of file usb.h.

1180 {
1181
1182 return usb_control ( usb, ( USB_GET_DESCRIPTOR | type ),
1183 ( ( desc << 8 ) | index ), language, data, len );
1184}
#define USB_GET_DESCRIPTOR
Get descriptor.
Definition usb.h:137

References data, desc, 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()

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 1194 of file usb.h.

1194 {
1195
1196 return usb_get_descriptor ( usb, 0, USB_DEVICE_DESCRIPTOR, 0, 0,
1197 &data->header,
1198 ( offsetof ( typeof ( *data ), mtu ) +
1199 sizeof ( data->mtu ) ) );
1200}
#define USB_DEVICE_DESCRIPTOR
A USB device descriptor.
Definition usb.h:207
#define offsetof(type, field)
Get offset of a field within a structure.
Definition stddef.h:25

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

Referenced by register_usb().

◆ usb_get_device_descriptor()

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 1210 of file usb.h.

1211 {
1212
1213 return usb_get_descriptor ( usb, 0, USB_DEVICE_DESCRIPTOR, 0, 0,
1214 &data->header, sizeof ( *data ) );
1215}

References data, USB_DEVICE_DESCRIPTOR, and usb_get_descriptor().

Referenced by register_usb().

◆ usb_get_config_descriptor()

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 1226 of file usb.h.

1228 {
1229
1231 0, &data->header, len );
1232}
#define USB_CONFIGURATION_DESCRIPTOR
A USB configuration descriptor.
Definition usb.h:228

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

Referenced by usb_config_descriptor().

◆ usb_set_configuration()

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 1242 of file usb.h.

1242 {
1243
1244 return usb_control ( usb, USB_SET_CONFIGURATION, index, 0, NULL, 0 );
1245}
#define USB_SET_CONFIGURATION
Set configuration.
Definition usb.h:146

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

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

◆ usb_set_interface()

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 1256 of file usb.h.

1257 {
1258
1260 NULL, 0 );
1261}
struct ib_cm_path alternate
Alternate path.
Definition ib_mad.h:31
#define USB_SET_INTERFACE
Set interface.
Definition usb.h:153

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

Referenced by usbnet_close(), and usbnet_open().

◆ usb_depth()

unsigned int usb_depth ( struct usb_device * usb)
inlinestatic

Get USB depth.

Parameters
usbUSB device
Return values
depthHub depth

Definition at line 1269 of file usb.h.

1269 {
1270 struct usb_device *parent;
1271 unsigned int depth;
1272
1273 /* Navigate up to root hub, constructing depth as we go */
1274 for ( depth = 0 ; ( parent = usb->port->hub->usb ) ; usb = parent )
1275 depth++;
1276
1277 return depth;
1278}
struct usb_device * usb
Underlying USB device, if any.
Definition usb.h:847

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

Referenced by efi_usb_path(), and hub_probe().

◆ usb_interface_descriptor()

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

Locate USB interface descriptor.

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

Definition at line 144 of file usb.c.

145 {
147
148 /* Find a matching interface descriptor */
149 for_each_config_descriptor ( desc, config ) {
150 if ( ( desc->header.type == USB_INTERFACE_DESCRIPTOR ) &&
151 ( desc->interface == interface ) &&
152 ( desc->alternate == alternate ) )
153 return desc;
154 }
155 return NULL;
156}
#define for_each_config_descriptor(desc, config)
Iterate over all configuration descriptors.
Definition usb.h:386
A USB interface descriptor.
Definition usb.h:245

References alternate, desc, for_each_config_descriptor, NULL, and USB_INTERFACE_DESCRIPTOR.

Referenced by ecm_probe(), efi_usb_get_interface_descriptor(), ncm_probe(), usbblk_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 )
extern

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 168 of file usb.c.

170 {
172 unsigned int attributes = ( type & USB_ENDPOINT_ATTR_TYPE_MASK );
173 unsigned int direction = ( type & USB_DIR_IN );
174
175 /* Find a matching endpoint descriptor */
177 if ( ( desc->header.type == USB_ENDPOINT_DESCRIPTOR ) &&
178 ( ( desc->attributes &
180 ( ( desc->endpoint & USB_DIR_IN ) == direction ) &&
181 ( index-- == 0 ) )
182 return desc;
183 }
184 return NULL;
185}
uint8_t direction
Direction.
Definition ena.h:3
#define USB_ENDPOINT_DESCRIPTOR
A USB endpoint descriptor.
Definition usb.h:278
#define for_each_interface_descriptor(desc, config, interface)
Iterate over all configuration descriptors within an interface descriptor.
Definition usb.h:394
uint8_t attributes
Attributes.
Definition usb.h:270

References usb_endpoint_descriptor::attributes, desc, direction, for_each_interface_descriptor, index, NULL, type, USB_DIR_IN, USB_ENDPOINT_ATTR_TYPE_MASK, and USB_ENDPOINT_DESCRIPTOR.

Referenced by usb_endpoint_described().

◆ usb_endpoint_companion_descriptor()

struct usb_endpoint_companion_descriptor * usb_endpoint_companion_descriptor ( struct usb_configuration_descriptor * config,
struct usb_endpoint_descriptor * desc )
extern

Locate USB endpoint companion descriptor.

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

Definition at line 195 of file usb.c.

196 {
198
199 /* Get companion descriptor, if present */
200 descx = container_of ( usb_next_descriptor ( &desc->header ),
202 header );
203 return ( ( usb_is_within_config ( config, &descx->header ) &&
205 ? descx : NULL );
206}
#define USB_ENDPOINT_COMPANION_DESCRIPTOR
A USB endpoint companion descriptor.
Definition usb.h:326
uint8_t type
Descriptor type.
Definition usb.h:177
struct usb_descriptor_header header
Descriptor header.
Definition usb.h:316

References container_of, desc, 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().

◆ find_usb()

struct usb_device * find_usb ( struct usb_bus * bus,
unsigned int address )
extern

Find USB device by address.

Parameters
busUSB bus
addressDevice address
Return values
usbUSB device, or NULL if not found

Definition at line 1735 of file usb.c.

1735 {
1736 struct usb_device *usb;
1737
1738 /* Search for a matching non-zero address */
1739 list_for_each_entry ( usb, &bus->devices, list ) {
1740 if ( address && ( usb->address == address ) )
1741 return usb;
1742 }
1743
1744 return NULL;
1745}
struct list_head list
List of devices on this bus.
Definition usb.h:731
unsigned int address
Device address, if assigned.
Definition usb.h:733

References address, usb_device::address, bus, usb_device::list, list_for_each_entry, and NULL.

Referenced by usb_find_next(), and usb_settings_fetch().

◆ 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 )
extern

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 1937 of file usb.c.

1939 {
1940 struct usb_hub *hub;
1941 struct usb_port *port;
1942 unsigned int i;
1943
1944 /* Allocate and initialise structure */
1945 hub = zalloc ( sizeof ( *hub ) + ( ports * sizeof ( hub->port[0] ) ) );
1946 if ( ! hub )
1947 return NULL;
1948 hub->name = ( usb ? usb->name : bus->name );
1949 hub->bus = bus;
1950 hub->usb = usb;
1951 if ( usb )
1953 hub->ports = ports;
1954 hub->driver = driver;
1955 hub->host = &bus->op->hub;
1956
1957 /* Initialise port list */
1958 for ( i = 1 ; i <= hub->ports ; i++ ) {
1959 port = usb_port ( hub, i );
1960 port->hub = hub;
1961 port->address = i;
1962 if ( usb )
1963 port->protocol = usb->port->protocol;
1964 INIT_LIST_HEAD ( &port->changed );
1965 }
1966
1967 return hub;
1968}
static struct usb_port * usb_port(struct usb_hub *hub, unsigned int address)
Get USB port.
Definition usb.h:960
void * zalloc(size_t size)
Allocate cleared memory.
Definition malloc.c:662
A USB hub.
Definition usb.h:841
const char * name
Name.
Definition usb.h:843
unsigned int protocol
Hub protocol.
Definition usb.h:849
struct usb_hub_driver_operations * driver
Driver operations.
Definition usb.h:859
unsigned int ports
Number of ports.
Definition usb.h:851
struct usb_hub_host_operations * host
Host controller operations.
Definition usb.h:857
unsigned int protocol
Port protocol.
Definition usb.h:819

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_hub::protocol, usb_port::protocol, usb_hub::usb, usb_port::usb, usb_port(), and zalloc().

Referenced by alloc_usb_bus(), and hub_probe().

◆ register_usb_hub()

int register_usb_hub ( struct usb_hub * hub)
extern

Register USB hub.

Parameters
hubUSB hub
Return values
rcReturn status code

Definition at line 1976 of file usb.c.

1976 {
1977 struct usb_bus *bus = hub->bus;
1978 struct usb_port *port;
1979 unsigned int i;
1980 int rc;
1981
1982 /* Add to hub list */
1983 list_add_tail ( &hub->list, &bus->hubs );
1984
1985 /* Open hub (host controller) */
1986 if ( ( rc = hub->host->open ( hub ) ) != 0 ) {
1987 DBGC ( hub, "USB hub %s could not open: %s\n",
1988 hub->name, strerror ( rc ) );
1989 goto err_host_open;
1990 }
1991
1992 /* Open hub (driver) */
1993 if ( ( rc = hub->driver->open ( hub ) ) != 0 ) {
1994 DBGC ( hub, "USB hub %s could not open: %s\n",
1995 hub->name, strerror ( rc ) );
1996 goto err_driver_open;
1997 }
1998
1999 /* Delay to allow ports to stabilise */
2001
2002 /* Mark all ports as changed */
2003 for ( i = 1 ; i <= hub->ports ; i++ ) {
2004 port = usb_port ( hub, i );
2006 }
2007
2008 /* Some hubs seem to defer reporting device connections until
2009 * their interrupt endpoint is polled for the first time.
2010 * Poll the bus once now in order to pick up any such
2011 * connections.
2012 */
2013 usb_poll ( bus );
2014
2015 return 0;
2016
2017 hub->driver->close ( hub );
2018 err_driver_open:
2019 hub->host->close ( hub );
2020 err_host_open:
2021 list_del ( &hub->list );
2022 return rc;
2023}
#define USB_PORT_DELAY_MS
Time to wait for ports to stabilise.
Definition usb.h:1358
struct usb_hub * hub
Root hub.
Definition usb.h:995
int(* open)(struct usb_hub *hub)
Open hub.
Definition usb.h:892
void(* close)(struct usb_hub *hub)
Close hub.
Definition usb.h:897
int(* open)(struct usb_hub *hub)
Open hub.
Definition usb.h:877
void(* close)(struct usb_hub *hub)
Close hub.
Definition usb.h:882
struct list_head list
List of hubs.
Definition usb.h:854
void usb_port_changed(struct usb_port *port)
Report port status change.
Definition usb.c:1858

References bus, usb_hub::bus, usb_hub_driver_operations::close, usb_hub_host_operations::close, DBGC, usb_hub::driver, usb_hub::host, usb_bus::hub, usb_port::hub, usb_hub::list, list_add_tail, list_del, mdelay(), usb_hub::name, usb_hub_driver_operations::open, usb_hub_host_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)
extern

Unregister USB hub.

Parameters
hubUSB hub

Definition at line 2030 of file usb.c.

2030 {
2031 struct usb_port *port;
2032 unsigned int i;
2033
2034 /* Detach all devices */
2035 for ( i = 1 ; i <= hub->ports ; i++ ) {
2036 port = usb_port ( hub, i );
2037 if ( port->attached )
2038 usb_detached ( port );
2039 }
2040
2041 /* Close hub (driver) */
2042 hub->driver->close ( hub );
2043
2044 /* Close hub (host controller) */
2045 hub->host->close ( hub );
2046
2047 /* Cancel any pending port status changes */
2048 for ( i = 1 ; i <= hub->ports ; i++ ) {
2049 port = usb_port ( hub, i );
2050 list_del ( &port->changed );
2051 INIT_LIST_HEAD ( &port->changed );
2052 }
2053
2054 /* Remove from hub list */
2055 list_del ( &hub->list );
2056}
static void usb_detached(struct usb_port *port)
Handle newly detached USB device.
Definition usb.c:1795

References usb_hub_driver_operations::close, usb_hub_host_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)
extern

Free USB hub.

Parameters
hubUSB hub

Definition at line 2063 of file usb.c.

2063 {
2064 struct usb_port *port;
2065 unsigned int i;
2066
2067 /* Sanity checks */
2068 for ( i = 1 ; i <= hub->ports ; i++ ) {
2069 port = usb_port ( hub, i );
2070 assert ( ! port->attached );
2071 assert ( port->usb == NULL );
2072 assert ( list_empty ( &port->changed ) );
2073 }
2074
2075 /* Free hub */
2076 free ( hub );
2077}

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)
extern

Report port status change.

Parameters
portUSB port

Definition at line 1858 of file usb.c.

1858 {
1859
1860 /* Record hub port status change */
1861 list_del ( &port->changed );
1862 list_add_tail ( &port->changed, &usb_changed );
1863}
static struct list_head usb_changed
List of changed ports.
Definition usb.c:48

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 )
extern

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 2095 of file usb.c.

2096 {
2097 struct usb_bus *bus;
2098
2099 /* Allocate and initialise structure */
2100 bus = zalloc ( sizeof ( *bus ) );
2101 if ( ! bus )
2102 goto err_alloc_bus;
2103 bus->name = dev->name;
2104 bus->dev = dev;
2105 bus->mtu = mtu;
2106 bus->op = op;
2107 INIT_LIST_HEAD ( &bus->devices );
2108 INIT_LIST_HEAD ( &bus->hubs );
2109 bus->host = &bus->op->bus;
2110
2111 /* Allocate root hub */
2112 bus->hub = alloc_usb_hub ( bus, NULL, ports, &op->root );
2113 if ( ! bus->hub )
2114 goto err_alloc_hub;
2115
2116 return bus;
2117
2118 free_usb_hub ( bus->hub );
2119 err_alloc_hub:
2120 free ( bus );
2121 err_alloc_bus:
2122 return NULL;
2123}
static uint16_t struct vmbus_xfer_pages_operations * op
Definition netvsc.h:327
char name[40]
Name.
Definition device.h:79
struct device * dev
Underlying hardware device.
Definition usb.h:970
void free_usb_hub(struct usb_hub *hub)
Free USB hub.
Definition usb.c:2063
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:1937

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_register().

◆ register_usb_bus()

int register_usb_bus ( struct usb_bus * bus)
extern

Register USB bus.

Parameters
busUSB bus
Return values
rcReturn status code

Definition at line 2131 of file usb.c.

2131 {
2132 int rc;
2133
2134 /* Sanity checks */
2135 assert ( bus->hub != NULL );
2136
2137 /* Assign the first available bus address */
2138 bus->address = 0;
2139 while ( find_usb_bus ( bus->address ) != NULL )
2140 bus->address++;
2141
2142 /* Open bus */
2143 if ( ( rc = bus->host->open ( bus ) ) != 0 )
2144 goto err_open;
2145
2146 /* Add to list of USB buses */
2147 list_add_tail ( &bus->list, &usb_buses );
2148
2149 /* Register root hub */
2150 if ( ( rc = register_usb_hub ( bus->hub ) ) != 0 )
2151 goto err_register_hub;
2152
2153 /* Attach any devices already present */
2154 usb_hotplug();
2155
2156 return 0;
2157
2158 unregister_usb_hub ( bus->hub );
2159 err_register_hub:
2160 list_del ( &bus->list );
2161 bus->host->close ( bus );
2162 err_open:
2163 return rc;
2164}
static void usb_hotplug(void)
Handle newly attached or detached USB device.
Definition usb.c:1869
struct usb_bus * find_usb_bus(unsigned int address)
Find USB bus by address.
Definition usb.c:2220
void unregister_usb_hub(struct usb_hub *hub)
Unregister USB hub.
Definition usb.c:2030
int register_usb_hub(struct usb_hub *hub)
Register USB hub.
Definition usb.c:1976

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

Referenced by ehci_probe(), REQUIRING_SYMBOL(), uhci_probe(), usbio_start(), and xhci_register().

◆ unregister_usb_bus()

void unregister_usb_bus ( struct usb_bus * bus)
extern

Unregister USB bus.

Parameters
busUSB bus

Definition at line 2171 of file usb.c.

2171 {
2172
2173 /* Sanity checks */
2174 assert ( bus->hub != NULL );
2175
2176 /* Unregister root hub */
2177 unregister_usb_hub ( bus->hub );
2178
2179 /* Remove from list of USB buses */
2180 list_del ( &bus->list );
2181
2182 /* Close bus */
2183 bus->host->close ( bus );
2184
2185 /* Sanity checks */
2186 assert ( list_empty ( &bus->devices ) );
2187 assert ( list_empty ( &bus->hubs ) );
2188}

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_register(), and xhci_unregister().

◆ free_usb_bus()

void free_usb_bus ( struct usb_bus * bus)
extern

Free USB bus.

Parameters
busUSB bus

Definition at line 2195 of file usb.c.

2195 {
2196 struct usb_endpoint *ep;
2197 struct usb_port *port;
2198
2199 /* Sanity checks */
2200 assert ( list_empty ( &bus->devices ) );
2201 assert ( list_empty ( &bus->hubs ) );
2202 list_for_each_entry ( ep, &usb_halted, halted )
2203 assert ( ep->usb->port->hub->bus != bus );
2205 assert ( port->hub->bus != bus );
2206
2207 /* Free root hub */
2208 free_usb_hub ( bus->hub );
2209
2210 /* Free bus */
2211 free ( bus );
2212}
struct list_head changed
List of changed ports.
Definition usb.h:837

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_register(), and xhci_unregister().

◆ find_usb_bus()

struct usb_bus * find_usb_bus ( unsigned int address)
extern

Find USB bus by address.

Parameters
addressBus address
Return values
busUSB bus, or NULL

Definition at line 2220 of file usb.c.

2220 {
2221 struct usb_bus *bus;
2222
2223 for_each_usb_bus ( bus ) {
2224 if ( bus->address == address )
2225 return bus;
2226 }
2227
2228 return NULL;
2229}
#define for_each_usb_bus(bus)
Iterate over all USB buses.
Definition usb.h:1077

References address, bus, for_each_usb_bus, and NULL.

Referenced by register_usb_bus(), usb_find_next(), and usb_settings_fetch().

◆ find_usb_bus_by_location()

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

Find USB bus by device location.

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

Definition at line 2238 of file usb.c.

2239 {
2240 struct usb_bus *bus;
2241
2242 for_each_usb_bus ( bus ) {
2243 if ( ( bus->dev->desc.bus_type == bus_type ) &&
2244 ( bus->dev->desc.location == location ) )
2245 return bus;
2246 }
2247
2248 return NULL;
2249}

References bus, for_each_usb_bus, and NULL.

Referenced by uhci_root_speed().

◆ usb_alloc_address()

int usb_alloc_address ( struct usb_bus * bus)
extern

Allocate device address.

Parameters
busUSB bus
Return values
addressDevice address, or negative error

Definition at line 2264 of file usb.c.

2264 {
2265 unsigned int address;
2266
2267 /* Find first free device address */
2268 address = ffsll ( ~bus->addresses );
2269 if ( ! address )
2270 return -ENOENT;
2271
2272 /* Mark address as used */
2273 bus->addresses |= ( 1ULL << ( address - 1 ) );
2274
2275 return address;
2276}
#define ffsll(x)
Find first (i.e.
Definition strings.h:123

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 )
extern

Free device address.

Parameters
busUSB bus
addressDevice address

Definition at line 2284 of file usb.c.

2284 {
2285
2286 /* Sanity check */
2287 assert ( address > 0 );
2288 assert ( bus->addresses & ( 1ULL << ( address - 1 ) ) );
2289
2290 /* Mark address as free */
2291 bus->addresses &= ~( 1ULL << ( address - 1 ) );
2292}

References address, assert, and bus.

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

◆ usb_find_next()

int usb_find_next ( struct usb_device ** usb,
uint16_t * busdev )
extern

Find next USB device.

Parameters
usbUSB device to fill in
busdevStarting bus:dev address
Return values
busdevBus:dev address of next USB device
rcReturn status code

Definition at line 2302 of file usb.c.

2302 {
2303 struct usb_bus *bus;
2304
2305 do {
2306 /* Find USB bus, if any */
2307 bus = find_usb_bus ( USB_BUS ( *busdev ) );
2308 if ( ! bus ) {
2309 *busdev |= ( USB_BUS ( 1 ) - 1 );
2310 continue;
2311 }
2312
2313 /* Find USB device, if any */
2314 *usb = find_usb ( bus, USB_DEV ( *busdev ) );
2315 if ( *usb )
2316 return 0;
2317
2318 } while ( ++(*busdev) );
2319
2320 return -ENODEV;
2321}
#define USB_BUS(busdev)
Extract USB bus address.
Definition usb.h:67
#define USB_DEV(busdev)
Extract USB device address.
Definition usb.h:70
struct usb_device * find_usb(struct usb_bus *bus, unsigned int address)
Find USB device by address.
Definition usb.c:1735

References bus, ENODEV, find_usb(), find_usb_bus(), USB_BUS, and USB_DEV.

Referenced by usbscan_exec().

◆ usb_route_string()

unsigned int usb_route_string ( struct usb_device * usb)
extern

Get USB route string.

Parameters
usbUSB device
Return values
routeUSB route string

Definition at line 2336 of file usb.c.

2336 {
2337 struct usb_device *parent;
2338 unsigned int route;
2339
2340 /* Navigate up to root hub, constructing route string as we go */
2341 for ( route = 0 ; ( parent = usb->port->hub->usb ) ; usb = parent ) {
2342 route <<= 4;
2343 route |= ( ( usb->port->address > 0xf ) ?
2344 0xf : usb->port->address );
2345 }
2346
2347 return route;
2348}
void route(void)
Print routing table.
Definition route.c:40
unsigned int address
Port address.
Definition usb.h:817

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

Referenced by xhci_device_address().

◆ usb_root_hub_port()

struct usb_port * usb_root_hub_port ( struct usb_device * usb)
extern

Get USB root hub port.

Parameters
usbUSB device
Return values
portRoot hub port

Definition at line 2356 of file usb.c.

2356 {
2357 struct usb_device *parent;
2358
2359 /* Navigate up to root hub */
2360 while ( ( parent = usb->port->hub->usb ) )
2361 usb = parent;
2362
2363 return usb->port;
2364}

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

Referenced by xhci_device_address(), and xhci_device_open().

◆ usb_transaction_translator()

struct usb_port * usb_transaction_translator ( struct usb_device * usb)
extern

Get USB transaction translator.

Parameters
usbUSB device
Return values
portTransaction translator port, or NULL

Definition at line 2372 of file usb.c.

2372 {
2373 struct usb_device *parent;
2374
2375 /* Navigate up to root hub. If we find a low-speed or
2376 * full-speed device with a higher-speed parent hub, then that
2377 * device's port is the transaction translator.
2378 */
2379 for ( ; ( parent = usb->port->hub->usb ) ; usb = parent ) {
2380 if ( ( usb->speed <= USB_SPEED_FULL ) &&
2381 ( parent->speed > USB_SPEED_FULL ) )
2382 return usb->port;
2383 }
2384
2385 return NULL;
2386}

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 )
extern

Find USB device driver.

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

Definition at line 1167 of file usb.c.

1168 {
1169 struct usb_driver *driver;
1170 unsigned int i;
1171
1172 /* Look for a matching driver */
1173 for_each_table_entry ( driver, USB_DRIVERS ) {
1174 for ( i = 0 ; i < driver->id_count ; i++ ) {
1175
1176 /* Ignore non-matching driver class */
1177 if ( ( driver->class.class.scalar ^ desc->class.scalar )
1178 & driver->class.mask.scalar )
1179 continue;
1180
1181 /* Look for a matching ID */
1182 *id = &driver->ids[i];
1183 if ( ( ( (*id)->vendor == desc->vendor ) ||
1184 ( (*id)->vendor == USB_ANY_ID ) ) &&
1185 ( ( (*id)->product == desc->product ) ||
1186 ( (*id)->product == USB_ANY_ID ) ) )
1187 return driver;
1188 }
1189 }
1190
1191 /* Not found */
1192 *id = NULL;
1193 return NULL;
1194}
#define USB_DRIVERS
USB driver table.
Definition usb.h:1450
union usb_class_descriptor class
Class.
Definition usb.h:1390
union usb_class_descriptor mask
Class mask.
Definition usb.h:1392
A USB driver.
Definition usb.h:1419
struct usb_class_id class
Class ID.
Definition usb.h:1425
unsigned int id_count
Number of entries in ID table.
Definition usb.h:1423
struct usb_device_id * ids
USB ID table.
Definition usb.h:1421
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition tables.h:386
uint32_t scalar
Scalar value.
Definition usb.h:648

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

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

Variable Documentation

◆ usb_buses

struct list_head usb_buses
extern

List of USB buses.

Definition at line 45 of file usb.c.

Referenced by register_usb_bus().