/* * Update rate-control state on station associate/reassociate. */ int ath_rate_newassoc(struct ath_softc *sc, struct ath_node *an, int isnew, unsigned int capflag, struct ieee80211_rateset *negotiated_rates, struct ieee80211_rateset *negotiated_htrates) { struct ieee80211_rateset *pRates = negotiated_rates; struct atheros_node *oan = an->an_rc_node; struct atheros_softc *asc = oan->asc; int txrate = 0; if (capflag & ATH_RC_UAPSD_FLAG) { oan->uapsd = 1; } else { oan->uapsd = 0; } if (sc->sc_ah->ah_magic == 0x19641014 || sc->sc_ah->ah_magic == 0x19741014) { return (ath_rate_newassoc_11n(sc, an, isnew, capflag, negotiated_rates, negotiated_htrates)); } if (isnew) { rcSibUpdate(asc, oan, 0, pRates, sc->sc_curmode); if(oan->txRateCtrl.maxValidRate) { /* Update minimum rate index in sc */ sc->sc_minrateix = oan->txRateCtrl.validRateIndex[0]; } /* * Set an initial tx rate for the net80211 layer. * Even though noone uses it, it wants to validate * the setting before entering RUN state so if there * was a pervious setting from a different node it * may be invalid. */ if (asc->fixedrix != IEEE80211_FIXED_RATE_NONE) { if (sc->sc_rixmap[asc->fixedrix] != 0xff) txrate = sc->sc_rixmap[asc->fixedrix]; } if (sc->sc_ieee_ops->update_txrate) { sc->sc_ieee_ops->update_txrate(an->an_node, txrate); } } return 0; }
void ath_rate_newassoc(struct ath_softc_tgt *sc, struct ath_node_target *an, int isnew, unsigned int capflag, struct ieee80211_rate *rs) { ath_rate_newassoc_11n(sc, an, isnew, capflag, rs); }