iPXE
Data Structures | Macros | Functions
uhci.h File Reference

USB Universal Host Controller Interface (UHCI) driver. More...

#include <assert.h>
#include <ipxe/pci.h>
#include <ipxe/usb.h>

Go to the source code of this file.

Data Structures

struct  uhci_frame_list
 A frame list. More...
 
struct  uhci_transfer_descriptor
 A transfer descriptor. More...
 
struct  uhci_queue_head
 A queue head. More...
 
struct  uhci_transfer
 A single UHCI transfer. More...
 
struct  uhci_ring
 A transfer ring. More...
 
struct  uhci_device
 A UHCI device. More...
 
struct  uhci_endpoint
 A UHCI endpoint. More...
 

Macros

#define UHCI_ALIGN   16
 Minimum alignment required for data structures. More...
 
#define UHCI_PORTS   2
 Number of ports. More...
 
#define UHCI_MTU   1280
 Maximum transfer size. More...
 
#define UHCI_BAR_SIZE   0x14
 I/O BAR size. More...
 
#define UHCI_USBCMD   0x00
 USB command register. More...
 
#define UHCI_USBCMD_MAX64   0x0080
 Max packet is 64 bytes. More...
 
#define UHCI_USBCMD_HCRESET   0x0002
 Host controller reset. More...
 
#define UHCI_USBCMD_RUN   0x0001
 Run/stop. More...
 
#define UHCI_USBSTS   0x02
 USB status register. More...
 
#define UHCI_USBSTS_HCHALTED   0x0020
 Host controller halted. More...
 
#define UHCI_USBSTS_USBINT   0x0001
 USB interrupt. More...
 
#define UHCI_FLBASEADD   0x08
 Frame list base address register. More...
 
#define UHCI_PORTSC(port)   ( 0x0e + ( (port) << 1 ) )
 Port status and control register. More...
 
#define UHCI_PORTSC_PR   0x0200
 Port reset. More...
 
#define UHCI_PORTSC_LS   0x0100
 Low-speed device attached. More...
 
#define UHCI_PORTSC_PEC   0x0008
 Port enabled/disabled change. More...
 
#define UHCI_PORTSC_PED   0x0004
 Port enabled. More...
 
#define UHCI_PORTSC_CSC   0x0002
 Connect status change. More...
 
#define UHCI_PORTSC_CCS   0x0001
 Current connect status. More...
 
#define UHCI_PORTSC_CHANGE   ( UHCI_PORTSC_CSC | UHCI_PORTSC_PEC )
 Port status change mask. More...
 
#define UHCI_LINK_DEPTH_FIRST   0x00000004UL
 Depth-first processing. More...
 
#define UHCI_LINK_TYPE_QH   0x00000002UL
 Queue head type. More...
 
#define UHCI_LINK_TERMINATE   0x00000001UL
 List terminator. More...
 
#define UHCI_FRAMES   1024
 Number of frames in frame list. More...
 
#define UHCI_LEN_MASK   0x7ff
 Length mask. More...
 
#define UHCI_ACTUAL_LEN(actual)   ( ( (actual) + 1 ) & UHCI_LEN_MASK )
 Actual length. More...
 
#define UHCI_STATUS_ACTIVE   0x80
 Active. More...
 
#define UHCI_STATUS_STALLED   0x40
 Stalled. More...
 
#define UHCI_STATUS_BUFFER   0x20
 Data buffer error. More...
 
#define UHCI_STATUS_BABBLE   0x10
 Babble detected. More...
 
#define UHCI_STATUS_NAK   0x08
 NAK received. More...
 
#define UHCI_STATUS_CRC_TIMEOUT   0x04
 CRC/timeout error. More...
 
#define UHCI_STATUS_BITSTUFF   0x02
 Bitstuff error. More...
 
#define UHCI_FL_SPD   0x20
 Short packet detect. More...
 
#define UHCI_FL_CERR(count)   ( (count) << 3 )
 Error counter. More...
 
#define UHCI_FL_CERR_MAX   UHCI_FL_CERR ( 3 )
 Error counter maximum value. More...
 
#define UHCI_FL_LS   0x04
 Low speed device. More...
 
#define UHCI_FL_IOC   0x01
 Interrupt on completion. More...
 
#define UHCI_CONTROL_PID(pid)   ( (pid) << 0 )
 Packet ID. More...
 
#define UHCI_CONTROL_PID_MASK   UHCI_CONTROL_PID ( 0xff )
 Packet ID mask. More...
 
#define UHCI_CONTROL_DEVICE(address)   ( (address) << 8 )
 Device address. More...
 
#define UHCI_CONTROL_ENDPOINT(address)   ( (address) << 15 )
 Endpoint address. More...
 
#define UHCI_CONTROL_TOGGLE   ( 1 << 19 )
 Data toggle. More...
 
#define UHCI_CONTROL_LEN(len)   ( ( ( (len) - 1 ) & UHCI_LEN_MASK ) << 21 )
 Data length. More...
 
#define UHCI_DATA_PACKET(control)   ( ! ( control & 0x04 ) )
 Check for data packet. More...
 
#define UHCI_SHORT_PACKET(control, actual)   ( ( ( (control) >> 21 ) ^ (actual) ) & UHCI_LEN_MASK )
 Check for short packet. More...
 
#define UHCI_USBLEGSUP   0xc0
 USB legacy support register (in PCI configuration space) More...
 
#define UHCI_USBLEGSUP_DEFAULT   0x2000
 USB legacy support default value. More...
 
#define UHCI_RING_COUNT   16
 Number of transfer descriptors in a ring. More...
 
#define UHCI_STOP_MAX_WAIT_MS   100
 Maximum time to wait for host controller to stop. More...
 
#define UHCI_RESET_MAX_WAIT_MS   500
 Maximum time to wait for reset to complete. More...
 
#define UHCI_PORT_ENABLE_MAX_WAIT_MS   500
 Maximum time to wait for a port to be enabled. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
 FILE_SECBOOT (PERMITTED)
 
static unsigned int uhci_ring_fill (struct uhci_ring *ring)
 Calculate space used in transfer ring. More...
 
static unsigned int uhci_ring_remaining (struct uhci_ring *ring)
 Calculate space remaining in transfer ring. More...
 

Detailed Description

USB Universal Host Controller Interface (UHCI) driver.

Definition in file uhci.h.

Macro Definition Documentation

◆ UHCI_ALIGN

#define UHCI_ALIGN   16

Minimum alignment required for data structures.

With the exception of the frame list (which is page-aligned), data structures used by UHCI generally require 16-byte alignment.

Definition at line 22 of file uhci.h.

◆ UHCI_PORTS

#define UHCI_PORTS   2

Number of ports.

Definition at line 25 of file uhci.h.

◆ UHCI_MTU

#define UHCI_MTU   1280

Maximum transfer size.

Definition at line 28 of file uhci.h.

◆ UHCI_BAR_SIZE

#define UHCI_BAR_SIZE   0x14

I/O BAR size.

Definition at line 31 of file uhci.h.

◆ UHCI_USBCMD

#define UHCI_USBCMD   0x00

USB command register.

Definition at line 34 of file uhci.h.

◆ UHCI_USBCMD_MAX64

#define UHCI_USBCMD_MAX64   0x0080

Max packet is 64 bytes.

Definition at line 37 of file uhci.h.

◆ UHCI_USBCMD_HCRESET

#define UHCI_USBCMD_HCRESET   0x0002

Host controller reset.

Definition at line 40 of file uhci.h.

◆ UHCI_USBCMD_RUN

#define UHCI_USBCMD_RUN   0x0001

Run/stop.

Definition at line 43 of file uhci.h.

◆ UHCI_USBSTS

#define UHCI_USBSTS   0x02

USB status register.

Definition at line 46 of file uhci.h.

◆ UHCI_USBSTS_HCHALTED

#define UHCI_USBSTS_HCHALTED   0x0020

Host controller halted.

Definition at line 49 of file uhci.h.

◆ UHCI_USBSTS_USBINT

#define UHCI_USBSTS_USBINT   0x0001

USB interrupt.

Definition at line 52 of file uhci.h.

◆ UHCI_FLBASEADD

#define UHCI_FLBASEADD   0x08

Frame list base address register.

Definition at line 55 of file uhci.h.

◆ UHCI_PORTSC

#define UHCI_PORTSC (   port)    ( 0x0e + ( (port) << 1 ) )

Port status and control register.

Definition at line 58 of file uhci.h.

◆ UHCI_PORTSC_PR

#define UHCI_PORTSC_PR   0x0200

Port reset.

Definition at line 61 of file uhci.h.

◆ UHCI_PORTSC_LS

#define UHCI_PORTSC_LS   0x0100

Low-speed device attached.

Definition at line 64 of file uhci.h.

◆ UHCI_PORTSC_PEC

