Date: Tue, 30 Nov 2004 03:31:34 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 66083 for review Message-ID: <200411300331.iAU3VYgh053785@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=66083 Change 66083 by sam@sam_ebb on 2004/11/30 03:31:17 cleanup stuck beacon handling a touch Affected files ... .. //depot/projects/wifi/sys/dev/ath/if_ath.c#31 edit .. //depot/projects/wifi/sys/dev/ath/if_athvar.h#12 edit Differences ... ==== //depot/projects/wifi/sys/dev/ath/if_ath.c#31 (text+ko) ==== @@ -120,6 +120,7 @@ static void ath_updateslot(struct ifnet *); static int ath_beacon_alloc(struct ath_softc *, struct ieee80211_node *); static void ath_beacon_proc(void *, int); +static void ath_beacon_stuck_proc(void *, int); static void ath_beacon_free(struct ath_softc *); static void ath_beacon_config(struct ath_softc *); static int ath_desc_alloc(struct ath_softc *); @@ -356,6 +357,7 @@ TASK_INIT(&sc->sc_rxorntask, 0, ath_rxorn_proc, sc); TASK_INIT(&sc->sc_fataltask, 0, ath_fatal_proc, sc); TASK_INIT(&sc->sc_bmisstask, 0, ath_bmiss_proc, sc); + TASK_INIT(&sc->sc_bstucktask, 0, ath_beacon_stuck_proc, sc); /* * Allocate hardware transmit queues: one queue for @@ -743,10 +745,7 @@ struct ath_softc *sc = arg; struct ifnet *ifp = &sc->sc_if; - if (sc->sc_bmisscount != 0) - if_printf(ifp, "stuck beacon; resetting\n"); - else - if_printf(ifp, "hardware error; resetting\n"); + if_printf(ifp, "hardware error; resetting\n"); ath_reset(ifp); } @@ -1811,7 +1810,7 @@ __func__, sc->sc_bmisscount); /* XXX reset if too many? */ if (sc->sc_bmisscount > 3) - taskqueue_enqueue(taskqueue_swi, &sc->sc_fataltask); + taskqueue_enqueue(taskqueue_swi, &sc->sc_bstucktask); return; } if (sc->sc_bmisscount != 0) { @@ -1857,7 +1856,7 @@ DPRINTF(sc, ATH_DEBUG_ANY, "%s: beacon queue %u did not stop?\n", __func__, sc->sc_bhalq); - /* XXX how to recover? reset? */ + /* NB: should never happen since we check above? */ } bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, BUS_DMASYNC_PREWRITE); @@ -1874,6 +1873,17 @@ sc->sc_bhalq, (caddr_t)bf->bf_daddr, bf->bf_desc); } +static void +ath_beacon_stuck_proc(void *arg, int pending) +{ + struct ath_softc *sc = arg; + struct ifnet *ifp = &sc->sc_if; + + if_printf(ifp, "stuck beacon; resetting (bmiss count %u)\n", + sc->sc_bmisscount); + ath_reset(ifp); +} + /* * Reclaim beacon resources. */ ==== //depot/projects/wifi/sys/dev/ath/if_athvar.h#12 (text+ko) ==== @@ -221,6 +221,7 @@ struct ath_buf *sc_bufptr; /* allocated buffer ptr */ struct ieee80211_beacon_offsets sc_boff;/* dynamic update state */ struct task sc_bmisstask; /* bmiss int processing */ + struct task sc_bstucktask; /* stuck beacon processing */ enum { OK, /* no change needed */ UPDATE, /* update pending */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200411300331.iAU3VYgh053785>