[source] mac80211: pending brcmfmac patches cleaning channels management

LEDE Commits lede-commits at lists.infradead.org
Tue Jan 10 08:20:05 PST 2017


rmilecki pushed a commit to source.git, branch master:
https://git.lede-project.org/f714fe46a97a8a0b1404bc6e58c45a281b97b099

commit f714fe46a97a8a0b1404bc6e58c45a281b97b099
Author: Rafał Miłecki <rafal at milecki.pl>
AuthorDate: Tue Jan 10 17:18:01 2017 +0100

    mac80211: pending brcmfmac patches cleaning channels management
    
    They prepare brcmfmac for using wiphy_read_of_freq_limits.
    
    Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
---
 ...oid-writing-channel-out-of-allocated-arra.patch | 100 +++++++++++++++++++++
 ...mac-don-t-preset-all-channels-as-disabled.patch |  34 +++++++
 ...tup-wiphy-bands-after-registering-it-firs.patch |  49 ++++++++++
 ...brcmfmac-make-brcmf_of_probe-more-generic.patch |  72 +++++++++++++++
 ...rkaround-bug-with-some-inconsistent-BSSes.patch |   2 +-
 .../862-brcmfmac-Disable-power-management.patch    |   2 +-
 6 files changed, 257 insertions(+), 2 deletions(-)

