1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
5  *
6  ******************************************************************************/
7 /*  Description: */
8 /*  This file is for 92CE/92CU dynamic mechanism only */
9 
10 #define _RTL8723B_DM_C_
11 
12 #include <drv_types.h>
13 #include <rtw_debug.h>
14 #include <rtl8723b_hal.h>
15 
16 /*  Global var */
17 
18 static void dm_CheckStatistics(struct adapter *Adapter)
19 {
20 }
21 /*  */
22 /*  functions */
23 /*  */
24 static void Init_ODM_ComInfo_8723b(struct adapter *Adapter)
25 {
26 
27 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
28 	struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
29 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
30 	u8 cut_ver, fab_ver;
31 
32 	/*  */
33 	/*  Init Value */
34 	/*  */
35 	memset(pDM_Odm, 0, sizeof(*pDM_Odm));
36 
37 	pDM_Odm->Adapter = Adapter;
38 #define ODM_CE 0x04
39 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PLATFORM, ODM_CE);
40 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_INTERFACE, RTW_SDIO);
41 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PACKAGE_TYPE, pHalData->PackageType);
42 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8723B);
43 
44 	fab_ver = ODM_TSMC;
45 	cut_ver = ODM_CUT_A;
46 
47 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_FAB_VER, fab_ver);
48 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_CUT_VER, cut_ver);
49 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP, IS_NORMAL_CHIP(pHalData->VersionID));
50 
51 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID);
52 	/* 	ODM_CMNINFO_BINHCT_TEST only for MP Team */
53 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, Adapter->registrypriv.wifi_spec);
54 
55 
56 	if (pHalData->rf_type == RF_1T1R) {
57 		ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T1R);
58 	} else if (pHalData->rf_type == RF_2T2R) {
59 		ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R);
60 	} else if (pHalData->rf_type == RF_1T2R) {
61 		ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T2R);
62 	}
63 
64 	pdmpriv->InitODMFlag = ODM_RF_CALIBRATION|ODM_RF_TX_PWR_TRACK;
65 
66 	ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
67 }
68 
69 static void Update_ODM_ComInfo_8723b(struct adapter *Adapter)
70 {
71 	struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
72 	struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
73 	struct dvobj_priv *dvobj = adapter_to_dvobj(Adapter);
74 	struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter);
75 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
76 	struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
77 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
78 	int i;
79 	u8 zero = 0;
80 
81 	pdmpriv->InitODMFlag = 0
82 		| ODM_BB_DIG
83 		| ODM_BB_RA_MASK
84 		| ODM_BB_DYNAMIC_TXPWR
85 		| ODM_BB_FA_CNT
86 		| ODM_BB_RSSI_MONITOR
87 		| ODM_BB_CCK_PD
88 		| ODM_BB_PWR_SAVE
89 		| ODM_BB_CFO_TRACKING
90 		| ODM_MAC_EDCA_TURBO
91 		| ODM_RF_TX_PWR_TRACK
92 		| ODM_RF_CALIBRATION
93 		;
94 
95 	/*  */
96 	/*  Pointer reference */
97 	/*  */
98 	/* ODM_CMNINFO_MAC_PHY_MODE pHalData->MacPhyMode92D */
99 	/* 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MAC_PHY_MODE,&(pDM_Odm->u8_temp)); */
100 
101 	ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
102 
103 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes));
104 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes));
105 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_WM_MODE, &(pmlmeext->cur_wireless_mode));
106 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(pHalData->nCur40MhzPrimeSC));
107 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_MODE, &(Adapter->securitypriv.dot11PrivacyAlgrthm));
108 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BW, &(pHalData->CurrentChannelBW));
109 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_CHNL, &(pHalData->CurrentChannel));
110 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_NET_CLOSED, &(Adapter->net_closed));
111 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MP_MODE, &zero);
112 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_IGI_LB, &(pHalData->u1ForcedIgiLb));
113 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate));
114 
115 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SCAN, &(pmlmepriv->bScanInProcess));
116 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctrlpriv->bpower_saving));
117 
118 
119 	for (i = 0; i < NUM_STA; i++)
120 		ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL);
121 }
122 
123 void rtl8723b_InitHalDm(struct adapter *Adapter)
124 {
125 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
126 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
127 	struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
128 
129 	pdmpriv->DM_Type = DM_Type_ByDriver;
130 	pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;
131 
132 	pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;
133 
134 	pdmpriv->InitDMFlag = pdmpriv->DMFlag;
135 
136 	Update_ODM_ComInfo_8723b(Adapter);
137 
138 	ODM_DMInit(pDM_Odm);
139 }
140 
141 void rtl8723b_HalDmWatchDog(struct adapter *Adapter)
142 {
143 	bool fw_current_in_ps_mode = false;
144 	bool bFwPSAwake = true;
145 	u8 hw_init_completed = false;
146 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
147 
148 	hw_init_completed = Adapter->hw_init_completed;
149 
150 	if (hw_init_completed == false)
151 		goto skip_dm;
152 
153 	fw_current_in_ps_mode = adapter_to_pwrctl(Adapter)->fw_current_in_ps_mode;
154 	rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
155 
156 	if (
157 		(hw_init_completed == true) &&
158 		((!fw_current_in_ps_mode) && bFwPSAwake)
159 	) {
160 		/*  */
161 		/*  Calculate Tx/Rx statistics. */
162 		/*  */
163 		dm_CheckStatistics(Adapter);
164 		rtw_hal_check_rxfifo_full(Adapter);
165 	}
166 
167 	/* ODM */
168 	if (hw_init_completed == true) {
169 		u8 bLinked = false;
170 		u8 bsta_state = false;
171 		bool bBtDisabled = true;
172 
173 		if (rtw_linked_check(Adapter)) {
174 			bLinked = true;
175 			if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))
176 				bsta_state = true;
177 		}
178 
179 		ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
180 		ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_STATION_STATE, bsta_state);
181 
182 		/* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */
183 
184 		bBtDisabled = hal_btcoex_IsBtDisabled(Adapter);
185 
186 		ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED,
187 				  !bBtDisabled);
188 
189 		ODM_DMWatchdog(&pHalData->odmpriv);
190 	}
191 
192 skip_dm:
193 	return;
194 }
195 
196 void rtl8723b_hal_dm_in_lps(struct adapter *padapter)
197 {
198 	u32 PWDB_rssi = 0;
199 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
200 	struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
201 	struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
202 	struct sta_priv *pstapriv = &padapter->stapriv;
203 	struct sta_info *psta = NULL;
204 
205 	/* update IGI */
206 	ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);
207 
208 
209 	/* set rssi to fw */
210 	psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
211 	if (psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0)) {
212 		PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16));
213 
214 		rtl8723b_set_rssi_cmd(padapter, (u8 *)&PWDB_rssi);
215 	}
216 
217 }
218 
219 void rtl8723b_HalDmWatchDog_in_LPS(struct adapter *Adapter)
220 {
221 	u8 bLinked = false;
222 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
223 	struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
224 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
225 	struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
226 	struct dig_t *pDM_DigTable = &pDM_Odm->DM_DigTable;
227 	struct sta_priv *pstapriv = &Adapter->stapriv;
228 	struct sta_info *psta = NULL;
229 
230 	if (Adapter->hw_init_completed == false)
231 		goto skip_lps_dm;
232 
233 
234 	if (rtw_linked_check(Adapter))
235 		bLinked = true;
236 
237 	ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
238 
239 	if (bLinked == false)
240 		goto skip_lps_dm;
241 
242 	if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
243 		goto skip_lps_dm;
244 
245 
246 	/* ODM_DMWatchdog(&pHalData->odmpriv); */
247 	/* Do DIG by RSSI In LPS-32K */
248 
249       /* 1 Find MIN-RSSI */
250 	psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
251 	if (!psta)
252 		goto skip_lps_dm;
253 
254 	pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
255 
256 	if (pdmpriv->EntryMinUndecoratedSmoothedPWDB <= 0)
257 		goto skip_lps_dm;
258 
259 	pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
260 
261 	pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;
262 
263 	/* if (pDM_DigTable->CurIGValue != pDM_Odm->RSSI_Min) */
264 	if (
265 		(pDM_DigTable->CurIGValue > pDM_Odm->RSSI_Min + 5) ||
266 		(pDM_DigTable->CurIGValue < pDM_Odm->RSSI_Min - 5)
267 	)
268 		rtw_dm_in_lps_wk_cmd(Adapter);
269 
270 
271 skip_lps_dm:
272 
273 	return;
274 
275 }
276 
277 void rtl8723b_init_dm_priv(struct adapter *Adapter)
278 {
279 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
280 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
281 
282 	memset(pdmpriv, 0, sizeof(struct dm_priv));
283 	Init_ODM_ComInfo_8723b(Adapter);
284 }
285