]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/staging/rtl8723bs/hal/rtl8723b_dm.c
staging: Add rtl8723bs sdio wifi driver
[karo-tx-linux.git] / drivers / staging / rtl8723bs / hal / rtl8723b_dm.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  ******************************************************************************/
15 /*  Description: */
16 /*  This file is for 92CE/92CU dynamic mechanism only */
17
18 #define _RTL8723B_DM_C_
19
20 #include <drv_types.h>
21 #include <rtw_debug.h>
22 #include <rtl8723b_hal.h>
23
24 /*  Global var */
25
26 static void dm_CheckStatistics(struct adapter *Adapter)
27 {
28 }
29 /*  */
30 /*  functions */
31 /*  */
32 static void Init_ODM_ComInfo_8723b(struct adapter *Adapter)
33 {
34
35         struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
36         PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
37         struct dm_priv *pdmpriv = &pHalData->dmpriv;
38         u8 cut_ver, fab_ver;
39
40         /*  */
41         /*  Init Value */
42         /*  */
43         memset(pDM_Odm, 0, sizeof(*pDM_Odm));
44
45         pDM_Odm->Adapter = Adapter;
46 #define ODM_CE 0x04
47         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PLATFORM, ODM_CE);
48         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_INTERFACE, RTW_SDIO);
49         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PACKAGE_TYPE, pHalData->PackageType);
50         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8723B);
51
52         fab_ver = ODM_TSMC;
53         cut_ver = ODM_CUT_A;
54
55         DBG_871X("%s(): fab_ver =%d cut_ver =%d\n", __func__, fab_ver, cut_ver);
56         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_FAB_VER, fab_ver);
57         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_CUT_VER, cut_ver);
58         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP, IS_NORMAL_CHIP(pHalData->VersionID));
59
60         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID);
61         /*      ODM_CMNINFO_BINHCT_TEST only for MP Team */
62         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, Adapter->registrypriv.wifi_spec);
63
64
65         if (pHalData->rf_type == RF_1T1R) {
66                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T1R);
67         } else if (pHalData->rf_type == RF_2T2R) {
68                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R);
69         } else if (pHalData->rf_type == RF_1T2R) {
70                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T2R);
71         }
72
73         pdmpriv->InitODMFlag = ODM_RF_CALIBRATION|ODM_RF_TX_PWR_TRACK;
74
75         ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
76 }
77
78 static void Update_ODM_ComInfo_8723b(struct adapter *Adapter)
79 {
80         struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
81         struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
82         struct dvobj_priv *dvobj = adapter_to_dvobj(Adapter);
83         struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter);
84         struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
85         PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
86         struct dm_priv *pdmpriv = &pHalData->dmpriv;
87         int i;
88         u8 zero = 0;
89
90         pdmpriv->InitODMFlag = 0
91                 | ODM_BB_DIG
92                 | ODM_BB_RA_MASK
93                 | ODM_BB_DYNAMIC_TXPWR
94                 | ODM_BB_FA_CNT
95                 | ODM_BB_RSSI_MONITOR
96                 | ODM_BB_CCK_PD
97                 | ODM_BB_PWR_SAVE
98                 | ODM_BB_CFO_TRACKING
99                 | ODM_MAC_EDCA_TURBO
100                 | ODM_RF_TX_PWR_TRACK
101                 | ODM_RF_CALIBRATION
102 #ifdef CONFIG_ODM_ADAPTIVITY
103                 | ODM_BB_ADAPTIVITY
104 #endif
105                 ;
106
107         /*  */
108         /*  Pointer reference */
109         /*  */
110         /* ODM_CMNINFO_MAC_PHY_MODE pHalData->MacPhyMode92D */
111         /*      ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MAC_PHY_MODE,&(pDM_Odm->u8_temp)); */
112
113         ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
114
115         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes));
116         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes));
117         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_WM_MODE, &(pmlmeext->cur_wireless_mode));
118         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(pHalData->nCur40MhzPrimeSC));
119         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_MODE, &(Adapter->securitypriv.dot11PrivacyAlgrthm));
120         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BW, &(pHalData->CurrentChannelBW));
121         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_CHNL, &(pHalData->CurrentChannel));
122         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_NET_CLOSED, &(Adapter->net_closed));
123         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MP_MODE, &zero);
124         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BAND, &(pHalData->CurrentBandType));
125         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_IGI_LB, &(pHalData->u1ForcedIgiLb));
126         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate));
127
128         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SCAN, &(pmlmepriv->bScanInProcess));
129         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctrlpriv->bpower_saving));
130
131
132         for (i = 0; i < NUM_STA; i++)
133                 ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL);
134 }
135
136 void rtl8723b_InitHalDm(struct adapter *Adapter)
137 {
138         struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
139         struct dm_priv *pdmpriv = &pHalData->dmpriv;
140         PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
141
142         pdmpriv->DM_Type = DM_Type_ByDriver;
143         pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;
144
145         pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;
146
147         pdmpriv->InitDMFlag = pdmpriv->DMFlag;
148
149         Update_ODM_ComInfo_8723b(Adapter);
150
151         ODM_DMInit(pDM_Odm);
152 }
153
154 void rtl8723b_HalDmWatchDog(struct adapter *Adapter)
155 {
156         bool bFwCurrentInPSMode = false;
157         bool bFwPSAwake = true;
158         u8 hw_init_completed = false;
159         struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
160
161         hw_init_completed = Adapter->hw_init_completed;
162
163         if (hw_init_completed == false)
164                 goto skip_dm;
165
166         bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode;
167         rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
168
169         if (
170                 (hw_init_completed == true) &&
171                 ((!bFwCurrentInPSMode) && bFwPSAwake)
172         ) {
173                 /*  */
174                 /*  Calculate Tx/Rx statistics. */
175                 /*  */
176                 dm_CheckStatistics(Adapter);
177                 rtw_hal_check_rxfifo_full(Adapter);
178         }
179
180         /* ODM */
181         if (hw_init_completed == true) {
182                 u8 bLinked = false;
183                 u8 bsta_state = false;
184                 u8 bBtDisabled = true;
185
186                 if (rtw_linked_check(Adapter)) {
187                         bLinked = true;
188                         if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))
189                                 bsta_state = true;
190                 }
191
192                 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
193                 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_STATION_STATE, bsta_state);
194
195                 /* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */
196
197                 bBtDisabled = rtw_btcoex_IsBtDisabled(Adapter);
198
199                 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, ((bBtDisabled == true)?false:true));
200
201                 ODM_DMWatchdog(&pHalData->odmpriv);
202         }
203
204 skip_dm:
205         return;
206 }
207
208 void rtl8723b_hal_dm_in_lps(struct adapter *padapter)
209 {
210         u32 PWDB_rssi = 0;
211         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
212         struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
213         PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
214         struct sta_priv *pstapriv = &padapter->stapriv;
215         struct sta_info *psta = NULL;
216
217         DBG_871X("%s, RSSI_Min =%d\n", __func__, pDM_Odm->RSSI_Min);
218
219         /* update IGI */
220         ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);
221
222
223         /* set rssi to fw */
224         psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
225         if (psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0)) {
226                 PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16));
227
228                 rtl8723b_set_rssi_cmd(padapter, (u8 *)&PWDB_rssi);
229         }
230
231 }
232
233 void rtl8723b_HalDmWatchDog_in_LPS(struct adapter *Adapter)
234 {
235         u8 bLinked = false;
236         struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
237         struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
238         struct dm_priv *pdmpriv = &pHalData->dmpriv;
239         PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
240         pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
241         struct sta_priv *pstapriv = &Adapter->stapriv;
242         struct sta_info *psta = NULL;
243
244         if (Adapter->hw_init_completed == false)
245                 goto skip_lps_dm;
246
247
248         if (rtw_linked_check(Adapter))
249                 bLinked = true;
250
251         ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
252
253         if (bLinked == false)
254                 goto skip_lps_dm;
255
256         if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
257                 goto skip_lps_dm;
258
259
260         /* ODM_DMWatchdog(&pHalData->odmpriv); */
261         /* Do DIG by RSSI In LPS-32K */
262
263       /* 1 Find MIN-RSSI */
264         psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
265         if (psta == NULL)
266                 goto skip_lps_dm;
267
268         pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
269
270         DBG_871X("CurIGValue =%d, EntryMinUndecoratedSmoothedPWDB = %d\n", pDM_DigTable->CurIGValue, pdmpriv->EntryMinUndecoratedSmoothedPWDB);
271
272         if (pdmpriv->EntryMinUndecoratedSmoothedPWDB <= 0)
273                 goto skip_lps_dm;
274
275         pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
276
277         pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;
278
279         /* if (pDM_DigTable->CurIGValue != pDM_Odm->RSSI_Min) */
280         if (
281                 (pDM_DigTable->CurIGValue > pDM_Odm->RSSI_Min + 5) ||
282                 (pDM_DigTable->CurIGValue < pDM_Odm->RSSI_Min - 5)
283         )
284                 rtw_dm_in_lps_wk_cmd(Adapter);
285
286
287 skip_lps_dm:
288
289         return;
290
291 }
292
293 void rtl8723b_init_dm_priv(struct adapter *Adapter)
294 {
295         struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
296         struct dm_priv *pdmpriv = &pHalData->dmpriv;
297
298         memset(pdmpriv, 0, sizeof(struct dm_priv));
299         Init_ODM_ComInfo_8723b(Adapter);
300 }