]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
brcmfmac: change the order of things in brcmf_detach()
authorArend van Spriel <arend.vanspriel@broadcom.com>
Thu, 11 Jul 2019 09:05:07 +0000 (11:05 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 24 Jul 2019 11:51:22 +0000 (14:51 +0300)
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>
drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c

index fda604426e46f3061cd6cbe5e8fdab2fe866a20a..80d54d236a75152f52667523551117c4aec056ad 100644 (file)
@@ -1307,25 +1307,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);
 }