Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b96f93e authored by Vasanthakumar Thiagarajan's avatar Vasanthakumar Thiagarajan Committed by John W. Linville
Browse files

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: default avatarVasanthakumar Thiagarajan <vasanth@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent d31e20af
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -600,6 +600,7 @@ struct ath_softc {
	struct ath9k_debug debug;
#endif
	struct ath_bus_ops *bus_ops;
	struct ath_beacon_config cur_beacon_conf;
};

struct ath_wiphy {
+35 −28
Original line number Diff line number Diff line
@@ -695,36 +695,44 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc,
	sc->beacon.bmisscnt = 0;
	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);
}

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 */

	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) {
		struct ath_vif *avp = (struct ath_vif *)vif->drv_priv;
		struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;

		iftype = vif->type;

		switch(avp->av_opmode) {
		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, &conf);
		ath_beacon_config_ap(sc, cur_conf);
		break;
	case NL80211_IFTYPE_ADHOC:
	case NL80211_IFTYPE_MESH_POINT:
			ath_beacon_config_adhoc(sc, &conf, vif);
		ath_beacon_config_adhoc(sc, cur_conf, vif);
		break;
	case NL80211_IFTYPE_STATION:
			ath_beacon_config_sta(sc, &conf);
		ath_beacon_config_sta(sc, cur_conf);
		break;
	default:
		DPRINTF(sc, ATH_DBG_CONFIG,
@@ -734,4 +742,3 @@ void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)

	sc->sc_flags |= SC_OP_BEACONS;
}
}