#define UHCI_PORTSC_PEC   0x0008

Port enabled/disabled change.

Definition at line 67 of file uhci.h.

◆ UHCI_PORTSC_PED

#define UHCI_PORTSC_PED   0x0004

Port enabled.

Definition at line 70 of file uhci.h.

◆ UHCI_PORTSC_CSC

#define UHCI_PORTSC_CSC   0x0002

Connect status change.

Definition at line 73 of file uhci.h.

◆ UHCI_PORTSC_CCS

#define UHCI_PORTSC_CCS   0x0001

Current connect status.

Definition at line 76 of file uhci.h.

◆ UHCI_PORTSC_CHANGE

#define UHCI_PORTSC_CHANGE   ( UHCI_PORTSC_CSC | UHCI_PORTSC_PEC )

Port status change mask.

Definition at line 79 of file uhci.h.

◆ UHCI_LINK_DEPTH_FIRST

#define UHCI_LINK_DEPTH_FIRST   0x00000004UL

Depth-first processing.

Definition at line 82 of file uhci.h.

◆ UHCI_LINK_TYPE_QH

#define UHCI_LINK_TYPE_QH   0x00000002UL

Queue head type.

Definition at line 85 of file uhci.h.

◆ UHCI_LINK_TERMINATE

#define UHCI_LINK_TERMINATE   0x00000001UL

List terminator.

Definition at line 88 of file uhci.h.

◆ UHCI_FRAMES

#define UHCI_FRAMES   1024

Number of frames in frame list.

Definition at line 91 of file uhci.h.

◆ UHCI_LEN_MASK

#define UHCI_LEN_MASK   0x7ff

Length mask.

Definition at line 116 of file uhci.h.

◆ UHCI_ACTUAL_LEN

#define UHCI_ACTUAL_LEN (   actual)    ( ( (actual) + 1 ) & UHCI_LEN_MASK )

Actual length.

Definition at line 119 of file uhci.h.

◆ UHCI_STATUS_ACTIVE

#define UHCI_STATUS_ACTIVE   0x80

Active.

Definition at line 122 of file uhci.h.

◆ UHCI_STATUS_STALLED

#define UHCI_STATUS_STALLED   0x40

Stalled.

Definition at line 125 of file uhci.h.

◆ UHCI_STATUS_BUFFER

#define UHCI_STATUS_BUFFER   0x20

Data buffer error.

Definition at line 128 of file uhci.h.

◆ UHCI_STATUS_BABBLE

#define UHCI_STATUS_BABBLE   0x10

Babble detected.

Definition at line 131 of file uhci.h.

◆ UHCI_STATUS_NAK

#define UHCI_STATUS_NAK   0x08

NAK received.

Definition at line 134 of file uhci.h.

◆ UHCI_STATUS_CRC_TIMEOUT

#define UHCI_STATUS_CRC_TIMEOUT   0x04

CRC/timeout error.

Definition at line 137 of file uhci.h.

◆ UHCI_STATUS_BITSTUFF

#define UHCI_STATUS_BITSTUFF   0x02

Bitstuff error.

Definition at line 140 of file uhci.h.

◆ UHCI_FL_SPD

#define UHCI_FL_SPD   0x20

Short packet detect.

Definition at line 143 of file uhci.h.

◆ UHCI_FL_CERR

#define UHCI_FL_CERR (   count)    ( (count) << 3 )

Error counter.

Definition at line 146 of file uhci.h.

◆ UHCI_FL_CERR_MAX

#define UHCI_FL_CERR_MAX   UHCI_FL_CERR ( 3 )

Error counter maximum value.

Definition at line 149 of file uhci.h.

◆ UHCI_FL_LS

#define UHCI_FL_LS   0x04

Low speed device.

Definition at line 152 of file uhci.h.

◆ UHCI_FL_IOC

#define UHCI_FL_IOC   0x01

Interrupt on completion.

Definition at line 155 of file uhci.h.

◆ UHCI_CONTROL_PID

#define UHCI_CONTROL_PID (   pid)    ( (pid) << 0 )

Packet ID.

Definition at line 158 of file uhci.h.

◆ UHCI_CONTROL_PID_MASK

#define UHCI_CONTROL_PID_MASK   UHCI_CONTROL_PID ( 0xff )

Packet ID mask.

Definition at line 161 of file uhci.h.

◆ UHCI_CONTROL_DEVICE

#define UHCI_CONTROL_DEVICE (   address)    ( (address) << 8 )

