diff options
author | Bin Liu <b-liu@ti.com> | 2016-06-30 13:12:27 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-07-16 19:23:57 -0400 |
commit | fc78003e5345a3c0b8461dbb75190693407ae2ca (patch) | |
tree | b40bdcda14ea8d96580d7590a17f9848c256627b | |
parent | 19ca682e03fbf0349e6c6ef76c786136176d3ca6 (diff) |
usb: musb: gadget: add usb-request tracepoints
Add usb_request tracepoints for gadget mode.
Signed-off-by: Bin Liu <b-liu@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/usb/musb/musb_gadget.c | 35 | ||||
-rw-r--r-- | drivers/usb/musb/musb_trace.h | 76 |
2 files changed, 90 insertions, 21 deletions
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index 9616059b6a3d..6d1e975e9605 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include <linux/slab.h> | 44 | #include <linux/slab.h> |
45 | 45 | ||
46 | #include "musb_core.h" | 46 | #include "musb_core.h" |
47 | #include "musb_trace.h" | ||
47 | 48 | ||
48 | 49 | ||
49 | /* ----------------------------------------------------------------------- */ | 50 | /* ----------------------------------------------------------------------- */ |
@@ -167,15 +168,7 @@ __acquires(ep->musb->lock) | |||
167 | if (!dma_mapping_error(&musb->g.dev, request->dma)) | 168 | if (!dma_mapping_error(&musb->g.dev, request->dma)) |
168 | unmap_dma_buffer(req, musb); | 169 | unmap_dma_buffer(req, musb); |
169 | 170 | ||
170 | if (request->status == 0) | 171 | trace_musb_req_gb(req); |
171 | musb_dbg(musb, "%s done request %p, %d/", | ||
172 | ep->end_point.name, request, | ||
173 | req->request.actual, req->request.length); | ||
174 | else | ||
175 | musb_dbg(musb, "%s request %p, %d/%d fault %d", | ||
176 | ep->end_point.name, request, | ||
177 | req->request.actual, req->request.length, | ||
178 | request->status); | ||
179 | usb_gadget_giveback_request(&req->ep->end_point, &req->request); | 172 | usb_gadget_giveback_request(&req->ep->end_point, &req->request); |
180 | spin_lock(&musb->lock); | 173 | spin_lock(&musb->lock); |
181 | ep->busy = busy; | 174 | ep->busy = busy; |
@@ -449,6 +442,7 @@ void musb_g_tx(struct musb *musb, u8 epnum) | |||
449 | req = next_request(musb_ep); | 442 | req = next_request(musb_ep); |
450 | request = &req->request; | 443 | request = &req->request; |
451 | 444 | ||
445 | trace_musb_req_tx(req); | ||
452 | csr = musb_readw(epio, MUSB_TXCSR); | 446 | csr = musb_readw(epio, MUSB_TXCSR); |
453 | musb_dbg(musb, "<== %s, txcsr %04x", musb_ep->end_point.name, csr); | 447 | musb_dbg(musb, "<== %s, txcsr %04x", musb_ep->end_point.name, csr); |
454 | 448 | ||
@@ -847,6 +841,7 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
847 | if (!req) | 841 | if (!req) |
848 | return; | 842 | return; |
849 | 843 | ||
844 | trace_musb_req_rx(req); | ||
850 | request = &req->request; | 845 | request = &req->request; |
851 | 846 | ||
852 | csr = musb_readw(epio, MUSB_RXCSR); | 847 | csr = musb_readw(epio, MUSB_RXCSR); |
@@ -892,11 +887,6 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
892 | 887 | ||
893 | request->actual += musb_ep->dma->actual_len; | 888 | request->actual += musb_ep->dma->actual_len; |
894 | 889 | ||
895 | musb_dbg(musb, "RXCSR%d %04x, dma off, %04x, len %zu, req %p", | ||
896 | epnum, csr, | ||
897 | musb_readw(epio, MUSB_RXCSR), | ||
898 | musb_ep->dma->actual_len, request); | ||
899 | |||
900 | #if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_TUSB_OMAP_DMA) || \ | 890 | #if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_TUSB_OMAP_DMA) || \ |
901 | defined(CONFIG_USB_UX500_DMA) | 891 | defined(CONFIG_USB_UX500_DMA) |
902 | /* Autoclear doesn't clear RxPktRdy for short packets */ | 892 | /* Autoclear doesn't clear RxPktRdy for short packets */ |
@@ -1194,6 +1184,7 @@ struct usb_request *musb_alloc_request(struct usb_ep *ep, gfp_t gfp_flags) | |||
1194 | request->epnum = musb_ep->current_epnum; | 1184 | request->epnum = musb_ep->current_epnum; |
1195 | request->ep = musb_ep; | 1185 | request->ep = musb_ep; |
1196 | 1186 | ||
1187 | trace_musb_req_alloc(request); | ||
1197 | return &request->request; | 1188 | return &request->request; |
1198 | } | 1189 | } |
1199 | 1190 | ||
@@ -1203,7 +1194,10 @@ struct usb_request *musb_alloc_request(struct usb_ep *ep, gfp_t gfp_flags) | |||
1203 | */ | 1194 | */ |
1204 | void musb_free_request(struct usb_ep *ep, struct usb_request *req) | 1195 | void musb_free_request(struct usb_ep *ep, struct usb_request *req) |
1205 | { | 1196 | { |
1206 | kfree(to_musb_request(req)); | 1197 | struct musb_request *request = to_musb_request(req); |
1198 | |||
1199 | trace_musb_req_free(request); | ||
1200 | kfree(request); | ||
1207 | } | 1201 | } |
1208 | 1202 | ||
1209 | static LIST_HEAD(buffers); | 1203 | static LIST_HEAD(buffers); |
@@ -1220,10 +1214,7 @@ struct free_record { | |||
1220 | */ | 1214 | */ |
1221 | void musb_ep_restart(struct musb *musb, struct musb_request *req) | 1215 | void musb_ep_restart(struct musb *musb, struct musb_request *req) |
1222 | { | 1216 | { |
1223 | musb_dbg(musb, "<== %s request %p len %u on hw_ep%d", | 1217 | trace_musb_req_start(req); |
1224 | req->tx ? "TX/IN" : "RX/OUT", | ||
1225 | &req->request, req->request.length, req->epnum); | ||
1226 | |||
1227 | musb_ep_select(musb->mregs, req->epnum); | 1218 | musb_ep_select(musb->mregs, req->epnum); |
1228 | if (req->tx) | 1219 | if (req->tx) |
1229 | txstate(musb, req); | 1220 | txstate(musb, req); |
@@ -1254,7 +1245,7 @@ static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req, | |||
1254 | if (request->ep != musb_ep) | 1245 | if (request->ep != musb_ep) |
1255 | return -EINVAL; | 1246 | return -EINVAL; |
1256 | 1247 | ||
1257 | musb_dbg(musb, "<== to %s request=%p", ep->name, req); | 1248 | trace_musb_req_enq(request); |
1258 | 1249 | ||
1259 | /* request is mine now... */ | 1250 | /* request is mine now... */ |
1260 | request->request.actual = 0; | 1251 | request->request.actual = 0; |
@@ -1296,9 +1287,11 @@ static int musb_gadget_dequeue(struct usb_ep *ep, struct usb_request *request) | |||
1296 | int status = 0; | 1287 | int status = 0; |
1297 | struct musb *musb = musb_ep->musb; | 1288 | struct musb *musb = musb_ep->musb; |
1298 | 1289 | ||
1299 | if (!ep || !request || to_musb_request(request)->ep != musb_ep) | 1290 | if (!ep || !request || req->ep != musb_ep) |
1300 | return -EINVAL; | 1291 | return -EINVAL; |
1301 | 1292 | ||
1293 | trace_musb_req_deq(req); | ||
1294 | |||
1302 | spin_lock_irqsave(&musb->lock, flags); | 1295 | spin_lock_irqsave(&musb->lock, flags); |
1303 | 1296 | ||
1304 | list_for_each_entry(r, &musb_ep->req_list, list) { | 1297 | list_for_each_entry(r, &musb_ep->req_list, list) { |
diff --git a/drivers/usb/musb/musb_trace.h b/drivers/usb/musb/musb_trace.h index 39258f6fdde8..27d1a9b3efc8 100644 --- a/drivers/usb/musb/musb_trace.h +++ b/drivers/usb/musb/musb_trace.h | |||
@@ -212,6 +212,82 @@ DEFINE_EVENT(musb_urb, musb_urb_deq, | |||
212 | TP_ARGS(musb, urb) | 212 | TP_ARGS(musb, urb) |
213 | ); | 213 | ); |
214 | 214 | ||
215 | DECLARE_EVENT_CLASS(musb_req, | ||
216 | TP_PROTO(struct musb_request *req), | ||
217 | TP_ARGS(req), | ||
218 | TP_STRUCT__entry( | ||
219 | __field(struct usb_request *, req) | ||
220 | __field(u8, is_tx) | ||
221 | __field(u8, epnum) | ||
222 | __field(int, status) | ||
223 | __field(unsigned int, buf_len) | ||
224 | __field(unsigned int, actual_len) | ||
225 | __field(unsigned int, zero) | ||
226 | __field(unsigned int, short_not_ok) | ||
227 | __field(unsigned int, no_interrupt) | ||
228 | ), | ||
229 | TP_fast_assign( | ||
230 | __entry->req = &req->request; | ||
231 | __entry->is_tx = req->tx; | ||
232 | __entry->epnum = req->epnum; | ||
233 | __entry->status = req->request.status; | ||
234 | __entry->buf_len = req->request.length; | ||
235 | __entry->actual_len = req->request.actual; | ||
236 | __entry->zero = req->request.zero; | ||
237 | __entry->short_not_ok = req->request.short_not_ok; | ||
238 | __entry->no_interrupt = req->request.no_interrupt; | ||
239 | ), | ||
240 | TP_printk("%p, ep%d %s, %s%s%s, len %d/%d, status %d", | ||
241 | __entry->req, __entry->epnum, | ||
242 | __entry->is_tx ? "tx/IN" : "rx/OUT", | ||
243 | __entry->zero ? "Z" : "z", | ||
244 | __entry->short_not_ok ? "S" : "s", | ||
245 | __entry->no_interrupt ? "I" : "i", | ||
246 | __entry->actual_len, __entry->buf_len, | ||
247 | __entry->status | ||
248 | ) | ||
249 | ); | ||
250 | |||
251 | DEFINE_EVENT(musb_req, musb_req_gb, | ||
252 | TP_PROTO(struct musb_request *req), | ||
253 | TP_ARGS(req) | ||
254 | ); | ||
255 | |||
256 | DEFINE_EVENT(musb_req, musb_req_tx, | ||
257 | TP_PROTO(struct musb_request *req), | ||
258 | TP_ARGS(req) | ||
259 | ); | ||
260 | |||
261 | DEFINE_EVENT(musb_req, musb_req_rx, | ||
262 | TP_PROTO(struct musb_request *req), | ||
263 | TP_ARGS(req) | ||
264 | ); | ||
265 | |||
266 | DEFINE_EVENT(musb_req, musb_req_alloc, | ||
267 | TP_PROTO(struct musb_request *req), | ||
268 | TP_ARGS(req) | ||
269 | ); | ||
270 | |||
271 | DEFINE_EVENT(musb_req, musb_req_free, | ||
272 | TP_PROTO(struct musb_request *req), | ||
273 | TP_ARGS(req) | ||
274 | ); | ||
275 | |||
276 | DEFINE_EVENT(musb_req, musb_req_start, | ||
277 | TP_PROTO(struct musb_request *req), | ||
278 | TP_ARGS(req) | ||
279 | ); | ||
280 | |||
281 | DEFINE_EVENT(musb_req, musb_req_enq, | ||
282 | TP_PROTO(struct musb_request *req), | ||
283 | TP_ARGS(req) | ||
284 | ); | ||
285 | |||
286 | DEFINE_EVENT(musb_req, musb_req_deq, | ||
287 | TP_PROTO(struct musb_request *req), | ||
288 | TP_ARGS(req) | ||
289 | ); | ||
290 | |||
215 | #endif /* __MUSB_TRACE_H */ | 291 | #endif /* __MUSB_TRACE_H */ |
216 | 292 | ||
217 | /* this part has to be here */ | 293 | /* this part has to be here */ |