Commit bc013052 authored by Eric Huang's avatar Eric Huang Committed by Kalle Valo

rtw89: add new state to CFO state machine for UL-OFDMA

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: default avatarEric Huang <echuang@realtek.com>
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220608113224.11193-4-pkshih@realtek.com
parent 5165f168
...@@ -2809,13 +2809,20 @@ enum rtw89_multi_cfo_mode { ...@@ -2809,13 +2809,20 @@ enum rtw89_multi_cfo_mode {
enum rtw89_phy_cfo_status { enum rtw89_phy_cfo_status {
RTW89_PHY_DCFO_STATE_NORMAL = 0, RTW89_PHY_DCFO_STATE_NORMAL = 0,
RTW89_PHY_DCFO_STATE_ENHANCE = 1, RTW89_PHY_DCFO_STATE_ENHANCE = 1,
RTW89_PHY_DCFO_STATE_HOLD = 2,
RTW89_PHY_DCFO_STATE_MAX 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 { struct rtw89_cfo_tracking_info {
u16 cfo_timer_ms; u16 cfo_timer_ms;
bool cfo_trig_by_timer_en; bool cfo_trig_by_timer_en;
enum rtw89_phy_cfo_status phy_cfo_status; 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; u8 phy_cfo_trk_cnt;
bool is_adjust; bool is_adjust;
enum rtw89_multi_cfo_mode rtw89_multi_cfo_mode; enum rtw89_multi_cfo_mode rtw89_multi_cfo_mode;
......
...@@ -2151,6 +2151,7 @@ static void rtw89_phy_cfo_init(struct rtw89_dev *rtwdev) ...@@ -2151,6 +2151,7 @@ static void rtw89_phy_cfo_init(struct rtw89_dev *rtwdev)
cfo->cfo_trig_by_timer_en = false; cfo->cfo_trig_by_timer_en = false;
cfo->phy_cfo_trk_cnt = 0; cfo->phy_cfo_trk_cnt = 0;
cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_NORMAL; 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, 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) ...@@ -2419,6 +2420,13 @@ void rtw89_phy_cfo_track(struct rtw89_dev *rtwdev)
{ {
struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking;
struct rtw89_traffic_stats *stats = &rtwdev->stats; 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) { switch (cfo->phy_cfo_status) {
case RTW89_PHY_DCFO_STATE_NORMAL: case RTW89_PHY_DCFO_STATE_NORMAL:
...@@ -2430,16 +2438,26 @@ void rtw89_phy_cfo_track(struct rtw89_dev *rtwdev) ...@@ -2430,16 +2438,26 @@ void rtw89_phy_cfo_track(struct rtw89_dev *rtwdev)
} }
break; break;
case RTW89_PHY_DCFO_STATE_ENHANCE: 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->phy_cfo_trk_cnt = 0;
cfo->cfo_trig_by_timer_en = false; cfo->cfo_trig_by_timer_en = false;
} }
if (cfo->cfo_trig_by_timer_en == 1) break;
cfo->phy_cfo_trk_cnt++; case RTW89_PHY_DCFO_STATE_HOLD:
if (stats->tx_throughput <= CFO_TP_LOWER) { if (stats->tx_throughput <= CFO_TP_LOWER) {
cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_NORMAL; cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_NORMAL;
cfo->phy_cfo_trk_cnt = 0; cfo->phy_cfo_trk_cnt = 0;
cfo->cfo_trig_by_timer_en = false; cfo->cfo_trig_by_timer_en = false;
} else {
cfo->phy_cfo_trk_cnt++;
} }
break; break;
default: default:
......
...@@ -62,6 +62,7 @@ ...@@ -62,6 +62,7 @@
#define CFO_COMP_PERIOD 250 #define CFO_COMP_PERIOD 250
#define CFO_COMP_WEIGHT 8 #define CFO_COMP_WEIGHT 8
#define MAX_CFO_TOLERANCE 30 #define MAX_CFO_TOLERANCE 30
#define CFO_TF_CNT_TH 300
#define CCX_MAX_PERIOD 2097 #define CCX_MAX_PERIOD 2097
#define CCX_MAX_PERIOD_UNIT 32 #define CCX_MAX_PERIOD_UNIT 32
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment