mac80211: brcm: backport first set of 5.4 brcmfmac changes
[openwrt/openwrt.git] / package / kernel / mac80211 / patches / brcm / 104-v5.4-0002-brcmfmac-change-the-order-of-things-in-brcmf_detach.patch
diff --git a/package/kernel/mac80211/patches/brcm/104-v5.4-0002-brcmfmac-change-the-order-of-things-in-brcmf_detach.patch b/package/kernel/mac80211/patches/brcm/104-v5.4-0002-brcmfmac-change-the-order-of-things-in-brcmf_detach.patch
new file mode 100644 (file)
index 0000000..c72fa24
--- /dev/null
@@ -0,0 +1,66 @@
+From 701fb69f2c36cba83583990e67a3925f920fd96a Mon Sep 17 00:00:00 2001
+From: Arend van Spriel <arend.vanspriel@broadcom.com>
+Date: Thu, 11 Jul 2019 11:05:07 +0200
+Subject: [PATCH 2/7] brcmfmac: change the order of things in brcmf_detach()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+When brcmf_detach() from the bus layer upon rmmod we can no longer
+communicate. Hence we will set the bus state to DOWN and cleanup
+the event and protocol layer. The network interfaces need to be
+deleted before brcmf_cfg80211_detach() because the latter does the
+wiphy_unregister() which issues a warning if there are still network
+devices linked to the wiphy instance.
+
+Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
+Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
+Reviewed-by: Franky Lin <franky.lin@broadcom.com>
+Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
+Tested-by: Rafał Miłecki <rafal@milecki.pl>
+---
+ .../broadcom/brcm80211/brcmfmac/core.c        | 27 ++++++++++---------
+ 1 file changed, 14 insertions(+), 13 deletions(-)
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+@@ -1328,25 +1328,26 @@ void brcmf_detach(struct device *dev)
+       unregister_inet6addr_notifier(&drvr->inet6addr_notifier);
+ #endif
+-      /* stop firmware event handling */
+-      brcmf_fweh_detach(drvr);
+-      if (drvr->config)
+-              brcmf_p2p_detach(&drvr->config->p2p);
+-
+       brcmf_bus_change_state(bus_if, BRCMF_BUS_DOWN);
+-
+-      /* make sure primary interface removed last */
+-      for (i = BRCMF_MAX_IFS-1; i > -1; i--)
+-              brcmf_remove_interface(drvr->iflist[i], false);
+-
+-      brcmf_cfg80211_detach(drvr->config);
+-      drvr->config = NULL;
+-
+       brcmf_bus_stop(drvr->bus_if);
++      brcmf_fweh_detach(drvr);
+       brcmf_proto_detach(drvr);
++      /* make sure primary interface removed last */
++      for (i = BRCMF_MAX_IFS - 1; i > -1; i--) {
++              if (drvr->iflist[i])
++                      brcmf_del_if(drvr, drvr->iflist[i]->bsscfgidx, false);
++      }
++
++      if (drvr->config) {
++              brcmf_p2p_detach(&drvr->config->p2p);
++              brcmf_cfg80211_detach(drvr->config);
++              drvr->config = NULL;
++      }
++
+       bus_if->drvr = NULL;
++
+       wiphy_free(drvr->wiphy);
+ }