]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
xhci: add xhci_cmd_completion trace event
authorXenia Ragiadakou <burzalodowa@gmail.com>
Tue, 6 Aug 2013 04:52:48 +0000 (07:52 +0300)
committerSarah Sharp <sarah.a.sharp@linux.intel.com>
Tue, 13 Aug 2013 23:05:46 +0000 (16:05 -0700)
This patch creates a new event class, called xhci_log_event,
and defines the xhci_cmd_completion trace event used for
tracing the commands issued to xHC that generate a completion
event in the event ring.

This info can be used, later, to print, in a human readable
way, the completion status and flags as well as the command's
type and fields using the trace-cmd tool and the appropriate
plugin.

Also, a tracepoint is added in handle_cmd_completion().

Signed-off-by: Xenia Ragiadakou <burzalodowa@gmail.com>
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci-trace.h

index 3393ce755b15ac3c51c9fc0320317b7d24d19130..86971ac5851b5725233bbb6653135b044363c932 100644 (file)
@@ -1380,6 +1380,9 @@ static void handle_cmd_completion(struct xhci_hcd *xhci,
                return;
        }
 
+       trace_xhci_cmd_completion(&xhci->cmd_ring->dequeue->generic,
+                                       (struct xhci_generic_trb *) event);
+
        if ((GET_COMP_CODE(le32_to_cpu(event->status)) == COMP_CMD_ABORT) ||
                (GET_COMP_CODE(le32_to_cpu(event->status)) == COMP_CMD_STOP)) {
                /* If the return value is 0, we think the trb pointed by
index c653ddfc02112860dac0584f9c32eafdbf98bde3..d6c222916858d91071babb95ac555b6ec9539dca 100644 (file)
@@ -93,6 +93,36 @@ DEFINE_EVENT(xhci_log_ctx, xhci_address_ctx,
        TP_ARGS(xhci, ctx, ep_num)
 );
 
+DECLARE_EVENT_CLASS(xhci_log_event,
+       TP_PROTO(void *trb_va, struct xhci_generic_trb *ev),
+       TP_ARGS(trb_va, ev),
+       TP_STRUCT__entry(
+               __field(void *, va)
+               __field(u64, dma)
+               __field(u32, status)
+               __field(u32, flags)
+               __dynamic_array(__le32, trb, 4)
+       ),
+       TP_fast_assign(
+               __entry->va = trb_va;
+               __entry->dma = le64_to_cpu(((u64)ev->field[1]) << 32 |
+                                               ev->field[0]);
+               __entry->status = le32_to_cpu(ev->field[2]);
+               __entry->flags = le32_to_cpu(ev->field[3]);
+               memcpy(__get_dynamic_array(trb), trb_va,
+                       sizeof(struct xhci_generic_trb));
+       ),
+       TP_printk("\ntrb_dma=@%llx, trb_va=@%p, status=%08x, flags=%08x",
+                       (unsigned long long) __entry->dma, __entry->va,
+                       __entry->status, __entry->flags
+       )
+);
+
+DEFINE_EVENT(xhci_log_event, xhci_cmd_completion,
+       TP_PROTO(void *trb_va, struct xhci_generic_trb *ev),
+       TP_ARGS(trb_va, ev)
+);
+
 #endif /* __XHCI_TRACE_H */
 
 /* this part must be outside header guard */