Commit a002f981 authored by Zong-Zhe Yang's avatar Zong-Zhe Yang Committed by Kalle Valo
Browse files

wifi: rtw89: regd: judge UNII-4 according to BIOS and chip



For realtek regulatory, there are following two kinds of configurations
to determine whether to allow UNII-4 band, i.e. 5.9GHz channels.

1. default setting according to whether chip support it or not
2. evaluate realtek ACPI DSM with RTW89_ACPI_DSM_FUNC_59G_EN (func. 6)

If (1) is false, we won't try (2) and just disallow UNII-4. Otherwise,
if (2) is not supported or returns a non-specific value, we follow the
default setting either. Besides, this commit aims to add decision logic
in rtw89 regulatory. Actually, driver doesn't register UNII-4 yet. That
will be handled by another commit.

Signed-off-by: default avatarZong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20230508081211.38760-3-pkshih@realtek.com
parent e897b0be
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -3850,7 +3850,12 @@ static int rtw89_core_register_hw(struct rtw89_dev *rtwdev)
		return ret;
	}

	hw->wiphy->reg_notifier = rtw89_regd_notifier;
	ret = rtw89_regd_setup(rtwdev);
	if (ret) {
		rtw89_err(rtwdev, "failed to set up regd\n");
		goto err_free_supported_band;
	}

	hw->wiphy->sar_capa = &rtw89_sar_capa;

	ret = ieee80211_register_hw(hw);
+2 −0
Original line number Diff line number Diff line
@@ -3179,6 +3179,7 @@ struct rtw89_chip_info {
	u8 support_chanctx_num;
	u8 support_bands;
	bool support_bw160;
	bool support_unii4;
	bool support_ul_tb_ctrl;
	bool hw_sec_hdr;
	u8 rf_path_num;
@@ -5044,6 +5045,7 @@ int rtw89_core_release_sta_ba_entry(struct rtw89_dev *rtwdev,
void rtw89_vif_type_mapping(struct ieee80211_vif *vif, bool assoc);
int rtw89_chip_info_setup(struct rtw89_dev *rtwdev);
bool rtw89_ra_report_to_bitrate(struct rtw89_dev *rtwdev, u8 rpt_rate, u16 *bitrate);
int rtw89_regd_setup(struct rtw89_dev *rtwdev);
int rtw89_regd_init(struct rtw89_dev *rtwdev,
		    void (*reg_notifier)(struct wiphy *wiphy, struct regulatory_request *request));
void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request);
+51 −0
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@
/* Copyright(c) 2019-2020  Realtek Corporation
 */

#include "acpi.h"
#include "debug.h"
#include "ps.h"

@@ -282,6 +283,56 @@ do { \
		    __r->txpwr_regd[RTW89_BAND_6G]); \
} while (0)

static void rtw89_regd_setup_unii4(struct rtw89_dev *rtwdev,
				   struct wiphy *wiphy)
{
	const struct rtw89_chip_info *chip = rtwdev->chip;
	bool regd_allow_unii_4 = chip->support_unii4;
	int ret;
	u8 val;

	if (!chip->support_unii4)
		goto bottom;

	ret = rtw89_acpi_evaluate_dsm(rtwdev, RTW89_ACPI_DSM_FUNC_59G_EN, &val);
	if (ret) {
		rtw89_debug(rtwdev, RTW89_DBG_REGD,
			    "acpi: cannot eval unii 4: %d\n", ret);
		goto bottom;
	}

	rtw89_debug(rtwdev, RTW89_DBG_REGD,
		    "acpi: eval if allow unii 4: %d\n", val);

	switch (val) {
	case 0:
		regd_allow_unii_4 = false;
		break;
	case 1:
		regd_allow_unii_4 = true;
		break;
	default:
		break;
	}

bottom:
	rtw89_debug(rtwdev, RTW89_DBG_REGD, "regd: allow unii 4: %d\n",
		    regd_allow_unii_4);
}

int rtw89_regd_setup(struct rtw89_dev *rtwdev)
{
	struct wiphy *wiphy = rtwdev->hw->wiphy;

	if (!wiphy)
		return -EINVAL;

	rtw89_regd_setup_unii4(rtwdev, wiphy);

	wiphy->reg_notifier = rtw89_regd_notifier;
	return 0;
}

int rtw89_regd_init(struct rtw89_dev *rtwdev,
		    void (*reg_notifier)(struct wiphy *wiphy,
					 struct regulatory_request *request))
+1 −0
Original line number Diff line number Diff line
@@ -123,6 +123,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
	.support_bands		= BIT(NL80211_BAND_2GHZ) |
				  BIT(NL80211_BAND_5GHZ),
	.support_bw160		= false,
	.support_unii4		= true,
	.support_ul_tb_ctrl	= true,
	.hw_sec_hdr		= false,
	.rf_path_num		= 1,
+1 −0
Original line number Diff line number Diff line
@@ -2105,6 +2105,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
	.support_bands		= BIT(NL80211_BAND_2GHZ) |
				  BIT(NL80211_BAND_5GHZ),
	.support_bw160		= false,
	.support_unii4		= false,
	.support_ul_tb_ctrl     = false,
	.hw_sec_hdr		= false,
	.rf_path_num		= 2,
Loading