if (an != NULL) {
memset(an, 0, space);
an->an_decomp_index = INVALID_DECOMP_INDEX;
- an->an_halstats.ns_avgbrssi = ATH_RSSI_DUMMY_MARKER;
- an->an_halstats.ns_avgrssi = ATH_RSSI_DUMMY_MARKER;
- an->an_halstats.ns_avgtxrssi = ATH_RSSI_DUMMY_MARKER;
+ an->an_avgrssi = ATH_RSSI_DUMMY_MARKER;
/*
* ath_rate_node_init needs a vap pointer in node
* to decide which mgt rate to use
#define HAL_EP_RND(x, mul) \
((((x) % (mul)) >= ((mul) / 2)) ? ((x) + ((mul) - 1)) / \
(mul) : (x)/(mul))
- u_int32_t avgrssi = ATH_NODE_CONST(ni)->an_halstats.ns_avgrssi;
+ u_int32_t avgrssi = ATH_NODE_CONST(ni)->an_avgrssi;
int32_t rssi;
/*
switch (subtype) {
case IEEE80211_FC0_SUBTYPE_BEACON:
- /* Update RSSI statistics for use by the HAL. */
- ATH_RSSI_LPF(ATH_NODE(ni)->an_halstats.ns_avgbrssi, rssi);
+ /* Update beacon RSSI statistics, (apply to "pure" STA only)
+ * AND only for our AP's beacons */
+ if(vap->iv_opmode == IEEE80211_M_STA &&
+ sc->sc_ic.ic_opmode == IEEE80211_M_STA &&
+ ni == vap->iv_bss)
+ ATH_RSSI_LPF(sc->sc_halstats.ns_avgbrssi, rssi);
if ((sc->sc_syncbeacon ||
(vap->iv_flags_ext & IEEE80211_FEXT_APPIE_UPDATE)) &&
ni == vap->iv_bss && vap->iv_state == IEEE80211_S_RUN) {
/* Fast path: node is present in the key map;
* grab a reference for processing the frame. */
ni = ieee80211_ref_node(ni);
- ATH_RSSI_LPF(ATH_NODE(ni)->an_halstats.ns_avgrssi, rs->rs_rssi);
type = ieee80211_input(ni->ni_vap, ni, skb, rs->rs_rssi, bf->bf_tsf);
ieee80211_unref_node(&ni);
} else {
(const struct ieee80211_frame_min *)skb->data);
if (ni != NULL) {
ieee80211_keyix_t keyix;
-
- ATH_RSSI_LPF(ATH_NODE(ni)->an_halstats.ns_avgrssi, rs->rs_rssi);
type = ieee80211_input(ni->ni_vap, ni, skb, rs->rs_rssi, bf->bf_tsf);
/*
* If the station has a key cache slot assigned
if (ts->ts_rate & HAL_TXSTAT_ALTRATE)
sc->sc_stats.ast_tx_altrate++;
sc->sc_stats.ast_tx_rssi = ts->ts_rssi;
- ATH_RSSI_LPF(an->an_halstats.ns_avgtxrssi,
- ts->ts_rssi);
+ /* Update HAL stats for ANI, only when on-channel */
+ if (!sc->sc_scanning &&
+ !(sc->sc_ic.ic_flags & IEEE80211_F_SCAN))
+ ATH_RSSI_LPF(sc->sc_halstats.ns_avgtxrssi,
+ ts->ts_rssi);
if (bf->bf_skb->priority == WME_AC_VO ||
bf->bf_skb->priority == WME_AC_VI)
ni->ni_ic->ic_wme.wme_hipri_traffic++;
if (vap->iv_opmode == IEEE80211_M_MONITOR) {
/* nothing to do */;
} else if (nstate == IEEE80211_S_RUN) {
+ /*
+ * Reset RSSI stats (regardless of mode)...
+ */
+ sc->sc_halstats.ns_avgbrssi = ATH_RSSI_DUMMY_MARKER;
+ sc->sc_halstats.ns_avgrssi = ATH_RSSI_DUMMY_MARKER;
+ sc->sc_halstats.ns_avgtxrssi = ATH_RSSI_DUMMY_MARKER;
+
DPRINTF(sc, ATH_DEBUG_STATE,
"%s->%s: ic_flags=0x%08x iv=%d BSSID=" MAC_FMT
" capinfo=0x%04x chan=%d\n",
break;
}
- /*
- * Reset rssi stats; maybe not the best place...
- */
- sc->sc_halstats.ns_avgbrssi = ATH_RSSI_DUMMY_MARKER;
- sc->sc_halstats.ns_avgrssi = ATH_RSSI_DUMMY_MARKER;
- sc->sc_halstats.ns_avgtxrssi = ATH_RSSI_DUMMY_MARKER;
/* if it is a DFS channel and has not been checked for radar
* do not let the 80211 state machine to go to RUN state. */
if (sc->sc_dfs_cac &&
/* Invoke the parent method to complete the work. */
error = avp->av_newstate(vap, nstate, arg);
+ /* Reset halstats on state change (per freebsd sources) */
+ sc->sc_halstats.ns_avgbrssi = ATH_RSSI_DUMMY_MARKER;
+ sc->sc_halstats.ns_avgrssi = ATH_RSSI_DUMMY_MARKER;
+ sc->sc_halstats.ns_avgtxrssi = ATH_RSSI_DUMMY_MARKER;
/* Finally, start any timers. */
if ((nstate == IEEE80211_S_RUN) && !sc->sc_beacon_cal) {
/* start periodic recalibration timer */