Commit e1479951 authored by Arend van Spriel's avatar Arend van Spriel Committed by John W. Linville

brcmfmac: call brcmf_cfg80211_detach() after removal of interfaces

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: default avatarHante Meuleman <meuleman@broadcom.com>
Reviewed-by: default avatarPieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 427dec5f
...@@ -859,8 +859,6 @@ void brcmf_del_if(struct brcmf_pub *drvr, s32 bssidx) ...@@ -859,8 +859,6 @@ void brcmf_del_if(struct brcmf_pub *drvr, s32 bssidx)
} }
/* unregister will take care of freeing it */ /* unregister will take care of freeing it */
unregister_netdev(ifp->ndev); unregister_netdev(ifp->ndev);
if (bssidx == 0)
brcmf_cfg80211_detach(drvr->config);
} else { } else {
kfree(ifp); kfree(ifp);
} }
...@@ -963,8 +961,7 @@ int brcmf_bus_start(struct device *dev) ...@@ -963,8 +961,7 @@ int brcmf_bus_start(struct device *dev)
fail: fail:
if (ret < 0) { if (ret < 0) {
brcmf_err("failed: %d\n", ret); brcmf_err("failed: %d\n", ret);
if (drvr->config) brcmf_cfg80211_detach(drvr->config);
brcmf_cfg80211_detach(drvr->config);
if (drvr->fws) { if (drvr->fws) {
brcmf_fws_del_interface(ifp); brcmf_fws_del_interface(ifp);
brcmf_fws_deinit(drvr); brcmf_fws_deinit(drvr);
...@@ -1039,6 +1036,8 @@ void brcmf_detach(struct device *dev) ...@@ -1039,6 +1036,8 @@ void brcmf_detach(struct device *dev)
brcmf_del_if(drvr, i); brcmf_del_if(drvr, i);
} }
brcmf_cfg80211_detach(drvr->config);
brcmf_bus_detach(drvr); brcmf_bus_detach(drvr);
brcmf_proto_detach(drvr); brcmf_proto_detach(drvr);
......
...@@ -4975,6 +4975,9 @@ struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr, ...@@ -4975,6 +4975,9 @@ struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg) void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg)
{ {
if (!cfg)
return;
WARN_ON(!list_empty(&cfg->vif_list)); WARN_ON(!list_empty(&cfg->vif_list));
wiphy_unregister(cfg->wiphy); wiphy_unregister(cfg->wiphy);
brcmf_btcoex_detach(cfg); brcmf_btcoex_detach(cfg);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment