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