From e2ad437112b0680f60f75e34faf69d53a9980960 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sun, 15 Mar 2015 21:32:11 +0000 Subject: [PATCH] Add a new taskqueue (device specific, not net80211 ic->tq); use it for device restart. (Committers note - once scan overhaul and a few other things have been fixed in net80211 to not block things in the taskqueue, this can disappear and the device specific taskqueues in other drivers can also go away.) PR: kern/197143 Submitted by: Andriy Voskoboinyk --- sys/dev/wpi/if_wpi.c | 21 ++++++++++++++------- sys/dev/wpi/if_wpivar.h | 3 +++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/sys/dev/wpi/if_wpi.c b/sys/dev/wpi/if_wpi.c index c70163eda40..ac7d676bacb 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 4f91d58113f..7c748250438 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;