Lines Matching full:link
18 struct ieee80211_link_data *link; in ieee80211_chanctx_num_assigned() local
23 list_for_each_entry(link, &ctx->assigned_links, assigned_chanctx_list) in ieee80211_chanctx_num_assigned()
32 struct ieee80211_link_data *link; in ieee80211_chanctx_num_reserved() local
37 list_for_each_entry(link, &ctx->reserved_links, reserved_chanctx_list) in ieee80211_chanctx_num_reserved()
70 ieee80211_link_get_chanctx(struct ieee80211_link_data *link) in ieee80211_link_get_chanctx() argument
72 struct ieee80211_local *local __maybe_unused = link->sdata->local; in ieee80211_link_get_chanctx()
75 conf = rcu_dereference_protected(link->conf->chanctx_conf, in ieee80211_link_get_chanctx()
88 struct ieee80211_link_data *link; in ieee80211_chanctx_reserved_chandef() local
92 list_for_each_entry(link, &ctx->reserved_links, in ieee80211_chanctx_reserved_chandef()
95 compat = &link->reserved_chandef; in ieee80211_chanctx_reserved_chandef()
97 compat = cfg80211_chandef_compatible(&link->reserved_chandef, in ieee80211_chanctx_reserved_chandef()
111 struct ieee80211_link_data *link; in ieee80211_chanctx_non_reserved_chandef() local
115 list_for_each_entry(link, &ctx->assigned_links, in ieee80211_chanctx_non_reserved_chandef()
117 struct ieee80211_bss_conf *link_conf = link->conf; in ieee80211_chanctx_non_reserved_chandef()
119 if (link->reserved_chanctx) in ieee80211_chanctx_non_reserved_chandef()
204 link_sta = rcu_dereference(sta->link[link_id]); in ieee80211_get_sta_bw()
206 /* no effect if this STA has no presence on this link */ in ieee80211_get_sta_bw()
268 for (link_id = 0; link_id < ARRAY_SIZE(sdata->link); link_id++) { in ieee80211_get_chanctx_vif_max_required_bw()
411 for (link_id = 0; link_id < ARRAY_SIZE(sta->sdata->link); link_id++) { in ieee80211_chan_bw_change()
422 link_sta = rcu_dereference(sta->link[link_id]); in ieee80211_chan_bw_change()
565 for (link_id = 0; link_id < ARRAY_SIZE(sdata->link); link_id++) { in ieee80211_is_radar_required()
566 struct ieee80211_link_data *link; in ieee80211_is_radar_required() local
568 link = rcu_dereference(sdata->link[link_id]); in ieee80211_is_radar_required()
570 if (link && link->radar_required) { in ieee80211_is_radar_required()
598 for (link_id = 0; link_id < ARRAY_SIZE(sdata->link); link_id++) { in ieee80211_chanctx_radar_required()
599 struct ieee80211_link_data *link; in ieee80211_chanctx_radar_required() local
601 link = rcu_dereference(sdata->link[link_id]); in ieee80211_chanctx_radar_required()
602 if (!link) in ieee80211_chanctx_radar_required()
605 if (rcu_access_pointer(link->conf->chanctx_conf) != conf) in ieee80211_chanctx_radar_required()
607 if (!link->radar_required) in ieee80211_chanctx_radar_required()
769 for (link_id = 0; link_id < ARRAY_SIZE(sdata->link); link_id++) { in ieee80211_recalc_chanctx_chantype()
834 static int ieee80211_assign_link_chanctx(struct ieee80211_link_data *link, in ieee80211_assign_link_chanctx() argument
837 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_assign_link_chanctx()
846 conf = rcu_dereference_protected(link->conf->chanctx_conf, in ieee80211_assign_link_chanctx()
852 drv_unassign_vif_chanctx(local, sdata, link->conf, curr_ctx); in ieee80211_assign_link_chanctx()
854 list_del(&link->assigned_chanctx_list); in ieee80211_assign_link_chanctx()
858 ret = drv_assign_vif_chanctx(local, sdata, link->conf, new_ctx); in ieee80211_assign_link_chanctx()
863 list_add(&link->assigned_chanctx_list, in ieee80211_assign_link_chanctx()
868 rcu_assign_pointer(link->conf->chanctx_conf, conf); in ieee80211_assign_link_chanctx()
926 for (link_id = 0; link_id < ARRAY_SIZE(sdata->link); link_id++) { in ieee80211_recalc_smps_chanctx()
927 struct ieee80211_link_data *link; in ieee80211_recalc_smps_chanctx() local
929 link = rcu_dereference(sdata->link[link_id]); in ieee80211_recalc_smps_chanctx()
931 if (!link) in ieee80211_recalc_smps_chanctx()
934 if (rcu_access_pointer(link->conf->chanctx_conf) != &chanctx->conf) in ieee80211_recalc_smps_chanctx()
937 switch (link->smps_mode) { in ieee80211_recalc_smps_chanctx()
940 link->smps_mode); in ieee80211_recalc_smps_chanctx()
943 needed_static = link->needed_rx_chains; in ieee80211_recalc_smps_chanctx()
944 needed_dynamic = link->needed_rx_chains; in ieee80211_recalc_smps_chanctx()
948 needed_dynamic = link->needed_rx_chains; in ieee80211_recalc_smps_chanctx()
989 __ieee80211_link_copy_chanctx_to_vlans(struct ieee80211_link_data *link, in __ieee80211_link_copy_chanctx_to_vlans() argument
992 struct ieee80211_sub_if_data *sdata = link->sdata; in __ieee80211_link_copy_chanctx_to_vlans()
993 unsigned int link_id = link->link_id; in __ieee80211_link_copy_chanctx_to_vlans()
994 struct ieee80211_bss_conf *link_conf = link->conf; in __ieee80211_link_copy_chanctx_to_vlans()
1030 void ieee80211_link_copy_chanctx_to_vlans(struct ieee80211_link_data *link, in ieee80211_link_copy_chanctx_to_vlans() argument
1033 struct ieee80211_local *local = link->sdata->local; in ieee80211_link_copy_chanctx_to_vlans()
1037 __ieee80211_link_copy_chanctx_to_vlans(link, clear); in ieee80211_link_copy_chanctx_to_vlans()
1042 int ieee80211_link_unreserve_chanctx(struct ieee80211_link_data *link) in ieee80211_link_unreserve_chanctx() argument
1044 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_link_unreserve_chanctx()
1045 struct ieee80211_chanctx *ctx = link->reserved_chanctx; in ieee80211_link_unreserve_chanctx()
1052 list_del(&link->reserved_chanctx_list); in ieee80211_link_unreserve_chanctx()
1053 link->reserved_chanctx = NULL; in ieee80211_link_unreserve_chanctx()
1078 int ieee80211_link_reserve_chanctx(struct ieee80211_link_data *link, in ieee80211_link_reserve_chanctx() argument
1083 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_link_reserve_chanctx()
1089 curr_ctx = ieee80211_link_get_chanctx(link); in ieee80211_link_reserve_chanctx()
1105 * Another link already requested this context in ieee80211_link_reserve_chanctx()
1166 list_add(&link->reserved_chanctx_list, &new_ctx->reserved_links); in ieee80211_link_reserve_chanctx()
1167 link->reserved_chanctx = new_ctx; in ieee80211_link_reserve_chanctx()
1168 link->reserved_chandef = *chandef; in ieee80211_link_reserve_chanctx()
1169 link->reserved_radar_required = radar_required; in ieee80211_link_reserve_chanctx()
1170 link->reserved_ready = false; in ieee80211_link_reserve_chanctx()
1176 ieee80211_link_chanctx_reservation_complete(struct ieee80211_link_data *link) in ieee80211_link_chanctx_reservation_complete() argument
1178 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_link_chanctx_reservation_complete()
1186 &link->csa_finalize_work); in ieee80211_link_chanctx_reservation_complete()
1190 &link->u.mgd.chswitch_work); in ieee80211_link_chanctx_reservation_complete()
1207 ieee80211_link_update_chandef(struct ieee80211_link_data *link, in ieee80211_link_update_chandef() argument
1210 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_link_update_chandef()
1211 unsigned int link_id = link->link_id; in ieee80211_link_update_chandef()
1214 link->conf->chandef = *chandef; in ieee80211_link_update_chandef()
1233 ieee80211_link_use_reserved_reassign(struct ieee80211_link_data *link) in ieee80211_link_use_reserved_reassign() argument
1235 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_link_use_reserved_reassign()
1236 struct ieee80211_bss_conf *link_conf = link->conf; in ieee80211_link_use_reserved_reassign()
1247 new_ctx = link->reserved_chanctx; in ieee80211_link_use_reserved_reassign()
1248 old_ctx = ieee80211_link_get_chanctx(link); in ieee80211_link_use_reserved_reassign()
1250 if (WARN_ON(!link->reserved_ready)) in ieee80211_link_use_reserved_reassign()
1264 &link->reserved_chandef); in ieee80211_link_use_reserved_reassign()
1268 if (link_conf->chandef.width != link->reserved_chandef.width) in ieee80211_link_use_reserved_reassign()
1271 ieee80211_link_update_chandef(link, &link->reserved_chandef); in ieee80211_link_use_reserved_reassign()
1278 vif_chsw[0].link_conf = link->conf; in ieee80211_link_use_reserved_reassign()
1280 list_del(&link->reserved_chanctx_list); in ieee80211_link_use_reserved_reassign()
1281 link->reserved_chanctx = NULL; in ieee80211_link_use_reserved_reassign()
1292 list_move(&link->assigned_chanctx_list, &new_ctx->assigned_links); in ieee80211_link_use_reserved_reassign()
1296 __ieee80211_link_copy_chanctx_to_vlans(link, false); in ieee80211_link_use_reserved_reassign()
1308 ieee80211_link_info_change_notify(sdata, link, changed); in ieee80211_link_use_reserved_reassign()
1311 ieee80211_link_chanctx_reservation_complete(link); in ieee80211_link_use_reserved_reassign()
1316 ieee80211_link_use_reserved_assign(struct ieee80211_link_data *link) in ieee80211_link_use_reserved_assign() argument
1318 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_link_use_reserved_assign()
1324 old_ctx = ieee80211_link_get_chanctx(link); in ieee80211_link_use_reserved_assign()
1325 new_ctx = link->reserved_chanctx; in ieee80211_link_use_reserved_assign()
1327 if (WARN_ON(!link->reserved_ready)) in ieee80211_link_use_reserved_assign()
1341 &link->reserved_chandef); in ieee80211_link_use_reserved_assign()
1347 list_del(&link->reserved_chanctx_list); in ieee80211_link_use_reserved_assign()
1348 link->reserved_chanctx = NULL; in ieee80211_link_use_reserved_assign()
1350 err = ieee80211_assign_link_chanctx(link, new_ctx); in ieee80211_link_use_reserved_assign()
1359 ieee80211_link_chanctx_reservation_complete(link); in ieee80211_link_use_reserved_assign()
1364 ieee80211_link_has_in_place_reservation(struct ieee80211_link_data *link) in ieee80211_link_has_in_place_reservation() argument
1366 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_link_has_in_place_reservation()
1371 new_ctx = link->reserved_chanctx; in ieee80211_link_has_in_place_reservation()
1372 old_ctx = ieee80211_link_get_chanctx(link); in ieee80211_link_has_in_place_reservation()
1412 struct ieee80211_link_data *link; in ieee80211_chsw_switch_vifs() local
1433 list_for_each_entry(link, &ctx->reserved_links, in ieee80211_chsw_switch_vifs()
1435 if (!ieee80211_link_has_in_place_reservation(link)) in ieee80211_chsw_switch_vifs()
1438 old_ctx = ieee80211_link_get_chanctx(link); in ieee80211_chsw_switch_vifs()
1439 vif_chsw[i].vif = &link->sdata->vif; in ieee80211_chsw_switch_vifs()
1442 vif_chsw[i].link_conf = link->conf; in ieee80211_chsw_switch_vifs()
1522 struct ieee80211_link_data *link; in ieee80211_vif_use_reserved_switch() local
1541 list_for_each_entry(link, &ctx->replace_ctx->assigned_links, in ieee80211_vif_use_reserved_switch()
1544 if (link->reserved_chanctx) { in ieee80211_vif_use_reserved_switch()
1546 if (link->reserved_ready) in ieee80211_vif_use_reserved_switch()
1563 list_for_each_entry(link, &ctx->reserved_links, in ieee80211_vif_use_reserved_switch()
1565 if (ieee80211_link_has_in_place_reservation(link) && in ieee80211_vif_use_reserved_switch()
1566 !link->reserved_ready) in ieee80211_vif_use_reserved_switch()
1569 old_ctx = ieee80211_link_get_chanctx(link); in ieee80211_vif_use_reserved_switch()
1580 if (link->reserved_radar_required) in ieee80211_vif_use_reserved_switch()
1623 struct ieee80211_link_data *link, *link_tmp; in ieee80211_vif_use_reserved_switch() local
1633 list_for_each_entry(link, &ctx->reserved_links, in ieee80211_vif_use_reserved_switch()
1635 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_vif_use_reserved_switch()
1636 struct ieee80211_bss_conf *link_conf = link->conf; in ieee80211_vif_use_reserved_switch()
1639 if (!ieee80211_link_has_in_place_reservation(link)) in ieee80211_vif_use_reserved_switch()
1646 __ieee80211_link_copy_chanctx_to_vlans(link, in ieee80211_vif_use_reserved_switch()
1651 link->radar_required = link->reserved_radar_required; in ieee80211_vif_use_reserved_switch()
1653 if (link_conf->chandef.width != link->reserved_chandef.width) in ieee80211_vif_use_reserved_switch()
1656 ieee80211_link_update_chandef(link, &link->reserved_chandef); in ieee80211_vif_use_reserved_switch()
1659 link, in ieee80211_vif_use_reserved_switch()
1670 list_for_each_entry_safe(link, link_tmp, &ctx->reserved_links, in ieee80211_vif_use_reserved_switch()
1672 if (ieee80211_link_get_chanctx(link) != ctx) in ieee80211_vif_use_reserved_switch()
1675 list_del(&link->reserved_chanctx_list); in ieee80211_vif_use_reserved_switch()
1676 list_move(&link->assigned_chanctx_list, in ieee80211_vif_use_reserved_switch()
1678 link->reserved_chanctx = NULL; in ieee80211_vif_use_reserved_switch()
1680 ieee80211_link_chanctx_reservation_complete(link); in ieee80211_vif_use_reserved_switch()
1690 list_for_each_entry_safe(link, link_tmp, &ctx->reserved_links, in ieee80211_vif_use_reserved_switch()
1692 if (WARN_ON(ieee80211_link_has_in_place_reservation(link))) in ieee80211_vif_use_reserved_switch()
1695 if (WARN_ON(link->reserved_chanctx != ctx)) in ieee80211_vif_use_reserved_switch()
1698 if (!link->reserved_ready) in ieee80211_vif_use_reserved_switch()
1701 if (ieee80211_link_get_chanctx(link)) in ieee80211_vif_use_reserved_switch()
1702 err = ieee80211_link_use_reserved_reassign(link); in ieee80211_vif_use_reserved_switch()
1704 err = ieee80211_link_use_reserved_assign(link); in ieee80211_vif_use_reserved_switch()
1707 link_info(link, in ieee80211_vif_use_reserved_switch()
1710 ieee80211_link_unreserve_chanctx(link); in ieee80211_vif_use_reserved_switch()
1712 &link->sdata->wdev, in ieee80211_vif_use_reserved_switch()
1738 struct ieee80211_link_data *link, *link_tmp; in ieee80211_vif_use_reserved_switch() local
1743 list_for_each_entry_safe(link, link_tmp, &ctx->reserved_links, in ieee80211_vif_use_reserved_switch()
1745 ieee80211_link_unreserve_chanctx(link); in ieee80211_vif_use_reserved_switch()
1746 ieee80211_link_chanctx_reservation_complete(link); in ieee80211_vif_use_reserved_switch()
1753 static void __ieee80211_link_release_channel(struct ieee80211_link_data *link) in __ieee80211_link_release_channel() argument
1755 struct ieee80211_sub_if_data *sdata = link->sdata; in __ieee80211_link_release_channel()
1756 struct ieee80211_bss_conf *link_conf = link->conf; in __ieee80211_link_release_channel()
1771 if (link->reserved_chanctx) { in __ieee80211_link_release_channel()
1772 if (link->reserved_chanctx->replace_state == IEEE80211_CHANCTX_REPLACES_OTHER && in __ieee80211_link_release_channel()
1773 ieee80211_chanctx_num_reserved(local, link->reserved_chanctx) > 1) in __ieee80211_link_release_channel()
1776 ieee80211_link_unreserve_chanctx(link); in __ieee80211_link_release_channel()
1779 ieee80211_assign_link_chanctx(link, NULL); in __ieee80211_link_release_channel()
1783 link->radar_required = false; in __ieee80211_link_release_channel()
1790 int ieee80211_link_use_channel(struct ieee80211_link_data *link, in ieee80211_link_use_channel() argument
1794 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_link_use_channel()
1803 !(sdata->vif.active_links & BIT(link->link_id))) { in ieee80211_link_use_channel()
1804 ieee80211_link_update_chandef(link, chandef); in ieee80211_link_use_channel()
1818 link->radar_required = ret; in ieee80211_link_use_channel()
1825 __ieee80211_link_release_channel(link); in ieee80211_link_use_channel()
1835 ieee80211_link_update_chandef(link, chandef); in ieee80211_link_use_channel()
1837 ret = ieee80211_assign_link_chanctx(link, ctx); in ieee80211_link_use_channel()
1849 link->radar_required = false; in ieee80211_link_use_channel()
1855 int ieee80211_link_use_reserved_context(struct ieee80211_link_data *link) in ieee80211_link_use_reserved_context() argument
1857 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_link_use_reserved_context()
1866 new_ctx = link->reserved_chanctx; in ieee80211_link_use_reserved_context()
1867 old_ctx = ieee80211_link_get_chanctx(link); in ieee80211_link_use_reserved_context()
1876 if (WARN_ON(link->reserved_ready)) in ieee80211_link_use_reserved_context()
1879 link->reserved_ready = true; in ieee80211_link_use_reserved_context()
1883 return ieee80211_link_use_reserved_reassign(link); in ieee80211_link_use_reserved_context()
1885 return ieee80211_link_use_reserved_assign(link); in ieee80211_link_use_reserved_context()
1917 int ieee80211_link_change_bandwidth(struct ieee80211_link_data *link, in ieee80211_link_change_bandwidth() argument
1921 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_link_change_bandwidth()
1922 struct ieee80211_bss_conf *link_conf = link->conf; in ieee80211_link_change_bandwidth()
1980 ieee80211_link_update_chandef(link, chandef); in ieee80211_link_change_bandwidth()
1991 void ieee80211_link_release_channel(struct ieee80211_link_data *link) in ieee80211_link_release_channel() argument
1993 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_link_release_channel()
1996 if (rcu_access_pointer(link->conf->chanctx_conf)) { in ieee80211_link_release_channel()
1998 __ieee80211_link_release_channel(link); in ieee80211_link_release_channel()
2003 void ieee80211_link_vlan_copy_chanctx(struct ieee80211_link_data *link) in ieee80211_link_vlan_copy_chanctx() argument
2005 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_link_vlan_copy_chanctx()
2006 unsigned int link_id = link->link_id; in ieee80211_link_vlan_copy_chanctx()
2007 struct ieee80211_bss_conf *link_conf = link->conf; in ieee80211_link_vlan_copy_chanctx()