You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
7.7 KiB
216 lines
7.7 KiB
From 79bec555a8cc77b1d723fa2b22983e9070c21df8 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?=C3=8D=C3=B1igo=20Huguet?= <ihuguet@redhat.com>
|
|
Date: Wed, 24 May 2023 15:00:33 +0200
|
|
Subject: [PATCH 083/142] wifi: rtw89: coex: add BTC format version derived
|
|
from firmware version
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Bugzilla: https://bugzilla.redhat.com/2207499
|
|
|
|
commit 6140635a73c00c0b3a8a58d13890dcf27d0af32a
|
|
Author: Ping-Ke Shih <pkshih@realtek.com>
|
|
Date: Sat Dec 17 22:17:39 2022 +0800
|
|
|
|
wifi: rtw89: coex: add BTC format version derived from firmware version
|
|
|
|
Originally, each chip maintains its own format version followed firmware
|
|
it uses. As new chip is added, firmware changes format of exchange
|
|
messages to have rich information to handle more conditions.
|
|
|
|
When old chip is going to upgrade firmware, it could use new format and
|
|
driver needs to maintain compatibility with old firmware. So, add this
|
|
version array to achieve this goal.
|
|
|
|
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
|
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
|
Link: https://lore.kernel.org/r/20221217141745.43291-2-pkshih@realtek.com
|
|
|
|
Signed-off-by: Íñigo Huguet <ihuguet@redhat.com>
|
|
---
|
|
drivers/net/wireless/realtek/rtw89/coex.c | 95 +++++++++++++++++++++++++++++++
|
|
drivers/net/wireless/realtek/rtw89/coex.h | 1 +
|
|
drivers/net/wireless/realtek/rtw89/core.h | 26 +++++++++
|
|
drivers/net/wireless/realtek/rtw89/fw.c | 2 +
|
|
4 files changed, 124 insertions(+)
|
|
|
|
diff --git a/drivers/net/wireless/realtek/rtw89/coex.c b/drivers/net/wireless/realtek/rtw89/coex.c
|
|
index f21c73310fdb6..96aadd50f5fd6 100644
|
|
--- a/drivers/net/wireless/realtek/rtw89/coex.c
|
|
+++ b/drivers/net/wireless/realtek/rtw89/coex.c
|
|
@@ -120,6 +120,70 @@ static const u32 cxtbl[] = {
|
|
0xfafadafa /* 19 */
|
|
};
|
|
|
|
+static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
|
|
+ /* firmware version must be in decreasing order for each chip */
|
|
+ {RTL8852C, RTW89_FW_VER_CODE(0, 27, 57, 0),
|
|
+ .fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3,
|
|
+ .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 1, .fcxgpiodbg = 1,
|
|
+ .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 2, .fcxbtdevinfo = 1,
|
|
+ .fwlrole = 1, .frptmap = 3, .fcxctrl = 1,
|
|
+ .info_buf = 1280, .max_role_num = 5,
|
|
+ },
|
|
+ {RTL8852C, RTW89_FW_VER_CODE(0, 27, 42, 0),
|
|
+ .fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3,
|
|
+ .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 1, .fcxgpiodbg = 1,
|
|
+ .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 2, .fcxbtdevinfo = 1,
|
|
+ .fwlrole = 1, .frptmap = 2, .fcxctrl = 1,
|
|
+ .info_buf = 1280, .max_role_num = 5,
|
|
+ },
|
|
+ {RTL8852C, RTW89_FW_VER_CODE(0, 27, 0, 0),
|
|
+ .fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3,
|
|
+ .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 1, .fcxgpiodbg = 1,
|
|
+ .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 1, .fcxbtdevinfo = 1,
|
|
+ .fwlrole = 1, .frptmap = 2, .fcxctrl = 1,
|
|
+ .info_buf = 1280, .max_role_num = 5,
|
|
+ },
|
|
+ {RTL8852B, RTW89_FW_VER_CODE(0, 29, 14, 0),
|
|
+ .fcxbtcrpt = 5, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 4,
|
|
+ .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 1, .fcxgpiodbg = 1,
|
|
+ .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 2, .fcxbtdevinfo = 1,
|
|
+ .fwlrole = 1, .frptmap = 3, .fcxctrl = 1,
|
|
+ .info_buf = 1800, .max_role_num = 6,
|
|
+ },
|
|
+ {RTL8852B, RTW89_FW_VER_CODE(0, 27, 0, 0),
|
|
+ .fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3,
|
|
+ .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 1, .fcxgpiodbg = 1,
|
|
+ .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 1, .fcxbtdevinfo = 1,
|
|
+ .fwlrole = 1, .frptmap = 1, .fcxctrl = 1,
|
|
+ .info_buf = 1280, .max_role_num = 5,
|
|
+ },
|
|
+ {RTL8852A, RTW89_FW_VER_CODE(0, 13, 37, 0),
|
|
+ .fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3,
|
|
+ .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 1, .fcxgpiodbg = 1,
|
|
+ .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 2, .fcxbtdevinfo = 1,
|
|
+ .fwlrole = 1, .frptmap = 3, .fcxctrl = 1,
|
|
+ .info_buf = 1280, .max_role_num = 5,
|
|
+ },
|
|
+ {RTL8852A, RTW89_FW_VER_CODE(0, 13, 0, 0),
|
|
+ .fcxbtcrpt = 1, .fcxtdma = 1, .fcxslots = 1, .fcxcysta = 2,
|
|
+ .fcxstep = 2, .fcxnullsta = 1, .fcxmreg = 1, .fcxgpiodbg = 1,
|
|
+ .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 1, .fcxbtdevinfo = 1,
|
|
+ .fwlrole = 0, .frptmap = 0, .fcxctrl = 0,
|
|
+ .info_buf = 1024, .max_role_num = 5,
|
|
+ },
|
|
+
|
|
+ /* keep it to be the last as default entry */
|
|
+ {0, RTW89_FW_VER_CODE(0, 0, 0, 0),
|
|
+ .fcxbtcrpt = 1, .fcxtdma = 1, .fcxslots = 1, .fcxcysta = 2,
|
|
+ .fcxstep = 2, .fcxnullsta = 1, .fcxmreg = 1, .fcxgpiodbg = 1,
|
|
+ .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 1, .fcxbtdevinfo = 1,
|
|
+ .fwlrole = 0, .frptmap = 0, .fcxctrl = 0,
|
|
+ .info_buf = 1024, .max_role_num = 5,
|
|
+ },
|
|
+};
|
|
+
|
|
+#define RTW89_DEFAULT_BTC_VER_IDX (ARRAY_SIZE(rtw89_btc_ver_defs) - 1)
|
|
+
|
|
struct rtw89_btc_btf_tlv {
|
|
u8 type;
|
|
u8 len;
|
|
@@ -7008,3 +7072,34 @@ void rtw89_btc_dump_info(struct rtw89_dev *rtwdev, struct seq_file *m)
|
|
else
|
|
_show_summary_v1(rtwdev, m);
|
|
}
|
|
+
|
|
+void rtw89_coex_recognize_ver(struct rtw89_dev *rtwdev)
|
|
+{
|
|
+ const struct rtw89_chip_info *chip = rtwdev->chip;
|
|
+ struct rtw89_btc *btc = &rtwdev->btc;
|
|
+ const struct rtw89_btc_ver *btc_ver_def;
|
|
+ const struct rtw89_fw_suit *fw_suit;
|
|
+ u32 suit_ver_code;
|
|
+ int i;
|
|
+
|
|
+ fw_suit = rtw89_fw_suit_get(rtwdev, RTW89_FW_NORMAL);
|
|
+ suit_ver_code = RTW89_FW_SUIT_VER_CODE(fw_suit);
|
|
+
|
|
+ for (i = 0; i < ARRAY_SIZE(rtw89_btc_ver_defs); i++) {
|
|
+ btc_ver_def = &rtw89_btc_ver_defs[i];
|
|
+
|
|
+ if (chip->chip_id != btc_ver_def->chip_id)
|
|
+ continue;
|
|
+
|
|
+ if (suit_ver_code >= btc_ver_def->fw_ver_code) {
|
|
+ btc->ver = btc_ver_def;
|
|
+ goto out;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ btc->ver = &rtw89_btc_ver_defs[RTW89_DEFAULT_BTC_VER_IDX];
|
|
+
|
|
+out:
|
|
+ rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC] use version def[%d] = 0x%08x\n",
|
|
+ (int)(btc->ver - rtw89_btc_ver_defs), btc->ver->fw_ver_code);
|
|
+}
|
|
diff --git a/drivers/net/wireless/realtek/rtw89/coex.h b/drivers/net/wireless/realtek/rtw89/coex.h
|
|
index ca16afa97ec07..401fb55df82b0 100644
|
|
--- a/drivers/net/wireless/realtek/rtw89/coex.h
|
|
+++ b/drivers/net/wireless/realtek/rtw89/coex.h
|
|
@@ -164,6 +164,7 @@ void rtw89_coex_rfk_chk_work(struct work_struct *work);
|
|
void rtw89_coex_power_on(struct rtw89_dev *rtwdev);
|
|
void rtw89_btc_set_policy(struct rtw89_dev *rtwdev, u16 policy_type);
|
|
void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type);
|
|
+void rtw89_coex_recognize_ver(struct rtw89_dev *rtwdev);
|
|
|
|
static inline u8 rtw89_btc_phymap(struct rtw89_dev *rtwdev,
|
|
enum rtw89_phy_idx phy_idx,
|
|
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
|
index 800ede1d69c75..151343ee7b763 100644
|
|
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
|
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
|
@@ -2019,9 +2019,35 @@ struct rtw89_btc_btf_fwinfo {
|
|
struct rtw89_btc_rpt_fbtc_btdev rpt_fbtc_btdev;
|
|
};
|
|
|
|
+struct rtw89_btc_ver {
|
|
+ enum rtw89_core_chip_id chip_id;
|
|
+ u32 fw_ver_code;
|
|
+
|
|
+ u8 fcxbtcrpt;
|
|
+ u8 fcxtdma;
|
|
+ u8 fcxslots;
|
|
+ u8 fcxcysta;
|
|
+ u8 fcxstep;
|
|
+ u8 fcxnullsta;
|
|
+ u8 fcxmreg;
|
|
+ u8 fcxgpiodbg;
|
|
+ u8 fcxbtver;
|
|
+ u8 fcxbtscan;
|
|
+ u8 fcxbtafh;
|
|
+ u8 fcxbtdevinfo;
|
|
+ u8 fwlrole;
|
|
+ u8 frptmap;
|
|
+ u8 fcxctrl;
|
|
+
|
|
+ u16 info_buf;
|
|
+ u8 max_role_num;
|
|
+};
|
|
+
|
|
#define RTW89_BTC_POLICY_MAXLEN 512
|
|
|
|
struct rtw89_btc {
|
|
+ const struct rtw89_btc_ver *ver;
|
|
+
|
|
struct rtw89_btc_cx cx;
|
|
struct rtw89_btc_dm dm;
|
|
struct rtw89_btc_ctrl ctrl;
|
|
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
|
|
index fddad1c21e3d3..ecf68912eac2a 100644
|
|
--- a/drivers/net/wireless/realtek/rtw89/fw.c
|
|
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
|
|
@@ -352,6 +352,8 @@ int rtw89_fw_recognize(struct rtw89_dev *rtwdev)
|
|
|
|
rtw89_fw_recognize_features(rtwdev);
|
|
|
|
+ rtw89_coex_recognize_ver(rtwdev);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
--
|
|
2.13.6
|
|
|