Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a711edee authored by Felipe Balbi's avatar Felipe Balbi Committed by Greg Kroah-Hartman
Browse files

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: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d4d93e6c
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -389,6 +389,8 @@ static int xhci_stop_device(struct xhci_hcd *xhci, int slot_id, int suspend)
	if (!virt_dev)
	if (!virt_dev)
		return -ENODEV;
		return -ENODEV;


	trace_xhci_stop_device(virt_dev);

	cmd = xhci_alloc_command(xhci, false, true, GFP_NOIO);
	cmd = xhci_alloc_command(xhci, false, true, GFP_NOIO);
	if (!cmd) {
	if (!cmd) {
		xhci_dbg(xhci, "Couldn't allocate command structure.\n");
		xhci_dbg(xhci, "Couldn't allocate command structure.\n");
+7 −0
Original line number Original line Diff line number Diff line
@@ -936,6 +936,9 @@ void xhci_free_virt_device(struct xhci_hcd *xhci, int slot_id)
		return;
		return;


	dev = xhci->devs[slot_id];
	dev = xhci->devs[slot_id];

	trace_xhci_free_virt_device(dev);

	xhci->dcbaa->dev_context_ptrs[slot_id] = 0;
	xhci->dcbaa->dev_context_ptrs[slot_id] = 0;
	if (!dev)
	if (!dev)
		return;
		return;
@@ -1075,6 +1078,8 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id,
		 &xhci->dcbaa->dev_context_ptrs[slot_id],
		 &xhci->dcbaa->dev_context_ptrs[slot_id],
		 le64_to_cpu(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;
	return 1;
fail:
fail:
	xhci_free_virt_device(xhci, slot_id);
	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 |
	ep0_ctx->deq = cpu_to_le64(dev->eps[0].ring->first_seg->dma |
				   dev->eps[0].ring->cycle_state);
				   dev->eps[0].ring->cycle_state);


	trace_xhci_setup_addressable_virt_device(dev);

	/* Steps 7 and 8 were done in xhci_alloc_virt_device() */
	/* Steps 7 and 8 were done in xhci_alloc_virt_device() */


	return 0;
	return 0;
+57 −0
Original line number Original line Diff line number Diff line
@@ -158,6 +158,63 @@ DEFINE_EVENT(xhci_log_trb, xhci_queue_trb,
	TP_ARGS(ring, 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,
DECLARE_EVENT_CLASS(xhci_log_urb,
	TP_PROTO(struct urb *urb),
	TP_PROTO(struct urb *urb),
	TP_ARGS(urb),
	TP_ARGS(urb),
+1 −0
Original line number Original line Diff line number Diff line
@@ -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);
				le32_to_cpu(slot_ctx->dev_info) >> 27);


	spin_lock_irqsave(&xhci->lock, flags);
	spin_lock_irqsave(&xhci->lock, flags);
	trace_xhci_setup_device(virt_dev);
	ret = xhci_queue_address_device(xhci, command, virt_dev->in_ctx->dma,
	ret = xhci_queue_address_device(xhci, command, virt_dev->in_ctx->dma,
					udev->slot_id, setup);
					udev->slot_id, setup);
	if (ret) {
	if (ret) {