Commit | Line | Data |
---|---|---|
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 */ |
30 | static 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 | /* */ | |
43 | static 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 | ||
84 | static 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 | ||
131 | void 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 | 144 | void 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 |
171 | skip_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 | 177 | void 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 | 190 | void 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 | 204 | u8 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 | } |