diff options
| -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); |
