usb: xhci: remove 'handling_skipped_tds' from handle_tx_event()
authorNiklas Neronin <niklas.neronin@linux.intel.com>
Mon, 29 Apr 2024 14:02:38 +0000 (17:02 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 1 May 2024 06:47:14 +0000 (08:47 +0200)
When handle_tx_event() encounters a COMP_MISSED_SERVICE_ERROR or
COMP_NO_PING_RESPONSE_ERROR event, it moves to 'goto cleanup'.
Here, it sets a flag, 'handling_skipped_tds', based on conditions that
exclude these two error events.

Subsequently, the process evaluates the loop that persists as long as
'handling_skipped_tds' remains true. However, since 'trb_comp_code' does
not change after its assignment, if it indicates either of the two error
conditions, the loop terminates immediately.

To simplify this process and enhance clarity, the modification involves
returning immediately upon detecting COMP_MISSED_SERVICE_ERROR or
COMP_NO_PING_RESPONSE_ERROR. This adjustment allows for the direct use of
'ep->skip', removing the necessity for the 'handling_skipped_tds' flag.

Signed-off-by: Niklas Neronin <niklas.neronin@linux.intel.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20240429140245.3955523-12-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-ring.c

index 00f48dd197ac00ffab4b55b5c19173029bfc8ce9..e96ac2d7b9b13bac0f361b26c10deb3362314b61 100644 (file)
@@ -2587,7 +2587,6 @@ static int handle_tx_event(struct xhci_hcd *xhci,
        struct xhci_ep_ctx *ep_ctx;
        u32 trb_comp_code;
        int td_num = 0;
-       bool handling_skipped_tds = false;
 
        slot_id = TRB_TO_SLOT_ID(le32_to_cpu(event->flags));
        ep_index = TRB_TO_EP_ID(le32_to_cpu(event->flags)) - 1;
@@ -2748,13 +2747,13 @@ static int handle_tx_event(struct xhci_hcd *xhci,
                xhci_dbg(xhci,
                         "Miss service interval error for slot %u ep %u, set skip flag\n",
                         slot_id, ep_index);
-               goto cleanup;
+               return 0;
        case COMP_NO_PING_RESPONSE_ERROR:
                ep->skip = true;
                xhci_dbg(xhci,
                         "No Ping response error for slot %u ep %u, Skip one Isoc TD\n",
                         slot_id, ep_index);
-               goto cleanup;
+               return 0;
 
        case COMP_INCOMPATIBLE_DEVICE_ERROR:
                /* needs disable slot command to recover */
@@ -2939,18 +2938,14 @@ static int handle_tx_event(struct xhci_hcd *xhci,
                        process_isoc_td(xhci, ep, ep_ring, td, ep_trb, event);
                else
                        process_bulk_intr_td(xhci, ep, ep_ring, td, ep_trb, event);
-cleanup:
-               handling_skipped_tds = ep->skip &&
-                       trb_comp_code != COMP_MISSED_SERVICE_ERROR &&
-                       trb_comp_code != COMP_NO_PING_RESPONSE_ERROR;
-
+cleanup:;
        /*
         * If ep->skip is set, it means there are missed tds on the
         * endpoint ring need to take care of.
         * Process them as short transfer until reach the td pointed by
         * the event.
         */
-       } while (handling_skipped_tds);
+       } while (ep->skip);
 
        return 0;