The usb core automatically sets the status to -EREMOTEIO when giving back the
URB to the driver if the transfer was short, and URB_SHORT_NOT_OK was set in the
transfer_flags and the status is equal to 0 (see __usb_hcd_giveback_urb()).

So, avoid the redundant checks in the xhci logic; instead the status is always
set to 0.

Signed-off-by: Aleksander Morgado <[email protected]>
---
 drivers/usb/host/xhci-ring.c | 51 +++++++-------------------------------------
 1 file changed, 8 insertions(+), 43 deletions(-)

diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index 73485fa..7b87ffe 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -1849,10 +1849,7 @@ td_cleanup:
                        urb->transfer_buffer_length,
                        urb->actual_length);
                urb->actual_length = 0;
-               if (td->urb->transfer_flags & URB_SHORT_NOT_OK)
-                       *status = -EREMOTEIO;
-               else
-                       *status = 0;
+               *status = 0;
        }
        list_del_init(&td->td_list);
        /* Was this TD slated to be cancelled but completed anyway? */
@@ -1911,10 +1908,7 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct 
xhci_td *td,
                }
                break;
        case COMP_SHORT_TX:
-               if (td->urb->transfer_flags & URB_SHORT_NOT_OK)
-                       *status = -EREMOTEIO;
-               else
-                       *status = 0;
+               *status = 0;
                break;
        case COMP_STOP_INVAL:
        case COMP_STOP:
@@ -1946,16 +1940,7 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct 
xhci_td *td,
        if (event_trb != ep_ring->dequeue) {
                /* The event was for the status stage */
                if (event_trb == td->last_trb) {
-                       if (td->urb_length_set) {
-                               /* Don't overwrite a previously set error code
-                                */
-                               if ((*status == -EINPROGRESS || *status == 0) &&
-                                               (td->urb->transfer_flags
-                                                & URB_SHORT_NOT_OK))
-                                       /* Did we already see a short data
-                                        * stage? */
-                                       *status = -EREMOTEIO;
-                       } else {
+                       if (!td->urb_length_set) {
                                td->urb->actual_length =
                                        td->urb->transfer_buffer_length;
                        }
@@ -2111,21 +2096,13 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci, 
struct xhci_td *td,
                    EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)) != 0) {
                        xhci_warn(xhci, "WARN Successful completion "
                                        "on short TX\n");
-                       if (td->urb->transfer_flags & URB_SHORT_NOT_OK)
-                               *status = -EREMOTEIO;
-                       else
-                               *status = 0;
                        if ((xhci->quirks & XHCI_TRUST_TX_LENGTH))
                                trb_comp_code = COMP_SHORT_TX;
-               } else {
-                       *status = 0;
                }
+               *status = 0;
                break;
        case COMP_SHORT_TX:
-               if (td->urb->transfer_flags & URB_SHORT_NOT_OK)
-                       *status = -EREMOTEIO;
-               else
-                       *status = 0;
+               *status = 0;
                break;
        default:
                /* Others already handled above */
@@ -2149,26 +2126,14 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci, 
struct xhci_td *td,
                                                "of %d bytes left\n",
                                          
EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)));
                                td->urb->actual_length = 0;
-                               if (td->urb->transfer_flags & URB_SHORT_NOT_OK)
-                                       *status = -EREMOTEIO;
-                               else
-                                       *status = 0;
+                               *status = 0;
                        }
                        /* Don't overwrite a previously set error code */
-                       if (*status == -EINPROGRESS) {
-                               if (td->urb->transfer_flags & URB_SHORT_NOT_OK)
-                                       *status = -EREMOTEIO;
-                               else
-                                       *status = 0;
-                       }
+                       if (*status == -EINPROGRESS)
+                               *status = 0;
                } else {
                        td->urb->actual_length =
                                td->urb->transfer_buffer_length;
-                       /* Ignore a short packet completion if the
-                        * untransferred length was zero.
-                        */
-                       if (*status == -EREMOTEIO)
-                               *status = 0;
                }
        } else {
                /* Slow path - walk the list, starting from the dequeue
--
2.3.1
--
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