On Mon, Feb 21, 2011 at 07:50:08AM +0530, Sujith wrote: > From: Sujith Manoharan <Sujith.Manoharan@xxxxxxxxxxx> > > The AID and BSSID should be set in the HW only for the > first station interface or adhoc interface. Also, cancel > the ANI timer in stop() for multi-STA scenario. And finally > configure the HW beacon timers only for the first station > interface. > > Signed-off-by: Sujith Manoharan <Sujith.Manoharan@xxxxxxxxxxx> > --- > drivers/net/wireless/ath/ath9k/htc_drv_beacon.c | 17 ++++++++- > drivers/net/wireless/ath/ath9k/htc_drv_main.c | 44 +++++++++++++++-------- > 2 files changed, 44 insertions(+), 17 deletions(-) > > diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c > index 007b99f..5238091 100644 > --- a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c > +++ b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c > @@ -123,8 +123,9 @@ static void ath9k_htc_beacon_config_sta(struct ath9k_htc_priv *priv, > /* TSF out of range threshold fixed at 1 second */ > bs.bs_tsfoor_threshold = ATH9K_TSFOOR_THRESHOLD; > > - ath_dbg(common, ATH_DBG_BEACON, "tsf: %llu tsftu: %u\n", tsf, tsftu); > - ath_dbg(common, ATH_DBG_BEACON, > + ath_dbg(common, ATH_DBG_CONFIG, "intval: %u tsf: %llu tsftu: %u\n", > + intval, tsf, tsftu); > + ath_dbg(common, ATH_DBG_CONFIG, > "bmiss: %u sleep: %u cfp-period: %u maxdur: %u next: %u\n", > bs.bs_bmissthreshold, bs.bs_sleepduration, > bs.bs_cfpperiod, bs.bs_cfpmaxduration, bs.bs_cfpnext); > @@ -341,6 +342,18 @@ void ath9k_htc_beacon_config(struct ath9k_htc_priv *priv, > return; > } > > + /* > + * The beacon paramters are configured only for the first > + * station interface. > + */ > + if ((priv->ah->opmode == NL80211_IFTYPE_STATION) && > + (priv->num_sta_vif > 1) && > + (vif->type == NL80211_IFTYPE_STATION)) { > + ath_dbg(common, ATH_DBG_CONFIG, > + "Beacon already configured for a station interface\n"); > + return; > + } > + This will not allow beacon config if your first station vif was not yet associated. > cur_conf->beacon_interval = bss_conf->beacon_int; > if (cur_conf->beacon_interval == 0) > cur_conf->beacon_interval = 100; > diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c > index 949af24..6ec9cb6 100644 > --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c > +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c > @@ -1603,30 +1603,44 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw, > struct ath9k_htc_priv *priv = hw->priv; > struct ath_hw *ah = priv->ah; > struct ath_common *common = ath9k_hw_common(ah); > + bool set_assoc; > > mutex_lock(&priv->mutex); > ath9k_htc_ps_wakeup(priv); > > + /* > + * Set the HW AID/BSSID only for the first station interface > + * or in IBSS mode. > + */ > + set_assoc = !!((priv->ah->opmode == NL80211_IFTYPE_ADHOC) || > + ((priv->ah->opmode == NL80211_IFTYPE_STATION) && > + (priv->num_sta_vif == 1))); > + > + Assume there are two station vifs where one is associated and another is not. In such case aid and ani is not configured. > if (changed & BSS_CHANGED_ASSOC) { > - common->curaid = bss_conf->assoc ? > - bss_conf->aid : 0; > - ath_dbg(common, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n", > - bss_conf->assoc); > + if (set_assoc) { > + ath_dbg(common, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n", > + bss_conf->assoc); > > - if (bss_conf->assoc) > - ath9k_htc_start_ani(priv); > - else > - ath9k_htc_stop_ani(priv); > + common->curaid = bss_conf->assoc ? > + bss_conf->aid : 0; > + > + if (bss_conf->assoc) > + ath9k_htc_start_ani(priv); > + else > + ath9k_htc_stop_ani(priv); > + } > } same here. > if (changed & BSS_CHANGED_BSSID) { > - /* Set BSSID */ > - memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN); > - ath9k_hw_write_associd(ah); > + if (set_assoc) { > + memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN); > + ath9k_hw_write_associd(ah); > > - ath_dbg(common, ATH_DBG_CONFIG, > - "BSSID: %pM aid: 0x%x\n", > - common->curbssid, common->curaid); > + ath_dbg(common, ATH_DBG_CONFIG, > + "BSSID: %pM aid: 0x%x\n", > + common->curbssid, common->curaid); > + } > } > > if ((changed & BSS_CHANGED_BEACON_ENABLED) && bss_conf->enable_beacon) { > -- > 1.7.4.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-wireless" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html