/* 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)
/** *structxhci_slot_ctx *@dev_info:Routestring,devicespeed,hubinfo,andlastvalidendpoint *@dev_info2:Maxexitlatencyfordevicenumber,roothubportnumber *@tt_info:tt_infoisusedtoconstructsplittransactiontokens *@dev_state:slotstateanddeviceaddress * *SlotContext-section6.2.1.1.ThisassumestheHCuses32-bytecontext *structures.IftheHCuses64-bytecontexts,thereisanadditional32bytes *reservedattheendoftheslotcontextforHCinternaluse.
*/ struct xhci_slot_ctx {
__le32 dev_info;
__le32 dev_info2;
__le32 tt_info;
__le32 dev_state; /* offset 0x10 to 0x1f reserved for HC internal use */
__le32 reserved[4];
};
/* dev_info bitmasks */ /* Route String - 0:19 */ #define ROUTE_STRING_MASK (0xfffff) /* Device speed - values defined by PORTSC Device Speed field - 20:23 */ #define DEV_SPEED (0xf << 20) #define GET_DEV_SPEED(n) (((n) & DEV_SPEED) >> 20) /* bit 24 reserved */ /* Is this LS/FS device connected through a HS hub? - bit 25 */ #define DEV_MTT (0x1 << 25) /* Set if the device is a hub - bit 26 */ #define DEV_HUB (0x1 << 26) /* Index of the last valid endpoint context in this device context - 27:31 */ #define LAST_CTX_MASK (0x1f << 27) #define LAST_CTX(p) ((p) << 27) #define LAST_CTX_TO_EP_NUM(p) (((p) >> 27) - 1) #define SLOT_FLAG (1 << 0) #define EP0_FLAG (1 << 1)
/* dev_info2 bitmasks */ /* Max Exit Latency (ms) - worst case time to wake up all links in dev path */ #define MAX_EXIT (0xffff) /* Root hub port number that is needed to access the USB device */ #define ROOT_HUB_PORT(p) (((p) & 0xff) << 16) #define DEVINFO_TO_ROOT_HUB_PORT(p) (((p) >> 16) & 0xff) /* Maximum number of ports under a hub device */ #define XHCI_MAX_PORTS(p) (((p) & 0xff) << 24) #define DEVINFO_TO_MAX_PORTS(p) (((p) & (0xff << 24)) >> 24)
/* 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.
*/ #define FS_BLOCK 1 #define HS_BLOCK 4 #define SS_BLOCK 16 #define DMI_BLOCK 32
/* 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 { unsignedint num_packets; /* Sorted by max packet size. *Headofthelististhegreatestmaxpacketsize.
*/ struct list_head endpoints; /* How many endpoints of each speed are present. */ unsignedint overhead[3];
};
struct xhci_virt_device { int slot_id; struct usb_device *udev; /* *Commandstothehardwarearepassedan"inputcontext"that *tellsthehardwarewhattochangeinitsdatastructures. *Thehardwarewillreturnchangesinan"outputcontext"that *softwaremustallocateforthehardware.Weneedtokeep *trackofinputandoutputcontextsseparatelybecause *thesecommandsmightfailandwedon'ttrustthehardware.
*/ 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; /* *flagsforstatetrackingbasedoneventsandissuedcommands. *Softwarecannotrelyonstatesfromoutputcontextsbecauseof *latencybetweeneventsandxHCupdatingoutputcontextvalues. *Seexhci1.1section4.8.3formoredetails
*/ unsignedlong 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;
};
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;
};
/** *structxhci_device_context_array *@dev_context_ptrarrayof64-bitDMAaddressesfordevicecontexts
*/ 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:changethistobedynamicallysizedatHCmeminittimesincetheHC *mightnotbeabletohandlethemaximumnumberofdevicespossible.
*/
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)
staticinlineconstchar *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;
};
/* 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.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.