Lines Matching +full:config +full:- +full:cond
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2020-2022 Realtek Corporation
78 offset = (primary_freq - center_freq - 10) / 20; in rtw89_get_primary_chan_idx()
81 offset = (center_freq - primary_freq - 10) / 20; in rtw89_get_primary_chan_idx()
100 return (prisb_cal_ofst[bw] + pri_ch - central_ch) / 4; in rtw89_get_primary_sb_idx()
110 chan->channel = center_chan; in rtw89_chan_create()
111 chan->primary_channel = primary_chan; in rtw89_chan_create()
112 chan->band_type = band; in rtw89_chan_create()
113 chan->band_width = bandwidth; in rtw89_chan_create()
118 chan->freq = center_freq; in rtw89_chan_create()
119 chan->subband_type = rtw89_get_subband_type(band, center_chan); in rtw89_chan_create()
120 chan->pri_ch_idx = rtw89_get_primary_chan_idx(bandwidth, center_freq, in rtw89_chan_create()
122 chan->pri_sb_idx = rtw89_get_primary_sb_idx(center_chan, primary_chan, in rtw89_chan_create()
130 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_assign_entity_chan()
131 struct rtw89_chan *chan = &hal->sub[idx].chan; in rtw89_assign_entity_chan()
132 struct rtw89_chan_rcd *rcd = &hal->sub[idx].rcd; in rtw89_assign_entity_chan()
135 rcd->prev_primary_channel = chan->primary_channel; in rtw89_assign_entity_chan()
136 rcd->prev_band_type = chan->band_type; in rtw89_assign_entity_chan()
137 band_changed = new->band_type != chan->band_type; in rtw89_assign_entity_chan()
138 rcd->band_changed = band_changed; in rtw89_assign_entity_chan()
149 struct rtw89_hal *hal = &rtwdev->hal; in __rtw89_config_entity_chandef()
151 hal->sub[idx].chandef = *chandef; in __rtw89_config_entity_chandef()
154 set_bit(idx, hal->entity_map); in __rtw89_config_entity_chandef()
168 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_config_roc_chandef()
172 cur = atomic_cmpxchg(&hal->roc_entity_idx, in rtw89_config_roc_chandef()
180 hal->roc_chandef = *chandef; in rtw89_config_roc_chandef()
182 cur = atomic_cmpxchg(&hal->roc_entity_idx, idx, in rtw89_config_roc_chandef()
206 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_entity_init()
208 hal->entity_pause = false; in rtw89_entity_init()
209 bitmap_zero(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY); in rtw89_entity_init()
210 bitmap_zero(hal->changes, NUM_OF_RTW89_CHANCTX_CHANGES); in rtw89_entity_init()
211 atomic_set(&hal->roc_entity_idx, RTW89_SUB_ENTITY_IDLE); in rtw89_entity_init()
217 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_entity_recalc()
225 lockdep_assert_held(&rtwdev->mutex); in rtw89_entity_recalc()
227 weight = bitmap_weight(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY); in rtw89_entity_recalc()
231 bitmap_zero(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY); in rtw89_entity_recalc()
261 if (hal->entity_pause) in rtw89_entity_recalc()
271 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_chanctx_notify()
272 const struct rtw89_chanctx_listener *listener = chip->chanctx_listener; in rtw89_chanctx_notify()
279 if (!listener->callbacks[i]) in rtw89_chanctx_notify()
286 listener->callbacks[i](rtwdev, state); in rtw89_chanctx_notify()
294 * immediately as long as iterator returns a non-zero value.
304 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_iterate_mcc_roles()
306 &mcc->role_ref, in rtw89_iterate_mcc_roles()
307 &mcc->role_aux, in rtw89_iterate_mcc_roles()
332 struct rtw89_vif *rtwvif = role->rtwvif; in rtw89_mcc_get_tbtt_ofst()
334 u32 bcn_intvl_us = ieee80211_tu_to_usec(role->beacon_interval); in rtw89_mcc_get_tbtt_ofst()
335 u64 sync_tsf = vif->bss_conf.sync_tsf; in rtw89_mcc_get_tbtt_ofst()
344 div_u64_rem(tsf - sync_tsf, bcn_intvl_us, &remainder); in rtw89_mcc_get_tbtt_ofst()
351 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_get_bcn_ofst()
352 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_get_bcn_ofst()
353 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_get_bcn_ofst()
356 u32 bcn_intvl_ref_us = ieee80211_tu_to_usec(ref->beacon_interval); in rtw89_mcc_get_bcn_ofst()
361 req.group = mcc->group; in rtw89_mcc_get_bcn_ofst()
362 req.macid_x = ref->rtwvif->mac_id; in rtw89_mcc_get_bcn_ofst()
363 req.macid_y = aux->rtwvif->mac_id; in rtw89_mcc_get_bcn_ofst()
379 return (tbtt_ofst_ref - tbtt_ofst_aux) / 1024; in rtw89_mcc_get_bcn_ofst()
389 if (idx >= ARRAY_SIZE(mcc_role->macid_bitmap)) in rtw89_mcc_role_fw_macid_bitmap_set_bit()
392 mcc_role->macid_bitmap[idx] |= BIT(pos); in rtw89_mcc_role_fw_macid_bitmap_set_bit()
397 struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv; in rtw89_mcc_role_macid_sta_iter()
398 struct rtw89_vif *rtwvif = rtwsta->rtwvif; in rtw89_mcc_role_macid_sta_iter()
400 struct rtw89_vif *target = mcc_role->rtwvif; in rtw89_mcc_role_macid_sta_iter()
405 rtw89_mcc_role_fw_macid_bitmap_set_bit(mcc_role, rtwsta->mac_id); in rtw89_mcc_role_macid_sta_iter()
411 struct rtw89_vif *rtwvif = mcc_role->rtwvif; in rtw89_mcc_fill_role_macid_bitmap()
413 rtw89_mcc_role_fw_macid_bitmap_set_bit(mcc_role, rtwvif->mac_id); in rtw89_mcc_fill_role_macid_bitmap()
414 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_mcc_fill_role_macid_bitmap()
422 struct rtw89_mcc_policy *policy = &mcc_role->policy; in rtw89_mcc_fill_role_policy()
424 policy->c2h_rpt = RTW89_FW_MCC_C2H_RPT_ALL; in rtw89_mcc_fill_role_policy()
425 policy->tx_null_early = RTW89_MCC_DFLT_TX_NULL_EARLY; in rtw89_mcc_fill_role_policy()
426 policy->in_curr_ch = false; in rtw89_mcc_fill_role_policy()
427 policy->dis_sw_retry = true; in rtw89_mcc_fill_role_policy()
428 policy->sw_retry_count = false; in rtw89_mcc_fill_role_policy()
430 if (mcc_role->is_go) in rtw89_mcc_fill_role_policy()
431 policy->dis_tx_null = true; in rtw89_mcc_fill_role_policy()
433 policy->dis_tx_null = false; in rtw89_mcc_fill_role_policy()
439 struct ieee80211_vif *vif = rtwvif_to_vif(mcc_role->rtwvif); in rtw89_mcc_fill_role_limit()
441 u32 bcn_intvl_us = ieee80211_tu_to_usec(mcc_role->beacon_interval); in rtw89_mcc_fill_role_limit()
448 if (!mcc_role->is_go && !mcc_role->is_gc) in rtw89_mcc_fill_role_limit()
453 noa_desc = &vif->bss_conf.p2p_noa_attr.desc[i]; in rtw89_mcc_fill_role_limit()
454 if (noa_desc->count == 255) in rtw89_mcc_fill_role_limit()
461 start_time = le32_to_cpu(noa_desc->start_time); in rtw89_mcc_fill_role_limit()
462 interval = le32_to_cpu(noa_desc->interval); in rtw89_mcc_fill_role_limit()
463 duration = le32_to_cpu(noa_desc->duration); in rtw89_mcc_fill_role_limit()
472 ret = rtw89_mac_port_get_tsf(rtwdev, mcc_role->rtwvif, &tsf); in rtw89_mcc_fill_role_limit()
480 max_dur_us = interval - duration; in rtw89_mcc_fill_role_limit()
481 max_tob_us = max_dur_us - max_toa_us; in rtw89_mcc_fill_role_limit()
495 mcc_role->limit.max_toa = max_toa_us / 1024; in rtw89_mcc_fill_role_limit()
496 mcc_role->limit.max_tob = max_tob_us / 1024; in rtw89_mcc_fill_role_limit()
497 mcc_role->limit.max_dur = max_dur_us / 1024; in rtw89_mcc_fill_role_limit()
498 mcc_role->limit.enable = true; in rtw89_mcc_fill_role_limit()
502 mcc_role->limit.max_toa, mcc_role->limit.max_tob, in rtw89_mcc_fill_role_limit()
503 mcc_role->limit.max_dur); in rtw89_mcc_fill_role_limit()
514 role->rtwvif = rtwvif; in rtw89_mcc_fill_role()
515 role->beacon_interval = vif->bss_conf.beacon_int; in rtw89_mcc_fill_role()
517 if (!role->beacon_interval) { in rtw89_mcc_fill_role()
520 return -EINVAL; in rtw89_mcc_fill_role()
523 role->duration = role->beacon_interval / 2; in rtw89_mcc_fill_role()
525 chan = rtw89_chan_get(rtwdev, rtwvif->sub_entity_idx); in rtw89_mcc_fill_role()
526 role->is_2ghz = chan->band_type == RTW89_BAND_2G; in rtw89_mcc_fill_role()
527 role->is_go = rtwvif->wifi_role == RTW89_WIFI_ROLE_P2P_GO; in rtw89_mcc_fill_role()
528 role->is_gc = rtwvif->wifi_role == RTW89_WIFI_ROLE_P2P_CLIENT; in rtw89_mcc_fill_role()
536 role->beacon_interval, role->is_2ghz, role->is_go, role->is_gc); in rtw89_mcc_fill_role()
542 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_fill_bt_role()
543 struct rtw89_mcc_bt_role *bt_role = &mcc->bt_role; in rtw89_mcc_fill_bt_role()
546 bt_role->duration = rtw89_coex_query_bt_req_len(rtwdev, RTW89_PHY_0); in rtw89_mcc_fill_bt_role()
549 bt_role->duration); in rtw89_mcc_fill_bt_role()
564 struct rtw89_vif *role_vif = sel->bind_vif[ordered_idx]; in rtw89_mcc_fill_role_iterator()
570 return -EINVAL; in rtw89_mcc_fill_role_iterator()
575 ordered_idx, role_vif->mac_id); in rtw89_mcc_fill_role_iterator()
591 if (sel.bind_vif[rtwvif->sub_entity_idx]) { in rtw89_mcc_fill_all_roles()
594 rtwvif->mac_id, rtwvif->sub_entity_idx); in rtw89_mcc_fill_all_roles()
598 sel.bind_vif[rtwvif->sub_entity_idx] = rtwvif; in rtw89_mcc_fill_all_roles()
612 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_assign_pattern()
613 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_assign_pattern()
614 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_assign_pattern()
615 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_assign_pattern() local
616 struct rtw89_mcc_pattern *pattern = &config->pattern; in rtw89_mcc_assign_pattern()
620 new->tob_ref, new->toa_ref, new->tob_aux, new->toa_aux); in rtw89_mcc_assign_pattern()
623 memset(&pattern->courtesy, 0, sizeof(pattern->courtesy)); in rtw89_mcc_assign_pattern()
625 if (pattern->tob_aux <= 0 || pattern->toa_aux <= 0) { in rtw89_mcc_assign_pattern()
626 pattern->courtesy.macid_tgt = aux->rtwvif->mac_id; in rtw89_mcc_assign_pattern()
627 pattern->courtesy.macid_src = ref->rtwvif->mac_id; in rtw89_mcc_assign_pattern()
628 pattern->courtesy.slot_num = RTW89_MCC_DFLT_COURTESY_SLOT; in rtw89_mcc_assign_pattern()
629 pattern->courtesy.enable = true; in rtw89_mcc_assign_pattern()
630 } else if (pattern->tob_ref <= 0 || pattern->toa_ref <= 0) { in rtw89_mcc_assign_pattern()
631 pattern->courtesy.macid_tgt = ref->rtwvif->mac_id; in rtw89_mcc_assign_pattern()
632 pattern->courtesy.macid_src = aux->rtwvif->mac_id; in rtw89_mcc_assign_pattern()
633 pattern->courtesy.slot_num = RTW89_MCC_DFLT_COURTESY_SLOT; in rtw89_mcc_assign_pattern()
634 pattern->courtesy.enable = true; in rtw89_mcc_assign_pattern()
639 pattern->plan, pattern->courtesy.enable); in rtw89_mcc_assign_pattern()
641 if (!pattern->courtesy.enable) in rtw89_mcc_assign_pattern()
646 pattern->courtesy.macid_tgt, pattern->courtesy.macid_src, in rtw89_mcc_assign_pattern()
647 pattern->courtesy.slot_num); in rtw89_mcc_assign_pattern()
650 /* The follow-up roughly shows the relationship between the parameters
668 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __rtw89_mcc_calc_pattern_loose()
669 struct rtw89_mcc_role *ref = &mcc->role_ref; in __rtw89_mcc_calc_pattern_loose()
670 struct rtw89_mcc_role *aux = &mcc->role_aux; in __rtw89_mcc_calc_pattern_loose()
671 struct rtw89_mcc_config *config = &mcc->config; in __rtw89_mcc_calc_pattern_loose() local
672 u16 bcn_ofst = config->beacon_offset; in __rtw89_mcc_calc_pattern_loose()
685 max_bcn_ofst = ref->duration + aux->duration; in __rtw89_mcc_calc_pattern_loose()
686 if (ref->limit.enable) in __rtw89_mcc_calc_pattern_loose()
688 ref->limit.max_toa + aux->duration); in __rtw89_mcc_calc_pattern_loose()
689 else if (aux->limit.enable) in __rtw89_mcc_calc_pattern_loose()
691 ref->duration + aux->limit.max_tob); in __rtw89_mcc_calc_pattern_loose()
693 if (bcn_ofst > max_bcn_ofst && bcn_ofst >= mcc->bt_role.duration) { in __rtw89_mcc_calc_pattern_loose()
694 bt_dur_in_mid = mcc->bt_role.duration; in __rtw89_mcc_calc_pattern_loose()
695 ptrn->plan = RTW89_MCC_PLAN_MID_BT; in __rtw89_mcc_calc_pattern_loose()
701 ptrn->plan, bcn_ofst); in __rtw89_mcc_calc_pattern_loose()
703 res = bcn_ofst - bt_dur_in_mid; in __rtw89_mcc_calc_pattern_loose()
704 upper = min_t(s16, ref->duration, res); in __rtw89_mcc_calc_pattern_loose()
707 if (ref->limit.enable) { in __rtw89_mcc_calc_pattern_loose()
708 upper = min_t(s16, upper, ref->limit.max_toa); in __rtw89_mcc_calc_pattern_loose()
709 lower = max_t(s16, lower, ref->duration - ref->limit.max_tob); in __rtw89_mcc_calc_pattern_loose()
710 } else if (aux->limit.enable) { in __rtw89_mcc_calc_pattern_loose()
712 res - (aux->duration - aux->limit.max_toa)); in __rtw89_mcc_calc_pattern_loose()
713 lower = max_t(s16, lower, res - aux->limit.max_tob); in __rtw89_mcc_calc_pattern_loose()
717 ptrn->toa_ref = (upper + lower) / 2; in __rtw89_mcc_calc_pattern_loose()
719 ptrn->toa_ref = lower; in __rtw89_mcc_calc_pattern_loose()
721 ptrn->tob_ref = ref->duration - ptrn->toa_ref; in __rtw89_mcc_calc_pattern_loose()
722 ptrn->tob_aux = res - ptrn->toa_ref; in __rtw89_mcc_calc_pattern_loose()
723 ptrn->toa_aux = aux->duration - ptrn->tob_aux; in __rtw89_mcc_calc_pattern_loose()
732 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __rtw89_mcc_calc_pattern_strict()
733 struct rtw89_mcc_role *ref = &mcc->role_ref; in __rtw89_mcc_calc_pattern_strict()
734 struct rtw89_mcc_role *aux = &mcc->role_aux; in __rtw89_mcc_calc_pattern_strict()
735 struct rtw89_mcc_config *config = &mcc->config; in __rtw89_mcc_calc_pattern_strict() local
738 u16 bcn_ofst = config->beacon_offset; in __rtw89_mcc_calc_pattern_strict()
746 ptrn->plan, bcn_ofst); in __rtw89_mcc_calc_pattern_strict()
748 if (ptrn->plan == RTW89_MCC_PLAN_MID_BT) in __rtw89_mcc_calc_pattern_strict()
749 bt_dur_in_mid = mcc->bt_role.duration; in __rtw89_mcc_calc_pattern_strict()
753 if (ref->duration < min_tob + min_toa) { in __rtw89_mcc_calc_pattern_strict()
755 "MCC calc ptrn_st: not meet ref dur cond\n"); in __rtw89_mcc_calc_pattern_strict()
756 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
759 if (aux->duration < min_tob + min_toa) { in __rtw89_mcc_calc_pattern_strict()
761 "MCC calc ptrn_st: not meet aux dur cond\n"); in __rtw89_mcc_calc_pattern_strict()
762 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
765 res = bcn_ofst - min_toa - min_tob - bt_dur_in_mid; in __rtw89_mcc_calc_pattern_strict()
768 "MCC calc ptrn_st: not meet bcn_ofst cond\n"); in __rtw89_mcc_calc_pattern_strict()
769 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
772 upper_toa_ref = min_t(s16, min_toa + res, ref->duration - min_tob); in __rtw89_mcc_calc_pattern_strict()
774 upper_tob_aux = min_t(s16, min_tob + res, aux->duration - min_toa); in __rtw89_mcc_calc_pattern_strict()
777 if (ref->limit.enable) { in __rtw89_mcc_calc_pattern_strict()
778 if (min_tob > ref->limit.max_tob || min_toa > ref->limit.max_toa) { in __rtw89_mcc_calc_pattern_strict()
781 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
784 upper_toa_ref = min_t(s16, upper_toa_ref, ref->limit.max_toa); in __rtw89_mcc_calc_pattern_strict()
786 ref->duration - ref->limit.max_tob); in __rtw89_mcc_calc_pattern_strict()
787 } else if (aux->limit.enable) { in __rtw89_mcc_calc_pattern_strict()
788 if (min_tob > aux->limit.max_tob || min_toa > aux->limit.max_toa) { in __rtw89_mcc_calc_pattern_strict()
791 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
794 upper_tob_aux = min_t(s16, upper_tob_aux, aux->limit.max_tob); in __rtw89_mcc_calc_pattern_strict()
796 aux->duration - aux->limit.max_toa); in __rtw89_mcc_calc_pattern_strict()
800 bcn_ofst - bt_dur_in_mid - lower_tob_aux); in __rtw89_mcc_calc_pattern_strict()
802 bcn_ofst - bt_dur_in_mid - upper_tob_aux); in __rtw89_mcc_calc_pattern_strict()
806 return -EINVAL; in __rtw89_mcc_calc_pattern_strict()
809 ptrn->toa_ref = (upper_toa_ref + lower_toa_ref) / 2; in __rtw89_mcc_calc_pattern_strict()
810 ptrn->tob_ref = ref->duration - ptrn->toa_ref; in __rtw89_mcc_calc_pattern_strict()
811 ptrn->tob_aux = bcn_ofst - ptrn->toa_ref - bt_dur_in_mid; in __rtw89_mcc_calc_pattern_strict()
812 ptrn->toa_aux = aux->duration - ptrn->tob_aux; in __rtw89_mcc_calc_pattern_strict()
818 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_calc_pattern()
819 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_calc_pattern()
820 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_calc_pattern()
826 if (ref->limit.enable && aux->limit.enable) { in rtw89_mcc_calc_pattern()
829 return -EINVAL; in rtw89_mcc_calc_pattern()
832 if (ref->limit.enable && in rtw89_mcc_calc_pattern()
833 ref->duration > ref->limit.max_tob + ref->limit.max_toa) { in rtw89_mcc_calc_pattern()
836 return -EINVAL; in rtw89_mcc_calc_pattern()
839 if (aux->limit.enable && in rtw89_mcc_calc_pattern()
840 aux->duration > aux->limit.max_tob + aux->limit.max_toa) { in rtw89_mcc_calc_pattern()
843 return -EINVAL; in rtw89_mcc_calc_pattern()
878 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_set_default_pattern()
879 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_set_default_pattern()
880 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_set_default_pattern()
887 tmp.tob_ref = ref->duration / 2; in rtw89_mcc_set_default_pattern()
888 tmp.toa_ref = ref->duration - tmp.tob_ref; in rtw89_mcc_set_default_pattern()
889 tmp.tob_aux = aux->duration / 2; in rtw89_mcc_set_default_pattern()
890 tmp.toa_aux = aux->duration - tmp.tob_aux; in rtw89_mcc_set_default_pattern()
899 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_set_duration_go_sta()
900 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_set_duration_go_sta() local
901 u16 mcc_intvl = config->mcc_interval; in rtw89_mcc_set_duration_go_sta()
904 dur_go = clamp_t(u16, role_go->duration, RTW89_MCC_MIN_GO_DURATION, in rtw89_mcc_set_duration_go_sta()
905 mcc_intvl - RTW89_MCC_MIN_STA_DURATION); in rtw89_mcc_set_duration_go_sta()
906 if (role_go->limit.enable) in rtw89_mcc_set_duration_go_sta()
907 dur_go = min(dur_go, role_go->limit.max_dur); in rtw89_mcc_set_duration_go_sta()
908 dur_sta = mcc_intvl - dur_go; in rtw89_mcc_set_duration_go_sta()
911 "MCC set dur: (go, sta) {%d, %d} -> {%d, %d}\n", in rtw89_mcc_set_duration_go_sta()
912 role_go->duration, role_sta->duration, dur_go, dur_sta); in rtw89_mcc_set_duration_go_sta()
914 role_go->duration = dur_go; in rtw89_mcc_set_duration_go_sta()
915 role_sta->duration = dur_sta; in rtw89_mcc_set_duration_go_sta()
920 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_set_duration_gc_sta()
921 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_set_duration_gc_sta()
922 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_set_duration_gc_sta()
923 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_set_duration_gc_sta() local
924 u16 mcc_intvl = config->mcc_interval; in rtw89_mcc_set_duration_gc_sta()
927 if (ref->duration < RTW89_MCC_MIN_STA_DURATION) { in rtw89_mcc_set_duration_gc_sta()
929 dur_aux = mcc_intvl - dur_ref; in rtw89_mcc_set_duration_gc_sta()
930 } else if (aux->duration < RTW89_MCC_MIN_STA_DURATION) { in rtw89_mcc_set_duration_gc_sta()
932 dur_ref = mcc_intvl - dur_aux; in rtw89_mcc_set_duration_gc_sta()
934 dur_ref = ref->duration; in rtw89_mcc_set_duration_gc_sta()
935 dur_aux = mcc_intvl - dur_ref; in rtw89_mcc_set_duration_gc_sta()
938 if (ref->limit.enable) { in rtw89_mcc_set_duration_gc_sta()
939 dur_ref = min(dur_ref, ref->limit.max_dur); in rtw89_mcc_set_duration_gc_sta()
940 dur_aux = mcc_intvl - dur_ref; in rtw89_mcc_set_duration_gc_sta()
941 } else if (aux->limit.enable) { in rtw89_mcc_set_duration_gc_sta()
942 dur_aux = min(dur_aux, aux->limit.max_dur); in rtw89_mcc_set_duration_gc_sta()
943 dur_ref = mcc_intvl - dur_aux; in rtw89_mcc_set_duration_gc_sta()
947 "MCC set dur: (ref, aux) {%d ~ %d} -> {%d ~ %d}\n", in rtw89_mcc_set_duration_gc_sta()
948 ref->duration, aux->duration, dur_ref, dur_aux); in rtw89_mcc_set_duration_gc_sta()
950 ref->duration = dur_ref; in rtw89_mcc_set_duration_gc_sta()
951 aux->duration = dur_aux; in rtw89_mcc_set_duration_gc_sta()
970 p->parm[ordered_idx].dur = mcc_role->duration; in rtw89_mcc_mod_dur_get_iterator()
972 if (mcc_role->is_go) in rtw89_mcc_mod_dur_get_iterator()
977 p->parm[ordered_idx].room = max_t(s32, p->parm[ordered_idx].dur - min, 0); in rtw89_mcc_mod_dur_get_iterator()
981 ordered_idx, p->parm[ordered_idx].dur, min, in rtw89_mcc_mod_dur_get_iterator()
982 p->parm[ordered_idx].room); in rtw89_mcc_mod_dur_get_iterator()
984 p->available += p->parm[ordered_idx].room; in rtw89_mcc_mod_dur_get_iterator()
995 mcc_role->duration = p->parm[ordered_idx].dur; in rtw89_mcc_mod_dur_put_iterator()
999 ordered_idx, p->parm[ordered_idx].dur); in rtw89_mcc_mod_dur_put_iterator()
1005 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1006 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_mod_duration_dual_2ghz_with_bt() local
1008 u16 mcc_intvl = config->mcc_interval; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1009 u16 bt_dur = mcc->bt_role.duration; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1019 wifi_dur = mcc_intvl - bt_dur; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1022 data.parm[0].dur -= min_t(u16, bt_dur / 2, data.parm[0].room); in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1023 data.parm[1].dur = wifi_dur - data.parm[0].dur; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1025 data.parm[1].dur -= min_t(u16, bt_dur / 2, data.parm[1].room); in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1026 data.parm[0].dur = wifi_dur - data.parm[1].dur; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1032 mcc->bt_role.duration = bt_dur; in rtw89_mcc_mod_duration_dual_2ghz_with_bt()
1040 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_mod_duration_diff_band_with_bt()
1041 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_mod_duration_diff_band_with_bt() local
1045 dur_2ghz = role_2ghz->duration; in rtw89_mcc_mod_duration_diff_band_with_bt()
1046 dur_non_2ghz = role_non_2ghz->duration; in rtw89_mcc_mod_duration_diff_band_with_bt()
1047 mcc_intvl = config->mcc_interval; in rtw89_mcc_mod_duration_diff_band_with_bt()
1048 bt_dur = mcc->bt_role.duration; in rtw89_mcc_mod_duration_diff_band_with_bt()
1065 dur_2ghz = mcc_intvl - dur_non_2ghz; in rtw89_mcc_mod_duration_diff_band_with_bt()
1067 if (role_non_2ghz->limit.enable) { in rtw89_mcc_mod_duration_diff_band_with_bt()
1070 role_non_2ghz->limit.max_dur); in rtw89_mcc_mod_duration_diff_band_with_bt()
1072 dur_non_2ghz = min(dur_non_2ghz, role_non_2ghz->limit.max_dur); in rtw89_mcc_mod_duration_diff_band_with_bt()
1073 dur_2ghz = mcc_intvl - dur_non_2ghz; in rtw89_mcc_mod_duration_diff_band_with_bt()
1080 role_2ghz->duration = dur_2ghz; in rtw89_mcc_mod_duration_diff_band_with_bt()
1081 role_non_2ghz->duration = dur_non_2ghz; in rtw89_mcc_mod_duration_diff_band_with_bt()
1086 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_duration_decision_on_bt()
1087 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_duration_decision_on_bt()
1088 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_duration_decision_on_bt()
1089 struct rtw89_mcc_bt_role *bt_role = &mcc->bt_role; in rtw89_mcc_duration_decision_on_bt()
1091 if (!bt_role->duration) in rtw89_mcc_duration_decision_on_bt()
1094 if (ref->is_2ghz && aux->is_2ghz) { in rtw89_mcc_duration_decision_on_bt()
1102 if (!ref->is_2ghz && !aux->is_2ghz) { in rtw89_mcc_duration_decision_on_bt()
1111 if (ref->is_2ghz) in rtw89_mcc_duration_decision_on_bt()
1124 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_sync_tbtt()
1125 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_sync_tbtt() local
1126 u16 beacon_offset_us = ieee80211_tu_to_usec(config->beacon_offset); in rtw89_mcc_sync_tbtt()
1127 u32 bcn_intvl_src_us = ieee80211_tu_to_usec(src->beacon_interval); in rtw89_mcc_sync_tbtt()
1135 ret = rtw89_mac_port_get_tsf(rtwdev, src->rtwvif, &tsf_src); in rtw89_mcc_sync_tbtt()
1144 tbtt_tgt = tsf_src - cur_tbtt_ofst_src + beacon_offset_us; in rtw89_mcc_sync_tbtt()
1146 tbtt_tgt = tsf_src - cur_tbtt_ofst_src + in rtw89_mcc_sync_tbtt()
1147 (bcn_intvl_src_us - beacon_offset_us); in rtw89_mcc_sync_tbtt()
1150 tsf_ofst_tgt = bcn_intvl_src_us - remainder; in rtw89_mcc_sync_tbtt()
1152 config->sync.macid_tgt = tgt->rtwvif->mac_id; in rtw89_mcc_sync_tbtt()
1153 config->sync.macid_src = src->rtwvif->mac_id; in rtw89_mcc_sync_tbtt()
1154 config->sync.offset = tsf_ofst_tgt / 1024; in rtw89_mcc_sync_tbtt()
1155 config->sync.enable = true; in rtw89_mcc_sync_tbtt()
1159 config->sync.macid_tgt, config->sync.macid_src, in rtw89_mcc_sync_tbtt()
1160 config->sync.offset); in rtw89_mcc_sync_tbtt()
1162 rtw89_mac_port_tsf_sync(rtwdev, tgt->rtwvif, src->rtwvif, in rtw89_mcc_sync_tbtt()
1163 config->sync.offset); in rtw89_mcc_sync_tbtt()
1168 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_fill_start_tsf()
1169 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_fill_start_tsf()
1170 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_fill_start_tsf() local
1171 u32 bcn_intvl_ref_us = ieee80211_tu_to_usec(ref->beacon_interval); in rtw89_mcc_fill_start_tsf()
1172 u32 tob_ref_us = ieee80211_tu_to_usec(config->pattern.tob_ref); in rtw89_mcc_fill_start_tsf()
1173 struct rtw89_vif *rtwvif = ref->rtwvif; in rtw89_mcc_fill_start_tsf()
1186 if (ref->is_go) in rtw89_mcc_fill_start_tsf()
1192 start_tsf = tsf - cur_tbtt_ofst + bcn_intvl_ref_us - tob_ref_us; in rtw89_mcc_fill_start_tsf()
1196 config->start_tsf = start_tsf; in rtw89_mcc_fill_start_tsf()
1202 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_fill_config()
1203 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_fill_config()
1204 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_fill_config()
1205 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_fill_config() local
1209 memset(config, 0, sizeof(*config)); in rtw89_mcc_fill_config()
1211 switch (mcc->mode) { in rtw89_mcc_fill_config()
1213 config->beacon_offset = RTW89_MCC_DFLT_BCN_OFST_TIME; in rtw89_mcc_fill_config()
1214 if (ref->is_go) { in rtw89_mcc_fill_config()
1216 config->mcc_interval = ref->beacon_interval; in rtw89_mcc_fill_config()
1220 config->mcc_interval = aux->beacon_interval; in rtw89_mcc_fill_config()
1225 config->beacon_offset = rtw89_mcc_get_bcn_ofst(rtwdev); in rtw89_mcc_fill_config()
1226 config->mcc_interval = ref->beacon_interval; in rtw89_mcc_fill_config()
1230 rtw89_warn(rtwdev, "MCC unknown mode: %d\n", mcc->mode); in rtw89_mcc_fill_config()
1231 return -EFAULT; in rtw89_mcc_fill_config()
1249 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_add_role()
1250 struct rtw89_mcc_config *config = &mcc->config; in __mcc_fw_add_role() local
1251 struct rtw89_mcc_pattern *pattern = &config->pattern; in __mcc_fw_add_role()
1252 struct rtw89_mcc_courtesy *courtesy = &pattern->courtesy; in __mcc_fw_add_role()
1253 struct rtw89_mcc_policy *policy = &role->policy; in __mcc_fw_add_role()
1258 chan = rtw89_chan_get(rtwdev, role->rtwvif->sub_entity_idx); in __mcc_fw_add_role()
1259 req.central_ch_seg0 = chan->channel; in __mcc_fw_add_role()
1260 req.primary_ch = chan->primary_channel; in __mcc_fw_add_role()
1261 req.bandwidth = chan->band_width; in __mcc_fw_add_role()
1262 req.ch_band_type = chan->band_type; in __mcc_fw_add_role()
1264 req.macid = role->rtwvif->mac_id; in __mcc_fw_add_role()
1265 req.group = mcc->group; in __mcc_fw_add_role()
1266 req.c2h_rpt = policy->c2h_rpt; in __mcc_fw_add_role()
1267 req.tx_null_early = policy->tx_null_early; in __mcc_fw_add_role()
1268 req.dis_tx_null = policy->dis_tx_null; in __mcc_fw_add_role()
1269 req.in_curr_ch = policy->in_curr_ch; in __mcc_fw_add_role()
1270 req.sw_retry_count = policy->sw_retry_count; in __mcc_fw_add_role()
1271 req.dis_sw_retry = policy->dis_sw_retry; in __mcc_fw_add_role()
1272 req.duration = role->duration; in __mcc_fw_add_role()
1275 if (courtesy->enable && courtesy->macid_src == req.macid) { in __mcc_fw_add_role()
1276 req.courtesy_target = courtesy->macid_tgt; in __mcc_fw_add_role()
1277 req.courtesy_num = courtesy->slot_num; in __mcc_fw_add_role()
1288 ret = rtw89_fw_h2c_mcc_macid_bitmap(rtwdev, mcc->group, in __mcc_fw_add_role()
1289 role->rtwvif->mac_id, in __mcc_fw_add_role()
1290 role->macid_bitmap); in __mcc_fw_add_role()
1302 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_add_bt_role()
1303 struct rtw89_mcc_bt_role *bt_role = &mcc->bt_role; in __mcc_fw_add_bt_role()
1307 req.group = mcc->group; in __mcc_fw_add_bt_role()
1308 req.duration = bt_role->duration; in __mcc_fw_add_bt_role()
1323 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_start()
1324 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mcc_fw_start()
1325 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mcc_fw_start()
1326 struct rtw89_mcc_config *config = &mcc->config; in __mcc_fw_start() local
1327 struct rtw89_mcc_pattern *pattern = &config->pattern; in __mcc_fw_start()
1328 struct rtw89_mcc_sync *sync = &config->sync; in __mcc_fw_start()
1333 req.old_group = mcc->group; in __mcc_fw_start()
1335 mcc->group = RTW89_MCC_NEXT_GROUP(mcc->group); in __mcc_fw_start()
1338 req.group = mcc->group; in __mcc_fw_start()
1340 switch (pattern->plan) { in __mcc_fw_start()
1378 rtw89_warn(rtwdev, "MCC unknown plan: %d\n", pattern->plan); in __mcc_fw_start()
1379 return -EFAULT; in __mcc_fw_start()
1382 if (sync->enable) { in __mcc_fw_start()
1383 ret = rtw89_fw_h2c_mcc_sync(rtwdev, req.group, sync->macid_src, in __mcc_fw_start()
1384 sync->macid_tgt, sync->offset); in __mcc_fw_start()
1392 req.macid = ref->rtwvif->mac_id; in __mcc_fw_start()
1393 req.tsf_high = config->start_tsf >> 32; in __mcc_fw_start()
1394 req.tsf_low = config->start_tsf; in __mcc_fw_start()
1408 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in __mcc_fw_set_duration_no_bt()
1409 struct rtw89_mcc_config *config = &mcc->config; in __mcc_fw_set_duration_no_bt() local
1410 struct rtw89_mcc_sync *sync = &config->sync; in __mcc_fw_set_duration_no_bt()
1411 struct rtw89_mcc_role *ref = &mcc->role_ref; in __mcc_fw_set_duration_no_bt()
1412 struct rtw89_mcc_role *aux = &mcc->role_aux; in __mcc_fw_set_duration_no_bt()
1414 .group = mcc->group, in __mcc_fw_set_duration_no_bt()
1416 .start_macid = ref->rtwvif->mac_id, in __mcc_fw_set_duration_no_bt()
1417 .macid_x = ref->rtwvif->mac_id, in __mcc_fw_set_duration_no_bt()
1418 .macid_y = aux->rtwvif->mac_id, in __mcc_fw_set_duration_no_bt()
1419 .duration_x = ref->duration, in __mcc_fw_set_duration_no_bt()
1420 .duration_y = aux->duration, in __mcc_fw_set_duration_no_bt()
1421 .start_tsf_high = config->start_tsf >> 32, in __mcc_fw_set_duration_no_bt()
1422 .start_tsf_low = config->start_tsf, in __mcc_fw_set_duration_no_bt()
1433 if (!sync->enable || !sync_changed) in __mcc_fw_set_duration_no_bt()
1436 ret = rtw89_fw_h2c_mcc_sync(rtwdev, mcc->group, sync->macid_src, in __mcc_fw_set_duration_no_bt()
1437 sync->macid_tgt, sync->offset); in __mcc_fw_set_duration_no_bt()
1449 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_handle_beacon_noa()
1450 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_handle_beacon_noa()
1451 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_handle_beacon_noa()
1452 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_handle_beacon_noa() local
1453 struct rtw89_mcc_pattern *pattern = &config->pattern; in rtw89_mcc_handle_beacon_noa()
1454 struct rtw89_mcc_sync *sync = &config->sync; in rtw89_mcc_handle_beacon_noa()
1456 u64 start_time = config->start_tsf; in rtw89_mcc_handle_beacon_noa()
1457 u32 interval = config->mcc_interval; in rtw89_mcc_handle_beacon_noa()
1461 if (mcc->mode != RTW89_MCC_MODE_GO_STA) in rtw89_mcc_handle_beacon_noa()
1464 if (ref->is_go) { in rtw89_mcc_handle_beacon_noa()
1465 rtwvif_go = ref->rtwvif; in rtw89_mcc_handle_beacon_noa()
1466 start_time += ieee80211_tu_to_usec(ref->duration); in rtw89_mcc_handle_beacon_noa()
1467 duration = config->mcc_interval - ref->duration; in rtw89_mcc_handle_beacon_noa()
1468 } else if (aux->is_go) { in rtw89_mcc_handle_beacon_noa()
1469 rtwvif_go = aux->rtwvif; in rtw89_mcc_handle_beacon_noa()
1470 start_time += ieee80211_tu_to_usec(pattern->tob_ref) + in rtw89_mcc_handle_beacon_noa()
1471 ieee80211_tu_to_usec(config->beacon_offset) + in rtw89_mcc_handle_beacon_noa()
1472 ieee80211_tu_to_usec(pattern->toa_aux); in rtw89_mcc_handle_beacon_noa()
1473 duration = config->mcc_interval - aux->duration; in rtw89_mcc_handle_beacon_noa()
1476 start_time += ieee80211_tu_to_usec(sync->offset); in rtw89_mcc_handle_beacon_noa()
1494 if (!rtwvif_go->chanctx_assigned) in rtw89_mcc_handle_beacon_noa()
1502 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_start_beacon_noa()
1503 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_start_beacon_noa()
1504 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_start_beacon_noa()
1506 if (mcc->mode != RTW89_MCC_MODE_GO_STA) in rtw89_mcc_start_beacon_noa()
1509 if (ref->is_go) in rtw89_mcc_start_beacon_noa()
1510 rtw89_fw_h2c_tsf32_toggle(rtwdev, ref->rtwvif, true); in rtw89_mcc_start_beacon_noa()
1511 else if (aux->is_go) in rtw89_mcc_start_beacon_noa()
1512 rtw89_fw_h2c_tsf32_toggle(rtwdev, aux->rtwvif, true); in rtw89_mcc_start_beacon_noa()
1519 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_stop_beacon_noa()
1520 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_stop_beacon_noa()
1521 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_stop_beacon_noa()
1523 if (mcc->mode != RTW89_MCC_MODE_GO_STA) in rtw89_mcc_stop_beacon_noa()
1526 if (ref->is_go) in rtw89_mcc_stop_beacon_noa()
1527 rtw89_fw_h2c_tsf32_toggle(rtwdev, ref->rtwvif, false); in rtw89_mcc_stop_beacon_noa()
1528 else if (aux->is_go) in rtw89_mcc_stop_beacon_noa()
1529 rtw89_fw_h2c_tsf32_toggle(rtwdev, aux->rtwvif, false); in rtw89_mcc_stop_beacon_noa()
1536 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_start()
1537 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_start()
1538 struct rtw89_mcc_role *aux = &mcc->role_aux; in rtw89_mcc_start()
1541 if (rtwdev->scanning) in rtw89_mcc_start()
1542 rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif); in rtw89_mcc_start()
1552 if (ref->is_go || aux->is_go) in rtw89_mcc_start()
1553 mcc->mode = RTW89_MCC_MODE_GO_STA; in rtw89_mcc_start()
1555 mcc->mode = RTW89_MCC_MODE_GC_STA; in rtw89_mcc_start()
1557 rtw89_debug(rtwdev, RTW89_DBG_CHAN, "MCC sel mode: %d\n", mcc->mode); in rtw89_mcc_start()
1559 mcc->group = RTW89_MCC_DFLT_GROUP; in rtw89_mcc_start()
1577 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_stop()
1578 struct rtw89_mcc_role *ref = &mcc->role_ref; in rtw89_mcc_stop()
1583 ret = rtw89_fw_h2c_stop_mcc(rtwdev, mcc->group, in rtw89_mcc_stop()
1584 ref->rtwvif->mac_id, true); in rtw89_mcc_stop()
1589 ret = rtw89_fw_h2c_del_mcc_group(rtwdev, mcc->group, true); in rtw89_mcc_stop()
1601 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_update()
1602 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_update() local
1603 struct rtw89_mcc_config old_cfg = *config; in rtw89_mcc_update()
1607 if (rtwdev->scanning) in rtw89_mcc_update()
1608 rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif); in rtw89_mcc_update()
1617 config->pattern.plan != RTW89_MCC_PLAN_NO_BT) { in rtw89_mcc_update()
1622 if (memcmp(&old_cfg.sync, &config->sync, sizeof(old_cfg.sync)) == 0) in rtw89_mcc_update()
1638 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_track()
1639 struct rtw89_mcc_config *config = &mcc->config; in rtw89_mcc_track() local
1640 struct rtw89_mcc_pattern *pattern = &config->pattern; in rtw89_mcc_track()
1645 if (mcc->mode != RTW89_MCC_MODE_GC_STA) in rtw89_mcc_track()
1649 if (bcn_ofst > config->beacon_offset) { in rtw89_mcc_track()
1650 diff = bcn_ofst - config->beacon_offset; in rtw89_mcc_track()
1651 if (pattern->tob_aux < 0) in rtw89_mcc_track()
1652 tolerance = -pattern->tob_aux; in rtw89_mcc_track()
1654 tolerance = pattern->toa_aux; in rtw89_mcc_track()
1656 diff = config->beacon_offset - bcn_ofst; in rtw89_mcc_track()
1657 if (pattern->toa_aux < 0) in rtw89_mcc_track()
1658 tolerance = -pattern->toa_aux; in rtw89_mcc_track()
1660 tolerance = pattern->tob_aux; in rtw89_mcc_track()
1674 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_upd_map_iterator()
1676 .rtwvif = mcc_role->rtwvif, in rtw89_mcc_upd_map_iterator()
1680 if (!mcc_role->is_go) in rtw89_mcc_upd_map_iterator()
1684 if (memcmp(mcc_role->macid_bitmap, upd.macid_bitmap, in rtw89_mcc_upd_map_iterator()
1685 sizeof(mcc_role->macid_bitmap)) == 0) in rtw89_mcc_upd_map_iterator()
1688 ret = rtw89_fw_h2c_mcc_macid_bitmap(rtwdev, mcc->group, in rtw89_mcc_upd_map_iterator()
1689 upd.rtwvif->mac_id, in rtw89_mcc_upd_map_iterator()
1697 memcpy(mcc_role->macid_bitmap, upd.macid_bitmap, in rtw89_mcc_upd_map_iterator()
1698 sizeof(mcc_role->macid_bitmap)); in rtw89_mcc_upd_map_iterator()
1704 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_update_macid_bitmap()
1706 if (mcc->mode != RTW89_MCC_MODE_GO_STA) in rtw89_mcc_update_macid_bitmap()
1717 memset(&mcc_role->limit, 0, sizeof(mcc_role->limit)); in rtw89_mcc_upd_lmt_iterator()
1724 struct rtw89_mcc_info *mcc = &rtwdev->mcc; in rtw89_mcc_update_limit()
1726 if (mcc->mode != RTW89_MCC_MODE_GC_STA) in rtw89_mcc_update_limit()
1736 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_work()
1743 mutex_lock(&rtwdev->mutex); in rtw89_chanctx_work()
1745 if (hal->entity_pause) { in rtw89_chanctx_work()
1746 mutex_unlock(&rtwdev->mutex); in rtw89_chanctx_work()
1751 if (test_and_clear_bit(i, hal->changes)) in rtw89_chanctx_work()
1788 mutex_unlock(&rtwdev->mutex); in rtw89_chanctx_work()
1794 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_queue_chanctx_change()
1813 set_bit(change, hal->changes); in rtw89_queue_chanctx_change()
1819 ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->chanctx_work, in rtw89_queue_chanctx_change()
1830 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_track()
1833 lockdep_assert_held(&rtwdev->mutex); in rtw89_chanctx_track()
1835 if (hal->entity_pause) in rtw89_chanctx_track()
1851 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_pause()
1854 lockdep_assert_held(&rtwdev->mutex); in rtw89_chanctx_pause()
1856 if (hal->entity_pause) in rtw89_chanctx_pause()
1870 hal->entity_pause = true; in rtw89_chanctx_pause()
1875 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_proceed()
1879 lockdep_assert_held(&rtwdev->mutex); in rtw89_chanctx_proceed()
1881 if (!hal->entity_pause) in rtw89_chanctx_proceed()
1886 hal->entity_pause = false; in rtw89_chanctx_proceed()
1906 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_ops_add()
1907 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; in rtw89_chanctx_ops_add()
1908 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_chanctx_ops_add()
1911 idx = find_first_zero_bit(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY); in rtw89_chanctx_ops_add()
1912 if (idx >= chip->support_chanctx_num) in rtw89_chanctx_ops_add()
1913 return -ENOENT; in rtw89_chanctx_ops_add()
1915 rtw89_config_entity_chandef(rtwdev, idx, &ctx->def); in rtw89_chanctx_ops_add()
1917 cfg->idx = idx; in rtw89_chanctx_ops_add()
1918 hal->sub[idx].cfg = cfg; in rtw89_chanctx_ops_add()
1925 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_chanctx_ops_remove()
1926 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; in rtw89_chanctx_ops_remove()
1931 drop = cfg->idx; in rtw89_chanctx_ops_remove()
1935 roll = find_next_bit(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY, drop + 1); in rtw89_chanctx_ops_remove()
1944 hal->sub[roll].cfg->idx = RTW89_SUB_ENTITY_0; in rtw89_chanctx_ops_remove()
1945 hal->sub[RTW89_SUB_ENTITY_0] = hal->sub[roll]; in rtw89_chanctx_ops_remove()
1948 if (rtwvif->sub_entity_idx == roll) in rtw89_chanctx_ops_remove()
1949 rtwvif->sub_entity_idx = RTW89_SUB_ENTITY_0; in rtw89_chanctx_ops_remove()
1952 atomic_cmpxchg(&hal->roc_entity_idx, roll, RTW89_SUB_ENTITY_0); in rtw89_chanctx_ops_remove()
1966 clear_bit(drop, hal->entity_map); in rtw89_chanctx_ops_remove()
1974 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; in rtw89_chanctx_ops_change()
1975 u8 idx = cfg->idx; in rtw89_chanctx_ops_change()
1978 rtw89_config_entity_chandef(rtwdev, idx, &ctx->def); in rtw89_chanctx_ops_change()
1987 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; in rtw89_chanctx_ops_assign_vif()
1989 rtwvif->sub_entity_idx = cfg->idx; in rtw89_chanctx_ops_assign_vif()
1990 rtwvif->chanctx_assigned = true; in rtw89_chanctx_ops_assign_vif()
1998 rtwvif->sub_entity_idx = RTW89_SUB_ENTITY_0; in rtw89_chanctx_ops_unassign_vif()
1999 rtwvif->chanctx_assigned = false; in rtw89_chanctx_ops_unassign_vif()