diff --git a/package/kernel/mac80211/patches/brcm/100-brcmfmac-fix-roamoff-1-modparam.patch b/package/kernel/mac80211/patches/brcm/100-brcmfmac-fix-roamoff-1-modparam.patch new file mode 100644 index 0000000000..a3053616c1 --- /dev/null +++ b/package/kernel/mac80211/patches/brcm/100-brcmfmac-fix-roamoff-1-modparam.patch @@ -0,0 +1,76 @@ +From 22d319f2665dd3458d59c934fa0c8cf1b1d7227f Mon Sep 17 00:00:00 2001 +From: Stijn Tintel +Date: Sat, 10 Nov 2018 13:25:20 +0200 +Subject: [PATCH wireless-drivers] brcmfmac: fix roamoff=1 modparam + +When the update_connect_param callback is set, nl80211 expects the flag +WIPHY_FLAG_SUPPORTS_FW_ROAM to be set as well. However, this flag is +only set when modparam roamoff=0, while the callback is set +unconditionally. Since commit 7f9a3e150ec7 this causes a warning in +wiphy_register, which breaks brcmfmac. + +Disable the update_connect_param callback when roamoff=0 to fix this. + +Fixes: 7f9a3e150ec7 ("nl80211: Update ERP info using NL80211_CMD_UPDATE_CONNECT_PARAMS") +Cc: Stable # 4.19+ +Signed-off-by: Jonas Gorski +Signed-off-by: Stijn Tintel +--- + .../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 11 +++++++++-- + .../wireless/broadcom/brcm80211/brcmfmac/cfg80211.h | 2 +- + .../net/wireless/broadcom/brcm80211/brcmfmac/core.c | 2 +- + 3 files changed, 11 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +index 7f0a5bade70a..c0e3ae7bf2ae 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +@@ -5196,10 +5196,17 @@ static struct cfg80211_ops brcmf_cfg80211_ops = { + .del_pmk = brcmf_cfg80211_del_pmk, + }; + +-struct cfg80211_ops *brcmf_cfg80211_get_ops(void) ++struct cfg80211_ops *brcmf_cfg80211_get_ops(struct brcmf_mp_device *settings) + { +- return kmemdup(&brcmf_cfg80211_ops, sizeof(brcmf_cfg80211_ops), ++ struct cfg80211_ops *ops; ++ ++ ops = kmemdup(&brcmf_cfg80211_ops, sizeof(brcmf_cfg80211_ops), + GFP_KERNEL); ++ ++ if (ops && settings->roamoff) ++ ops->update_connect_params = NULL; ++ ++ return ops; + } + + struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg, +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +index a4aec0004e4f..9a6287f084a9 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +@@ -404,7 +404,7 @@ struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr, + void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg); + s32 brcmf_cfg80211_up(struct net_device *ndev); + s32 brcmf_cfg80211_down(struct net_device *ndev); +-struct cfg80211_ops *brcmf_cfg80211_get_ops(void); ++struct cfg80211_ops *brcmf_cfg80211_get_ops(struct brcmf_mp_device *settings); + enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp); + + struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg, +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +index b1f702faff4f..860a4372cb56 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +@@ -1130,7 +1130,7 @@ int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings) + + brcmf_dbg(TRACE, "Enter\n"); + +- ops = brcmf_cfg80211_get_ops(); ++ ops = brcmf_cfg80211_get_ops(settings); + if (!ops) + return -ENOMEM; + +-- +2.18.1 +