Date: Mon, 3 Jan 2005 22:27:31 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 68225 for review Message-ID: <200501032227.j03MRVPO057672@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=68225 Change 68225 by sam@sam_ebb on 2005/01/03 22:26:43 more frivolous futzing with fine leds: o fix edge case where marking the interface down in the middle of a blink stopped future blinks o add hearbeat blink when otherwise idle (interval is controllable for now fine tuning) o make rx events be triggered by data frames instead of !beacon frames; this is closer to how other devices work Affected files ... .. //depot/projects/wifi/sys/dev/ath/if_ath.c#55 edit .. //depot/projects/wifi/sys/dev/ath/if_athvar.h#23 edit Differences ... ==== //depot/projects/wifi/sys/dev/ath/if_ath.c#55 (text+ko) ==== @@ -96,6 +96,7 @@ enum { ATH_LED_TX, ATH_LED_RX, + ATH_LED_POLL, }; static void ath_init(void *); @@ -446,7 +447,10 @@ goto bad2; } + sc->sc_blinking = 0; sc->sc_ledstate = 1; + sc->sc_ledon = 0; /* low true */ + sc->sc_ledidle = (2700*hz)/1000; /* 2.7sec */ callout_init(&sc->sc_ledtimer, CALLOUT_MPSAFE); /* * Auto-enable soft led processing for IBM cards and for @@ -455,7 +459,6 @@ */ sc->sc_softled = (devid == AR5212_DEVID_IBM || devid == AR5211_DEVID); if (sc->sc_softled) { - sc->sc_ledon = 0; /* low true */ ath_hal_gpioCfgOutput(ah, sc->sc_ledpin); ath_hal_gpioset(ah, sc->sc_ledpin, !sc->sc_ledon); } @@ -945,6 +948,7 @@ callout_stop(&sc->sc_ledtimer); ath_hal_gpioset(ah, sc->sc_ledpin, !sc->sc_ledon); + sc->sc_blinking = 0; } ath_hal_intrset(ah, 0); } @@ -2723,16 +2727,17 @@ if (sc->sc_softled) { /* - * Blink for any non-beacon frames. We decide if - * this was a beacon frame by monitoring the stats - * which means we'll blink for things like ACK frames - * when in monitor mode--probably not what we want. + * Blink for any data frame. Otherwise do a + * heartbeat-style blink when idle. The latter + * is mainly for station mode where we depend on + * periodic beacon frames to trigger the poll event. */ - if (sc->sc_beacon == ic->ic_stats.is_rx_beacon) { + if (sc->sc_ipackets != ifp->if_ipackets) { + sc->sc_ipackets = ifp->if_ipackets; sc->sc_rxrate = ds->ds_rxstat.rs_rate; ath_led_event(sc, ATH_LED_RX); - } else - sc->sc_beacon = ic->ic_stats.is_rx_beacon; + } else if (ticks - sc->sc_ledevent >= sc->sc_ledidle) + ath_led_event(sc, ATH_LED_POLL); } /* @@ -4064,9 +4069,15 @@ static void ath_led_event(struct ath_softc *sc, int event) { + + sc->sc_ledevent = ticks; /* time of last event */ if (sc->sc_blinking) /* don't interrupt active blink */ return; switch (event) { + case ATH_LED_POLL: + ath_led_blink(sc, sc->sc_hwmap[0].ledon, + sc->sc_hwmap[0].ledoff); + break; case ATH_LED_TX: ath_led_blink(sc, sc->sc_hwmap[sc->sc_txrate].ledon, sc->sc_hwmap[sc->sc_txrate].ledoff); @@ -4458,9 +4469,12 @@ return error; softled = (softled != 0); if (softled != sc->sc_softled) { - if (softled) + if (softled) { + /* NB: handle any sc_ledpin change */ ath_hal_gpioCfgOutput(sc->sc_ah, sc->sc_ledpin); - ath_hal_gpioset(sc->sc_ah, sc->sc_ledpin, !sc->sc_ledon); + ath_hal_gpioset(sc->sc_ah, sc->sc_ledpin, + !sc->sc_ledon); + } sc->sc_softled = softled; } return 0; @@ -4574,6 +4588,9 @@ "ledon", CTLFLAG_RW, &sc->sc_ledon, 0, "setting to turn LED on"); SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, + "ledidle", CTLFLAG_RW, &sc->sc_ledidle, 0, + "idle time for inactivity LED (ticks)"); + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "txantenna", CTLFLAG_RW, &sc->sc_txantenna, 0, "tx antenna (0=auto)"); SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, ==== //depot/projects/wifi/sys/dev/ath/if_athvar.h#23 (text+ko) ==== @@ -197,7 +197,9 @@ u_int sc_ledpin; /* GPIO pin for driving LED */ u_int sc_ledon; /* pin setting for LED on */ - u_int32_t sc_beacon; /* last beacon count */ + u_int sc_ledidle; /* idle polling interval */ + u_int32_t sc_ipackets; /* last data packet count */ + int sc_ledevent; /* time of last LED event */ u_int8_t sc_rxrate; /* current rx rate for LED */ u_int8_t sc_txrate; /* current tx rate for LED */ u_int16_t sc_ledoff; /* off time for current blink */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200501032227.j03MRVPO057672>