There are situations under which xHC is unable to service an isochronous
endpoint within its service interval. For an IN isoc endpoint, this is the case
when its ring is full, while for an OUT isoc endpoint when its ring is empty.
This patch adds a trace event to the class 'xhci_log_msg', called
'xhci_dbg_missed_periodic_tx', to trace the debug statements related to
missed periodic transfers.

Signed-off-by: Xenia Ragiadakou <burzalod...@gmail.com>
---

Differences from v3:

-make changelog more clear
-add two additional tracepoints

 drivers/usb/host/xhci-ring.c  | 26 ++++++++++++++++----------
 drivers/usb/host/xhci-trace.h |  5 +++++
 2 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index 8eb3118..af9bbac 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -2493,18 +2493,22 @@ static int handle_tx_event(struct xhci_hcd *xhci,
                 * a Ring Overrun Event for IN Isoch endpoint or Ring
                 * Underrun Event for OUT Isoch endpoint.
                 */
-               xhci_dbg(xhci, "underrun event on endpoint\n");
+               xhci_dbg_trace(xhci, trace_xhci_dbg_missed_periodic_tx,
+                               "underrun event on endpoint");
                if (!list_empty(&ep_ring->td_list))
-                       xhci_dbg(xhci, "Underrun Event for slot %d ep %d "
-                                       "still with TDs queued?\n",
+                       xhci_dbg_trace(xhci, trace_xhci_dbg_missed_periodic_tx,
+                                       "Underrun Event for slot %d ep %d "
+                                       "still with TDs queued?",
                                 TRB_TO_SLOT_ID(le32_to_cpu(event->flags)),
                                 ep_index);
                goto cleanup;
        case COMP_OVERRUN:
-               xhci_dbg(xhci, "overrun event on endpoint\n");
+               xhci_dbg_trace(xhci, trace_xhci_dbg_missed_periodic_tx,
+                               "overrun event on endpoint");
                if (!list_empty(&ep_ring->td_list))
-                       xhci_dbg(xhci, "Overrun Event for slot %d ep %d "
-                                       "still with TDs queued?\n",
+                       xhci_dbg_trace(xhci, trace_xhci_dbg_missed_periodic_tx,
+                                       "Overrun Event for slot %d ep %d "
+                                       "still with TDs queued?",
                                 TRB_TO_SLOT_ID(le32_to_cpu(event->flags)),
                                 ep_index);
                goto cleanup;
@@ -2520,7 +2524,8 @@ static int handle_tx_event(struct xhci_hcd *xhci,
                 * short transfer when process the ep_ring next time.
                 */
                ep->skip = true;
-               xhci_dbg(xhci, "Miss service interval error, set skip flag\n");
+               xhci_dbg_trace(xhci, trace_xhci_dbg_missed_periodic_tx,
+                               "Miss service interval error, set skip flag");
                goto cleanup;
        default:
                if (xhci_is_vendor_info_code(xhci, trb_comp_code)) {
@@ -2564,8 +2569,8 @@ static int handle_tx_event(struct xhci_hcd *xhci,
                /* We've skipped all the TDs on the ep ring when ep->skip set */
                if (ep->skip && td_num == 0) {
                        ep->skip = false;
-                       xhci_dbg(xhci, "All tds on the ep_ring skipped. "
-                                               "Clear skip flag.\n");
+                       xhci_dbg_trace(xhci, trace_xhci_dbg_missed_periodic_tx,
+                               "All tds on ep_ring skipped. Clear skip flag.");
                        ret = 0;
                        goto cleanup;
                }
@@ -2620,7 +2625,8 @@ static int handle_tx_event(struct xhci_hcd *xhci,
                        ep_ring->last_td_was_short = false;
 
                if (ep->skip) {
-                       xhci_dbg(xhci, "Found td. Clear skip flag.\n");
+                       xhci_dbg_trace(xhci, trace_xhci_dbg_missed_periodic_tx,
+                                       "Found td. Clear skip flag.");
                        ep->skip = false;
                }
 
diff --git a/drivers/usb/host/xhci-trace.h b/drivers/usb/host/xhci-trace.h
index 20364cc..c156685 100644
--- a/drivers/usb/host/xhci-trace.h
+++ b/drivers/usb/host/xhci-trace.h
@@ -67,6 +67,11 @@ DEFINE_EVENT(xhci_log_msg, xhci_dbg_ring_expansion,
        TP_ARGS(vaf)
 );
 
+DEFINE_EVENT(xhci_log_msg, xhci_dbg_missed_periodic_tx,
+       TP_PROTO(struct va_format *vaf),
+       TP_ARGS(vaf)
+);
+
 DECLARE_EVENT_CLASS(xhci_log_ctx,
        TP_PROTO(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx,
                 unsigned int ep_num),
-- 
1.8.3.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to