GNU Linux-libre 4.19.264-gnu1
[releases.git] / drivers / staging / rtl8723bs / hal / rtl8723b_dm.c
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         PDM_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         DBG_871X("%s(): fab_ver =%d cut_ver =%d\n", __func__, fab_ver, cut_ver);
48         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_FAB_VER, fab_ver);
49         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_CUT_VER, cut_ver);
50         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP, IS_NORMAL_CHIP(pHalData->VersionID));
51
52         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID);
53         /*      ODM_CMNINFO_BINHCT_TEST only for MP Team */
54         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, Adapter->registrypriv.wifi_spec);
55
56
57         if (pHalData->rf_type == RF_1T1R) {
58                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T1R);
59         } else if (pHalData->rf_type == RF_2T2R) {
60                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R);
61         } else if (pHalData->rf_type == RF_1T2R) {
62                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T2R);
63         }
64
65         pdmpriv->InitODMFlag = ODM_RF_CALIBRATION|ODM_RF_TX_PWR_TRACK;
66
67         ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
68 }
69
70 static void Update_ODM_ComInfo_8723b(struct adapter *Adapter)
71 {
72         struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
73         struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
74         struct dvobj_priv *dvobj = adapter_to_dvobj(Adapter);
75         struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter);
76         struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
77         PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
78         struct dm_priv *pdmpriv = &pHalData->dmpriv;
79         int i;
80         u8 zero = 0;
81
82         pdmpriv->InitODMFlag = 0
83                 | ODM_BB_DIG
84                 | ODM_BB_RA_MASK
85                 | ODM_BB_DYNAMIC_TXPWR
86                 | ODM_BB_FA_CNT
87                 | ODM_BB_RSSI_MONITOR
88                 | ODM_BB_CCK_PD
89                 | ODM_BB_PWR_SAVE
90                 | ODM_BB_CFO_TRACKING
91                 | ODM_MAC_EDCA_TURBO
92                 | ODM_RF_TX_PWR_TRACK
93                 | ODM_RF_CALIBRATION
94 #ifdef CONFIG_ODM_ADAPTIVITY
95                 | ODM_BB_ADAPTIVITY
96 #endif
97                 ;
98
99         /*  */
100         /*  Pointer reference */
101         /*  */
102         /* ODM_CMNINFO_MAC_PHY_MODE pHalData->MacPhyMode92D */
103         /*      ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MAC_PHY_MODE,&(pDM_Odm->u8_temp)); */
104
105         ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
106
107         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes));
108         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes));
109         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_WM_MODE, &(pmlmeext->cur_wireless_mode));
110         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(pHalData->nCur40MhzPrimeSC));
111         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_MODE, &(Adapter->securitypriv.dot11PrivacyAlgrthm));
112         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BW, &(pHalData->CurrentChannelBW));
113         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_CHNL, &(pHalData->CurrentChannel));
114         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_NET_CLOSED, &(Adapter->net_closed));
115         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MP_MODE, &zero);
116         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BAND, &(pHalData->CurrentBandType));
117         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_IGI_LB, &(pHalData->u1ForcedIgiLb));
118         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate));
119
120         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SCAN, &(pmlmepriv->bScanInProcess));
121         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctrlpriv->bpower_saving));
122
123
124         for (i = 0; i < NUM_STA; i++)
125                 ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL);
126 }
127
128 void rtl8723b_InitHalDm(struct adapter *Adapter)
129 {
130         struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
131         struct dm_priv *pdmpriv = &pHalData->dmpriv;
132         PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
133
134         pdmpriv->DM_Type = DM_Type_ByDriver;
135         pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;
136
137         pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;
138
139         pdmpriv->InitDMFlag = pdmpriv->DMFlag;
140
141         Update_ODM_ComInfo_8723b(Adapter);
142
143         ODM_DMInit(pDM_Odm);
144 }
145
146 void rtl8723b_HalDmWatchDog(struct adapter *Adapter)
147 {
148         bool bFwCurrentInPSMode = false;
149         bool bFwPSAwake = true;
150         u8 hw_init_completed = false;
151         struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
152
153         hw_init_completed = Adapter->hw_init_completed;
154
155         if (hw_init_completed == false)
156                 goto skip_dm;
157
158         bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode;
159         rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
160
161         if (
162                 (hw_init_completed == true) &&
163                 ((!bFwCurrentInPSMode) && bFwPSAwake)
164         ) {
165                 /*  */
166                 /*  Calculate Tx/Rx statistics. */
167                 /*  */
168                 dm_CheckStatistics(Adapter);
169                 rtw_hal_check_rxfifo_full(Adapter);
170         }
171
172         /* ODM */
173         if (hw_init_completed == true) {
174                 u8 bLinked = false;
175                 u8 bsta_state = false;
176                 u8 bBtDisabled = true;
177
178                 if (rtw_linked_check(Adapter)) {
179                         bLinked = true;
180                         if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))
181                                 bsta_state = true;
182                 }
183
184                 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
185                 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_STATION_STATE, bsta_state);
186
187                 /* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */
188
189                 bBtDisabled = rtw_btcoex_IsBtDisabled(Adapter);
190
191                 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, ((bBtDisabled == true)?false:true));
192
193                 ODM_DMWatchdog(&pHalData->odmpriv);
194         }
195
196 skip_dm:
197         return;
198 }
199
200 void rtl8723b_hal_dm_in_lps(struct adapter *padapter)
201 {
202         u32 PWDB_rssi = 0;
203         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
204         struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
205         PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
206         struct sta_priv *pstapriv = &padapter->stapriv;
207         struct sta_info *psta = NULL;
208
209         DBG_871X("%s, RSSI_Min =%d\n", __func__, pDM_Odm->RSSI_Min);
210
211         /* update IGI */
212         ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);
213
214
215         /* set rssi to fw */
216         psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
217         if (psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0)) {
218                 PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16));
219
220                 rtl8723b_set_rssi_cmd(padapter, (u8 *)&PWDB_rssi);
221         }
222
223 }
224
225 void rtl8723b_HalDmWatchDog_in_LPS(struct adapter *Adapter)
226 {
227         u8 bLinked = false;
228         struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
229         struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
230         struct dm_priv *pdmpriv = &pHalData->dmpriv;
231         PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
232         pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
233         struct sta_priv *pstapriv = &Adapter->stapriv;
234         struct sta_info *psta = NULL;
235
236         if (Adapter->hw_init_completed == false)
237                 goto skip_lps_dm;
238
239
240         if (rtw_linked_check(Adapter))
241                 bLinked = true;
242
243         ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
244
245         if (bLinked == false)
246                 goto skip_lps_dm;
247
248         if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
249                 goto skip_lps_dm;
250
251
252         /* ODM_DMWatchdog(&pHalData->odmpriv); */
253         /* Do DIG by RSSI In LPS-32K */
254
255       /* 1 Find MIN-RSSI */
256         psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
257         if (psta == NULL)
258                 goto skip_lps_dm;
259
260         pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
261
262         DBG_871X("CurIGValue =%d, EntryMinUndecoratedSmoothedPWDB = %d\n", pDM_DigTable->CurIGValue, pdmpriv->EntryMinUndecoratedSmoothedPWDB);
263
264         if (pdmpriv->EntryMinUndecoratedSmoothedPWDB <= 0)
265                 goto skip_lps_dm;
266
267         pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
268
269         pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;
270
271         /* if (pDM_DigTable->CurIGValue != pDM_Odm->RSSI_Min) */
272         if (
273                 (pDM_DigTable->CurIGValue > pDM_Odm->RSSI_Min + 5) ||
274                 (pDM_DigTable->CurIGValue < pDM_Odm->RSSI_Min - 5)
275         )
276                 rtw_dm_in_lps_wk_cmd(Adapter);
277
278
279 skip_lps_dm:
280
281         return;
282
283 }
284
285 void rtl8723b_init_dm_priv(struct adapter *Adapter)
286 {
287         struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
288         struct dm_priv *pdmpriv = &pHalData->dmpriv;
289
290         memset(pdmpriv, 0, sizeof(struct dm_priv));
291         Init_ODM_ComInfo_8723b(Adapter);
292 }