/* Max number of USB devices for any host controller - limit in section 6.1 */ #define MAX_HC_SLOTS 256 /* Section 5.3.3 - MaxPorts */ #define MAX_HC_PORTS 127
/* USBCMD - USB command - command bitmasks */ /* start/stop HC execution - do not write unless HC is halted*/ #define CMD_RUN XHCI_CMD_RUN /* Reset HC - resets internal HC state machine and all registers (except *PCIconfigregs).HCdoesNOTdriveaUSBresetonthedownstreamports. *ThexHCIdrivermustreinitializethexHCaftersettingthisbit.
*/ #define CMD_RESET (1 << 1) /* Event Interrupt Enable - a '1' allows interrupts from the host controller */ #define CMD_EIE XHCI_CMD_EIE /* Host System Error Interrupt Enable - get out-of-band signal for HC errors */ #define CMD_HSEIE XHCI_CMD_HSEIE /* bits 4:6 are reserved (and should be preserved on writes). */ /* light reset (port status stays unchanged) - reset completed when this is 0 */ #define CMD_LRESET (1 << 7) /* host controller save/restore state. */ #define CMD_CSS (1 << 8) #define CMD_CRS (1 << 9) /* Enable Wrap Event - '1' means xHC generates an event when MFINDEX wraps. */ #define CMD_EWE XHCI_CMD_EWE /* MFINDEX power management - '1' means xHC can stop MFINDEX counter if all root *hubsareinU3(selectivesuspend),disconnect,disabled,orpowered-off. *'0'meansthexHCcanpoweritoffifallportsareinthedisconnect, *disabled,orpowered-offstate.
*/ #define CMD_PM_INDEX (1 << 11) /* bit 14 Extended TBC Enable, changes Isoc TRB fields to support larger TBC */ #define CMD_ETE (1 << 14) /* bits 15:31 are reserved (and should be preserved on writes). */
/* USBSTS - USB status - status bitmasks */ /* HC not running - set to 1 when run/stop bit is cleared. */ #define STS_HALT XHCI_STS_HALT /* serious error, e.g. PCI parity error. The HC will clear the run/stop bit. */ #define STS_FATAL (1 << 2) /* event interrupt - clear this prior to clearing any IP flags in IR set*/ #define STS_EINT (1 << 3) /* port change detect */ #define STS_PORT (1 << 4) /* bits 5:7 reserved and zeroed */ /* save state status - '1' means xHC is saving state */ #define STS_SAVE (1 << 8) /* restore state status - '1' means xHC is restoring state */ #define STS_RESTORE (1 << 9) /* true: save or restore error */ #define STS_SRE (1 << 10) /* true: Controller Not Ready to accept doorbell or op reg writes after reset */ #define STS_CNR XHCI_STS_CNR /* true: internal Host Controller Error - SW needs to reset and reinitialize */ #define STS_HCE (1 << 12) /* bits 13:31 reserved and should be preserved */
/* *DNCTRL-DeviceNotificationControlRegister-dev_notificationbitmasks *GenerateadevicenotificationeventwhentheHCseesatransactionwitha *notificationtypethatmatchesabitsetinthisbitfield.
*/ #define DEV_NOTE_MASK (0xffff) /* Most of the device notification types should only be used for debug. *SWdoesneedtopayattentiontofunctionwakenotifications.
*/ #define DEV_NOTE_FWAKE (1 << 1)
/* CRCR - Command Ring Control Register - cmd_ring bitmasks */ /* bit 0 - Cycle bit indicates the ownership of the command ring */ #define CMD_RING_CYCLE (1 << 0) /* stop ring operation after completion of the currently executing command */ #define CMD_RING_PAUSE (1 << 1) /* stop ring immediately - abort the currently executing command */ #define CMD_RING_ABORT (1 << 2) /* true: command ring is running */ #define CMD_RING_RUNNING (1 << 3) /* bits 63:6 - Command Ring pointer */ #define CMD_RING_PTR_MASK GENMASK_ULL(63, 6)
/* CONFIG - Configure Register - config_reg bitmasks */ /* bits 0:7 - maximum number of device slots enabled (NumSlotsEn) */ #define MAX_DEVS(p) ((p) & 0xff) /* bit 8: U3 Entry Enabled, assert PLC when root port enters U3, xhci 1.1 */ #define CONFIG_U3E (1 << 8) /* bit 9: Configuration Information Enable, xhci 1.1 */ #define CONFIG_CIE (1 << 9) /* bits 10:31 - reserved and should be preserved */
/* iman bitmasks */ /* bit 0 - Interrupt Pending (IP), whether there is an interrupt pending. Write-1-to-clear. */ #define IMAN_IP (1 << 0) /* bit 1 - Interrupt Enable (IE), whether the interrupter is capable of generating an interrupt */ #define IMAN_IE (1 << 1)
/* imod bitmasks */ /* *bits15:0-InterruptModerationInterval,theminimumintervalbetweeninterrupts *(in250nsintervals).Theintervalbetweeninterruptswillbelongerifthereareno *eventsontheeventring.Defaultis4000(1ms).
*/ #define IMODI_MASK (0xffff) /* bits 31:16 - Interrupt Moderation Counter, used to count down the time to the next interrupt */ #define IMODC_MASK (0xffff << 16)
/* erst_size bitmasks */ /* bits 15:0 - Event Ring Segment Table Size, number of ERST entries */ #define ERST_SIZE_MASK (0xffff)
/* erst_base bitmasks */ /* bits 63:6 - Event Ring Segment Table Base Address Register */ #define ERST_BASE_ADDRESS_MASK GENMASK_ULL(63, 6)
/* Represents everything that is needed to issue a command on the command ring. *It'susefultopre-allocatetheseforcommandsthatcannotfaildueto *out-of-memoryerrors,likefreeingstreams.
*/ struct xhci_command { /* Input context for changing device state */ struct xhci_container_ctx *in_ctx;
u32 status;
u32 comp_param; int slot_id; /* If completion is null, no one is waiting on this command *andthestructurecanbefreedafterthecommandcompletes.
*/ struct completion *completion; union xhci_trb *command_trb; struct list_head cmd_list; /* xHCI command response timeout in milliseconds */ unsignedint timeout_ms;
};
struct xhci_stream_ctx { /* 64-bit stream ring address, cycle state, and stream type */
__le64 stream_ring; /* offset 0x14 - 0x1f reserved for HC internal use */
__le32 reserved[2];
};
/* Stream Context Types (section 6.4.1) - bits 3:1 of stream ctx deq ptr */ #define SCT_FOR_CTX(p) (((p) & 0x7) << 1) #define CTX_TO_SCT(p) (((p) >> 1) & 0x7) /* Secondary stream array type, dequeue pointer is to a transfer ring */ #define SCT_SEC_TR 0 /* Primary stream array type, dequeue pointer is to a transfer ring */ #define SCT_PRI_TR 1 /* Dequeue pointer is for a secondary stream array (SSA) with 8 entries */ #define SCT_SSA_8 2 #define SCT_SSA_16 3 #define SCT_SSA_32 4 #define SCT_SSA_64 5 #define SCT_SSA_128 6 #define SCT_SSA_256 7
/* Assume no secondary streams for now */ struct xhci_stream_info { struct xhci_ring **stream_rings; /* Number of streams, including stream 0 (which drivers can't use) */ unsignedint num_streams; /* The stream context array may be bigger than *thenumberofstreamsthedriveraskedfor
*/ struct xhci_stream_ctx *stream_ctx_array; unsignedint num_stream_ctxs;
dma_addr_t ctx_array_dma; /* For mapping physical TRB addresses to segments in stream rings */ struct radix_tree_root trb_address_map; struct xhci_command *free_streams_command;
};
/* Some Intel xHCI host controllers need software to keep track of the bus *bandwidth.Keeptrackofendpointinfohere.Eachrootportisallocated *thefullbusbandwidth.WemustalsotreatTTs(includingeachportundera *multi-TThub)asaseparatebandwidthdomain.Thedirectmemoryinterface *(DMI)alsolimitsthetotalbandwidth(acrossalldomains)thatcanbeused.
*/ struct xhci_bw_info { /* ep_interval is zero-based */ unsignedint ep_interval; /* mult and num_packets are one-based */ unsignedint mult; unsignedint num_packets; unsignedint max_packet_size; unsignedint max_esit_payload; unsignedint type;
};
/* "Block" sizes in bytes the hardware uses for different device speeds. *Thelogicinthispartofthehardwarelimitsthenumberofbitsthehardware *canuse,somustrepresentbandwidthinalessprecisemannertomimicwhat *theschedulerhardwarecomputes. */ #defineFS_BLOCK1 #defineHS_BLOCK4 #defineSS_BLOCK16 #defineDMI_BLOCK32
/* Each device speed has a protocol overhead (CRC, bit stuffing, etc) associated *witheachbytetransferred.SuperSpeeddeviceshaveaninitialoverheadto *setupbursts.Theseareinblocks,seeabove.LSoverheadhasalreadybeen *translatedintoFSblocks.
*/ #define DMI_OVERHEAD 8 #define DMI_OVERHEAD_BURST 4 #define SS_OVERHEAD 8 #define SS_OVERHEAD_BURST 32 #define HS_OVERHEAD 26 #define FS_OVERHEAD 20 #define LS_OVERHEAD 128 /* The TTs need to claim roughly twice as much bandwidth (94 bytes per *microframe~=24Mbps)oftheHSbusasthedevicescanactuallyusebecause *ofoverheadassociatedwithsplittransferscrossingmicroframeboundaries. *31blocksispureprotocoloverhead.
*/ #define TT_HS_OVERHEAD (31 + 94) #define TT_DMI_OVERHEAD (25 + 12)
struct xhci_interval_bw {
unsigned int num_packets;
/* Sorted by max packet size.
* Head of the list is the greatest max packet size.
*/
struct list_head endpoints;
/* How many endpoints of each speed are present. */
unsigned int overhead[3];
};
#define XHCI_MAX_INTERVAL 16
struct xhci_interval_bw_table {
unsigned int interval0_esit_payload;
struct xhci_interval_bw interval_bw[XHCI_MAX_INTERVAL];
/* Includes reserved bandwidth for async endpoints */
unsigned int bw_used;
unsigned int ss_bw_in;
unsigned int ss_bw_out;
};
#define EP_CTX_PER_DEV 31
struct xhci_virt_device {
int slot_id;
struct usb_device *udev;
/*
* Commands to the hardware are passed an "input context" that
* tells the hardware what to change in its data structures.
* The hardware will return changes in an "output context" that
* software must allocate for the hardware. We need to keep
* track of input and output contexts separately because
* these commands might fail and we don't trust the hardware.
*/
struct xhci_container_ctx *out_ctx;
/* Used for addressing devices and configuration changes */
struct xhci_container_ctx *in_ctx;
struct xhci_virt_ep eps[EP_CTX_PER_DEV];
struct xhci_port *rhub_port;
struct xhci_interval_bw_table *bw_table;
struct xhci_tt_bw_info *tt_info;
/*
* flags for state tracking based on events and issued commands.
* Software can not rely on states from output contexts because of
* latency between events and xHC updating output context values.
* See xhci 1.1 section 4.8.3 for more details
*/
unsigned long flags;
#define VDEV_PORT_ERROR BIT(0) /* Port error, link inactive */
/* The current max exit latency for the enabled USB3 link states. */
u16 current_mel;
/* Used for the debugfs interfaces. */
void *debugfs_private;
/* set if this endpoint is controlled via sideband access*/
struct xhci_sideband *sideband;
};
/*
* For each roothub, keep track of the bandwidth information for each periodic
* interval.
*
* If a high speed hub is attached to the roothub, each TT associated with that
* hub is a separate bandwidth domain. The interval information for the
* endpoints on the devices under that TT will appear in the TT structure.
*/
struct xhci_root_port_bw_info {
struct list_head tts;
unsigned int num_active_tts;
struct xhci_interval_bw_table bw_table;
};
struct xhci_tt_bw_info {
struct list_head tt_list;
int slot_id;
int ttport;
struct xhci_interval_bw_table bw_table;
int active_eps;
};
/**
* struct xhci_device_context_array
* @dev_context_ptr array of 64-bit DMA addresses for device contexts
*/
struct xhci_device_context_array {
/* 64-bit device addresses; we only write 32-bit addresses */
__le64 dev_context_ptrs[MAX_HC_SLOTS];
/* private xHCD pointers */
dma_addr_t dma;
};
/* TODO: write function to set the 64-bit device DMA address */
/*
* TODO: change this to be dynamically sized at HC mem init time since the HC
* might not be able to handle the maximum number of devices possible.
*/
struct xhci_transfer_event {
/* 64-bit buffer address, or immediate data */
__le64 buffer;
__le32 transfer_len;
/* This field is interpreted differently based on the type of TRB */
__le32 flags;
};
/* Transfer event flags bitfield, also for select command completion events */
#define TRB_TO_SLOT_ID(p) (((p) >> 24) & 0xff)
#define SLOT_ID_FOR_TRB(p) (((p) & 0xff) << 24)
static inline const char *xhci_trb_comp_code_string(u8 status)
{
switch (status) {
case COMP_INVALID:
return "Invalid";
case COMP_SUCCESS:
return "Success";
case COMP_DATA_BUFFER_ERROR:
return "Data Buffer Error";
case COMP_BABBLE_DETECTED_ERROR:
return "Babble Detected";
case COMP_USB_TRANSACTION_ERROR:
return "USB Transaction Error";
case COMP_TRB_ERROR:
return "TRB Error";
case COMP_STALL_ERROR:
return "Stall Error";
case COMP_RESOURCE_ERROR:
return "Resource Error";
case COMP_BANDWIDTH_ERROR:
return "Bandwidth Error";
case COMP_NO_SLOTS_AVAILABLE_ERROR:
return "No Slots Available Error";
case COMP_INVALID_STREAM_TYPE_ERROR:
return "Invalid Stream Type Error";
case COMP_SLOT_NOT_ENABLED_ERROR:
return "Slot Not Enabled Error";
case COMP_ENDPOINT_NOT_ENABLED_ERROR:
return "Endpoint Not Enabled Error";
case COMP_SHORT_PACKET:
return "Short Packet";
case COMP_RING_UNDERRUN:
return "Ring Underrun";
case COMP_RING_OVERRUN:
return "Ring Overrun";
case COMP_VF_EVENT_RING_FULL_ERROR:
return "VF Event Ring Full Error";
case COMP_PARAMETER_ERROR:
return "Parameter Error";
case COMP_BANDWIDTH_OVERRUN_ERROR:
return "Bandwidth Overrun Error";
case COMP_CONTEXT_STATE_ERROR:
return "Context State Error";
case COMP_NO_PING_RESPONSE_ERROR:
return "No Ping Response Error";
case COMP_EVENT_RING_FULL_ERROR:
return "Event Ring Full Error";
case COMP_INCOMPATIBLE_DEVICE_ERROR:
return "Incompatible Device Error";
case COMP_MISSED_SERVICE_ERROR:
return "Missed Service Error";
case COMP_COMMAND_RING_STOPPED:
return "Command Ring Stopped";
case COMP_COMMAND_ABORTED:
return "Command Aborted";
case COMP_STOPPED:
return "Stopped";
case COMP_STOPPED_LENGTH_INVALID:
return "Stopped - Length Invalid";
case COMP_STOPPED_SHORT_PACKET:
return "Stopped - Short Packet";
case COMP_MAX_EXIT_LATENCY_TOO_LARGE_ERROR:
return "Max Exit Latency Too Large Error";
case COMP_ISOCH_BUFFER_OVERRUN:
return "Isoch Buffer Overrun";
case COMP_EVENT_LOST_ERROR:
return "Event Lost Error";
case COMP_UNDEFINED_ERROR:
return "Undefined Error";
case COMP_INVALID_STREAM_ID_ERROR:
return "Invalid Stream ID Error";
case COMP_SECONDARY_BANDWIDTH_ERROR:
return "Secondary Bandwidth Error";
case COMP_SPLIT_TRANSACTION_ERROR:
return "Split Transaction Error";
default:
return "Unknown!!";
}
}
/* control bitfields */
#define LINK_TOGGLE (0x1<<1)
/* Command completion event TRB */
struct xhci_event_cmd {
/* Pointer to command TRB, or the value passed by the event data trb */
__le64 cmd_trb;
__le32 status;
__le32 flags;
};
/* Link TRB specific fields */
#define TRB_TC (1<<1)
/* Port Status Change Event TRB fields */
/* Port ID - bits 31:24 */
#define GET_PORT_ID(p) (((p) & (0xff << 24)) >> 24)
#define EVENT_DATA (1 << 2)
/* Normal TRB fields */
/* transfer_len bitmasks - bits 0:16 */
#define TRB_LEN(p) ((p) & 0x1ffff)
/* TD Size, packets remaining in this TD, bits 21:17 (5 bits, so max 31) */
#define TRB_TD_SIZE(p) (min((p), (u32)31) << 17)
#define GET_TD_SIZE(p) (((p) & 0x3e0000) >> 17)
/* xhci 1.1 uses the TD_SIZE field for TBC if Extended TBC is enabled (ETE) */
#define TRB_TD_SIZE_TBC(p) (min((p), (u32)31) << 17)
/* Interrupter Target - which MSI-X vector to target the completion event at */
#define TRB_INTR_TARGET(p) (((p) & 0x3ff) << 22)
#define GET_INTR_TARGET(p) (((p) >> 22) & 0x3ff)
/* Cycle bit - indicates TRB ownership by HC or HCD */
#define TRB_CYCLE (1<<0)
/*
* Force next event data TRB to be evaluated before task switch.
* Used to pass OS data back after a TD completes.
*/
#define TRB_ENT (1<<1)
/* Interrupt on short packet */
#define TRB_ISP (1<<2)
/* Set PCIe no snoop attribute */
#define TRB_NO_SNOOP (1<<3)
/* Chain multiple TRBs into a TD */
#define TRB_CHAIN (1<<4)
/* Interrupt on completion */
#define TRB_IOC (1<<5)
/* The buffer pointer contains immediate data */
#define TRB_IDT (1<<6)
/* TDs smaller than this might use IDT */
#define TRB_IDT_MAX_SIZE 8
/* TRB bit mask */
#define TRB_TYPE_BITMASK (0xfc00)
#define TRB_TYPE(p) ((p) << 10)
#define TRB_FIELD_TO_TYPE(p) (((p) & TRB_TYPE_BITMASK) >> 10)
/* TRB type IDs */
/* bulk, interrupt, isoc scatter/gather, and control data stage */
#define TRB_NORMAL 1 /* setup stage for control transfers */ #define TRB_SETUP 2 /* data stage for control transfers */ #define TRB_DATA 3 /* status stage for control transfers */ #define TRB_STATUS 4 /* isoc transfers */ #define TRB_ISOC 5 /* TRB for linking ring segments */ #define TRB_LINK 6 #define TRB_EVENT_DATA 7 /* Transfer Ring No-op (not for the command ring) */ #define TRB_TR_NOOP 8 /* Command TRBs */ /* Enable Slot Command */ #define TRB_ENABLE_SLOT 9 /* Disable Slot Command */ #define TRB_DISABLE_SLOT 10 /* Address Device Command */ #define TRB_ADDR_DEV 11 /* Configure Endpoint Command */ #define TRB_CONFIG_EP 12 /* Evaluate Context Command */ #define TRB_EVAL_CONTEXT 13 /* Reset Endpoint Command */ #define TRB_RESET_EP 14 /* Stop Transfer Ring Command */ #define TRB_STOP_RING 15 /* Set Transfer Ring Dequeue Pointer Command */ #define TRB_SET_DEQ 16 /* Reset Device Command */ #define TRB_RESET_DEV 17 /* Force Event Command (opt) */ #define TRB_FORCE_EVENT 18 /* Negotiate Bandwidth Command (opt) */ #define TRB_NEG_BANDWIDTH 19 /* Set Latency Tolerance Value Command (opt) */ #define TRB_SET_LT 20 /* Get port bandwidth Command */ #define TRB_GET_BW 21 /* Force Header Command - generate a transaction or link management packet */ #define TRB_FORCE_HEADER 22 /* No-op Command - not for transfer rings */ #define TRB_CMD_NOOP 23 /* TRB IDs 24-31 reserved */ /* Event TRBS */ /* Transfer Event */ #define TRB_TRANSFER 32 /* Command Completion Event */ #define TRB_COMPLETION 33 /* Port Status Change Event */ #define TRB_PORT_STATUS 34 /* Bandwidth Request Event (opt) */ #define TRB_BANDWIDTH_EVENT 35 /* Doorbell Event (opt) */ #define TRB_DOORBELL 36 /* Host Controller Event */ #define TRB_HC_EVENT 37 /* Device Notification Event - device sent function wake notification */ #define TRB_DEV_NOTE 38 /* MFINDEX Wrap Event - microframe counter wrapped */ #define TRB_MFINDEX_WRAP 39 /* TRB IDs 40-47 reserved, 48-63 is vendor-defined */ #define TRB_VENDOR_DEFINED_LOW 48 /* Nec vendor-specific command completion event. */ #define TRB_NEC_CMD_COMP 48 /* Get NEC firmware revision. */ #define TRB_NEC_GET_FW 49
staticinlineconstchar *xhci_trb_type_string(u8 type)
{ switch (type) { case TRB_NORMAL: return"Normal"; case TRB_SETUP: return"Setup Stage"; case TRB_DATA: return"Data Stage"; case TRB_STATUS: return"Status Stage"; case TRB_ISOC: return"Isoch"; case TRB_LINK: return"Link"; case TRB_EVENT_DATA: return"Event Data"; case TRB_TR_NOOP: return"No-Op"; case TRB_ENABLE_SLOT: return"Enable Slot Command"; case TRB_DISABLE_SLOT: return"Disable Slot Command"; case TRB_ADDR_DEV: return"Address Device Command"; case TRB_CONFIG_EP: return"Configure Endpoint Command"; case TRB_EVAL_CONTEXT: return"Evaluate Context Command"; case TRB_RESET_EP: return"Reset Endpoint Command"; case TRB_STOP_RING: return"Stop Ring Command"; case TRB_SET_DEQ: return"Set TR Dequeue Pointer Command"; case TRB_RESET_DEV: return"Reset Device Command"; case TRB_FORCE_EVENT: return"Force Event Command"; case TRB_NEG_BANDWIDTH: return"Negotiate Bandwidth Command"; case TRB_SET_LT: return"Set Latency Tolerance Value Command"; case TRB_GET_BW: return"Get Port Bandwidth Command"; case TRB_FORCE_HEADER: return"Force Header Command"; case TRB_CMD_NOOP: return"No-Op Command"; case TRB_TRANSFER: return"Transfer Event"; case TRB_COMPLETION: return"Command Completion Event"; case TRB_PORT_STATUS: return"Port Status Change Event"; case TRB_BANDWIDTH_EVENT: return"Bandwidth Request Event"; case TRB_DOORBELL: return"Doorbell Event"; case TRB_HC_EVENT: return"Host Controller Event"; case TRB_DEV_NOTE: return"Device Notification Event"; case TRB_MFINDEX_WRAP: return"MFINDEX Wrap Event"; case TRB_NEC_CMD_COMP: return"NEC Command Completion Event"; case TRB_NEC_GET_FW: return"NET Get Firmware Revision Command"; default: return"UNKNOWN";
}
}
#define TRB_TYPE_LINK(x) (((x) & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK)) /* Above, but for __le32 types -- can avoid work by swapping constants: */ #define TRB_TYPE_LINK_LE32(x) (((x) & cpu_to_le32(TRB_TYPE_BITMASK)) == \
cpu_to_le32(TRB_TYPE(TRB_LINK))) #define TRB_TYPE_NOOP_LE32(x) (((x) & cpu_to_le32(TRB_TYPE_BITMASK)) == \
cpu_to_le32(TRB_TYPE(TRB_TR_NOOP)))
staticinlineconstchar *xhci_ring_type_string(enum xhci_ring_type type)
{ switch (type) { case TYPE_CTRL: return"CTRL"; case TYPE_ISOC: return"ISOC"; case TYPE_BULK: return"BULK"; case TYPE_INTR: return"INTR"; case TYPE_STREAM: return"STREAM"; case TYPE_COMMAND: return"CMD"; case TYPE_EVENT: return"EVENT";
}
struct urb_priv { int num_tds; int num_tds_done; struct xhci_td td[] __counted_by(num_tds);
};
/* Number of Event Ring segments to allocate, when amount is not specified. (spec allows 32k) */ #define ERST_DEFAULT_SEGS 2 /* Poll every 60 seconds */ #define POLL_TIMEOUT 60 /* Stop endpoint command timeout (secs) for URB cancellation watchdog timer */ #define XHCI_STOP_EP_CMD_TIMEOUT 5 /* XXX: Make these module parameters */
/* Port suspend arrays are indexed by the portnum of the fake roothub */ /* ports suspend status arrays - max 31 ports for USB2, 15 for USB3 */
u32 port_c_suspend;
u32 suspended_ports;
u32 port_remote_wakeup; /* which ports have started to resume */ unsignedlong resuming_ports;
};
struct xhci_port {
__le32 __iomem *addr; int hw_portnum; int hcd_portnum; struct xhci_hub *rhub; struct xhci_port_cap *port_cap; unsignedint lpm_incapable:1; unsignedlong resume_timestamp; bool rexit_active; /* Slot ID is the index of the device directly connected to the port */ int slot_id; struct completion rexit_done; struct completion u3exit_done;
};
/* slot enabling and address device helpers */ /* these are not thread safe so use mutex */ struct mutex mutex; /* Internal mirror of the HW's dcbaa */ struct xhci_virt_device *devs[MAX_HC_SLOTS]; /* For keeping track of bandwidth domains per roothub. */ struct xhci_root_port_bw_info *rh_bw;
void *dbc; /* platform-specific data -- must come last */ unsignedlong priv[] __aligned(sizeof(s64));
};
/* Platform specific overrides to generic XHCI hc_driver ops */ struct xhci_driver_overrides {
size_t extra_priv_size; int (*reset)(struct usb_hcd *hcd); int (*start)(struct usb_hcd *hcd); int (*add_endpoint)(struct usb_hcd *hcd, struct usb_device *udev, struct usb_host_endpoint *ep); int (*drop_endpoint)(struct usb_hcd *hcd, struct usb_device *udev, struct usb_host_endpoint *ep); int (*check_bandwidth)(struct usb_hcd *, struct usb_device *); void (*reset_bandwidth)(struct usb_hcd *, struct usb_device *); int (*update_hub_device)(struct usb_hcd *hcd, struct usb_device *hdev, struct usb_tt *tt, gfp_t mem_flags); int (*hub_control)(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
u16 wIndex, char *buf, u16 wLength);
};
#define XHCI_CFC_DELAY 10
/* convert between an HCD pointer and the corresponding EHCI_HCD */ staticinlinestruct xhci_hcd *hcd_to_xhci(struct usb_hcd *hcd)
{ struct usb_hcd *primary_hcd;
if (usb_hcd_is_primary_hcd(hcd))
primary_hcd = hcd; else
primary_hcd = hcd->primary_hcd;
staticinlineconstchar *xhci_portsc_link_state_string(u32 portsc)
{ switch (portsc & PORT_PLS_MASK) { case XDEV_U0: return"U0"; case XDEV_U1: return"U1"; case XDEV_U2: return"U2"; case XDEV_U3: return"U3"; case XDEV_DISABLED: return"Disabled"; case XDEV_RXDETECT: return"RxDetect"; case XDEV_INACTIVE: return"Inactive"; case XDEV_POLLING: return"Polling"; case XDEV_RECOVERY: return"Recovery"; case XDEV_HOT_RESET: return"Hot Reset"; case XDEV_COMP_MODE: return"Compliance mode"; case XDEV_TEST_MODE: return"Test mode"; case XDEV_RESUME: return"Resume"; default: break;
} return"Unknown";
}
staticinlineconstchar *xhci_decode_portsc(char *str, u32 portsc)
{ int ret;
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.679Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.