Device address.

Definition at line 164 of file uhci.h.

◆ UHCI_CONTROL_ENDPOINT

#define UHCI_CONTROL_ENDPOINT (   address)    ( (address) << 15 )

Endpoint address.

Definition at line 167 of file uhci.h.

◆ UHCI_CONTROL_TOGGLE

#define UHCI_CONTROL_TOGGLE   ( 1 << 19 )

Data toggle.

Definition at line 170 of file uhci.h.

◆ UHCI_CONTROL_LEN

#define UHCI_CONTROL_LEN (   len)    ( ( ( (len) - 1 ) & UHCI_LEN_MASK ) << 21 )

Data length.

Definition at line 173 of file uhci.h.

◆ UHCI_DATA_PACKET

#define UHCI_DATA_PACKET (   control)    ( ! ( control & 0x04 ) )

Check for data packet.

This check is based on the fact that only USB_PID_SETUP has bit 2 set.

Definition at line 180 of file uhci.h.

◆ UHCI_SHORT_PACKET

#define UHCI_SHORT_PACKET (   control,
  actual 
)    ( ( ( (control) >> 21 ) ^ (actual) ) & UHCI_LEN_MASK )

Check for short packet.

Definition at line 183 of file uhci.h.

◆ UHCI_USBLEGSUP

#define UHCI_USBLEGSUP   0xc0

USB legacy support register (in PCI configuration space)

Definition at line 187 of file uhci.h.

◆ UHCI_USBLEGSUP_DEFAULT

#define UHCI_USBLEGSUP_DEFAULT   0x2000

USB legacy support default value.

Definition at line 190 of file uhci.h.

◆ UHCI_RING_COUNT

#define UHCI_RING_COUNT   16

Number of transfer descriptors in a ring.

This is a policy decision.

Definition at line 229 of file uhci.h.

◆ UHCI_STOP_MAX_WAIT_MS

#define UHCI_STOP_MAX_WAIT_MS   100

Maximum time to wait for host controller to stop.

This is a policy decision.

Definition at line 293 of file uhci.h.

◆ UHCI_RESET_MAX_WAIT_MS

#define UHCI_RESET_MAX_WAIT_MS   500

Maximum time to wait for reset to complete.

This is a policy decision.

Definition at line 299 of file uhci.h.

◆ UHCI_PORT_ENABLE_MAX_WAIT_MS

#define UHCI_PORT_ENABLE_MAX_WAIT_MS   500

Maximum time to wait for a port to be enabled.

This is a policy decision.

Definition at line 305 of file uhci.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED  )

◆ uhci_ring_fill()

static unsigned int uhci_ring_fill ( struct uhci_ring ring)
inlinestatic

Calculate space used in transfer ring.

Parameters
ringTransfer ring
Return values
fillNumber of entries used

Definition at line 268 of file uhci.h.

268  {
269  unsigned int fill;
270 
271  fill = ( ring->prod - ring->cons );
272  assert ( fill <= UHCI_RING_COUNT );
273  return fill;
274 }
unsigned int cons
Consumer counter.
Definition: uhci.h:236
#define UHCI_RING_COUNT
Number of transfer descriptors in a ring.
Definition: uhci.h:229
unsigned int prod
Producer counter.
Definition: uhci.h:234
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static int fill
Definition: string.h:209

References assert(), uhci_ring::cons, fill, uhci_ring::prod, and UHCI_RING_COUNT.

Referenced by uhci_dequeue(), uhci_endpoint_close(), uhci_endpoint_poll(), uhci_enqueue(), uhci_restart(), uhci_ring_free(), and uhci_ring_remaining().

◆ uhci_ring_remaining()

static unsigned int uhci_ring_remaining ( struct uhci_ring ring)
inlinestatic

Calculate space remaining in transfer ring.

Parameters
ringTransfer ring
Return values
remainingNumber of entries remaining

Definition at line 283 of file uhci.h.

283  {
284  unsigned int fill = uhci_ring_fill ( ring );
285 
286  return ( UHCI_RING_COUNT - fill );
287 }
static unsigned int uhci_ring_fill(struct uhci_ring *ring)
Calculate space used in transfer ring.
Definition: uhci.h:268
#define UHCI_RING_COUNT
Number of transfer descriptors in a ring.
Definition: uhci.h:229
static int fill
Definition: string.h:209

References fill, UHCI_RING_COUNT, and uhci_ring_fill().

Referenced by uhci_enqueue().