aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/wpi/if_wpi.c21
-rw-r--r--sys/dev/wpi/if_wpivar.h3
2 files changed, 17 insertions, 7 deletions
diff --git a/sys/dev/wpi/if_wpi.c b/sys/dev/wpi/if_wpi.c
index c70163eda406..ac7d676bacb3 100644
--- a/sys/dev/wpi/if_wpi.c
+++ b/sys/dev/wpi/if_wpi.c
@@ -532,6 +532,14 @@ wpi_attach(device_t dev)
TASK_INIT(&sc->sc_radioon_task, 0, wpi_radio_on, sc);
TASK_INIT(&sc->sc_start_task, 0, wpi_start_task, sc);
+ sc->sc_tq = taskqueue_create("wpi_taskq", M_WAITOK,
+ taskqueue_thread_enqueue, &sc->sc_tq);
+ error = taskqueue_start_threads(&sc->sc_tq, 1, 0, "wpi_taskq");
+ if (error != 0) {
+ device_printf(dev, "can't start threads, error %d\n", error);
+ goto fail;
+ }
+
wpi_sysctlattach(sc);
/*
@@ -688,6 +696,9 @@ wpi_detach(device_t dev)
wpi_stop(sc);
+ taskqueue_drain_all(sc->sc_tq);
+ taskqueue_free(sc->sc_tq);
+
callout_drain(&sc->watchdog_rfkill);
callout_drain(&sc->tx_timeout);
callout_drain(&sc->scan_timeout);
@@ -2387,8 +2398,6 @@ wpi_intr(void *arg)
WPI_WRITE(sc, WPI_FH_INT, r2);
if (r1 & (WPI_INT_SW_ERR | WPI_INT_HW_ERR)) {
- struct ieee80211com *ic = ifp->if_l2com;
-
device_printf(sc->sc_dev, "fatal firmware error\n");
#ifdef WPI_DEBUG
wpi_debug_registers(sc);
@@ -2397,7 +2406,7 @@ wpi_intr(void *arg)
DPRINTF(sc, WPI_DEBUG_HW,
"(%s)\n", (r1 & WPI_INT_SW_ERR) ? "(Software Error)" :
"(Hardware Error)");
- ieee80211_runtask(ic, &sc->sc_reinittask);
+ taskqueue_enqueue(sc->sc_tq, &sc->sc_reinittask);
goto end;
}
@@ -2950,10 +2959,9 @@ wpi_scan_timeout(void *arg)
{
struct wpi_softc *sc = arg;
struct ifnet *ifp = sc->sc_ifp;
- struct ieee80211com *ic = ifp->if_l2com;
if_printf(ifp, "scan timeout\n");
- ieee80211_runtask(ic, &sc->sc_reinittask);
+ taskqueue_enqueue(sc->sc_tq, &sc->sc_reinittask);
}
static void
@@ -2961,11 +2969,10 @@ wpi_tx_timeout(void *arg)
{
struct wpi_softc *sc = arg;
struct ifnet *ifp = sc->sc_ifp;
- struct ieee80211com *ic = ifp->if_l2com;
if_printf(ifp, "device timeout\n");
if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
- ieee80211_runtask(ic, &sc->sc_reinittask);
+ taskqueue_enqueue(sc->sc_tq, &sc->sc_reinittask);
}
static int
diff --git a/sys/dev/wpi/if_wpivar.h b/sys/dev/wpi/if_wpivar.h
index 4f91d58113fb..7c748250438e 100644
--- a/sys/dev/wpi/if_wpivar.h
+++ b/sys/dev/wpi/if_wpivar.h
@@ -228,6 +228,9 @@ struct wpi_softc {
struct task sc_radioon_task;
struct task sc_start_task;
+ /* Taskqueue */
+ struct taskqueue *sc_tq;
+
/* Eeprom info. */
uint8_t cap;
uint16_t rev;