diff --git a/package/kernel/mac80211/patches/840-brcmfmac-avoid-writing-channel-out-of-allocated-arra.patch b/package/kernel/mac80211/patches/840-brcmfmac-avoid-writing-channel-out-of-allocated-arra.patch
new file mode 100644
index 0000000..8456a13
--- /dev/null
+++ b/package/kernel/mac80211/patches/840-brcmfmac-avoid-writing-channel-out-of-allocated-arra.patch
@@ -0,0 +1,100 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal at milecki.pl>
+Date: Wed, 4 Jan 2017 12:09:41 +0100
+Subject: [PATCH] brcmfmac: avoid writing channel out of allocated array
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Our code was assigning number of channels to the index variable by
+default. If firmware reported channel we didn't predict this would
+result in using that initial index value and writing out of array. This
+never happened so far (we got a complete list of supported channels) but
+it means possible memory corruption so we should handle it anyway.
+
+This patch simply detects unexpected channel and ignores it.
+
+As we don't try to create new entry now, it's also safe to drop hw_value
+and center_freq assignment. For known channels we have these set anyway.
+
+I decided to fix this issue by assigning NULL or a target channel to the
+channel variable. This was one of possible ways, I prefefred this one as
+it also avoids using channel[index] over and over.
+
+Fixes: 58de92d2f95e ("brcmfmac: use static superset of channels for wiphy bands")
+Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
+Acked-by: Arend van Spriel <arend.vanspriel at broadcom.com>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+@@ -5913,7 +5913,6 @@ static int brcmf_construct_chaninfo(stru
+ 	u32 i, j;
+ 	u32 total;
+ 	u32 chaninfo;
+-	u32 index;
+ 
+ 	pbuf = kzalloc(BRCMF_DCMD_MEDLEN, GFP_KERNEL);
+ 
+@@ -5961,33 +5960,36 @@ static int brcmf_construct_chaninfo(stru
+ 		    ch.bw == BRCMU_CHAN_BW_80)
+ 			continue;
+ 
+-		channel = band->channels;
+-		index = band->n_channels;
++		channel = NULL;
+ 		for (j = 0; j < band->n_channels; j++) {
+-			if (channel[j].hw_value == ch.control_ch_num) {
+-				index = j;
++			if (band->channels[j].hw_value == ch.control_ch_num) {
++				channel = &band->channels[j];
+ 				break;
+ 			}
+ 		}
+-		channel[index].center_freq =
+-			ieee80211_channel_to_frequency(ch.control_ch_num,
+-						       band->band);
+-		channel[index].hw_value = ch.control_ch_num;
++		if (!channel) {
++			/* It seems firmware supports some channel we never
++			 * considered. Something new in IEEE standard?
++			 */
++			brcmf_err("Ignoring unexpected firmware channel %d\n",
++				  ch.control_ch_num);
++			continue;
++		}
+ 
+ 		/* assuming the chanspecs order is HT20,
+ 		 * HT40 upper, HT40 lower, and VHT80.
+ 		 */
+ 		if (ch.bw == BRCMU_CHAN_BW_80) {
+-			channel[index].flags &= ~IEEE80211_CHAN_NO_80MHZ;
++			channel->flags &= ~IEEE80211_CHAN_NO_80MHZ;
+ 		} else if (ch.bw == BRCMU_CHAN_BW_40) {
+-			brcmf_update_bw40_channel_flag(&channel[index], &ch);
++			brcmf_update_bw40_channel_flag(channel, &ch);
+ 		} else {
+ 			/* enable the channel and disable other bandwidths
+ 			 * for now as mentioned order assure they are enabled
+ 			 * for subsequent chanspecs.
+ 			 */
+-			channel[index].flags = IEEE80211_CHAN_NO_HT40 |
+-					       IEEE80211_CHAN_NO_80MHZ;
++			channel->flags = IEEE80211_CHAN_NO_HT40 |
++					 IEEE80211_CHAN_NO_80MHZ;
+ 			ch.bw = BRCMU_CHAN_BW_20;
+ 			cfg->d11inf.encchspec(&ch);
+ 			chaninfo = ch.chspec;
+@@ -5995,11 +5997,11 @@ static int brcmf_construct_chaninfo(stru
+ 						       &chaninfo);
+ 			if (!err) {
+ 				if (chaninfo & WL_CHAN_RADAR)
+-					channel[index].flags |=
++					channel->flags |=
+ 						(IEEE80211_CHAN_RADAR |
+ 						 IEEE80211_CHAN_NO_IR);
+ 				if (chaninfo & WL_CHAN_PASSIVE)
+-					channel[index].flags |=
++					channel->flags |=
+ 						IEEE80211_CHAN_NO_IR;
+ 			}
+ 		}
diff --git a/package/kernel/mac80211/patches/841-brcmfmac-don-t-preset-all-channels-as-disabled.patch b/package/kernel/mac80211/patches/841-brcmfmac-don-t-preset-all-channels-as-disabled.patch
new file mode 100644
index 0000000..4d2c4b0
--- /dev/null
+++ b/package/kernel/mac80211/patches/841-brcmfmac-don-t-preset-all-channels-as-disabled.patch
@@ -0,0 +1,34 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal at milecki.pl>
+Date: Sat, 7 Jan 2017 21:36:04 +0100
+Subject: [PATCH] brcmfmac: don't preset all channels as disabled
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+During init we take care of regulatory stuff by disabling all
+unavailable channels (see brcmf_construct_chaninfo) so this predisabling
+them is not really required (and this patch won't change any behavior).
+It will on the other hand allow more detailed runtime control over
+channels which is the main reason for this change.
+
+Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+@@ -147,7 +147,6 @@ static struct ieee80211_rate __wl_rates[
+ 	.band			= NL80211_BAND_2GHZ,		\
+ 	.center_freq		= (_freq),			\
+ 	.hw_value		= (_channel),			\
+-	.flags			= IEEE80211_CHAN_DISABLED,	\
+ 	.max_antenna_gain	= 0,				\
+ 	.max_power		= 30,				\
+ }
+@@ -156,7 +155,6 @@ static struct ieee80211_rate __wl_rates[
+ 	.band			= NL80211_BAND_5GHZ,		\
+ 	.center_freq		= 5000 + (5 * (_channel)),	\
+ 	.hw_value		= (_channel),			\
+-	.flags			= IEEE80211_CHAN_DISABLED,	\
+ 	.max_antenna_gain	= 0,				\
+ 	.max_power		= 30,				\
+ }
diff --git a/package/kernel/mac80211/patches/842-brcmfmac-setup-wiphy-bands-after-registering-it-firs.patch b/package/kernel/mac80211/patches/842-brcmfmac-setup-wiphy-bands-after-registering-it-firs.patch
new file mode 100644
index 0000000..2826c73
--- /dev/null
+++ b/package/kernel/mac80211/patches/842-brcmfmac-setup-wiphy-bands-after-registering-it-firs.patch
@@ -0,0 +1,49 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal at milecki.pl>
+Date: Sat, 7 Jan 2017 21:36:05 +0100
+Subject: [PATCH] brcmfmac: setup wiphy bands after registering it first
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+During bands setup we disable all channels that firmware doesn't support
+in the current regulatory setup. If we do this before wiphy_register
+it will result in copying set flags (including IEEE80211_CHAN_DISABLED)
+to the orig_flags which is supposed to be persistent. We don't want this
+as regulatory change may result in enabling some channels. We shouldn't
+mess with orig_flags then (by changing them or ignoring them) so it's
+better to just take care of their proper values.
+
+This patch cleanups code a bit (by taking orig_flags more seriously) and
+allows further improvements like disabling really unavailable channels.
+We will need that e.g. if some frequencies should be disabled for good
+due to hardware setup (design).
+
+Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
+Acked-by: Arend van Spriel <arend.vanspriel at broadcom.com>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+@@ -6564,8 +6564,7 @@ static int brcmf_setup_wiphy(struct wiph
+ 			wiphy->bands[NL80211_BAND_5GHZ] = band;
+ 		}
+ 	}
+-	err = brcmf_setup_wiphybands(wiphy);
+-	return err;
++	return 0;
+ }
+ 
+ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
+@@ -6930,6 +6929,12 @@ struct brcmf_cfg80211_info *brcmf_cfg802
+ 		goto priv_out;
+ 	}
+ 
++	err = brcmf_setup_wiphybands(wiphy);
++	if (err) {
++		brcmf_err("Setting wiphy bands failed (%d)\n", err);
++		goto wiphy_unreg_out;
++	}
++
+ 	/* If cfg80211 didn't disable 40MHz HT CAP in wiphy_register(),
+ 	 * setup 40MHz in 2GHz band and enable OBSS scanning.
+ 	 */
diff --git a/package/kernel/mac80211/patches/843-brcmfmac-make-brcmf_of_probe-more-generic.patch b/package/kernel/mac80211/patches/843-brcmfmac-make-brcmf_of_probe-more-generic.patch
new file mode 100644
index 0000000..9e07d4a
--- /dev/null
+++ b/package/kernel/mac80211/patches/843-brcmfmac-make-brcmf_of_probe-more-generic.patch
@@ -0,0 +1,72 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal at milecki.pl>
+Date: Sat, 7 Jan 2017 23:43:45 +0100
+Subject: [PATCH] brcmfmac: make brcmf_of_probe more generic
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+We may want to use Open Firmware for other devices than just SDIO ones.
+In future we may want to support more Broadcom properties so there is
+really no reason for such limitation.
+
+Call brcmf_of_probe for all kind of devices & move extra conditions to
+the body of that funcion.
+
+Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
+@@ -299,11 +299,9 @@ struct brcmf_mp_device *brcmf_get_module
+ 			}
+ 		}
+ 	}
+-	if ((bus_type == BRCMF_BUSTYPE_SDIO) && (!found)) {
+-		/* No platform data for this device. In case of SDIO try OF
+-		 * (Open Firwmare) Device Tree.
+-		 */
+-		brcmf_of_probe(dev, &settings->bus.sdio);
++	if (!found) {
++		/* No platform data for this device, try OF (Open Firwmare) */
++		brcmf_of_probe(dev, bus_type, settings);
+ 	}
+ 	return settings;
+ }
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
+@@ -23,14 +23,17 @@
+ #include "common.h"
+ #include "of.h"
+ 
+-void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd *sdio)
++void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
++		    struct brcmf_mp_device *settings)
+ {
++	struct brcmfmac_sdio_pd *sdio = &settings->bus.sdio;
+ 	struct device_node *np = dev->of_node;
+ 	int irq;
+ 	u32 irqf;
+ 	u32 val;
+ 
+-	if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
++	if (!np || bus_type != BRCMF_BUSTYPE_SDIO ||
++	    !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
+ 		return;
+ 
+ 	if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0)
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
+@@ -14,9 +14,11 @@
+  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+  */
+ #ifdef CONFIG_OF
+-void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd *sdio);
++void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
++		    struct brcmf_mp_device *settings);
+ #else
+-static void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd *sdio)
++static void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
++			   struct brcmf_mp_device *settings)
+ {
+ }
+ #endif /* CONFIG_OF */
diff --git a/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch b/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch
index 8721155..7551b7d 100644
--- a/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch
+++ b/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch
@@ -10,7 +10,7 @@ Signed-off-by: Rafał Miłecki <zajec5 at gmail.com>
 
 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -665,9 +665,37 @@ static struct wireless_dev *brcmf_cfg802
+@@ -663,9 +663,37 @@ static struct wireless_dev *brcmf_cfg802
  						     u32 *flags,
  						     struct vif_params *params)
  {
diff --git a/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch b/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch
index 6df1236..70b8844 100644
--- a/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch
+++ b/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch
@@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell <phil at raspberrypi.org>
 
 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -2784,6 +2784,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
+@@ -2782,6 +2782,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
  	 * preference in cfg struct to apply this to
  	 * FW later while initializing the dongle
  	 */



More information about the lede-commits mailing list