]> git.baikalelectronics.ru Git - kernel.git/commitdiff
rtw89: add new state to CFO state machine for UL-OFDMA
authorEric Huang <echuang@realtek.com>
Wed, 8 Jun 2022 11:32:24 +0000 (19:32 +0800)
committerKalle Valo <kvalo@kernel.org>
Fri, 10 Jun 2022 07:40:28 +0000 (10:40 +0300)
Add an new state, RTW89_PHY_DCFO_STATE_HOLD, to keep CFO acceleration
after CFO_PERIOD_CNT if the traffic is UL-OFDMA, which is calculated
based on RX trigger frame counter.

Signed-off-by: Eric Huang <echuang@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/20220608113224.11193-4-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/phy.c
drivers/net/wireless/realtek/rtw89/phy.h

index 1fa6fe8b995302a59d147256dfa7a651f2990e60..239d47d0ec6d6389f2bba6009aca95718d7e33ae 100644 (file)
@@ -2809,13 +2809,20 @@ enum rtw89_multi_cfo_mode {
 enum rtw89_phy_cfo_status {
        RTW89_PHY_DCFO_STATE_NORMAL = 0,
        RTW89_PHY_DCFO_STATE_ENHANCE = 1,
+       RTW89_PHY_DCFO_STATE_HOLD = 2,
        RTW89_PHY_DCFO_STATE_MAX
 };
 
+enum rtw89_phy_cfo_ul_ofdma_acc_mode {
+       RTW89_CFO_UL_OFDMA_ACC_DISABLE = 0,
+       RTW89_CFO_UL_OFDMA_ACC_ENABLE = 1
+};
+
 struct rtw89_cfo_tracking_info {
        u16 cfo_timer_ms;
        bool cfo_trig_by_timer_en;
        enum rtw89_phy_cfo_status phy_cfo_status;
+       enum rtw89_phy_cfo_ul_ofdma_acc_mode cfo_ul_ofdma_acc_mode;
        u8 phy_cfo_trk_cnt;
        bool is_adjust;
        enum rtw89_multi_cfo_mode rtw89_multi_cfo_mode;
index 762cdba9d3cfd3ad97ea9f4b363e56207501bd5a..217aacb6e8c1b6ebf72fd228d6d42bd416256675 100644 (file)
@@ -2151,6 +2151,7 @@ static void rtw89_phy_cfo_init(struct rtw89_dev *rtwdev)
        cfo->cfo_trig_by_timer_en = false;
        cfo->phy_cfo_trk_cnt = 0;
        cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_NORMAL;
+       cfo->cfo_ul_ofdma_acc_mode = RTW89_CFO_UL_OFDMA_ACC_ENABLE;
 }
 
 static void rtw89_phy_cfo_crystal_cap_adjust(struct rtw89_dev *rtwdev,
@@ -2419,6 +2420,13 @@ void rtw89_phy_cfo_track(struct rtw89_dev *rtwdev)
 {
        struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking;
        struct rtw89_traffic_stats *stats = &rtwdev->stats;
+       bool is_ul_ofdma = false, ofdma_acc_en = false;
+
+       if (stats->rx_tf_periodic > CFO_TF_CNT_TH)
+               is_ul_ofdma = true;
+       if (cfo->cfo_ul_ofdma_acc_mode == RTW89_CFO_UL_OFDMA_ACC_ENABLE &&
+           is_ul_ofdma)
+               ofdma_acc_en = true;
 
        switch (cfo->phy_cfo_status) {
        case RTW89_PHY_DCFO_STATE_NORMAL:
@@ -2430,16 +2438,26 @@ void rtw89_phy_cfo_track(struct rtw89_dev *rtwdev)
                }
                break;
        case RTW89_PHY_DCFO_STATE_ENHANCE:
-               if (cfo->phy_cfo_trk_cnt >= CFO_PERIOD_CNT) {
+               if (stats->tx_throughput <= CFO_TP_LOWER)
+                       cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_NORMAL;
+               else if (ofdma_acc_en &&
+                        cfo->phy_cfo_trk_cnt >= CFO_PERIOD_CNT)
+                       cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_HOLD;
+               else
+                       cfo->phy_cfo_trk_cnt++;
+
+               if (cfo->phy_cfo_status == RTW89_PHY_DCFO_STATE_NORMAL) {
                        cfo->phy_cfo_trk_cnt = 0;
                        cfo->cfo_trig_by_timer_en = false;
                }
-               if (cfo->cfo_trig_by_timer_en == 1)
-                       cfo->phy_cfo_trk_cnt++;
+               break;
+       case RTW89_PHY_DCFO_STATE_HOLD:
                if (stats->tx_throughput <= CFO_TP_LOWER) {
                        cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_NORMAL;
                        cfo->phy_cfo_trk_cnt = 0;
                        cfo->cfo_trig_by_timer_en = false;
+               } else {
+                       cfo->phy_cfo_trk_cnt++;
                }
                break;
        default:
index 291660154d58da19e2384c3eedca73a91606913d..e20636f54b553283e8892a738b348beebaa98cd0 100644 (file)
@@ -62,6 +62,7 @@
 #define CFO_COMP_PERIOD 250
 #define CFO_COMP_WEIGHT 8
 #define MAX_CFO_TOLERANCE 30
+#define CFO_TF_CNT_TH 300
 
 #define CCX_MAX_PERIOD 2097
 #define CCX_MAX_PERIOD_UNIT 32