^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * xHCI host controller driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2008 Intel Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Author: Sarah Sharp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Some code borrowed from the Linux EHCI driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #ifndef __LINUX_XHCI_HCD_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define __LINUX_XHCI_HCD_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/timer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/usb/hcd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/io-64-nonatomic-lo-hi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/android_kabi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /* Code sharing between pci-quirks and xhci hcd */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include "xhci-ext-caps.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include "pci-quirks.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) /* max buffer size for trace and debug messages */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define XHCI_MSG_MAX 500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) /* xHCI PCI Configuration Registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define XHCI_SBRN_OFFSET (0x60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) /* Max number of USB devices for any host controller - limit in section 6.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define MAX_HC_SLOTS 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) /* Section 5.3.3 - MaxPorts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define MAX_HC_PORTS 127
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * xHCI register interface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * This corresponds to the eXtensible Host Controller Interface (xHCI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * Revision 0.95 specification
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * struct xhci_cap_regs - xHCI Host Controller Capability Registers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * @hc_capbase: length of the capabilities register and HC version number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * @hcs_params1: HCSPARAMS1 - Structural Parameters 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * @hcs_params2: HCSPARAMS2 - Structural Parameters 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * @hcs_params3: HCSPARAMS3 - Structural Parameters 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * @hcc_params: HCCPARAMS - Capability Parameters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * @db_off: DBOFF - Doorbell array offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * @run_regs_off: RTSOFF - Runtime register space offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * @hcc_params2: HCCPARAMS2 Capability Parameters 2, xhci 1.1 only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) struct xhci_cap_regs {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) __le32 hc_capbase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) __le32 hcs_params1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) __le32 hcs_params2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) __le32 hcs_params3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) __le32 hcc_params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) __le32 db_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) __le32 run_regs_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) __le32 hcc_params2; /* xhci 1.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /* Reserved up to (CAPLENGTH - 0x1C) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /* hc_capbase bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /* bits 7:0 - how long is the Capabilities register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define HC_LENGTH(p) XHCI_HC_LENGTH(p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) /* bits 31:16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define HC_VERSION(p) (((p) >> 16) & 0xffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* HCSPARAMS1 - hcs_params1 - bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) /* bits 0:7, Max Device Slots */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define HCS_MAX_SLOTS(p) (((p) >> 0) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define HCS_SLOTS_MASK 0xff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) /* bits 8:18, Max Interrupters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define HCS_MAX_INTRS(p) (((p) >> 8) & 0x7ff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) /* bits 24:31, Max Ports - max value is 0x7F = 127 ports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define HCS_MAX_PORTS(p) (((p) >> 24) & 0x7f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /* HCSPARAMS2 - hcs_params2 - bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) /* bits 0:3, frames or uframes that SW needs to queue transactions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) * ahead of the HW to meet periodic deadlines */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define HCS_IST(p) (((p) >> 0) & 0xf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /* bits 4:7, max number of Event Ring segments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define HCS_ERST_MAX(p) (((p) >> 4) & 0xf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* bits 21:25 Hi 5 bits of Scratchpad buffers SW must allocate for the HW */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) /* bit 26 Scratchpad restore - for save/restore HW state - not used yet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) /* bits 27:31 Lo 5 bits of Scratchpad buffers SW must allocate for the HW */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define HCS_MAX_SCRATCHPAD(p) ((((p) >> 16) & 0x3e0) | (((p) >> 27) & 0x1f))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /* HCSPARAMS3 - hcs_params3 - bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) /* bits 0:7, Max U1 to U0 latency for the roothub ports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define HCS_U1_LATENCY(p) (((p) >> 0) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /* bits 16:31, Max U2 to U0 latency for the roothub ports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define HCS_U2_LATENCY(p) (((p) >> 16) & 0xffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* HCCPARAMS - hcc_params - bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) /* true: HC can use 64-bit address pointers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define HCC_64BIT_ADDR(p) ((p) & (1 << 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) /* true: HC can do bandwidth negotiation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define HCC_BANDWIDTH_NEG(p) ((p) & (1 << 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) /* true: HC uses 64-byte Device Context structures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) * FIXME 64-byte context structures aren't supported yet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define HCC_64BYTE_CONTEXT(p) ((p) & (1 << 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /* true: HC has port power switches */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define HCC_PPC(p) ((p) & (1 << 3))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /* true: HC has port indicators */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define HCS_INDICATOR(p) ((p) & (1 << 4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) /* true: HC has Light HC Reset Capability */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define HCC_LIGHT_RESET(p) ((p) & (1 << 5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) /* true: HC supports latency tolerance messaging */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define HCC_LTC(p) ((p) & (1 << 6))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) /* true: no secondary Stream ID Support */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define HCC_NSS(p) ((p) & (1 << 7))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) /* true: HC supports Stopped - Short Packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define HCC_SPC(p) ((p) & (1 << 9))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /* true: HC has Contiguous Frame ID Capability */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define HCC_CFC(p) ((p) & (1 << 11))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) /* Max size for Primary Stream Arrays - 2^(n+1), where n is bits 12:15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define HCC_MAX_PSA(p) (1 << ((((p) >> 12) & 0xf) + 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) /* Extended Capabilities pointer from PCI base - section 5.3.6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define HCC_EXT_CAPS(p) XHCI_HCC_EXT_CAPS(p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define CTX_SIZE(_hcc) (HCC_64BYTE_CONTEXT(_hcc) ? 64 : 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) /* db_off bitmask - bits 0:1 reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define DBOFF_MASK (~0x3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) /* run_regs_off bitmask - bits 0:4 reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define RTSOFF_MASK (~0x1f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) /* HCCPARAMS2 - hcc_params2 - bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) /* true: HC supports U3 entry Capability */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define HCC2_U3C(p) ((p) & (1 << 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) /* true: HC supports Configure endpoint command Max exit latency too large */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define HCC2_CMC(p) ((p) & (1 << 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /* true: HC supports Force Save context Capability */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define HCC2_FSC(p) ((p) & (1 << 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) /* true: HC supports Compliance Transition Capability */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define HCC2_CTC(p) ((p) & (1 << 3))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /* true: HC support Large ESIT payload Capability > 48k */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define HCC2_LEC(p) ((p) & (1 << 4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /* true: HC support Configuration Information Capability */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define HCC2_CIC(p) ((p) & (1 << 5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /* true: HC support Extended TBC Capability, Isoc burst count > 65535 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define HCC2_ETC(p) ((p) & (1 << 6))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) /* Number of registers per port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define NUM_PORT_REGS 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define PORTSC 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define PORTPMSC 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define PORTLI 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define PORTHLPMC 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) * struct xhci_op_regs - xHCI Host Controller Operational Registers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * @command: USBCMD - xHC command register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * @status: USBSTS - xHC status register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) * @page_size: This indicates the page size that the host controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * supports. If bit n is set, the HC supports a page size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * of 2^(n+12), up to a 128MB page size.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * 4K is the minimum page size.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) * @cmd_ring: CRP - 64-bit Command Ring Pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * @dcbaa_ptr: DCBAAP - 64-bit Device Context Base Address Array Pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) * @config_reg: CONFIG - Configure Register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * @port_status_base: PORTSCn - base address for Port Status and Control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) * Each port has a Port Status and Control register,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) * followed by a Port Power Management Status and Control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) * register, a Port Link Info register, and a reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) * register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) * @port_power_base: PORTPMSCn - base address for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) * Port Power Management Status and Control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) * @port_link_base: PORTLIn - base address for Port Link Info (current
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) * Link PM state and control) for USB 2.1 and USB 3.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) * devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) struct xhci_op_regs {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) __le32 command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) __le32 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) __le32 page_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) __le32 reserved1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) __le32 reserved2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) __le32 dev_notification;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) __le64 cmd_ring;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) /* rsvd: offset 0x20-2F */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) __le32 reserved3[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) __le64 dcbaa_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) __le32 config_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) /* rsvd: offset 0x3C-3FF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) __le32 reserved4[241];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) /* port 1 registers, which serve as a base address for other ports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) __le32 port_status_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) __le32 port_power_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) __le32 port_link_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) __le32 reserved5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) /* registers for ports 2-255 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) __le32 reserved6[NUM_PORT_REGS*254];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) /* USBCMD - USB command - command bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) /* start/stop HC execution - do not write unless HC is halted*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) #define CMD_RUN XHCI_CMD_RUN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) /* Reset HC - resets internal HC state machine and all registers (except
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) * PCI config regs). HC does NOT drive a USB reset on the downstream ports.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) * The xHCI driver must reinitialize the xHC after setting this bit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) #define CMD_RESET (1 << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) /* Event Interrupt Enable - a '1' allows interrupts from the host controller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) #define CMD_EIE XHCI_CMD_EIE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) /* Host System Error Interrupt Enable - get out-of-band signal for HC errors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) #define CMD_HSEIE XHCI_CMD_HSEIE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) /* bits 4:6 are reserved (and should be preserved on writes). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) /* light reset (port status stays unchanged) - reset completed when this is 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #define CMD_LRESET (1 << 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) /* host controller save/restore state. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) #define CMD_CSS (1 << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) #define CMD_CRS (1 << 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) /* Enable Wrap Event - '1' means xHC generates an event when MFINDEX wraps. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) #define CMD_EWE XHCI_CMD_EWE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) /* MFINDEX power management - '1' means xHC can stop MFINDEX counter if all root
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) * hubs are in U3 (selective suspend), disconnect, disabled, or powered-off.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) * '0' means the xHC can power it off if all ports are in the disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) * disabled, or powered-off state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) #define CMD_PM_INDEX (1 << 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) /* bit 14 Extended TBC Enable, changes Isoc TRB fields to support larger TBC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) #define CMD_ETE (1 << 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) /* bits 15:31 are reserved (and should be preserved on writes). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) #define XHCI_RESET_LONG_USEC (10 * 1000 * 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) #define XHCI_RESET_SHORT_USEC (250 * 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) /* IMAN - Interrupt Management Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) #define IMAN_IE (1 << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #define IMAN_IP (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) /* USBSTS - USB status - status bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) /* HC not running - set to 1 when run/stop bit is cleared. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) #define STS_HALT XHCI_STS_HALT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) /* serious error, e.g. PCI parity error. The HC will clear the run/stop bit. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) #define STS_FATAL (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) /* event interrupt - clear this prior to clearing any IP flags in IR set*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) #define STS_EINT (1 << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) /* port change detect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) #define STS_PORT (1 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) /* bits 5:7 reserved and zeroed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) /* save state status - '1' means xHC is saving state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) #define STS_SAVE (1 << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) /* restore state status - '1' means xHC is restoring state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) #define STS_RESTORE (1 << 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) /* true: save or restore error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) #define STS_SRE (1 << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) /* true: Controller Not Ready to accept doorbell or op reg writes after reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) #define STS_CNR XHCI_STS_CNR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) /* true: internal Host Controller Error - SW needs to reset and reinitialize */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) #define STS_HCE (1 << 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) /* bits 13:31 reserved and should be preserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) * DNCTRL - Device Notification Control Register - dev_notification bitmasks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) * Generate a device notification event when the HC sees a transaction with a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) * notification type that matches a bit set in this bit field.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) #define DEV_NOTE_MASK (0xffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) #define ENABLE_DEV_NOTE(x) (1 << (x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) /* Most of the device notification types should only be used for debug.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) * SW does need to pay attention to function wake notifications.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) #define DEV_NOTE_FWAKE ENABLE_DEV_NOTE(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) /* CRCR - Command Ring Control Register - cmd_ring bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) /* bit 0 is the command ring cycle state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) /* stop ring operation after completion of the currently executing command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) #define CMD_RING_PAUSE (1 << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) /* stop ring immediately - abort the currently executing command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) #define CMD_RING_ABORT (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) /* true: command ring is running */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) #define CMD_RING_RUNNING (1 << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) /* bits 4:5 reserved and should be preserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) /* Command Ring pointer - bit mask for the lower 32 bits. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) #define CMD_RING_RSVD_BITS (0x3f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) /* CONFIG - Configure Register - config_reg bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) /* bits 0:7 - maximum number of device slots enabled (NumSlotsEn) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) #define MAX_DEVS(p) ((p) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) /* bit 8: U3 Entry Enabled, assert PLC when root port enters U3, xhci 1.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) #define CONFIG_U3E (1 << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) /* bit 9: Configuration Information Enable, xhci 1.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) #define CONFIG_CIE (1 << 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) /* bits 10:31 - reserved and should be preserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) /* PORTSC - Port Status and Control Register - port_status_base bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) /* true: device connected */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) #define PORT_CONNECT (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) /* true: port enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) #define PORT_PE (1 << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) /* bit 2 reserved and zeroed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) /* true: port has an over-current condition */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) #define PORT_OC (1 << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) /* true: port reset signaling asserted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) #define PORT_RESET (1 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) /* Port Link State - bits 5:8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) * A read gives the current link PM state of the port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) * a write with Link State Write Strobe set sets the link state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) #define PORT_PLS_MASK (0xf << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) #define XDEV_U0 (0x0 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) #define XDEV_U1 (0x1 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) #define XDEV_U2 (0x2 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) #define XDEV_U3 (0x3 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) #define XDEV_DISABLED (0x4 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) #define XDEV_RXDETECT (0x5 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) #define XDEV_INACTIVE (0x6 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) #define XDEV_POLLING (0x7 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) #define XDEV_RECOVERY (0x8 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) #define XDEV_HOT_RESET (0x9 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) #define XDEV_COMP_MODE (0xa << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) #define XDEV_TEST_MODE (0xb << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) #define XDEV_RESUME (0xf << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) /* true: port has power (see HCC_PPC) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) #define PORT_POWER (1 << 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) /* bits 10:13 indicate device speed:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) * 0 - undefined speed - port hasn't be initialized by a reset yet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) * 1 - full speed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) * 2 - low speed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) * 3 - high speed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) * 4 - super speed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) * 5-15 reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) #define DEV_SPEED_MASK (0xf << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) #define XDEV_FS (0x1 << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) #define XDEV_LS (0x2 << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) #define XDEV_HS (0x3 << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) #define XDEV_SS (0x4 << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) #define XDEV_SSP (0x5 << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) #define DEV_UNDEFSPEED(p) (((p) & DEV_SPEED_MASK) == (0x0<<10))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) #define DEV_FULLSPEED(p) (((p) & DEV_SPEED_MASK) == XDEV_FS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) #define DEV_LOWSPEED(p) (((p) & DEV_SPEED_MASK) == XDEV_LS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) #define DEV_HIGHSPEED(p) (((p) & DEV_SPEED_MASK) == XDEV_HS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) #define DEV_SUPERSPEED(p) (((p) & DEV_SPEED_MASK) == XDEV_SS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) #define DEV_SUPERSPEEDPLUS(p) (((p) & DEV_SPEED_MASK) == XDEV_SSP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) #define DEV_SUPERSPEED_ANY(p) (((p) & DEV_SPEED_MASK) >= XDEV_SS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) #define DEV_PORT_SPEED(p) (((p) >> 10) & 0x0f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) /* Bits 20:23 in the Slot Context are the speed for the device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) #define SLOT_SPEED_FS (XDEV_FS << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) #define SLOT_SPEED_LS (XDEV_LS << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) #define SLOT_SPEED_HS (XDEV_HS << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) #define SLOT_SPEED_SS (XDEV_SS << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) #define SLOT_SPEED_SSP (XDEV_SSP << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) /* Port Indicator Control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) #define PORT_LED_OFF (0 << 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) #define PORT_LED_AMBER (1 << 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) #define PORT_LED_GREEN (2 << 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) #define PORT_LED_MASK (3 << 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) /* Port Link State Write Strobe - set this when changing link state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) #define PORT_LINK_STROBE (1 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) /* true: connect status change */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) #define PORT_CSC (1 << 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) /* true: port enable change */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) #define PORT_PEC (1 << 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) /* true: warm reset for a USB 3.0 device is done. A "hot" reset puts the port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) * into an enabled state, and the device into the default state. A "warm" reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) * also resets the link, forcing the device through the link training sequence.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) * SW can also look at the Port Reset register to see when warm reset is done.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) #define PORT_WRC (1 << 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) /* true: over-current change */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) #define PORT_OCC (1 << 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) /* true: reset change - 1 to 0 transition of PORT_RESET */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) #define PORT_RC (1 << 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) /* port link status change - set on some port link state transitions:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) * Transition Reason
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) * ------------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) * - U3 to Resume Wakeup signaling from a device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) * - Resume to Recovery to U0 USB 3.0 device resume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) * - Resume to U0 USB 2.0 device resume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) * - U3 to Recovery to U0 Software resume of USB 3.0 device complete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) * - U3 to U0 Software resume of USB 2.0 device complete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) * - U2 to U0 L1 resume of USB 2.1 device complete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) * - U0 to U0 (???) L1 entry rejection by USB 2.1 device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) * - U0 to disabled L1 entry error with USB 2.1 device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) * - Any state to inactive Error on USB 3.0 port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) #define PORT_PLC (1 << 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) /* port configure error change - port failed to configure its link partner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) #define PORT_CEC (1 << 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) #define PORT_CHANGE_MASK (PORT_CSC | PORT_PEC | PORT_WRC | PORT_OCC | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) PORT_RC | PORT_PLC | PORT_CEC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) /* Cold Attach Status - xHC can set this bit to report device attached during
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) * Sx state. Warm port reset should be perfomed to clear this bit and move port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) * to connected state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) #define PORT_CAS (1 << 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) /* wake on connect (enable) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) #define PORT_WKCONN_E (1 << 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) /* wake on disconnect (enable) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) #define PORT_WKDISC_E (1 << 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) /* wake on over-current (enable) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) #define PORT_WKOC_E (1 << 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) /* bits 28:29 reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) /* true: device is non-removable - for USB 3.0 roothub emulation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) #define PORT_DEV_REMOVE (1 << 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) /* Initiate a warm port reset - complete when PORT_WRC is '1' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) #define PORT_WR (1 << 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) /* We mark duplicate entries with -1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) #define DUPLICATE_ENTRY ((u8)(-1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) /* Port Power Management Status and Control - port_power_base bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) /* Inactivity timer value for transitions into U1, in microseconds.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) * Timeout can be up to 127us. 0xFF means an infinite timeout.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) #define PORT_U1_TIMEOUT(p) ((p) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) #define PORT_U1_TIMEOUT_MASK 0xff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) /* Inactivity timer value for transitions into U2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) #define PORT_U2_TIMEOUT(p) (((p) & 0xff) << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) #define PORT_U2_TIMEOUT_MASK (0xff << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) /* Bits 24:31 for port testing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) /* USB2 Protocol PORTSPMSC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) #define PORT_L1S_MASK 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) #define PORT_L1S_SUCCESS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) #define PORT_RWE (1 << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) #define PORT_HIRD(p) (((p) & 0xf) << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) #define PORT_HIRD_MASK (0xf << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) #define PORT_L1DS_MASK (0xff << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) #define PORT_L1DS(p) (((p) & 0xff) << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) #define PORT_HLE (1 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) #define PORT_TEST_MODE_SHIFT 28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /* USB3 Protocol PORTLI Port Link Information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) #define PORT_RX_LANES(p) (((p) >> 16) & 0xf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) #define PORT_TX_LANES(p) (((p) >> 20) & 0xf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) /* USB2 Protocol PORTHLPMC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) #define PORT_HIRDM(p)((p) & 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) #define PORT_L1_TIMEOUT(p)(((p) & 0xff) << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) #define PORT_BESLD(p)(((p) & 0xf) << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) /* use 512 microseconds as USB2 LPM L1 default timeout. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) #define XHCI_L1_TIMEOUT 512
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) /* Set default HIRD/BESL value to 4 (350/400us) for USB2 L1 LPM resume latency.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) * Safe to use with mixed HIRD and BESL systems (host and device) and is used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) * by other operating systems.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) * XHCI 1.0 errata 8/14/12 Table 13 notes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) * "Software should choose xHC BESL/BESLD field values that do not violate a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) * device's resume latency requirements,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) * e.g. not program values > '4' if BLC = '1' and a HIRD device is attached,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) * or not program values < '4' if BLC = '0' and a BESL device is attached.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) #define XHCI_DEFAULT_BESL 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) * USB3 specification define a 360ms tPollingLFPSTiemout for USB3 ports
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) * to complete link training. usually link trainig completes much faster
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) * so check status 10 times with 36ms sleep in places we need to wait for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) * polling to complete.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) #define XHCI_PORT_POLLING_LFPS_TIME 36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) * struct xhci_intr_reg - Interrupt Register Set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) * @irq_pending: IMAN - Interrupt Management Register. Used to enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) * interrupts and check for pending interrupts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) * @irq_control: IMOD - Interrupt Moderation Register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) * Used to throttle interrupts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) * @erst_size: Number of segments in the Event Ring Segment Table (ERST).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) * @erst_base: ERST base address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) * @erst_dequeue: Event ring dequeue pointer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) * Each interrupter (defined by a MSI-X vector) has an event ring and an Event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) * Ring Segment Table (ERST) associated with it. The event ring is comprised of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) * multiple segments of the same size. The HC places events on the ring and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) * "updates the Cycle bit in the TRBs to indicate to software the current
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) * position of the Enqueue Pointer." The HCD (Linux) processes those events and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) * updates the dequeue pointer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) struct xhci_intr_reg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) __le32 irq_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) __le32 irq_control;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) __le32 erst_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) __le32 rsvd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) __le64 erst_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) __le64 erst_dequeue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) /* irq_pending bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) #define ER_IRQ_PENDING(p) ((p) & 0x1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) /* bits 2:31 need to be preserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) /* THIS IS BUGGY - FIXME - IP IS WRITE 1 TO CLEAR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) #define ER_IRQ_CLEAR(p) ((p) & 0xfffffffe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) #define ER_IRQ_ENABLE(p) ((ER_IRQ_CLEAR(p)) | 0x2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) #define ER_IRQ_DISABLE(p) ((ER_IRQ_CLEAR(p)) & ~(0x2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) /* irq_control bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) /* Minimum interval between interrupts (in 250ns intervals). The interval
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) * between interrupts will be longer if there are no events on the event ring.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) * Default is 4000 (1 ms).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) #define ER_IRQ_INTERVAL_MASK (0xffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) /* Counter used to count down the time to the next interrupt - HW use only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) #define ER_IRQ_COUNTER_MASK (0xffff << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) /* erst_size bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) /* Preserve bits 16:31 of erst_size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) #define ERST_SIZE_MASK (0xffff << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) /* erst_dequeue bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) /* Dequeue ERST Segment Index (DESI) - Segment number (or alias)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) * where the current dequeue pointer lies. This is an optional HW hint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) #define ERST_DESI_MASK (0x7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) /* Event Handler Busy (EHB) - is the event ring scheduled to be serviced by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) * a work queue (or delayed service routine)?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) #define ERST_EHB (1 << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) #define ERST_PTR_MASK (0xf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) * struct xhci_run_regs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) * @microframe_index:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) * MFINDEX - current microframe number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) * Section 5.5 Host Controller Runtime Registers:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) * "Software should read and write these registers using only Dword (32 bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) * or larger accesses"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) struct xhci_run_regs {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) __le32 microframe_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) __le32 rsvd[7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) struct xhci_intr_reg ir_set[128];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) * struct doorbell_array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) * Bits 0 - 7: Endpoint target
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) * Bits 8 - 15: RsvdZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) * Bits 16 - 31: Stream ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) * Section 5.6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) struct xhci_doorbell_array {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) __le32 doorbell[256];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) #define DB_VALUE(ep, stream) ((((ep) + 1) & 0xff) | ((stream) << 16))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) #define DB_VALUE_HOST 0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) * struct xhci_protocol_caps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) * @revision: major revision, minor revision, capability ID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) * and next capability pointer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) * @name_string: Four ASCII characters to say which spec this xHC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) * follows, typically "USB ".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) * @port_info: Port offset, count, and protocol-defined information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) struct xhci_protocol_caps {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) u32 revision;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) u32 name_string;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) u32 port_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) #define XHCI_EXT_PORT_MAJOR(x) (((x) >> 24) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) #define XHCI_EXT_PORT_MINOR(x) (((x) >> 16) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) #define XHCI_EXT_PORT_PSIC(x) (((x) >> 28) & 0x0f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) #define XHCI_EXT_PORT_OFF(x) ((x) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) #define XHCI_EXT_PORT_COUNT(x) (((x) >> 8) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) #define XHCI_EXT_PORT_PSIV(x) (((x) >> 0) & 0x0f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) #define XHCI_EXT_PORT_PSIE(x) (((x) >> 4) & 0x03)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) #define XHCI_EXT_PORT_PLT(x) (((x) >> 6) & 0x03)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) #define XHCI_EXT_PORT_PFD(x) (((x) >> 8) & 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) #define XHCI_EXT_PORT_LP(x) (((x) >> 14) & 0x03)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) #define XHCI_EXT_PORT_PSIM(x) (((x) >> 16) & 0xffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) #define PLT_MASK (0x03 << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) #define PLT_SYM (0x00 << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) #define PLT_ASYM_RX (0x02 << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) #define PLT_ASYM_TX (0x03 << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) * struct xhci_container_ctx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) * @type: Type of context. Used to calculated offsets to contained contexts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) * @size: Size of the context data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) * @bytes: The raw context data given to HW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) * @dma: dma address of the bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) * Represents either a Device or Input context. Holds a pointer to the raw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) * memory used for the context (bytes) and dma address of it (dma).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) struct xhci_container_ctx {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) unsigned type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) #define XHCI_CTX_TYPE_DEVICE 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) #define XHCI_CTX_TYPE_INPUT 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) int size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) u8 *bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) dma_addr_t dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) * struct xhci_slot_ctx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) * @dev_info: Route string, device speed, hub info, and last valid endpoint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) * @dev_info2: Max exit latency for device number, root hub port number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) * @tt_info: tt_info is used to construct split transaction tokens
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) * @dev_state: slot state and device address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) * Slot Context - section 6.2.1.1. This assumes the HC uses 32-byte context
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) * structures. If the HC uses 64-byte contexts, there is an additional 32 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) * reserved at the end of the slot context for HC internal use.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) struct xhci_slot_ctx {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) __le32 dev_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) __le32 dev_info2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) __le32 tt_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) __le32 dev_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) /* offset 0x10 to 0x1f reserved for HC internal use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) __le32 reserved[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) /* dev_info bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) /* Route String - 0:19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) #define ROUTE_STRING_MASK (0xfffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) /* Device speed - values defined by PORTSC Device Speed field - 20:23 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) #define DEV_SPEED (0xf << 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) #define GET_DEV_SPEED(n) (((n) & DEV_SPEED) >> 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) /* bit 24 reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) /* Is this LS/FS device connected through a HS hub? - bit 25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) #define DEV_MTT (0x1 << 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) /* Set if the device is a hub - bit 26 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) #define DEV_HUB (0x1 << 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) /* Index of the last valid endpoint context in this device context - 27:31 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) #define LAST_CTX_MASK (0x1f << 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) #define LAST_CTX(p) ((p) << 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) #define LAST_CTX_TO_EP_NUM(p) (((p) >> 27) - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) #define SLOT_FLAG (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) #define EP0_FLAG (1 << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) /* dev_info2 bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) /* Max Exit Latency (ms) - worst case time to wake up all links in dev path */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) #define MAX_EXIT (0xffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) /* Root hub port number that is needed to access the USB device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) #define ROOT_HUB_PORT(p) (((p) & 0xff) << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) #define DEVINFO_TO_ROOT_HUB_PORT(p) (((p) >> 16) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) /* Maximum number of ports under a hub device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) #define XHCI_MAX_PORTS(p) (((p) & 0xff) << 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) #define DEVINFO_TO_MAX_PORTS(p) (((p) & (0xff << 24)) >> 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) /* tt_info bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) * TT Hub Slot ID - for low or full speed devices attached to a high-speed hub
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) * The Slot ID of the hub that isolates the high speed signaling from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) * this low or full-speed device. '0' if attached to root hub port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) #define TT_SLOT (0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) * The number of the downstream facing port of the high-speed hub
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) * '0' if the device is not low or full speed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) #define TT_PORT (0xff << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) #define TT_THINK_TIME(p) (((p) & 0x3) << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) #define GET_TT_THINK_TIME(p) (((p) & (0x3 << 16)) >> 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) /* dev_state bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) /* USB device address - assigned by the HC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) #define DEV_ADDR_MASK (0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) /* bits 8:26 reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) /* Slot state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) #define SLOT_STATE (0x1f << 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) #define GET_SLOT_STATE(p) (((p) & (0x1f << 27)) >> 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) #define SLOT_STATE_DISABLED 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) #define SLOT_STATE_ENABLED SLOT_STATE_DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) #define SLOT_STATE_DEFAULT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) #define SLOT_STATE_ADDRESSED 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) #define SLOT_STATE_CONFIGURED 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) * struct xhci_ep_ctx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) * @ep_info: endpoint state, streams, mult, and interval information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) * @ep_info2: information on endpoint type, max packet size, max burst size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) * error count, and whether the HC will force an event for all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) * transactions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) * @deq: 64-bit ring dequeue pointer address. If the endpoint only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) * defines one stream, this points to the endpoint transfer ring.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) * Otherwise, it points to a stream context array, which has a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) * ring pointer for each flow.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) * @tx_info:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) * Average TRB lengths for the endpoint ring and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) * max payload within an Endpoint Service Interval Time (ESIT).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) * Endpoint Context - section 6.2.1.2. This assumes the HC uses 32-byte context
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) * structures. If the HC uses 64-byte contexts, there is an additional 32 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) * reserved at the end of the endpoint context for HC internal use.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) struct xhci_ep_ctx {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) __le32 ep_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) __le32 ep_info2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) __le64 deq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) __le32 tx_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) /* offset 0x14 - 0x1f reserved for HC internal use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) __le32 reserved[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) /* ep_info bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) * Endpoint State - bits 0:2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) * 0 - disabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) * 1 - running
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) * 2 - halted due to halt condition - ok to manipulate endpoint ring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) * 3 - stopped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) * 4 - TRB error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) * 5-7 - reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) #define EP_STATE_MASK (0x7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) #define EP_STATE_DISABLED 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) #define EP_STATE_RUNNING 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) #define EP_STATE_HALTED 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) #define EP_STATE_STOPPED 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) #define EP_STATE_ERROR 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) #define GET_EP_CTX_STATE(ctx) (le32_to_cpu((ctx)->ep_info) & EP_STATE_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) /* Mult - Max number of burtst within an interval, in EP companion desc. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) #define EP_MULT(p) (((p) & 0x3) << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) #define CTX_TO_EP_MULT(p) (((p) >> 8) & 0x3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) /* bits 10:14 are Max Primary Streams */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) /* bit 15 is Linear Stream Array */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) /* Interval - period between requests to an endpoint - 125u increments. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) #define EP_INTERVAL(p) (((p) & 0xff) << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) #define EP_INTERVAL_TO_UFRAMES(p) (1 << (((p) >> 16) & 0xff))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) #define CTX_TO_EP_INTERVAL(p) (((p) >> 16) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) #define EP_MAXPSTREAMS_MASK (0x1f << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) #define EP_MAXPSTREAMS(p) (((p) << 10) & EP_MAXPSTREAMS_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) #define CTX_TO_EP_MAXPSTREAMS(p) (((p) & EP_MAXPSTREAMS_MASK) >> 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) /* Endpoint is set up with a Linear Stream Array (vs. Secondary Stream Array) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) #define EP_HAS_LSA (1 << 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) /* hosts with LEC=1 use bits 31:24 as ESIT high bits. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) #define CTX_TO_MAX_ESIT_PAYLOAD_HI(p) (((p) >> 24) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) /* ep_info2 bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) * Force Event - generate transfer events for all TRBs for this endpoint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) * This will tell the HC to ignore the IOC and ISP flags (for debugging only).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) #define FORCE_EVENT (0x1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) #define ERROR_COUNT(p) (((p) & 0x3) << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) #define CTX_TO_EP_TYPE(p) (((p) >> 3) & 0x7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) #define EP_TYPE(p) ((p) << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) #define ISOC_OUT_EP 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) #define BULK_OUT_EP 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) #define INT_OUT_EP 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) #define CTRL_EP 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) #define ISOC_IN_EP 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) #define BULK_IN_EP 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) #define INT_IN_EP 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) /* bit 6 reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) /* bit 7 is Host Initiate Disable - for disabling stream selection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) #define MAX_BURST(p) (((p)&0xff) << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) #define CTX_TO_MAX_BURST(p) (((p) >> 8) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) #define MAX_PACKET(p) (((p)&0xffff) << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) #define MAX_PACKET_MASK (0xffff << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) #define MAX_PACKET_DECODED(p) (((p) >> 16) & 0xffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) /* tx_info bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) #define EP_AVG_TRB_LENGTH(p) ((p) & 0xffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) #define EP_MAX_ESIT_PAYLOAD_LO(p) (((p) & 0xffff) << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) #define EP_MAX_ESIT_PAYLOAD_HI(p) ((((p) >> 16) & 0xff) << 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) #define CTX_TO_MAX_ESIT_PAYLOAD(p) (((p) >> 16) & 0xffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) /* deq bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) #define EP_CTX_CYCLE_MASK (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) #define SCTX_DEQ_MASK (~0xfL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) * struct xhci_input_control_context
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) * Input control context; see section 6.2.5.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) * @drop_context: set the bit of the endpoint context you want to disable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) * @add_context: set the bit of the endpoint context you want to enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) struct xhci_input_control_ctx {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) __le32 drop_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) __le32 add_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) __le32 rsvd2[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) #define EP_IS_ADDED(ctrl_ctx, i) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) (le32_to_cpu(ctrl_ctx->add_flags) & (1 << (i + 1)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) #define EP_IS_DROPPED(ctrl_ctx, i) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) (le32_to_cpu(ctrl_ctx->drop_flags) & (1 << (i + 1)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) /* Represents everything that is needed to issue a command on the command ring.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) * It's useful to pre-allocate these for commands that cannot fail due to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) * out-of-memory errors, like freeing streams.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) struct xhci_command {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) /* Input context for changing device state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) struct xhci_container_ctx *in_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) u32 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) int slot_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) /* If completion is null, no one is waiting on this command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) * and the structure can be freed after the command completes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) struct completion *completion;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) union xhci_trb *command_trb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) struct list_head cmd_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) ANDROID_KABI_RESERVE(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) ANDROID_KABI_RESERVE(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) /* drop context bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) #define DROP_EP(x) (0x1 << x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) /* add context bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) #define ADD_EP(x) (0x1 << x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) struct xhci_stream_ctx {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) /* 64-bit stream ring address, cycle state, and stream type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) __le64 stream_ring;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) /* offset 0x14 - 0x1f reserved for HC internal use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) __le32 reserved[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) /* Stream Context Types (section 6.4.1) - bits 3:1 of stream ctx deq ptr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) #define SCT_FOR_CTX(p) (((p) & 0x7) << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) /* Secondary stream array type, dequeue pointer is to a transfer ring */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) #define SCT_SEC_TR 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) /* Primary stream array type, dequeue pointer is to a transfer ring */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) #define SCT_PRI_TR 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) /* Dequeue pointer is for a secondary stream array (SSA) with 8 entries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) #define SCT_SSA_8 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) #define SCT_SSA_16 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) #define SCT_SSA_32 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) #define SCT_SSA_64 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) #define SCT_SSA_128 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) #define SCT_SSA_256 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) /* Assume no secondary streams for now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) struct xhci_stream_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) struct xhci_ring **stream_rings;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) /* Number of streams, including stream 0 (which drivers can't use) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) unsigned int num_streams;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) /* The stream context array may be bigger than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) * the number of streams the driver asked for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) struct xhci_stream_ctx *stream_ctx_array;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) unsigned int num_stream_ctxs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) dma_addr_t ctx_array_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) /* For mapping physical TRB addresses to segments in stream rings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) struct radix_tree_root trb_address_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) struct xhci_command *free_streams_command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) #define SMALL_STREAM_ARRAY_SIZE 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) #define MEDIUM_STREAM_ARRAY_SIZE 1024
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) /* Some Intel xHCI host controllers need software to keep track of the bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) * bandwidth. Keep track of endpoint info here. Each root port is allocated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) * the full bus bandwidth. We must also treat TTs (including each port under a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) * multi-TT hub) as a separate bandwidth domain. The direct memory interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) * (DMI) also limits the total bandwidth (across all domains) that can be used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) struct xhci_bw_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) /* ep_interval is zero-based */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) unsigned int ep_interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) /* mult and num_packets are one-based */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) unsigned int mult;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) unsigned int num_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) unsigned int max_packet_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) unsigned int max_esit_payload;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) unsigned int type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) /* "Block" sizes in bytes the hardware uses for different device speeds.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) * The logic in this part of the hardware limits the number of bits the hardware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) * can use, so must represent bandwidth in a less precise manner to mimic what
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) * the scheduler hardware computes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) #define FS_BLOCK 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) #define HS_BLOCK 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) #define SS_BLOCK 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) #define DMI_BLOCK 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) /* Each device speed has a protocol overhead (CRC, bit stuffing, etc) associated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) * with each byte transferred. SuperSpeed devices have an initial overhead to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) * set up bursts. These are in blocks, see above. LS overhead has already been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) * translated into FS blocks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) #define DMI_OVERHEAD 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) #define DMI_OVERHEAD_BURST 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) #define SS_OVERHEAD 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) #define SS_OVERHEAD_BURST 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) #define HS_OVERHEAD 26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) #define FS_OVERHEAD 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) #define LS_OVERHEAD 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) /* The TTs need to claim roughly twice as much bandwidth (94 bytes per
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) * microframe ~= 24Mbps) of the HS bus as the devices can actually use because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) * of overhead associated with split transfers crossing microframe boundaries.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) * 31 blocks is pure protocol overhead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) #define TT_HS_OVERHEAD (31 + 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) #define TT_DMI_OVERHEAD (25 + 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) /* Bandwidth limits in blocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) #define FS_BW_LIMIT 1285
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) #define TT_BW_LIMIT 1320
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) #define HS_BW_LIMIT 1607
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) #define SS_BW_LIMIT_IN 3906
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) #define DMI_BW_LIMIT_IN 3906
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) #define SS_BW_LIMIT_OUT 3906
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) #define DMI_BW_LIMIT_OUT 3906
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) /* Percentage of bus bandwidth reserved for non-periodic transfers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) #define FS_BW_RESERVED 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) #define HS_BW_RESERVED 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) #define SS_BW_RESERVED 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) struct xhci_virt_ep {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) struct xhci_virt_device *vdev; /* parent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) unsigned int ep_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) struct xhci_ring *ring;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) /* Related to endpoints that are configured to use stream IDs only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) struct xhci_stream_info *stream_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) /* Temporary storage in case the configure endpoint command fails and we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) * have to restore the device state to the previous state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) struct xhci_ring *new_ring;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) unsigned int ep_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) #define SET_DEQ_PENDING (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) #define EP_HALTED (1 << 1) /* For stall handling */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) #define EP_STOP_CMD_PENDING (1 << 2) /* For URB cancellation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) /* Transitioning the endpoint to using streams, don't enqueue URBs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) #define EP_GETTING_STREAMS (1 << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) #define EP_HAS_STREAMS (1 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) /* Transitioning the endpoint to not using streams, don't enqueue URBs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) #define EP_GETTING_NO_STREAMS (1 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) #define EP_HARD_CLEAR_TOGGLE (1 << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) #define EP_SOFT_CLEAR_TOGGLE (1 << 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) /* usb_hub_clear_tt_buffer is in progress */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) #define EP_CLEARING_TT (1 << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) /* ---- Related to URB cancellation ---- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) struct list_head cancelled_td_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) /* Watchdog timer for stop endpoint command to cancel URBs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) struct timer_list stop_cmd_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) struct xhci_hcd *xhci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) /* Dequeue pointer and dequeue segment for a submitted Set TR Dequeue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) * command. We'll need to update the ring's dequeue segment and dequeue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) * pointer after the command completes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) struct xhci_segment *queued_deq_seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) union xhci_trb *queued_deq_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) * Sometimes the xHC can not process isochronous endpoint ring quickly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) * enough, and it will miss some isoc tds on the ring and generate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) * a Missed Service Error Event.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) * Set skip flag when receive a Missed Service Error Event and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) * process the missed tds on the endpoint ring.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) bool skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) /* Bandwidth checking storage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) struct xhci_bw_info bw_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) struct list_head bw_endpoint_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) /* Isoch Frame ID checking storage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) int next_frame_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) /* Use new Isoch TRB layout needed for extended TBC support */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) bool use_extended_tbc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) enum xhci_overhead_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) LS_OVERHEAD_TYPE = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) FS_OVERHEAD_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) HS_OVERHEAD_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) struct xhci_interval_bw {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) unsigned int num_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) /* Sorted by max packet size.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) * Head of the list is the greatest max packet size.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) struct list_head endpoints;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) /* How many endpoints of each speed are present. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) unsigned int overhead[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) #define XHCI_MAX_INTERVAL 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) struct xhci_interval_bw_table {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) unsigned int interval0_esit_payload;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) struct xhci_interval_bw interval_bw[XHCI_MAX_INTERVAL];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) /* Includes reserved bandwidth for async endpoints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) unsigned int bw_used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) unsigned int ss_bw_in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) unsigned int ss_bw_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) #define EP_CTX_PER_DEV 31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) struct xhci_virt_device {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) int slot_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) struct usb_device *udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) * Commands to the hardware are passed an "input context" that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) * tells the hardware what to change in its data structures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) * The hardware will return changes in an "output context" that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) * software must allocate for the hardware. We need to keep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) * track of input and output contexts separately because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) * these commands might fail and we don't trust the hardware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) struct xhci_container_ctx *out_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) /* Used for addressing devices and configuration changes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) struct xhci_container_ctx *in_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) struct xhci_virt_ep eps[EP_CTX_PER_DEV];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) u8 fake_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) u8 real_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) struct xhci_interval_bw_table *bw_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) struct xhci_tt_bw_info *tt_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) * flags for state tracking based on events and issued commands.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) * Software can not rely on states from output contexts because of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) * latency between events and xHC updating output context values.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) * See xhci 1.1 section 4.8.3 for more details
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) #define VDEV_PORT_ERROR BIT(0) /* Port error, link inactive */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) /* The current max exit latency for the enabled USB3 link states. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) u16 current_mel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) /* Used for the debugfs interfaces. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) void *debugfs_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) * For each roothub, keep track of the bandwidth information for each periodic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) * interval.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) * If a high speed hub is attached to the roothub, each TT associated with that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) * hub is a separate bandwidth domain. The interval information for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) * endpoints on the devices under that TT will appear in the TT structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) struct xhci_root_port_bw_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) struct list_head tts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) unsigned int num_active_tts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) struct xhci_interval_bw_table bw_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) struct xhci_tt_bw_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) struct list_head tt_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) int slot_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) int ttport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) struct xhci_interval_bw_table bw_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) int active_eps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) * struct xhci_device_context_array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) * @dev_context_ptr array of 64-bit DMA addresses for device contexts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) struct xhci_device_context_array {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) /* 64-bit device addresses; we only write 32-bit addresses */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) __le64 dev_context_ptrs[MAX_HC_SLOTS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) /* private xHCD pointers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) dma_addr_t dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) /* TODO: write function to set the 64-bit device DMA address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) * TODO: change this to be dynamically sized at HC mem init time since the HC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) * might not be able to handle the maximum number of devices possible.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) struct xhci_transfer_event {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) /* 64-bit buffer address, or immediate data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) __le64 buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) __le32 transfer_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) /* This field is interpreted differently based on the type of TRB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) __le32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) /* Transfer event TRB length bit mask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) /* bits 0:23 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) #define EVENT_TRB_LEN(p) ((p) & 0xffffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) /** Transfer Event bit fields **/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) #define TRB_TO_EP_ID(p) (((p) >> 16) & 0x1f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) /* Completion Code - only applicable for some types of TRBs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) #define COMP_CODE_MASK (0xff << 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) #define GET_COMP_CODE(p) (((p) & COMP_CODE_MASK) >> 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) #define COMP_INVALID 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) #define COMP_SUCCESS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) #define COMP_DATA_BUFFER_ERROR 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) #define COMP_BABBLE_DETECTED_ERROR 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) #define COMP_USB_TRANSACTION_ERROR 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) #define COMP_TRB_ERROR 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) #define COMP_STALL_ERROR 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) #define COMP_RESOURCE_ERROR 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) #define COMP_BANDWIDTH_ERROR 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) #define COMP_NO_SLOTS_AVAILABLE_ERROR 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) #define COMP_INVALID_STREAM_TYPE_ERROR 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) #define COMP_SLOT_NOT_ENABLED_ERROR 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) #define COMP_ENDPOINT_NOT_ENABLED_ERROR 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) #define COMP_SHORT_PACKET 13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) #define COMP_RING_UNDERRUN 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) #define COMP_RING_OVERRUN 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) #define COMP_VF_EVENT_RING_FULL_ERROR 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) #define COMP_PARAMETER_ERROR 17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) #define COMP_BANDWIDTH_OVERRUN_ERROR 18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) #define COMP_CONTEXT_STATE_ERROR 19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) #define COMP_NO_PING_RESPONSE_ERROR 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) #define COMP_EVENT_RING_FULL_ERROR 21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) #define COMP_INCOMPATIBLE_DEVICE_ERROR 22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) #define COMP_MISSED_SERVICE_ERROR 23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) #define COMP_COMMAND_RING_STOPPED 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) #define COMP_COMMAND_ABORTED 25
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) #define COMP_STOPPED 26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) #define COMP_STOPPED_LENGTH_INVALID 27
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) #define COMP_STOPPED_SHORT_PACKET 28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) #define COMP_MAX_EXIT_LATENCY_TOO_LARGE_ERROR 29
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) #define COMP_ISOCH_BUFFER_OVERRUN 31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) #define COMP_EVENT_LOST_ERROR 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) #define COMP_UNDEFINED_ERROR 33
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) #define COMP_INVALID_STREAM_ID_ERROR 34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) #define COMP_SECONDARY_BANDWIDTH_ERROR 35
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) #define COMP_SPLIT_TRANSACTION_ERROR 36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) static inline const char *xhci_trb_comp_code_string(u8 status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) switch (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) case COMP_INVALID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) return "Invalid";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) case COMP_SUCCESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) return "Success";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) case COMP_DATA_BUFFER_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) return "Data Buffer Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) case COMP_BABBLE_DETECTED_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) return "Babble Detected";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) case COMP_USB_TRANSACTION_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) return "USB Transaction Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) case COMP_TRB_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) return "TRB Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) case COMP_STALL_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) return "Stall Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) case COMP_RESOURCE_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) return "Resource Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) case COMP_BANDWIDTH_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) return "Bandwidth Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) case COMP_NO_SLOTS_AVAILABLE_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) return "No Slots Available Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) case COMP_INVALID_STREAM_TYPE_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) return "Invalid Stream Type Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) case COMP_SLOT_NOT_ENABLED_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) return "Slot Not Enabled Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) case COMP_ENDPOINT_NOT_ENABLED_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) return "Endpoint Not Enabled Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) case COMP_SHORT_PACKET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) return "Short Packet";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) case COMP_RING_UNDERRUN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) return "Ring Underrun";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) case COMP_RING_OVERRUN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) return "Ring Overrun";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) case COMP_VF_EVENT_RING_FULL_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) return "VF Event Ring Full Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) case COMP_PARAMETER_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) return "Parameter Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) case COMP_BANDWIDTH_OVERRUN_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) return "Bandwidth Overrun Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) case COMP_CONTEXT_STATE_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) return "Context State Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) case COMP_NO_PING_RESPONSE_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) return "No Ping Response Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) case COMP_EVENT_RING_FULL_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) return "Event Ring Full Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) case COMP_INCOMPATIBLE_DEVICE_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) return "Incompatible Device Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) case COMP_MISSED_SERVICE_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) return "Missed Service Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) case COMP_COMMAND_RING_STOPPED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) return "Command Ring Stopped";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) case COMP_COMMAND_ABORTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) return "Command Aborted";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) case COMP_STOPPED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) return "Stopped";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) case COMP_STOPPED_LENGTH_INVALID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) return "Stopped - Length Invalid";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) case COMP_STOPPED_SHORT_PACKET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) return "Stopped - Short Packet";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) case COMP_MAX_EXIT_LATENCY_TOO_LARGE_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) return "Max Exit Latency Too Large Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) case COMP_ISOCH_BUFFER_OVERRUN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) return "Isoch Buffer Overrun";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) case COMP_EVENT_LOST_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) return "Event Lost Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) case COMP_UNDEFINED_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) return "Undefined Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) case COMP_INVALID_STREAM_ID_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) return "Invalid Stream ID Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) case COMP_SECONDARY_BANDWIDTH_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) return "Secondary Bandwidth Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) case COMP_SPLIT_TRANSACTION_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) return "Split Transaction Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) return "Unknown!!";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) struct xhci_link_trb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) /* 64-bit segment pointer*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) __le64 segment_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) __le32 intr_target;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) __le32 control;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) /* control bitfields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) #define LINK_TOGGLE (0x1<<1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) /* Command completion event TRB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) struct xhci_event_cmd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) /* Pointer to command TRB, or the value passed by the event data trb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) __le64 cmd_trb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) __le32 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) __le32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) /* flags bitmasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) /* Address device - disable SetAddress */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) #define TRB_BSR (1<<9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) /* Configure Endpoint - Deconfigure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) #define TRB_DC (1<<9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) /* Stop Ring - Transfer State Preserve */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) #define TRB_TSP (1<<9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) enum xhci_ep_reset_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) EP_HARD_RESET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) EP_SOFT_RESET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) /* Force Event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) #define TRB_TO_VF_INTR_TARGET(p) (((p) & (0x3ff << 22)) >> 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) #define TRB_TO_VF_ID(p) (((p) & (0xff << 16)) >> 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) /* Set Latency Tolerance Value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) #define TRB_TO_BELT(p) (((p) & (0xfff << 16)) >> 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) /* Get Port Bandwidth */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) #define TRB_TO_DEV_SPEED(p) (((p) & (0xf << 16)) >> 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) /* Force Header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) #define TRB_TO_PACKET_TYPE(p) ((p) & 0x1f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) #define TRB_TO_ROOTHUB_PORT(p) (((p) & (0xff << 24)) >> 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) enum xhci_setup_dev {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) SETUP_CONTEXT_ONLY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) SETUP_CONTEXT_ADDRESS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) /* bits 16:23 are the virtual function ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) /* bits 24:31 are the slot ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) #define TRB_TO_SLOT_ID(p) (((p) & (0xff<<24)) >> 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) #define SLOT_ID_FOR_TRB(p) (((p) & 0xff) << 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) /* Stop Endpoint TRB - ep_index to endpoint ID for this TRB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) #define TRB_TO_EP_INDEX(p) ((((p) & (0x1f << 16)) >> 16) - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) #define EP_ID_FOR_TRB(p) ((((p) + 1) & 0x1f) << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) #define SUSPEND_PORT_FOR_TRB(p) (((p) & 1) << 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) #define TRB_TO_SUSPEND_PORT(p) (((p) & (1 << 23)) >> 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) #define LAST_EP_INDEX 30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) /* Set TR Dequeue Pointer command TRB fields, 6.4.3.9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) #define TRB_TO_STREAM_ID(p) ((((p) & (0xffff << 16)) >> 16))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) #define STREAM_ID_FOR_TRB(p) ((((p)) & 0xffff) << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) #define SCT_FOR_TRB(p) (((p) << 1) & 0x7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) /* Link TRB specific fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) #define TRB_TC (1<<1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) /* Port Status Change Event TRB fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) /* Port ID - bits 31:24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) #define GET_PORT_ID(p) (((p) & (0xff << 24)) >> 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) #define EVENT_DATA (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) /* Normal TRB fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) /* transfer_len bitmasks - bits 0:16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) #define TRB_LEN(p) ((p) & 0x1ffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) /* TD Size, packets remaining in this TD, bits 21:17 (5 bits, so max 31) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) #define TRB_TD_SIZE(p) (min((p), (u32)31) << 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) #define GET_TD_SIZE(p) (((p) & 0x3e0000) >> 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) /* xhci 1.1 uses the TD_SIZE field for TBC if Extended TBC is enabled (ETE) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) #define TRB_TD_SIZE_TBC(p) (min((p), (u32)31) << 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) /* Interrupter Target - which MSI-X vector to target the completion event at */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) #define TRB_INTR_TARGET(p) (((p) & 0x3ff) << 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) #define GET_INTR_TARGET(p) (((p) >> 22) & 0x3ff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) /* Total burst count field, Rsvdz on xhci 1.1 with Extended TBC enabled (ETE) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) #define TRB_TBC(p) (((p) & 0x3) << 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) #define TRB_TLBPC(p) (((p) & 0xf) << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) /* Cycle bit - indicates TRB ownership by HC or HCD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) #define TRB_CYCLE (1<<0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) * Force next event data TRB to be evaluated before task switch.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) * Used to pass OS data back after a TD completes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) #define TRB_ENT (1<<1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) /* Interrupt on short packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) #define TRB_ISP (1<<2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) /* Set PCIe no snoop attribute */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) #define TRB_NO_SNOOP (1<<3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) /* Chain multiple TRBs into a TD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) #define TRB_CHAIN (1<<4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) /* Interrupt on completion */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) #define TRB_IOC (1<<5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) /* The buffer pointer contains immediate data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) #define TRB_IDT (1<<6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) /* TDs smaller than this might use IDT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) #define TRB_IDT_MAX_SIZE 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) /* Block Event Interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) #define TRB_BEI (1<<9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) /* Control transfer TRB specific fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) #define TRB_DIR_IN (1<<16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) #define TRB_TX_TYPE(p) ((p) << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) #define TRB_DATA_OUT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) #define TRB_DATA_IN 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) /* Isochronous TRB specific fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) #define TRB_SIA (1<<31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) #define TRB_FRAME_ID(p) (((p) & 0x7ff) << 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) struct xhci_generic_trb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) __le32 field[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) union xhci_trb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) struct xhci_link_trb link;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) struct xhci_transfer_event trans_event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) struct xhci_event_cmd event_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) struct xhci_generic_trb generic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) /* TRB bit mask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) #define TRB_TYPE_BITMASK (0xfc00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) #define TRB_TYPE(p) ((p) << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) #define TRB_FIELD_TO_TYPE(p) (((p) & TRB_TYPE_BITMASK) >> 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) /* TRB type IDs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) /* bulk, interrupt, isoc scatter/gather, and control data stage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) #define TRB_NORMAL 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) /* setup stage for control transfers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) #define TRB_SETUP 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) /* data stage for control transfers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) #define TRB_DATA 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) /* status stage for control transfers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) #define TRB_STATUS 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) /* isoc transfers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) #define TRB_ISOC 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) /* TRB for linking ring segments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) #define TRB_LINK 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) #define TRB_EVENT_DATA 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) /* Transfer Ring No-op (not for the command ring) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) #define TRB_TR_NOOP 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) /* Command TRBs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) /* Enable Slot Command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) #define TRB_ENABLE_SLOT 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) /* Disable Slot Command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) #define TRB_DISABLE_SLOT 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) /* Address Device Command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) #define TRB_ADDR_DEV 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) /* Configure Endpoint Command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) #define TRB_CONFIG_EP 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) /* Evaluate Context Command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) #define TRB_EVAL_CONTEXT 13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) /* Reset Endpoint Command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) #define TRB_RESET_EP 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) /* Stop Transfer Ring Command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) #define TRB_STOP_RING 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) /* Set Transfer Ring Dequeue Pointer Command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) #define TRB_SET_DEQ 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) /* Reset Device Command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) #define TRB_RESET_DEV 17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) /* Force Event Command (opt) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) #define TRB_FORCE_EVENT 18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) /* Negotiate Bandwidth Command (opt) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) #define TRB_NEG_BANDWIDTH 19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) /* Set Latency Tolerance Value Command (opt) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) #define TRB_SET_LT 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) /* Get port bandwidth Command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) #define TRB_GET_BW 21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) /* Force Header Command - generate a transaction or link management packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) #define TRB_FORCE_HEADER 22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) /* No-op Command - not for transfer rings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) #define TRB_CMD_NOOP 23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) /* TRB IDs 24-31 reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) /* Event TRBS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) /* Transfer Event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) #define TRB_TRANSFER 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) /* Command Completion Event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) #define TRB_COMPLETION 33
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) /* Port Status Change Event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) #define TRB_PORT_STATUS 34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) /* Bandwidth Request Event (opt) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) #define TRB_BANDWIDTH_EVENT 35
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) /* Doorbell Event (opt) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) #define TRB_DOORBELL 36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) /* Host Controller Event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) #define TRB_HC_EVENT 37
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) /* Device Notification Event - device sent function wake notification */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) #define TRB_DEV_NOTE 38
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) /* MFINDEX Wrap Event - microframe counter wrapped */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) #define TRB_MFINDEX_WRAP 39
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) /* TRB IDs 40-47 reserved, 48-63 is vendor-defined */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) #define TRB_VENDOR_DEFINED_LOW 48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) /* Nec vendor-specific command completion event. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) #define TRB_NEC_CMD_COMP 48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) /* Get NEC firmware revision. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) #define TRB_NEC_GET_FW 49
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) static inline const char *xhci_trb_type_string(u8 type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) case TRB_NORMAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) return "Normal";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) case TRB_SETUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) return "Setup Stage";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) case TRB_DATA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) return "Data Stage";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) case TRB_STATUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) return "Status Stage";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) case TRB_ISOC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) return "Isoch";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) case TRB_LINK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) return "Link";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) case TRB_EVENT_DATA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) return "Event Data";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) case TRB_TR_NOOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) return "No-Op";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) case TRB_ENABLE_SLOT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) return "Enable Slot Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) case TRB_DISABLE_SLOT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) return "Disable Slot Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) case TRB_ADDR_DEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) return "Address Device Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) case TRB_CONFIG_EP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) return "Configure Endpoint Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) case TRB_EVAL_CONTEXT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) return "Evaluate Context Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) case TRB_RESET_EP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) return "Reset Endpoint Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) case TRB_STOP_RING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) return "Stop Ring Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) case TRB_SET_DEQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) return "Set TR Dequeue Pointer Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) case TRB_RESET_DEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) return "Reset Device Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) case TRB_FORCE_EVENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) return "Force Event Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) case TRB_NEG_BANDWIDTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) return "Negotiate Bandwidth Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) case TRB_SET_LT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) return "Set Latency Tolerance Value Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) case TRB_GET_BW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) return "Get Port Bandwidth Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) case TRB_FORCE_HEADER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) return "Force Header Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) case TRB_CMD_NOOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) return "No-Op Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) case TRB_TRANSFER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) return "Transfer Event";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) case TRB_COMPLETION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) return "Command Completion Event";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) case TRB_PORT_STATUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) return "Port Status Change Event";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) case TRB_BANDWIDTH_EVENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) return "Bandwidth Request Event";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) case TRB_DOORBELL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) return "Doorbell Event";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) case TRB_HC_EVENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) return "Host Controller Event";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) case TRB_DEV_NOTE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) return "Device Notification Event";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) case TRB_MFINDEX_WRAP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) return "MFINDEX Wrap Event";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) case TRB_NEC_CMD_COMP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) return "NEC Command Completion Event";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) case TRB_NEC_GET_FW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) return "NET Get Firmware Revision Command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) return "UNKNOWN";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) #define TRB_TYPE_LINK(x) (((x) & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) /* Above, but for __le32 types -- can avoid work by swapping constants: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) #define TRB_TYPE_LINK_LE32(x) (((x) & cpu_to_le32(TRB_TYPE_BITMASK)) == \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) cpu_to_le32(TRB_TYPE(TRB_LINK)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) #define TRB_TYPE_NOOP_LE32(x) (((x) & cpu_to_le32(TRB_TYPE_BITMASK)) == \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) cpu_to_le32(TRB_TYPE(TRB_TR_NOOP)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) #define NEC_FW_MINOR(p) (((p) >> 0) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) #define NEC_FW_MAJOR(p) (((p) >> 8) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) * TRBS_PER_SEGMENT must be a multiple of 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) * since the command ring is 64-byte aligned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) * It must also be greater than 16.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) #define TRBS_PER_SEGMENT 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) /* Allow two commands + a link TRB, along with any reserved command TRBs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) #define MAX_RSVD_CMD_TRBS (TRBS_PER_SEGMENT - 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) #define TRB_SEGMENT_SIZE (TRBS_PER_SEGMENT*16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) #define TRB_SEGMENT_SHIFT (ilog2(TRB_SEGMENT_SIZE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) /* TRB buffer pointers can't cross 64KB boundaries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) #define TRB_MAX_BUFF_SHIFT 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) #define TRB_MAX_BUFF_SIZE (1 << TRB_MAX_BUFF_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) /* How much data is left before the 64KB boundary? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) #define TRB_BUFF_LEN_UP_TO_BOUNDARY(addr) (TRB_MAX_BUFF_SIZE - \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) (addr & (TRB_MAX_BUFF_SIZE - 1)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) #define MAX_SOFT_RETRY 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) struct xhci_segment {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) union xhci_trb *trbs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) /* private to HCD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) struct xhci_segment *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) dma_addr_t dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) /* Max packet sized bounce buffer for td-fragmant alignment */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) dma_addr_t bounce_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) void *bounce_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) unsigned int bounce_offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) unsigned int bounce_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) ANDROID_KABI_RESERVE(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) enum xhci_cancelled_td_status {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) TD_DIRTY = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) TD_HALTED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) TD_CLEARING_CACHE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) TD_CLEARED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) struct xhci_td {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) struct list_head td_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) struct list_head cancelled_td_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) enum xhci_cancelled_td_status cancel_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) struct xhci_segment *start_seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) union xhci_trb *first_trb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) union xhci_trb *last_trb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) struct xhci_segment *last_trb_seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) struct xhci_segment *bounce_seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) /* actual_length of the URB has already been set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) bool urb_length_set;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) unsigned int num_trbs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) /* xHCI command default timeout value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) #define XHCI_CMD_DEFAULT_TIMEOUT (5 * HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) /* command descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) struct xhci_cd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) struct xhci_command *command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) union xhci_trb *cmd_trb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) enum xhci_ring_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) TYPE_CTRL = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) TYPE_ISOC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) TYPE_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) TYPE_INTR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) TYPE_STREAM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) TYPE_COMMAND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) TYPE_EVENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) static inline const char *xhci_ring_type_string(enum xhci_ring_type type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) case TYPE_CTRL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) return "CTRL";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) case TYPE_ISOC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) return "ISOC";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) case TYPE_BULK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) return "BULK";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) case TYPE_INTR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) return "INTR";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) case TYPE_STREAM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) return "STREAM";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) case TYPE_COMMAND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) return "CMD";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) case TYPE_EVENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) return "EVENT";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) return "UNKNOWN";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) struct xhci_ring {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) struct xhci_segment *first_seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) struct xhci_segment *last_seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) union xhci_trb *enqueue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) struct xhci_segment *enq_seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) union xhci_trb *dequeue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) struct xhci_segment *deq_seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) struct list_head td_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) * Write the cycle state into the TRB cycle field to give ownership of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) * the TRB to the host controller (if we are the producer), or to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) * if we own the TRB (if we are the consumer). See section 4.9.1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) u32 cycle_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) unsigned int err_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) unsigned int stream_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) unsigned int num_segs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) unsigned int num_trbs_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) unsigned int num_trbs_free_temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) unsigned int bounce_buf_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) enum xhci_ring_type type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) bool last_td_was_short;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) struct radix_tree_root *trb_address_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) ANDROID_KABI_RESERVE(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) ANDROID_KABI_RESERVE(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) struct xhci_erst_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) /* 64-bit event ring segment address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) __le64 seg_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) __le32 seg_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) /* Set to zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) __le32 rsvd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) struct xhci_erst {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) struct xhci_erst_entry *entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) unsigned int num_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) /* xhci->event_ring keeps track of segment dma addresses */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) dma_addr_t erst_dma_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) /* Num entries the ERST can contain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) unsigned int erst_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) ANDROID_KABI_RESERVE(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) struct xhci_scratchpad {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) u64 *sp_array;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) dma_addr_t sp_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) void **sp_buffers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) struct urb_priv {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) int num_tds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) int num_tds_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) struct xhci_td td[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) * Each segment table entry is 4*32bits long. 1K seems like an ok size:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) * (1K bytes * 8bytes/bit) / (4*32 bits) = 64 segment entries in the table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) * meaning 64 ring segments.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) * Initial allocated size of the ERST, in number of entries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) #define ERST_NUM_SEGS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) /* Initial allocated size of the ERST, in number of entries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) #define ERST_SIZE 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) /* Initial number of event segment rings allocated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) #define ERST_ENTRIES 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) /* Poll every 60 seconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) #define POLL_TIMEOUT 60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) /* Stop endpoint command timeout (secs) for URB cancellation watchdog timer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) #define XHCI_STOP_EP_CMD_TIMEOUT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) /* XXX: Make these module parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) struct s3_save {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) u32 command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) u32 dev_nt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) u64 dcbaa_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) u32 config_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) u32 irq_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) u32 irq_control;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) u32 erst_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) u64 erst_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) u64 erst_dequeue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) /* Use for lpm */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) struct dev_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) u32 dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) struct xhci_bus_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) unsigned long bus_suspended;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) unsigned long next_statechange;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) /* Port suspend arrays are indexed by the portnum of the fake roothub */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) /* ports suspend status arrays - max 31 ports for USB2, 15 for USB3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) u32 port_c_suspend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) u32 suspended_ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) u32 port_remote_wakeup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) unsigned long resume_done[USB_MAXCHILDREN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) /* which ports have started to resume */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) unsigned long resuming_ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) /* Which ports are waiting on RExit to U0 transition. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) unsigned long rexit_ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) struct completion rexit_done[USB_MAXCHILDREN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) struct completion u3exit_done[USB_MAXCHILDREN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) * It can take up to 20 ms to transition from RExit to U0 on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) * Intel Lynx Point LP xHCI host.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) #define XHCI_MAX_REXIT_TIMEOUT_MS 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) struct xhci_port_cap {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) u32 *psi; /* array of protocol speed ID entries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) u8 psi_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) u8 psi_uid_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) u8 maj_rev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) u8 min_rev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) struct xhci_port {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) __le32 __iomem *addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) int hw_portnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) int hcd_portnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) struct xhci_hub *rhub;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) struct xhci_port_cap *port_cap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) struct xhci_hub {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) struct xhci_port **ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) unsigned int num_ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) struct usb_hcd *hcd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) /* keep track of bus suspend info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) struct xhci_bus_state bus_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) /* supported prococol extended capabiliy values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) u8 maj_rev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) u8 min_rev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) /* There is one xhci_hcd structure per controller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) struct xhci_hcd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) struct usb_hcd *main_hcd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) struct usb_hcd *shared_hcd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) /* glue to PCI and HCD framework */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) struct xhci_cap_regs __iomem *cap_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) struct xhci_op_regs __iomem *op_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) struct xhci_run_regs __iomem *run_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) struct xhci_doorbell_array __iomem *dba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) /* Our HCD's current interrupter register set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) struct xhci_intr_reg __iomem *ir_set;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) /* Cached register copies of read-only HC data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) __u32 hcs_params1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) __u32 hcs_params2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) __u32 hcs_params3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) __u32 hcc_params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) __u32 hcc_params2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) /* packed release number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) u8 sbrn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) u16 hci_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) u8 max_slots;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) u8 max_interrupters;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) u8 max_ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) u8 isoc_threshold;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) /* imod_interval in ns (I * 250ns) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) u32 imod_interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) int event_ring_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) /* 4KB min, 128MB max */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) int page_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) /* Valid values are 12 to 20, inclusive */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) int page_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) /* msi-x vectors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) int msix_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) /* optional clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) struct clk *reg_clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) /* optional reset controller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) struct reset_control *reset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) /* data structures */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) struct xhci_device_context_array *dcbaa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) struct xhci_ring *cmd_ring;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) unsigned int cmd_ring_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) #define CMD_RING_STATE_RUNNING (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) #define CMD_RING_STATE_ABORTED (1 << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) #define CMD_RING_STATE_STOPPED (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) struct list_head cmd_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) unsigned int cmd_ring_reserved_trbs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) struct delayed_work cmd_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) struct completion cmd_ring_stop_completion;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) struct xhci_command *current_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) struct xhci_ring *event_ring;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) struct xhci_erst erst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) /* Scratchpad */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) struct xhci_scratchpad *scratchpad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) /* Store LPM test failed devices' information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) struct list_head lpm_failed_devs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) /* slot enabling and address device helpers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) /* these are not thread safe so use mutex */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) struct mutex mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) /* For USB 3.0 LPM enable/disable. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) struct xhci_command *lpm_command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) /* Internal mirror of the HW's dcbaa */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) struct xhci_virt_device *devs[MAX_HC_SLOTS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) /* For keeping track of bandwidth domains per roothub. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) struct xhci_root_port_bw_info *rh_bw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) /* DMA pools */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) struct dma_pool *device_pool;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) struct dma_pool *segment_pool;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) struct dma_pool *small_streams_pool;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) struct dma_pool *medium_streams_pool;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) /* Host controller watchdog timer structures */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) unsigned int xhc_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) u32 command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) struct s3_save s3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) /* Host controller is dying - not responding to commands. "I'm not dead yet!"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) * xHC interrupts have been disabled and a watchdog timer will (or has already)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) * halt the xHCI host, and complete all URBs with an -ESHUTDOWN code. Any code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) * that sees this status (other than the timer that set it) should stop touching
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) * hardware immediately. Interrupt handlers should return immediately when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) * they see this status (any time they drop and re-acquire xhci->lock).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) * xhci_urb_dequeue() should call usb_hcd_check_unlink_urb() and return without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) * putting the TD on the canceled list, etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) * There are no reports of xHCI host controllers that display this issue.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) #define XHCI_STATE_DYING (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) #define XHCI_STATE_HALTED (1 << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) #define XHCI_STATE_REMOVING (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) unsigned long long quirks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) #define XHCI_LINK_TRB_QUIRK BIT_ULL(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) #define XHCI_RESET_EP_QUIRK BIT_ULL(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) #define XHCI_NEC_HOST BIT_ULL(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) #define XHCI_AMD_PLL_FIX BIT_ULL(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) #define XHCI_SPURIOUS_SUCCESS BIT_ULL(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) * Certain Intel host controllers have a limit to the number of endpoint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) * contexts they can handle. Ideally, they would signal that they can't handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) * anymore endpoint contexts by returning a Resource Error for the Configure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) * Endpoint command, but they don't. Instead they expect software to keep track
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) * of the number of active endpoints for them, across configure endpoint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) * commands, reset device commands, disable slot commands, and address device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) * commands.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) #define XHCI_EP_LIMIT_QUIRK BIT_ULL(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) #define XHCI_BROKEN_MSI BIT_ULL(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) #define XHCI_RESET_ON_RESUME BIT_ULL(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) #define XHCI_SW_BW_CHECKING BIT_ULL(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) #define XHCI_AMD_0x96_HOST BIT_ULL(9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) #define XHCI_TRUST_TX_LENGTH BIT_ULL(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) #define XHCI_LPM_SUPPORT BIT_ULL(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) #define XHCI_INTEL_HOST BIT_ULL(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) #define XHCI_SPURIOUS_REBOOT BIT_ULL(13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) #define XHCI_COMP_MODE_QUIRK BIT_ULL(14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) #define XHCI_AVOID_BEI BIT_ULL(15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) #define XHCI_PLAT BIT_ULL(16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) #define XHCI_SLOW_SUSPEND BIT_ULL(17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) #define XHCI_SPURIOUS_WAKEUP BIT_ULL(18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) /* For controllers with a broken beyond repair streams implementation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) #define XHCI_BROKEN_STREAMS BIT_ULL(19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) #define XHCI_PME_STUCK_QUIRK BIT_ULL(20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) #define XHCI_MTK_HOST BIT_ULL(21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) #define XHCI_SSIC_PORT_UNUSED BIT_ULL(22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) #define XHCI_NO_64BIT_SUPPORT BIT_ULL(23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) #define XHCI_MISSING_CAS BIT_ULL(24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) /* For controller with a broken Port Disable implementation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) #define XHCI_BROKEN_PORT_PED BIT_ULL(25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) #define XHCI_LIMIT_ENDPOINT_INTERVAL_7 BIT_ULL(26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) #define XHCI_U2_DISABLE_WAKE BIT_ULL(27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) #define XHCI_ASMEDIA_MODIFY_FLOWCONTROL BIT_ULL(28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) #define XHCI_HW_LPM_DISABLE BIT_ULL(29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) #define XHCI_SUSPEND_DELAY BIT_ULL(30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) #define XHCI_INTEL_USB_ROLE_SW BIT_ULL(31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) #define XHCI_ZERO_64B_REGS BIT_ULL(32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) #define XHCI_DEFAULT_PM_RUNTIME_ALLOW BIT_ULL(33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) #define XHCI_RESET_PLL_ON_DISCONNECT BIT_ULL(34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) #define XHCI_SNPS_BROKEN_SUSPEND BIT_ULL(35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) #define XHCI_RENESAS_FW_QUIRK BIT_ULL(36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) #define XHCI_SKIP_PHY_INIT BIT_ULL(37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) #define XHCI_DISABLE_SPARSE BIT_ULL(38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) #define XHCI_SG_TRB_CACHE_SIZE_QUIRK BIT_ULL(39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) #define XHCI_NO_SOFT_RETRY BIT_ULL(40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) #define XHCI_EP_CTX_BROKEN_DCS BIT_ULL(42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) #define XHCI_U2_BROKEN_SUSPEND BIT_ULL(43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) unsigned int num_active_eps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) unsigned int limit_active_eps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) struct xhci_port *hw_ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) struct xhci_hub usb2_rhub;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) struct xhci_hub usb3_rhub;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) /* support xHCI 1.0 spec USB2 hardware LPM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) unsigned hw_lpm_support:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) /* Broken Suspend flag for SNPS Suspend resume issue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) unsigned broken_suspend:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) /* cached usb2 extened protocol capabilites */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) u32 *ext_caps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) unsigned int num_ext_caps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) /* cached extended protocol port capabilities */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) struct xhci_port_cap *port_caps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) unsigned int num_port_caps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) /* Compliance Mode Recovery Data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) struct timer_list comp_mode_recovery_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) u32 port_status_u0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) u16 test_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) /* Compliance Mode Timer Triggered every 2 seconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) #define COMP_MODE_RCVRY_MSECS 2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) struct dentry *debugfs_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) struct dentry *debugfs_slots;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) struct list_head regset_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) void *dbc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) /* Used for bug 194461020 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) ANDROID_KABI_USE(1, struct xhci_vendor_ops *vendor_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) ANDROID_KABI_RESERVE(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) ANDROID_KABI_RESERVE(3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) ANDROID_KABI_RESERVE(4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) /* platform-specific data -- must come last */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) unsigned long priv[] __aligned(sizeof(s64));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) /* Platform specific overrides to generic XHCI hc_driver ops */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) struct xhci_driver_overrides {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) size_t extra_priv_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) int (*reset)(struct usb_hcd *hcd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) int (*start)(struct usb_hcd *hcd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) int (*add_endpoint)(struct usb_hcd *hcd, struct usb_device *udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) struct usb_host_endpoint *ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) int (*drop_endpoint)(struct usb_hcd *hcd, struct usb_device *udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) struct usb_host_endpoint *ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) int (*check_bandwidth)(struct usb_hcd *, struct usb_device *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) void (*reset_bandwidth)(struct usb_hcd *, struct usb_device *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) int (*address_device)(struct usb_hcd *hcd, struct usb_device *udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) int (*bus_suspend)(struct usb_hcd *hcd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) int (*bus_resume)(struct usb_hcd *hcd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) #define XHCI_CFC_DELAY 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) /* convert between an HCD pointer and the corresponding EHCI_HCD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) static inline struct xhci_hcd *hcd_to_xhci(struct usb_hcd *hcd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) struct usb_hcd *primary_hcd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) if (usb_hcd_is_primary_hcd(hcd))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) primary_hcd = hcd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) primary_hcd = hcd->primary_hcd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) return (struct xhci_hcd *) (primary_hcd->hcd_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) static inline struct usb_hcd *xhci_to_hcd(struct xhci_hcd *xhci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) return xhci->main_hcd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) #define xhci_dbg(xhci, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) dev_dbg(xhci_to_hcd(xhci)->self.controller , fmt , ## args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) #define xhci_err(xhci, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) dev_err(xhci_to_hcd(xhci)->self.controller , fmt , ## args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) #define xhci_warn(xhci, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) dev_warn(xhci_to_hcd(xhci)->self.controller , fmt , ## args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) #define xhci_warn_ratelimited(xhci, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) dev_warn_ratelimited(xhci_to_hcd(xhci)->self.controller , fmt , ## args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) #define xhci_info(xhci, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) dev_info(xhci_to_hcd(xhci)->self.controller , fmt , ## args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) * Registers should always be accessed with double word or quad word accesses.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) * Some xHCI implementations may support 64-bit address pointers. Registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) * with 64-bit address pointers should be written to with dword accesses by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) * writing the low dword first (ptr[0]), then the high dword (ptr[1]) second.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) * xHCI implementations that do not support 64-bit address pointers will ignore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) * the high dword, and write order is irrelevant.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) static inline u64 xhci_read_64(const struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) __le64 __iomem *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) return lo_hi_readq(regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) static inline void xhci_write_64(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) const u64 val, __le64 __iomem *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) lo_hi_writeq(val, regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) static inline int xhci_link_trb_quirk(struct xhci_hcd *xhci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) return xhci->quirks & XHCI_LINK_TRB_QUIRK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) /* xHCI debugging */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) char *xhci_get_slot_state(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) struct xhci_container_ctx *ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) void xhci_dbg_trace(struct xhci_hcd *xhci, void (*trace)(struct va_format *),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) const char *fmt, ...);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) /* xHCI memory management */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) void xhci_mem_cleanup(struct xhci_hcd *xhci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) void xhci_free_virt_device(struct xhci_hcd *xhci, int slot_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, struct usb_device *udev, gfp_t flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) void xhci_copy_ep0_dequeue_into_input_ctx(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) struct usb_device *udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) unsigned int xhci_get_endpoint_index(struct usb_endpoint_descriptor *desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) unsigned int xhci_get_endpoint_address(unsigned int ep_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) unsigned int xhci_last_valid_endpoint(u32 added_ctxs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) void xhci_endpoint_zero(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, struct usb_host_endpoint *ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) void xhci_update_tt_active_eps(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) struct xhci_virt_device *virt_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) int old_active_eps);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) void xhci_clear_endpoint_bw_info(struct xhci_bw_info *bw_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) void xhci_update_bw_info(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) struct xhci_container_ctx *in_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) struct xhci_input_control_ctx *ctrl_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) struct xhci_virt_device *virt_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) void xhci_endpoint_copy(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) struct xhci_container_ctx *in_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) struct xhci_container_ctx *out_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) unsigned int ep_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) void xhci_slot_copy(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) struct xhci_container_ctx *in_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) struct xhci_container_ctx *out_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) int xhci_endpoint_init(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) struct usb_device *udev, struct usb_host_endpoint *ep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) gfp_t mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) struct xhci_ring *xhci_ring_alloc(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) unsigned int num_segs, unsigned int cycle_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) enum xhci_ring_type type, unsigned int max_packet, gfp_t flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) void xhci_ring_free(struct xhci_hcd *xhci, struct xhci_ring *ring);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) int xhci_ring_expansion(struct xhci_hcd *xhci, struct xhci_ring *ring,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) unsigned int num_trbs, gfp_t flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) int xhci_alloc_erst(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) struct xhci_ring *evt_ring,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) struct xhci_erst *erst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) gfp_t flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) void xhci_initialize_ring_info(struct xhci_ring *ring,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) unsigned int cycle_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) void xhci_free_erst(struct xhci_hcd *xhci, struct xhci_erst *erst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) void xhci_free_endpoint_ring(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) struct xhci_virt_device *virt_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) unsigned int ep_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) struct xhci_stream_info *xhci_alloc_stream_info(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) unsigned int num_stream_ctxs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) unsigned int num_streams,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) unsigned int max_packet, gfp_t flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) void xhci_free_stream_info(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) struct xhci_stream_info *stream_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) void xhci_setup_streams_ep_input_ctx(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) struct xhci_ep_ctx *ep_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) struct xhci_stream_info *stream_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) void xhci_setup_no_streams_ep_input_ctx(struct xhci_ep_ctx *ep_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) struct xhci_virt_ep *ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) void xhci_free_device_endpoint_resources(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) struct xhci_virt_device *virt_dev, bool drop_control_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) struct xhci_ring *xhci_dma_to_transfer_ring(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) struct xhci_virt_ep *ep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) u64 address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) struct xhci_command *xhci_alloc_command(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) bool allocate_completion, gfp_t mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) struct xhci_command *xhci_alloc_command_with_ctx(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) bool allocate_completion, gfp_t mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) void xhci_urb_free_priv(struct urb_priv *urb_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) void xhci_free_command(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) struct xhci_command *command);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) struct xhci_container_ctx *xhci_alloc_container_ctx(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) int type, gfp_t flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) void xhci_free_container_ctx(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) struct xhci_container_ctx *ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) /* xHCI host controller glue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) typedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) int xhci_handshake(void __iomem *ptr, u32 mask, u32 done, u64 timeout_us);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) void xhci_quiesce(struct xhci_hcd *xhci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) int xhci_halt(struct xhci_hcd *xhci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) int xhci_start(struct xhci_hcd *xhci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) int xhci_reset(struct xhci_hcd *xhci, u64 timeout_us);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) int xhci_run(struct usb_hcd *hcd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) void xhci_shutdown(struct usb_hcd *hcd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) void xhci_init_driver(struct hc_driver *drv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) const struct xhci_driver_overrides *over);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) struct usb_host_endpoint *ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) int xhci_drop_endpoint(struct usb_hcd *hcd, struct usb_device *udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) struct usb_host_endpoint *ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) void xhci_reset_bandwidth(struct usb_hcd *hcd, struct usb_device *udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) int xhci_disable_slot(struct xhci_hcd *xhci, u32 slot_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) int xhci_ext_cap_init(struct xhci_hcd *xhci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) int xhci_resume(struct xhci_hcd *xhci, bool hibernated);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) irqreturn_t xhci_irq(struct usb_hcd *hcd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) irqreturn_t xhci_msi_irq(int irq, void *hcd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) int xhci_alloc_tt_info(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) struct xhci_virt_device *virt_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) struct usb_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) struct usb_tt *tt, gfp_t mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) /* xHCI ring, segment, TRB, and TD functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) dma_addr_t xhci_trb_virt_to_dma(struct xhci_segment *seg, union xhci_trb *trb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) struct xhci_segment *trb_in_td(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) struct xhci_segment *start_seg, union xhci_trb *start_trb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) union xhci_trb *end_trb, dma_addr_t suspect_dma, bool debug);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) int xhci_is_vendor_info_code(struct xhci_hcd *xhci, unsigned int trb_comp_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) void xhci_ring_cmd_db(struct xhci_hcd *xhci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) int xhci_queue_slot_control(struct xhci_hcd *xhci, struct xhci_command *cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) u32 trb_type, u32 slot_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) int xhci_queue_address_device(struct xhci_hcd *xhci, struct xhci_command *cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) dma_addr_t in_ctx_ptr, u32 slot_id, enum xhci_setup_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) int xhci_queue_vendor_command(struct xhci_hcd *xhci, struct xhci_command *cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) u32 field1, u32 field2, u32 field3, u32 field4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) int xhci_queue_stop_endpoint(struct xhci_hcd *xhci, struct xhci_command *cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) int slot_id, unsigned int ep_index, int suspend);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) int slot_id, unsigned int ep_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) int slot_id, unsigned int ep_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) int xhci_queue_intr_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) int slot_id, unsigned int ep_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) int xhci_queue_isoc_tx_prepare(struct xhci_hcd *xhci, gfp_t mem_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) struct urb *urb, int slot_id, unsigned int ep_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) int xhci_queue_configure_endpoint(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) struct xhci_command *cmd, dma_addr_t in_ctx_ptr, u32 slot_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) bool command_must_succeed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) int xhci_queue_evaluate_context(struct xhci_hcd *xhci, struct xhci_command *cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) dma_addr_t in_ctx_ptr, u32 slot_id, bool command_must_succeed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) int xhci_queue_reset_ep(struct xhci_hcd *xhci, struct xhci_command *cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) int slot_id, unsigned int ep_index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) enum xhci_ep_reset_type reset_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) int xhci_queue_reset_device(struct xhci_hcd *xhci, struct xhci_command *cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) u32 slot_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) void xhci_cleanup_stalled_ring(struct xhci_hcd *xhci, unsigned int slot_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) unsigned int ep_index, unsigned int stream_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) struct xhci_td *td);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) void xhci_stop_endpoint_command_watchdog(struct timer_list *t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) void xhci_handle_command_timeout(struct work_struct *work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) void xhci_ring_ep_doorbell(struct xhci_hcd *xhci, unsigned int slot_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) unsigned int ep_index, unsigned int stream_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) void xhci_ring_doorbell_for_active_rings(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) unsigned int slot_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) unsigned int ep_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) void xhci_cleanup_command_queue(struct xhci_hcd *xhci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) void inc_deq(struct xhci_hcd *xhci, struct xhci_ring *ring);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) unsigned int count_trbs(u64 addr, u64 len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) /* xHCI roothub code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) void xhci_set_link_state(struct xhci_hcd *xhci, struct xhci_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) u32 link_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) void xhci_test_and_clear_bit(struct xhci_hcd *xhci, struct xhci_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) u32 port_bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) char *buf, u16 wLength);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) int xhci_hub_status_data(struct usb_hcd *hcd, char *buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) int xhci_find_raw_port_number(struct usb_hcd *hcd, int port1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) struct xhci_hub *xhci_get_rhub(struct usb_hcd *hcd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) void xhci_hc_died(struct xhci_hcd *xhci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) int xhci_bus_suspend(struct usb_hcd *hcd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) int xhci_bus_resume(struct usb_hcd *hcd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) unsigned long xhci_get_resuming_ports(struct usb_hcd *hcd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) #define xhci_bus_suspend NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) #define xhci_bus_resume NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) #define xhci_get_resuming_ports NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) #endif /* CONFIG_PM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) u32 xhci_port_state_to_neutral(u32 state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) int xhci_find_slot_id_by_port(struct usb_hcd *hcd, struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) u16 port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) void xhci_ring_device(struct xhci_hcd *xhci, int slot_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) /* xHCI contexts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) struct xhci_input_control_ctx *xhci_get_input_control_ctx(struct xhci_container_ctx *ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) struct xhci_slot_ctx *xhci_get_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) struct xhci_ep_ctx *xhci_get_ep_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx, unsigned int ep_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) struct xhci_ring *xhci_triad_to_transfer_ring(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) unsigned int slot_id, unsigned int ep_index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) unsigned int stream_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) static inline struct xhci_ring *xhci_urb_to_transfer_ring(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) return xhci_triad_to_transfer_ring(xhci, urb->dev->slot_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) xhci_get_endpoint_index(&urb->ep->desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) urb->stream_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) * struct xhci_vendor_ops - function callbacks for vendor specific operations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) * @vendor_init: called for vendor init process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) * @vendor_cleanup: called for vendor cleanup process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) * @is_usb_offload_enabled: called to check if usb offload enabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) * @queue_irq_work: called to queue vendor specific irq work
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) * @alloc_dcbaa: called when allocating vendor specific dcbaa
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) * @free_dcbaa: called to free vendor specific dcbaa
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) * @alloc_transfer_ring: called when remote transfer ring allocation is required
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) * @free_transfer_ring: called to free vendor specific transfer ring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) * @sync_dev_ctx: called when synchronization for device context is required
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) * @alloc_container_ctx: called when allocating vendor specific container context
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) * @free_container_ctx: called to free vendor specific container context
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) struct xhci_vendor_ops {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) int (*vendor_init)(struct xhci_hcd *xhci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) void (*vendor_cleanup)(struct xhci_hcd *xhci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) bool (*is_usb_offload_enabled)(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) struct xhci_virt_device *vdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) unsigned int ep_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) irqreturn_t (*queue_irq_work)(struct xhci_hcd *xhci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) struct xhci_device_context_array *(*alloc_dcbaa)(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) gfp_t flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) void (*free_dcbaa)(struct xhci_hcd *xhci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) struct xhci_ring *(*alloc_transfer_ring)(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) u32 endpoint_type, enum xhci_ring_type ring_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) unsigned int max_packet, gfp_t mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) void (*free_transfer_ring)(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) struct xhci_virt_device *virt_dev, unsigned int ep_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) int (*sync_dev_ctx)(struct xhci_hcd *xhci, unsigned int slot_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) bool (*usb_offload_skip_urb)(struct xhci_hcd *xhci, struct urb *urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) void (*alloc_container_ctx)(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) int type, gfp_t flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) void (*free_container_ctx)(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) struct xhci_vendor_ops *xhci_vendor_get_ops(struct xhci_hcd *xhci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) int xhci_vendor_sync_dev_ctx(struct xhci_hcd *xhci, unsigned int slot_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) bool xhci_vendor_usb_offload_skip_urb(struct xhci_hcd *xhci, struct urb *urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) void xhci_vendor_free_transfer_ring(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) struct xhci_virt_device *virt_dev, unsigned int ep_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) bool xhci_vendor_is_usb_offload_enabled(struct xhci_hcd *xhci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) struct xhci_virt_device *virt_dev, unsigned int ep_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) * TODO: As per spec Isochronous IDT transmissions are supported. We bypass
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) * them anyways as we where unable to find a device that matches the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) * constraints.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) static inline bool xhci_urb_suitable_for_idt(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) if (!usb_endpoint_xfer_isoc(&urb->ep->desc) && usb_urb_dir_out(urb) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) usb_endpoint_maxp(&urb->ep->desc) >= TRB_IDT_MAX_SIZE &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) urb->transfer_buffer_length <= TRB_IDT_MAX_SIZE &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) !urb->num_sgs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) static inline char *xhci_slot_state_string(u32 state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) switch (state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) case SLOT_STATE_ENABLED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) return "enabled/disabled";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) case SLOT_STATE_DEFAULT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) return "default";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) case SLOT_STATE_ADDRESSED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) return "addressed";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) case SLOT_STATE_CONFIGURED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) return "configured";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) return "reserved";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) static inline const char *xhci_decode_trb(char *str, size_t size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) u32 field0, u32 field1, u32 field2, u32 field3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) int type = TRB_FIELD_TO_TYPE(field3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) case TRB_LINK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) "LINK %08x%08x intr %d type '%s' flags %c:%c:%c:%c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) field1, field0, GET_INTR_TARGET(field2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) field3 & TRB_IOC ? 'I' : 'i',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) field3 & TRB_CHAIN ? 'C' : 'c',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) field3 & TRB_TC ? 'T' : 't',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) case TRB_TRANSFER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) case TRB_COMPLETION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) case TRB_PORT_STATUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) case TRB_BANDWIDTH_EVENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) case TRB_DOORBELL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) case TRB_HC_EVENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) case TRB_DEV_NOTE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) case TRB_MFINDEX_WRAP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) "TRB %08x%08x status '%s' len %d slot %d ep %d type '%s' flags %c:%c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) field1, field0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) xhci_trb_comp_code_string(GET_COMP_CODE(field2)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) EVENT_TRB_LEN(field2), TRB_TO_SLOT_ID(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) /* Macro decrements 1, maybe it shouldn't?!? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) TRB_TO_EP_INDEX(field3) + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) field3 & EVENT_DATA ? 'E' : 'e',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) case TRB_SETUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) "bRequestType %02x bRequest %02x wValue %02x%02x wIndex %02x%02x wLength %d length %d TD size %d intr %d type '%s' flags %c:%c:%c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) field0 & 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) (field0 & 0xff00) >> 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) (field0 & 0xff000000) >> 24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) (field0 & 0xff0000) >> 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) (field1 & 0xff00) >> 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) field1 & 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) (field1 & 0xff000000) >> 16 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) (field1 & 0xff0000) >> 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) TRB_LEN(field2), GET_TD_SIZE(field2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) GET_INTR_TARGET(field2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) field3 & TRB_IDT ? 'I' : 'i',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) field3 & TRB_IOC ? 'I' : 'i',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) case TRB_DATA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) "Buffer %08x%08x length %d TD size %d intr %d type '%s' flags %c:%c:%c:%c:%c:%c:%c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) field1, field0, TRB_LEN(field2), GET_TD_SIZE(field2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) GET_INTR_TARGET(field2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) field3 & TRB_IDT ? 'I' : 'i',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) field3 & TRB_IOC ? 'I' : 'i',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) field3 & TRB_CHAIN ? 'C' : 'c',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) field3 & TRB_NO_SNOOP ? 'S' : 's',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) field3 & TRB_ISP ? 'I' : 'i',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) field3 & TRB_ENT ? 'E' : 'e',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) case TRB_STATUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) "Buffer %08x%08x length %d TD size %d intr %d type '%s' flags %c:%c:%c:%c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) field1, field0, TRB_LEN(field2), GET_TD_SIZE(field2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) GET_INTR_TARGET(field2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) field3 & TRB_IOC ? 'I' : 'i',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) field3 & TRB_CHAIN ? 'C' : 'c',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) field3 & TRB_ENT ? 'E' : 'e',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) case TRB_NORMAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) case TRB_ISOC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) case TRB_EVENT_DATA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) case TRB_TR_NOOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) "Buffer %08x%08x length %d TD size %d intr %d type '%s' flags %c:%c:%c:%c:%c:%c:%c:%c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) field1, field0, TRB_LEN(field2), GET_TD_SIZE(field2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) GET_INTR_TARGET(field2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) field3 & TRB_BEI ? 'B' : 'b',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) field3 & TRB_IDT ? 'I' : 'i',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) field3 & TRB_IOC ? 'I' : 'i',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) field3 & TRB_CHAIN ? 'C' : 'c',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) field3 & TRB_NO_SNOOP ? 'S' : 's',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) field3 & TRB_ISP ? 'I' : 'i',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) field3 & TRB_ENT ? 'E' : 'e',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) case TRB_CMD_NOOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) case TRB_ENABLE_SLOT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) "%s: flags %c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) case TRB_DISABLE_SLOT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) case TRB_NEG_BANDWIDTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) "%s: slot %d flags %c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) TRB_TO_SLOT_ID(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) case TRB_ADDR_DEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) "%s: ctx %08x%08x slot %d flags %c:%c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) field1, field0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) TRB_TO_SLOT_ID(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) field3 & TRB_BSR ? 'B' : 'b',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) case TRB_CONFIG_EP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) "%s: ctx %08x%08x slot %d flags %c:%c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) field1, field0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) TRB_TO_SLOT_ID(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) field3 & TRB_DC ? 'D' : 'd',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) case TRB_EVAL_CONTEXT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) "%s: ctx %08x%08x slot %d flags %c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) field1, field0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) TRB_TO_SLOT_ID(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) case TRB_RESET_EP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) "%s: ctx %08x%08x slot %d ep %d flags %c:%c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) field1, field0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) TRB_TO_SLOT_ID(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) /* Macro decrements 1, maybe it shouldn't?!? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) TRB_TO_EP_INDEX(field3) + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) field3 & TRB_TSP ? 'T' : 't',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) case TRB_STOP_RING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) sprintf(str,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) "%s: slot %d sp %d ep %d flags %c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) TRB_TO_SLOT_ID(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) TRB_TO_SUSPEND_PORT(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) /* Macro decrements 1, maybe it shouldn't?!? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) TRB_TO_EP_INDEX(field3) + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) case TRB_SET_DEQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) "%s: deq %08x%08x stream %d slot %d ep %d flags %c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) field1, field0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) TRB_TO_STREAM_ID(field2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) TRB_TO_SLOT_ID(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) /* Macro decrements 1, maybe it shouldn't?!? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) TRB_TO_EP_INDEX(field3) + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) case TRB_RESET_DEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) "%s: slot %d flags %c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) TRB_TO_SLOT_ID(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) case TRB_FORCE_EVENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) "%s: event %08x%08x vf intr %d vf id %d flags %c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) field1, field0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) TRB_TO_VF_INTR_TARGET(field2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) TRB_TO_VF_ID(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) case TRB_SET_LT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) "%s: belt %d flags %c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) TRB_TO_BELT(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) case TRB_GET_BW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) "%s: ctx %08x%08x slot %d speed %d flags %c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) field1, field0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) TRB_TO_SLOT_ID(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) TRB_TO_DEV_SPEED(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) case TRB_FORCE_HEADER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) "%s: info %08x%08x%08x pkt type %d roothub port %d flags %c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) field2, field1, field0 & 0xffffffe0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) TRB_TO_PACKET_TYPE(field0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) TRB_TO_ROOTHUB_PORT(field3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) field3 & TRB_CYCLE ? 'C' : 'c');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) snprintf(str, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) "type '%s' -> raw %08x %08x %08x %08x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) xhci_trb_type_string(type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) field0, field1, field2, field3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) return str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) static inline const char *xhci_decode_ctrl_ctx(char *str,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) unsigned long drop, unsigned long add)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) unsigned int bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) str[0] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) if (drop) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) ret = sprintf(str, "Drop:");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) for_each_set_bit(bit, &drop, 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) ret += sprintf(str + ret, " %d%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) bit / 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) bit % 2 ? "in":"out");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) ret += sprintf(str + ret, ", ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) if (add) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) ret += sprintf(str + ret, "Add:%s%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) (add & SLOT_FLAG) ? " slot":"",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) (add & EP0_FLAG) ? " ep0":"");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) add &= ~(SLOT_FLAG | EP0_FLAG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) for_each_set_bit(bit, &add, 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) ret += sprintf(str + ret, " %d%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) bit / 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) bit % 2 ? "in":"out");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) return str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) static inline const char *xhci_decode_slot_context(char *str,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) u32 info, u32 info2, u32 tt_info, u32 state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) u32 speed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) u32 hub;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) u32 mtt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) speed = info & DEV_SPEED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) hub = info & DEV_HUB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) mtt = info & DEV_MTT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) ret = sprintf(str, "RS %05x %s%s%s Ctx Entries %d MEL %d us Port# %d/%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) info & ROUTE_STRING_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) ({ char *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) switch (speed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) case SLOT_SPEED_FS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) s = "full-speed";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) case SLOT_SPEED_LS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) s = "low-speed";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) case SLOT_SPEED_HS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) s = "high-speed";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) case SLOT_SPEED_SS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) s = "super-speed";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) case SLOT_SPEED_SSP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) s = "super-speed plus";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) s = "UNKNOWN speed";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) } s; }),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) mtt ? " multi-TT" : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) hub ? " Hub" : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) (info & LAST_CTX_MASK) >> 27,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) info2 & MAX_EXIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) DEVINFO_TO_ROOT_HUB_PORT(info2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) DEVINFO_TO_MAX_PORTS(info2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) ret += sprintf(str + ret, " [TT Slot %d Port# %d TTT %d Intr %d] Addr %d State %s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) tt_info & TT_SLOT, (tt_info & TT_PORT) >> 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) GET_TT_THINK_TIME(tt_info), GET_INTR_TARGET(tt_info),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) state & DEV_ADDR_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) xhci_slot_state_string(GET_SLOT_STATE(state)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) return str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) static inline const char *xhci_portsc_link_state_string(u32 portsc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) switch (portsc & PORT_PLS_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) case XDEV_U0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) return "U0";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) case XDEV_U1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) return "U1";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) case XDEV_U2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) return "U2";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) case XDEV_U3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) return "U3";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) case XDEV_DISABLED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) return "Disabled";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) case XDEV_RXDETECT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) return "RxDetect";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) case XDEV_INACTIVE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) return "Inactive";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) case XDEV_POLLING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) return "Polling";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) case XDEV_RECOVERY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) return "Recovery";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) case XDEV_HOT_RESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) return "Hot Reset";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) case XDEV_COMP_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) return "Compliance mode";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) case XDEV_TEST_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) return "Test mode";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) case XDEV_RESUME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) return "Resume";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) return "Unknown";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) static inline const char *xhci_decode_portsc(char *str, u32 portsc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) ret = sprintf(str, "%s %s %s Link:%s PortSpeed:%d ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) portsc & PORT_POWER ? "Powered" : "Powered-off",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) portsc & PORT_CONNECT ? "Connected" : "Not-connected",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) portsc & PORT_PE ? "Enabled" : "Disabled",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) xhci_portsc_link_state_string(portsc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) DEV_PORT_SPEED(portsc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) if (portsc & PORT_OC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) ret += sprintf(str + ret, "OverCurrent ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) if (portsc & PORT_RESET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) ret += sprintf(str + ret, "In-Reset ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) ret += sprintf(str + ret, "Change: ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) if (portsc & PORT_CSC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) ret += sprintf(str + ret, "CSC ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) if (portsc & PORT_PEC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) ret += sprintf(str + ret, "PEC ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) if (portsc & PORT_WRC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) ret += sprintf(str + ret, "WRC ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) if (portsc & PORT_OCC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) ret += sprintf(str + ret, "OCC ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) if (portsc & PORT_RC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) ret += sprintf(str + ret, "PRC ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) if (portsc & PORT_PLC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) ret += sprintf(str + ret, "PLC ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) if (portsc & PORT_CEC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) ret += sprintf(str + ret, "CEC ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) if (portsc & PORT_CAS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) ret += sprintf(str + ret, "CAS ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) ret += sprintf(str + ret, "Wake: ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) if (portsc & PORT_WKCONN_E)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) ret += sprintf(str + ret, "WCE ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) if (portsc & PORT_WKDISC_E)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) ret += sprintf(str + ret, "WDE ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) if (portsc & PORT_WKOC_E)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) ret += sprintf(str + ret, "WOE ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) return str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) static inline const char *xhci_decode_usbsts(char *str, u32 usbsts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) ret = sprintf(str, " 0x%08x", usbsts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) if (usbsts == ~(u32)0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) return str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) if (usbsts & STS_HALT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) ret += sprintf(str + ret, " HCHalted");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) if (usbsts & STS_FATAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) ret += sprintf(str + ret, " HSE");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) if (usbsts & STS_EINT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) ret += sprintf(str + ret, " EINT");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) if (usbsts & STS_PORT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) ret += sprintf(str + ret, " PCD");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) if (usbsts & STS_SAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) ret += sprintf(str + ret, " SSS");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) if (usbsts & STS_RESTORE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) ret += sprintf(str + ret, " RSS");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) if (usbsts & STS_SRE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) ret += sprintf(str + ret, " SRE");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) if (usbsts & STS_CNR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) ret += sprintf(str + ret, " CNR");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) if (usbsts & STS_HCE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) ret += sprintf(str + ret, " HCE");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) return str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) static inline const char *xhci_decode_doorbell(char *str, u32 slot, u32 doorbell)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) u8 ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) u16 stream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) ep = (doorbell & 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) stream = doorbell >> 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) if (slot == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) sprintf(str, "Command Ring %d", doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) return str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) ret = sprintf(str, "Slot %d ", slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) if (ep > 0 && ep < 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) ret = sprintf(str + ret, "ep%d%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) ep / 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) ep % 2 ? "in" : "out");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) else if (ep == 0 || ep < 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) ret = sprintf(str + ret, "Reserved %d", ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) ret = sprintf(str + ret, "Vendor Defined %d", ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) if (stream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) ret = sprintf(str + ret, " Stream %d", stream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) return str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) static inline const char *xhci_ep_state_string(u8 state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) switch (state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) case EP_STATE_DISABLED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) return "disabled";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) case EP_STATE_RUNNING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) return "running";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) case EP_STATE_HALTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) return "halted";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) case EP_STATE_STOPPED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) return "stopped";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) case EP_STATE_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) return "error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) return "INVALID";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) static inline const char *xhci_ep_type_string(u8 type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) case ISOC_OUT_EP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) return "Isoc OUT";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) case BULK_OUT_EP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) return "Bulk OUT";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) case INT_OUT_EP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) return "Int OUT";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) case CTRL_EP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) return "Ctrl";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) case ISOC_IN_EP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) return "Isoc IN";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) case BULK_IN_EP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) return "Bulk IN";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) case INT_IN_EP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) return "Int IN";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) return "INVALID";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) static inline const char *xhci_decode_ep_context(char *str, u32 info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) u32 info2, u64 deq, u32 tx_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) u32 esit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) u16 maxp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) u16 avg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) u8 max_pstr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) u8 ep_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) u8 interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) u8 ep_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) u8 burst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) u8 cerr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) u8 mult;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) bool lsa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) bool hid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) esit = CTX_TO_MAX_ESIT_PAYLOAD_HI(info) << 16 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) CTX_TO_MAX_ESIT_PAYLOAD(tx_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) ep_state = info & EP_STATE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) max_pstr = CTX_TO_EP_MAXPSTREAMS(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) interval = CTX_TO_EP_INTERVAL(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) mult = CTX_TO_EP_MULT(info) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) lsa = !!(info & EP_HAS_LSA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) cerr = (info2 & (3 << 1)) >> 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) ep_type = CTX_TO_EP_TYPE(info2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) hid = !!(info2 & (1 << 7));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) burst = CTX_TO_MAX_BURST(info2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) maxp = MAX_PACKET_DECODED(info2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) avg = EP_AVG_TRB_LENGTH(tx_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) ret = sprintf(str, "State %s mult %d max P. Streams %d %s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) xhci_ep_state_string(ep_state), mult,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) max_pstr, lsa ? "LSA " : "");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) ret += sprintf(str + ret, "interval %d us max ESIT payload %d CErr %d ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) (1 << interval) * 125, esit, cerr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) ret += sprintf(str + ret, "Type %s %sburst %d maxp %d deq %016llx ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) xhci_ep_type_string(ep_type), hid ? "HID" : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) burst, maxp, deq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) ret += sprintf(str + ret, "avg trb len %d", avg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) return str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) #endif /* __LINUX_XHCI_HCD_H */