svn commit: r294842 - head/sys/dev/rtwn
Andriy Voskoboinyk
avos at FreeBSD.org
Tue Jan 26 16:51:01 UTC 2016
Author: avos
Date: Tue Jan 26 16:50:59 2016
New Revision: 294842
URL: https://svnweb.freebsd.org/changeset/base/294842
Log:
rtwn: do not start vap when initialization fails
- Start vap(s) (via ieee80211_start_all()) only when initialization
succeeds; stop the first vap otherwise (via ieee80211_stop());
- Do not try to stop a device multiple times
(move (sc->sc_flags & RTWN_RUNNING) check to urtwn_stop_locked()).
Tested by: kevlo
Reviewed by: kevlo
Approved by: adrian (mentor)
Differential Revision: https://reviews.freebsd.org/D5058
Modified:
head/sys/dev/rtwn/if_rtwn.c
Modified: head/sys/dev/rtwn/if_rtwn.c
==============================================================================
--- head/sys/dev/rtwn/if_rtwn.c Tue Jan 26 16:34:27 2016 (r294841)
+++ head/sys/dev/rtwn/if_rtwn.c Tue Jan 26 16:50:59 2016 (r294842)
@@ -185,7 +185,7 @@ static void rtwn_iq_calib_write_results(
static void rtwn_iq_calib(struct rtwn_softc *);
static void rtwn_lc_calib(struct rtwn_softc *);
static void rtwn_temp_calib(struct rtwn_softc *);
-static void rtwn_init_locked(struct rtwn_softc *);
+static int rtwn_init(struct rtwn_softc *);
static void rtwn_stop_locked(struct rtwn_softc *);
static void rtwn_stop(struct rtwn_softc *);
static void rtwn_intr(void *);
@@ -1845,19 +1845,15 @@ static void
rtwn_parent(struct ieee80211com *ic)
{
struct rtwn_softc *sc = ic->ic_softc;
- int startall = 0;
+ struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
- RTWN_LOCK(sc);
- if (ic->ic_nrunning> 0) {
- if (!(sc->sc_flags & RTWN_RUNNING)) {
- rtwn_init_locked(sc);
- startall = 1;
- }
- } else if (sc->sc_flags & RTWN_RUNNING)
- rtwn_stop_locked(sc);
- RTWN_UNLOCK(sc);
- if (startall)
- ieee80211_start_all(ic);
+ if (ic->ic_nrunning > 0) {
+ if (rtwn_init(sc) == 0)
+ ieee80211_start_all(ic);
+ else
+ ieee80211_stop(vap);
+ } else
+ rtwn_stop(sc);
}
static void
@@ -3218,8 +3214,8 @@ rtwn_temp_calib(struct rtwn_softc *sc)
}
}
-static void
-rtwn_init_locked(struct rtwn_softc *sc)
+static int
+rtwn_init(struct rtwn_softc *sc)
{
struct ieee80211com *ic = &sc->sc_ic;
struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
@@ -3227,7 +3223,13 @@ rtwn_init_locked(struct rtwn_softc *sc)
uint8_t macaddr[IEEE80211_ADDR_LEN];
int i, error;
- RTWN_LOCK_ASSERT(sc);
+ RTWN_LOCK(sc);
+
+ if (sc->sc_flags & RTWN_RUNNING) {
+ RTWN_UNLOCK(sc);
+ return 0;
+ }
+ sc->sc_flags |= RTWN_RUNNING;
/* Init firmware commands ring. */
sc->fwcur = 0;
@@ -3347,13 +3349,15 @@ rtwn_init_locked(struct rtwn_softc *sc)
/* Enable interrupts. */
rtwn_write_4(sc, R92C_HIMR, RTWN_INT_ENABLE);
- sc->sc_flags |= RTWN_RUNNING;
-
callout_reset(&sc->watchdog_to, hz, rtwn_watchdog, sc);
- return;
fail:
- rtwn_stop_locked(sc);
+ if (error != 0)
+ rtwn_stop_locked(sc);
+
+ RTWN_UNLOCK(sc);
+
+ return error;
}
static void
@@ -3364,6 +3368,9 @@ rtwn_stop_locked(struct rtwn_softc *sc)
RTWN_LOCK_ASSERT(sc);
+ if (!(sc->sc_flags & RTWN_RUNNING))
+ return;
+
sc->sc_tx_timer = 0;
callout_stop(&sc->watchdog_to);
callout_stop(&sc->calib_to);
More information about the svn-src-all
mailing list