Lines Matching +full:timing +full:- +full:role

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2020-2022 Realtek Corporation
83 offset = (primary_freq - center_freq - 10) / 20; in rtw89_get_primary_chan_idx()
86 offset = (center_freq - primary_freq - 10) / 20; in rtw89_get_primary_chan_idx()
105 return (prisb_cal_ofst[bw] + pri_ch - central_ch) / 4; in rtw89_get_primary_sb_idx()
115 chan->channel = center_chan; in rtw89_chan_create()
116 chan->primary_channel = primary_chan; in rtw89_chan_create()
117 chan->band_type = band; in rtw89_chan_create()
118 chan->band_width = bandwidth; in rtw89_chan_create()
123 chan->freq = center_freq; in rtw89_chan_create()
124 chan->subband_type = rtw89_get_subband_type(band, center_chan); in rtw89_chan_create()
125 chan->pri_ch_idx = rtw89_get_primary_chan_idx(bandwidth, center_freq, in rtw89_chan_create()
127 chan->pri_sb_idx = rtw89_get_primary_sb_idx(center_chan, primary_chan, in rtw89_chan_create()
135 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_assign_entity_chan()
136 struct rtw89_chan *chan = &hal->chanctx[idx].chan; in rtw89_assign_entity_chan()
137 struct rtw89_chan_rcd *rcd = &hal->chanctx[idx].rcd; in rtw89_assign_entity_chan()
140 rcd->prev_primary_channel = chan->primary_channel; in rtw89_assign_entity_chan()
141 rcd->prev_band_type = chan->band_type; in rtw89_assign_entity_chan()
142 band_changed = new->band_type != chan->band_type; in rtw89_assign_entity_chan()
143 rcd->band_changed = band_changed; in rtw89_assign_entity_chan()
154 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_iterate_entity_chan()
159 lockdep_assert_wiphy(rtwdev->hw->wiphy); in rtw89_iterate_entity_chan()
161 for_each_set_bit(idx, hal->entity_map, NUM_OF_RTW89_CHANCTX) { in rtw89_iterate_entity_chan()
176 struct rtw89_hal *hal = &rtwdev->hal; in __rtw89_config_entity_chandef()
178 hal->chanctx[idx].chandef = *chandef; in __rtw89_config_entity_chandef()
181 set_bit(idx, hal->entity_map); in __rtw89_config_entity_chandef()
195 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_config_roc_chandef()
199 cur = atomic_cmpxchg(&hal->roc_chanctx_idx, in rtw89_config_roc_chandef()
207 hal->roc_chandef = *chandef; in rtw89_config_roc_chandef()
209 cur = atomic_cmpxchg(&hal->roc_chanctx_idx, idx, in rtw89_config_roc_chandef()
233 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_entity_init()
234 struct rtw89_entity_mgnt *mgnt = &hal->entity_mgnt; in rtw89_entity_init()
236 hal->entity_pause = false; in rtw89_entity_init()
237 bitmap_zero(hal->entity_map, NUM_OF_RTW89_CHANCTX); in rtw89_entity_init()
238 bitmap_zero(hal->changes, NUM_OF_RTW89_CHANCTX_CHANGES); in rtw89_entity_init()
239 atomic_set(&hal->roc_chanctx_idx, RTW89_CHANCTX_IDLE); in rtw89_entity_init()
241 INIT_LIST_HEAD(&mgnt->active_list); in rtw89_entity_init()
252 if (rtwvif_link->chanctx_assigned) in rtw89_vif_is_active_role()
261 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_entity_calculate_weight()
266 for_each_set_bit(idx, hal->entity_map, NUM_OF_RTW89_CHANCTX) { in rtw89_entity_calculate_weight()
267 cfg = hal->chanctx[idx].cfg; in rtw89_entity_calculate_weight()
270 w->active_chanctxs = 1; in rtw89_entity_calculate_weight()
274 if (cfg->ref_count > 0) in rtw89_entity_calculate_weight()
275 w->active_chanctxs++; in rtw89_entity_calculate_weight()
280 w->active_roles++; in rtw89_entity_calculate_weight()
287 struct rtw89_vif *rtwvif = rtwvif_link->rtwvif; in rtw89_normalize_link_chanctx()
290 if (unlikely(!rtwvif_link->chanctx_assigned)) in rtw89_normalize_link_chanctx()
294 if (!cur || !cur->chanctx_assigned) in rtw89_normalize_link_chanctx()
300 rtw89_swap_chanctx(rtwdev, rtwvif_link->chanctx_idx, cur->chanctx_idx); in rtw89_normalize_link_chanctx()
307 struct rtw89_hal *hal = &rtwdev->hal; in __rtw89_mgnt_chan_get()
308 struct rtw89_entity_mgnt *mgnt = &hal->entity_mgnt; in __rtw89_mgnt_chan_get()
314 lockdep_assert_wiphy(rtwdev->hw->wiphy); in __rtw89_mgnt_chan_get()
336 chanctx_idx = mgnt->chanctx_tbl[role_index][link_index]; in __rtw89_mgnt_chan_get()
340 roc_idx = atomic_read(&hal->roc_chanctx_idx); in __rtw89_mgnt_chan_get()
363 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_entity_recalc_mgnt_roles()
364 struct rtw89_entity_mgnt *mgnt = &hal->entity_mgnt; in rtw89_entity_recalc_mgnt_roles()
366 struct rtw89_vif *role; in rtw89_entity_recalc_mgnt_roles() local
370 lockdep_assert_wiphy(rtwdev->hw->wiphy); in rtw89_entity_recalc_mgnt_roles()
373 mgnt->active_roles[i] = NULL; in rtw89_entity_recalc_mgnt_roles()
377 mgnt->chanctx_tbl[i][j] = RTW89_CHANCTX_IDLE; in rtw89_entity_recalc_mgnt_roles()
380 /* To be consistent with legacy behavior, expect the first active role in rtw89_entity_recalc_mgnt_roles()
384 list_for_each_entry(role, &mgnt->active_list, mgnt_entry) { in rtw89_entity_recalc_mgnt_roles()
385 for (i = 0; i < role->links_inst_valid_num; i++) { in rtw89_entity_recalc_mgnt_roles()
386 link = rtw89_vif_get_link_inst(role, i); in rtw89_entity_recalc_mgnt_roles()
387 if (!link || !link->chanctx_assigned) in rtw89_entity_recalc_mgnt_roles()
390 if (link->chanctx_idx == RTW89_CHANCTX_0) { in rtw89_entity_recalc_mgnt_roles()
393 list_del(&role->mgnt_entry); in rtw89_entity_recalc_mgnt_roles()
394 list_add(&role->mgnt_entry, &mgnt->active_list); in rtw89_entity_recalc_mgnt_roles()
401 list_for_each_entry(role, &mgnt->active_list, mgnt_entry) { in rtw89_entity_recalc_mgnt_roles()
409 for (i = 0; i < role->links_inst_valid_num; i++) { in rtw89_entity_recalc_mgnt_roles()
410 link = rtw89_vif_get_link_inst(role, i); in rtw89_entity_recalc_mgnt_roles()
411 if (!link || !link->chanctx_assigned) in rtw89_entity_recalc_mgnt_roles()
414 mgnt->chanctx_tbl[pos][i] = link->chanctx_idx; in rtw89_entity_recalc_mgnt_roles()
417 mgnt->active_roles[pos++] = role; in rtw89_entity_recalc_mgnt_roles()
424 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_entity_recalc()
431 lockdep_assert_wiphy(rtwdev->hw->wiphy); in rtw89_entity_recalc()
433 bitmap_copy(recalc_map, hal->entity_map, NUM_OF_RTW89_CHANCTX); in rtw89_entity_recalc()
483 if (hal->entity_pause) in rtw89_entity_recalc()
493 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_chanctx_notify()
494 const struct rtw89_chanctx_listener *listener = chip->chanctx_listener; in rtw89_chanctx_notify()
501 if (!listener->callbacks[i]) in rtw89_chanctx_notify()
508 listener->callbacks[i](rtwdev, state); in rtw89_chanctx_notify()
514 enum rtw89_chip_gen chip_gen = rtwdev->chip->chip_gen; in rtw89_concurrent_via_mrc()
523 * immediately as long as iterator returns a non-zero value.
533 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_iterate_mcc_roles()
535 &mcc->role_ref, in rtw89_iterate_mcc_roles()
536 &mcc->role_aux, in rtw89_iterate_mcc_roles()
553 struct rtw89_mcc_role *role, u64 tsf) in rtw89_mcc_get_tbtt_ofst() argument
555 struct rtw89_vif_link *rtwvif_link = role->rtwvif_link; in rtw89_mcc_get_tbtt_ofst()
556 u32 bcn_intvl_us = ieee80211_tu_to_usec(role->beacon_interval); in rtw89_mcc_get_tbtt_ofst()
557 u64 sync_tsf = READ_ONCE(rtwvif_link->sync_bcn_tsf); in rtw89_mcc_get_tbtt_ofst()
566 div_u64_rem(tsf - sync_tsf, bcn_intvl_us, &remainder); in rtw89_mcc_get_tbtt_ofst()
573 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_req_tsf()
574 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mcc_fw_req_tsf()
575 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mcc_fw_req_tsf()
580 req.group = mcc->group; in __mcc_fw_req_tsf()
581 req.macid_x = ref->rtwvif_link->mac_id; in __mcc_fw_req_tsf()
582 req.macid_y = aux->rtwvif_link->mac_id; in __mcc_fw_req_tsf()
598 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mrc_fw_req_tsf()
599 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mrc_fw_req_tsf()
600 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mrc_fw_req_tsf()
608 arg.infos[0].band = ref->rtwvif_link->mac_idx; in __mrc_fw_req_tsf()
609 arg.infos[0].port = ref->rtwvif_link->port; in __mrc_fw_req_tsf()
610 arg.infos[1].band = aux->rtwvif_link->mac_idx; in __mrc_fw_req_tsf()
611 arg.infos[1].port = aux->rtwvif_link->port; in __mrc_fw_req_tsf()
628 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_get_bcn_ofst()
629 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_get_bcn_ofst()
630 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_get_bcn_ofst()
631 u32 bcn_intvl_ref_us = ieee80211_tu_to_usec(ref->beacon_interval); in rtw89_mcc_get_bcn_ofst()
650 return (tbtt_ofst_ref - tbtt_ofst_aux) / 1024; in rtw89_mcc_get_bcn_ofst()
660 if (idx >= ARRAY_SIZE(mcc_role->macid_bitmap)) in rtw89_mcc_role_fw_macid_bitmap_set_bit()
663 mcc_role->macid_bitmap[idx] |= BIT(pos); in rtw89_mcc_role_fw_macid_bitmap_set_bit()
673 for (i = 0; i < ARRAY_SIZE(mcc_role->macid_bitmap); i++) { in rtw89_mcc_role_fw_macid_bitmap_to_u32()
679 if (mcc_role->macid_bitmap[i] & BIT(j)) in rtw89_mcc_role_fw_macid_bitmap_to_u32()
691 struct rtw89_vif *target = mcc_role->rtwvif_link->rtwvif; in rtw89_mcc_role_macid_sta_iter()
693 struct rtw89_vif *rtwvif = rtwsta->rtwvif; in rtw89_mcc_role_macid_sta_iter()
694 struct rtw89_dev *rtwdev = rtwsta->rtwdev; in rtw89_mcc_role_macid_sta_iter()
702 rtw89_err(rtwdev, "mcc sta macid: find no link on HW-0\n"); in rtw89_mcc_role_macid_sta_iter()
706 rtw89_mcc_role_fw_macid_bitmap_set_bit(mcc_role, rtwsta_link->mac_id); in rtw89_mcc_role_macid_sta_iter()
712 struct rtw89_vif_link *rtwvif_link = mcc_role->rtwvif_link; in rtw89_mcc_fill_role_macid_bitmap()
714 rtw89_mcc_role_fw_macid_bitmap_set_bit(mcc_role, rtwvif_link->mac_id); in rtw89_mcc_fill_role_macid_bitmap()
715 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_mcc_fill_role_macid_bitmap()
723 struct rtw89_mcc_policy *policy = &mcc_role->policy; in rtw89_mcc_fill_role_policy()
725 policy->c2h_rpt = RTW89_FW_MCC_C2H_RPT_ALL; in rtw89_mcc_fill_role_policy()
726 policy->tx_null_early = RTW89_MCC_DFLT_TX_NULL_EARLY; in rtw89_mcc_fill_role_policy()
727 policy->in_curr_ch = false; in rtw89_mcc_fill_role_policy()
728 policy->dis_sw_retry = true; in rtw89_mcc_fill_role_policy()
729 policy->sw_retry_count = false; in rtw89_mcc_fill_role_policy()
731 if (mcc_role->is_go) in rtw89_mcc_fill_role_policy()
732 policy->dis_tx_null = true; in rtw89_mcc_fill_role_policy()
734 policy->dis_tx_null = false; in rtw89_mcc_fill_role_policy()
740 struct rtw89_vif_link *rtwvif_link = mcc_role->rtwvif_link; in rtw89_mcc_fill_role_limit()
743 u32 bcn_intvl_us = ieee80211_tu_to_usec(mcc_role->beacon_interval); in rtw89_mcc_fill_role_limit()
750 if (!mcc_role->is_go && !mcc_role->is_gc) in rtw89_mcc_fill_role_limit()
759 noa_desc = &bss_conf->p2p_noa_attr.desc[i]; in rtw89_mcc_fill_role_limit()
760 if (noa_desc->count == 255) in rtw89_mcc_fill_role_limit()
768 start_time = le32_to_cpu(noa_desc->start_time); in rtw89_mcc_fill_role_limit()
769 interval = le32_to_cpu(noa_desc->interval); in rtw89_mcc_fill_role_limit()
770 duration = le32_to_cpu(noa_desc->duration); in rtw89_mcc_fill_role_limit()
776 "MCC role limit: mismatch interval: %d vs. %d\n", in rtw89_mcc_fill_role_limit()
789 max_dur_us = interval - duration; in rtw89_mcc_fill_role_limit()
790 max_tob_us = max_dur_us - max_toa_us; in rtw89_mcc_fill_role_limit()
794 "MCC role limit: hit boundary\n"); in rtw89_mcc_fill_role_limit()
800 "MCC role limit: insufficient duration\n"); in rtw89_mcc_fill_role_limit()
804 mcc_role->limit.max_toa = max_toa_us / 1024; in rtw89_mcc_fill_role_limit()
805 mcc_role->limit.max_tob = max_tob_us / 1024; in rtw89_mcc_fill_role_limit()
806 mcc_role->limit.max_dur = mcc_role->limit.max_toa + mcc_role->limit.max_tob; in rtw89_mcc_fill_role_limit()
807 mcc_role->limit.enable = true; in rtw89_mcc_fill_role_limit()
810 "MCC role limit: max_toa %d, max_tob %d, max_dur %d\n", in rtw89_mcc_fill_role_limit()
811 mcc_role->limit.max_toa, mcc_role->limit.max_tob, in rtw89_mcc_fill_role_limit()
812 mcc_role->limit.max_dur); in rtw89_mcc_fill_role_limit()
817 struct rtw89_mcc_role *role) in rtw89_mcc_fill_role() argument
822 memset(role, 0, sizeof(*role)); in rtw89_mcc_fill_role()
823 role->rtwvif_link = rtwvif_link; in rtw89_mcc_fill_role()
828 role->beacon_interval = bss_conf->beacon_int; in rtw89_mcc_fill_role()
832 if (!role->beacon_interval) { in rtw89_mcc_fill_role()
834 "cannot handle MCC role without beacon interval\n"); in rtw89_mcc_fill_role()
835 return -EINVAL; in rtw89_mcc_fill_role()
838 role->duration = role->beacon_interval / 2; in rtw89_mcc_fill_role()
840 chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx); in rtw89_mcc_fill_role()
841 role->is_2ghz = chan->band_type == RTW89_BAND_2G; in rtw89_mcc_fill_role()
842 role->is_go = rtwvif_link->wifi_role == RTW89_WIFI_ROLE_P2P_GO; in rtw89_mcc_fill_role()
843 role->is_gc = rtwvif_link->wifi_role == RTW89_WIFI_ROLE_P2P_CLIENT; in rtw89_mcc_fill_role()
845 rtw89_mcc_fill_role_macid_bitmap(rtwdev, role); in rtw89_mcc_fill_role()
846 rtw89_mcc_fill_role_policy(rtwdev, role); in rtw89_mcc_fill_role()
847 rtw89_mcc_fill_role_limit(rtwdev, role); in rtw89_mcc_fill_role()
850 "MCC role: bcn_intvl %d, is_2ghz %d, is_go %d, is_gc %d\n", in rtw89_mcc_fill_role()
851 role->beacon_interval, role->is_2ghz, role->is_go, role->is_gc); in rtw89_mcc_fill_role()
857 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_fill_bt_role()
858 struct rtw89_mcc_bt_role *bt_role = &mcc->bt_role; in rtw89_mcc_fill_bt_role()
861 bt_role->duration = rtw89_coex_query_bt_req_len(rtwdev, RTW89_PHY_0); in rtw89_mcc_fill_bt_role()
863 rtw89_debug(rtwdev, RTW89_DBG_CHAN, "MCC bt role: dur %d\n", in rtw89_mcc_fill_bt_role()
864 bt_role->duration); in rtw89_mcc_fill_bt_role()
880 struct rtw89_vif_link *role_vif = sel->bind_vif[ordered_idx]; in rtw89_mcc_fill_role_iterator()
884 rtw89_warn(rtwdev, "cannot handle MCC without role[%d]\n", in rtw89_mcc_fill_role_iterator()
886 return -EINVAL; in rtw89_mcc_fill_role_iterator()
890 "MCC fill role[%d] with vif <macid %d>\n", in rtw89_mcc_fill_role_iterator()
891 ordered_idx, role_vif->mac_id); in rtw89_mcc_fill_role_iterator()
902 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_mcc_fill_all_roles()
903 struct rtw89_entity_mgnt *mgnt = &hal->entity_mgnt; in rtw89_mcc_fill_all_roles()
911 rtwvif = mgnt->active_roles[i]; in rtw89_mcc_fill_all_roles()
917 rtw89_err(rtwdev, "mcc fill roles: find no link on HW-0\n"); in rtw89_mcc_fill_all_roles()
935 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_assign_pattern()
936 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_assign_pattern()
937 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_assign_pattern()
938 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_assign_pattern()
939 struct rtw89_mcc_pattern *pattern = &config->pattern; in rtw89_mcc_assign_pattern()
943 new->tob_ref, new->toa_ref, new->tob_aux, new->toa_aux); in rtw89_mcc_assign_pattern()
946 memset(&pattern->courtesy, 0, sizeof(pattern->courtesy)); in rtw89_mcc_assign_pattern()
948 if (pattern->tob_aux <= 0 || pattern->toa_aux <= 0) { in rtw89_mcc_assign_pattern()
949 pattern->courtesy.macid_tgt = aux->rtwvif_link->mac_id; in rtw89_mcc_assign_pattern()
950 pattern->courtesy.macid_src = ref->rtwvif_link->mac_id; in rtw89_mcc_assign_pattern()
951 pattern->courtesy.slot_num = RTW89_MCC_DFLT_COURTESY_SLOT; in rtw89_mcc_assign_pattern()
952 pattern->courtesy.enable = true; in rtw89_mcc_assign_pattern()
953 } else if (pattern->tob_ref <= 0 || pattern->toa_ref <= 0) { in rtw89_mcc_assign_pattern()
954 pattern->courtesy.macid_tgt = ref->rtwvif_link->mac_id; in rtw89_mcc_assign_pattern()
955 pattern->courtesy.macid_src = aux->rtwvif_link->mac_id; in rtw89_mcc_assign_pattern()
956 pattern->courtesy.slot_num = RTW89_MCC_DFLT_COURTESY_SLOT; in rtw89_mcc_assign_pattern()
957 pattern->courtesy.enable = true; in rtw89_mcc_assign_pattern()
962 pattern->plan, pattern->courtesy.enable); in rtw89_mcc_assign_pattern()
964 if (!pattern->courtesy.enable) in rtw89_mcc_assign_pattern()
969 pattern->courtesy.macid_tgt, pattern->courtesy.macid_src, in rtw89_mcc_assign_pattern()
970 pattern->courtesy.slot_num); in rtw89_mcc_assign_pattern()
973 /* The follow-up roughly shows the relationship between the parameters
991 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __rtw89_mcc_calc_pattern_loose()
992 struct rtw89_mcc_role *ref = &mcc->role_ref; in __rtw89_mcc_calc_pattern_loose()
993 struct rtw89_mcc_role *aux = &mcc->role_aux; in __rtw89_mcc_calc_pattern_loose()
994 struct rtw89_mcc_config *config = &mcc->config; in __rtw89_mcc_calc_pattern_loose()
995 u16 bcn_ofst = config->beacon_offset; in __rtw89_mcc_calc_pattern_loose()
1008 max_bcn_ofst = ref->duration + aux->duration; in __rtw89_mcc_calc_pattern_loose()
1009 if (ref->limit.enable) in __rtw89_mcc_calc_pattern_loose()
1011 ref->limit.max_toa + aux->duration); in __rtw89_mcc_calc_pattern_loose()
1012 else if (aux->limit.enable) in __rtw89_mcc_calc_pattern_loose()
1014 ref->duration + aux->limit.max_tob); in __rtw89_mcc_calc_pattern_loose()
1016 if (bcn_ofst > max_bcn_ofst && bcn_ofst >= mcc->bt_role.duration) { in __rtw89_mcc_calc_pattern_loose()
1017 bt_dur_in_mid = mcc->bt_role.duration; in __rtw89_mcc_calc_pattern_loose()
1018 ptrn->plan = RTW89_MCC_PLAN_MID_BT; in __rtw89_mcc_calc_pattern_loose()
1024 ptrn->plan, bcn_ofst); in __rtw89_mcc_calc_pattern_loose()
1026 res = bcn_ofst - bt_dur_in_mid; in __rtw89_mcc_calc_pattern_loose()
1027 upper = min_t(s16, ref->duration, res); in __rtw89_mcc_calc_pattern_loose()
1030 if (ref->limit.enable) { in __rtw89_mcc_calc_pattern_loose()
1031 upper = min_t(s16, upper, ref->limit.max_toa); in __rtw89_mcc_calc_pattern_loose()
1032 lower = max_t(s16, lower, ref->duration - ref->limit.max_tob); in __rtw89_mcc_calc_pattern_loose()
1033 } else if (aux->limit.enable) { in __rtw89_mcc_calc_pattern_loose()
1035 res - (aux->duration - aux->limit.max_toa)); in __rtw89_mcc_calc_pattern_loose()
1036 lower = max_t(s16, lower, res - aux->limit.max_tob); in __rtw89_mcc_calc_pattern_loose()
1040 ptrn->toa_ref = (upper + lower) / 2; in __rtw89_mcc_calc_pattern_loose()
1042 ptrn->toa_ref = lower; in __rtw89_mcc_calc_pattern_loose()
1044 ptrn->tob_ref = ref->duration - ptrn->toa_ref; in __rtw89_mcc_calc_pattern_loose()
1045 ptrn->tob_aux = res - ptrn->toa_ref; in __rtw89_mcc_calc_pattern_loose()
1046 ptrn->toa_aux = aux->duration - ptrn->tob_aux; in __rtw89_mcc_calc_pattern_loose()
1049 /* In strict pattern calculation, we consider timing that might need
1055 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __rtw89_mcc_calc_pattern_strict()
1056 struct rtw89_mcc_role *ref = &mcc->role_ref; in __rtw89_mcc_calc_pattern_strict()
1057 struct rtw89_mcc_role *aux = &mcc->role_aux; in __rtw89_mcc_calc_pattern_strict()
1058 struct rtw89_mcc_config *config = &mcc->config; in __rtw89_mcc_calc_pattern_strict()
1061 u16 bcn_ofst = config->beacon_offset; in __rtw89_mcc_calc_pattern_strict()
1069 ptrn->plan, bcn_ofst); in __rtw89_mcc_calc_pattern_strict()
1071 if (ptrn->plan == RTW89_MCC_PLAN_MID_BT) in __rtw89_mcc_calc_pattern_strict()
1072 bt_dur_in_mid = mcc->bt_role.duration; in __rtw89_mcc_calc_pattern_strict()
1076 if (ref->duration < min_tob + min_toa) { in __rtw89_mcc_calc_pattern_strict()
1079 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
1082 if (aux->duration < min_tob + min_toa) { in __rtw89_mcc_calc_pattern_strict()
1085 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
1088 res = bcn_ofst - min_toa - min_tob - bt_dur_in_mid; in __rtw89_mcc_calc_pattern_strict()
1092 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
1095 upper_toa_ref = min_t(s16, min_toa + res, ref->duration - min_tob); in __rtw89_mcc_calc_pattern_strict()
1097 upper_tob_aux = min_t(s16, min_tob + res, aux->duration - min_toa); in __rtw89_mcc_calc_pattern_strict()
1100 if (ref->limit.enable) { in __rtw89_mcc_calc_pattern_strict()
1101 if (min_tob > ref->limit.max_tob || min_toa > ref->limit.max_toa) { in __rtw89_mcc_calc_pattern_strict()
1104 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
1107 upper_toa_ref = min_t(s16, upper_toa_ref, ref->limit.max_toa); in __rtw89_mcc_calc_pattern_strict()
1109 ref->duration - ref->limit.max_tob); in __rtw89_mcc_calc_pattern_strict()
1110 } else if (aux->limit.enable) { in __rtw89_mcc_calc_pattern_strict()
1111 if (min_tob > aux->limit.max_tob || min_toa > aux->limit.max_toa) { in __rtw89_mcc_calc_pattern_strict()
1114 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
1117 upper_tob_aux = min_t(s16, upper_tob_aux, aux->limit.max_tob); in __rtw89_mcc_calc_pattern_strict()
1119 aux->duration - aux->limit.max_toa); in __rtw89_mcc_calc_pattern_strict()
1123 bcn_ofst - bt_dur_in_mid - lower_tob_aux); in __rtw89_mcc_calc_pattern_strict()
1125 bcn_ofst - bt_dur_in_mid - upper_tob_aux); in __rtw89_mcc_calc_pattern_strict()
1129 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
1132 ptrn->toa_ref = (upper_toa_ref + lower_toa_ref) / 2; in __rtw89_mcc_calc_pattern_strict()
1133 ptrn->tob_ref = ref->duration - ptrn->toa_ref; in __rtw89_mcc_calc_pattern_strict()
1134 ptrn->tob_aux = bcn_ofst - ptrn->toa_ref - bt_dur_in_mid; in __rtw89_mcc_calc_pattern_strict()
1135 ptrn->toa_aux = aux->duration - ptrn->tob_aux; in __rtw89_mcc_calc_pattern_strict()
1141 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_calc_pattern()
1142 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_calc_pattern()
1143 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_calc_pattern()
1149 if (ref->limit.enable && aux->limit.enable) { in rtw89_mcc_calc_pattern()
1152 return -EINVAL; in rtw89_mcc_calc_pattern()
1155 if (ref->limit.enable && in rtw89_mcc_calc_pattern()
1156 ref->duration > ref->limit.max_tob + ref->limit.max_toa) { in rtw89_mcc_calc_pattern()
1159 return -EINVAL; in rtw89_mcc_calc_pattern()
1162 if (aux->limit.enable && in rtw89_mcc_calc_pattern()
1163 aux->duration > aux->limit.max_tob + aux->limit.max_toa) { in rtw89_mcc_calc_pattern()
1166 return -EINVAL; in rtw89_mcc_calc_pattern()
1201 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_set_default_pattern()
1202 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_set_default_pattern()
1203 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_set_default_pattern()
1210 tmp.tob_ref = ref->duration / 2; in rtw89_mcc_set_default_pattern()
1211 tmp.toa_ref = ref->duration - tmp.tob_ref; in rtw89_mcc_set_default_pattern()
1212 tmp.tob_aux = aux->duration / 2; in rtw89_mcc_set_default_pattern()
1213 tmp.toa_aux = aux->duration - tmp.tob_aux; in rtw89_mcc_set_default_pattern()
1222 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_set_duration_go_sta()
1223 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_set_duration_go_sta()
1224 u16 mcc_intvl = config->mcc_interval; in rtw89_mcc_set_duration_go_sta()
1227 dur_go = clamp_t(u16, role_go->duration, RTW89_MCC_MIN_GO_DURATION, in rtw89_mcc_set_duration_go_sta()
1228 mcc_intvl - RTW89_MCC_MIN_STA_DURATION); in rtw89_mcc_set_duration_go_sta()
1229 if (role_go->limit.enable) in rtw89_mcc_set_duration_go_sta()
1230 dur_go = min(dur_go, role_go->limit.max_dur); in rtw89_mcc_set_duration_go_sta()
1231 dur_sta = mcc_intvl - dur_go; in rtw89_mcc_set_duration_go_sta()
1234 "MCC set dur: (go, sta) {%d, %d} -> {%d, %d}\n", in rtw89_mcc_set_duration_go_sta()
1235 role_go->duration, role_sta->duration, dur_go, dur_sta); in rtw89_mcc_set_duration_go_sta()
1237 role_go->duration = dur_go; in rtw89_mcc_set_duration_go_sta()
1238 role_sta->duration = dur_sta; in rtw89_mcc_set_duration_go_sta()
1243 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_set_duration_gc_sta()
1244 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_set_duration_gc_sta()
1245 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_set_duration_gc_sta()
1246 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_set_duration_gc_sta()
1247 u16 mcc_intvl = config->mcc_interval; in rtw89_mcc_set_duration_gc_sta()
1250 if (ref->duration < RTW89_MCC_MIN_STA_DURATION) { in rtw89_mcc_set_duration_gc_sta()
1252 dur_aux = mcc_intvl - dur_ref; in rtw89_mcc_set_duration_gc_sta()
1253 } else if (aux->duration < RTW89_MCC_MIN_STA_DURATION) { in rtw89_mcc_set_duration_gc_sta()
1255 dur_ref = mcc_intvl - dur_aux; in rtw89_mcc_set_duration_gc_sta()
1257 dur_ref = ref->duration; in rtw89_mcc_set_duration_gc_sta()
1258 dur_aux = mcc_intvl - dur_ref; in rtw89_mcc_set_duration_gc_sta()
1261 if (ref->limit.enable) { in rtw89_mcc_set_duration_gc_sta()
1262 dur_ref = min(dur_ref, ref->limit.max_dur); in rtw89_mcc_set_duration_gc_sta()
1263 dur_aux = mcc_intvl - dur_ref; in rtw89_mcc_set_duration_gc_sta()
1264 } else if (aux->limit.enable) { in rtw89_mcc_set_duration_gc_sta()
1265 dur_aux = min(dur_aux, aux->limit.max_dur); in rtw89_mcc_set_duration_gc_sta()
1266 dur_ref = mcc_intvl - dur_aux; in rtw89_mcc_set_duration_gc_sta()
1270 "MCC set dur: (ref, aux) {%d ~ %d} -> {%d ~ %d}\n", in rtw89_mcc_set_duration_gc_sta()
1271 ref->duration, aux->duration, dur_ref, dur_aux); in rtw89_mcc_set_duration_gc_sta()
1273 ref->duration = dur_ref; in rtw89_mcc_set_duration_gc_sta()
1274 aux->duration = dur_aux; in rtw89_mcc_set_duration_gc_sta()
1293 p->parm[ordered_idx].dur = mcc_role->duration; in rtw89_mcc_mod_dur_get_iterator()
1295 if (mcc_role->is_go) in rtw89_mcc_mod_dur_get_iterator()
1300 p->parm[ordered_idx].room = max_t(s32, p->parm[ordered_idx].dur - min, 0); in rtw89_mcc_mod_dur_get_iterator()
1303 "MCC mod dur: chk role[%u]: dur %u, min %u, room %u\n", in rtw89_mcc_mod_dur_get_iterator()
1304 ordered_idx, p->parm[ordered_idx].dur, min, in rtw89_mcc_mod_dur_get_iterator()
1305 p->parm[ordered_idx].room); in rtw89_mcc_mod_dur_get_iterator()
1307 p->available += p->parm[ordered_idx].room; in rtw89_mcc_mod_dur_get_iterator()
1318 mcc_role->duration = p->parm[ordered_idx].dur; in rtw89_mcc_mod_dur_put_iterator()
1321 "MCC mod dur: set role[%u]: dur %u\n", in rtw89_mcc_mod_dur_put_iterator()
1322 ordered_idx, p->parm[ordered_idx].dur); in rtw89_mcc_mod_dur_put_iterator()
1328 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1329 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1331 u16 mcc_intvl = config->mcc_interval; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1332 u16 bt_dur = mcc->bt_role.duration; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1342 wifi_dur = mcc_intvl - bt_dur; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1345 data.parm[0].dur -= min_t(u16, bt_dur / 2, data.parm[0].room); in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1346 data.parm[1].dur = wifi_dur - data.parm[0].dur; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1348 data.parm[1].dur -= min_t(u16, bt_dur / 2, data.parm[1].room); in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1349 data.parm[0].dur = wifi_dur - data.parm[1].dur; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1355 mcc->bt_role.duration = bt_dur; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1363 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_mod_duration_diff_band_with_bt()
1364 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_mod_duration_diff_band_with_bt()
1368 dur_2ghz = role_2ghz->duration; in rtw89_mcc_mod_duration_diff_band_with_bt()
1369 dur_non_2ghz = role_non_2ghz->duration; in rtw89_mcc_mod_duration_diff_band_with_bt()
1370 mcc_intvl = config->mcc_interval; in rtw89_mcc_mod_duration_diff_band_with_bt()
1371 bt_dur = mcc->bt_role.duration; in rtw89_mcc_mod_duration_diff_band_with_bt()
1388 dur_2ghz = mcc_intvl - dur_non_2ghz; in rtw89_mcc_mod_duration_diff_band_with_bt()
1390 if (role_non_2ghz->limit.enable) { in rtw89_mcc_mod_duration_diff_band_with_bt()
1393 role_non_2ghz->limit.max_dur); in rtw89_mcc_mod_duration_diff_band_with_bt()
1395 dur_non_2ghz = min(dur_non_2ghz, role_non_2ghz->limit.max_dur); in rtw89_mcc_mod_duration_diff_band_with_bt()
1396 dur_2ghz = mcc_intvl - dur_non_2ghz; in rtw89_mcc_mod_duration_diff_band_with_bt()
1403 role_2ghz->duration = dur_2ghz; in rtw89_mcc_mod_duration_diff_band_with_bt()
1404 role_non_2ghz->duration = dur_non_2ghz; in rtw89_mcc_mod_duration_diff_band_with_bt()
1409 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_duration_decision_on_bt()
1410 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_duration_decision_on_bt()
1411 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_duration_decision_on_bt()
1412 struct rtw89_mcc_bt_role *bt_role = &mcc->bt_role; in rtw89_mcc_duration_decision_on_bt()
1414 if (!bt_role->duration) in rtw89_mcc_duration_decision_on_bt()
1417 if (ref->is_2ghz && aux->is_2ghz) { in rtw89_mcc_duration_decision_on_bt()
1425 if (!ref->is_2ghz && !aux->is_2ghz) { in rtw89_mcc_duration_decision_on_bt()
1432 "MCC one role is on 2GHz; modify another for BT duration\n"); in rtw89_mcc_duration_decision_on_bt()
1434 if (ref->is_2ghz) in rtw89_mcc_duration_decision_on_bt()
1447 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_sync_tbtt()
1448 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_sync_tbtt()
1449 u16 beacon_offset_us = ieee80211_tu_to_usec(config->beacon_offset); in rtw89_mcc_sync_tbtt()
1450 u32 bcn_intvl_src_us = ieee80211_tu_to_usec(src->beacon_interval); in rtw89_mcc_sync_tbtt()
1458 ret = rtw89_mac_port_get_tsf(rtwdev, src->rtwvif_link, &tsf_src); in rtw89_mcc_sync_tbtt()
1467 tbtt_tgt = tsf_src - cur_tbtt_ofst_src + beacon_offset_us; in rtw89_mcc_sync_tbtt()
1469 tbtt_tgt = tsf_src - cur_tbtt_ofst_src + in rtw89_mcc_sync_tbtt()
1470 (bcn_intvl_src_us - beacon_offset_us); in rtw89_mcc_sync_tbtt()
1473 tsf_ofst_tgt = bcn_intvl_src_us - remainder; in rtw89_mcc_sync_tbtt()
1475 config->sync.macid_tgt = tgt->rtwvif_link->mac_id; in rtw89_mcc_sync_tbtt()
1476 config->sync.band_tgt = tgt->rtwvif_link->mac_idx; in rtw89_mcc_sync_tbtt()
1477 config->sync.port_tgt = tgt->rtwvif_link->port; in rtw89_mcc_sync_tbtt()
1478 config->sync.macid_src = src->rtwvif_link->mac_id; in rtw89_mcc_sync_tbtt()
1479 config->sync.band_src = src->rtwvif_link->mac_idx; in rtw89_mcc_sync_tbtt()
1480 config->sync.port_src = src->rtwvif_link->port; in rtw89_mcc_sync_tbtt()
1481 config->sync.offset = tsf_ofst_tgt / 1024; in rtw89_mcc_sync_tbtt()
1482 config->sync.enable = true; in rtw89_mcc_sync_tbtt()
1486 config->sync.macid_tgt, config->sync.macid_src, in rtw89_mcc_sync_tbtt()
1487 config->sync.offset); in rtw89_mcc_sync_tbtt()
1489 rtw89_mac_port_tsf_sync(rtwdev, tgt->rtwvif_link, src->rtwvif_link, in rtw89_mcc_sync_tbtt()
1490 config->sync.offset); in rtw89_mcc_sync_tbtt()
1495 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_fill_start_tsf()
1496 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_fill_start_tsf()
1497 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_fill_start_tsf()
1498 u32 bcn_intvl_ref_us = ieee80211_tu_to_usec(ref->beacon_interval); in rtw89_mcc_fill_start_tsf()
1499 u32 tob_ref_us = ieee80211_tu_to_usec(config->pattern.tob_ref); in rtw89_mcc_fill_start_tsf()
1500 struct rtw89_vif_link *rtwvif_link = ref->rtwvif_link; in rtw89_mcc_fill_start_tsf()
1513 if (ref->is_go) in rtw89_mcc_fill_start_tsf()
1519 start_tsf = tsf - cur_tbtt_ofst + bcn_intvl_ref_us - tob_ref_us; in rtw89_mcc_fill_start_tsf()
1523 config->start_tsf = start_tsf; in rtw89_mcc_fill_start_tsf()
1529 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_fill_config()
1530 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_fill_config()
1531 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_fill_config()
1532 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_fill_config()
1538 switch (mcc->mode) { in rtw89_mcc_fill_config()
1540 config->beacon_offset = RTW89_MCC_DFLT_BCN_OFST_TIME; in rtw89_mcc_fill_config()
1541 if (ref->is_go) { in rtw89_mcc_fill_config()
1543 config->mcc_interval = ref->beacon_interval; in rtw89_mcc_fill_config()
1547 config->mcc_interval = aux->beacon_interval; in rtw89_mcc_fill_config()
1552 config->beacon_offset = rtw89_mcc_get_bcn_ofst(rtwdev); in rtw89_mcc_fill_config()
1553 config->mcc_interval = ref->beacon_interval; in rtw89_mcc_fill_config()
1557 rtw89_warn(rtwdev, "MCC unknown mode: %d\n", mcc->mode); in rtw89_mcc_fill_config()
1558 return -EFAULT; in rtw89_mcc_fill_config()
1574 static int __mcc_fw_add_role(struct rtw89_dev *rtwdev, struct rtw89_mcc_role *role) in __mcc_fw_add_role() argument
1576 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_add_role()
1577 struct rtw89_mcc_config *config = &mcc->config; in __mcc_fw_add_role()
1578 struct rtw89_mcc_pattern *pattern = &config->pattern; in __mcc_fw_add_role()
1579 struct rtw89_mcc_courtesy *courtesy = &pattern->courtesy; in __mcc_fw_add_role()
1580 struct rtw89_mcc_policy *policy = &role->policy; in __mcc_fw_add_role()
1585 chan = rtw89_chan_get(rtwdev, role->rtwvif_link->chanctx_idx); in __mcc_fw_add_role()
1586 req.central_ch_seg0 = chan->channel; in __mcc_fw_add_role()
1587 req.primary_ch = chan->primary_channel; in __mcc_fw_add_role()
1588 req.bandwidth = chan->band_width; in __mcc_fw_add_role()
1589 req.ch_band_type = chan->band_type; in __mcc_fw_add_role()
1591 req.macid = role->rtwvif_link->mac_id; in __mcc_fw_add_role()
1592 req.group = mcc->group; in __mcc_fw_add_role()
1593 req.c2h_rpt = policy->c2h_rpt; in __mcc_fw_add_role()
1594 req.tx_null_early = policy->tx_null_early; in __mcc_fw_add_role()
1595 req.dis_tx_null = policy->dis_tx_null; in __mcc_fw_add_role()
1596 req.in_curr_ch = policy->in_curr_ch; in __mcc_fw_add_role()
1597 req.sw_retry_count = policy->sw_retry_count; in __mcc_fw_add_role()
1598 req.dis_sw_retry = policy->dis_sw_retry; in __mcc_fw_add_role()
1599 req.duration = role->duration; in __mcc_fw_add_role()
1602 if (courtesy->enable && courtesy->macid_src == req.macid) { in __mcc_fw_add_role()
1603 req.courtesy_target = courtesy->macid_tgt; in __mcc_fw_add_role()
1604 req.courtesy_num = courtesy->slot_num; in __mcc_fw_add_role()
1611 "MCC h2c failed to add wifi role: %d\n", ret); in __mcc_fw_add_role()
1615 ret = rtw89_fw_h2c_mcc_macid_bitmap(rtwdev, mcc->group, in __mcc_fw_add_role()
1616 role->rtwvif_link->mac_id, in __mcc_fw_add_role()
1617 role->macid_bitmap); in __mcc_fw_add_role()
1628 void __mrc_fw_add_role(struct rtw89_dev *rtwdev, struct rtw89_mcc_role *role, in __mrc_fw_add_role() argument
1631 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mrc_fw_add_role()
1632 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mrc_fw_add_role()
1633 struct rtw89_mcc_policy *policy = &role->policy; in __mrc_fw_add_role()
1637 slot_arg = &arg->slots[slot_idx]; in __mrc_fw_add_role()
1638 role->slot_idx = slot_idx; in __mrc_fw_add_role()
1640 slot_arg->duration = role->duration; in __mrc_fw_add_role()
1641 slot_arg->role_num = 1; in __mrc_fw_add_role()
1643 chan = rtw89_chan_get(rtwdev, role->rtwvif_link->chanctx_idx); in __mrc_fw_add_role()
1645 slot_arg->roles[0].role_type = RTW89_H2C_MRC_ROLE_WIFI; in __mrc_fw_add_role()
1646 slot_arg->roles[0].is_master = role == ref; in __mrc_fw_add_role()
1647 slot_arg->roles[0].band = chan->band_type; in __mrc_fw_add_role()
1648 slot_arg->roles[0].bw = chan->band_width; in __mrc_fw_add_role()
1649 slot_arg->roles[0].central_ch = chan->channel; in __mrc_fw_add_role()
1650 slot_arg->roles[0].primary_ch = chan->primary_channel; in __mrc_fw_add_role()
1651 slot_arg->roles[0].en_tx_null = !policy->dis_tx_null; in __mrc_fw_add_role()
1652 slot_arg->roles[0].null_early = policy->tx_null_early; in __mrc_fw_add_role()
1653 slot_arg->roles[0].macid = role->rtwvif_link->mac_id; in __mrc_fw_add_role()
1654 slot_arg->roles[0].macid_main_bitmap = in __mrc_fw_add_role()
1655 rtw89_mcc_role_fw_macid_bitmap_to_u32(role); in __mrc_fw_add_role()
1660 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_add_bt_role()
1661 struct rtw89_mcc_bt_role *bt_role = &mcc->bt_role; in __mcc_fw_add_bt_role()
1665 req.group = mcc->group; in __mcc_fw_add_bt_role()
1666 req.duration = bt_role->duration; in __mcc_fw_add_bt_role()
1672 "MCC h2c failed to add bt role: %d\n", ret); in __mcc_fw_add_bt_role()
1683 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mrc_fw_add_bt_role()
1684 struct rtw89_mcc_bt_role *bt_role = &mcc->bt_role; in __mrc_fw_add_bt_role()
1685 struct rtw89_fw_mrc_add_slot_arg *slot_arg = &arg->slots[slot_idx]; in __mrc_fw_add_bt_role()
1687 slot_arg->duration = bt_role->duration; in __mrc_fw_add_bt_role()
1688 slot_arg->role_num = 1; in __mrc_fw_add_bt_role()
1690 slot_arg->roles[0].role_type = RTW89_H2C_MRC_ROLE_BT; in __mrc_fw_add_bt_role()
1695 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_start()
1696 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mcc_fw_start()
1697 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mcc_fw_start()
1698 struct rtw89_mcc_config *config = &mcc->config; in __mcc_fw_start()
1699 struct rtw89_mcc_pattern *pattern = &config->pattern; in __mcc_fw_start()
1700 struct rtw89_mcc_sync *sync = &config->sync; in __mcc_fw_start()
1705 req.old_group = mcc->group; in __mcc_fw_start()
1707 mcc->group = RTW89_MCC_NEXT_GROUP(mcc->group); in __mcc_fw_start()
1710 req.group = mcc->group; in __mcc_fw_start()
1712 switch (pattern->plan) { in __mcc_fw_start()
1750 rtw89_warn(rtwdev, "MCC unknown plan: %d\n", pattern->plan); in __mcc_fw_start()
1751 return -EFAULT; in __mcc_fw_start()
1754 if (sync->enable) { in __mcc_fw_start()
1755 ret = rtw89_fw_h2c_mcc_sync(rtwdev, req.group, sync->macid_src, in __mcc_fw_start()
1756 sync->macid_tgt, sync->offset); in __mcc_fw_start()
1764 req.macid = ref->rtwvif_link->mac_id; in __mcc_fw_start()
1765 req.tsf_high = config->start_tsf >> 32; in __mcc_fw_start()
1766 req.tsf_low = config->start_tsf; in __mcc_fw_start()
1781 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mrc_fw_add_courtesy()
1782 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mrc_fw_add_courtesy()
1783 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mrc_fw_add_courtesy()
1784 struct rtw89_mcc_config *config = &mcc->config; in __mrc_fw_add_courtesy()
1785 struct rtw89_mcc_pattern *pattern = &config->pattern; in __mrc_fw_add_courtesy()
1786 struct rtw89_mcc_courtesy *courtesy = &pattern->courtesy; in __mrc_fw_add_courtesy()
1790 if (!courtesy->enable) in __mrc_fw_add_courtesy()
1793 if (courtesy->macid_src == ref->rtwvif_link->mac_id) { in __mrc_fw_add_courtesy()
1794 slot_arg_src = &arg->slots[ref->slot_idx]; in __mrc_fw_add_courtesy()
1795 slot_idx_tgt = aux->slot_idx; in __mrc_fw_add_courtesy()
1797 slot_arg_src = &arg->slots[aux->slot_idx]; in __mrc_fw_add_courtesy()
1798 slot_idx_tgt = ref->slot_idx; in __mrc_fw_add_courtesy()
1801 slot_arg_src->courtesy_target = slot_idx_tgt; in __mrc_fw_add_courtesy()
1802 slot_arg_src->courtesy_period = courtesy->slot_num; in __mrc_fw_add_courtesy()
1803 slot_arg_src->courtesy_en = true; in __mrc_fw_add_courtesy()
1808 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mrc_fw_start()
1809 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mrc_fw_start()
1810 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mrc_fw_start()
1811 struct rtw89_mcc_config *config = &mcc->config; in __mrc_fw_start()
1812 struct rtw89_mcc_pattern *pattern = &config->pattern; in __mrc_fw_start()
1813 struct rtw89_mcc_sync *sync = &config->sync; in __mrc_fw_start()
1819 NUM_OF_RTW89_MCC_ROLES + 1 /* bt role */); in __mrc_fw_start()
1822 start_arg.old_sch_idx = mcc->group; in __mrc_fw_start()
1824 mcc->group = RTW89_MCC_NEXT_GROUP(mcc->group); in __mrc_fw_start()
1827 add_arg.sch_idx = mcc->group; in __mrc_fw_start()
1830 switch (pattern->plan) { in __mrc_fw_start()
1855 rtw89_warn(rtwdev, "MCC unknown plan: %d\n", pattern->plan); in __mrc_fw_start()
1856 return -EFAULT; in __mrc_fw_start()
1868 if (sync->enable) { in __mrc_fw_start()
1870 .offset = sync->offset, in __mrc_fw_start()
1872 .band = sync->band_src, in __mrc_fw_start()
1873 .port = sync->port_src, in __mrc_fw_start()
1876 .band = sync->band_tgt, in __mrc_fw_start()
1877 .port = sync->port_tgt, in __mrc_fw_start()
1889 start_arg.sch_idx = mcc->group; in __mrc_fw_start()
1890 start_arg.start_tsf = config->start_tsf; in __mrc_fw_start()
1904 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_set_duration_no_bt()
1905 struct rtw89_mcc_config *config = &mcc->config; in __mcc_fw_set_duration_no_bt()
1906 struct rtw89_mcc_sync *sync = &config->sync; in __mcc_fw_set_duration_no_bt()
1907 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mcc_fw_set_duration_no_bt()
1908 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mcc_fw_set_duration_no_bt()
1910 .group = mcc->group, in __mcc_fw_set_duration_no_bt()
1912 .start_macid = ref->rtwvif_link->mac_id, in __mcc_fw_set_duration_no_bt()
1913 .macid_x = ref->rtwvif_link->mac_id, in __mcc_fw_set_duration_no_bt()
1914 .macid_y = aux->rtwvif_link->mac_id, in __mcc_fw_set_duration_no_bt()
1915 .duration_x = ref->duration, in __mcc_fw_set_duration_no_bt()
1916 .duration_y = aux->duration, in __mcc_fw_set_duration_no_bt()
1917 .start_tsf_high = config->start_tsf >> 32, in __mcc_fw_set_duration_no_bt()
1918 .start_tsf_low = config->start_tsf, in __mcc_fw_set_duration_no_bt()
1929 if (!sync->enable || !sync_changed) in __mcc_fw_set_duration_no_bt()
1932 ret = rtw89_fw_h2c_mcc_sync(rtwdev, mcc->group, sync->macid_src, in __mcc_fw_set_duration_no_bt()
1933 sync->macid_tgt, sync->offset); in __mcc_fw_set_duration_no_bt()
1945 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mrc_fw_set_duration_no_bt()
1946 struct rtw89_mcc_config *config = &mcc->config; in __mrc_fw_set_duration_no_bt()
1947 struct rtw89_mcc_sync *sync = &config->sync; in __mrc_fw_set_duration_no_bt()
1948 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mrc_fw_set_duration_no_bt()
1949 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mrc_fw_set_duration_no_bt()
1951 .sch_idx = mcc->group, in __mrc_fw_set_duration_no_bt()
1952 .start_tsf = config->start_tsf, in __mrc_fw_set_duration_no_bt()
1955 .slot_idx = ref->slot_idx, in __mrc_fw_set_duration_no_bt()
1956 .duration = ref->duration, in __mrc_fw_set_duration_no_bt()
1959 .slot_idx = aux->slot_idx, in __mrc_fw_set_duration_no_bt()
1960 .duration = aux->duration, in __mrc_fw_set_duration_no_bt()
1964 .offset = sync->offset, in __mrc_fw_set_duration_no_bt()
1966 .band = sync->band_src, in __mrc_fw_set_duration_no_bt()
1967 .port = sync->port_src, in __mrc_fw_set_duration_no_bt()
1970 .band = sync->band_tgt, in __mrc_fw_set_duration_no_bt()
1971 .port = sync->port_tgt, in __mrc_fw_set_duration_no_bt()
1984 if (!sync->enable || !sync_changed) in __mrc_fw_set_duration_no_bt()
1999 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_handle_beacon_noa()
2000 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_handle_beacon_noa()
2001 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_handle_beacon_noa()
2002 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_handle_beacon_noa()
2003 struct rtw89_mcc_pattern *pattern = &config->pattern; in rtw89_mcc_handle_beacon_noa()
2004 struct rtw89_mcc_sync *sync = &config->sync; in rtw89_mcc_handle_beacon_noa()
2006 u64 start_time = config->start_tsf; in rtw89_mcc_handle_beacon_noa()
2007 u32 interval = config->mcc_interval; in rtw89_mcc_handle_beacon_noa()
2011 if (mcc->mode != RTW89_MCC_MODE_GO_STA) in rtw89_mcc_handle_beacon_noa()
2014 if (ref->is_go) { in rtw89_mcc_handle_beacon_noa()
2015 rtwvif_go = ref->rtwvif_link; in rtw89_mcc_handle_beacon_noa()
2016 start_time += ieee80211_tu_to_usec(ref->duration); in rtw89_mcc_handle_beacon_noa()
2017 duration = config->mcc_interval - ref->duration; in rtw89_mcc_handle_beacon_noa()
2018 } else if (aux->is_go) { in rtw89_mcc_handle_beacon_noa()
2019 rtwvif_go = aux->rtwvif_link; in rtw89_mcc_handle_beacon_noa()
2020 start_time += ieee80211_tu_to_usec(pattern->tob_ref) + in rtw89_mcc_handle_beacon_noa()
2021 ieee80211_tu_to_usec(config->beacon_offset) + in rtw89_mcc_handle_beacon_noa()
2022 ieee80211_tu_to_usec(pattern->toa_aux); in rtw89_mcc_handle_beacon_noa()
2023 duration = config->mcc_interval - aux->duration; in rtw89_mcc_handle_beacon_noa()
2026 start_time += ieee80211_tu_to_usec(sync->offset); in rtw89_mcc_handle_beacon_noa()
2044 if (!rtwvif_go->chanctx_assigned) in rtw89_mcc_handle_beacon_noa()
2052 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_start_beacon_noa()
2053 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_start_beacon_noa()
2054 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_start_beacon_noa()
2056 if (mcc->mode != RTW89_MCC_MODE_GO_STA) in rtw89_mcc_start_beacon_noa()
2059 if (ref->is_go) in rtw89_mcc_start_beacon_noa()
2060 rtw89_fw_h2c_tsf32_toggle(rtwdev, ref->rtwvif_link, true); in rtw89_mcc_start_beacon_noa()
2061 else if (aux->is_go) in rtw89_mcc_start_beacon_noa()
2062 rtw89_fw_h2c_tsf32_toggle(rtwdev, aux->rtwvif_link, true); in rtw89_mcc_start_beacon_noa()
2069 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_stop_beacon_noa()
2070 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_stop_beacon_noa()
2071 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_stop_beacon_noa()
2073 if (mcc->mode != RTW89_MCC_MODE_GO_STA) in rtw89_mcc_stop_beacon_noa()
2076 if (ref->is_go) in rtw89_mcc_stop_beacon_noa()
2077 rtw89_fw_h2c_tsf32_toggle(rtwdev, ref->rtwvif_link, false); in rtw89_mcc_stop_beacon_noa()
2078 else if (aux->is_go) in rtw89_mcc_stop_beacon_noa()
2079 rtw89_fw_h2c_tsf32_toggle(rtwdev, aux->rtwvif_link, false); in rtw89_mcc_stop_beacon_noa()
2086 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_start()
2087 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_start()
2088 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_start()
2091 if (rtwdev->scanning) in rtw89_mcc_start()
2092 rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif); in rtw89_mcc_start()
2102 if (ref->is_go || aux->is_go) in rtw89_mcc_start()
2103 mcc->mode = RTW89_MCC_MODE_GO_STA; in rtw89_mcc_start()
2105 mcc->mode = RTW89_MCC_MODE_GC_STA; in rtw89_mcc_start()
2107 rtw89_debug(rtwdev, RTW89_DBG_CHAN, "MCC sel mode: %d\n", mcc->mode); in rtw89_mcc_start()
2109 mcc->group = RTW89_MCC_DFLT_GROUP; in rtw89_mcc_start()
2137 sel->mac_id = mcc_role->rtwvif_link->mac_id; in rtw89_mcc_stop_sel_fill()
2138 sel->slot_idx = mcc_role->slot_idx; in rtw89_mcc_stop_sel_fill()
2148 if (!mcc_role->rtwvif_link->chanctx_assigned) in rtw89_mcc_stop_sel_iterator()
2157 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_stop()
2158 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_stop()
2169 ret = rtw89_fw_h2c_mrc_del(rtwdev, mcc->group, sel.slot_idx); in rtw89_mcc_stop()
2174 ret = rtw89_fw_h2c_stop_mcc(rtwdev, mcc->group, in rtw89_mcc_stop()
2180 ret = rtw89_fw_h2c_del_mcc_group(rtwdev, mcc->group, true); in rtw89_mcc_stop()
2193 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_update()
2194 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_update()
2199 if (rtwdev->scanning) in rtw89_mcc_update()
2200 rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif); in rtw89_mcc_update()
2209 config->pattern.plan != RTW89_MCC_PLAN_NO_BT) { in rtw89_mcc_update()
2218 if (memcmp(&old_cfg.sync, &config->sync, sizeof(old_cfg.sync)) == 0) in rtw89_mcc_update()
2238 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_track()
2239 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_track()
2240 struct rtw89_mcc_pattern *pattern = &config->pattern; in rtw89_mcc_track()
2245 if (mcc->mode != RTW89_MCC_MODE_GC_STA) in rtw89_mcc_track()
2249 if (bcn_ofst > config->beacon_offset) { in rtw89_mcc_track()
2250 diff = bcn_ofst - config->beacon_offset; in rtw89_mcc_track()
2251 if (pattern->tob_aux < 0) in rtw89_mcc_track()
2252 tolerance = -pattern->tob_aux; in rtw89_mcc_track()
2254 tolerance = pattern->toa_aux; in rtw89_mcc_track()
2256 diff = config->beacon_offset - bcn_ofst; in rtw89_mcc_track()
2257 if (pattern->toa_aux < 0) in rtw89_mcc_track()
2258 tolerance = -pattern->toa_aux; in rtw89_mcc_track()
2260 tolerance = pattern->tob_aux; in rtw89_mcc_track()
2272 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_upd_macid_bitmap()
2275 ret = rtw89_fw_h2c_mcc_macid_bitmap(rtwdev, mcc->group, in __mcc_fw_upd_macid_bitmap()
2276 upd->rtwvif_link->mac_id, in __mcc_fw_upd_macid_bitmap()
2277 upd->macid_bitmap); in __mcc_fw_upd_macid_bitmap()
2291 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mrc_fw_upd_macid_bitmap()
2300 arg.sch_idx = mcc->group; in __mrc_fw_upd_macid_bitmap()
2301 arg.macid = upd->rtwvif_link->mac_id; in __mrc_fw_upd_macid_bitmap()
2339 .rtwvif_link = mcc_role->rtwvif_link, in rtw89_mcc_upd_map_iterator()
2343 if (!mcc_role->is_go) in rtw89_mcc_upd_map_iterator()
2347 if (memcmp(mcc_role->macid_bitmap, upd.macid_bitmap, in rtw89_mcc_upd_map_iterator()
2348 sizeof(mcc_role->macid_bitmap)) == 0) in rtw89_mcc_upd_map_iterator()
2359 memcpy(mcc_role->macid_bitmap, upd.macid_bitmap, in rtw89_mcc_upd_map_iterator()
2360 sizeof(mcc_role->macid_bitmap)); in rtw89_mcc_upd_map_iterator()
2366 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_update_macid_bitmap()
2368 if (mcc->mode != RTW89_MCC_MODE_GO_STA) in rtw89_mcc_update_macid_bitmap()
2379 memset(&mcc_role->limit, 0, sizeof(mcc_role->limit)); in rtw89_mcc_upd_lmt_iterator()
2386 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_update_limit()
2388 if (mcc->mode != RTW89_MCC_MODE_GC_STA) in rtw89_mcc_update_limit()
2398 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_work()
2407 if (hal->entity_pause) in rtw89_chanctx_work()
2411 if (test_and_clear_bit(i, hal->changes)) in rtw89_chanctx_work()
2452 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_queue_chanctx_change()
2471 set_bit(change, hal->changes); in rtw89_queue_chanctx_change()
2477 wiphy_delayed_work_queue(rtwdev->hw->wiphy, &rtwdev->chanctx_work, in rtw89_queue_chanctx_change()
2488 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_track()
2491 lockdep_assert_wiphy(rtwdev->hw->wiphy); in rtw89_chanctx_track()
2493 if (hal->entity_pause) in rtw89_chanctx_track()
2509 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_pause()
2512 lockdep_assert_wiphy(rtwdev->hw->wiphy); in rtw89_chanctx_pause()
2514 if (hal->entity_pause) in rtw89_chanctx_pause()
2528 hal->entity_pause = true; in rtw89_chanctx_pause()
2536 if (!parm || !parm->cb) in rtw89_chanctx_proceed_cb()
2539 ret = parm->cb(rtwdev, parm->data); in rtw89_chanctx_proceed_cb()
2542 parm->caller ?: "unknown", ret); in rtw89_chanctx_proceed_cb()
2545 /* pass @cb_parm if there is a @cb_parm->cb which needs to invoke right after
2551 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_proceed()
2555 lockdep_assert_wiphy(rtwdev->hw->wiphy); in rtw89_chanctx_proceed()
2557 if (unlikely(!hal->entity_pause)) { in rtw89_chanctx_proceed()
2564 hal->entity_pause = false; in rtw89_chanctx_proceed()
2591 if (!rtwvif_link->chanctx_assigned) in __rtw89_swap_chanctx()
2594 if (rtwvif_link->chanctx_idx == idx1) in __rtw89_swap_chanctx()
2595 rtwvif_link->chanctx_idx = idx2; in __rtw89_swap_chanctx()
2596 else if (rtwvif_link->chanctx_idx == idx2) in __rtw89_swap_chanctx()
2597 rtwvif_link->chanctx_idx = idx1; in __rtw89_swap_chanctx()
2605 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_swap_chanctx()
2612 hal->chanctx[idx1].cfg->idx = idx2; in rtw89_swap_chanctx()
2613 hal->chanctx[idx2].cfg->idx = idx1; in rtw89_swap_chanctx()
2615 swap(hal->chanctx[idx1], hal->chanctx[idx2]); in rtw89_swap_chanctx()
2620 cur = atomic_read(&hal->roc_chanctx_idx); in rtw89_swap_chanctx()
2622 atomic_set(&hal->roc_chanctx_idx, idx2); in rtw89_swap_chanctx()
2624 atomic_set(&hal->roc_chanctx_idx, idx1); in rtw89_swap_chanctx()
2630 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_ops_add()
2631 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; in rtw89_chanctx_ops_add()
2632 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_chanctx_ops_add()
2635 idx = find_first_zero_bit(hal->entity_map, NUM_OF_RTW89_CHANCTX); in rtw89_chanctx_ops_add()
2636 if (idx >= chip->support_chanctx_num) in rtw89_chanctx_ops_add()
2637 return -ENOENT; in rtw89_chanctx_ops_add()
2639 rtw89_config_entity_chandef(rtwdev, idx, &ctx->def); in rtw89_chanctx_ops_add()
2640 cfg->idx = idx; in rtw89_chanctx_ops_add()
2641 cfg->ref_count = 0; in rtw89_chanctx_ops_add()
2642 hal->chanctx[idx].cfg = cfg; in rtw89_chanctx_ops_add()
2649 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_ops_remove()
2650 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; in rtw89_chanctx_ops_remove()
2652 clear_bit(cfg->idx, hal->entity_map); in rtw89_chanctx_ops_remove()
2659 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; in rtw89_chanctx_ops_change()
2660 u8 idx = cfg->idx; in rtw89_chanctx_ops_change()
2663 rtw89_config_entity_chandef(rtwdev, idx, &ctx->def); in rtw89_chanctx_ops_change()
2672 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; in rtw89_chanctx_ops_assign_vif()
2673 struct rtw89_vif *rtwvif = rtwvif_link->rtwvif; in rtw89_chanctx_ops_assign_vif()
2674 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_ops_assign_vif()
2675 struct rtw89_entity_mgnt *mgnt = &hal->entity_mgnt; in rtw89_chanctx_ops_assign_vif()
2679 rtwvif_link->chanctx_idx = cfg->idx; in rtw89_chanctx_ops_assign_vif()
2680 rtwvif_link->chanctx_assigned = true; in rtw89_chanctx_ops_assign_vif()
2681 cfg->ref_count++; in rtw89_chanctx_ops_assign_vif()
2683 if (list_empty(&rtwvif->mgnt_entry)) in rtw89_chanctx_ops_assign_vif()
2684 list_add_tail(&rtwvif->mgnt_entry, &mgnt->active_list); in rtw89_chanctx_ops_assign_vif()
2686 if (cfg->idx == RTW89_CHANCTX_0) in rtw89_chanctx_ops_assign_vif()
2694 rtw89_swap_chanctx(rtwdev, cfg->idx, RTW89_CHANCTX_0); in rtw89_chanctx_ops_assign_vif()
2710 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; in rtw89_chanctx_ops_unassign_vif()
2711 struct rtw89_vif *rtwvif = rtwvif_link->rtwvif; in rtw89_chanctx_ops_unassign_vif()
2712 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_ops_unassign_vif()
2718 rtwvif_link->chanctx_idx = RTW89_CHANCTX_0; in rtw89_chanctx_ops_unassign_vif()
2719 rtwvif_link->chanctx_assigned = false; in rtw89_chanctx_ops_unassign_vif()
2720 cfg->ref_count--; in rtw89_chanctx_ops_unassign_vif()
2723 list_del_init(&rtwvif->mgnt_entry); in rtw89_chanctx_ops_unassign_vif()
2725 if (cfg->ref_count != 0) in rtw89_chanctx_ops_unassign_vif()
2728 if (cfg->idx != RTW89_CHANCTX_0) in rtw89_chanctx_ops_unassign_vif()
2731 roll = find_next_bit(hal->entity_map, NUM_OF_RTW89_CHANCTX, in rtw89_chanctx_ops_unassign_vif()
2732 cfg->idx + 1); in rtw89_chanctx_ops_unassign_vif()
2740 rtw89_swap_chanctx(rtwdev, cfg->idx, roll); in rtw89_chanctx_ops_unassign_vif()
2743 if (!hal->entity_pause) { in rtw89_chanctx_ops_unassign_vif()
2758 if (hal->entity_pause) in rtw89_chanctx_ops_unassign_vif()
2764 /* re-plan MCC for chanctx changes. */ in rtw89_chanctx_ops_unassign_vif()