wifi: rtw89: coex: Change Wi-Fi Null data report to version separate
authorChing-Te Ku <ku920601@realtek.com>
Fri, 6 Jan 2023 12:08:39 +0000 (20:08 +0800)
committerKalle Valo <kvalo@kernel.org>
Mon, 16 Jan 2023 13:36:57 +0000 (15:36 +0200)
Coexistence need to send Null data to stop AP keeps TX packet to DUT
before DUT coexistence switch to Bluetooth time slot, or it will be an
interference to DUT BT and because DUT will not RX packet from AP
the packet retry may harmful to WL TP. Compare to v1 version, the newer
firmware report will also report Null TX data counter.

Signed-off-by: Ching-Te Ku <ku920601@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20230106120844.17441-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/coex.c
drivers/net/wireless/realtek/rtw89/core.h

index f97ddbc..eec1f52 100644 (file)
@@ -1032,12 +1032,14 @@ static u32 _chk_btc_report(struct rtw89_dev *rtwdev,
                break;
        case BTC_RPT_TYPE_NULLSTA:
                pcinfo = &pfwinfo->rpt_fbtc_nullsta.cinfo;
-               if (chip->chip_id == RTL8852A) {
+               if (ver->fcxnullsta == 1) {
                        pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo;
-                       pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo);
+                       pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo.v1);
+               } else if (ver->fcxnullsta == 2) {
+                       pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo.v2;
+                       pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo.v2);
                } else {
-                       pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo_v1;
-                       pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo_v1);
+                       goto err;
                }
                pcinfo->req_fver = ver->fcxnullsta;
                break;
@@ -6789,12 +6791,11 @@ static void _show_fbtc_cysta_v4(struct rtw89_dev *rtwdev, struct seq_file *m)
 
 static void _show_fbtc_nullsta(struct rtw89_dev *rtwdev, struct seq_file *m)
 {
-       const struct rtw89_chip_info *chip = rtwdev->chip;
        struct rtw89_btc *btc = &rtwdev->btc;
+       const struct rtw89_btc_ver *ver = btc->ver;
        struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
        struct rtw89_btc_rpt_cmn_info *pcinfo;
-       struct rtw89_btc_fbtc_cynullsta *ns;
-       struct rtw89_btc_fbtc_cynullsta_v1 *ns_v1;
+       union rtw89_btc_fbtc_cynullsta_info *ns;
        u8 i = 0;
 
        if (!btc->dm.tdma_now.rxflctrl)
@@ -6804,9 +6805,8 @@ static void _show_fbtc_nullsta(struct rtw89_dev *rtwdev, struct seq_file *m)
        if (!pcinfo->valid)
                return;
 
-       if (chip->chip_id == RTL8852A) {
-               ns = &pfwinfo->rpt_fbtc_nullsta.finfo;
-
+       ns = &pfwinfo->rpt_fbtc_nullsta.finfo;
+       if (ver->fcxnullsta == 1) {
                seq_printf(m, " %-15s : ", "[null_sta]");
 
                for (i = 0; i < 2; i++) {
@@ -6815,46 +6815,43 @@ static void _show_fbtc_nullsta(struct rtw89_dev *rtwdev, struct seq_file *m)
                        else
                                seq_printf(m, "null-%d", i);
                        seq_printf(m, "[ok:%d/",
-                                  le32_to_cpu(ns->result[i][1]));
+                                  le32_to_cpu(ns->v1.result[i][1]));
                        seq_printf(m, "fail:%d/",
-                                  le32_to_cpu(ns->result[i][0]));
+                                  le32_to_cpu(ns->v1.result[i][0]));
                        seq_printf(m, "on_time:%d/",
-                                  le32_to_cpu(ns->result[i][2]));
+                                  le32_to_cpu(ns->v1.result[i][2]));
                        seq_printf(m, "retry:%d/",
-                                  le32_to_cpu(ns->result[i][3]));
+                                  le32_to_cpu(ns->v1.result[i][3]));
                        seq_printf(m, "avg_t:%d.%03d/",
-                                  le32_to_cpu(ns->avg_t[i]) / 1000,
-                                  le32_to_cpu(ns->avg_t[i]) % 1000);
+                                  le32_to_cpu(ns->v1.avg_t[i]) / 1000,
+                                  le32_to_cpu(ns->v1.avg_t[i]) % 1000);
                        seq_printf(m, "max_t:%d.%03d]",
-                                  le32_to_cpu(ns->max_t[i]) / 1000,
-                                  le32_to_cpu(ns->max_t[i]) % 1000);
+                                  le32_to_cpu(ns->v1.max_t[i]) / 1000,
+                                  le32_to_cpu(ns->v1.max_t[i]) % 1000);
                }
        } else {
-               ns_v1 = &pfwinfo->rpt_fbtc_nullsta.finfo_v1;
-
                seq_printf(m, " %-15s : ", "[null_sta]");
-
                for (i = 0; i < 2; i++) {
                        if (i != 0)
                                seq_printf(m, ", null-%d", i);
                        else
                                seq_printf(m, "null-%d", i);
                        seq_printf(m, "[Tx:%d/",
-                                  le32_to_cpu(ns_v1->result[i][4]));
+                                  le32_to_cpu(ns->v2.result[i][4]));
                        seq_printf(m, "[ok:%d/",
-                                  le32_to_cpu(ns_v1->result[i][1]));
+                                  le32_to_cpu(ns->v2.result[i][1]));
                        seq_printf(m, "fail:%d/",
-                                  le32_to_cpu(ns_v1->result[i][0]));
+                                  le32_to_cpu(ns->v2.result[i][0]));
                        seq_printf(m, "on_time:%d/",
-                                  le32_to_cpu(ns_v1->result[i][2]));
+                                  le32_to_cpu(ns->v2.result[i][2]));
                        seq_printf(m, "retry:%d/",
-                                  le32_to_cpu(ns_v1->result[i][3]));
+                                  le32_to_cpu(ns->v2.result[i][3]));
                        seq_printf(m, "avg_t:%d.%03d/",
-                                  le32_to_cpu(ns_v1->avg_t[i]) / 1000,
-                                  le32_to_cpu(ns_v1->avg_t[i]) % 1000);
+                                  le32_to_cpu(ns->v2.avg_t[i]) / 1000,
+                                  le32_to_cpu(ns->v2.avg_t[i]) % 1000);
                        seq_printf(m, "max_t:%d.%03d]",
-                                  le32_to_cpu(ns_v1->max_t[i]) / 1000,
-                                  le32_to_cpu(ns_v1->max_t[i]) % 1000);
+                                  le32_to_cpu(ns->v2.max_t[i]) / 1000,
+                                  le32_to_cpu(ns->v2.max_t[i]) % 1000);
                }
        }
        seq_puts(m, "\n");
