| From db7e3a1af9f2c9262e7709904fa331c0ca508a3d Mon Sep 17 00:00:00 2001 |
| From: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Date: Mon, 23 Jan 2017 14:20:23 +0200 |
| Subject: [PATCH 209/255] usb: host: xhci: add xhci_virt_device tracer |
| |
| 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> |
| (cherry picked from commit a711edeeb1a1e80fb8626ee28acc15f084dcb107) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/usb/host/xhci-hub.c | 2 + |
| drivers/usb/host/xhci-mem.c | 7 +++++ |
| drivers/usb/host/xhci-trace.h | 57 ++++++++++++++++++++++++++++++++++++++++++ |
| drivers/usb/host/xhci.c | 1 |
| 4 files changed, 67 insertions(+) |
| |
| --- a/drivers/usb/host/xhci-hub.c |
| +++ b/drivers/usb/host/xhci-hub.c |
| @@ -398,6 +398,8 @@ static int xhci_stop_device(struct xhci_ |
| 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"); |
| --- a/drivers/usb/host/xhci-mem.c |
| +++ b/drivers/usb/host/xhci-mem.c |
| @@ -936,6 +936,9 @@ void xhci_free_virt_device(struct xhci_h |
| return; |
| |
| dev = xhci->devs[slot_id]; |
| + |
| + trace_xhci_free_virt_device(dev); |
| + |
| xhci->dcbaa->dev_context_ptrs[slot_id] = 0; |
| if (!dev) |
| return; |
| @@ -1085,6 +1088,8 @@ int xhci_alloc_virt_device(struct xhci_h |
| |
| xhci->devs[slot_id] = dev; |
| |
| + trace_xhci_alloc_virt_device(dev); |
| + |
| return 1; |
| fail: |
| if (dev->eps[0].ring) |
| @@ -1266,6 +1271,8 @@ int xhci_setup_addressable_virt_dev(stru |
| 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; |
| --- a/drivers/usb/host/xhci-trace.h |
| +++ b/drivers/usb/host/xhci-trace.h |
| @@ -158,6 +158,63 @@ DEFINE_EVENT(xhci_log_trb, xhci_queue_tr |
| 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), |
| --- a/drivers/usb/host/xhci.c |
| +++ b/drivers/usb/host/xhci.c |
| @@ -3893,6 +3893,7 @@ static int xhci_setup_device(struct usb_ |
| 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) { |