Author: adrian
Date: Sun Mar 15 20:45:43 2015
New Revision: 280078
URL: https://svnweb.freebsd.org/changeset/base/280078

Log:
  wpi_tx_done() shouldn't wait for wpi_start().
  
  PR:           kern/197143
  Submitted by: Andriy Voskoboinyk <s3er...@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 20:44:52 2015        (r280077)
+++ head/sys/dev/wpi/if_wpi.c   Sun Mar 15 20:45:43 2015        (r280078)
@@ -195,6 +195,7 @@ static int  wpi_raw_xmit(struct ieee80211
                    const struct ieee80211_bpf_params *);
 static void    wpi_start(struct ifnet *);
 static void    wpi_start_locked(struct ifnet *);
+static void    wpi_start_task(void *, int);
 static void    wpi_watchdog_rfkill(void *);
 static void    wpi_watchdog(void *);
 static int     wpi_ioctl(struct ifnet *, u_long, caddr_t);
@@ -515,6 +516,7 @@ wpi_attach(device_t dev)
        TASK_INIT(&sc->sc_reinittask, 0, wpi_hw_reset, sc);
        TASK_INIT(&sc->sc_radiooff_task, 0, wpi_radio_off, sc);
        TASK_INIT(&sc->sc_radioon_task, 0, wpi_radio_on, sc);
+       TASK_INIT(&sc->sc_start_task, 0, wpi_start_task, sc);
 
        wpi_sysctlattach(sc);
 
@@ -644,6 +646,7 @@ wpi_detach(device_t dev)
                ieee80211_draintask(ic, &sc->sc_reinittask);
                ieee80211_draintask(ic, &sc->sc_radiooff_task);
                ieee80211_draintask(ic, &sc->sc_radioon_task);
+               ieee80211_draintask(ic, &sc->sc_start_task);
 
                wpi_stop(sc);
 
@@ -1901,6 +1904,7 @@ wpi_tx_done(struct wpi_softc *sc, struct
        struct mbuf *m;
        struct ieee80211_node *ni;
        struct ieee80211vap *vap;
+       struct ieee80211com *ic;
        int ackfailcnt = stat->ackfailcnt / 2;  /* wpi_mrr_setup() */
        int status = le32toh(stat->status);
 
@@ -1919,6 +1923,7 @@ wpi_tx_done(struct wpi_softc *sc, struct
        m = data->m, data->m = NULL;
        ni = data->ni, data->ni = NULL;
        vap = ni->ni_vap;
+       ic = vap->iv_ic;
 
        /*
         * Update rate control statistics for the node.
@@ -1943,7 +1948,7 @@ wpi_tx_done(struct wpi_softc *sc, struct
                if (sc->qfullmsk == 0 &&
                    (ifp->if_drv_flags & IFF_DRV_OACTIVE)) {
                        ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
-                       wpi_start_locked(ifp);
+                       ieee80211_runtask(ic, &sc->sc_start_task);
                }
        }
 
@@ -2789,6 +2794,15 @@ wpi_start_locked(struct ifnet *ifp)
 }
 
 static void
+wpi_start_task(void *arg0, int pending)
+{
+       struct wpi_softc *sc = arg0;
+       struct ifnet *ifp = sc->sc_ifp;
+
+       wpi_start(ifp);
+}
+
+static void
 wpi_watchdog_rfkill(void *arg)
 {
        struct wpi_softc *sc = arg;

Modified: head/sys/dev/wpi/if_wpivar.h
==============================================================================
--- head/sys/dev/wpi/if_wpivar.h        Sun Mar 15 20:44:52 2015        
(r280077)
+++ head/sys/dev/wpi/if_wpivar.h        Sun Mar 15 20:45:43 2015        
(r280078)
@@ -209,6 +209,7 @@ struct wpi_softc {
        struct task             sc_reinittask;
        struct task             sc_radiooff_task;
        struct task             sc_radioon_task;
+       struct task             sc_start_task;
 
        /* Eeprom info. */
        uint8_t                 cap;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to