aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelipe Balbi <felipe.balbi@linux.intel.com>2016-05-23 04:10:08 -0400
committerFelipe Balbi <felipe.balbi@linux.intel.com>2016-06-20 05:32:39 -0400
commitf75cacc468edc4826305909d6102d60fba55199f (patch)
treeb4c985613ed1383a7a66b74c5890a63a0dc3f7cd
parent7ab373aadbd0463c0f020d368947b05e67a20bd5 (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.h110
-rw-r--r--drivers/usb/dwc3/ep0.c7
-rw-r--r--drivers/usb/dwc3/trace.h3
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 */
131static inline const char *dwc3_gadget_event_string(u8 event) 131static inline const char *
132dwc3_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 */
163static inline const char *dwc3_ep_event_string(u8 event) 186static inline const char *
187dwc3_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
273static 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
217void dwc3_trace(void (*trace)(struct va_format *), const char *fmt, ...); 283void 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,
1109void dwc3_ep0_interrupt(struct dwc3 *dwc, 1109void 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
77DEFINE_EVENT(dwc3_log_event, dwc3_event, 78DEFINE_EVENT(dwc3_log_event, dwc3_event,