Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 15 Mar 2015 21:32:11 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r280120 - head/sys/dev/wpi
Message-ID:  <201503152132.t2FLWBaw095774@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Sun Mar 15 21:32:11 2015
New Revision: 280120
URL: https://svnweb.freebsd.org/changeset/base/280120

Log:
  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 <s3erios@gmail.com>

Modified:
  head/sys/dev/wpi/if_wpi.c
  head/sys/dev/wpi/if_wpivar.h

Modified: head/sys/dev/wpi/if_wpi.c
==============================================================================
--- head/sys/dev/wpi/if_wpi.c	Sun Mar 15 21:30:20 2015	(r280119)
+++ head/sys/dev/wpi/if_wpi.c	Sun Mar 15 21:32:11 2015	(r280120)
@@ -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

Modified: head/sys/dev/wpi/if_wpivar.h
==============================================================================
--- head/sys/dev/wpi/if_wpivar.h	Sun Mar 15 21:30:20 2015	(r280119)
+++ head/sys/dev/wpi/if_wpivar.h	Sun Mar 15 21:32:11 2015	(r280120)
@@ -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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201503152132.t2FLWBaw095774>