[PATCH v1] ath10k: fix band_center_freq handling for VHT160 in recent firmwares

Ben Greear greearb at candelatech.com
Thu Apr 26 06:44:00 PDT 2018



On 04/26/2018 02:43 AM, s.gottschall at dd-wrt.com wrote:
> From: Sebastian Gottschall <s.gottschall at dd-wrt.com>
>
> starting with firmware 10.4.3.4.x series QCA changed the handling of the channel property band_center_freq1 and band_center_freq2 in vht160 operation mode
> likelly for backward compatiblity with vht80 only capable clients.
> this patch adjusts the handling to get vht160 to work again with official qca firmwares newer than 3.3
> consider that this patch will not work with older firmwares anymore. to avoid undefined behaviour this we disable vht160 capability for outdated firmwares

We should be able to use a feature-flag or otherwise determine if the firmware needs the old or new
API and make the driver able to handle both.

Thanks,
Ben

> ---
>  drivers/net/wireless/ath/ath10k/mac.c |  7 -------
>  drivers/net/wireless/ath/ath10k/wmi.c | 11 ++++++++---
>  2 files changed, 8 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
> index 5be6386ede8f..d1239d40ac19 100644
> --- a/drivers/net/wireless/ath/ath10k/mac.c
> +++ b/drivers/net/wireless/ath/ath10k/mac.c
> @@ -4449,13 +4449,6 @@ static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
>  		vht_cap.cap |= val;
>  	}
>
> -	/* Currently the firmware seems to be buggy, don't enable 80+80
> -	 * mode until that's resolved.
> -	 */
> -	if ((ar->vht_cap_info & IEEE80211_VHT_CAP_SHORT_GI_160) &&
> -	    (ar->vht_cap_info & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) == 0)
> -		vht_cap.cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
> -
>  	mcs_map = 0;
>  	for (i = 0; i < 8; i++) {
>  		if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i)))
> diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
> index 2c36256a441d..d78b8857a513 100644
> --- a/drivers/net/wireless/ath/ath10k/wmi.c
> +++ b/drivers/net/wireless/ath/ath10k/wmi.c
> @@ -1671,13 +1671,18 @@ void ath10k_wmi_put_wmi_channel(struct wmi_channel *ch,
>  		flags |= WMI_CHAN_FLAG_HT40_PLUS;
>  	if (arg->chan_radar)
>  		flags |= WMI_CHAN_FLAG_DFS;
> -
> +	ch->band_center_freq2 = 0;
>  	ch->mhz = __cpu_to_le32(arg->freq);
>  	ch->band_center_freq1 = __cpu_to_le32(arg->band_center_freq1);
>  	if (arg->mode == MODE_11AC_VHT80_80)
>  		ch->band_center_freq2 = __cpu_to_le32(arg->band_center_freq2);
> -	else
> -		ch->band_center_freq2 = 0;
> +	if (arg->mode == MODE_11AC_VHT160)  {
> +		if (arg->freq < arg->band_center_freq1)
> +			ch->band_center_freq1 = __cpu_to_le32(arg->band_center_freq1 - 40);
> +		else
> +			ch->band_center_freq1 = __cpu_to_le32(arg->band_center_freq1 + 40);		
> +		ch->band_center_freq2 = __cpu_to_le32(arg->band_center_freq1);
> +	}
>  	ch->min_power = arg->min_power;
>  	ch->max_power = arg->max_power;
>  	ch->reg_power = arg->max_reg_power;
>

-- 
Ben Greear <greearb at candelatech.com>
Candela Technologies Inc  http://www.candelatech.com



More information about the ath10k mailing list