index d0b4c00..dfde880 100644 (file)
@@ -1865,7 +1865,7 @@ union rtw89_btc_fbtc_cysta_info {
        struct rtw89_btc_fbtc_cysta_v4 v4;
 };
 
-struct rtw89_btc_fbtc_cynullsta { /* cycle null statistics */
+struct rtw89_btc_fbtc_cynullsta_v1 { /* cycle null statistics */
        u8 fver; /* btc_ver::fcxnullsta */
        u8 rsvd;
        __le16 rsvd2;
@@ -1874,7 +1874,7 @@ struct rtw89_btc_fbtc_cynullsta { /* cycle null statistics */
        __le32 result[2][4]; /* 0:fail, 1:ok, 2:on_time, 3:retry */
 } __packed;
 
-struct rtw89_btc_fbtc_cynullsta_v1 { /* cycle null statistics */
+struct rtw89_btc_fbtc_cynullsta_v2 { /* cycle null statistics */
        u8 fver; /* btc_ver::fcxnullsta */
        u8 rsvd;
        __le16 rsvd2;
@@ -1883,6 +1883,11 @@ struct rtw89_btc_fbtc_cynullsta_v1 { /* cycle null statistics */
        __le32 result[2][5]; /* 0:fail, 1:ok, 2:on_time, 3:retry, 4:tx */
 } __packed;
 
+union rtw89_btc_fbtc_cynullsta_info {
+       struct rtw89_btc_fbtc_cynullsta_v1 v1; /* info from fw */
+       struct rtw89_btc_fbtc_cynullsta_v2 v2;
+};
+
 struct rtw89_btc_fbtc_btver {
        u8 fver; /* btc_ver::fcxbtver */
        u8 rsvd;
@@ -2075,10 +2080,7 @@ struct rtw89_btc_rpt_fbtc_step {
 
 struct rtw89_btc_rpt_fbtc_nullsta {
        struct rtw89_btc_rpt_cmn_info cinfo; /* common info, by driver */
-       union {
-               struct rtw89_btc_fbtc_cynullsta finfo; /* info from fw */
-               struct rtw89_btc_fbtc_cynullsta_v1 finfo_v1; /* info from fw */
-       };
+       union rtw89_btc_fbtc_cynullsta_info finfo;
 };
 
 struct rtw89_btc_rpt_fbtc_mreg {