wifi: rtw89: coex: add BTC format version derived from firmware version
authorPing-Ke Shih <pkshih@realtek.com>
Sat, 17 Dec 2022 14:17:39 +0000 (22:17 +0800)
committerKalle Valo <kvalo@kernel.org>
Wed, 21 Dec 2022 18:49:24 +0000 (20:49 +0200)
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
drivers/net/wireless/realtek/rtw89/coex.c
drivers/net/wireless/realtek/rtw89/coex.h
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/fw.c

index f21c73310fdb68721282769880f81cdae4999602..96aadd50f5fd6c7628099391c4ca742395d26311 100644 (file)
@@ -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);
+}
index ca16afa97ec07e571f2824a8d842007737752088..401fb55df82b05a39c2ed75216465560082a2e96 100644 (file)
@@ -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,
index 800ede1d69c75574465d16655a6957d8bcecee20..151343ee7b763a024880d1b1c34b2deccb833df6 100644 (file)
@@ -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;
index 65b6bd44c5ac71067138546400117fe5691e5030..50fd97a22ffa9ba38f5293c9fd043560a3162958 100644 (file)
@@ -352,6 +352,8 @@ int rtw89_fw_recognize(struct rtw89_dev *rtwdev)
 
        rtw89_fw_recognize_features(rtwdev);
 
+       rtw89_coex_recognize_ver(rtwdev);
+
        return 0;
 }