mirror of https://github.com/hak5/openwrt-owl.git
mac80211: pending brcmfmac patches cleaning channels management
They prepare brcmfmac for using wiphy_read_of_freq_limits. Signed-off-by: Rafał Miłecki <rafal@milecki.pl>owl
parent
07df80a1a6
commit
f714fe46a9
|
@ -0,0 +1,100 @@
|
||||||
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@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@milecki.pl>
|
||||||
|
Acked-by: Arend van Spriel <arend.vanspriel@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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@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@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, \
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@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@milecki.pl>
|
||||||
|
Acked-by: Arend van Spriel <arend.vanspriel@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.
|
||||||
|
*/
|
|
@ -0,0 +1,72 @@
|
||||||
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@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@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 */
|
|
@ -10,7 +10,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||||
|
|
||||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||||
+++ b/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,
|
u32 *flags,
|
||||||
struct vif_params *params)
|
struct vif_params *params)
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||||
|
|
||||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||||
+++ b/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
|
* preference in cfg struct to apply this to
|
||||||
* FW later while initializing the dongle
|
* FW later while initializing the dongle
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue