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
82 offset = (primary_freq - center_freq - 10) / 20; in rtw89_get_primary_chan_idx()
85 offset = (center_freq - primary_freq - 10) / 20; in rtw89_get_primary_chan_idx()
104 return (prisb_cal_ofst[bw] + pri_ch - central_ch) / 4; in rtw89_get_primary_sb_idx()
114 chan->channel = center_chan; in rtw89_chan_create()
115 chan->primary_channel = primary_chan; in rtw89_chan_create()
116 chan->band_type = band; in rtw89_chan_create()
117 chan->band_width = bandwidth; in rtw89_chan_create()
122 chan->freq = center_freq; in rtw89_chan_create()
123 chan->subband_type = rtw89_get_subband_type(band, center_chan); in rtw89_chan_create()
124 chan->pri_ch_idx = rtw89_get_primary_chan_idx(bandwidth, center_freq, in rtw89_chan_create()
126 chan->pri_sb_idx = rtw89_get_primary_sb_idx(center_chan, primary_chan, in rtw89_chan_create()
134 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_assign_entity_chan()
135 struct rtw89_chan *chan = &hal->chanctx[idx].chan; in rtw89_assign_entity_chan()
136 struct rtw89_chan_rcd *rcd = &hal->chanctx[idx].rcd; in rtw89_assign_entity_chan()
139 rcd->prev_primary_channel = chan->primary_channel; in rtw89_assign_entity_chan()
140 rcd->prev_band_type = chan->band_type; in rtw89_assign_entity_chan()
141 band_changed = new->band_type != chan->band_type; in rtw89_assign_entity_chan()
142 rcd->band_changed = band_changed; in rtw89_assign_entity_chan()
153 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_iterate_entity_chan()
158 lockdep_assert_held(&rtwdev->mutex); in rtw89_iterate_entity_chan()
160 for_each_set_bit(idx, hal->entity_map, NUM_OF_RTW89_CHANCTX) { in rtw89_iterate_entity_chan()
175 struct rtw89_hal *hal = &rtwdev->hal; in __rtw89_config_entity_chandef()
177 hal->chanctx[idx].chandef = *chandef; in __rtw89_config_entity_chandef()
180 set_bit(idx, hal->entity_map); in __rtw89_config_entity_chandef()
194 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_config_roc_chandef()
198 cur = atomic_cmpxchg(&hal->roc_chanctx_idx, in rtw89_config_roc_chandef()
206 hal->roc_chandef = *chandef; in rtw89_config_roc_chandef()
208 cur = atomic_cmpxchg(&hal->roc_chanctx_idx, idx, in rtw89_config_roc_chandef()
232 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_entity_init()
233 struct rtw89_entity_mgnt *mgnt = &hal->entity_mgnt; in rtw89_entity_init()
235 hal->entity_pause = false; in rtw89_entity_init()
236 bitmap_zero(hal->entity_map, NUM_OF_RTW89_CHANCTX); in rtw89_entity_init()
237 bitmap_zero(hal->changes, NUM_OF_RTW89_CHANCTX_CHANGES); in rtw89_entity_init()
238 atomic_set(&hal->roc_chanctx_idx, RTW89_CHANCTX_IDLE); in rtw89_entity_init()
240 INIT_LIST_HEAD(&mgnt->active_list); in rtw89_entity_init()
251 if (rtwvif_link->chanctx_assigned) in rtw89_vif_is_active_role()
260 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_entity_calculate_weight()
265 for_each_set_bit(idx, hal->entity_map, NUM_OF_RTW89_CHANCTX) { in rtw89_entity_calculate_weight()
266 cfg = hal->chanctx[idx].cfg; in rtw89_entity_calculate_weight()
269 w->active_chanctxs = 1; in rtw89_entity_calculate_weight()
273 if (cfg->ref_count > 0) in rtw89_entity_calculate_weight()
274 w->active_chanctxs++; in rtw89_entity_calculate_weight()
279 w->active_roles++; in rtw89_entity_calculate_weight()
286 struct rtw89_vif *rtwvif = rtwvif_link->rtwvif; in rtw89_normalize_link_chanctx()
289 if (unlikely(!rtwvif_link->chanctx_assigned)) in rtw89_normalize_link_chanctx()
293 if (!cur || !cur->chanctx_assigned) in rtw89_normalize_link_chanctx()
299 rtw89_swap_chanctx(rtwdev, rtwvif_link->chanctx_idx, cur->chanctx_idx); in rtw89_normalize_link_chanctx()
306 struct rtw89_hal *hal = &rtwdev->hal; in __rtw89_mgnt_chan_get()
307 struct rtw89_entity_mgnt *mgnt = &hal->entity_mgnt; in __rtw89_mgnt_chan_get()
313 lockdep_assert_held(&rtwdev->mutex); in __rtw89_mgnt_chan_get()
335 chanctx_idx = mgnt->chanctx_tbl[role_index][link_index]; in __rtw89_mgnt_chan_get()
339 roc_idx = atomic_read(&hal->roc_chanctx_idx); in __rtw89_mgnt_chan_get()
362 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_entity_recalc_mgnt_roles()
363 struct rtw89_entity_mgnt *mgnt = &hal->entity_mgnt; in rtw89_entity_recalc_mgnt_roles()
365 struct rtw89_vif *role; in rtw89_entity_recalc_mgnt_roles() local
369 lockdep_assert_held(&rtwdev->mutex); in rtw89_entity_recalc_mgnt_roles()
372 mgnt->active_roles[i] = NULL; in rtw89_entity_recalc_mgnt_roles()
376 mgnt->chanctx_tbl[i][j] = RTW89_CHANCTX_IDLE; in rtw89_entity_recalc_mgnt_roles()
379 /* To be consistent with legacy behavior, expect the first active role in rtw89_entity_recalc_mgnt_roles()
383 list_for_each_entry(role, &mgnt->active_list, mgnt_entry) { in rtw89_entity_recalc_mgnt_roles()
384 for (i = 0; i < role->links_inst_valid_num; i++) { in rtw89_entity_recalc_mgnt_roles()
385 link = rtw89_vif_get_link_inst(role, i); in rtw89_entity_recalc_mgnt_roles()
386 if (!link || !link->chanctx_assigned) in rtw89_entity_recalc_mgnt_roles()
389 if (link->chanctx_idx == RTW89_CHANCTX_0) { in rtw89_entity_recalc_mgnt_roles()
392 list_del(&role->mgnt_entry); in rtw89_entity_recalc_mgnt_roles()
393 list_add(&role->mgnt_entry, &mgnt->active_list); in rtw89_entity_recalc_mgnt_roles()
400 list_for_each_entry(role, &mgnt->active_list, mgnt_entry) { in rtw89_entity_recalc_mgnt_roles()
408 for (i = 0; i < role->links_inst_valid_num; i++) { in rtw89_entity_recalc_mgnt_roles()
409 link = rtw89_vif_get_link_inst(role, i); in rtw89_entity_recalc_mgnt_roles()
410 if (!link || !link->chanctx_assigned) in rtw89_entity_recalc_mgnt_roles()
413 mgnt->chanctx_tbl[pos][i] = link->chanctx_idx; in rtw89_entity_recalc_mgnt_roles()
416 mgnt->active_roles[pos++] = role; in rtw89_entity_recalc_mgnt_roles()
423 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_entity_recalc()
430 lockdep_assert_held(&rtwdev->mutex); in rtw89_entity_recalc()
432 bitmap_copy(recalc_map, hal->entity_map, NUM_OF_RTW89_CHANCTX); in rtw89_entity_recalc()
482 if (hal->entity_pause) in rtw89_entity_recalc()
492 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_chanctx_notify()
493 const struct rtw89_chanctx_listener *listener = chip->chanctx_listener; in rtw89_chanctx_notify()
500 if (!listener->callbacks[i]) in rtw89_chanctx_notify()
507 listener->callbacks[i](rtwdev, state); in rtw89_chanctx_notify()
513 enum rtw89_chip_gen chip_gen = rtwdev->chip->chip_gen; in rtw89_concurrent_via_mrc()
522 * immediately as long as iterator returns a non-zero value.
532 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_iterate_mcc_roles()
534 &mcc->role_ref, in rtw89_iterate_mcc_roles()
535 &mcc->role_aux, in rtw89_iterate_mcc_roles()
552 struct rtw89_mcc_role *role, u64 tsf) in rtw89_mcc_get_tbtt_ofst() argument
554 struct rtw89_vif_link *rtwvif_link = role->rtwvif_link; in rtw89_mcc_get_tbtt_ofst()
555 u32 bcn_intvl_us = ieee80211_tu_to_usec(role->beacon_interval); in rtw89_mcc_get_tbtt_ofst()
556 u64 sync_tsf = READ_ONCE(rtwvif_link->sync_bcn_tsf); in rtw89_mcc_get_tbtt_ofst()
565 div_u64_rem(tsf - sync_tsf, bcn_intvl_us, &remainder); in rtw89_mcc_get_tbtt_ofst()
572 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_req_tsf()
573 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mcc_fw_req_tsf()
574 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mcc_fw_req_tsf()
579 req.group = mcc->group; in __mcc_fw_req_tsf()
580 req.macid_x = ref->rtwvif_link->mac_id; in __mcc_fw_req_tsf()
581 req.macid_y = aux->rtwvif_link->mac_id; in __mcc_fw_req_tsf()
597 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mrc_fw_req_tsf()
598 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mrc_fw_req_tsf()
599 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mrc_fw_req_tsf()
607 arg.infos[0].band = ref->rtwvif_link->mac_idx; in __mrc_fw_req_tsf()
608 arg.infos[0].port = ref->rtwvif_link->port; in __mrc_fw_req_tsf()
609 arg.infos[1].band = aux->rtwvif_link->mac_idx; in __mrc_fw_req_tsf()
610 arg.infos[1].port = aux->rtwvif_link->port; in __mrc_fw_req_tsf()
627 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_get_bcn_ofst()
628 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_get_bcn_ofst()
629 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_get_bcn_ofst()
630 u32 bcn_intvl_ref_us = ieee80211_tu_to_usec(ref->beacon_interval); in rtw89_mcc_get_bcn_ofst()
649 return (tbtt_ofst_ref - tbtt_ofst_aux) / 1024; in rtw89_mcc_get_bcn_ofst()
659 if (idx >= ARRAY_SIZE(mcc_role->macid_bitmap)) in rtw89_mcc_role_fw_macid_bitmap_set_bit()
662 mcc_role->macid_bitmap[idx] |= BIT(pos); in rtw89_mcc_role_fw_macid_bitmap_set_bit()
672 for (i = 0; i < ARRAY_SIZE(mcc_role->macid_bitmap); i++) { in rtw89_mcc_role_fw_macid_bitmap_to_u32()
678 if (mcc_role->macid_bitmap[i] & BIT(j)) in rtw89_mcc_role_fw_macid_bitmap_to_u32()
690 struct rtw89_vif *target = mcc_role->rtwvif_link->rtwvif; in rtw89_mcc_role_macid_sta_iter()
692 struct rtw89_vif *rtwvif = rtwsta->rtwvif; in rtw89_mcc_role_macid_sta_iter()
693 struct rtw89_dev *rtwdev = rtwsta->rtwdev; in rtw89_mcc_role_macid_sta_iter()
701 rtw89_err(rtwdev, "mcc sta macid: find no link on HW-0\n"); in rtw89_mcc_role_macid_sta_iter()
705 rtw89_mcc_role_fw_macid_bitmap_set_bit(mcc_role, rtwsta_link->mac_id); in rtw89_mcc_role_macid_sta_iter()
711 struct rtw89_vif_link *rtwvif_link = mcc_role->rtwvif_link; in rtw89_mcc_fill_role_macid_bitmap()
713 rtw89_mcc_role_fw_macid_bitmap_set_bit(mcc_role, rtwvif_link->mac_id); in rtw89_mcc_fill_role_macid_bitmap()
714 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_mcc_fill_role_macid_bitmap()
722 struct rtw89_mcc_policy *policy = &mcc_role->policy; in rtw89_mcc_fill_role_policy()
724 policy->c2h_rpt = RTW89_FW_MCC_C2H_RPT_ALL; in rtw89_mcc_fill_role_policy()
725 policy->tx_null_early = RTW89_MCC_DFLT_TX_NULL_EARLY; in rtw89_mcc_fill_role_policy()
726 policy->in_curr_ch = false; in rtw89_mcc_fill_role_policy()
727 policy->dis_sw_retry = true; in rtw89_mcc_fill_role_policy()
728 policy->sw_retry_count = false; in rtw89_mcc_fill_role_policy()
730 if (mcc_role->is_go) in rtw89_mcc_fill_role_policy()
731 policy->dis_tx_null = true; in rtw89_mcc_fill_role_policy()
733 policy->dis_tx_null = false; in rtw89_mcc_fill_role_policy()
739 struct rtw89_vif_link *rtwvif_link = mcc_role->rtwvif_link; in rtw89_mcc_fill_role_limit()
742 u32 bcn_intvl_us = ieee80211_tu_to_usec(mcc_role->beacon_interval); in rtw89_mcc_fill_role_limit()
749 if (!mcc_role->is_go && !mcc_role->is_gc) in rtw89_mcc_fill_role_limit()
758 noa_desc = &bss_conf->p2p_noa_attr.desc[i]; in rtw89_mcc_fill_role_limit()
759 if (noa_desc->count == 255) in rtw89_mcc_fill_role_limit()
767 start_time = le32_to_cpu(noa_desc->start_time); in rtw89_mcc_fill_role_limit()
768 interval = le32_to_cpu(noa_desc->interval); in rtw89_mcc_fill_role_limit()
769 duration = le32_to_cpu(noa_desc->duration); in rtw89_mcc_fill_role_limit()
775 "MCC role limit: mismatch interval: %d vs. %d\n", in rtw89_mcc_fill_role_limit()
788 max_dur_us = interval - duration; in rtw89_mcc_fill_role_limit()
789 max_tob_us = max_dur_us - max_toa_us; in rtw89_mcc_fill_role_limit()
793 "MCC role limit: hit boundary\n"); in rtw89_mcc_fill_role_limit()
799 "MCC role limit: insufficient duration\n"); in rtw89_mcc_fill_role_limit()
803 mcc_role->limit.max_toa = max_toa_us / 1024; in rtw89_mcc_fill_role_limit()
804 mcc_role->limit.max_tob = max_tob_us / 1024; in rtw89_mcc_fill_role_limit()
805 mcc_role->limit.max_dur = mcc_role->limit.max_toa + mcc_role->limit.max_tob; in rtw89_mcc_fill_role_limit()
806 mcc_role->limit.enable = true; in rtw89_mcc_fill_role_limit()
809 "MCC role limit: max_toa %d, max_tob %d, max_dur %d\n", in rtw89_mcc_fill_role_limit()
810 mcc_role->limit.max_toa, mcc_role->limit.max_tob, in rtw89_mcc_fill_role_limit()
811 mcc_role->limit.max_dur); in rtw89_mcc_fill_role_limit()
816 struct rtw89_mcc_role *role) in rtw89_mcc_fill_role() argument
821 memset(role, 0, sizeof(*role)); in rtw89_mcc_fill_role()
822 role->rtwvif_link = rtwvif_link; in rtw89_mcc_fill_role()
827 role->beacon_interval = bss_conf->beacon_int; in rtw89_mcc_fill_role()
831 if (!role->beacon_interval) { in rtw89_mcc_fill_role()
833 "cannot handle MCC role without beacon interval\n"); in rtw89_mcc_fill_role()
834 return -EINVAL; in rtw89_mcc_fill_role()
837 role->duration = role->beacon_interval / 2; in rtw89_mcc_fill_role()
839 chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx); in rtw89_mcc_fill_role()
840 role->is_2ghz = chan->band_type == RTW89_BAND_2G; in rtw89_mcc_fill_role()
841 role->is_go = rtwvif_link->wifi_role == RTW89_WIFI_ROLE_P2P_GO; in rtw89_mcc_fill_role()
842 role->is_gc = rtwvif_link->wifi_role == RTW89_WIFI_ROLE_P2P_CLIENT; in rtw89_mcc_fill_role()
844 rtw89_mcc_fill_role_macid_bitmap(rtwdev, role); in rtw89_mcc_fill_role()
845 rtw89_mcc_fill_role_policy(rtwdev, role); in rtw89_mcc_fill_role()
846 rtw89_mcc_fill_role_limit(rtwdev, role); in rtw89_mcc_fill_role()
849 "MCC role: bcn_intvl %d, is_2ghz %d, is_go %d, is_gc %d\n", in rtw89_mcc_fill_role()
850 role->beacon_interval, role->is_2ghz, role->is_go, role->is_gc); in rtw89_mcc_fill_role()
856 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_fill_bt_role()
857 struct rtw89_mcc_bt_role *bt_role = &mcc->bt_role; in rtw89_mcc_fill_bt_role()
860 bt_role->duration = rtw89_coex_query_bt_req_len(rtwdev, RTW89_PHY_0); in rtw89_mcc_fill_bt_role()
862 rtw89_debug(rtwdev, RTW89_DBG_CHAN, "MCC bt role: dur %d\n", in rtw89_mcc_fill_bt_role()
863 bt_role->duration); in rtw89_mcc_fill_bt_role()
879 struct rtw89_vif_link *role_vif = sel->bind_vif[ordered_idx]; in rtw89_mcc_fill_role_iterator()
883 rtw89_warn(rtwdev, "cannot handle MCC without role[%d]\n", in rtw89_mcc_fill_role_iterator()
885 return -EINVAL; in rtw89_mcc_fill_role_iterator()
889 "MCC fill role[%d] with vif <macid %d>\n", in rtw89_mcc_fill_role_iterator()
890 ordered_idx, role_vif->mac_id); in rtw89_mcc_fill_role_iterator()
901 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_mcc_fill_all_roles()
902 struct rtw89_entity_mgnt *mgnt = &hal->entity_mgnt; in rtw89_mcc_fill_all_roles()
910 rtwvif = mgnt->active_roles[i]; in rtw89_mcc_fill_all_roles()
916 rtw89_err(rtwdev, "mcc fill roles: find no link on HW-0\n"); in rtw89_mcc_fill_all_roles()
934 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_assign_pattern()
935 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_assign_pattern()
936 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_assign_pattern()
937 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_assign_pattern()
938 struct rtw89_mcc_pattern *pattern = &config->pattern; in rtw89_mcc_assign_pattern()
942 new->tob_ref, new->toa_ref, new->tob_aux, new->toa_aux); in rtw89_mcc_assign_pattern()
945 memset(&pattern->courtesy, 0, sizeof(pattern->courtesy)); in rtw89_mcc_assign_pattern()
947 if (pattern->tob_aux <= 0 || pattern->toa_aux <= 0) { in rtw89_mcc_assign_pattern()
948 pattern->courtesy.macid_tgt = aux->rtwvif_link->mac_id; in rtw89_mcc_assign_pattern()
949 pattern->courtesy.macid_src = ref->rtwvif_link->mac_id; in rtw89_mcc_assign_pattern()
950 pattern->courtesy.slot_num = RTW89_MCC_DFLT_COURTESY_SLOT; in rtw89_mcc_assign_pattern()
951 pattern->courtesy.enable = true; in rtw89_mcc_assign_pattern()
952 } else if (pattern->tob_ref <= 0 || pattern->toa_ref <= 0) { in rtw89_mcc_assign_pattern()
953 pattern->courtesy.macid_tgt = ref->rtwvif_link->mac_id; in rtw89_mcc_assign_pattern()
954 pattern->courtesy.macid_src = aux->rtwvif_link->mac_id; in rtw89_mcc_assign_pattern()
955 pattern->courtesy.slot_num = RTW89_MCC_DFLT_COURTESY_SLOT; in rtw89_mcc_assign_pattern()
956 pattern->courtesy.enable = true; in rtw89_mcc_assign_pattern()
961 pattern->plan, pattern->courtesy.enable); in rtw89_mcc_assign_pattern()
963 if (!pattern->courtesy.enable) in rtw89_mcc_assign_pattern()
968 pattern->courtesy.macid_tgt, pattern->courtesy.macid_src, in rtw89_mcc_assign_pattern()
969 pattern->courtesy.slot_num); in rtw89_mcc_assign_pattern()
972 /* The follow-up roughly shows the relationship between the parameters
990 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __rtw89_mcc_calc_pattern_loose()
991 struct rtw89_mcc_role *ref = &mcc->role_ref; in __rtw89_mcc_calc_pattern_loose()
992 struct rtw89_mcc_role *aux = &mcc->role_aux; in __rtw89_mcc_calc_pattern_loose()
993 struct rtw89_mcc_config *config = &mcc->config; in __rtw89_mcc_calc_pattern_loose()
994 u16 bcn_ofst = config->beacon_offset; in __rtw89_mcc_calc_pattern_loose()
1007 max_bcn_ofst = ref->duration + aux->duration; in __rtw89_mcc_calc_pattern_loose()
1008 if (ref->limit.enable) in __rtw89_mcc_calc_pattern_loose()
1010 ref->limit.max_toa + aux->duration); in __rtw89_mcc_calc_pattern_loose()
1011 else if (aux->limit.enable) in __rtw89_mcc_calc_pattern_loose()
1013 ref->duration + aux->limit.max_tob); in __rtw89_mcc_calc_pattern_loose()
1015 if (bcn_ofst > max_bcn_ofst && bcn_ofst >= mcc->bt_role.duration) { in __rtw89_mcc_calc_pattern_loose()
1016 bt_dur_in_mid = mcc->bt_role.duration; in __rtw89_mcc_calc_pattern_loose()
1017 ptrn->plan = RTW89_MCC_PLAN_MID_BT; in __rtw89_mcc_calc_pattern_loose()
1023 ptrn->plan, bcn_ofst); in __rtw89_mcc_calc_pattern_loose()
1025 res = bcn_ofst - bt_dur_in_mid; in __rtw89_mcc_calc_pattern_loose()
1026 upper = min_t(s16, ref->duration, res); in __rtw89_mcc_calc_pattern_loose()
1029 if (ref->limit.enable) { in __rtw89_mcc_calc_pattern_loose()
1030 upper = min_t(s16, upper, ref->limit.max_toa); in __rtw89_mcc_calc_pattern_loose()
1031 lower = max_t(s16, lower, ref->duration - ref->limit.max_tob); in __rtw89_mcc_calc_pattern_loose()
1032 } else if (aux->limit.enable) { in __rtw89_mcc_calc_pattern_loose()
1034 res - (aux->duration - aux->limit.max_toa)); in __rtw89_mcc_calc_pattern_loose()
1035 lower = max_t(s16, lower, res - aux->limit.max_tob); in __rtw89_mcc_calc_pattern_loose()
1039 ptrn->toa_ref = (upper + lower) / 2; in __rtw89_mcc_calc_pattern_loose()
1041 ptrn->toa_ref = lower; in __rtw89_mcc_calc_pattern_loose()
1043 ptrn->tob_ref = ref->duration - ptrn->toa_ref; in __rtw89_mcc_calc_pattern_loose()
1044 ptrn->tob_aux = res - ptrn->toa_ref; in __rtw89_mcc_calc_pattern_loose()
1045 ptrn->toa_aux = aux->duration - ptrn->tob_aux; in __rtw89_mcc_calc_pattern_loose()
1048 /* In strict pattern calculation, we consider timing that might need
1054 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __rtw89_mcc_calc_pattern_strict()
1055 struct rtw89_mcc_role *ref = &mcc->role_ref; in __rtw89_mcc_calc_pattern_strict()
1056 struct rtw89_mcc_role *aux = &mcc->role_aux; in __rtw89_mcc_calc_pattern_strict()
1057 struct rtw89_mcc_config *config = &mcc->config; in __rtw89_mcc_calc_pattern_strict()
1060 u16 bcn_ofst = config->beacon_offset; in __rtw89_mcc_calc_pattern_strict()
1068 ptrn->plan, bcn_ofst); in __rtw89_mcc_calc_pattern_strict()
1070 if (ptrn->plan == RTW89_MCC_PLAN_MID_BT) in __rtw89_mcc_calc_pattern_strict()
1071 bt_dur_in_mid = mcc->bt_role.duration; in __rtw89_mcc_calc_pattern_strict()
1075 if (ref->duration < min_tob + min_toa) { in __rtw89_mcc_calc_pattern_strict()
1078 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
1081 if (aux->duration < min_tob + min_toa) { in __rtw89_mcc_calc_pattern_strict()
1084 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
1087 res = bcn_ofst - min_toa - min_tob - bt_dur_in_mid; in __rtw89_mcc_calc_pattern_strict()
1091 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
1094 upper_toa_ref = min_t(s16, min_toa + res, ref->duration - min_tob); in __rtw89_mcc_calc_pattern_strict()
1096 upper_tob_aux = min_t(s16, min_tob + res, aux->duration - min_toa); in __rtw89_mcc_calc_pattern_strict()
1099 if (ref->limit.enable) { in __rtw89_mcc_calc_pattern_strict()
1100 if (min_tob > ref->limit.max_tob || min_toa > ref->limit.max_toa) { in __rtw89_mcc_calc_pattern_strict()
1103 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
1106 upper_toa_ref = min_t(s16, upper_toa_ref, ref->limit.max_toa); in __rtw89_mcc_calc_pattern_strict()
1108 ref->duration - ref->limit.max_tob); in __rtw89_mcc_calc_pattern_strict()
1109 } else if (aux->limit.enable) { in __rtw89_mcc_calc_pattern_strict()
1110 if (min_tob > aux->limit.max_tob || min_toa > aux->limit.max_toa) { in __rtw89_mcc_calc_pattern_strict()
1113 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
1116 upper_tob_aux = min_t(s16, upper_tob_aux, aux->limit.max_tob); in __rtw89_mcc_calc_pattern_strict()
1118 aux->duration - aux->limit.max_toa); in __rtw89_mcc_calc_pattern_strict()
1122 bcn_ofst - bt_dur_in_mid - lower_tob_aux); in __rtw89_mcc_calc_pattern_strict()
1124 bcn_ofst - bt_dur_in_mid - upper_tob_aux); in __rtw89_mcc_calc_pattern_strict()
1128 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
1131 ptrn->toa_ref = (upper_toa_ref + lower_toa_ref) / 2; in __rtw89_mcc_calc_pattern_strict()
1132 ptrn->tob_ref = ref->duration - ptrn->toa_ref; in __rtw89_mcc_calc_pattern_strict()
1133 ptrn->tob_aux = bcn_ofst - ptrn->toa_ref - bt_dur_in_mid; in __rtw89_mcc_calc_pattern_strict()
1134 ptrn->toa_aux = aux->duration - ptrn->tob_aux; in __rtw89_mcc_calc_pattern_strict()
1140 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_calc_pattern()
1141 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_calc_pattern()
1142 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_calc_pattern()
1148 if (ref->limit.enable && aux->limit.enable) { in rtw89_mcc_calc_pattern()
1151 return -EINVAL; in rtw89_mcc_calc_pattern()
1154 if (ref->limit.enable && in rtw89_mcc_calc_pattern()
1155 ref->duration > ref->limit.max_tob + ref->limit.max_toa) { in rtw89_mcc_calc_pattern()
1158 return -EINVAL; in rtw89_mcc_calc_pattern()
1161 if (aux->limit.enable && in rtw89_mcc_calc_pattern()
1162 aux->duration > aux->limit.max_tob + aux->limit.max_toa) { in rtw89_mcc_calc_pattern()
1165 return -EINVAL; in rtw89_mcc_calc_pattern()
1200 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_set_default_pattern()
1201 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_set_default_pattern()
1202 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_set_default_pattern()
1209 tmp.tob_ref = ref->duration / 2; in rtw89_mcc_set_default_pattern()
1210 tmp.toa_ref = ref->duration - tmp.tob_ref; in rtw89_mcc_set_default_pattern()
1211 tmp.tob_aux = aux->duration / 2; in rtw89_mcc_set_default_pattern()
1212 tmp.toa_aux = aux->duration - tmp.tob_aux; in rtw89_mcc_set_default_pattern()
1221 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_set_duration_go_sta()
1222 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_set_duration_go_sta()
1223 u16 mcc_intvl = config->mcc_interval; in rtw89_mcc_set_duration_go_sta()
1226 dur_go = clamp_t(u16, role_go->duration, RTW89_MCC_MIN_GO_DURATION, in rtw89_mcc_set_duration_go_sta()
1227 mcc_intvl - RTW89_MCC_MIN_STA_DURATION); in rtw89_mcc_set_duration_go_sta()
1228 if (role_go->limit.enable) in rtw89_mcc_set_duration_go_sta()
1229 dur_go = min(dur_go, role_go->limit.max_dur); in rtw89_mcc_set_duration_go_sta()
1230 dur_sta = mcc_intvl - dur_go; in rtw89_mcc_set_duration_go_sta()
1233 "MCC set dur: (go, sta) {%d, %d} -> {%d, %d}\n", in rtw89_mcc_set_duration_go_sta()
1234 role_go->duration, role_sta->duration, dur_go, dur_sta); in rtw89_mcc_set_duration_go_sta()
1236 role_go->duration = dur_go; in rtw89_mcc_set_duration_go_sta()
1237 role_sta->duration = dur_sta; in rtw89_mcc_set_duration_go_sta()
1242 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_set_duration_gc_sta()
1243 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_set_duration_gc_sta()
1244 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_set_duration_gc_sta()
1245 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_set_duration_gc_sta()
1246 u16 mcc_intvl = config->mcc_interval; in rtw89_mcc_set_duration_gc_sta()
1249 if (ref->duration < RTW89_MCC_MIN_STA_DURATION) { in rtw89_mcc_set_duration_gc_sta()
1251 dur_aux = mcc_intvl - dur_ref; in rtw89_mcc_set_duration_gc_sta()
1252 } else if (aux->duration < RTW89_MCC_MIN_STA_DURATION) { in rtw89_mcc_set_duration_gc_sta()
1254 dur_ref = mcc_intvl - dur_aux; in rtw89_mcc_set_duration_gc_sta()
1256 dur_ref = ref->duration; in rtw89_mcc_set_duration_gc_sta()
1257 dur_aux = mcc_intvl - dur_ref; in rtw89_mcc_set_duration_gc_sta()
1260 if (ref->limit.enable) { in rtw89_mcc_set_duration_gc_sta()
1261 dur_ref = min(dur_ref, ref->limit.max_dur); in rtw89_mcc_set_duration_gc_sta()
1262 dur_aux = mcc_intvl - dur_ref; in rtw89_mcc_set_duration_gc_sta()
1263 } else if (aux->limit.enable) { in rtw89_mcc_set_duration_gc_sta()
1264 dur_aux = min(dur_aux, aux->limit.max_dur); in rtw89_mcc_set_duration_gc_sta()
1265 dur_ref = mcc_intvl - dur_aux; in rtw89_mcc_set_duration_gc_sta()
1269 "MCC set dur: (ref, aux) {%d ~ %d} -> {%d ~ %d}\n", in rtw89_mcc_set_duration_gc_sta()
1270 ref->duration, aux->duration, dur_ref, dur_aux); in rtw89_mcc_set_duration_gc_sta()
1272 ref->duration = dur_ref; in rtw89_mcc_set_duration_gc_sta()
1273 aux->duration = dur_aux; in rtw89_mcc_set_duration_gc_sta()
1292 p->parm[ordered_idx].dur = mcc_role->duration; in rtw89_mcc_mod_dur_get_iterator()
1294 if (mcc_role->is_go) in rtw89_mcc_mod_dur_get_iterator()
1299 p->parm[ordered_idx].room = max_t(s32, p->parm[ordered_idx].dur - min, 0); in rtw89_mcc_mod_dur_get_iterator()
1302 "MCC mod dur: chk role[%u]: dur %u, min %u, room %u\n", in rtw89_mcc_mod_dur_get_iterator()
1303 ordered_idx, p->parm[ordered_idx].dur, min, in rtw89_mcc_mod_dur_get_iterator()
1304 p->parm[ordered_idx].room); in rtw89_mcc_mod_dur_get_iterator()
1306 p->available += p->parm[ordered_idx].room; in rtw89_mcc_mod_dur_get_iterator()
1317 mcc_role->duration = p->parm[ordered_idx].dur; in rtw89_mcc_mod_dur_put_iterator()
1320 "MCC mod dur: set role[%u]: dur %u\n", in rtw89_mcc_mod_dur_put_iterator()
1321 ordered_idx, p->parm[ordered_idx].dur); in rtw89_mcc_mod_dur_put_iterator()
1327 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1328 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1330 u16 mcc_intvl = config->mcc_interval; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1331 u16 bt_dur = mcc->bt_role.duration; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1341 wifi_dur = mcc_intvl - bt_dur; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1344 data.parm[0].dur -= min_t(u16, bt_dur / 2, data.parm[0].room); in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1345 data.parm[1].dur = wifi_dur - data.parm[0].dur; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1347 data.parm[1].dur -= min_t(u16, bt_dur / 2, data.parm[1].room); in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1348 data.parm[0].dur = wifi_dur - data.parm[1].dur; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1354 mcc->bt_role.duration = bt_dur; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1362 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_mod_duration_diff_band_with_bt()
1363 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_mod_duration_diff_band_with_bt()
1367 dur_2ghz = role_2ghz->duration; in rtw89_mcc_mod_duration_diff_band_with_bt()
1368 dur_non_2ghz = role_non_2ghz->duration; in rtw89_mcc_mod_duration_diff_band_with_bt()
1369 mcc_intvl = config->mcc_interval; in rtw89_mcc_mod_duration_diff_band_with_bt()
1370 bt_dur = mcc->bt_role.duration; in rtw89_mcc_mod_duration_diff_band_with_bt()
1387 dur_2ghz = mcc_intvl - dur_non_2ghz; in rtw89_mcc_mod_duration_diff_band_with_bt()
1389 if (role_non_2ghz->limit.enable) { in rtw89_mcc_mod_duration_diff_band_with_bt()
1392 role_non_2ghz->limit.max_dur); in rtw89_mcc_mod_duration_diff_band_with_bt()
1394 dur_non_2ghz = min(dur_non_2ghz, role_non_2ghz->limit.max_dur); in rtw89_mcc_mod_duration_diff_band_with_bt()
1395 dur_2ghz = mcc_intvl - dur_non_2ghz; in rtw89_mcc_mod_duration_diff_band_with_bt()
1402 role_2ghz->duration = dur_2ghz; in rtw89_mcc_mod_duration_diff_band_with_bt()
1403 role_non_2ghz->duration = dur_non_2ghz; in rtw89_mcc_mod_duration_diff_band_with_bt()
1408 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_duration_decision_on_bt()
1409 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_duration_decision_on_bt()
1410 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_duration_decision_on_bt()
1411 struct rtw89_mcc_bt_role *bt_role = &mcc->bt_role; in rtw89_mcc_duration_decision_on_bt()
1413 if (!bt_role->duration) in rtw89_mcc_duration_decision_on_bt()
1416 if (ref->is_2ghz && aux->is_2ghz) { in rtw89_mcc_duration_decision_on_bt()
1424 if (!ref->is_2ghz && !aux->is_2ghz) { in rtw89_mcc_duration_decision_on_bt()
1431 "MCC one role is on 2GHz; modify another for BT duration\n"); in rtw89_mcc_duration_decision_on_bt()
1433 if (ref->is_2ghz) in rtw89_mcc_duration_decision_on_bt()
1446 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_sync_tbtt()
1447 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_sync_tbtt()
1448 u16 beacon_offset_us = ieee80211_tu_to_usec(config->beacon_offset); in rtw89_mcc_sync_tbtt()
1449 u32 bcn_intvl_src_us = ieee80211_tu_to_usec(src->beacon_interval); in rtw89_mcc_sync_tbtt()
1457 ret = rtw89_mac_port_get_tsf(rtwdev, src->rtwvif_link, &tsf_src); in rtw89_mcc_sync_tbtt()
1466 tbtt_tgt = tsf_src - cur_tbtt_ofst_src + beacon_offset_us; in rtw89_mcc_sync_tbtt()
1468 tbtt_tgt = tsf_src - cur_tbtt_ofst_src + in rtw89_mcc_sync_tbtt()
1469 (bcn_intvl_src_us - beacon_offset_us); in rtw89_mcc_sync_tbtt()
1472 tsf_ofst_tgt = bcn_intvl_src_us - remainder; in rtw89_mcc_sync_tbtt()
1474 config->sync.macid_tgt = tgt->rtwvif_link->mac_id; in rtw89_mcc_sync_tbtt()
1475 config->sync.band_tgt = tgt->rtwvif_link->mac_idx; in rtw89_mcc_sync_tbtt()
1476 config->sync.port_tgt = tgt->rtwvif_link->port; in rtw89_mcc_sync_tbtt()
1477 config->sync.macid_src = src->rtwvif_link->mac_id; in rtw89_mcc_sync_tbtt()
1478 config->sync.band_src = src->rtwvif_link->mac_idx; in rtw89_mcc_sync_tbtt()
1479 config->sync.port_src = src->rtwvif_link->port; in rtw89_mcc_sync_tbtt()
1480 config->sync.offset = tsf_ofst_tgt / 1024; in rtw89_mcc_sync_tbtt()
1481 config->sync.enable = true; in rtw89_mcc_sync_tbtt()
1485 config->sync.macid_tgt, config->sync.macid_src, in rtw89_mcc_sync_tbtt()
1486 config->sync.offset); in rtw89_mcc_sync_tbtt()
1488 rtw89_mac_port_tsf_sync(rtwdev, tgt->rtwvif_link, src->rtwvif_link, in rtw89_mcc_sync_tbtt()
1489 config->sync.offset); in rtw89_mcc_sync_tbtt()
1494 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_fill_start_tsf()
1495 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_fill_start_tsf()
1496 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_fill_start_tsf()
1497 u32 bcn_intvl_ref_us = ieee80211_tu_to_usec(ref->beacon_interval); in rtw89_mcc_fill_start_tsf()
1498 u32 tob_ref_us = ieee80211_tu_to_usec(config->pattern.tob_ref); in rtw89_mcc_fill_start_tsf()
1499 struct rtw89_vif_link *rtwvif_link = ref->rtwvif_link; in rtw89_mcc_fill_start_tsf()
1512 if (ref->is_go) in rtw89_mcc_fill_start_tsf()
1518 start_tsf = tsf - cur_tbtt_ofst + bcn_intvl_ref_us - tob_ref_us; in rtw89_mcc_fill_start_tsf()
1522 config->start_tsf = start_tsf; in rtw89_mcc_fill_start_tsf()
1528 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_fill_config()
1529 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_fill_config()
1530 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_fill_config()
1531 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_fill_config()
1537 switch (mcc->mode) { in rtw89_mcc_fill_config()
1539 config->beacon_offset = RTW89_MCC_DFLT_BCN_OFST_TIME; in rtw89_mcc_fill_config()
1540 if (ref->is_go) { in rtw89_mcc_fill_config()
1542 config->mcc_interval = ref->beacon_interval; in rtw89_mcc_fill_config()
1546 config->mcc_interval = aux->beacon_interval; in rtw89_mcc_fill_config()
1551 config->beacon_offset = rtw89_mcc_get_bcn_ofst(rtwdev); in rtw89_mcc_fill_config()
1552 config->mcc_interval = ref->beacon_interval; in rtw89_mcc_fill_config()
1556 rtw89_warn(rtwdev, "MCC unknown mode: %d\n", mcc->mode); in rtw89_mcc_fill_config()
1557 return -EFAULT; in rtw89_mcc_fill_config()
1573 static int __mcc_fw_add_role(struct rtw89_dev *rtwdev, struct rtw89_mcc_role *role) in __mcc_fw_add_role() argument
1575 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_add_role()
1576 struct rtw89_mcc_config *config = &mcc->config; in __mcc_fw_add_role()
1577 struct rtw89_mcc_pattern *pattern = &config->pattern; in __mcc_fw_add_role()
1578 struct rtw89_mcc_courtesy *courtesy = &pattern->courtesy; in __mcc_fw_add_role()
1579 struct rtw89_mcc_policy *policy = &role->policy; in __mcc_fw_add_role()
1584 chan = rtw89_chan_get(rtwdev, role->rtwvif_link->chanctx_idx); in __mcc_fw_add_role()
1585 req.central_ch_seg0 = chan->channel; in __mcc_fw_add_role()
1586 req.primary_ch = chan->primary_channel; in __mcc_fw_add_role()
1587 req.bandwidth = chan->band_width; in __mcc_fw_add_role()
1588 req.ch_band_type = chan->band_type; in __mcc_fw_add_role()
1590 req.macid = role->rtwvif_link->mac_id; in __mcc_fw_add_role()
1591 req.group = mcc->group; in __mcc_fw_add_role()
1592 req.c2h_rpt = policy->c2h_rpt; in __mcc_fw_add_role()
1593 req.tx_null_early = policy->tx_null_early; in __mcc_fw_add_role()
1594 req.dis_tx_null = policy->dis_tx_null; in __mcc_fw_add_role()
1595 req.in_curr_ch = policy->in_curr_ch; in __mcc_fw_add_role()
1596 req.sw_retry_count = policy->sw_retry_count; in __mcc_fw_add_role()
1597 req.dis_sw_retry = policy->dis_sw_retry; in __mcc_fw_add_role()
1598 req.duration = role->duration; in __mcc_fw_add_role()
1601 if (courtesy->enable && courtesy->macid_src == req.macid) { in __mcc_fw_add_role()
1602 req.courtesy_target = courtesy->macid_tgt; in __mcc_fw_add_role()
1603 req.courtesy_num = courtesy->slot_num; in __mcc_fw_add_role()
1610 "MCC h2c failed to add wifi role: %d\n", ret); in __mcc_fw_add_role()
1614 ret = rtw89_fw_h2c_mcc_macid_bitmap(rtwdev, mcc->group, in __mcc_fw_add_role()
1615 role->rtwvif_link->mac_id, in __mcc_fw_add_role()
1616 role->macid_bitmap); in __mcc_fw_add_role()
1627 void __mrc_fw_add_role(struct rtw89_dev *rtwdev, struct rtw89_mcc_role *role, in __mrc_fw_add_role() argument
1630 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mrc_fw_add_role()
1631 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mrc_fw_add_role()
1632 struct rtw89_mcc_policy *policy = &role->policy; in __mrc_fw_add_role()
1636 slot_arg = &arg->slots[slot_idx]; in __mrc_fw_add_role()
1637 role->slot_idx = slot_idx; in __mrc_fw_add_role()
1639 slot_arg->duration = role->duration; in __mrc_fw_add_role()
1640 slot_arg->role_num = 1; in __mrc_fw_add_role()
1642 chan = rtw89_chan_get(rtwdev, role->rtwvif_link->chanctx_idx); in __mrc_fw_add_role()
1644 slot_arg->roles[0].role_type = RTW89_H2C_MRC_ROLE_WIFI; in __mrc_fw_add_role()
1645 slot_arg->roles[0].is_master = role == ref; in __mrc_fw_add_role()
1646 slot_arg->roles[0].band = chan->band_type; in __mrc_fw_add_role()
1647 slot_arg->roles[0].bw = chan->band_width; in __mrc_fw_add_role()
1648 slot_arg->roles[0].central_ch = chan->channel; in __mrc_fw_add_role()
1649 slot_arg->roles[0].primary_ch = chan->primary_channel; in __mrc_fw_add_role()
1650 slot_arg->roles[0].en_tx_null = !policy->dis_tx_null; in __mrc_fw_add_role()
1651 slot_arg->roles[0].null_early = policy->tx_null_early; in __mrc_fw_add_role()
1652 slot_arg->roles[0].macid = role->rtwvif_link->mac_id; in __mrc_fw_add_role()
1653 slot_arg->roles[0].macid_main_bitmap = in __mrc_fw_add_role()
1654 rtw89_mcc_role_fw_macid_bitmap_to_u32(role); in __mrc_fw_add_role()
1659 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_add_bt_role()
1660 struct rtw89_mcc_bt_role *bt_role = &mcc->bt_role; in __mcc_fw_add_bt_role()
1664 req.group = mcc->group; in __mcc_fw_add_bt_role()
1665 req.duration = bt_role->duration; in __mcc_fw_add_bt_role()
1671 "MCC h2c failed to add bt role: %d\n", ret); in __mcc_fw_add_bt_role()
1682 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mrc_fw_add_bt_role()
1683 struct rtw89_mcc_bt_role *bt_role = &mcc->bt_role; in __mrc_fw_add_bt_role()
1684 struct rtw89_fw_mrc_add_slot_arg *slot_arg = &arg->slots[slot_idx]; in __mrc_fw_add_bt_role()
1686 slot_arg->duration = bt_role->duration; in __mrc_fw_add_bt_role()
1687 slot_arg->role_num = 1; in __mrc_fw_add_bt_role()
1689 slot_arg->roles[0].role_type = RTW89_H2C_MRC_ROLE_BT; in __mrc_fw_add_bt_role()
1694 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_start()
1695 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mcc_fw_start()
1696 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mcc_fw_start()
1697 struct rtw89_mcc_config *config = &mcc->config; in __mcc_fw_start()
1698 struct rtw89_mcc_pattern *pattern = &config->pattern; in __mcc_fw_start()
1699 struct rtw89_mcc_sync *sync = &config->sync; in __mcc_fw_start()
1704 req.old_group = mcc->group; in __mcc_fw_start()
1706 mcc->group = RTW89_MCC_NEXT_GROUP(mcc->group); in __mcc_fw_start()
1709 req.group = mcc->group; in __mcc_fw_start()
1711 switch (pattern->plan) { in __mcc_fw_start()
1749 rtw89_warn(rtwdev, "MCC unknown plan: %d\n", pattern->plan); in __mcc_fw_start()
1750 return -EFAULT; in __mcc_fw_start()
1753 if (sync->enable) { in __mcc_fw_start()
1754 ret = rtw89_fw_h2c_mcc_sync(rtwdev, req.group, sync->macid_src, in __mcc_fw_start()
1755 sync->macid_tgt, sync->offset); in __mcc_fw_start()
1763 req.macid = ref->rtwvif_link->mac_id; in __mcc_fw_start()
1764 req.tsf_high = config->start_tsf >> 32; in __mcc_fw_start()
1765 req.tsf_low = config->start_tsf; in __mcc_fw_start()
1780 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mrc_fw_add_courtesy()
1781 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mrc_fw_add_courtesy()
1782 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mrc_fw_add_courtesy()
1783 struct rtw89_mcc_config *config = &mcc->config; in __mrc_fw_add_courtesy()
1784 struct rtw89_mcc_pattern *pattern = &config->pattern; in __mrc_fw_add_courtesy()
1785 struct rtw89_mcc_courtesy *courtesy = &pattern->courtesy; in __mrc_fw_add_courtesy()
1789 if (!courtesy->enable) in __mrc_fw_add_courtesy()
1792 if (courtesy->macid_src == ref->rtwvif_link->mac_id) { in __mrc_fw_add_courtesy()
1793 slot_arg_src = &arg->slots[ref->slot_idx]; in __mrc_fw_add_courtesy()
1794 slot_idx_tgt = aux->slot_idx; in __mrc_fw_add_courtesy()
1796 slot_arg_src = &arg->slots[aux->slot_idx]; in __mrc_fw_add_courtesy()
1797 slot_idx_tgt = ref->slot_idx; in __mrc_fw_add_courtesy()
1800 slot_arg_src->courtesy_target = slot_idx_tgt; in __mrc_fw_add_courtesy()
1801 slot_arg_src->courtesy_period = courtesy->slot_num; in __mrc_fw_add_courtesy()
1802 slot_arg_src->courtesy_en = true; in __mrc_fw_add_courtesy()
1807 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mrc_fw_start()
1808 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mrc_fw_start()
1809 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mrc_fw_start()
1810 struct rtw89_mcc_config *config = &mcc->config; in __mrc_fw_start()
1811 struct rtw89_mcc_pattern *pattern = &config->pattern; in __mrc_fw_start()
1812 struct rtw89_mcc_sync *sync = &config->sync; in __mrc_fw_start()
1818 NUM_OF_RTW89_MCC_ROLES + 1 /* bt role */); in __mrc_fw_start()
1821 start_arg.old_sch_idx = mcc->group; in __mrc_fw_start()
1823 mcc->group = RTW89_MCC_NEXT_GROUP(mcc->group); in __mrc_fw_start()
1826 add_arg.sch_idx = mcc->group; in __mrc_fw_start()
1829 switch (pattern->plan) { in __mrc_fw_start()
1854 rtw89_warn(rtwdev, "MCC unknown plan: %d\n", pattern->plan); in __mrc_fw_start()
1855 return -EFAULT; in __mrc_fw_start()
1867 if (sync->enable) { in __mrc_fw_start()
1869 .offset = sync->offset, in __mrc_fw_start()
1871 .band = sync->band_src, in __mrc_fw_start()
1872 .port = sync->port_src, in __mrc_fw_start()
1875 .band = sync->band_tgt, in __mrc_fw_start()
1876 .port = sync->port_tgt, in __mrc_fw_start()
1888 start_arg.sch_idx = mcc->group; in __mrc_fw_start()
1889 start_arg.start_tsf = config->start_tsf; in __mrc_fw_start()
1903 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_set_duration_no_bt()
1904 struct rtw89_mcc_config *config = &mcc->config; in __mcc_fw_set_duration_no_bt()
1905 struct rtw89_mcc_sync *sync = &config->sync; in __mcc_fw_set_duration_no_bt()
1906 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mcc_fw_set_duration_no_bt()
1907 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mcc_fw_set_duration_no_bt()
1909 .group = mcc->group, in __mcc_fw_set_duration_no_bt()
1911 .start_macid = ref->rtwvif_link->mac_id, in __mcc_fw_set_duration_no_bt()
1912 .macid_x = ref->rtwvif_link->mac_id, in __mcc_fw_set_duration_no_bt()
1913 .macid_y = aux->rtwvif_link->mac_id, in __mcc_fw_set_duration_no_bt()
1914 .duration_x = ref->duration, in __mcc_fw_set_duration_no_bt()
1915 .duration_y = aux->duration, in __mcc_fw_set_duration_no_bt()
1916 .start_tsf_high = config->start_tsf >> 32, in __mcc_fw_set_duration_no_bt()
1917 .start_tsf_low = config->start_tsf, in __mcc_fw_set_duration_no_bt()
1928 if (!sync->enable || !sync_changed) in __mcc_fw_set_duration_no_bt()
1931 ret = rtw89_fw_h2c_mcc_sync(rtwdev, mcc->group, sync->macid_src, in __mcc_fw_set_duration_no_bt()
1932 sync->macid_tgt, sync->offset); in __mcc_fw_set_duration_no_bt()
1944 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mrc_fw_set_duration_no_bt()
1945 struct rtw89_mcc_config *config = &mcc->config; in __mrc_fw_set_duration_no_bt()
1946 struct rtw89_mcc_sync *sync = &config->sync; in __mrc_fw_set_duration_no_bt()
1947 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mrc_fw_set_duration_no_bt()
1948 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mrc_fw_set_duration_no_bt()
1950 .sch_idx = mcc->group, in __mrc_fw_set_duration_no_bt()
1951 .start_tsf = config->start_tsf, in __mrc_fw_set_duration_no_bt()
1954 .slot_idx = ref->slot_idx, in __mrc_fw_set_duration_no_bt()
1955 .duration = ref->duration, in __mrc_fw_set_duration_no_bt()
1958 .slot_idx = aux->slot_idx, in __mrc_fw_set_duration_no_bt()
1959 .duration = aux->duration, in __mrc_fw_set_duration_no_bt()
1963 .offset = sync->offset, in __mrc_fw_set_duration_no_bt()
1965 .band = sync->band_src, in __mrc_fw_set_duration_no_bt()
1966 .port = sync->port_src, in __mrc_fw_set_duration_no_bt()
1969 .band = sync->band_tgt, in __mrc_fw_set_duration_no_bt()
1970 .port = sync->port_tgt, in __mrc_fw_set_duration_no_bt()
1983 if (!sync->enable || !sync_changed) in __mrc_fw_set_duration_no_bt()
1998 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_handle_beacon_noa()
1999 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_handle_beacon_noa()
2000 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_handle_beacon_noa()
2001 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_handle_beacon_noa()
2002 struct rtw89_mcc_pattern *pattern = &config->pattern; in rtw89_mcc_handle_beacon_noa()
2003 struct rtw89_mcc_sync *sync = &config->sync; in rtw89_mcc_handle_beacon_noa()
2005 u64 start_time = config->start_tsf; in rtw89_mcc_handle_beacon_noa()
2006 u32 interval = config->mcc_interval; in rtw89_mcc_handle_beacon_noa()
2010 if (mcc->mode != RTW89_MCC_MODE_GO_STA) in rtw89_mcc_handle_beacon_noa()
2013 if (ref->is_go) { in rtw89_mcc_handle_beacon_noa()
2014 rtwvif_go = ref->rtwvif_link; in rtw89_mcc_handle_beacon_noa()
2015 start_time += ieee80211_tu_to_usec(ref->duration); in rtw89_mcc_handle_beacon_noa()
2016 duration = config->mcc_interval - ref->duration; in rtw89_mcc_handle_beacon_noa()
2017 } else if (aux->is_go) { in rtw89_mcc_handle_beacon_noa()
2018 rtwvif_go = aux->rtwvif_link; in rtw89_mcc_handle_beacon_noa()
2019 start_time += ieee80211_tu_to_usec(pattern->tob_ref) + in rtw89_mcc_handle_beacon_noa()
2020 ieee80211_tu_to_usec(config->beacon_offset) + in rtw89_mcc_handle_beacon_noa()
2021 ieee80211_tu_to_usec(pattern->toa_aux); in rtw89_mcc_handle_beacon_noa()
2022 duration = config->mcc_interval - aux->duration; in rtw89_mcc_handle_beacon_noa()
2025 start_time += ieee80211_tu_to_usec(sync->offset); in rtw89_mcc_handle_beacon_noa()
2043 if (!rtwvif_go->chanctx_assigned) in rtw89_mcc_handle_beacon_noa()
2051 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_start_beacon_noa()
2052 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_start_beacon_noa()
2053 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_start_beacon_noa()
2055 if (mcc->mode != RTW89_MCC_MODE_GO_STA) in rtw89_mcc_start_beacon_noa()
2058 if (ref->is_go) in rtw89_mcc_start_beacon_noa()
2059 rtw89_fw_h2c_tsf32_toggle(rtwdev, ref->rtwvif_link, true); in rtw89_mcc_start_beacon_noa()
2060 else if (aux->is_go) in rtw89_mcc_start_beacon_noa()
2061 rtw89_fw_h2c_tsf32_toggle(rtwdev, aux->rtwvif_link, true); in rtw89_mcc_start_beacon_noa()
2068 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_stop_beacon_noa()
2069 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_stop_beacon_noa()
2070 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_stop_beacon_noa()
2072 if (mcc->mode != RTW89_MCC_MODE_GO_STA) in rtw89_mcc_stop_beacon_noa()
2075 if (ref->is_go) in rtw89_mcc_stop_beacon_noa()
2076 rtw89_fw_h2c_tsf32_toggle(rtwdev, ref->rtwvif_link, false); in rtw89_mcc_stop_beacon_noa()
2077 else if (aux->is_go) in rtw89_mcc_stop_beacon_noa()
2078 rtw89_fw_h2c_tsf32_toggle(rtwdev, aux->rtwvif_link, false); in rtw89_mcc_stop_beacon_noa()
2085 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_start()
2086 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_start()
2087 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_start()
2090 if (rtwdev->scanning) in rtw89_mcc_start()
2091 rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif); in rtw89_mcc_start()
2101 if (ref->is_go || aux->is_go) in rtw89_mcc_start()
2102 mcc->mode = RTW89_MCC_MODE_GO_STA; in rtw89_mcc_start()
2104 mcc->mode = RTW89_MCC_MODE_GC_STA; in rtw89_mcc_start()
2106 rtw89_debug(rtwdev, RTW89_DBG_CHAN, "MCC sel mode: %d\n", mcc->mode); in rtw89_mcc_start()
2108 mcc->group = RTW89_MCC_DFLT_GROUP; in rtw89_mcc_start()
2136 sel->mac_id = mcc_role->rtwvif_link->mac_id; in rtw89_mcc_stop_sel_fill()
2137 sel->slot_idx = mcc_role->slot_idx; in rtw89_mcc_stop_sel_fill()
2147 if (!mcc_role->rtwvif_link->chanctx_assigned) in rtw89_mcc_stop_sel_iterator()
2156 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_stop()
2157 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_stop()
2168 ret = rtw89_fw_h2c_mrc_del(rtwdev, mcc->group, sel.slot_idx); in rtw89_mcc_stop()
2173 ret = rtw89_fw_h2c_stop_mcc(rtwdev, mcc->group, in rtw89_mcc_stop()
2179 ret = rtw89_fw_h2c_del_mcc_group(rtwdev, mcc->group, true); in rtw89_mcc_stop()
2192 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_update()
2193 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_update()
2198 if (rtwdev->scanning) in rtw89_mcc_update()
2199 rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif); in rtw89_mcc_update()
2208 config->pattern.plan != RTW89_MCC_PLAN_NO_BT) { in rtw89_mcc_update()
2217 if (memcmp(&old_cfg.sync, &config->sync, sizeof(old_cfg.sync)) == 0) in rtw89_mcc_update()
2237 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_track()
2238 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_track()
2239 struct rtw89_mcc_pattern *pattern = &config->pattern; in rtw89_mcc_track()
2244 if (mcc->mode != RTW89_MCC_MODE_GC_STA) in rtw89_mcc_track()
2248 if (bcn_ofst > config->beacon_offset) { in rtw89_mcc_track()
2249 diff = bcn_ofst - config->beacon_offset; in rtw89_mcc_track()
2250 if (pattern->tob_aux < 0) in rtw89_mcc_track()
2251 tolerance = -pattern->tob_aux; in rtw89_mcc_track()
2253 tolerance = pattern->toa_aux; in rtw89_mcc_track()
2255 diff = config->beacon_offset - bcn_ofst; in rtw89_mcc_track()
2256 if (pattern->toa_aux < 0) in rtw89_mcc_track()
2257 tolerance = -pattern->toa_aux; in rtw89_mcc_track()
2259 tolerance = pattern->tob_aux; in rtw89_mcc_track()
2271 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_upd_macid_bitmap()
2274 ret = rtw89_fw_h2c_mcc_macid_bitmap(rtwdev, mcc->group, in __mcc_fw_upd_macid_bitmap()
2275 upd->rtwvif_link->mac_id, in __mcc_fw_upd_macid_bitmap()
2276 upd->macid_bitmap); in __mcc_fw_upd_macid_bitmap()
2290 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mrc_fw_upd_macid_bitmap()
2299 arg.sch_idx = mcc->group; in __mrc_fw_upd_macid_bitmap()
2300 arg.macid = upd->rtwvif_link->mac_id; in __mrc_fw_upd_macid_bitmap()
2338 .rtwvif_link = mcc_role->rtwvif_link, in rtw89_mcc_upd_map_iterator()
2342 if (!mcc_role->is_go) in rtw89_mcc_upd_map_iterator()
2346 if (memcmp(mcc_role->macid_bitmap, upd.macid_bitmap, in rtw89_mcc_upd_map_iterator()
2347 sizeof(mcc_role->macid_bitmap)) == 0) in rtw89_mcc_upd_map_iterator()
2358 memcpy(mcc_role->macid_bitmap, upd.macid_bitmap, in rtw89_mcc_upd_map_iterator()
2359 sizeof(mcc_role->macid_bitmap)); in rtw89_mcc_upd_map_iterator()
2365 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_update_macid_bitmap()
2367 if (mcc->mode != RTW89_MCC_MODE_GO_STA) in rtw89_mcc_update_macid_bitmap()
2378 memset(&mcc_role->limit, 0, sizeof(mcc_role->limit)); in rtw89_mcc_upd_lmt_iterator()
2385 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_update_limit()
2387 if (mcc->mode != RTW89_MCC_MODE_GC_STA) in rtw89_mcc_update_limit()
2397 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_work()
2404 mutex_lock(&rtwdev->mutex); in rtw89_chanctx_work()
2406 if (hal->entity_pause) { in rtw89_chanctx_work()
2407 mutex_unlock(&rtwdev->mutex); in rtw89_chanctx_work()
2412 if (test_and_clear_bit(i, hal->changes)) in rtw89_chanctx_work()
2449 mutex_unlock(&rtwdev->mutex); in rtw89_chanctx_work()
2455 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_queue_chanctx_change()
2474 set_bit(change, hal->changes); in rtw89_queue_chanctx_change()
2480 ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->chanctx_work, in rtw89_queue_chanctx_change()
2491 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_track()
2494 lockdep_assert_held(&rtwdev->mutex); in rtw89_chanctx_track()
2496 if (hal->entity_pause) in rtw89_chanctx_track()
2512 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_pause()
2515 lockdep_assert_held(&rtwdev->mutex); in rtw89_chanctx_pause()
2517 if (hal->entity_pause) in rtw89_chanctx_pause()
2531 hal->entity_pause = true; in rtw89_chanctx_pause()
2539 if (!parm || !parm->cb) in rtw89_chanctx_proceed_cb()
2542 ret = parm->cb(rtwdev, parm->data); in rtw89_chanctx_proceed_cb()
2545 parm->caller ?: "unknown", ret); in rtw89_chanctx_proceed_cb()
2548 /* pass @cb_parm if there is a @cb_parm->cb which needs to invoke right after
2554 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_proceed()
2558 lockdep_assert_held(&rtwdev->mutex); in rtw89_chanctx_proceed()
2560 if (unlikely(!hal->entity_pause)) { in rtw89_chanctx_proceed()
2567 hal->entity_pause = false; in rtw89_chanctx_proceed()
2594 if (!rtwvif_link->chanctx_assigned) in __rtw89_swap_chanctx()
2597 if (rtwvif_link->chanctx_idx == idx1) in __rtw89_swap_chanctx()
2598 rtwvif_link->chanctx_idx = idx2; in __rtw89_swap_chanctx()
2599 else if (rtwvif_link->chanctx_idx == idx2) in __rtw89_swap_chanctx()
2600 rtwvif_link->chanctx_idx = idx1; in __rtw89_swap_chanctx()
2608 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_swap_chanctx()
2615 hal->chanctx[idx1].cfg->idx = idx2; in rtw89_swap_chanctx()
2616 hal->chanctx[idx2].cfg->idx = idx1; in rtw89_swap_chanctx()
2618 swap(hal->chanctx[idx1], hal->chanctx[idx2]); in rtw89_swap_chanctx()
2623 cur = atomic_read(&hal->roc_chanctx_idx); in rtw89_swap_chanctx()
2625 atomic_set(&hal->roc_chanctx_idx, idx2); in rtw89_swap_chanctx()
2627 atomic_set(&hal->roc_chanctx_idx, idx1); in rtw89_swap_chanctx()
2633 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_ops_add()
2634 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; in rtw89_chanctx_ops_add()
2635 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_chanctx_ops_add()
2638 idx = find_first_zero_bit(hal->entity_map, NUM_OF_RTW89_CHANCTX); in rtw89_chanctx_ops_add()
2639 if (idx >= chip->support_chanctx_num) in rtw89_chanctx_ops_add()
2640 return -ENOENT; in rtw89_chanctx_ops_add()
2642 rtw89_config_entity_chandef(rtwdev, idx, &ctx->def); in rtw89_chanctx_ops_add()
2643 cfg->idx = idx; in rtw89_chanctx_ops_add()
2644 cfg->ref_count = 0; in rtw89_chanctx_ops_add()
2645 hal->chanctx[idx].cfg = cfg; in rtw89_chanctx_ops_add()
2652 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_ops_remove()
2653 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; in rtw89_chanctx_ops_remove()
2655 clear_bit(cfg->idx, hal->entity_map); in rtw89_chanctx_ops_remove()
2662 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; in rtw89_chanctx_ops_change()
2663 u8 idx = cfg->idx; in rtw89_chanctx_ops_change()
2666 rtw89_config_entity_chandef(rtwdev, idx, &ctx->def); in rtw89_chanctx_ops_change()
2675 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; in rtw89_chanctx_ops_assign_vif()
2676 struct rtw89_vif *rtwvif = rtwvif_link->rtwvif; in rtw89_chanctx_ops_assign_vif()
2677 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_ops_assign_vif()
2678 struct rtw89_entity_mgnt *mgnt = &hal->entity_mgnt; in rtw89_chanctx_ops_assign_vif()
2681 rtwvif_link->chanctx_idx = cfg->idx; in rtw89_chanctx_ops_assign_vif()
2682 rtwvif_link->chanctx_assigned = true; in rtw89_chanctx_ops_assign_vif()
2683 cfg->ref_count++; in rtw89_chanctx_ops_assign_vif()
2685 if (list_empty(&rtwvif->mgnt_entry)) in rtw89_chanctx_ops_assign_vif()
2686 list_add_tail(&rtwvif->mgnt_entry, &mgnt->active_list); in rtw89_chanctx_ops_assign_vif()
2688 if (cfg->idx == RTW89_CHANCTX_0) in rtw89_chanctx_ops_assign_vif()
2696 rtw89_swap_chanctx(rtwdev, cfg->idx, RTW89_CHANCTX_0); in rtw89_chanctx_ops_assign_vif()
2706 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; in rtw89_chanctx_ops_unassign_vif()
2707 struct rtw89_vif *rtwvif = rtwvif_link->rtwvif; in rtw89_chanctx_ops_unassign_vif()
2708 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_ops_unassign_vif()
2714 rtwvif_link->chanctx_idx = RTW89_CHANCTX_0; in rtw89_chanctx_ops_unassign_vif()
2715 rtwvif_link->chanctx_assigned = false; in rtw89_chanctx_ops_unassign_vif()
2716 cfg->ref_count--; in rtw89_chanctx_ops_unassign_vif()
2719 list_del_init(&rtwvif->mgnt_entry); in rtw89_chanctx_ops_unassign_vif()
2721 if (cfg->ref_count != 0) in rtw89_chanctx_ops_unassign_vif()
2724 if (cfg->idx != RTW89_CHANCTX_0) in rtw89_chanctx_ops_unassign_vif()
2727 roll = find_next_bit(hal->entity_map, NUM_OF_RTW89_CHANCTX, in rtw89_chanctx_ops_unassign_vif()
2728 cfg->idx + 1); in rtw89_chanctx_ops_unassign_vif()
2736 rtw89_swap_chanctx(rtwdev, cfg->idx, roll); in rtw89_chanctx_ops_unassign_vif()
2739 if (!hal->entity_pause) { in rtw89_chanctx_ops_unassign_vif()
2754 if (hal->entity_pause) in rtw89_chanctx_ops_unassign_vif()
2760 /* re-plan MCC for chanctx changes. */ in rtw89_chanctx_ops_unassign_vif()