Commit 578bdd98 authored by Zong-Zhe Yang's avatar Zong-Zhe Yang Committed by Ping-Ke Shih
Browse files

wifi: rtw89: support mac_id number according to chip



On 802.11be chips, to consider MLO, HW doesn't design number
of support mac_id as large as before. And, it might be various
according to chip. For example, old chips support mac_id up to
128, but RTL8922a only supports mac_id up to 32.

Besides, the mac_id acquiring function will be extended when
impending MLO support.

Signed-off-by: default avatarZong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Link: https://msgid.link/20240509090646.35304-5-pkshih@realtek.com
parent e9f1a901
Loading
Loading
Loading
Loading
+23 −5
Original line number Diff line number Diff line
@@ -3343,14 +3343,13 @@ int rtw89_core_sta_add(struct rtw89_dev *rtwdev,
					 BTC_ROLE_MSTS_STA_CONN_START);
		rtw89_chip_rfk_channel(rtwdev);
	} else if (vif->type == NL80211_IFTYPE_AP || sta->tdls) {
		rtwsta->mac_id = rtw89_core_acquire_bit_map(rtwdev->mac_id_map,
							    RTW89_MAX_MAC_ID_NUM);
		rtwsta->mac_id = rtw89_acquire_mac_id(rtwdev);
		if (rtwsta->mac_id == RTW89_MAX_MAC_ID_NUM)
			return -ENOSPC;

		ret = rtw89_mac_set_macid_pause(rtwdev, rtwsta->mac_id, false);
		if (ret) {
			rtw89_core_release_bit_map(rtwdev->mac_id_map, rtwsta->mac_id);
			rtw89_release_mac_id(rtwdev, rtwsta->mac_id);
			rtw89_warn(rtwdev, "failed to send h2c macid pause\n");
			return ret;
		}
@@ -3358,7 +3357,7 @@ int rtw89_core_sta_add(struct rtw89_dev *rtwdev,
		ret = rtw89_fw_h2c_role_maintain(rtwdev, rtwvif, rtwsta,
						 RTW89_ROLE_CREATE);
		if (ret) {
			rtw89_core_release_bit_map(rtwdev->mac_id_map, rtwsta->mac_id);
			rtw89_release_mac_id(rtwdev, rtwsta->mac_id);
			rtw89_warn(rtwdev, "failed to send h2c role info\n");
			return ret;
		}
@@ -3531,7 +3530,7 @@ int rtw89_core_sta_remove(struct rtw89_dev *rtwdev,
		rtw89_btc_ntfy_role_info(rtwdev, rtwvif, rtwsta,
					 BTC_ROLE_MSTS_STA_DIS_CONN);
	} else if (vif->type == NL80211_IFTYPE_AP || sta->tdls) {
		rtw89_core_release_bit_map(rtwdev->mac_id_map, rtwsta->mac_id);
		rtw89_release_mac_id(rtwdev, rtwsta->mac_id);

		ret = rtw89_fw_h2c_role_maintain(rtwdev, rtwvif, rtwsta,
						 RTW89_ROLE_REMOVE);
@@ -4181,6 +4180,25 @@ void rtw89_core_stop(struct rtw89_dev *rtwdev)
	rtw89_hci_reset(rtwdev);
}

u8 rtw89_acquire_mac_id(struct rtw89_dev *rtwdev)
{
	const struct rtw89_chip_info *chip = rtwdev->chip;
	u8 mac_id_num = chip->support_macid_num;
	u8 mac_id;

	mac_id = find_first_zero_bit(rtwdev->mac_id_map, mac_id_num);
	if (mac_id == mac_id_num)
		return RTW89_MAX_MAC_ID_NUM;

	set_bit(mac_id, rtwdev->mac_id_map);
	return mac_id;
}

void rtw89_release_mac_id(struct rtw89_dev *rtwdev, u8 mac_id)
{
	clear_bit(mac_id, rtwdev->mac_id_map);
}

int rtw89_core_init(struct rtw89_dev *rtwdev)
{
	struct rtw89_btc *btc = &rtwdev->btc;
+3 −0
Original line number Diff line number Diff line
@@ -4143,6 +4143,7 @@ struct rtw89_chip_info {
	u8 wde_qempty_acq_grpnum;
	u8 wde_qempty_mgq_grpsel;
	u32 rf_base_addr[2];
	u8 support_macid_num;
	u8 support_chanctx_num;
	u8 support_bands;
	u16 support_bandwidths;
@@ -6470,6 +6471,8 @@ struct rtw89_dev *rtw89_alloc_ieee80211_hw(struct device *device,
					   u32 bus_data_size,
					   const struct rtw89_chip_info *chip);
void rtw89_free_ieee80211_hw(struct rtw89_dev *rtwdev);
u8 rtw89_acquire_mac_id(struct rtw89_dev *rtwdev);
void rtw89_release_mac_id(struct rtw89_dev *rtwdev, u8 mac_id);
void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev);
void rtw89_get_default_chandef(struct cfg80211_chan_def *chandef);
void rtw89_get_channel_params(const struct cfg80211_chan_def *chandef,
+3 −4
Original line number Diff line number Diff line
@@ -4664,8 +4664,7 @@ int rtw89_mac_add_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
{
	int ret;

	rtwvif->mac_id = rtw89_core_acquire_bit_map(rtwdev->mac_id_map,
						    RTW89_MAX_MAC_ID_NUM);
	rtwvif->mac_id = rtw89_acquire_mac_id(rtwdev);
	if (rtwvif->mac_id == RTW89_MAX_MAC_ID_NUM)
		return -ENOSPC;

@@ -4676,7 +4675,7 @@ int rtw89_mac_add_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
	return 0;

release_mac_id:
	rtw89_core_release_bit_map(rtwdev->mac_id_map, rtwvif->mac_id);
	rtw89_release_mac_id(rtwdev, rtwvif->mac_id);

	return ret;
}
@@ -4686,7 +4685,7 @@ int rtw89_mac_remove_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
	int ret;

	ret = rtw89_mac_vif_deinit(rtwdev, rtwvif);
	rtw89_core_release_bit_map(rtwdev->mac_id_map, rtwvif->mac_id);
	rtw89_release_mac_id(rtwdev, rtwvif->mac_id);

	return ret;
}
+1 −0
Original line number Diff line number Diff line
@@ -2447,6 +2447,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
	.dig_table		= NULL,
	.dig_regs		= &rtw8851b_dig_regs,
	.tssi_dbw_table		= NULL,
	.support_macid_num	= RTW89_MAX_MAC_ID_NUM,
	.support_chanctx_num	= 0,
	.support_rnr		= false,
	.support_bands		= BIT(NL80211_BAND_2GHZ) |
+1 −0
Original line number Diff line number Diff line
@@ -2162,6 +2162,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
	.dig_table		= &rtw89_8852a_phy_dig_table,
	.dig_regs		= &rtw8852a_dig_regs,
	.tssi_dbw_table		= NULL,
	.support_macid_num	= RTW89_MAX_MAC_ID_NUM,
	.support_chanctx_num	= 1,
	.support_rnr		= false,
	.support_bands		= BIT(NL80211_BAND_2GHZ) |
Loading