]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
usb: host: xhci: add xhci_virt_device tracer
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Mon, 23 Jan 2017 12:20:23 +0000 (14:20 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 25 Jan 2017 10:00:01 +0000 (11:00 +0100)
Let's start tracing at least part of an xhci_virt_device lifetime. We
might want to extend this tracepoint class later, but for now it already
exposes quite a bit of valuable information.

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-hub.c
drivers/usb/host/xhci-mem.c
drivers/usb/host/xhci-trace.h
drivers/usb/host/xhci.c

index 50d086b4863533e0068a9157d8eb1f8bb95ef755..3bddeaa1e2d768feebb99c5e091de947562b799c 100644 (file)
@@ -389,6 +389,8 @@ static int xhci_stop_device(struct xhci_hcd *xhci, int slot_id, int suspend)
        if (!virt_dev)
                return -ENODEV;
 
+       trace_xhci_stop_device(virt_dev);
+
        cmd = xhci_alloc_command(xhci, false, true, GFP_NOIO);
        if (!cmd) {
                xhci_dbg(xhci, "Couldn't allocate command structure.\n");
index 0019094b0e64ffa87d759a25438907546a048aa5..e452492d8071ddd485881ce86a8f6bade7a6136f 100644 (file)
@@ -936,6 +936,9 @@ void xhci_free_virt_device(struct xhci_hcd *xhci, int slot_id)
                return;
 
        dev = xhci->devs[slot_id];
+
+       trace_xhci_free_virt_device(dev);
+
        xhci->dcbaa->dev_context_ptrs[slot_id] = 0;
        if (!dev)
                return;
@@ -1075,6 +1078,8 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id,
                 &xhci->dcbaa->dev_context_ptrs[slot_id],
                 le64_to_cpu(xhci->dcbaa->dev_context_ptrs[slot_id]));
 
+       trace_xhci_alloc_virt_device(dev);
+
        return 1;
 fail:
        xhci_free_virt_device(xhci, slot_id);
@@ -1249,6 +1254,8 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud
        ep0_ctx->deq = cpu_to_le64(dev->eps[0].ring->first_seg->dma |
                                   dev->eps[0].ring->cycle_state);
 
+       trace_xhci_setup_addressable_virt_device(dev);
+
        /* Steps 7 and 8 were done in xhci_alloc_virt_device() */
 
        return 0;
index 08bed2f07e50b333929ad0dbd6441577cf4f24be..1ac2cdf8eece9542b551a525a338b67d2e8b30c0 100644 (file)
@@ -158,6 +158,63 @@ DEFINE_EVENT(xhci_log_trb, xhci_queue_trb,
        TP_ARGS(ring, trb)
 );
 
+DECLARE_EVENT_CLASS(xhci_log_virt_dev,
+       TP_PROTO(struct xhci_virt_device *vdev),
+       TP_ARGS(vdev),
+       TP_STRUCT__entry(
+               __field(void *, vdev)
+               __field(unsigned long long, out_ctx)
+               __field(unsigned long long, in_ctx)
+               __field(int, devnum)
+               __field(int, state)
+               __field(int, speed)
+               __field(u8, portnum)
+               __field(u8, level)
+               __field(int, slot_id)
+       ),
+       TP_fast_assign(
+               __entry->vdev = vdev;
+               __entry->in_ctx = (unsigned long long) vdev->in_ctx->dma;
+               __entry->out_ctx = (unsigned long long) vdev->out_ctx->dma;
+               __entry->devnum = vdev->udev->devnum;
+               __entry->state = vdev->udev->state;
+               __entry->speed = vdev->udev->speed;
+               __entry->portnum = vdev->udev->portnum;
+               __entry->level = vdev->udev->level;
+               __entry->slot_id = vdev->udev->slot_id;
+       ),
+       TP_printk("vdev %p ctx %llx | %llx num %d state %d speed %d port %d level %d slot %d",
+               __entry->vdev, __entry->in_ctx, __entry->out_ctx,
+               __entry->devnum, __entry->state, __entry->speed,
+               __entry->portnum, __entry->level, __entry->slot_id
+       )
+);
+
+DEFINE_EVENT(xhci_log_virt_dev, xhci_alloc_virt_device,
+       TP_PROTO(struct xhci_virt_device *vdev),
+       TP_ARGS(vdev)
+);
+
+DEFINE_EVENT(xhci_log_virt_dev, xhci_free_virt_device,
+       TP_PROTO(struct xhci_virt_device *vdev),
+       TP_ARGS(vdev)
+);
+
+DEFINE_EVENT(xhci_log_virt_dev, xhci_setup_device,
+       TP_PROTO(struct xhci_virt_device *vdev),
+       TP_ARGS(vdev)
+);
+
+DEFINE_EVENT(xhci_log_virt_dev, xhci_setup_addressable_virt_device,
+       TP_PROTO(struct xhci_virt_device *vdev),
+       TP_ARGS(vdev)
+);
+
+DEFINE_EVENT(xhci_log_virt_dev, xhci_stop_device,
+       TP_PROTO(struct xhci_virt_device *vdev),
+       TP_ARGS(vdev)
+);
+
 DECLARE_EVENT_CLASS(xhci_log_urb,
        TP_PROTO(struct urb *urb),
        TP_ARGS(urb),
index 958c92bd91772ef39a8627c5b83a72454d1d78e0..4968e9a1579e7e33765d6906228e1151ebbd8c34 100644 (file)
@@ -3848,6 +3848,7 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
                                le32_to_cpu(slot_ctx->dev_info) >> 27);
 
        spin_lock_irqsave(&xhci->lock, flags);
+       trace_xhci_setup_device(virt_dev);
        ret = xhci_queue_address_device(xhci, command, virt_dev->in_ctx->dma,
                                        udev->slot_id, setup);
        if (ret) {