2019-07-28 11:52:47 +00:00
|
|
|
From 14fcfd1cc0c05ea58f47dd693fdd13f25dfe995e Mon Sep 17 00:00:00 2001
|
2019-07-21 09:23:32 +00:00
|
|
|
From: Arend van Spriel <arend.vanspriel@broadcom.com>
|
|
|
|
Date: Thu, 11 Jul 2019 11:05:07 +0200
|
2019-07-28 11:52:47 +00:00
|
|
|
Subject: [PATCH] brcmfmac: change the order of things in brcmf_detach()
|
2019-07-21 09:23:32 +00:00
|
|
|
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>
|
2019-07-28 11:52:47 +00:00
|
|
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
2019-07-21 09:23:32 +00:00
|
|
|
---
|
|
|
|
.../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);
|
|
|
|
}
|
|
|
|
|