From owner-svn-src-all@FreeBSD.ORG Sun Mar 15 21:32:12 2015 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 304D6DFE; Sun, 15 Mar 2015 21:32:12 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 11CB0AC2; Sun, 15 Mar 2015 21:32:12 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t2FLWBd0095776; Sun, 15 Mar 2015 21:32:11 GMT (envelope-from adrian@FreeBSD.org) Received: (from adrian@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t2FLWBaw095774; Sun, 15 Mar 2015 21:32:11 GMT (envelope-from adrian@FreeBSD.org) Message-Id: <201503152132.t2FLWBaw095774@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: adrian set sender to adrian@FreeBSD.org using -f From: Adrian Chadd Date: Sun, 15 Mar 2015 21:32:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r280120 - head/sys/dev/wpi X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 15 Mar 2015 21:32:12 -0000 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 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;