Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/usb Fix mistakes in timeout/abort/completion changes...



details:   https://anonhg.NetBSD.org/src/rev/dda3bceec3af
branches:  trunk
changeset: 1007424:dda3bceec3af
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Wed Feb 19 16:01:37 2020 +0000

description:
Fix mistakes in timeout/abort/completion changes in motg(4).

- Call usbd_xfer_schedule_timeout so we actually do time out.

- Don't call usbd_xfer_trycomplete until all the data have been
  transferred -- it commits to completion, not timeout.

- Use xfer->ux_status != USBD_IN_PROGRESS to test whether, after a
  partial write, an xfer has been interrupted or timed out and need
  not be continued.

- Remove wrong assertion.

diffstat:

 sys/dev/usb/motg.c |  63 +++++++++++++++++++++++++----------------------------
 1 files changed, 30 insertions(+), 33 deletions(-)

diffs (150 lines):

diff -r f5f103d403d8 -r dda3bceec3af sys/dev/usb/motg.c
--- a/sys/dev/usb/motg.c        Wed Feb 19 16:00:28 2020 +0000
+++ b/sys/dev/usb/motg.c        Wed Feb 19 16:01:37 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: motg.c,v 1.30 2020/02/18 17:50:20 riastradh Exp $      */
+/*     $NetBSD: motg.c,v 1.31 2020/02/19 16:01:37 riastradh Exp $      */
 
 /*
  * Copyright (c) 1998, 2004, 2011, 2012, 2014 The NetBSD Foundation, Inc.
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: motg.c,v 1.30 2020/02/18 17:50:20 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: motg.c,v 1.31 2020/02/19 16:01:37 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -1350,6 +1350,7 @@
                err = USBD_NOT_STARTED;
                goto end;
        }
+       usbd_xfer_schedule_timeout(xfer);
        xfer->ux_status = USBD_IN_PROGRESS;
        KASSERT(otgpipe == MOTG_PIPE2MPIPE(xfer->ux_pipe));
        KASSERT(otgpipe->hw_ep == ep);
@@ -1427,15 +1428,8 @@
        MOTGHIST_FUNC(); MOTGHIST_CALLED();
 
        KASSERT(mutex_owned(&sc->sc_lock));
+       KASSERT(ep->phase == DATA_IN || ep->phase == STATUS_IN);
 
-       /*
-        * Try to claim this xfer for completion.  If it has already
-        * completed or aborted, drop it on the floor.
-        */
-       if (!usbd_xfer_trycomplete(xfer))
-               return;
-
-       KASSERT(ep->phase == DATA_IN || ep->phase == STATUS_IN);
        /* select endpoint 0 */
        UWRITE1(sc, MUSB2_REG_EPINDEX, 0);
 
@@ -1528,7 +1522,12 @@
 complete:
        ep->phase = IDLE;
        ep->xfer = NULL;
-       if (xfer && xfer->ux_status == USBD_IN_PROGRESS) {
+       /*
+        * Try to claim this xfer for completion.  If it has already
+        * completed or aborted, drop it on the floor.
+        */
+       if (xfer && usbd_xfer_trycomplete(xfer)) {
+               KASSERT(xfer->ux_status == USBD_IN_PROGRESS);
                KASSERT(new_status != USBD_IN_PROGRESS);
                xfer->ux_status = new_status;
                usb_transfer_complete(xfer);
@@ -1550,13 +1549,6 @@
 
        KASSERT(mutex_owned(&sc->sc_lock));
 
-       /*
-        * Try to claim this xfer for completion.  If it has already
-        * completed or aborted, drop it on the floor.
-        */
-       if (!usbd_xfer_trycomplete(xfer))
-               return;
-
        if (ep->phase == DATA_IN || ep->phase == STATUS_IN) {
                motg_device_ctrl_intr_rx(sc);
                return;
@@ -1603,7 +1595,7 @@
                /* data still not sent */
                return;
        }
-       if (xfer == NULL)
+       if (xfer == NULL || xfer->ux_status != USBD_IN_PROGRESS)
                goto complete;
        if (ep->phase == STATUS_OUT) {
                /*
@@ -1675,7 +1667,12 @@
 complete:
        ep->phase = IDLE;
        ep->xfer = NULL;
-       if (xfer && xfer->ux_status == USBD_IN_PROGRESS) {
+       /*
+        * Try to claim this xfer for completion.  If it has already
+        * completed or aborted, drop it on the floor.
+        */
+       if (xfer && usbd_xfer_trycomplete(xfer)) {
+               KASSERT(xfer->ux_status == USBD_IN_PROGRESS);
                KASSERT(new_status != USBD_IN_PROGRESS);
                xfer->ux_status = new_status;
                usb_transfer_complete(xfer);
@@ -1810,6 +1807,7 @@
                err = USBD_NOT_STARTED;
                goto end;
        }
+       usbd_xfer_schedule_timeout(xfer);
        xfer->ux_status = USBD_IN_PROGRESS;
        KASSERT(otgpipe == MOTG_PIPE2MPIPE(xfer->ux_pipe));
        KASSERT(otgpipe->hw_ep == ep);
@@ -2055,7 +2053,12 @@
            (xfer != NULL) ? xfer->ux_status : 0, 0, 0);
        ep->phase = IDLE;
        ep->xfer = NULL;
-       if (xfer && xfer->ux_status == USBD_IN_PROGRESS) {
+       /*
+        * Try to claim this xfer for completion.  If it has already
+        * completed or aborted, drop it on the floor.
+        */
+       if (xfer && usbd_xfer_trycomplete(xfer)) {
+               KASSERT(xfer->ux_status == USBD_IN_PROGRESS);
                KASSERT(new_status != USBD_IN_PROGRESS);
                xfer->ux_status = new_status;
                usb_transfer_complete(xfer);
@@ -2075,14 +2078,6 @@
        MOTGHIST_FUNC(); MOTGHIST_CALLED();
 
        KASSERT(mutex_owned(&sc->sc_lock));
-
-       /*
-        * Try to claim this xfer for completion.  If it has already
-        * completed or aborted, drop it on the floor.
-        */
-       if (!usbd_xfer_trycomplete(xfer))
-               return;
-
        KASSERT(ep->ep_number == epnumber);
 
        DPRINTFN(MD_BULK, " on ep %jd", epnumber, 0, 0, 0);
@@ -2144,12 +2139,14 @@
 complete:
        DPRINTFN(MD_BULK, "xfer %#jx complete, status %jd", (uintptr_t)xfer,
            (xfer != NULL) ? xfer->ux_status : 0, 0, 0);
-       KASSERTMSG(xfer && xfer->ux_status == USBD_IN_PROGRESS && 
-           ep->phase == DATA_OUT, "xfer %p status %d phase %d",
-           xfer, xfer->ux_status, ep->phase);
        ep->phase = IDLE;
        ep->xfer = NULL;
-       if (xfer && xfer->ux_status == USBD_IN_PROGRESS) {
+       /*
+        * Try to claim this xfer for completion.  If it has already
+        * completed or aborted, drop it on the floor.
+        */
+       if (xfer && usbd_xfer_trycomplete(xfer)) {
+               KASSERT(xfer->ux_status == USBD_IN_PROGRESS);
                KASSERT(new_status != USBD_IN_PROGRESS);
                xfer->ux_status = new_status;
                usb_transfer_complete(xfer);



Home | Main Index | Thread Index | Old Index