1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2016  Realtek Corporation.
5  *
6  * Contact Information:
7  * wlanfae <wlanfae@realtek.com>
8  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
9  * Hsinchu 300, Taiwan.
10  *
11  * Larry Finger <Larry.Finger@lwfinger.net>
12  *
13  *****************************************************************************/
14 
15 /* ************************************************************
16  * include files
17  * *************************************************************/
18 #include "mp_precomp.h"
19 #include "phydm_precomp.h"
20 
odm_edca_turbo_init(void * dm_void)21 void odm_edca_turbo_init(void *dm_void)
22 {
23 	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
24 
25 	dm->dm_edca_table.is_current_turbo_edca = false;
26 	dm->dm_edca_table.is_cur_rdl_state = false;
27 
28 	ODM_RT_TRACE(dm, ODM_COMP_EDCA_TURBO, "Orginial VO PARAM: 0x%x\n",
29 		     odm_read_4byte(dm, ODM_EDCA_VO_PARAM));
30 	ODM_RT_TRACE(dm, ODM_COMP_EDCA_TURBO, "Orginial VI PARAM: 0x%x\n",
31 		     odm_read_4byte(dm, ODM_EDCA_VI_PARAM));
32 	ODM_RT_TRACE(dm, ODM_COMP_EDCA_TURBO, "Orginial BE PARAM: 0x%x\n",
33 		     odm_read_4byte(dm, ODM_EDCA_BE_PARAM));
34 	ODM_RT_TRACE(dm, ODM_COMP_EDCA_TURBO, "Orginial BK PARAM: 0x%x\n",
35 		     odm_read_4byte(dm, ODM_EDCA_BK_PARAM));
36 
37 } /* ODM_InitEdcaTurbo */
38 
odm_edca_turbo_check(void * dm_void)39 void odm_edca_turbo_check(void *dm_void)
40 {
41 	/* For AP/ADSL use struct rtl8192cd_priv* */
42 	/* For CE/NIC use struct void* */
43 
44 	/* 2011/09/29 MH In HW integration first stage, we provide 4 different
45 	 * handle to operate at the same time.
46 	 * In the stage2/3, we need to prive universal interface and merge all
47 	 * HW dynamic mechanism.
48 	 */
49 	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
50 
51 	ODM_RT_TRACE(dm, ODM_COMP_EDCA_TURBO,
52 		     "%s========================>\n", __func__);
53 
54 	if (!(dm->support_ability & ODM_MAC_EDCA_TURBO))
55 		return;
56 
57 	switch (dm->support_platform) {
58 	case ODM_WIN:
59 
60 		break;
61 
62 	case ODM_CE:
63 		odm_edca_turbo_check_ce(dm);
64 		break;
65 	}
66 	ODM_RT_TRACE(dm, ODM_COMP_EDCA_TURBO,
67 		     "<========================%s\n", __func__);
68 
69 } /* odm_CheckEdcaTurbo */
70 
odm_edca_turbo_check_ce(void * dm_void)71 void odm_edca_turbo_check_ce(void *dm_void)
72 {
73 	struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
74 	struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
75 	u64 cur_txok_cnt = 0;
76 	u64 cur_rxok_cnt = 0;
77 	u32 edca_be_ul = 0x5ea42b;
78 	u32 edca_be_dl = 0x5ea42b;
79 	u32 edca_be = 0x5ea42b;
80 	bool is_cur_rdlstate;
81 	bool edca_turbo_on = false;
82 
83 	if (dm->wifi_test)
84 		return;
85 
86 	if (!dm->is_linked) {
87 		rtlpriv->dm.is_any_nonbepkts = false;
88 		return;
89 	}
90 
91 	if (rtlpriv->dm.dbginfo.num_non_be_pkt > 0x100)
92 		rtlpriv->dm.is_any_nonbepkts = true;
93 	rtlpriv->dm.dbginfo.num_non_be_pkt = 0;
94 
95 	cur_txok_cnt = rtlpriv->stats.txbytesunicast_inperiod;
96 	cur_rxok_cnt = rtlpriv->stats.rxbytesunicast_inperiod;
97 
98 	/*b_bias_on_rx = false;*/
99 	edca_turbo_on = ((!rtlpriv->dm.is_any_nonbepkts) &&
100 			 (!rtlpriv->dm.disable_framebursting)) ?
101 				true :
102 				false;
103 
104 	if (rtlpriv->mac80211.mode == WIRELESS_MODE_B)
105 		goto label_exit;
106 
107 	if (edca_turbo_on) {
108 		is_cur_rdlstate =
109 			(cur_rxok_cnt > cur_txok_cnt * 4) ? true : false;
110 
111 		edca_be = is_cur_rdlstate ? edca_be_dl : edca_be_ul;
112 		rtl_write_dword(rtlpriv, REG_EDCA_BE_PARAM_8822B, edca_be);
113 		rtlpriv->dm.is_cur_rdlstate = is_cur_rdlstate;
114 		rtlpriv->dm.current_turbo_edca = true;
115 	} else {
116 		if (rtlpriv->dm.current_turbo_edca) {
117 			u8 tmp = AC0_BE;
118 
119 			rtlpriv->cfg->ops->set_hw_reg(rtlpriv->hw,
120 						      HW_VAR_AC_PARAM,
121 						      (u8 *)(&tmp));
122 			rtlpriv->dm.current_turbo_edca = false;
123 		}
124 	}
125 
126 label_exit:
127 	rtlpriv->dm.is_any_nonbepkts = false;
128 }
129