brcmfmac: call brcmf_cfg80211_detach() after removal of interfaces
authorArend van Spriel <arend@broadcom.com>
Mon, 6 Jan 2014 11:40:48 +0000 (12:40 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 6 Jan 2014 20:48:05 +0000 (15:48 -0500)
Instead of calling brcmf_cfg80211_detach() in brcmf_del_if() when
deleting the primary interface, call it in brcmf_detach() after
deleting all interfaces.

Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c

index bce0b8e511fd22eb085077169050426f42714838..d3c4fba065ad70767d082f0c6d6b052ffd6ffb30 100644 (file)
@@ -859,8 +859,6 @@ void brcmf_del_if(struct brcmf_pub *drvr, s32 bssidx)
                }
                /* unregister will take care of freeing it */
                unregister_netdev(ifp->ndev);
-               if (bssidx == 0)
-                       brcmf_cfg80211_detach(drvr->config);
        } else {
                kfree(ifp);
        }
@@ -963,8 +961,7 @@ int brcmf_bus_start(struct device *dev)
 fail:
        if (ret < 0) {
                brcmf_err("failed: %d\n", ret);
-               if (drvr->config)
-                       brcmf_cfg80211_detach(drvr->config);
+               brcmf_cfg80211_detach(drvr->config);
                if (drvr->fws) {
                        brcmf_fws_del_interface(ifp);
                        brcmf_fws_deinit(drvr);
@@ -1039,6 +1036,8 @@ void brcmf_detach(struct device *dev)
                        brcmf_del_if(drvr, i);
                }
 
+       brcmf_cfg80211_detach(drvr->config);
+
        brcmf_bus_detach(drvr);
 
        brcmf_proto_detach(drvr);
index 5598a20891d2f85de51842d4904e07ecba63f474..3e3de34422bd7abd28926b941d12c4b24d803fef 100644 (file)
@@ -4975,6 +4975,9 @@ cfg80211_attach_out:
 
 void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg)
 {
+       if (!cfg)
+               return;
+
        WARN_ON(!list_empty(&cfg->vif_list));
        wiphy_unregister(cfg->wiphy);
        brcmf_btcoex_detach(cfg);