mac80211: backport brcmfmac fix for primary channel in 80 MHz mode
authorRafał Miłecki <zajec5@gmail.com>
Thu, 25 Feb 2016 20:24:47 +0000 (20:24 +0000)
committerRafał Miłecki <zajec5@gmail.com>
Thu, 25 Feb 2016 20:24:47 +0000 (20:24 +0000)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
SVN-Revision: 48782

package/kernel/mac80211/patches/323-0000-brcmfmac-fix-setting-primary-channel-for-80-MHz-widt.patch [new file with mode: 0644]
package/kernel/mac80211/patches/862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch

diff --git a/package/kernel/mac80211/patches/323-0000-brcmfmac-fix-setting-primary-channel-for-80-MHz-widt.patch b/package/kernel/mac80211/patches/323-0000-brcmfmac-fix-setting-primary-channel-for-80-MHz-widt.patch
new file mode 100644 (file)
index 0000000..9277b2c
--- /dev/null
@@ -0,0 +1,64 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Wed, 20 Jan 2016 16:46:04 +0100
+Subject: [PATCH] brcmfmac: fix setting primary channel for 80 MHz width
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+First of all it changes the way we calculate primary channel offset. If
+we use e.g. 80 MHz channel with primary frequency 5180 MHz (which means
+center frequency is 5210 MHz) it makes sense to calculate primary offset
+as -30 MHz.
+Then it fixes values we compare primary_offset with. We were comparing
+offset in MHz against -2 or 2 which was resulting in picking a wrong
+primary channel.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+@@ -247,7 +247,7 @@ static u16 chandef_to_chanspec(struct br
+       brcmf_dbg(TRACE, "chandef: control %d center %d width %d\n",
+                 ch->chan->center_freq, ch->center_freq1, ch->width);
+       ch_inf.chnum = ieee80211_frequency_to_channel(ch->center_freq1);
+-      primary_offset = ch->center_freq1 - ch->chan->center_freq;
++      primary_offset = ch->chan->center_freq - ch->center_freq1;
+       switch (ch->width) {
+       case NL80211_CHAN_WIDTH_20:
+       case NL80211_CHAN_WIDTH_20_NOHT:
+@@ -256,24 +256,21 @@ static u16 chandef_to_chanspec(struct br
+               break;
+       case NL80211_CHAN_WIDTH_40:
+               ch_inf.bw = BRCMU_CHAN_BW_40;
+-              if (primary_offset < 0)
++              if (primary_offset > 0)
+                       ch_inf.sb = BRCMU_CHAN_SB_U;
+               else
+                       ch_inf.sb = BRCMU_CHAN_SB_L;
+               break;
+       case NL80211_CHAN_WIDTH_80:
+               ch_inf.bw = BRCMU_CHAN_BW_80;
+-              if (primary_offset < 0) {
+-                      if (primary_offset < -CH_10MHZ_APART)
+-                              ch_inf.sb = BRCMU_CHAN_SB_UU;
+-                      else
+-                              ch_inf.sb = BRCMU_CHAN_SB_UL;
+-              } else {
+-                      if (primary_offset > CH_10MHZ_APART)
+-                              ch_inf.sb = BRCMU_CHAN_SB_LL;
+-                      else
+-                              ch_inf.sb = BRCMU_CHAN_SB_LU;
+-              }
++              if (primary_offset == -30)
++                      ch_inf.sb = BRCMU_CHAN_SB_LL;
++              else if (primary_offset == -10)
++                      ch_inf.sb = BRCMU_CHAN_SB_LU;
++              else if (primary_offset == 10)
++                      ch_inf.sb = BRCMU_CHAN_SB_UL;
++              else
++                      ch_inf.sb = BRCMU_CHAN_SB_UU;
+               break;
+       case NL80211_CHAN_WIDTH_80P80:
+       case NL80211_CHAN_WIDTH_160:
index 9aeb97e..4295b4b 100644 (file)
@@ -10,7 +10,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 
 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -618,9 +618,37 @@ static struct wireless_dev *brcmf_cfg802
+@@ -615,9 +615,37 @@ static struct wireless_dev *brcmf_cfg802
                                                     u32 *flags,
                                                     struct vif_params *params)
  {