If we just provide a helper to convert completion code to string, we can
combine all debugging messages into a single print.

Signed-off-by: Felipe Balbi <[email protected]>
---
 drivers/usb/host/xhci-ring.c | 28 ++++------------
 drivers/usb/host/xhci.h      | 80 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 86 insertions(+), 22 deletions(-)

diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index dc436d0c900f..393c64f8acef 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -2230,6 +2230,10 @@ static int handle_tx_event(struct xhci_hcd *xhci,
 
        ep_trb_dma = le64_to_cpu(event->buffer);
        trb_comp_code = GET_COMP_CODE(le32_to_cpu(event->transfer_len));
+
+       xhci_dbg(xhci, "Event TRB Status '%s' (%d)\n",
+                       xhci_trb_comp_code_string(trb_comp_code), 
trb_comp_code);
+
        /* Look for common error cases */
        switch (trb_comp_code) {
        /* Skip codes that require special handling depending on
@@ -2244,51 +2248,35 @@ static int handle_tx_event(struct xhci_hcd *xhci,
                        xhci_warn_ratelimited(xhci,
                                        "WARN Successful completion on short 
TX: needs XHCI_TRUST_TX_LENGTH quirk?\n");
        case COMP_SHORT_PACKET:
-               break;
        case COMP_STOPPED:
-               xhci_dbg(xhci, "Stopped on Transfer TRB\n");
-               break;
        case COMP_STOPPED_LENGTH_INVALID:
-               xhci_dbg(xhci, "Stopped on No-op or Link TRB\n");
-               break;
        case COMP_STOPPED_SHORT_PACKET:
-               xhci_dbg(xhci, "Stopped with short packet transfer detected\n");
+       case COMP_BANDWIDTH_OVERRUN_ERROR:
+       case COMP_ISOCH_BUFFER_OVERRUN:
                break;
        case COMP_STALL_ERROR:
-               xhci_dbg(xhci, "Stalled endpoint\n");
                ep->ep_state |= EP_HALTED;
                status = -EPIPE;
                break;
        case COMP_TRB_ERROR:
-               xhci_warn(xhci, "WARN: TRB error on endpoint\n");
                status = -EILSEQ;
                break;
        case COMP_SPLIT_TRANSACTION_ERROR:
        case COMP_USB_TRANSACTION_ERROR:
-               xhci_dbg(xhci, "Transfer error on endpoint\n");
                status = -EPROTO;
                break;
        case COMP_BABBLE_DETECTED_ERROR:
-               xhci_dbg(xhci, "Babble error on endpoint\n");
                status = -EOVERFLOW;
                break;
        case COMP_DATA_BUFFER_ERROR:
-               xhci_warn(xhci, "WARN: HC couldn't access mem fast enough\n");
                status = -ENOSR;
                break;
-       case COMP_BANDWIDTH_OVERRUN_ERROR:
-               xhci_warn(xhci, "WARN: bandwidth overrun event on endpoint\n");
-               break;
-       case COMP_ISOCH_BUFFER_OVERRUN:
-               xhci_warn(xhci, "WARN: buffer overrun event on endpoint\n");
-               break;
        case COMP_RING_UNDERRUN:
                /*
                 * When the Isoch ring is empty, the xHC will generate
                 * a Ring Overrun Event for IN Isoch endpoint or Ring
                 * Underrun Event for OUT Isoch endpoint.
                 */
-               xhci_dbg(xhci, "underrun event on endpoint\n");
                if (!list_empty(&ep_ring->td_list))
                        xhci_dbg(xhci, "Underrun Event for slot %d ep %d "
                                        "still with TDs queued?\n",
@@ -2296,7 +2284,6 @@ static int handle_tx_event(struct xhci_hcd *xhci,
                                 ep_index);
                goto cleanup;
        case COMP_RING_OVERRUN:
-               xhci_dbg(xhci, "overrun event on endpoint\n");
                if (!list_empty(&ep_ring->td_list))
                        xhci_dbg(xhci, "Overrun Event for slot %d ep %d "
                                        "still with TDs queued?\n",
@@ -2304,7 +2291,6 @@ static int handle_tx_event(struct xhci_hcd *xhci,
                                 ep_index);
                goto cleanup;
        case COMP_INCOMPATIBLE_DEVICE_ERROR:
-               xhci_warn(xhci, "WARN: detect an incompatible device");
                status = -EPROTO;
                break;
        case COMP_MISSED_SERVICE_ERROR:
@@ -2315,11 +2301,9 @@ 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");
                goto cleanup;
        case COMP_NO_PING_RESPONSE_ERROR:
                ep->skip = true;
-               xhci_dbg(xhci, "No Ping response error, Skip one Isoc TD\n");
                goto cleanup;
        default:
                if (xhci_is_vendor_info_code(xhci, trb_comp_code)) {
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index 8e7da82d5033..c7e95a6e39a7 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -1098,6 +1098,86 @@ struct xhci_transfer_event {
 #define COMP_SECONDARY_BANDWIDTH_ERROR         35
 #define COMP_SPLIT_TRANSACTION_ERROR           36
 
+static inline const char *xhci_trb_comp_code_string(u8 status)
+{
+       switch (status) {
+       case COMP_INVALID:
+               return "Invalid";
+       case COMP_SUCCESS:
+               return "Success";
+       case COMP_DATA_BUFFER_ERROR:
+               return "Data Buffer Error";
+       case COMP_BABBLE_DETECTED_ERROR:
+               return "Babble Detected";
+       case COMP_USB_TRANSACTION_ERROR:
+               return "USB Transaction Error";
+       case COMP_TRB_ERROR:
+               return "TRB Error";
+       case COMP_STALL_ERROR:
+               return "Stall Error";
+       case COMP_RESOURCE_ERROR:
+               return "Resource Error";
+       case COMP_BANDWIDTH_ERROR:
+               return "Bandwidth Error";
+       case COMP_NO_SLOTS_AVAILABLE_ERROR:
+               return "No Slots Available Error";
+       case COMP_INVALID_STREAM_TYPE_ERROR:
+               return "Invalid Stream Type Error";
+       case COMP_SLOT_NOT_ENABLED_ERROR:
+               return "Slot Not Enabled Error";
+       case COMP_ENDPOINT_NOT_ENABLED_ERROR:
+               return "Endpoint Not Enabled Error";
+       case COMP_SHORT_PACKET:
+               return "Short Packet";
+       case COMP_RING_UNDERRUN:
+               return "Ring Underrun";
+       case COMP_RING_OVERRUN:
+               return "Ring Overrun";
+       case COMP_VF_EVENT_RING_FULL_ERROR:
+               return "VF Event Ring Full Error";
+       case COMP_PARAMETER_ERROR:
+               return "Parameter Error";
+       case COMP_BANDWIDTH_OVERRUN_ERROR:
+               return "Bandwidth Overrun Error";
+       case COMP_CONTEXT_STATE_ERROR:
+               return "Context State Error";
+       case COMP_NO_PING_RESPONSE_ERROR:
+               return "No Ping Response Error";
+       case COMP_EVENT_RING_FULL_ERROR:
+               return "Event Ring Full Error";
+       case COMP_INCOMPATIBLE_DEVICE_ERROR:
+               return "Incompatible Device Error";
+       case COMP_MISSED_SERVICE_ERROR:
+               return "Missed Service Error";
+       case COMP_COMMAND_RING_STOPPED:
+               return "Command Ring Stopped";
+       case COMP_COMMAND_ABORTED:
+               return "Command Aborted";
+       case COMP_STOPPED:
+               return "Stopped";
+       case COMP_STOPPED_LENGTH_INVALID:
+               return "Stopped - Length Invalid";
+       case COMP_STOPPED_SHORT_PACKET:
+               return "Stopped - Short Packet";
+       case COMP_MAX_EXIT_LATENCY_TOO_LARGE_ERROR:
+               return "Max Exit Latency Too Large Error";
+       case COMP_ISOCH_BUFFER_OVERRUN:
+               return "Isoch Buffer Overrun";
+       case COMP_EVENT_LOST_ERROR:
+               return "Event Lost Error";
+       case COMP_UNDEFINED_ERROR:
+               return "Undefined Error";
+       case COMP_INVALID_STREAM_ID_ERROR:
+               return "Invalid Stream ID Error";
+       case COMP_SECONDARY_BANDWIDTH_ERROR:
+               return "Secondary Bandwidth Error";
+       case COMP_SPLIT_TRANSACTION_ERROR:
+               return "Split Transaction Error";
+       default:
+               return "Unknown!!";
+       }
+}
+
 struct xhci_link_trb {
        /* 64-bit segment pointer*/
        __le64 segment_ptr;
-- 
2.11.0

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

Reply via email to