OSDN Git Service

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 f21c733..96aadd5 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 ca16afa..401fb55 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 800ede1..151343e 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 65b6bd4..50fd97a 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;
 }