On 04/26/2018 02:43 AM, s.gottsch...@dd-wrt.com wrote:
From: Sebastian Gottschall <s.gottsch...@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 <gree...@candelatech.com>
Candela Technologies Inc  http://www.candelatech.com

Reply via email to