Source-Changes-HG archive

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

[src-draft/trunk]: src/sys/dev/usb Wrap up abort pipe and rxeof in rx/tx mute...



details:   https://anonhg.NetBSD.org/src-all/rev/d27730a8328b
branches:  trunk
changeset: 375416:d27730a8328b
user:      Nathanial Sloss <nat%netbsd.org@localhost>
date:      Sun May 03 19:16:20 2020 +1000

description:
Wrap up abort pipe and rxeof in rx/tx mutexes.

diffstat:

 sys/dev/usb/if_urtwn.c |  9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diffs (48 lines):

diff -r a4bc30cf537f -r d27730a8328b sys/dev/usb/if_urtwn.c
--- a/sys/dev/usb/if_urtwn.c    Sun May 03 12:39:32 2020 +1000
+++ b/sys/dev/usb/if_urtwn.c    Sun May 03 19:16:20 2020 +1000
@@ -2974,11 +2974,13 @@ urtwn_rxeof(struct usbd_xfer *xfer, void
        DPRINTFN(DBG_FN|DBG_RX, ("%s: %s: status=%d\n",
            device_xname(sc->sc_dev), __func__, status));
 
+       mutex_enter(&sc->sc_rx_mtx);
        if (__predict_false(status != USBD_NORMAL_COMPLETION)) {
                if (status == USBD_STALLED)
                        usbd_clear_endpoint_stall_async(sc->rx_pipe[pidx]);
                else if (status != USBD_CANCELLED)
                        goto resubmit;
+               mutex_exit(&sc->sc_rx_mtx);
                return;
        }
        usbd_get_xfer_status(xfer, NULL, NULL, &len, NULL);
@@ -3042,6 +3044,7 @@ urtwn_rxeof(struct usbd_xfer *xfer, void
        usbd_setup_xfer(xfer, data, data->buf, URTWN_RXBUFSZ,
            USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, urtwn_rxeof);
        (void)usbd_transfer(xfer);
+       mutex_exit(&sc->sc_rx_mtx);
 }
 
 static void
@@ -5812,17 +5815,21 @@ urtwn_stop(struct ifnet *ifp, int disabl
        callout_stop(&sc->sc_scan_to);
        callout_stop(&sc->sc_calib_to);
 
+       mutex_enter(&sc->sc_tx_mtx);
        /* Abort Tx. */
        for (i = 0; i < sc->tx_npipe; i++) {
                if (sc->tx_pipe[i] != NULL)
                        usbd_abort_pipe(sc->tx_pipe[i]);
        }
-
+       mutex_exit(&sc->sc_tx_mtx);
+
+       mutex_enter(&sc->sc_rx_mtx);
        /* Stop Rx pipe. */
        for (i = 0; i < sc->rx_npipe; i++) {
                if (sc->rx_pipe[i] != NULL)
                        usbd_abort_pipe(sc->rx_pipe[i]);
        }
+       mutex_exit(&sc->sc_rx_mtx);
 
        sc->sc_running = false;
        if (disable)



Home | Main Index | Thread Index | Old Index