1
2
3
4
5
6
7
8
9
10#include <drv_types.h>
11#include <rtw_debug.h>
12#include <rtl8723b_hal.h>
13
14
15
16static void dm_CheckStatistics(struct adapter *Adapter)
17{
18}
19
20
21
22static 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
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, ODM_CMNINFO_PLATFORM, ODM_CE);
38 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_INTERFACE, RTW_SDIO);
39 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PACKAGE_TYPE, pHalData->PackageType);
40 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8723B);
41
42 fab_ver = ODM_TSMC;
43 cut_ver = ODM_CUT_A;
44
45 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_FAB_VER, fab_ver);
46 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_CUT_VER, cut_ver);
47
48 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID);
49
50 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, Adapter->registrypriv.wifi_spec);
51
52 pdmpriv->InitODMFlag = ODM_RF_CALIBRATION|ODM_RF_TX_PWR_TRACK;
53
54 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
55}
56
57static 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
85
86
87
88
89 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
90
91 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes));
92 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes));
93 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_WM_MODE, &(pmlmeext->cur_wireless_mode));
94 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(pHalData->nCur40MhzPrimeSC));
95 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_MODE, &(Adapter->securitypriv.dot11PrivacyAlgrthm));
96 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BW, &(pHalData->CurrentChannelBW));
97 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_CHNL, &(pHalData->CurrentChannel));
98 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_NET_CLOSED, &(Adapter->net_closed));
99 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MP_MODE, &zero);
100 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_IGI_LB, &(pHalData->u1ForcedIgiLb));
101 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate));
102
103 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SCAN, &(pmlmepriv->bScanInProcess));
104 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctrlpriv->bpower_saving));
105
106
107 for (i = 0; i < NUM_STA; i++)
108 ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL);
109}
110
111void 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
129void 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(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
143
144 if (
145 (hw_init_completed == true) &&
146 ((!fw_current_in_ps_mode) && bFwPSAwake)
147 ) {
148
149
150
151 dm_CheckStatistics(Adapter);
152 rtw_hal_check_rxfifo_full(Adapter);
153 }
154
155
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(Adapter)) {
162 bLinked = true;
163 if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))
164 bsta_state = true;
165 }
166
167 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
168 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_STATION_STATE, bsta_state);
169
170
171
172 bBtDisabled = hal_btcoex_IsBtDisabled(Adapter);
173
174 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED,
175 !bBtDisabled);
176
177 ODM_DMWatchdog(&pHalData->odmpriv);
178 }
179
180skip_dm:
181 return;
182}
183
184void rtl8723b_hal_dm_in_lps(struct adapter *padapter)
185{
186 u32 PWDB_rssi = 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
194 ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);
195
196
197
198 psta = rtw_get_stainfo(pstapriv, 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, (u8 *)&PWDB_rssi);
203 }
204
205}
206
207void 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(Adapter))
223 bLinked = true;
224
225 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, 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
235
236
237
238 psta = rtw_get_stainfo(pstapriv, 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
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(Adapter);
257
258
259skip_lps_dm:
260
261 return;
262
263}
264
265void 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