diff --git a/sys/contrib/dev/rtw89/acpi.c b/sys/contrib/dev/rtw89/acpi.c index 02d4526c1538..f5dedb12c129 100644 --- a/sys/contrib/dev/rtw89/acpi.c +++ b/sys/contrib/dev/rtw89/acpi.c @@ -1,223 +1,197 @@ // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* Copyright(c) 2021-2023 Realtek Corporation */ #include #include #include "acpi.h" #include "debug.h" -#if defined(__linux__) static const guid_t rtw89_guid = GUID_INIT(0xD2A8C3E8, 0x4B69, 0x4F00, 0x82, 0xBD, 0xFE, 0x86, 0x07, 0x80, 0x3A, 0xA7); static int rtw89_acpi_dsm_get_value(struct rtw89_dev *rtwdev, union acpi_object *obj, u8 *value) { if (obj->type != ACPI_TYPE_INTEGER) { rtw89_debug(rtwdev, RTW89_DBG_ACPI, "acpi: expect integer but type: %d\n", obj->type); return -EINVAL; } *value = (u8)obj->integer.value; return 0; } static bool chk_acpi_policy_6ghz_sig(const struct rtw89_acpi_policy_6ghz *p) { return p->signature[0] == 0x00 && p->signature[1] == 0xE0 && p->signature[2] == 0x4C; } static int rtw89_acpi_dsm_get_policy_6ghz(struct rtw89_dev *rtwdev, union acpi_object *obj, struct rtw89_acpi_policy_6ghz **policy_6ghz) { const struct rtw89_acpi_policy_6ghz *ptr; u32 expect_len; u32 len; if (obj->type != ACPI_TYPE_BUFFER) { rtw89_debug(rtwdev, RTW89_DBG_ACPI, "acpi: expect buffer but type: %d\n", obj->type); return -EINVAL; } len = obj->buffer.length; if (len < sizeof(*ptr)) { rtw89_debug(rtwdev, RTW89_DBG_ACPI, "%s: invalid buffer length: %u\n", __func__, len); return -EINVAL; } ptr = (typeof(ptr))obj->buffer.pointer; if (!chk_acpi_policy_6ghz_sig(ptr)) { rtw89_debug(rtwdev, RTW89_DBG_ACPI, "%s: bad signature\n", __func__); return -EINVAL; } expect_len = struct_size(ptr, country_list, ptr->country_count); if (len < expect_len) { rtw89_debug(rtwdev, RTW89_DBG_ACPI, "%s: expect %u but length: %u\n", __func__, expect_len, len); return -EINVAL; } *policy_6ghz = kmemdup(ptr, expect_len, GFP_KERNEL); if (!*policy_6ghz) return -ENOMEM; rtw89_hex_dump(rtwdev, RTW89_DBG_ACPI, "policy_6ghz: ", *policy_6ghz, expect_len); return 0; } static bool chk_acpi_policy_6ghz_sp_sig(const struct rtw89_acpi_policy_6ghz_sp *p) { return p->signature[0] == 0x52 && p->signature[1] == 0x54 && p->signature[2] == 0x4B && p->signature[3] == 0x07; } static int rtw89_acpi_dsm_get_policy_6ghz_sp(struct rtw89_dev *rtwdev, union acpi_object *obj, struct rtw89_acpi_policy_6ghz_sp **policy) { const struct rtw89_acpi_policy_6ghz_sp *ptr; u32 buf_len; if (obj->type != ACPI_TYPE_BUFFER) { rtw89_debug(rtwdev, RTW89_DBG_ACPI, "acpi: expect buffer but type: %d\n", obj->type); return -EINVAL; } buf_len = obj->buffer.length; if (buf_len < sizeof(*ptr)) { rtw89_debug(rtwdev, RTW89_DBG_ACPI, "%s: invalid buffer length: %u\n", __func__, buf_len); return -EINVAL; } ptr = (typeof(ptr))obj->buffer.pointer; if (!chk_acpi_policy_6ghz_sp_sig(ptr)) { rtw89_debug(rtwdev, RTW89_DBG_ACPI, "%s: bad signature\n", __func__); return -EINVAL; } *policy = kmemdup(ptr, sizeof(*ptr), GFP_KERNEL); if (!*policy) return -ENOMEM; rtw89_hex_dump(rtwdev, RTW89_DBG_ACPI, "policy_6ghz_sp: ", *policy, sizeof(*ptr)); return 0; } int rtw89_acpi_evaluate_dsm(struct rtw89_dev *rtwdev, enum rtw89_acpi_dsm_func func, struct rtw89_acpi_dsm_result *res) { union acpi_object *obj; int ret; obj = acpi_evaluate_dsm(ACPI_HANDLE(rtwdev->dev), &rtw89_guid, 0, func, NULL); if (!obj) { rtw89_debug(rtwdev, RTW89_DBG_ACPI, "acpi dsm fail to evaluate func: %d\n", func); return -ENOENT; } if (func == RTW89_ACPI_DSM_FUNC_6G_BP) ret = rtw89_acpi_dsm_get_policy_6ghz(rtwdev, obj, &res->u.policy_6ghz); else if (func == RTW89_ACPI_DSM_FUNC_6GHZ_SP_SUP) ret = rtw89_acpi_dsm_get_policy_6ghz_sp(rtwdev, obj, &res->u.policy_6ghz_sp); else ret = rtw89_acpi_dsm_get_value(rtwdev, obj, &res->u.value); ACPI_FREE(obj); return ret; } -#elif defined(__FreeBSD__) -int rtw89_acpi_evaluate_dsm(struct rtw89_dev *rtwdev, - enum rtw89_acpi_dsm_func func, - struct rtw89_acpi_dsm_result *res) -{ - return -ENOENT; -} -#endif int rtw89_acpi_evaluate_rtag(struct rtw89_dev *rtwdev, struct rtw89_acpi_rtag_result *res) { struct acpi_buffer buf = {ACPI_ALLOCATE_BUFFER, NULL}; acpi_handle root, handle; union acpi_object *obj; acpi_status status; u32 buf_len; int ret = 0; root = ACPI_HANDLE(rtwdev->dev); if (!root) return -EOPNOTSUPP; status = acpi_get_handle(root, (acpi_string)"RTAG", &handle); if (ACPI_FAILURE(status)) return -EIO; status = acpi_evaluate_object(handle, NULL, NULL, &buf); if (ACPI_FAILURE(status)) return -EIO; -#if defined(__linux__) obj = buf.pointer; if (obj->type != ACPI_TYPE_BUFFER) { -#elif defined(__FreeBSD__) - obj = buf.Pointer; - if (obj->Type != ACPI_TYPE_BUFFER) { -#endif rtw89_debug(rtwdev, RTW89_DBG_ACPI, -#if defined(__linux__) "acpi: expect buffer but type: %d\n", obj->type); -#elif defined(__FreeBSD__) - "acpi: expect buffer but type: %d\n", obj->Type); -#endif ret = -EINVAL; goto out; } -#if defined(__linux__) buf_len = obj->buffer.length; -#elif defined(__FreeBSD__) - buf_len = obj->Buffer.Length; -#endif if (buf_len != sizeof(*res)) { rtw89_debug(rtwdev, RTW89_DBG_ACPI, "%s: invalid buffer length: %u\n", __func__, buf_len); ret = -EINVAL; goto out; } -#if defined(__linux__) *res = *(struct rtw89_acpi_rtag_result *)obj->buffer.pointer; -#elif defined(__FreeBSD__) - *res = *(struct rtw89_acpi_rtag_result *)obj->Buffer.Pointer; -#endif rtw89_hex_dump(rtwdev, RTW89_DBG_ACPI, "antenna_gain: ", res, sizeof(*res)); out: ACPI_FREE(obj); return ret; } diff --git a/sys/modules/rtw89/Makefile b/sys/modules/rtw89/Makefile index 73945591826c..09580f288c62 100644 --- a/sys/modules/rtw89/Makefile +++ b/sys/modules/rtw89/Makefile @@ -1,52 +1,53 @@ DEVRTW89DIR= ${SRCTOP}/sys/contrib/dev/rtw89 .PATH: ${DEVRTW89DIR} WITH_CONFIG_PM= 0 WITH_DEBUGFS= 1 KMOD= if_rtw89 SRCS= core.c SRCS+= pci.c pci_be.c SRCS+= chan.c mac80211.c mac.c mac_be.c phy.c phy_be.c fw.c SRCS+= acpi.c cam.c efuse.c efuse_be.c regd.c sar.c coex.c ps.c ser.c SRCS+= util.c SRCS+= rtw8852a.c rtw8852a_rfk.c rtw8852a_rfk_table.c rtw8852a_table.c SRCS+= rtw8852ae.c SRCS+= rtw8852c.c rtw8852c_rfk.c rtw8852c_rfk_table.c rtw8852c_table.c SRCS+= rtw8852ce.c SRCS+= rtw8851b.c rtw8851b_rfk.c rtw8851b_rfk_table.c rtw8851b_table.c SRCS+= rtw8851be.c SRCS+= rtw8852b_common.c SRCS+= rtw8852b.c rtw8852b_rfk.c rtw8852b_rfk_table.c rtw8852b_table.c SRCS+= rtw8852be.c SRCS+= rtw8852bt.c rtw8852bt_rfk.c rtw8852bt_rfk_table.c SRCS+= rtw8852bte.c SRCS+= rtw8922a.c rtw8922a_rfk.c SRCS+= rtw8922ae.c # CONFIG_RTW89_DEBUG (always on for now) SRCS+= debug.c .if defined(WITH_CONFIG_PM) && ${WITH_CONFIG_PM} > 0 CFLAGS+= -DCONFIG_PM=${WITH_CONFIG_PM} SRCS+= wow.c .endif # Other SRCS+= ${LINUXKPI_GENSRCS} SRCS+= opt_wlan.h opt_inet6.h opt_inet.h opt_acpi.h CFLAGS+= -DKBUILD_MODNAME='"rtw89"' +CFLAGS+= -DLINUXKPI_WANT_LINUX_ACPI CFLAGS+= -I${DEVRTW89DIR} CFLAGS+= ${LINUXKPI_INCLUDES} CFLAGS+= -DCONFIG_RTW89_DEBUGMSG .if defined(WITH_DEBUGFS) && ${WITH_DEBUGFS} > 0 CFLAGS+= -DCONFIG_RTW89_DEBUGFS .endif #CFLAGS+= -ferror-limit=0 .include