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

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

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/realtek/rtw89/acpi.c
Extension
.c
Size
33082 bytes
Lines
1282
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source 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_acpi_sar_rec_parm {
	u32 pld_len;
	u8 tbl_cnt;
	u16 cid;
	u8 rev;
};

static const struct rtw89_acpi_sar_recognition *
rtw89_acpi_sar_recognize(struct rtw89_dev *rtwdev,
			 const struct rtw89_acpi_sar_rec_parm *parm)
{
	const u32 tbl_len = parm->pld_len / parm->tbl_cnt;
	const struct rtw89_acpi_sar_recognition *rec;
	struct rtw89_acpi_sar_identifier id = {};

	rtw89_debug(rtwdev, RTW89_DBG_ACPI,
		    "%s: cid %u, rev %u, tbl len %u, tbl cnt %u\n",
		    __func__, parm->cid, parm->rev, tbl_len, parm->tbl_cnt);

	if (unlikely(parm->pld_len % parm->tbl_cnt)) {
		rtw89_debug(rtwdev, RTW89_DBG_ACPI, "invalid pld len %u\n",
			    parm->pld_len);
		return NULL;
	}

	if (unlikely(tbl_len > RTW89_ACPI_SAR_SIZE_MAX)) {
		rtw89_debug(rtwdev, RTW89_DBG_ACPI, "invalid tbl len %u\n",
			    tbl_len);
		return NULL;
	}

	if (unlikely(parm->tbl_cnt > MAX_NUM_OF_RTW89_ACPI_SAR_TBL)) {
		rtw89_debug(rtwdev, RTW89_DBG_ACPI, "invalid tbl cnt %u\n",
			    parm->tbl_cnt);
		return NULL;
	}

	switch (parm->cid) {
	case RTW89_ACPI_SAR_CID_HP:
	case RTW89_ACPI_SAR_CID_RT:
		id.cid = parm->cid;
		break;
	default:
		rtw89_debug(rtwdev, RTW89_DBG_ACPI, "invalid cid 0x%x\n",
			    parm->cid);
		return NULL;
	}

	switch (parm->rev) {
	case RTW89_ACPI_SAR_REV_LEGACY:
	case RTW89_ACPI_SAR_REV_HAS_6GHZ:
		id.rev = parm->rev;
		break;
	default:
		rtw89_debug(rtwdev, RTW89_DBG_ACPI, "invalid rev %u\n",
			    parm->rev);
		return NULL;
	}

	id.size = tbl_len;
	for (unsigned int i = 0; i < ARRAY_SIZE(rtw89_acpi_sar_recs); i++) {
		rec = &rtw89_acpi_sar_recs[i];
		if (memcmp(&rec->id, &id, sizeof(rec->id)) == 0)
			return rec;
	}

	rtw89_debug(rtwdev, RTW89_DBG_ACPI, "failed to recognize\n");
	return NULL;
}

static const struct rtw89_acpi_sar_recognition *
rtw89_acpi_evaluate_static_sar(struct rtw89_dev *rtwdev,
			       struct rtw89_sar_cfg_acpi *cfg)
{
	const struct rtw89_acpi_sar_recognition *rec = NULL;
	const struct rtw89_acpi_static_sar_hdr *hdr;
	struct rtw89_sar_entry_from_acpi tmp = {};
	struct rtw89_acpi_sar_rec_parm parm = {};
	struct rtw89_sar_table_from_acpi *tbl;
	const struct rtw89_acpi_data *data;
	u32 len;

	data = rtw89_acpi_evaluate_method(rtwdev, RTW89_ACPI_METHOD_STATIC_SAR);
	if (!data)
		return NULL;

	rtw89_debug(rtwdev, RTW89_DBG_ACPI, "acpi load static sar\n");

	len = data->len;
	if (len <= sizeof(*hdr)) {

Annotation

Implementation Notes