usb: xhci: move process TD code out of the while loop
authorNiklas Neronin <niklas.neronin@linux.intel.com>
Wed, 26 Jun 2024 12:48:32 +0000 (15:48 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 27 Jun 2024 14:08:06 +0000 (16:08 +0200)
This part is and should only performed once, so it's moved out of the
while loop to improve code readability.

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/20240626124835.1023046-19-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-ring.c

index 7baa9dc706a1387f63c989d6a802413c0c5659e5..d037d3bbc7671c7ef33eb2b776bdd62a5ac82a2b 100644 (file)
@@ -2868,10 +2868,6 @@ static int handle_tx_event(struct xhci_hcd *xhci,
                                return -ESHUTDOWN;
                        }
                }
-               if (trb_comp_code == COMP_SHORT_PACKET)
-                       ep_ring->last_td_was_short = true;
-               else
-                       ep_ring->last_td_was_short = false;
 
                if (ep->skip) {
                        xhci_dbg(xhci,
@@ -2880,34 +2876,6 @@ static int handle_tx_event(struct xhci_hcd *xhci,
                        ep->skip = false;
                }
 
-               ep_trb = &ep_seg->trbs[(ep_trb_dma - ep_seg->dma) /
-                                               sizeof(*ep_trb)];
-
-               trace_xhci_handle_transfer(ep_ring,
-                               (struct xhci_generic_trb *) ep_trb);
-
-               /*
-                * No-op TRB could trigger interrupts in a case where
-                * a URB was killed and a STALL_ERROR happens right
-                * after the endpoint ring stopped. Reset the halted
-                * endpoint. Otherwise, the endpoint remains stalled
-                * indefinitely.
-                */
-
-               if (trb_is_noop(ep_trb)) {
-                       if (xhci_halted_host_endpoint(ep_ctx, trb_comp_code))
-                               xhci_handle_halted_endpoint(xhci, ep, td, EP_HARD_RESET);
-               } else {
-                       td->status = status;
-
-                       /* update the urb's actual_length and give back to the core */
-                       if (usb_endpoint_xfer_control(&td->urb->ep->desc))
-                               process_ctrl_td(xhci, ep, ep_ring, td, ep_trb, event);
-                       else if (usb_endpoint_xfer_isoc(&td->urb->ep->desc))
-                               process_isoc_td(xhci, ep, ep_ring, td, ep_trb, event);
-                       else
-                               process_bulk_intr_td(xhci, ep, ep_ring, td, ep_trb, event);
-               }
        /*
         * If ep->skip is set, it means there are missed tds on the
         * endpoint ring need to take care of.
@@ -2916,6 +2884,36 @@ static int handle_tx_event(struct xhci_hcd *xhci,
         */
        } while (ep->skip);
 
+       if (trb_comp_code == COMP_SHORT_PACKET)
+               ep_ring->last_td_was_short = true;
+       else
+               ep_ring->last_td_was_short = false;
+
+       ep_trb = &ep_seg->trbs[(ep_trb_dma - ep_seg->dma) / sizeof(*ep_trb)];
+       trace_xhci_handle_transfer(ep_ring, (struct xhci_generic_trb *) ep_trb);
+
+       /*
+        * No-op TRB could trigger interrupts in a case where a URB was killed
+        * and a STALL_ERROR happens right after the endpoint ring stopped.
+        * Reset the halted endpoint. Otherwise, the endpoint remains stalled
+        * indefinitely.
+        */
+
+       if (trb_is_noop(ep_trb)) {
+               if (xhci_halted_host_endpoint(ep_ctx, trb_comp_code))
+                       xhci_handle_halted_endpoint(xhci, ep, td, EP_HARD_RESET);
+       } else {
+               td->status = status;
+
+               /* update the urb's actual_length and give back to the core */
+               if (usb_endpoint_xfer_control(&td->urb->ep->desc))
+                       process_ctrl_td(xhci, ep, ep_ring, td, ep_trb, event);
+               else if (usb_endpoint_xfer_isoc(&td->urb->ep->desc))
+                       process_isoc_td(xhci, ep, ep_ring, td, ep_trb, event);
+               else
+                       process_bulk_intr_td(xhci, ep, ep_ring, td, ep_trb, event);
+       }
+
        return 0;
 
 err_out: