summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2011-07-26 15:00:34 -0700
committerJonas ABERG <jonas.aberg@stericsson.com>2011-10-28 11:00:17 +0200
commit7ef4071b13335d650b88c62c237bca5082e6926c (patch)
treebdf80b64c85e3c8c434ade27bf290765558faa6e
parenta94104115741b243cddf404c187e8215133f6d24 (diff)
net: wireless: bcmdhd: Fix rfkill cleaning on failure
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com> Change-Id: I6721f317bcd0fe3e1ea296a02b79442c8e899165 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/35558 Tested-by: Per VAHLNE <per.xx.vahlne@stericsson.com> Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
-rw-r--r--drivers/net/wireless/bcmdhd/wl_cfg80211.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.c b/drivers/net/wireless/bcmdhd/wl_cfg80211.c
index d4ccff62029..2a4bf36d748 100644
--- a/drivers/net/wireless/bcmdhd/wl_cfg80211.c
+++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.c
@@ -468,7 +468,7 @@ static void wl_debugfs_remove_netdev(struct wl_priv *wl);
/*
* rfkill support
*/
-static int wl_setup_rfkill(struct wl_priv *wl);
+static int wl_setup_rfkill(struct wl_priv *wl, bool setup);
static int wl_rfkill_set(void *data, bool blocked);
/*
@@ -5382,7 +5382,7 @@ s32 wl_cfg80211_attach(struct net_device *ndev, void *data)
goto cfg80211_attach_out;
}
- err = wl_setup_rfkill(wl);
+ err = wl_setup_rfkill(wl, TRUE);
if (unlikely(err)) {
WL_ERR(("Failed to setup rfkill %d\n", err));
goto cfg80211_attach_out;
@@ -5398,7 +5398,7 @@ s32 wl_cfg80211_attach(struct net_device *ndev, void *data)
return err;
cfg80211_attach_out:
- err = wl_setup_rfkill(wl);
+ err = wl_setup_rfkill(wl, FALSE);
wl_free_wdev(wl);
return err;
}
@@ -5415,8 +5415,7 @@ void wl_cfg80211_detach(void)
if (wl_sysctl_hdr)
unregister_sysctl_table(wl_sysctl_hdr);
#endif
- rfkill_unregister(wl->rfkill);
- rfkill_destroy(wl->rfkill);
+ wl_setup_rfkill(wl, FALSE);
if (wl->p2p_supported)
wl_cfgp2p_deinit_priv(wl);
wl_deinit_priv(wl);
@@ -6544,29 +6543,44 @@ static int wl_rfkill_set(void *data, bool blocked)
WL_DBG(("Enter \n"));
WL_DBG(("RF %s\n", blocked ? "blocked" : "unblocked"));
+ if (!wl)
+ return -EINVAL;
+
wl->rf_blocked = blocked;
return 0;
}
-static int wl_setup_rfkill(struct wl_priv *wl)
+static int wl_setup_rfkill(struct wl_priv *wl, bool setup)
{
- s32 err;
+ s32 err = 0;
WL_DBG(("Enter \n"));
- wl->rfkill = rfkill_alloc("brcmfmac-wifi",
- &wl_cfg80211_get_sdio_func()->dev,
- RFKILL_TYPE_WLAN, &wl_rfkill_ops, (void *)wl);
+ if (!wl)
+ return -EINVAL;
+ if (setup) {
+ wl->rfkill = rfkill_alloc("brcmfmac-wifi",
+ &wl_cfg80211_get_sdio_func()->dev,
+ RFKILL_TYPE_WLAN, &wl_rfkill_ops, (void *)wl);
+
+ if (!wl->rfkill) {
+ err = -ENOMEM;
+ goto err_out;
+ }
- if (!wl->rfkill) {
- err = -ENOMEM;
- goto err_out;
- }
+ err = rfkill_register(wl->rfkill);
- err = rfkill_register(wl->rfkill);
+ if (err)
+ rfkill_destroy(wl->rfkill);
+ } else {
+ if (!wl->rfkill) {
+ err = -ENOMEM;
+ goto err_out;
+ }
- if (err)
+ rfkill_unregister(wl->rfkill);
rfkill_destroy(wl->rfkill);
+ }
err_out:
return err;