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
dm_CheckStatistics(struct adapter * Adapter)18 static void dm_CheckStatistics(struct adapter *Adapter)
19 {
20 }
21 /* */
22 /* functions */
23 /* */
Init_ODM_ComInfo_8723b(struct adapter * Adapter)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
Update_ODM_ComInfo_8723b(struct adapter * Adapter)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_BAND, &(pHalData->CurrentBandType));
113 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_IGI_LB, &(pHalData->u1ForcedIgiLb));
114 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate));
115
116 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SCAN, &(pmlmepriv->bScanInProcess));
117 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctrlpriv->bpower_saving));
118
119
120 for (i = 0; i < NUM_STA; i++)
121 ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL);
122 }
123
rtl8723b_InitHalDm(struct adapter * Adapter)124 void rtl8723b_InitHalDm(struct adapter *Adapter)
125 {
126 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
127 struct dm_priv *pdmpriv = &pHalData->dmpriv;
128 struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
129
130 pdmpriv->DM_Type = DM_Type_ByDriver;
131 pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;
132
133 pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;
134
135 pdmpriv->InitDMFlag = pdmpriv->DMFlag;
136
137 Update_ODM_ComInfo_8723b(Adapter);
138
139 ODM_DMInit(pDM_Odm);
140 }
141
rtl8723b_HalDmWatchDog(struct adapter * Adapter)142 void rtl8723b_HalDmWatchDog(struct adapter *Adapter)
143 {
144 bool fw_current_in_ps_mode = false;
145 bool bFwPSAwake = true;
146 u8 hw_init_completed = false;
147 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
148
149 hw_init_completed = Adapter->hw_init_completed;
150
151 if (hw_init_completed == false)
152 goto skip_dm;
153
154 fw_current_in_ps_mode = adapter_to_pwrctl(Adapter)->fw_current_in_ps_mode;
155 rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
156
157 if (
158 (hw_init_completed == true) &&
159 ((!fw_current_in_ps_mode) && bFwPSAwake)
160 ) {
161 /* */
162 /* Calculate Tx/Rx statistics. */
163 /* */
164 dm_CheckStatistics(Adapter);
165 rtw_hal_check_rxfifo_full(Adapter);
166 }
167
168 /* ODM */
169 if (hw_init_completed == true) {
170 u8 bLinked = false;
171 u8 bsta_state = false;
172 bool bBtDisabled = true;
173
174 if (rtw_linked_check(Adapter)) {
175 bLinked = true;
176 if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))
177 bsta_state = true;
178 }
179
180 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
181 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_STATION_STATE, bsta_state);
182
183 /* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */
184
185 bBtDisabled = hal_btcoex_IsBtDisabled(Adapter);
186
187 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED,
188 !bBtDisabled);
189
190 ODM_DMWatchdog(&pHalData->odmpriv);
191 }
192
193 skip_dm:
194 return;
195 }
196
rtl8723b_hal_dm_in_lps(struct adapter * padapter)197 void rtl8723b_hal_dm_in_lps(struct adapter *padapter)
198 {
199 u32 PWDB_rssi = 0;
200 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
201 struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
202 struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
203 struct sta_priv *pstapriv = &padapter->stapriv;
204 struct sta_info *psta = NULL;
205
206 /* update IGI */
207 ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);
208
209
210 /* set rssi to fw */
211 psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
212 if (psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0)) {
213 PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16));
214
215 rtl8723b_set_rssi_cmd(padapter, (u8 *)&PWDB_rssi);
216 }
217
218 }
219
rtl8723b_HalDmWatchDog_in_LPS(struct adapter * Adapter)220 void rtl8723b_HalDmWatchDog_in_LPS(struct adapter *Adapter)
221 {
222 u8 bLinked = false;
223 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
224 struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
225 struct dm_priv *pdmpriv = &pHalData->dmpriv;
226 struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
227 struct dig_t *pDM_DigTable = &pDM_Odm->DM_DigTable;
228 struct sta_priv *pstapriv = &Adapter->stapriv;
229 struct sta_info *psta = NULL;
230
231 if (Adapter->hw_init_completed == false)
232 goto skip_lps_dm;
233
234
235 if (rtw_linked_check(Adapter))
236 bLinked = true;
237
238 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
239
240 if (bLinked == false)
241 goto skip_lps_dm;
242
243 if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
244 goto skip_lps_dm;
245
246
247 /* ODM_DMWatchdog(&pHalData->odmpriv); */
248 /* Do DIG by RSSI In LPS-32K */
249
250 /* 1 Find MIN-RSSI */
251 psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
252 if (!psta)
253 goto skip_lps_dm;
254
255 pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
256
257 if (pdmpriv->EntryMinUndecoratedSmoothedPWDB <= 0)
258 goto skip_lps_dm;
259
260 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
261
262 pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;
263
264 /* if (pDM_DigTable->CurIGValue != pDM_Odm->RSSI_Min) */
265 if (
266 (pDM_DigTable->CurIGValue > pDM_Odm->RSSI_Min + 5) ||
267 (pDM_DigTable->CurIGValue < pDM_Odm->RSSI_Min - 5)
268 )
269 rtw_dm_in_lps_wk_cmd(Adapter);
270
271
272 skip_lps_dm:
273
274 return;
275
276 }
277
rtl8723b_init_dm_priv(struct adapter * Adapter)278 void rtl8723b_init_dm_priv(struct adapter *Adapter)
279 {
280 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
281 struct dm_priv *pdmpriv = &pHalData->dmpriv;
282
283 memset(pdmpriv, 0, sizeof(struct dm_priv));
284 Init_ODM_ComInfo_8723b(Adapter);
285 }
286