Merge remote-tracking branch 'staging/staging-next'
[deliverable/linux.git] / drivers / staging / rtl8188eu / hal / rtl8188e_dm.c
CommitLineData
7ef8ded0
LF
1/******************************************************************************
2 *
3 * Copyright(c) 2007 - 2011 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 *
7ef8ded0
LF
14 ******************************************************************************/
15/* */
16/* Description: */
17/* */
18/* This file is for 92CE/92CU dynamic mechanism only */
19/* */
20/* */
21/* */
22#define _RTL8188E_DM_C_
23
24#include <osdep_service.h>
25#include <drv_types.h>
26
27#include <rtl8188e_hal.h>
28
7ef8ded0
LF
29/* Initialize GPIO setting registers */
30static void dm_InitGPIOSetting(struct adapter *Adapter)
31{
32 u8 tmp1byte;
33
c7b2e995 34 tmp1byte = usb_read8(Adapter, REG_GPIO_MUXCFG);
7ef8ded0
LF
35 tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT);
36
e76484d0 37 usb_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte);
7ef8ded0
LF
38}
39
40/* */
41/* functions */
42/* */
43static void Init_ODM_ComInfo_88E(struct adapter *Adapter)
44{
45 struct hal_data_8188e *hal_data = GET_HAL_DATA(Adapter);
46 struct dm_priv *pdmpriv = &hal_data->dmpriv;
47 struct odm_dm_struct *dm_odm = &(hal_data->odmpriv);
fd50e119 48 u8 cut_ver;
7ef8ded0
LF
49
50 /* Init Value */
1ce39848 51 memset(dm_odm, 0, sizeof(*dm_odm));
7ef8ded0
LF
52
53 dm_odm->Adapter = Adapter;
54
55 ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_PLATFORM, ODM_CE);
56
7ef8ded0
LF
57 ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8188E);
58
7ef8ded0
LF
59 cut_ver = ODM_CUT_A;
60
7ef8ded0
LF
61 ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_CUT_VER, cut_ver);
62
940f90ea 63 ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_MP_TEST_CHIP, hal_data->VersionID.ChipType == NORMAL_CHIP ? true : false);
7ef8ded0
LF
64
65 ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_PATCH_ID, hal_data->CustomerID);
66 ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_BWIFI_TEST, Adapter->registrypriv.wifi_spec);
67
68
69 if (hal_data->rf_type == RF_1T1R)
70 ODM_CmnInfoUpdate(dm_odm, ODM_CMNINFO_RF_TYPE, ODM_1T1R);
71 else if (hal_data->rf_type == RF_2T2R)
72 ODM_CmnInfoUpdate(dm_odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R);
73 else if (hal_data->rf_type == RF_1T2R)
74 ODM_CmnInfoUpdate(dm_odm, ODM_CMNINFO_RF_TYPE, ODM_1T2R);
75
76 ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_RF_ANTENNA_TYPE, hal_data->TRxAntDivType);
77
78 pdmpriv->InitODMFlag = ODM_RF_CALIBRATION |
79 ODM_RF_TX_PWR_TRACK;
80
81 ODM_CmnInfoUpdate(dm_odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
82}
83
84static void Update_ODM_ComInfo_88E(struct adapter *Adapter)
85{
86 struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
87 struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
88 struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv;
89 struct hal_data_8188e *hal_data = GET_HAL_DATA(Adapter);
90 struct odm_dm_struct *dm_odm = &(hal_data->odmpriv);
91 struct dm_priv *pdmpriv = &hal_data->dmpriv;
92 int i;
93
94 pdmpriv->InitODMFlag = ODM_BB_DIG |
95 ODM_BB_RA_MASK |
96 ODM_BB_DYNAMIC_TXPWR |
97 ODM_BB_FA_CNT |
98 ODM_BB_RSSI_MONITOR |
99 ODM_BB_CCK_PD |
100 ODM_BB_PWR_SAVE |
101 ODM_MAC_EDCA_TURBO |
102 ODM_RF_CALIBRATION |
103 ODM_RF_TX_PWR_TRACK;
104 if (hal_data->AntDivCfg)
105 pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV;
106
107 if (Adapter->registrypriv.mp_mode == 1) {
108 pdmpriv->InitODMFlag = ODM_RF_CALIBRATION |
109 ODM_RF_TX_PWR_TRACK;
110 }
111
112 ODM_CmnInfoUpdate(dm_odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
113
114 ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_TX_UNI, &(Adapter->xmitpriv.tx_bytes));
115 ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_RX_UNI, &(Adapter->recvpriv.rx_bytes));
116 ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_WM_MODE, &(pmlmeext->cur_wireless_mode));
117 ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(hal_data->nCur40MhzPrimeSC));
118 ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_SEC_MODE, &(Adapter->securitypriv.dot11PrivacyAlgrthm));
119 ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_BW, &(hal_data->CurrentChannelBW));
120 ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_CHNL, &(hal_data->CurrentChannel));
121 ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_NET_CLOSED, &(Adapter->net_closed));
122 ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_MP_MODE, &(Adapter->registrypriv.mp_mode));
123 ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_SCAN, &(pmlmepriv->bScanInProcess));
124 ODM_CmnInfoHook(dm_odm, ODM_CMNINFO_POWER_SAVING, &(pwrctrlpriv->bpower_saving));
125 ODM_CmnInfoInit(dm_odm, ODM_CMNINFO_RF_ANTENNA_TYPE, hal_data->TRxAntDivType);
126
127 for (i = 0; i < NUM_STA; i++)
128 ODM_CmnInfoPtrArrayHook(dm_odm, ODM_CMNINFO_STA_STATUS, i, NULL);
129}
130
131void rtl8188e_InitHalDm(struct adapter *Adapter)
132{
133 struct hal_data_8188e *hal_data = GET_HAL_DATA(Adapter);
134 struct dm_priv *pdmpriv = &hal_data->dmpriv;
135 struct odm_dm_struct *dm_odm = &(hal_data->odmpriv);
136
137 dm_InitGPIOSetting(Adapter);
138 pdmpriv->DM_Type = DM_Type_ByDriver;
139 pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;
140 Update_ODM_ComInfo_88E(Adapter);
141 ODM_DMInit(dm_odm);
7ef8ded0
LF
142}
143
66fa5a46 144void rtw_hal_dm_watchdog(struct adapter *Adapter)
7ef8ded0 145{
7ef8ded0
LF
146 u8 hw_init_completed = false;
147 struct hal_data_8188e *hal_data = GET_HAL_DATA(Adapter);
d48037f9
SM
148 struct mlme_priv *pmlmepriv = NULL;
149 u8 bLinked = false;
7ef8ded0 150
7ef8ded0
LF
151 hw_init_completed = Adapter->hw_init_completed;
152
153 if (!hw_init_completed)
154 goto skip_dm;
155
7ef8ded0 156 /* ODM */
d48037f9
SM
157 pmlmepriv = &Adapter->mlmepriv;
158
159 if ((check_fwstate(pmlmepriv, WIFI_AP_STATE)) ||
160 (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE |
161 WIFI_ADHOC_MASTER_STATE))) {
162 if (Adapter->stapriv.asoc_sta_count > 2)
163 bLinked = true;
164 } else {/* Station mode */
165 if (check_fwstate(pmlmepriv, _FW_LINKED))
166 bLinked = true;
7ef8ded0 167 }
d48037f9
SM
168
169 ODM_CmnInfoUpdate(&hal_data->odmpriv, ODM_CMNINFO_LINK, bLinked);
170 ODM_DMWatchdog(&hal_data->odmpriv);
7ef8ded0
LF
171skip_dm:
172 /* Check GPIO to determine current RF on/off and Pbc status. */
173 /* Check Hardware Radio ON/OFF or not */
174 return;
175}
176
a5c25874 177void rtw_hal_dm_init(struct adapter *Adapter)
7ef8ded0
LF
178{
179 struct hal_data_8188e *hal_data = GET_HAL_DATA(Adapter);
180 struct dm_priv *pdmpriv = &hal_data->dmpriv;
181 struct odm_dm_struct *podmpriv = &hal_data->odmpriv;
182
1ce39848 183 memset(pdmpriv, 0, sizeof(struct dm_priv));
7ef8ded0
LF
184 Init_ODM_ComInfo_88E(Adapter);
185 ODM_InitDebugSetting(podmpriv);
186}
187
7ef8ded0
LF
188/* Add new function to reset the state of antenna diversity before link. */
189/* Compare RSSI for deciding antenna */
2865af35 190void rtw_hal_antdiv_rssi_compared(struct adapter *Adapter, struct wlan_bssid_ex *dst, struct wlan_bssid_ex *src)
7ef8ded0
LF
191{
192 struct hal_data_8188e *hal_data = GET_HAL_DATA(Adapter);
193
194 if (0 != hal_data->AntDivCfg) {
195 /* select optimum_antenna for before linked =>For antenna diversity */
196 if (dst->Rssi >= src->Rssi) {/* keep org parameter */
197 src->Rssi = dst->Rssi;
198 src->PhyInfo.Optimum_antenna = dst->PhyInfo.Optimum_antenna;
199 }
200 }
201}
202
203/* Add new function to reset the state of antenna diversity before link. */
1e24579b 204u8 rtw_hal_antdiv_before_linked(struct adapter *Adapter)
7ef8ded0
LF
205{
206 struct hal_data_8188e *hal_data = GET_HAL_DATA(Adapter);
207 struct odm_dm_struct *dm_odm = &hal_data->odmpriv;
208 struct sw_ant_switch *dm_swat_tbl = &dm_odm->DM_SWAT_Table;
209 struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
210
211 /* Condition that does not need to use antenna diversity. */
212 if (hal_data->AntDivCfg == 0)
213 return false;
214
215 if (check_fwstate(pmlmepriv, _FW_LINKED))
216 return false;
217
218 if (dm_swat_tbl->SWAS_NoLink_State == 0) {
219 /* switch channel */
220 dm_swat_tbl->SWAS_NoLink_State = 1;
221 dm_swat_tbl->CurAntenna = (dm_swat_tbl->CurAntenna == Antenna_A) ? Antenna_B : Antenna_A;
222
223 rtw_antenna_select_cmd(Adapter, dm_swat_tbl->CurAntenna, false);
224 return true;
225 } else {
226 dm_swat_tbl->SWAS_NoLink_State = 0;
227 return false;
228 }
229}
This page took 0.38282 seconds and 5 git commands to generate.