^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) * debug.h - DesignWare USB3 DRD Controller Debug Header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2010-2011 Texas Instruments Incorporated - https://www.ti.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Authors: Felipe Balbi <balbi@ti.com>,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Sebastian Andrzej Siewior <bigeasy@linutronix.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #ifndef __DWC3_DEBUG_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define __DWC3_DEBUG_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include "core.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * dwc3_gadget_ep_cmd_string - returns endpoint command string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * @cmd: command code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) static inline const char *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) dwc3_gadget_ep_cmd_string(u8 cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) case DWC3_DEPCMD_DEPSTARTCFG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) return "Start New Configuration";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) case DWC3_DEPCMD_ENDTRANSFER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) return "End Transfer";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) case DWC3_DEPCMD_UPDATETRANSFER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) return "Update Transfer";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) case DWC3_DEPCMD_STARTTRANSFER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) return "Start Transfer";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) case DWC3_DEPCMD_CLEARSTALL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) return "Clear Stall";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) case DWC3_DEPCMD_SETSTALL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) return "Set Stall";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) case DWC3_DEPCMD_GETEPSTATE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) return "Get Endpoint State";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) case DWC3_DEPCMD_SETTRANSFRESOURCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) return "Set Endpoint Transfer Resource";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) case DWC3_DEPCMD_SETEPCONFIG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) return "Set Endpoint Configuration";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) return "UNKNOWN command";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * dwc3_gadget_generic_cmd_string - returns generic command string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * @cmd: command code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) static inline const char *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) dwc3_gadget_generic_cmd_string(u8 cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) case DWC3_DGCMD_SET_LMP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) return "Set LMP";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) case DWC3_DGCMD_SET_PERIODIC_PAR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) return "Set Periodic Parameters";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) case DWC3_DGCMD_XMIT_FUNCTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) return "Transmit Function Wake Device Notification";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) case DWC3_DGCMD_SET_SCRATCHPAD_ADDR_LO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) return "Set Scratchpad Buffer Array Address Lo";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) case DWC3_DGCMD_SET_SCRATCHPAD_ADDR_HI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) return "Set Scratchpad Buffer Array Address Hi";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) case DWC3_DGCMD_SELECTED_FIFO_FLUSH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) return "Selected FIFO Flush";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) case DWC3_DGCMD_ALL_FIFO_FLUSH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) return "All FIFO Flush";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) case DWC3_DGCMD_SET_ENDPOINT_NRDY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) return "Set Endpoint NRDY";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) case DWC3_DGCMD_SET_ENDPOINT_PRIME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) return "Set Endpoint Prime";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) case DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) return "Run SoC Bus Loopback Test";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) return "UNKNOWN";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) * dwc3_gadget_link_string - returns link name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) * @link_state: link state code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) static inline const char *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) dwc3_gadget_link_string(enum dwc3_link_state link_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) switch (link_state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) case DWC3_LINK_STATE_U0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) return "U0";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) case DWC3_LINK_STATE_U1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) return "U1";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) case DWC3_LINK_STATE_U2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) return "U2";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) case DWC3_LINK_STATE_U3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) return "U3";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) case DWC3_LINK_STATE_SS_DIS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) return "SS.Disabled";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) case DWC3_LINK_STATE_RX_DET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) return "RX.Detect";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) case DWC3_LINK_STATE_SS_INACT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) return "SS.Inactive";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) case DWC3_LINK_STATE_POLL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) return "Polling";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) case DWC3_LINK_STATE_RECOV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) return "Recovery";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) case DWC3_LINK_STATE_HRESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) return "Hot Reset";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) case DWC3_LINK_STATE_CMPLY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) return "Compliance";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) case DWC3_LINK_STATE_LPBK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) return "Loopback";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) case DWC3_LINK_STATE_RESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) return "Reset";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) case DWC3_LINK_STATE_RESUME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) return "Resume";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) return "UNKNOWN link state";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) * dwc3_gadget_hs_link_string - returns highspeed and below link name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) * @link_state: link state code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) static inline const char *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) dwc3_gadget_hs_link_string(enum dwc3_link_state link_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) switch (link_state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) case DWC3_LINK_STATE_U0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) return "On";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) case DWC3_LINK_STATE_U2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) return "Sleep";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) case DWC3_LINK_STATE_U3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) return "Suspend";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) case DWC3_LINK_STATE_SS_DIS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) return "Disconnected";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) case DWC3_LINK_STATE_RX_DET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) return "Early Suspend";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) case DWC3_LINK_STATE_RECOV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) return "Recovery";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) case DWC3_LINK_STATE_RESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) return "Reset";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) case DWC3_LINK_STATE_RESUME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) return "Resume";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) return "UNKNOWN link state";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * dwc3_trb_type_string - returns TRB type as a string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) * @type: the type of the TRB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) static inline const char *dwc3_trb_type_string(unsigned int type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) case DWC3_TRBCTL_NORMAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) return "normal";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) case DWC3_TRBCTL_CONTROL_SETUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) return "setup";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) case DWC3_TRBCTL_CONTROL_STATUS2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) return "status2";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) case DWC3_TRBCTL_CONTROL_STATUS3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) return "status3";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) case DWC3_TRBCTL_CONTROL_DATA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) return "data";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) case DWC3_TRBCTL_ISOCHRONOUS_FIRST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) return "isoc-first";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) case DWC3_TRBCTL_ISOCHRONOUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) return "isoc";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) case DWC3_TRBCTL_LINK_TRB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) return "link";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) return "UNKNOWN";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) static inline const char *dwc3_ep0_state_string(enum dwc3_ep0_state state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) switch (state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) case EP0_UNCONNECTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) return "Unconnected";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) case EP0_SETUP_PHASE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) return "Setup Phase";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) case EP0_DATA_PHASE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) return "Data Phase";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) case EP0_STATUS_PHASE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) return "Status Phase";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) return "UNKNOWN";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) * dwc3_gadget_event_string - returns event name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) * @event: the event code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) static inline const char *dwc3_gadget_event_string(char *str, size_t size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) const struct dwc3_event_devt *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) enum dwc3_link_state state = event->event_info & DWC3_LINK_STATE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) switch (event->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) case DWC3_DEVICE_EVENT_DISCONNECT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) snprintf(str, size, "Disconnect: [%s]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) dwc3_gadget_link_string(state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) case DWC3_DEVICE_EVENT_RESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) snprintf(str, size, "Reset [%s]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) dwc3_gadget_link_string(state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) case DWC3_DEVICE_EVENT_CONNECT_DONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) snprintf(str, size, "Connection Done [%s]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) dwc3_gadget_link_string(state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) snprintf(str, size, "Link Change [%s]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) dwc3_gadget_link_string(state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) case DWC3_DEVICE_EVENT_WAKEUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) snprintf(str, size, "WakeUp [%s]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) dwc3_gadget_link_string(state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) case DWC3_DEVICE_EVENT_SUSPEND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) snprintf(str, size, "Suspend [%s]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) dwc3_gadget_link_string(state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) case DWC3_DEVICE_EVENT_SOF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) snprintf(str, size, "Start-Of-Frame [%s]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) dwc3_gadget_link_string(state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) snprintf(str, size, "Erratic Error [%s]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) dwc3_gadget_link_string(state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) case DWC3_DEVICE_EVENT_CMD_CMPL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) snprintf(str, size, "Command Complete [%s]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) dwc3_gadget_link_string(state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) case DWC3_DEVICE_EVENT_OVERFLOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) snprintf(str, size, "Overflow [%s]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) dwc3_gadget_link_string(state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) snprintf(str, size, "UNKNOWN");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) return str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) * dwc3_ep_event_string - returns event name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) * @event: then event code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) static inline const char *dwc3_ep_event_string(char *str, size_t size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) const struct dwc3_event_depevt *event, u32 ep0state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) u8 epnum = event->endpoint_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) size_t len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) len = scnprintf(str, size, "ep%d%s: ", epnum >> 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) (epnum & 1) ? "in" : "out");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) status = event->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) switch (event->endpoint_event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) case DWC3_DEPEVT_XFERCOMPLETE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) len += scnprintf(str + len, size - len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) "Transfer Complete (%c%c%c)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) status & DEPEVT_STATUS_SHORT ? 'S' : 's',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) status & DEPEVT_STATUS_IOC ? 'I' : 'i',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) status & DEPEVT_STATUS_LST ? 'L' : 'l');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) if (epnum <= 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) scnprintf(str + len, size - len, " [%s]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) dwc3_ep0_state_string(ep0state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) case DWC3_DEPEVT_XFERINPROGRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) scnprintf(str + len, size - len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) "Transfer In Progress [%d] (%c%c%c)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) event->parameters,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) status & DEPEVT_STATUS_SHORT ? 'S' : 's',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) status & DEPEVT_STATUS_IOC ? 'I' : 'i',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) status & DEPEVT_STATUS_LST ? 'M' : 'm');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) case DWC3_DEPEVT_XFERNOTREADY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) len += scnprintf(str + len, size - len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) "Transfer Not Ready [%d]%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) event->parameters,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) status & DEPEVT_STATUS_TRANSFER_ACTIVE ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) " (Active)" : " (Not Active)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) /* Control Endpoints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) if (epnum <= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) int phase = DEPEVT_STATUS_CONTROL_PHASE(event->status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) switch (phase) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) case DEPEVT_STATUS_CONTROL_DATA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) scnprintf(str + len, size - len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) " [Data Phase]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) case DEPEVT_STATUS_CONTROL_STATUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) scnprintf(str + len, size - len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) " [Status Phase]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) case DWC3_DEPEVT_RXTXFIFOEVT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) scnprintf(str + len, size - len, "FIFO");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) case DWC3_DEPEVT_STREAMEVT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) status = event->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) switch (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) case DEPEVT_STREAMEVT_FOUND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) scnprintf(str + len, size - len, " Stream %d Found",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) event->parameters);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) case DEPEVT_STREAMEVT_NOTFOUND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) scnprintf(str + len, size - len, " Stream Not Found");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) case DWC3_DEPEVT_EPCMDCMPLT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) scnprintf(str + len, size - len, "Endpoint Command Complete");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) scnprintf(str + len, size - len, "UNKNOWN");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) return str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) * dwc3_gadget_event_type_string - return event name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) * @event: the event code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) static inline const char *dwc3_gadget_event_type_string(u8 event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) case DWC3_DEVICE_EVENT_DISCONNECT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) return "Disconnect";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) case DWC3_DEVICE_EVENT_RESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) return "Reset";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) case DWC3_DEVICE_EVENT_CONNECT_DONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) return "Connect Done";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) return "Link Status Change";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) case DWC3_DEVICE_EVENT_WAKEUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) return "Wake-Up";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) case DWC3_DEVICE_EVENT_HIBER_REQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) return "Hibernation";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) case DWC3_DEVICE_EVENT_SUSPEND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) return "Suspend";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) case DWC3_DEVICE_EVENT_SOF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) return "Start of Frame";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) return "Erratic Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) case DWC3_DEVICE_EVENT_CMD_CMPL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) return "Command Complete";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) case DWC3_DEVICE_EVENT_OVERFLOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) return "Overflow";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) return "UNKNOWN";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) static inline const char *dwc3_decode_event(char *str, size_t size, u32 event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) u32 ep0state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) union dwc3_event evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) memcpy(&evt, &event, sizeof(event));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) if (evt.type.is_devspec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) return dwc3_gadget_event_string(str, size, &evt.devt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) return dwc3_ep_event_string(str, size, &evt.depevt, ep0state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) static inline const char *dwc3_ep_cmd_status_string(int status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) switch (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) case -ETIMEDOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) return "Timed Out";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) return "Successful";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) case DEPEVT_TRANSFER_NO_RESOURCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) return "No Resource";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) case DEPEVT_TRANSFER_BUS_EXPIRY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) return "Bus Expiry";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) return "UNKNOWN";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) static inline const char *dwc3_gadget_generic_cmd_status_string(int status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) switch (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) case -ETIMEDOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) return "Timed Out";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) return "Successful";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) return "Error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) return "UNKNOWN";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) #ifdef CONFIG_DEBUG_FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) extern void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) extern void dwc3_debugfs_init(struct dwc3 *d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) extern void dwc3_debugfs_exit(struct dwc3 *d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) static inline void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) static inline void dwc3_debugfs_init(struct dwc3 *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) static inline void dwc3_debugfs_exit(struct dwc3 *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) #endif /* __DWC3_DEBUG_H */