drivers/net/wireless/realtek/rtw89/mac.c

Source file repositories/reference/linux-study-clean/drivers/net/wireless/realtek/rtw89/mac.c

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/realtek/rtw89/mac.c
Extension
.c
Size
223875 bytes
Lines
7526
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct rtw89_mac_bf_monitor_iter_data {
	struct rtw89_dev *rtwdev;
	struct rtw89_sta_link *down_rtwsta_link;
	int count;
};

static
void rtw89_mac_bf_monitor_calc_iter(void *data, struct ieee80211_sta *sta)
{
	struct rtw89_mac_bf_monitor_iter_data *iter_data =
				(struct rtw89_mac_bf_monitor_iter_data *)data;
	struct rtw89_sta_link *down_rtwsta_link = iter_data->down_rtwsta_link;
	struct rtw89_sta *rtwsta = sta_to_rtwsta(sta);
	struct ieee80211_link_sta *link_sta;
	struct rtw89_sta_link *rtwsta_link;
	bool has_beamformer_cap = false;
	int *count = &iter_data->count;
	unsigned int link_id;

	rcu_read_lock();

	rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) {
		if (rtwsta_link == down_rtwsta_link)
			continue;

		link_sta = rtw89_sta_rcu_dereference_link(rtwsta_link, false);
		if (rtw89_sta_has_beamformer_cap(link_sta)) {
			has_beamformer_cap = true;
			break;
		}
	}

	if (has_beamformer_cap)
		(*count)++;

	rcu_read_unlock();
}

void rtw89_mac_bf_monitor_calc(struct rtw89_dev *rtwdev,
			       struct rtw89_sta_link *rtwsta_link,
			       bool disconnect)
{
	struct rtw89_mac_bf_monitor_iter_data data;

	data.rtwdev = rtwdev;
	data.down_rtwsta_link = disconnect ? rtwsta_link : NULL;
	data.count = 0;
	ieee80211_iterate_stations_atomic(rtwdev->hw,
					  rtw89_mac_bf_monitor_calc_iter,
					  &data);

	rtw89_debug(rtwdev, RTW89_DBG_BF, "bfee STA count=%d\n", data.count);
	if (data.count)
		set_bit(RTW89_FLAG_BFEE_MON, rtwdev->flags);
	else
		clear_bit(RTW89_FLAG_BFEE_MON, rtwdev->flags);
}

void _rtw89_mac_bf_monitor_track(struct rtw89_dev *rtwdev)
{
	struct rtw89_traffic_stats *stats = &rtwdev->stats;
	struct rtw89_vif_link *rtwvif_link;
	bool en = stats->tx_tfc_lv <= stats->rx_tfc_lv;
	bool old = test_bit(RTW89_FLAG_BFEE_EN, rtwdev->flags);
	struct rtw89_vif *rtwvif;
	bool keep_timer = true;
	unsigned int link_id;
	bool old_keep_timer;

	old_keep_timer = test_bit(RTW89_FLAG_BFEE_TIMER_KEEP, rtwdev->flags);

	if (stats->tx_tfc_lv <= RTW89_TFC_LOW && stats->rx_tfc_lv <= RTW89_TFC_LOW)
		keep_timer = false;

	if (keep_timer != old_keep_timer) {
		rtw89_for_each_rtwvif(rtwdev, rtwvif)
			rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id)
				rtw89_mac_bfee_standby_timer(rtwdev, rtwvif_link->mac_idx,
							     keep_timer);
	}

	if (en == old)
		return;

	rtw89_for_each_rtwvif(rtwdev, rtwvif)
		rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id)
			rtw89_mac_bfee_ctrl(rtwdev, rtwvif_link->mac_idx, en);
}

static int

Annotation

Implementation Notes