rtw88: 8822c: use more accurate ofdm fa counting
authorYan-Hsuan Chuang <yhchuang@realtek.com>
Fri, 14 Jun 2019 07:24:11 +0000 (15:24 +0800)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 25 Jun 2019 05:08:58 +0000 (08:08 +0300)
8822c used to count OFDM FA count by subtracting tx count from FA count.
But it need to substract more counters to be accurate.

However, we can count it by adding up all of the FA counters we want.
And it is simpler to add than list all of the components to substract.

Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtw88/rtw8822c.c
drivers/net/wireless/realtek/rtw88/rtw8822c.h

index 22380b1afe97d7a65b399385d9371a6f24e80717..bbe61cc0c27e2c6345c1789bd263597a698e3838 100644 (file)
@@ -1491,13 +1491,30 @@ static void rtw8822c_false_alarm_statistics(struct rtw_dev *rtwdev)
        u32 cck_enable;
        u32 cck_fa_cnt;
        u32 ofdm_fa_cnt;
-       u32 ofdm_tx_counter;
+       u32 ofdm_fa_cnt1, ofdm_fa_cnt2, ofdm_fa_cnt3, ofdm_fa_cnt4, ofdm_fa_cnt5;
+       u16 parity_fail, rate_illegal, crc8_fail, mcs_fail, sb_search_fail,
+           fast_fsync, crc8_fail_vhta, mcs_fail_vht;
 
        cck_enable = rtw_read32(rtwdev, REG_ENCCK) & BIT_CCK_BLK_EN;
        cck_fa_cnt = rtw_read16(rtwdev, REG_CCK_FACNT);
-       ofdm_fa_cnt = rtw_read16(rtwdev, REG_OFDM_FACNT);
-       ofdm_tx_counter = rtw_read16(rtwdev, REG_OFDM_TXCNT);
-       ofdm_fa_cnt -= ofdm_tx_counter;
+
+       ofdm_fa_cnt1 = rtw_read32(rtwdev, REG_OFDM_FACNT1);
+       ofdm_fa_cnt2 = rtw_read32(rtwdev, REG_OFDM_FACNT2);
+       ofdm_fa_cnt3 = rtw_read32(rtwdev, REG_OFDM_FACNT3);
+       ofdm_fa_cnt4 = rtw_read32(rtwdev, REG_OFDM_FACNT4);
+       ofdm_fa_cnt5 = rtw_read32(rtwdev, REG_OFDM_FACNT5);
+
+       parity_fail     = FIELD_GET(GENMASK(31, 16), ofdm_fa_cnt1);
+       rate_illegal    = FIELD_GET(GENMASK(15, 0), ofdm_fa_cnt2);
+       crc8_fail       = FIELD_GET(GENMASK(31, 16), ofdm_fa_cnt2);
+       crc8_fail_vhta  = FIELD_GET(GENMASK(15, 0), ofdm_fa_cnt3);
+       mcs_fail        = FIELD_GET(GENMASK(15, 0), ofdm_fa_cnt4);
+       mcs_fail_vht    = FIELD_GET(GENMASK(31, 16), ofdm_fa_cnt4);
+       fast_fsync      = FIELD_GET(GENMASK(15, 0), ofdm_fa_cnt5);
+       sb_search_fail  = FIELD_GET(GENMASK(31, 16), ofdm_fa_cnt5);
+
+       ofdm_fa_cnt = parity_fail + rate_illegal + crc8_fail + crc8_fail_vhta +
+                     mcs_fail + mcs_fail_vht + fast_fsync + sb_search_fail;
 
        dm_info->cck_fa_cnt = cck_fa_cnt;
        dm_info->ofdm_fa_cnt = ofdm_fa_cnt;
index 33125e7de7aff0a34c87aaf3428b6edd3aac84f0..06fbabc90e6266a4a4e0459691e0ad11d6578567 100644 (file)
@@ -188,6 +188,11 @@ struct rtw8822c_efuse {
 #define REG_CNT_CTRL   0x1eb4
 #define BIT_ALL_CNT_RST                BIT(25)
 #define REG_OFDM_FACNT 0x2d00
+#define REG_OFDM_FACNT1        0x2d04
+#define REG_OFDM_FACNT2        0x2d08
+#define REG_OFDM_FACNT3        0x2d0c
+#define REG_OFDM_FACNT4        0x2d10
+#define REG_OFDM_FACNT5        0x2d20
 #define REG_OFDM_TXCNT 0x2de0
 #define REG_ORITXCODE2 0x4100
 #define REG_3WIRE2     0x410c