ath9k: cleanup beacon parameters configuration
This patch configures the beacon timers with beacon interval and beacon period passed through vif.bss_conf. Also cache the currecnt beacon configuration which will be used to configure the beacon timers when the driver triggers it after reset. Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
d31e20af9f
commit
6b96f93e96
|
@ -600,6 +600,7 @@ struct ath_softc {
|
||||||
struct ath9k_debug debug;
|
struct ath9k_debug debug;
|
||||||
#endif
|
#endif
|
||||||
struct ath_bus_ops *bus_ops;
|
struct ath_bus_ops *bus_ops;
|
||||||
|
struct ath_beacon_config cur_beacon_conf;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ath_wiphy {
|
struct ath_wiphy {
|
||||||
|
|
|
@ -695,43 +695,50 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc,
|
||||||
sc->beacon.bmisscnt = 0;
|
sc->beacon.bmisscnt = 0;
|
||||||
ath9k_hw_set_interrupts(sc->sc_ah, sc->imask);
|
ath9k_hw_set_interrupts(sc->sc_ah, sc->imask);
|
||||||
|
|
||||||
if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)
|
/* FIXME: Handle properly when vif is NULL */
|
||||||
|
if (vif && sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)
|
||||||
ath_beacon_start_adhoc(sc, vif);
|
ath_beacon_start_adhoc(sc, vif);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)
|
void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct ath_beacon_config conf;
|
struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;
|
||||||
|
enum nl80211_iftype iftype;
|
||||||
|
|
||||||
/* Setup the beacon configuration parameters */
|
/* Setup the beacon configuration parameters */
|
||||||
|
|
||||||
memset(&conf, 0, sizeof(struct ath_beacon_config));
|
|
||||||
conf.beacon_interval = sc->beacon_interval ? : ATH_DEFAULT_BINTVAL;
|
|
||||||
conf.listen_interval = 1;
|
|
||||||
conf.dtim_period = conf.beacon_interval;
|
|
||||||
conf.dtim_count = 1;
|
|
||||||
conf.bmiss_timeout = ATH_DEFAULT_BMISS_LIMIT * conf.beacon_interval;
|
|
||||||
|
|
||||||
if (vif) {
|
if (vif) {
|
||||||
struct ath_vif *avp = (struct ath_vif *)vif->drv_priv;
|
struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
|
||||||
|
|
||||||
switch(avp->av_opmode) {
|
iftype = vif->type;
|
||||||
case NL80211_IFTYPE_AP:
|
|
||||||
ath_beacon_config_ap(sc, &conf);
|
|
||||||
break;
|
|
||||||
case NL80211_IFTYPE_ADHOC:
|
|
||||||
case NL80211_IFTYPE_MESH_POINT:
|
|
||||||
ath_beacon_config_adhoc(sc, &conf, vif);
|
|
||||||
break;
|
|
||||||
case NL80211_IFTYPE_STATION:
|
|
||||||
ath_beacon_config_sta(sc, &conf);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
DPRINTF(sc, ATH_DBG_CONFIG,
|
|
||||||
"Unsupported beaconing mode\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sc->sc_flags |= SC_OP_BEACONS;
|
cur_conf->beacon_interval = bss_conf->beacon_int;
|
||||||
|
cur_conf->dtim_period = bss_conf->dtim_period;
|
||||||
|
cur_conf->listen_interval = 1;
|
||||||
|
cur_conf->dtim_count = 1;
|
||||||
|
cur_conf->bmiss_timeout =
|
||||||
|
ATH_DEFAULT_BMISS_LIMIT * cur_conf->beacon_interval;
|
||||||
|
} else {
|
||||||
|
iftype = sc->sc_ah->opmode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
switch (iftype) {
|
||||||
|
case NL80211_IFTYPE_AP:
|
||||||
|
ath_beacon_config_ap(sc, cur_conf);
|
||||||
|
break;
|
||||||
|
case NL80211_IFTYPE_ADHOC:
|
||||||
|
case NL80211_IFTYPE_MESH_POINT:
|
||||||
|
ath_beacon_config_adhoc(sc, cur_conf, vif);
|
||||||
|
break;
|
||||||
|
case NL80211_IFTYPE_STATION:
|
||||||
|
ath_beacon_config_sta(sc, cur_conf);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
DPRINTF(sc, ATH_DBG_CONFIG,
|
||||||
|
"Unsupported beaconing mode\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sc->sc_flags |= SC_OP_BEACONS;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue