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