123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- From 14fcfd1cc0c05ea58f47dd693fdd13f25dfe995e 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] 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>
- Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
- ---
- .../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
- @@ -1287,26 +1287,27 @@ 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);
- -
- brcmf_debug_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);
- }
-
|