Search Linux Wireless

Re: [PATCH 19/23] ath9k_htc: Handle BSSID/AID for multiple interfaces

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux