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 Move queueing of rx xfers to attach.
details: https://anonhg.NetBSD.org/src-all/rev/edb462ed05f4
branches: trunk
changeset: 939787:edb462ed05f4
user: Nathanial Sloss <nat%netbsd.org@localhost>
date: Sun May 03 22:40:36 2020 +1000
description:
Move queueing of rx xfers to attach.
Move abort pipes to detach.
diffstat:
sys/dev/usb/if_urtwn.c | 68 +++++++++++++++++++++++++-------------------------
1 files changed, 34 insertions(+), 34 deletions(-)
diffs (135 lines):
diff -r 0e716d2caa71 -r edb462ed05f4 sys/dev/usb/if_urtwn.c
--- a/sys/dev/usb/if_urtwn.c Sun May 03 21:46:42 2020 +1000
+++ b/sys/dev/usb/if_urtwn.c Sun May 03 22:40:36 2020 +1000
@@ -384,6 +384,7 @@
struct urtwn_softc *sc = device_private(self);
struct ieee80211com *ic = &sc->sc_ic;
struct usb_attach_arg *uaa = aux;
+ struct urtwn_rx_data *data;
char *devinfop;
const struct urtwn_dev *dev;
usb_device_request_t req;
@@ -614,6 +615,21 @@
goto fail;
}
+ /* Queue Rx xfers. */
+ for (size_t j = 0; j < sc->rx_npipe; j++) {
+ mutex_enter(&sc->sc_rx_mtx);
+ TAILQ_FOREACH(data, &sc->rx_free_list[j], next) {
+ usbd_setup_xfer(data->xfer, data, data->buf,
+ URTWN_RXBUFSZ, USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT,
+ urtwn_rxeof);
+ error = usbd_transfer(data->xfer);
+ if (__predict_false(error != USBD_NORMAL_COMPLETION &&
+ error != USBD_IN_PROGRESS))
+ goto fail;
+ }
+ mutex_exit(&sc->sc_rx_mtx);
+ }
+
return;
fail:
@@ -628,6 +644,7 @@
struct ieee80211com *ic = &sc->sc_ic;
struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
struct ifnet *ifp = vap->iv_ifp;
+ size_t i;
int s;
DPRINTFN(DBG_FN, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
@@ -655,6 +672,22 @@
urtwn_close_pipes(sc);
}
+ 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);
+
/* Free Tx/Rx buffers. */
urtwn_free_tx_list(sc);
urtwn_free_rx_list(sc);
@@ -897,8 +930,8 @@
return 0;
fail:
+ mutex_exit(&sc->sc_tx_mtx);
urtwn_free_tx_list(sc);
- mutex_exit(&sc->sc_tx_mtx);
return error;
}
@@ -5496,7 +5529,6 @@
struct ieee80211com *ic = vap->iv_ic;
struct ifmediareq imr;
struct urtwn_softc *sc = ic->ic_softc;
- struct urtwn_rx_data *data;
uint32_t reg;
int error;
@@ -5712,21 +5744,6 @@
/* Set default channel. */
urtwn_set_chan(sc, ic->ic_curchan, IEEE80211_HTINFO_2NDCHAN_NONE);
- /* Queue Rx xfers. */
- for (size_t j = 0; j < sc->rx_npipe; j++) {
- mutex_enter(&sc->sc_rx_mtx);
- TAILQ_FOREACH(data, &sc->rx_free_list[j], next) {
- usbd_setup_xfer(data->xfer, data, data->buf,
- URTWN_RXBUFSZ, USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT,
- urtwn_rxeof);
- error = usbd_transfer(data->xfer);
- if (__predict_false(error != USBD_NORMAL_COMPLETION &&
- error != USBD_IN_PROGRESS))
- goto fail;
- }
- mutex_exit(&sc->sc_rx_mtx);
- }
-
/* We're ready to go. */
ifp->if_flags &= ~IFF_OACTIVE;
ifp->if_flags |= IFF_RUNNING;
@@ -5766,7 +5783,6 @@
struct ieee80211vap *vap = ifp->if_softc;
struct ieee80211com *ic = vap->iv_ic;
struct urtwn_softc *sc = ic->ic_softc;
- size_t i;
int s;
DPRINTFN(DBG_FN, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
@@ -5783,22 +5799,6 @@
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)
urtwn_chip_stop(sc);
Home |
Main Index |
Thread Index |
Old Index