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

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

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/realtek/rtw89/sar.c
Extension
.c
Size
24305 bytes
Lines
912
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

if (sar_parm->force_path) {
			switch (sar_parm->path) {
			default:
			case RF_PATH_A:
				*cfg = cfg_a;
				break;
			case RF_PATH_B:
				*cfg = cfg_b;
				break;
			}
		} else {
			*cfg = max(cfg_a, cfg_b);
		}
	} else {
		*cfg = min(cfg_a, cfg_b);
	}

	if (sar_parm->ntx == RTW89_2TX)
		*cfg -= rtwsar->downgrade_2tx;

	return 0;
}

static const
struct rtw89_sar_handler rtw89_sar_handlers[RTW89_SAR_SOURCE_NR] = {
	[RTW89_SAR_SOURCE_COMMON] = {
		.descr_sar_source = "RTW89_SAR_SOURCE_COMMON",
		.txpwr_factor_sar = 2,
		.query_sar_config = rtw89_query_sar_config_common,
	},
	[RTW89_SAR_SOURCE_ACPI] = {
		.descr_sar_source = "RTW89_SAR_SOURCE_ACPI",
		.txpwr_factor_sar = TXPWR_FACTOR_OF_RTW89_ACPI_SAR,
		.query_sar_config = rtw89_query_sar_config_acpi,
	},
};

#define rtw89_sar_set_src(_dev, _src, _cfg_name, _cfg_data)		\
	do {								\
		typeof(_src) _s = (_src);				\
		typeof(_dev) _d = (_dev);				\
		BUILD_BUG_ON(!rtw89_sar_handlers[_s].descr_sar_source);	\
		BUILD_BUG_ON(!rtw89_sar_handlers[_s].query_sar_config);	\
		if (test_bit(RTW89_FLAG_PROBE_DONE, _d->flags))		\
			lockdep_assert_wiphy(_d->hw->wiphy);		\
		_d->sar._cfg_name = *(_cfg_data);			\
		_d->sar.src = _s;					\
	} while (0)

static s8 rtw89_txpwr_sar_to_mac(struct rtw89_dev *rtwdev, u8 fct, s32 cfg)
{
	const u8 fct_mac = rtwdev->chip->txpwr_factor_mac;
	s32 cfg_mac;

	cfg_mac = fct > fct_mac ?
		  cfg >> (fct - fct_mac) : cfg << (fct_mac - fct);

	return (s8)clamp_t(s32, cfg_mac,
			   RTW89_SAR_TXPWR_MAC_MIN,
			   RTW89_SAR_TXPWR_MAC_MAX);
}

static s32 rtw89_txpwr_tas_to_sar(const struct rtw89_sar_handler *sar_hdl,
				  s32 cfg)
{
	const u8 fct = sar_hdl->txpwr_factor_sar;

	if (fct > RTW89_TAS_FACTOR)
		return cfg << (fct - RTW89_TAS_FACTOR);
	else
		return cfg >> (RTW89_TAS_FACTOR - fct);
}

static s32 rtw89_txpwr_sar_to_tas(const struct rtw89_sar_handler *sar_hdl,
				  s32 cfg)
{
	const u8 fct = sar_hdl->txpwr_factor_sar;

	if (fct > RTW89_TAS_FACTOR)
		return cfg >> (fct - RTW89_TAS_FACTOR);
	else
		return cfg << (RTW89_TAS_FACTOR - fct);
}

static bool rtw89_tas_is_active(struct rtw89_dev *rtwdev)
{
	struct rtw89_tas_info *tas = &rtwdev->tas;
	struct rtw89_vif *rtwvif;

	if (!tas->enable)

Annotation

Implementation Notes