diff options
author | Felipe Balbi <felipe.balbi@linux.intel.com> | 2016-05-23 04:10:08 -0400 |
---|---|---|
committer | Felipe Balbi <felipe.balbi@linux.intel.com> | 2016-06-20 05:32:39 -0400 |
commit | f75cacc468edc4826305909d6102d60fba55199f (patch) | |
tree | b4c985613ed1383a7a66b74c5890a63a0dc3f7cd | |
parent | 7ab373aadbd0463c0f020d368947b05e67a20bd5 (diff) |
usb: dwc3: trace: fully decode IRQ events
This will make it more human-friendly to read trace
output from dwc3.
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
-rw-r--r-- | drivers/usb/dwc3/debug.h | 110 | ||||
-rw-r--r-- | drivers/usb/dwc3/ep0.c | 7 | ||||
-rw-r--r-- | drivers/usb/dwc3/trace.h | 3 |
3 files changed, 92 insertions, 28 deletions
diff --git a/drivers/usb/dwc3/debug.h b/drivers/usb/dwc3/debug.h index 71e318025964..e3e0b4111c53 100644 --- a/drivers/usb/dwc3/debug.h +++ b/drivers/usb/dwc3/debug.h | |||
@@ -128,56 +128,112 @@ dwc3_gadget_link_string(enum dwc3_link_state link_state) | |||
128 | * dwc3_gadget_event_string - returns event name | 128 | * dwc3_gadget_event_string - returns event name |
129 | * @event: the event code | 129 | * @event: the event code |
130 | */ | 130 | */ |
131 | static inline const char *dwc3_gadget_event_string(u8 event) | 131 | static inline const char * |
132 | dwc3_gadget_event_string(const struct dwc3_event_devt *event) | ||
132 | { | 133 | { |
133 | switch (event) { | 134 | static char str[256]; |
135 | enum dwc3_link_state state = event->event_info & DWC3_LINK_STATE_MASK; | ||
136 | |||
137 | switch (event->type) { | ||
134 | case DWC3_DEVICE_EVENT_DISCONNECT: | 138 | case DWC3_DEVICE_EVENT_DISCONNECT: |
135 | return "Disconnect"; | 139 | sprintf(str, "Disconnect: [%s]", |
140 | dwc3_gadget_link_string(state)); | ||
141 | break; | ||
136 | case DWC3_DEVICE_EVENT_RESET: | 142 | case DWC3_DEVICE_EVENT_RESET: |
137 | return "Reset"; | 143 | sprintf(str, "Reset [%s]", dwc3_gadget_link_string(state)); |
144 | break; | ||
138 | case DWC3_DEVICE_EVENT_CONNECT_DONE: | 145 | case DWC3_DEVICE_EVENT_CONNECT_DONE: |
139 | return "Connection Done"; | 146 | sprintf(str, "Connection Done [%s]", |
147 | dwc3_gadget_link_string(state)); | ||
148 | break; | ||
140 | case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE: | 149 | case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE: |
141 | return "Link Status Change"; | 150 | sprintf(str, "Link Change [%s]", |
151 | dwc3_gadget_link_string(state)); | ||
152 | break; | ||
142 | case DWC3_DEVICE_EVENT_WAKEUP: | 153 | case DWC3_DEVICE_EVENT_WAKEUP: |
143 | return "WakeUp"; | 154 | sprintf(str, "WakeUp [%s]", dwc3_gadget_link_string(state)); |
155 | break; | ||
144 | case DWC3_DEVICE_EVENT_EOPF: | 156 | case DWC3_DEVICE_EVENT_EOPF: |
145 | return "End-Of-Frame"; | 157 | sprintf(str, "End-Of-Frame [%s]", |
158 | dwc3_gadget_link_string(state)); | ||
159 | break; | ||
146 | case DWC3_DEVICE_EVENT_SOF: | 160 | case DWC3_DEVICE_EVENT_SOF: |
147 | return "Start-Of-Frame"; | 161 | sprintf(str, "Start-Of-Frame [%s]", |
162 | dwc3_gadget_link_string(state)); | ||
163 | break; | ||
148 | case DWC3_DEVICE_EVENT_ERRATIC_ERROR: | 164 | case DWC3_DEVICE_EVENT_ERRATIC_ERROR: |
149 | return "Erratic Error"; | 165 | sprintf(str, "Erratic Error [%s]", |
166 | dwc3_gadget_link_string(state)); | ||
167 | break; | ||
150 | case DWC3_DEVICE_EVENT_CMD_CMPL: | 168 | case DWC3_DEVICE_EVENT_CMD_CMPL: |
151 | return "Command Complete"; | 169 | sprintf(str, "Command Complete [%s]", |
170 | dwc3_gadget_link_string(state)); | ||
171 | break; | ||
152 | case DWC3_DEVICE_EVENT_OVERFLOW: | 172 | case DWC3_DEVICE_EVENT_OVERFLOW: |
153 | return "Overflow"; | 173 | sprintf(str, "Overflow [%s]", dwc3_gadget_link_string(state)); |
174 | break; | ||
175 | default: | ||
176 | sprintf(str, "UNKNOWN"); | ||
154 | } | 177 | } |
155 | 178 | ||
156 | return "UNKNOWN"; | 179 | return str; |
157 | } | 180 | } |
158 | 181 | ||
159 | /** | 182 | /** |
160 | * dwc3_ep_event_string - returns event name | 183 | * dwc3_ep_event_string - returns event name |
161 | * @event: then event code | 184 | * @event: then event code |
162 | */ | 185 | */ |
163 | static inline const char *dwc3_ep_event_string(u8 event) | 186 | static inline const char * |
187 | dwc3_ep_event_string(const struct dwc3_event_depevt *event) | ||
164 | { | 188 | { |
165 | switch (event) { | 189 | u8 epnum = event->endpoint_number; |
190 | static char str[256]; | ||
191 | int status; | ||
192 | int ret; | ||
193 | |||
194 | ret = sprintf(str, "ep%d%s: ", epnum >> 1, | ||
195 | (epnum & 1) ? "in" : "in"); | ||
196 | if (ret < 0) | ||
197 | return "UNKNOWN"; | ||
198 | |||
199 | switch (event->endpoint_event) { | ||
166 | case DWC3_DEPEVT_XFERCOMPLETE: | 200 | case DWC3_DEPEVT_XFERCOMPLETE: |
167 | return "Transfer Complete"; | 201 | strcat(str, "Transfer Complete"); |
202 | break; | ||
168 | case DWC3_DEPEVT_XFERINPROGRESS: | 203 | case DWC3_DEPEVT_XFERINPROGRESS: |
169 | return "Transfer In-Progress"; | 204 | strcat(str, "Transfer In-Progress"); |
205 | break; | ||
170 | case DWC3_DEPEVT_XFERNOTREADY: | 206 | case DWC3_DEPEVT_XFERNOTREADY: |
171 | return "Transfer Not Ready"; | 207 | strcat(str, "Transfer Not Ready"); |
208 | status = event->status & DEPEVT_STATUS_TRANSFER_ACTIVE; | ||
209 | strcat(str, status ? " (Active)" : " (Not Active)"); | ||
210 | break; | ||
172 | case DWC3_DEPEVT_RXTXFIFOEVT: | 211 | case DWC3_DEPEVT_RXTXFIFOEVT: |
173 | return "FIFO"; | 212 | strcat(str, "FIFO"); |
213 | break; | ||
174 | case DWC3_DEPEVT_STREAMEVT: | 214 | case DWC3_DEPEVT_STREAMEVT: |
175 | return "Stream"; | 215 | status = event->status; |
216 | |||
217 | switch (status) { | ||
218 | case DEPEVT_STREAMEVT_FOUND: | ||
219 | sprintf(str + ret, " Stream %d Found", | ||
220 | event->parameters); | ||
221 | break; | ||
222 | case DEPEVT_STREAMEVT_NOTFOUND: | ||
223 | default: | ||
224 | strcat(str, " Stream Not Found"); | ||
225 | break; | ||
226 | } | ||
227 | |||
228 | break; | ||
176 | case DWC3_DEPEVT_EPCMDCMPLT: | 229 | case DWC3_DEPEVT_EPCMDCMPLT: |
177 | return "Endpoint Command Complete"; | 230 | strcat(str, "Endpoint Command Complete"); |
231 | break; | ||
232 | default: | ||
233 | sprintf(str, "UNKNOWN"); | ||
178 | } | 234 | } |
179 | 235 | ||
180 | return "UNKNOWN"; | 236 | return str; |
181 | } | 237 | } |
182 | 238 | ||
183 | /** | 239 | /** |
@@ -214,6 +270,16 @@ static inline const char *dwc3_gadget_event_type_string(u8 event) | |||
214 | } | 270 | } |
215 | } | 271 | } |
216 | 272 | ||
273 | static inline const char *dwc3_decode_event(u32 event) | ||
274 | { | ||
275 | const union dwc3_event evt = (union dwc3_event) event; | ||
276 | |||
277 | if (evt.type.is_devspec) | ||
278 | return dwc3_gadget_event_string(&evt.devt); | ||
279 | else | ||
280 | return dwc3_ep_event_string(&evt.depevt); | ||
281 | } | ||
282 | |||
217 | void dwc3_trace(void (*trace)(struct va_format *), const char *fmt, ...); | 283 | void dwc3_trace(void (*trace)(struct va_format *), const char *fmt, ...); |
218 | 284 | ||
219 | #ifdef CONFIG_DEBUG_FS | 285 | #ifdef CONFIG_DEBUG_FS |
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 3103a8f4b7e5..54628c37b21f 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c | |||
@@ -1109,11 +1109,8 @@ static void dwc3_ep0_xfernotready(struct dwc3 *dwc, | |||
1109 | void dwc3_ep0_interrupt(struct dwc3 *dwc, | 1109 | void dwc3_ep0_interrupt(struct dwc3 *dwc, |
1110 | const struct dwc3_event_depevt *event) | 1110 | const struct dwc3_event_depevt *event) |
1111 | { | 1111 | { |
1112 | u8 epnum = event->endpoint_number; | 1112 | dwc3_trace(trace_dwc3_ep0, "%s: state '%s'", |
1113 | 1113 | dwc3_ep_event_string(event), | |
1114 | dwc3_trace(trace_dwc3_ep0, "%s while ep%d%s in state '%s'", | ||
1115 | dwc3_ep_event_string(event->endpoint_event), | ||
1116 | epnum >> 1, (epnum & 1) ? "in" : "out", | ||
1117 | dwc3_ep0_state_string(dwc->ep0state)); | 1114 | dwc3_ep0_state_string(dwc->ep0state)); |
1118 | 1115 | ||
1119 | switch (event->endpoint_event) { | 1116 | switch (event->endpoint_event) { |
diff --git a/drivers/usb/dwc3/trace.h b/drivers/usb/dwc3/trace.h index 8cbe1fc9c8d4..2389dd864ffb 100644 --- a/drivers/usb/dwc3/trace.h +++ b/drivers/usb/dwc3/trace.h | |||
@@ -71,7 +71,8 @@ DECLARE_EVENT_CLASS(dwc3_log_event, | |||
71 | TP_fast_assign( | 71 | TP_fast_assign( |
72 | __entry->event = event; | 72 | __entry->event = event; |
73 | ), | 73 | ), |
74 | TP_printk("event %08x", __entry->event) | 74 | TP_printk("event (%08x): %s", __entry->event, |
75 | dwc3_decode_event(__entry->event)) | ||
75 | ); | 76 | ); |
76 | 77 | ||
77 | DEFINE_EVENT(dwc3_log_event, dwc3_event, | 78 | DEFINE_EVENT(dwc3_log_event, dwc3_event, |