diff options
author | Dmitry Shmidt <dimitrysh@google.com> | 2011-10-09 02:31:04 +0100 |
---|---|---|
committer | Andy Green <andy.green@linaro.org> | 2011-10-09 02:31:04 +0100 |
commit | 4606d91fe11ee04e97650cc3ef5f8ce05d3b09da (patch) | |
tree | d9d8d28be3776309d6277ad8cc90d5b4add5355f /drivers/net/wireless/bcmdhd/wl_cfg80211.c | |
parent | 52f5cac48f7fb59968b4948070c319f915f807ab (diff) |
net: wireless: bcmdhd: Fix rfkill cleaning on failure
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
Diffstat (limited to 'drivers/net/wireless/bcmdhd/wl_cfg80211.c')
-rw-r--r-- | drivers/net/wireless/bcmdhd/wl_cfg80211.c | 46 |
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; |