mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-04 04:54:18 +00:00
36f6d6ddcd
Backport support for RTL8812AU/RTL8821AU USB adapters Manually backported patch: 045-v6.13-wifi-rtw88-Enable-the-new-RTL8821AU-RTL8812AU-driver Patches from 046 to 051 are pending. Signed-off-by: Marty Jones <mj8263788@gmail.com> Link: https://github.com/openwrt/openwrt/pull/17079 [Move BPAUTO_WANT_DEV_COREDUMP to original patch] Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
166 lines
4.8 KiB
Diff
166 lines
4.8 KiB
Diff
From 95a772e30b60e7954d03f3372268722475aa303f Mon Sep 17 00:00:00 2001
|
|
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
|
Date: Wed, 23 Oct 2024 17:08:24 +0300
|
|
Subject: [PATCH] wifi: rtw88: Extend the init table parsing for RTL8812AU
|
|
|
|
The chips supported so far only use the first condition, and so the
|
|
parsing code ignores the second condition. RTL8812AU's init tables use
|
|
the second condition also. Make the parsing code check it.
|
|
|
|
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
|
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
|
Link: https://patch.msgid.link/1bee6b74-6eab-44a3-9f40-794ca006c72d@gmail.com
|
|
---
|
|
drivers/net/wireless/realtek/rtw88/main.h | 15 ++++++
|
|
drivers/net/wireless/realtek/rtw88/phy.c | 62 ++++++++++++++++++++---
|
|
2 files changed, 69 insertions(+), 8 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
|
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
|
@@ -1835,6 +1835,20 @@ struct rtw_phy_cond {
|
|
#define BRANCH_ENDIF 3
|
|
};
|
|
|
|
+struct rtw_phy_cond2 {
|
|
+#ifdef __LITTLE_ENDIAN
|
|
+ u8 type_glna;
|
|
+ u8 type_gpa;
|
|
+ u8 type_alna;
|
|
+ u8 type_apa;
|
|
+#else
|
|
+ u8 type_apa;
|
|
+ u8 type_alna;
|
|
+ u8 type_gpa;
|
|
+ u8 type_glna;
|
|
+#endif
|
|
+};
|
|
+
|
|
struct rtw_fifo_conf {
|
|
/* tx fifo information */
|
|
u16 rsvd_boundary;
|
|
@@ -1916,6 +1930,7 @@ struct rtw_hal {
|
|
u8 oem_id;
|
|
u8 pkg_type;
|
|
struct rtw_phy_cond phy_cond;
|
|
+ struct rtw_phy_cond2 phy_cond2;
|
|
bool rfe_btg;
|
|
|
|
u8 ps_mode;
|
|
--- a/drivers/net/wireless/realtek/rtw88/phy.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/phy.c
|
|
@@ -18,7 +18,10 @@ struct phy_cfg_pair {
|
|
};
|
|
|
|
union phy_table_tile {
|
|
- struct rtw_phy_cond cond;
|
|
+ struct {
|
|
+ struct rtw_phy_cond cond;
|
|
+ struct rtw_phy_cond2 cond2;
|
|
+ } __packed;
|
|
struct phy_cfg_pair cfg;
|
|
};
|
|
|
|
@@ -1041,7 +1044,8 @@ void rtw_phy_setup_phy_cond(struct rtw_d
|
|
{
|
|
struct rtw_hal *hal = &rtwdev->hal;
|
|
struct rtw_efuse *efuse = &rtwdev->efuse;
|
|
- struct rtw_phy_cond cond = {0};
|
|
+ struct rtw_phy_cond cond = {};
|
|
+ struct rtw_phy_cond2 cond2 = {};
|
|
|
|
cond.cut = hal->cut_version ? hal->cut_version : 15;
|
|
cond.pkg = pkg ? pkg : 15;
|
|
@@ -1061,15 +1065,34 @@ void rtw_phy_setup_phy_cond(struct rtw_d
|
|
break;
|
|
}
|
|
|
|
+ if (rtwdev->chip->id == RTW_CHIP_TYPE_8812A ||
|
|
+ rtwdev->chip->id == RTW_CHIP_TYPE_8821A) {
|
|
+ cond.rfe = 0;
|
|
+ cond.rfe |= efuse->ext_lna_2g;
|
|
+ cond.rfe |= efuse->ext_pa_2g << 1;
|
|
+ cond.rfe |= efuse->ext_lna_5g << 2;
|
|
+ cond.rfe |= efuse->ext_pa_5g << 3;
|
|
+ cond.rfe |= efuse->btcoex << 4;
|
|
+
|
|
+ cond2.type_alna = efuse->alna_type;
|
|
+ cond2.type_glna = efuse->glna_type;
|
|
+ cond2.type_apa = efuse->apa_type;
|
|
+ cond2.type_gpa = efuse->gpa_type;
|
|
+ }
|
|
+
|
|
hal->phy_cond = cond;
|
|
+ hal->phy_cond2 = cond2;
|
|
|
|
- rtw_dbg(rtwdev, RTW_DBG_PHY, "phy cond=0x%08x\n", *((u32 *)&hal->phy_cond));
|
|
+ rtw_dbg(rtwdev, RTW_DBG_PHY, "phy cond=0x%08x cond2=0x%08x\n",
|
|
+ *((u32 *)&hal->phy_cond), *((u32 *)&hal->phy_cond2));
|
|
}
|
|
|
|
-static bool check_positive(struct rtw_dev *rtwdev, struct rtw_phy_cond cond)
|
|
+static bool check_positive(struct rtw_dev *rtwdev, struct rtw_phy_cond cond,
|
|
+ struct rtw_phy_cond2 cond2)
|
|
{
|
|
struct rtw_hal *hal = &rtwdev->hal;
|
|
struct rtw_phy_cond drv_cond = hal->phy_cond;
|
|
+ struct rtw_phy_cond2 drv_cond2 = hal->phy_cond2;
|
|
|
|
if (cond.cut && cond.cut != drv_cond.cut)
|
|
return false;
|
|
@@ -1080,8 +1103,29 @@ static bool check_positive(struct rtw_de
|
|
if (cond.intf && cond.intf != drv_cond.intf)
|
|
return false;
|
|
|
|
- if (cond.rfe != drv_cond.rfe)
|
|
- return false;
|
|
+ if (rtwdev->chip->id == RTW_CHIP_TYPE_8812A ||
|
|
+ rtwdev->chip->id == RTW_CHIP_TYPE_8821A) {
|
|
+ if (!(cond.rfe & 0x0f))
|
|
+ return true;
|
|
+
|
|
+ if ((cond.rfe & drv_cond.rfe) != cond.rfe)
|
|
+ return false;
|
|
+
|
|
+ if ((cond.rfe & BIT(0)) && cond2.type_glna != drv_cond2.type_glna)
|
|
+ return false;
|
|
+
|
|
+ if ((cond.rfe & BIT(1)) && cond2.type_gpa != drv_cond2.type_gpa)
|
|
+ return false;
|
|
+
|
|
+ if ((cond.rfe & BIT(2)) && cond2.type_alna != drv_cond2.type_alna)
|
|
+ return false;
|
|
+
|
|
+ if ((cond.rfe & BIT(3)) && cond2.type_apa != drv_cond2.type_apa)
|
|
+ return false;
|
|
+ } else {
|
|
+ if (cond.rfe != drv_cond.rfe)
|
|
+ return false;
|
|
+ }
|
|
|
|
return true;
|
|
}
|
|
@@ -1090,7 +1134,8 @@ void rtw_parse_tbl_phy_cond(struct rtw_d
|
|
{
|
|
const union phy_table_tile *p = tbl->data;
|
|
const union phy_table_tile *end = p + tbl->size / 2;
|
|
- struct rtw_phy_cond pos_cond = {0};
|
|
+ struct rtw_phy_cond pos_cond = {};
|
|
+ struct rtw_phy_cond2 pos_cond2 = {};
|
|
bool is_matched = true, is_skipped = false;
|
|
|
|
BUILD_BUG_ON(sizeof(union phy_table_tile) != sizeof(struct phy_cfg_pair));
|
|
@@ -1109,11 +1154,12 @@ void rtw_parse_tbl_phy_cond(struct rtw_d
|
|
case BRANCH_ELIF:
|
|
default:
|
|
pos_cond = p->cond;
|
|
+ pos_cond2 = p->cond2;
|
|
break;
|
|
}
|
|
} else if (p->cond.neg) {
|
|
if (!is_skipped) {
|
|
- if (check_positive(rtwdev, pos_cond)) {
|
|
+ if (check_positive(rtwdev, pos_cond, pos_cond2)) {
|
|
is_matched = true;
|
|
is_skipped = true;
|
|
} else {
|