Lines Matching refs:sdata

17 	if (link->sdata->vif.type == NL80211_IFTYPE_STATION)  in ieee80211_link_setup()
21 void ieee80211_link_init(struct ieee80211_sub_if_data *sdata, in ieee80211_link_init() argument
31 rcu_assign_pointer(sdata->vif.link_conf[link_id], link_conf); in ieee80211_link_init()
32 rcu_assign_pointer(sdata->link[link_id], link); in ieee80211_link_init()
34 link->sdata = sdata; in ieee80211_link_init()
38 link_conf->vif = &sdata->vif; in ieee80211_link_init()
52 switch (sdata->vif.type) { in ieee80211_link_init()
55 sdata->wdev.links[link_id].addr); in ieee80211_link_init()
57 WARN_ON(!(sdata->wdev.valid_links & BIT(link_id))); in ieee80211_link_init()
72 if (link->sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_link_stop()
75 wiphy_delayed_work_cancel(link->sdata->local->hw.wiphy, in ieee80211_link_stop()
77 wiphy_work_cancel(link->sdata->local->hw.wiphy, in ieee80211_link_stop()
79 wiphy_work_cancel(link->sdata->local->hw.wiphy, in ieee80211_link_stop()
82 if (link->sdata->wdev.links[link->link_id].cac_started) { in ieee80211_link_stop()
83 wiphy_delayed_work_cancel(link->sdata->local->hw.wiphy, in ieee80211_link_stop()
85 cfg80211_cac_event(link->sdata->dev, in ieee80211_link_stop()
99 static void ieee80211_tear_down_links(struct ieee80211_sub_if_data *sdata, in ieee80211_tear_down_links() argument
111 link = &sdata->deflink; in ieee80211_tear_down_links()
121 ieee80211_free_key_list(sdata->local, &keys); in ieee80211_tear_down_links()
124 static void ieee80211_free_links(struct ieee80211_sub_if_data *sdata, in ieee80211_free_links() argument
133 static int ieee80211_check_dup_link_addrs(struct ieee80211_sub_if_data *sdata) in ieee80211_check_dup_link_addrs() argument
140 link1 = sdata_dereference(sdata->link[i], sdata); in ieee80211_check_dup_link_addrs()
146 link2 = sdata_dereference(sdata->link[j], sdata); in ieee80211_check_dup_link_addrs()
159 static void ieee80211_set_vif_links_bitmaps(struct ieee80211_sub_if_data *sdata, in ieee80211_set_vif_links_bitmaps() argument
162 sdata->vif.valid_links = valid_links; in ieee80211_set_vif_links_bitmaps()
163 sdata->vif.dormant_links = dormant_links; in ieee80211_set_vif_links_bitmaps()
170 sdata->vif.active_links = 0; in ieee80211_set_vif_links_bitmaps()
171 sdata->vif.dormant_links = 0; in ieee80211_set_vif_links_bitmaps()
175 switch (sdata->vif.type) { in ieee80211_set_vif_links_bitmaps()
178 sdata->vif.active_links = valid_links; in ieee80211_set_vif_links_bitmaps()
184 if (sdata->vif.active_links) in ieee80211_set_vif_links_bitmaps()
186 sdata->vif.active_links = valid_links & ~dormant_links; in ieee80211_set_vif_links_bitmaps()
187 WARN_ON(hweight16(sdata->vif.active_links) > 1); in ieee80211_set_vif_links_bitmaps()
194 static int ieee80211_vif_update_links(struct ieee80211_sub_if_data *sdata, in ieee80211_vif_update_links() argument
198 u16 old_links = sdata->vif.valid_links; in ieee80211_vif_update_links()
199 u16 old_active = sdata->vif.active_links; in ieee80211_vif_update_links()
209 lockdep_assert_wiphy(sdata->local->hw.wiphy); in ieee80211_vif_update_links()
213 if (old_links == new_links && dormant_links == sdata->vif.dormant_links) in ieee80211_vif_update_links()
231 BUILD_BUG_ON(sizeof(old) != sizeof(sdata->vif.link_conf)); in ieee80211_vif_update_links()
232 memcpy(old, sdata->vif.link_conf, sizeof(old)); in ieee80211_vif_update_links()
234 BUILD_BUG_ON(sizeof(old_data) != sizeof(sdata->link)); in ieee80211_vif_update_links()
235 memcpy(old_data, sdata->link, sizeof(old_data)); in ieee80211_vif_update_links()
239 if (rcu_access_pointer(sdata->link[link_id]) != &sdata->deflink) { in ieee80211_vif_update_links()
244 to_free[link_id] = container_of(rcu_access_pointer(sdata->link[link_id]), in ieee80211_vif_update_links()
249 RCU_INIT_POINTER(sdata->link[link_id], NULL); in ieee80211_vif_update_links()
250 RCU_INIT_POINTER(sdata->vif.link_conf[link_id], NULL); in ieee80211_vif_update_links()
254 ieee80211_debugfs_recreate_netdev(sdata, true); in ieee80211_vif_update_links()
259 rcu_access_pointer(sdata->link[link_id]) == &sdata->deflink); in ieee80211_vif_update_links()
262 ieee80211_link_init(sdata, link_id, &link->data, &link->conf); in ieee80211_vif_update_links()
267 ieee80211_link_init(sdata, -1, &sdata->deflink, in ieee80211_vif_update_links()
268 &sdata->vif.bss_conf); in ieee80211_vif_update_links()
270 ret = ieee80211_check_dup_link_addrs(sdata); in ieee80211_vif_update_links()
273 ieee80211_tear_down_links(sdata, to_free, rem); in ieee80211_vif_update_links()
275 ieee80211_set_vif_links_bitmaps(sdata, new_links, dormant_links); in ieee80211_vif_update_links()
278 ret = drv_change_vif_links(sdata->local, sdata, in ieee80211_vif_update_links()
280 new_links & sdata->vif.active_links, in ieee80211_vif_update_links()
283 ieee80211_debugfs_recreate_netdev(sdata, false); in ieee80211_vif_update_links()
288 memcpy(sdata->link, old_data, sizeof(old_data)); in ieee80211_vif_update_links()
289 memcpy(sdata->vif.link_conf, old, sizeof(old)); in ieee80211_vif_update_links()
290 ieee80211_set_vif_links_bitmaps(sdata, old_links, dormant_links); in ieee80211_vif_update_links()
308 ieee80211_link_init(sdata, -1, &sdata->deflink, in ieee80211_vif_update_links()
309 &sdata->vif.bss_conf); in ieee80211_vif_update_links()
313 int ieee80211_vif_set_links(struct ieee80211_sub_if_data *sdata, in ieee80211_vif_set_links() argument
319 ret = ieee80211_vif_update_links(sdata, links, new_links, in ieee80211_vif_set_links()
321 ieee80211_free_links(sdata, links); in ieee80211_vif_set_links()
326 static int _ieee80211_set_active_links(struct ieee80211_sub_if_data *sdata, in _ieee80211_set_active_links() argument
330 struct ieee80211_local *local = sdata->local; in _ieee80211_set_active_links()
331 u16 old_active = sdata->vif.active_links; in _ieee80211_set_active_links()
338 if (!ieee80211_sdata_running(sdata)) in _ieee80211_set_active_links()
341 if (sdata->vif.type != NL80211_IFTYPE_STATION) in _ieee80211_set_active_links()
344 if (active_links & ~ieee80211_vif_usable_links(&sdata->vif)) in _ieee80211_set_active_links()
352 link_confs[i] = sdata_dereference(sdata->vif.link_conf[i], in _ieee80211_set_active_links()
353 sdata); in _ieee80211_set_active_links()
356 sdata->vif.active_links |= active_links; in _ieee80211_set_active_links()
357 ret = drv_change_vif_links(local, sdata, in _ieee80211_set_active_links()
359 sdata->vif.active_links, in _ieee80211_set_active_links()
362 sdata->vif.active_links = old_active; in _ieee80211_set_active_links()
370 link = sdata_dereference(sdata->link[link_id], sdata); in _ieee80211_set_active_links()
390 if (sdata != sta->sdata) in _ieee80211_set_active_links()
397 ret = drv_change_sta_links(local, sdata, &sta->sta, in _ieee80211_set_active_links()
403 ret = ieee80211_key_switch_links(sdata, rem, add); in _ieee80211_set_active_links()
407 if (sdata != sta->sdata) in _ieee80211_set_active_links()
412 ret = drv_change_sta_links(local, sdata, &sta->sta, in _ieee80211_set_active_links()
430 link = sdata_dereference(sdata->link[link_id], sdata); in _ieee80211_set_active_links()
453 ieee80211_link_info_change_notify(sdata, link, in _ieee80211_set_active_links()
469 old_active = sdata->vif.active_links; in _ieee80211_set_active_links()
470 sdata->vif.active_links = active_links; in _ieee80211_set_active_links()
473 ret = drv_change_vif_links(local, sdata, old_active, in _ieee80211_set_active_links()
483 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_set_active_links() local
484 struct ieee80211_local *local = sdata->local; in ieee80211_set_active_links()
493 old_active = sdata->vif.active_links; in ieee80211_set_active_links()
497 if (!drv_can_activate_links(local, sdata, active_links)) in ieee80211_set_active_links()
506 ret = _ieee80211_set_active_links(sdata, in ieee80211_set_active_links()
509 ret = _ieee80211_set_active_links(sdata, active_links); in ieee80211_set_active_links()
512 ret = _ieee80211_set_active_links(sdata, active_links); in ieee80211_set_active_links()
522 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_set_active_links_async() local
527 if (!ieee80211_sdata_running(sdata)) in ieee80211_set_active_links_async()
530 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_set_active_links_async()
533 if (active_links & ~ieee80211_vif_usable_links(&sdata->vif)) in ieee80211_set_active_links_async()
537 if (sdata->vif.active_links == active_links) in ieee80211_set_active_links_async()
540 sdata->desired_active_links = active_links; in ieee80211_set_active_links_async()
541 wiphy_work_queue(sdata->local->hw.wiphy, &sdata->activate_links_work); in ieee80211_set_active_links_async()