openwrt/package/kernel/mac80211/patches/brcm/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch
Felix Fietkau 1bfcc1ea8a mac80211: update to version 6.9.9
Brings lots of driver updates and API changes needed for mt76 updates.
Disable iwlwifi and ath11k on 5.15, since backport is too difficult,
and the only remaining targets won't need those drivers.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2024-07-12 16:38:28 +02:00

50 lines
1.8 KiB
Diff

From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
Date: Thu, 9 Jul 2015 00:07:59 +0200
Subject: [PATCH] brcmfmac: workaround bug with some inconsistent BSSes state
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
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
@@ -980,8 +980,36 @@ static struct wireless_dev *brcmf_cfg802
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
struct brcmf_pub *drvr = cfg->pub;
struct wireless_dev *wdev;
+ struct net_device *dev;
int err;
+ /*
+ * There is a bug with in-firmware BSS management. When adding virtual
+ * interface brcmfmac first tells firmware to create new BSS and then
+ * it creates new struct net_device.
+ *
+ * If creating/registering netdev(ice) fails, BSS remains in some bugged
+ * state. It conflicts with existing BSSes by overtaking their auth
+ * requests.
+ *
+ * It results in one BSS (addresss X) sending beacons and another BSS
+ * (address Y) replying to authentication requests. This makes interface
+ * unusable as AP.
+ *
+ * To workaround this bug we may try to guess if register_netdev(ice)
+ * will fail. The most obvious case is using interface name that already
+ * exists. This is actually quite likely with brcmfmac & some user space
+ * scripts as brcmfmac doesn't allow deleting virtual interfaces.
+ * So this bug can be triggered even by something trivial like:
+ * iw dev wlan0 delete
+ * iw phy phy0 interface add wlan0 type __ap
+ */
+ dev = dev_get_by_name(&init_net, name);
+ if (dev) {
+ dev_put(dev);
+ return ERR_PTR(-ENFILE);
+ }
+
brcmf_dbg(TRACE, "enter: %s type %d\n", name, type);
err = brcmf_vif_add_validate(wiphy_to_cfg(wiphy), type);
if (err) {