diff options
author | Arend van Spriel <arend@broadcom.com> | 2013-05-27 15:09:55 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-05-28 13:43:09 -0400 |
commit | 24e28beef939df8666a5d2784d6617cd9bb910a0 (patch) | |
tree | 6ee01a05babb7d336390ab701ac44e98c86fc88e /drivers/net/wireless | |
parent | 15a953d0919e3e7c94691ecabd0d9f74373f19aa (diff) |
brcmfmac: add additional parameter to brcmf_free_vif()
Pass the struct brcmf_cfg80211_info instance instead of obtaining
through vif itself using vif->wdev. This is needed as the netdev
associated with this vif is already unregistered.
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/p2p.c | 25 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 17 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h | 3 |
3 files changed, 20 insertions, 25 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c index 17275ceb686c..167b7afdf0d8 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c | |||
@@ -1955,21 +1955,21 @@ s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg) | |||
1955 | err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1); | 1955 | err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1); |
1956 | if (err < 0) { | 1956 | if (err < 0) { |
1957 | brcmf_err("set p2p_disc error\n"); | 1957 | brcmf_err("set p2p_disc error\n"); |
1958 | brcmf_free_vif(p2p_vif); | 1958 | brcmf_free_vif(cfg, p2p_vif); |
1959 | goto exit; | 1959 | goto exit; |
1960 | } | 1960 | } |
1961 | /* obtain bsscfg index for P2P discovery */ | 1961 | /* obtain bsscfg index for P2P discovery */ |
1962 | err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bssidx); | 1962 | err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bssidx); |
1963 | if (err < 0) { | 1963 | if (err < 0) { |
1964 | brcmf_err("retrieving discover bsscfg index failed\n"); | 1964 | brcmf_err("retrieving discover bsscfg index failed\n"); |
1965 | brcmf_free_vif(p2p_vif); | 1965 | brcmf_free_vif(cfg, p2p_vif); |
1966 | goto exit; | 1966 | goto exit; |
1967 | } | 1967 | } |
1968 | /* Verify that firmware uses same bssidx as driver !! */ | 1968 | /* Verify that firmware uses same bssidx as driver !! */ |
1969 | if (p2p_ifp->bssidx != bssidx) { | 1969 | if (p2p_ifp->bssidx != bssidx) { |
1970 | brcmf_err("Incorrect bssidx=%d, compared to p2p_ifp->bssidx=%d\n", | 1970 | brcmf_err("Incorrect bssidx=%d, compared to p2p_ifp->bssidx=%d\n", |
1971 | bssidx, p2p_ifp->bssidx); | 1971 | bssidx, p2p_ifp->bssidx); |
1972 | brcmf_free_vif(p2p_vif); | 1972 | brcmf_free_vif(cfg, p2p_vif); |
1973 | goto exit; | 1973 | goto exit; |
1974 | } | 1974 | } |
1975 | 1975 | ||
@@ -1997,7 +1997,7 @@ void brcmf_p2p_detach(struct brcmf_p2p_info *p2p) | |||
1997 | brcmf_p2p_cancel_remain_on_channel(vif->ifp); | 1997 | brcmf_p2p_cancel_remain_on_channel(vif->ifp); |
1998 | brcmf_p2p_deinit_discovery(p2p); | 1998 | brcmf_p2p_deinit_discovery(p2p); |
1999 | /* remove discovery interface */ | 1999 | /* remove discovery interface */ |
2000 | brcmf_free_vif(vif); | 2000 | brcmf_free_vif(p2p->cfg, vif); |
2001 | p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL; | 2001 | p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL; |
2002 | } | 2002 | } |
2003 | /* just set it all to zero */ | 2003 | /* just set it all to zero */ |
@@ -2222,7 +2222,7 @@ static struct wireless_dev *brcmf_p2p_create_p2pdev(struct brcmf_p2p_info *p2p, | |||
2222 | return &p2p_vif->wdev; | 2222 | return &p2p_vif->wdev; |
2223 | 2223 | ||
2224 | fail: | 2224 | fail: |
2225 | brcmf_free_vif(p2p_vif); | 2225 | brcmf_free_vif(p2p->cfg, p2p_vif); |
2226 | return ERR_PTR(err); | 2226 | return ERR_PTR(err); |
2227 | } | 2227 | } |
2228 | 2228 | ||
@@ -2231,13 +2231,12 @@ fail: | |||
2231 | * | 2231 | * |
2232 | * @vif: virtual interface object to delete. | 2232 | * @vif: virtual interface object to delete. |
2233 | */ | 2233 | */ |
2234 | static void brcmf_p2p_delete_p2pdev(struct brcmf_cfg80211_vif *vif) | 2234 | static void brcmf_p2p_delete_p2pdev(struct brcmf_cfg80211_info *cfg, |
2235 | struct brcmf_cfg80211_vif *vif) | ||
2235 | { | 2236 | { |
2236 | struct brcmf_p2p_info *p2p = &vif->ifp->drvr->config->p2p; | ||
2237 | |||
2238 | cfg80211_unregister_wdev(&vif->wdev); | 2237 | cfg80211_unregister_wdev(&vif->wdev); |
2239 | p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL; | 2238 | cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL; |
2240 | brcmf_free_vif(vif); | 2239 | brcmf_free_vif(cfg, vif); |
2241 | } | 2240 | } |
2242 | 2241 | ||
2243 | /** | 2242 | /** |
@@ -2328,7 +2327,7 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name, | |||
2328 | return &ifp->vif->wdev; | 2327 | return &ifp->vif->wdev; |
2329 | 2328 | ||
2330 | fail: | 2329 | fail: |
2331 | brcmf_free_vif(vif); | 2330 | brcmf_free_vif(cfg, vif); |
2332 | return ERR_PTR(err); | 2331 | return ERR_PTR(err); |
2333 | } | 2332 | } |
2334 | 2333 | ||
@@ -2364,7 +2363,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev) | |||
2364 | break; | 2363 | break; |
2365 | 2364 | ||
2366 | case NL80211_IFTYPE_P2P_DEVICE: | 2365 | case NL80211_IFTYPE_P2P_DEVICE: |
2367 | brcmf_p2p_delete_p2pdev(vif); | 2366 | brcmf_p2p_delete_p2pdev(cfg, vif); |
2368 | return 0; | 2367 | return 0; |
2369 | default: | 2368 | default: |
2370 | return -ENOTSUPP; | 2369 | return -ENOTSUPP; |
@@ -2392,7 +2391,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev) | |||
2392 | err = 0; | 2391 | err = 0; |
2393 | } | 2392 | } |
2394 | brcmf_cfg80211_arm_vif_event(cfg, NULL); | 2393 | brcmf_cfg80211_arm_vif_event(cfg, NULL); |
2395 | brcmf_free_vif(vif); | 2394 | brcmf_free_vif(cfg, vif); |
2396 | p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL; | 2395 | p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL; |
2397 | 2396 | ||
2398 | return err; | 2397 | return err; |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c index 94285f634a48..f8c86b58a6d1 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | |||
@@ -4292,20 +4292,16 @@ struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg, | |||
4292 | return vif; | 4292 | return vif; |
4293 | } | 4293 | } |
4294 | 4294 | ||
4295 | void brcmf_free_vif(struct brcmf_cfg80211_vif *vif) | 4295 | void brcmf_free_vif(struct brcmf_cfg80211_info *cfg, |
4296 | struct brcmf_cfg80211_vif *vif) | ||
4296 | { | 4297 | { |
4297 | struct brcmf_cfg80211_info *cfg; | ||
4298 | struct wiphy *wiphy; | ||
4299 | |||
4300 | wiphy = vif->wdev.wiphy; | ||
4301 | cfg = wiphy_priv(wiphy); | ||
4302 | list_del(&vif->list); | 4298 | list_del(&vif->list); |
4303 | cfg->vif_cnt--; | 4299 | cfg->vif_cnt--; |
4304 | 4300 | ||
4305 | kfree(vif); | 4301 | kfree(vif); |
4306 | if (!cfg->vif_cnt) { | 4302 | if (!cfg->vif_cnt) { |
4307 | wiphy_unregister(wiphy); | 4303 | wiphy_unregister(cfg->wiphy); |
4308 | wiphy_free(wiphy); | 4304 | wiphy_free(cfg->wiphy); |
4309 | } | 4305 | } |
4310 | } | 4306 | } |
4311 | 4307 | ||
@@ -4888,8 +4884,7 @@ cfg80211_p2p_attach_out: | |||
4888 | wl_deinit_priv(cfg); | 4884 | wl_deinit_priv(cfg); |
4889 | 4885 | ||
4890 | cfg80211_attach_out: | 4886 | cfg80211_attach_out: |
4891 | brcmf_free_vif(vif); | 4887 | brcmf_free_vif(cfg, vif); |
4892 | wiphy_free(wiphy); | ||
4893 | return NULL; | 4888 | return NULL; |
4894 | } | 4889 | } |
4895 | 4890 | ||
@@ -4901,7 +4896,7 @@ void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg) | |||
4901 | wl_deinit_priv(cfg); | 4896 | wl_deinit_priv(cfg); |
4902 | brcmf_btcoex_detach(cfg); | 4897 | brcmf_btcoex_detach(cfg); |
4903 | list_for_each_entry_safe(vif, tmp, &cfg->vif_list, list) { | 4898 | list_for_each_entry_safe(vif, tmp, &cfg->vif_list, list) { |
4904 | brcmf_free_vif(vif); | 4899 | brcmf_free_vif(cfg, vif); |
4905 | } | 4900 | } |
4906 | } | 4901 | } |
4907 | 4902 | ||
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h index a71cff84cdcf..d9bdaf9a72d0 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h | |||
@@ -487,7 +487,8 @@ enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp); | |||
487 | struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg, | 487 | struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg, |
488 | enum nl80211_iftype type, | 488 | enum nl80211_iftype type, |
489 | bool pm_block); | 489 | bool pm_block); |
490 | void brcmf_free_vif(struct brcmf_cfg80211_vif *vif); | 490 | void brcmf_free_vif(struct brcmf_cfg80211_info *cfg, |
491 | struct brcmf_cfg80211_vif *vif); | ||
491 | 492 | ||
492 | s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag, | 493 | s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag, |
493 | const u8 *vndr_ie_buf, u32 vndr_ie_len); | 494 | const u8 *vndr_ie_buf, u32 vndr_ie_len); |