1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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.
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
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
22 #include <drv_types.h>
23 #include "hal_com_h2c.h"
27 //#define CONFIG_GTK_OL_DBG
29 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
30 char file_path[PATH_LENGTH_MAX];
33 u8 rtw_hal_data_init(_adapter *padapter)
35 if(is_primary_adapter(padapter))
37 padapter->hal_data_sz = sizeof(HAL_DATA_TYPE);
38 padapter->HalData = rtw_zvmalloc(padapter->hal_data_sz);
39 if(padapter->HalData == NULL){
40 DBG_8192C("cant not alloc memory for HAL DATA \n");
47 void rtw_hal_data_deinit(_adapter *padapter)
49 if(is_primary_adapter(padapter))
51 if (padapter->HalData)
53 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
54 phy_free_filebuf(padapter);
56 rtw_vmfree(padapter->HalData, padapter->hal_data_sz);
57 padapter->HalData = NULL;
58 padapter->hal_data_sz = 0;
63 void dump_chip_info(HAL_VERSION ChipVersion)
68 if(IS_81XXC(ChipVersion)){
69 cnt += sprintf((buf+cnt), "Chip Version Info: %s_", IS_92C_SERIAL(ChipVersion)?"CHIP_8192C":"CHIP_8188C");
71 else if(IS_92D(ChipVersion)){
72 cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8192D_");
74 else if(IS_8723_SERIES(ChipVersion)){
75 cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8723A_");
77 else if(IS_8188E(ChipVersion)){
78 cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8188E_");
80 else if(IS_8812_SERIES(ChipVersion)){
81 cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8812_");
83 else if(IS_8192E(ChipVersion)){
84 cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8192E_");
86 else if(IS_8821_SERIES(ChipVersion)){
87 cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8821_");
89 else if(IS_8723B_SERIES(ChipVersion)){
90 cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8723B_");
93 cnt += sprintf((buf+cnt), "%s_", IS_NORMAL_CHIP(ChipVersion)?"Normal_Chip":"Test_Chip");
94 if(IS_CHIP_VENDOR_TSMC(ChipVersion))
95 cnt += sprintf((buf+cnt), "%s_","TSMC");
96 else if(IS_CHIP_VENDOR_UMC(ChipVersion))
97 cnt += sprintf((buf+cnt), "%s_","UMC");
98 else if(IS_CHIP_VENDOR_SMIC(ChipVersion))
99 cnt += sprintf((buf+cnt), "%s_","SMIC");
101 if(IS_A_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "A_CUT_");
102 else if(IS_B_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "B_CUT_");
103 else if(IS_C_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "C_CUT_");
104 else if(IS_D_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "D_CUT_");
105 else if(IS_E_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "E_CUT_");
106 else if(IS_I_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "I_CUT_");
107 else if(IS_J_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "J_CUT_");
108 else if(IS_K_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "K_CUT_");
109 else cnt += sprintf((buf+cnt), "UNKNOWN_CUT(%d)_", ChipVersion.CUTVersion);
111 if(IS_1T1R(ChipVersion)) cnt += sprintf((buf+cnt), "1T1R_");
112 else if(IS_1T2R(ChipVersion)) cnt += sprintf((buf+cnt), "1T2R_");
113 else if(IS_2T2R(ChipVersion)) cnt += sprintf((buf+cnt), "2T2R_");
114 else cnt += sprintf((buf+cnt), "UNKNOWN_RFTYPE(%d)_", ChipVersion.RFType);
116 cnt += sprintf((buf+cnt), "RomVer(%d)\n", ChipVersion.ROMVer);
122 #define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
126 * Use hardware(efuse), driver parameter(registry) and default channel plan
127 * to decide which one should be used.
130 * padapter pointer of adapter
131 * hw_channel_plan channel plan from HW (efuse/eeprom)
132 * BIT[7] software configure mode; 0:Enable, 1:disable
133 * BIT[6:0] Channel Plan
134 * sw_channel_plan channel plan from SW (registry/module param)
135 * def_channel_plan channel plan used when HW/SW both invalid
136 * AutoLoadFail efuse autoload fail or not
139 * Final channel plan decision
143 hal_com_config_channel_plan(
144 IN PADAPTER padapter,
145 IN u8 hw_channel_plan,
146 IN u8 sw_channel_plan,
147 IN u8 def_channel_plan,
148 IN BOOLEAN AutoLoadFail
151 PHAL_DATA_TYPE pHalData;
156 pHalData = GET_HAL_DATA(padapter);
157 pHalData->bDisableSWChannelPlan = _FALSE;
158 chnlPlan = def_channel_plan;
160 if (0xFF == hw_channel_plan)
161 AutoLoadFail = _TRUE;
163 if (_FALSE == AutoLoadFail)
167 hw_chnlPlan = hw_channel_plan & (~EEPROM_CHANNEL_PLAN_BY_HW_MASK);
168 if (rtw_is_channel_plan_valid(hw_chnlPlan))
170 #ifndef CONFIG_SW_CHANNEL_PLAN
171 if (hw_channel_plan & EEPROM_CHANNEL_PLAN_BY_HW_MASK)
172 pHalData->bDisableSWChannelPlan = _TRUE;
173 #endif // !CONFIG_SW_CHANNEL_PLAN
175 chnlPlan = hw_chnlPlan;
179 if ((_FALSE == pHalData->bDisableSWChannelPlan)
180 && rtw_is_channel_plan_valid(sw_channel_plan))
182 chnlPlan = sw_channel_plan;
194 BOOLEAN bLegalChannel = _TRUE;
197 if(IsSupported5G(Adapter->registrypriv.wireless_mode) == _FALSE) {
198 bLegalChannel = _FALSE;
199 DBG_871X("Channel > 14 but wireless_mode do not support 5G\n");
201 } else if ((Channel <= 14) && (Channel >=1)){
202 if(IsSupported24G(Adapter->registrypriv.wireless_mode) == _FALSE) {
203 bLegalChannel = _FALSE;
204 DBG_871X("(Channel <= 14) && (Channel >=1) but wireless_mode do not support 2.4G\n");
207 bLegalChannel = _FALSE;
208 DBG_871X("Channel is Invalid !!!\n");
211 return bLegalChannel;
214 u8 MRateToHwRate(u8 rate)
216 u8 ret = DESC_RATE1M;
220 case MGN_1M: ret = DESC_RATE1M; break;
221 case MGN_2M: ret = DESC_RATE2M; break;
222 case MGN_5_5M: ret = DESC_RATE5_5M; break;
223 case MGN_11M: ret = DESC_RATE11M; break;
224 case MGN_6M: ret = DESC_RATE6M; break;
225 case MGN_9M: ret = DESC_RATE9M; break;
226 case MGN_12M: ret = DESC_RATE12M; break;
227 case MGN_18M: ret = DESC_RATE18M; break;
228 case MGN_24M: ret = DESC_RATE24M; break;
229 case MGN_36M: ret = DESC_RATE36M; break;
230 case MGN_48M: ret = DESC_RATE48M; break;
231 case MGN_54M: ret = DESC_RATE54M; break;
233 case MGN_MCS0: ret = DESC_RATEMCS0; break;
234 case MGN_MCS1: ret = DESC_RATEMCS1; break;
235 case MGN_MCS2: ret = DESC_RATEMCS2; break;
236 case MGN_MCS3: ret = DESC_RATEMCS3; break;
237 case MGN_MCS4: ret = DESC_RATEMCS4; break;
238 case MGN_MCS5: ret = DESC_RATEMCS5; break;
239 case MGN_MCS6: ret = DESC_RATEMCS6; break;
240 case MGN_MCS7: ret = DESC_RATEMCS7; break;
241 case MGN_MCS8: ret = DESC_RATEMCS8; break;
242 case MGN_MCS9: ret = DESC_RATEMCS9; break;
243 case MGN_MCS10: ret = DESC_RATEMCS10; break;
244 case MGN_MCS11: ret = DESC_RATEMCS11; break;
245 case MGN_MCS12: ret = DESC_RATEMCS12; break;
246 case MGN_MCS13: ret = DESC_RATEMCS13; break;
247 case MGN_MCS14: ret = DESC_RATEMCS14; break;
248 case MGN_MCS15: ret = DESC_RATEMCS15; break;
249 case MGN_MCS16: ret = DESC_RATEMCS16; break;
250 case MGN_MCS17: ret = DESC_RATEMCS17; break;
251 case MGN_MCS18: ret = DESC_RATEMCS18; break;
252 case MGN_MCS19: ret = DESC_RATEMCS19; break;
253 case MGN_MCS20: ret = DESC_RATEMCS20; break;
254 case MGN_MCS21: ret = DESC_RATEMCS21; break;
255 case MGN_MCS22: ret = DESC_RATEMCS22; break;
256 case MGN_MCS23: ret = DESC_RATEMCS23; break;
257 case MGN_MCS24: ret = DESC_RATEMCS24; break;
258 case MGN_MCS25: ret = DESC_RATEMCS25; break;
259 case MGN_MCS26: ret = DESC_RATEMCS26; break;
260 case MGN_MCS27: ret = DESC_RATEMCS27; break;
261 case MGN_MCS28: ret = DESC_RATEMCS28; break;
262 case MGN_MCS29: ret = DESC_RATEMCS29; break;
263 case MGN_MCS30: ret = DESC_RATEMCS30; break;
264 case MGN_MCS31: ret = DESC_RATEMCS31; break;
266 case MGN_VHT1SS_MCS0: ret = DESC_RATEVHTSS1MCS0; break;
267 case MGN_VHT1SS_MCS1: ret = DESC_RATEVHTSS1MCS1; break;
268 case MGN_VHT1SS_MCS2: ret = DESC_RATEVHTSS1MCS2; break;
269 case MGN_VHT1SS_MCS3: ret = DESC_RATEVHTSS1MCS3; break;
270 case MGN_VHT1SS_MCS4: ret = DESC_RATEVHTSS1MCS4; break;
271 case MGN_VHT1SS_MCS5: ret = DESC_RATEVHTSS1MCS5; break;
272 case MGN_VHT1SS_MCS6: ret = DESC_RATEVHTSS1MCS6; break;
273 case MGN_VHT1SS_MCS7: ret = DESC_RATEVHTSS1MCS7; break;
274 case MGN_VHT1SS_MCS8: ret = DESC_RATEVHTSS1MCS8; break;
275 case MGN_VHT1SS_MCS9: ret = DESC_RATEVHTSS1MCS9; break;
276 case MGN_VHT2SS_MCS0: ret = DESC_RATEVHTSS2MCS0; break;
277 case MGN_VHT2SS_MCS1: ret = DESC_RATEVHTSS2MCS1; break;
278 case MGN_VHT2SS_MCS2: ret = DESC_RATEVHTSS2MCS2; break;
279 case MGN_VHT2SS_MCS3: ret = DESC_RATEVHTSS2MCS3; break;
280 case MGN_VHT2SS_MCS4: ret = DESC_RATEVHTSS2MCS4; break;
281 case MGN_VHT2SS_MCS5: ret = DESC_RATEVHTSS2MCS5; break;
282 case MGN_VHT2SS_MCS6: ret = DESC_RATEVHTSS2MCS6; break;
283 case MGN_VHT2SS_MCS7: ret = DESC_RATEVHTSS2MCS7; break;
284 case MGN_VHT2SS_MCS8: ret = DESC_RATEVHTSS2MCS8; break;
285 case MGN_VHT2SS_MCS9: ret = DESC_RATEVHTSS2MCS9; break;
286 case MGN_VHT3SS_MCS0: ret = DESC_RATEVHTSS3MCS0; break;
287 case MGN_VHT3SS_MCS1: ret = DESC_RATEVHTSS3MCS1; break;
288 case MGN_VHT3SS_MCS2: ret = DESC_RATEVHTSS3MCS2; break;
289 case MGN_VHT3SS_MCS3: ret = DESC_RATEVHTSS3MCS3; break;
290 case MGN_VHT3SS_MCS4: ret = DESC_RATEVHTSS3MCS4; break;
291 case MGN_VHT3SS_MCS5: ret = DESC_RATEVHTSS3MCS5; break;
292 case MGN_VHT3SS_MCS6: ret = DESC_RATEVHTSS3MCS6; break;
293 case MGN_VHT3SS_MCS7: ret = DESC_RATEVHTSS3MCS7; break;
294 case MGN_VHT3SS_MCS8: ret = DESC_RATEVHTSS3MCS8; break;
295 case MGN_VHT3SS_MCS9: ret = DESC_RATEVHTSS3MCS9; break;
296 case MGN_VHT4SS_MCS0: ret = DESC_RATEVHTSS4MCS0; break;
297 case MGN_VHT4SS_MCS1: ret = DESC_RATEVHTSS4MCS1; break;
298 case MGN_VHT4SS_MCS2: ret = DESC_RATEVHTSS4MCS2; break;
299 case MGN_VHT4SS_MCS3: ret = DESC_RATEVHTSS4MCS3; break;
300 case MGN_VHT4SS_MCS4: ret = DESC_RATEVHTSS4MCS4; break;
301 case MGN_VHT4SS_MCS5: ret = DESC_RATEVHTSS4MCS5; break;
302 case MGN_VHT4SS_MCS6: ret = DESC_RATEVHTSS4MCS6; break;
303 case MGN_VHT4SS_MCS7: ret = DESC_RATEVHTSS4MCS7; break;
304 case MGN_VHT4SS_MCS8: ret = DESC_RATEVHTSS4MCS8; break;
305 case MGN_VHT4SS_MCS9: ret = DESC_RATEVHTSS4MCS9; break;
312 u8 HwRateToMRate(u8 rate)
314 u8 ret_rate = MGN_1M;
319 case DESC_RATE1M: ret_rate = MGN_1M; break;
320 case DESC_RATE2M: ret_rate = MGN_2M; break;
321 case DESC_RATE5_5M: ret_rate = MGN_5_5M; break;
322 case DESC_RATE11M: ret_rate = MGN_11M; break;
323 case DESC_RATE6M: ret_rate = MGN_6M; break;
324 case DESC_RATE9M: ret_rate = MGN_9M; break;
325 case DESC_RATE12M: ret_rate = MGN_12M; break;
326 case DESC_RATE18M: ret_rate = MGN_18M; break;
327 case DESC_RATE24M: ret_rate = MGN_24M; break;
328 case DESC_RATE36M: ret_rate = MGN_36M; break;
329 case DESC_RATE48M: ret_rate = MGN_48M; break;
330 case DESC_RATE54M: ret_rate = MGN_54M; break;
331 case DESC_RATEMCS0: ret_rate = MGN_MCS0; break;
332 case DESC_RATEMCS1: ret_rate = MGN_MCS1; break;
333 case DESC_RATEMCS2: ret_rate = MGN_MCS2; break;
334 case DESC_RATEMCS3: ret_rate = MGN_MCS3; break;
335 case DESC_RATEMCS4: ret_rate = MGN_MCS4; break;
336 case DESC_RATEMCS5: ret_rate = MGN_MCS5; break;
337 case DESC_RATEMCS6: ret_rate = MGN_MCS6; break;
338 case DESC_RATEMCS7: ret_rate = MGN_MCS7; break;
339 case DESC_RATEMCS8: ret_rate = MGN_MCS8; break;
340 case DESC_RATEMCS9: ret_rate = MGN_MCS9; break;
341 case DESC_RATEMCS10: ret_rate = MGN_MCS10; break;
342 case DESC_RATEMCS11: ret_rate = MGN_MCS11; break;
343 case DESC_RATEMCS12: ret_rate = MGN_MCS12; break;
344 case DESC_RATEMCS13: ret_rate = MGN_MCS13; break;
345 case DESC_RATEMCS14: ret_rate = MGN_MCS14; break;
346 case DESC_RATEMCS15: ret_rate = MGN_MCS15; break;
347 case DESC_RATEMCS16: ret_rate = MGN_MCS16; break;
348 case DESC_RATEMCS17: ret_rate = MGN_MCS17; break;
349 case DESC_RATEMCS18: ret_rate = MGN_MCS18; break;
350 case DESC_RATEMCS19: ret_rate = MGN_MCS19; break;
351 case DESC_RATEMCS20: ret_rate = MGN_MCS20; break;
352 case DESC_RATEMCS21: ret_rate = MGN_MCS21; break;
353 case DESC_RATEMCS22: ret_rate = MGN_MCS22; break;
354 case DESC_RATEMCS23: ret_rate = MGN_MCS23; break;
355 case DESC_RATEMCS24: ret_rate = MGN_MCS24; break;
356 case DESC_RATEMCS25: ret_rate = MGN_MCS25; break;
357 case DESC_RATEMCS26: ret_rate = MGN_MCS26; break;
358 case DESC_RATEMCS27: ret_rate = MGN_MCS27; break;
359 case DESC_RATEMCS28: ret_rate = MGN_MCS28; break;
360 case DESC_RATEMCS29: ret_rate = MGN_MCS29; break;
361 case DESC_RATEMCS30: ret_rate = MGN_MCS30; break;
362 case DESC_RATEMCS31: ret_rate = MGN_MCS31; break;
363 case DESC_RATEVHTSS1MCS0: ret_rate = MGN_VHT1SS_MCS0; break;
364 case DESC_RATEVHTSS1MCS1: ret_rate = MGN_VHT1SS_MCS1; break;
365 case DESC_RATEVHTSS1MCS2: ret_rate = MGN_VHT1SS_MCS2; break;
366 case DESC_RATEVHTSS1MCS3: ret_rate = MGN_VHT1SS_MCS3; break;
367 case DESC_RATEVHTSS1MCS4: ret_rate = MGN_VHT1SS_MCS4; break;
368 case DESC_RATEVHTSS1MCS5: ret_rate = MGN_VHT1SS_MCS5; break;
369 case DESC_RATEVHTSS1MCS6: ret_rate = MGN_VHT1SS_MCS6; break;
370 case DESC_RATEVHTSS1MCS7: ret_rate = MGN_VHT1SS_MCS7; break;
371 case DESC_RATEVHTSS1MCS8: ret_rate = MGN_VHT1SS_MCS8; break;
372 case DESC_RATEVHTSS1MCS9: ret_rate = MGN_VHT1SS_MCS9; break;
373 case DESC_RATEVHTSS2MCS0: ret_rate = MGN_VHT2SS_MCS0; break;
374 case DESC_RATEVHTSS2MCS1: ret_rate = MGN_VHT2SS_MCS1; break;
375 case DESC_RATEVHTSS2MCS2: ret_rate = MGN_VHT2SS_MCS2; break;
376 case DESC_RATEVHTSS2MCS3: ret_rate = MGN_VHT2SS_MCS3; break;
377 case DESC_RATEVHTSS2MCS4: ret_rate = MGN_VHT2SS_MCS4; break;
378 case DESC_RATEVHTSS2MCS5: ret_rate = MGN_VHT2SS_MCS5; break;
379 case DESC_RATEVHTSS2MCS6: ret_rate = MGN_VHT2SS_MCS6; break;
380 case DESC_RATEVHTSS2MCS7: ret_rate = MGN_VHT2SS_MCS7; break;
381 case DESC_RATEVHTSS2MCS8: ret_rate = MGN_VHT2SS_MCS8; break;
382 case DESC_RATEVHTSS2MCS9: ret_rate = MGN_VHT2SS_MCS9; break;
383 case DESC_RATEVHTSS3MCS0: ret_rate = MGN_VHT3SS_MCS0; break;
384 case DESC_RATEVHTSS3MCS1: ret_rate = MGN_VHT3SS_MCS1; break;
385 case DESC_RATEVHTSS3MCS2: ret_rate = MGN_VHT3SS_MCS2; break;
386 case DESC_RATEVHTSS3MCS3: ret_rate = MGN_VHT3SS_MCS3; break;
387 case DESC_RATEVHTSS3MCS4: ret_rate = MGN_VHT3SS_MCS4; break;
388 case DESC_RATEVHTSS3MCS5: ret_rate = MGN_VHT3SS_MCS5; break;
389 case DESC_RATEVHTSS3MCS6: ret_rate = MGN_VHT3SS_MCS6; break;
390 case DESC_RATEVHTSS3MCS7: ret_rate = MGN_VHT3SS_MCS7; break;
391 case DESC_RATEVHTSS3MCS8: ret_rate = MGN_VHT3SS_MCS8; break;
392 case DESC_RATEVHTSS3MCS9: ret_rate = MGN_VHT3SS_MCS9; break;
393 case DESC_RATEVHTSS4MCS0: ret_rate = MGN_VHT4SS_MCS0; break;
394 case DESC_RATEVHTSS4MCS1: ret_rate = MGN_VHT4SS_MCS1; break;
395 case DESC_RATEVHTSS4MCS2: ret_rate = MGN_VHT4SS_MCS2; break;
396 case DESC_RATEVHTSS4MCS3: ret_rate = MGN_VHT4SS_MCS3; break;
397 case DESC_RATEVHTSS4MCS4: ret_rate = MGN_VHT4SS_MCS4; break;
398 case DESC_RATEVHTSS4MCS5: ret_rate = MGN_VHT4SS_MCS5; break;
399 case DESC_RATEVHTSS4MCS6: ret_rate = MGN_VHT4SS_MCS6; break;
400 case DESC_RATEVHTSS4MCS7: ret_rate = MGN_VHT4SS_MCS7; break;
401 case DESC_RATEVHTSS4MCS8: ret_rate = MGN_VHT4SS_MCS8; break;
402 case DESC_RATEVHTSS4MCS9: ret_rate = MGN_VHT4SS_MCS9; break;
405 DBG_871X("HwRateToMRate(): Non supported Rate [%x]!!!\n",rate );
417 u8 i, is_brate, brate;
419 for(i=0;i<NDIS_802_11_LENGTH_RATES_EX;i++)
421 is_brate = mBratesOS[i] & IEEE80211_BASIC_RATE_MASK;
422 brate = mBratesOS[i] & 0x7f;
428 case IEEE80211_CCK_RATE_1MB: *pBrateCfg |= RATE_1M; break;
429 case IEEE80211_CCK_RATE_2MB: *pBrateCfg |= RATE_2M; break;
430 case IEEE80211_CCK_RATE_5MB: *pBrateCfg |= RATE_5_5M;break;
431 case IEEE80211_CCK_RATE_11MB: *pBrateCfg |= RATE_11M; break;
432 case IEEE80211_OFDM_RATE_6MB: *pBrateCfg |= RATE_6M; break;
433 case IEEE80211_OFDM_RATE_9MB: *pBrateCfg |= RATE_9M; break;
434 case IEEE80211_OFDM_RATE_12MB: *pBrateCfg |= RATE_12M; break;
435 case IEEE80211_OFDM_RATE_18MB: *pBrateCfg |= RATE_18M; break;
436 case IEEE80211_OFDM_RATE_24MB: *pBrateCfg |= RATE_24M; break;
437 case IEEE80211_OFDM_RATE_36MB: *pBrateCfg |= RATE_36M; break;
438 case IEEE80211_OFDM_RATE_48MB: *pBrateCfg |= RATE_48M; break;
439 case IEEE80211_OFDM_RATE_54MB: *pBrateCfg |= RATE_54M; break;
450 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(pAdapter);
452 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO
453 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];//VI
454 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[0];//BE
455 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];//BK
457 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];//BCN
458 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];//MGT
459 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];//HIGH
460 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];//TXCMD
465 IN PADAPTER pAdapter,
469 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(pAdapter);
473 // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA
474 //{ 0, 1, 0, 1, 0, 0, 0, 0, 0 };
475 //0:ep_0 num, 1:ep_1 num
477 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];//VO
478 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];//VI
479 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];//BE
480 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];//BK
482 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];//BCN
483 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];//MGT
484 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];//HIGH
485 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];//TXCMD
488 else{//typical setting
491 //BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA
492 //{ 1, 1, 0, 0, 0, 0, 0, 0, 0 };
493 //0:ep_0 num, 1:ep_1 num
495 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO
496 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];//VI
497 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];//BE
498 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];//BK
500 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];//BCN
501 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];//MGT
502 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];//HIGH
503 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];//TXCMD
509 static VOID _ThreeOutPipeMapping(
510 IN PADAPTER pAdapter,
514 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(pAdapter);
516 if(bWIFICfg){//for WMM
518 // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA
519 //{ 1, 2, 1, 0, 0, 0, 0, 0, 0 };
522 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO
523 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];//VI
524 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];//BE
525 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];//BK
527 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];//BCN
528 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];//MGT
529 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];//HIGH
530 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];//TXCMD
533 else{//typical setting
536 // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA
537 //{ 2, 2, 1, 0, 0, 0, 0, 0, 0 };
540 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO
541 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];//VI
542 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];//BE
543 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[2];//BK
545 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];//BCN
546 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];//MGT
547 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];//HIGH
548 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];//TXCMD
552 static VOID _FourOutPipeMapping(
553 IN PADAPTER pAdapter,
557 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(pAdapter);
559 if(bWIFICfg){//for WMM
561 // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA
562 //{ 1, 2, 1, 0, 0, 0, 0, 0, 0 };
565 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO
566 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];//VI
567 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];//BE
568 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];//BK
570 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];//BCN
571 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];//MGT
572 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[3];//HIGH
573 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];//TXCMD
576 else{//typical setting
579 // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA
580 //{ 2, 2, 1, 0, 0, 0, 0, 0, 0 };
583 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO
584 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];//VI
585 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];//BE
586 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[2];//BK
588 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];//BCN
589 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];//MGT
590 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[3];//HIGH
591 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];//TXCMD
597 IN PADAPTER pAdapter,
601 struct registry_priv *pregistrypriv = &pAdapter->registrypriv;
603 BOOLEAN bWIFICfg = (pregistrypriv->wifi_spec) ?_TRUE:_FALSE;
605 BOOLEAN result = _TRUE;
610 _TwoOutPipeMapping(pAdapter, bWIFICfg);
614 _ThreeOutPipeMapping(pAdapter, bWIFICfg);
617 _OneOutPipeMapping(pAdapter);
628 void hal_init_macaddr(_adapter *adapter)
630 rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter->eeprompriv.mac_addr);
631 #ifdef CONFIG_CONCURRENT_MODE
632 if (adapter->pbuddy_adapter)
633 rtw_hal_set_hwreg(adapter->pbuddy_adapter, HW_VAR_MAC_ADDR, adapter->pbuddy_adapter->eeprompriv.mac_addr);
637 void rtw_init_hal_com_default_value(PADAPTER Adapter)
639 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
641 pHalData->AntDetection = 1;
646 * Field TRIGGER CONTENT CMD_SEQ CMD_LEN CMD_ID
647 * BITS [127:120] [119:16] [15:8] [7:4] [3:0]
650 void c2h_evt_clear(_adapter *adapter)
652 rtw_write8(adapter, REG_C2HEVT_CLEAR, C2H_EVT_HOST_CLOSE);
655 s32 c2h_evt_read(_adapter *adapter, u8 *buf)
658 struct c2h_evt_hdr *c2h_evt;
665 #if defined(CONFIG_RTL8192C) || defined(CONFIG_RTL8192D) || defined(CONFIG_RTL8723A) || defined (CONFIG_RTL8188E)
667 trigger = rtw_read8(adapter, REG_C2HEVT_CLEAR);
669 if (trigger == C2H_EVT_HOST_CLOSE) {
670 goto exit; /* Not ready */
671 } else if (trigger != C2H_EVT_FW_CLOSE) {
672 goto clear_evt; /* Not a valid value */
675 c2h_evt = (struct c2h_evt_hdr *)buf;
677 _rtw_memset(c2h_evt, 0, 16);
679 *buf = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL);
680 *(buf+1) = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 1);
682 RT_PRINT_DATA(_module_hal_init_c_, _drv_info_, "c2h_evt_read(): ",
683 &c2h_evt , sizeof(c2h_evt));
686 DBG_871X("%s id:%u, len:%u, seq:%u, trigger:0x%02x\n", __func__
687 , c2h_evt->id, c2h_evt->plen, c2h_evt->seq, trigger);
690 /* Read the content */
691 for (i = 0; i < c2h_evt->plen; i++)
692 c2h_evt->payload[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + sizeof(*c2h_evt) + i);
694 RT_PRINT_DATA(_module_hal_init_c_, _drv_info_, "c2h_evt_read(): Command Content:\n",
695 c2h_evt->payload, c2h_evt->plen);
701 * Clear event to notify FW we have read the command.
702 * If this field isn't clear, the FW won't update the next command message.
704 c2h_evt_clear(adapter);
712 * Field TRIGGER CMD_LEN CONTENT CMD_SEQ CMD_ID
713 * BITS [127:120] [119:112] [111:16] [15:8] [7:0]
715 s32 c2h_evt_read_88xx(_adapter *adapter, u8 *buf)
718 struct c2h_evt_hdr_88xx *c2h_evt;
725 #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8192E) || defined(CONFIG_RTL8723B)
727 trigger = rtw_read8(adapter, REG_C2HEVT_CLEAR);
729 if (trigger == C2H_EVT_HOST_CLOSE) {
730 goto exit; /* Not ready */
731 } else if (trigger != C2H_EVT_FW_CLOSE) {
732 goto clear_evt; /* Not a valid value */
735 c2h_evt = (struct c2h_evt_hdr_88xx *)buf;
737 _rtw_memset(c2h_evt, 0, 16);
739 c2h_evt->id = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL);
740 c2h_evt->seq = rtw_read8(adapter, REG_C2HEVT_CMD_SEQ_88XX);
741 c2h_evt->plen = rtw_read8(adapter, REG_C2HEVT_CMD_LEN_88XX);
743 RT_PRINT_DATA(_module_hal_init_c_, _drv_info_, "c2h_evt_read(): ",
744 &c2h_evt , sizeof(c2h_evt));
747 DBG_871X("%s id:%u, len:%u, seq:%u, trigger:0x%02x\n", __func__
748 , c2h_evt->id, c2h_evt->plen, c2h_evt->seq, trigger);
751 /* Read the content */
752 for (i = 0; i < c2h_evt->plen; i++)
753 c2h_evt->payload[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 2 + i);
755 RT_PRINT_DATA(_module_hal_init_c_, _drv_info_, "c2h_evt_read(): Command Content:\n",
756 c2h_evt->payload, c2h_evt->plen);
762 * Clear event to notify FW we have read the command.
763 * If this field isn't clear, the FW won't update the next command message.
765 c2h_evt_clear(adapter);
772 u8 rtw_hal_networktype_to_raid(_adapter *adapter, struct sta_info *psta)
774 if(IS_NEW_GENERATION_IC(adapter)){
775 return networktype_to_raid_ex(adapter,psta);
778 return networktype_to_raid(adapter,psta);
782 u8 rtw_get_mgntframe_raid(_adapter *adapter,unsigned char network_type)
786 if(IS_NEW_GENERATION_IC(adapter)){
788 raid = (network_type & WIRELESS_11B) ?RATEID_IDX_B
792 raid = (network_type & WIRELESS_11B) ?RATR_INX_WIRELESS_B
793 :RATR_INX_WIRELESS_G;
798 void rtw_hal_update_sta_rate_mask(PADAPTER padapter, struct sta_info *psta)
800 u8 i, rf_type, limit;
811 for (i=0; i<sizeof(psta->bssrateset); i++)
813 if (psta->bssrateset[i])
814 tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f);
817 #ifdef CONFIG_80211N_HT
818 #ifdef CONFIG_80211AC_VHT
820 if(psta->vhtpriv.vht_option)
822 tx_ra_bitmap |= (rtw_vht_rate_to_bitmap(psta->vhtpriv.vht_mcs_map) << 12);
825 #endif //CONFIG_80211AC_VHT
828 if(psta->htpriv.ht_option)
830 rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
831 if(rf_type == RF_2T2R)
836 for (i=0; i<limit; i++) {
837 if (psta->htpriv.ht_cap.supp_mcs_set[i/8] & BIT(i%8))
838 tx_ra_bitmap |= BIT(i+12);
842 #endif //CONFIG_80211N_HT
844 psta->ra_mask = tx_ra_bitmap;
845 psta->init_rate = get_highest_rate_idx(tx_ra_bitmap)&0x3f;
848 void hw_var_port_switch(_adapter *adapter)
850 #ifdef CONFIG_CONCURRENT_MODE
851 #ifdef CONFIG_RUNTIME_PORT_SWITCH
855 0x551: REG_BCN_CTRL_1
881 msr = rtw_read8(adapter, MSR);
882 bcn_ctrl = rtw_read8(adapter, REG_BCN_CTRL);
883 bcn_ctrl_1 = rtw_read8(adapter, REG_BCN_CTRL_1);
886 atimwnd[i] = rtw_read8(adapter, REG_ATIMWND+i);
888 atimwnd_1[i] = rtw_read8(adapter, REG_ATIMWND_1+i);
891 tsftr[i] = rtw_read8(adapter, REG_TSFTR+i);
893 tsftr_1[i] = rtw_read8(adapter, REG_TSFTR1+i);
896 macid[i] = rtw_read8(adapter, REG_MACID+i);
899 bssid[i] = rtw_read8(adapter, REG_BSSID+i);
902 macid_1[i] = rtw_read8(adapter, REG_MACID1+i);
905 bssid_1[i] = rtw_read8(adapter, REG_BSSID1+i);
907 #ifdef DBG_RUNTIME_PORT_SWITCH
908 DBG_871X(FUNC_ADPT_FMT" before switch\n"
911 "bcn_ctrl_1:0x%02x\n"
918 "macid_1:"MAC_FMT"\n"
919 "bssid_1:"MAC_FMT"\n"
920 , FUNC_ADPT_ARG(adapter)
933 #endif /* DBG_RUNTIME_PORT_SWITCH */
935 /* disable bcn function, disable update TSF */
936 rtw_write8(adapter, REG_BCN_CTRL, (bcn_ctrl & (~EN_BCN_FUNCTION)) | DIS_TSF_UDT);
937 rtw_write8(adapter, REG_BCN_CTRL_1, (bcn_ctrl_1 & (~EN_BCN_FUNCTION)) | DIS_TSF_UDT);
940 msr = (msr&0xf0) |((msr&0x03) << 2) | ((msr&0x0c) >> 2);
941 rtw_write8(adapter, MSR, msr);
944 rtw_write8(adapter, REG_BCN_CTRL, bcn_ctrl_1 & ~EN_BCN_FUNCTION);
946 rtw_write8(adapter, REG_ATIMWND+i, atimwnd_1[i]);
948 rtw_write8(adapter, REG_TSFTR+i, tsftr_1[i]);
950 rtw_write8(adapter, REG_MACID+i, macid_1[i]);
952 rtw_write8(adapter, REG_BSSID+i, bssid_1[i]);
955 rtw_write8(adapter, REG_BCN_CTRL_1, bcn_ctrl & ~EN_BCN_FUNCTION);
957 rtw_write8(adapter, REG_ATIMWND_1+1, atimwnd[i]);
959 rtw_write8(adapter, REG_TSFTR1+i, tsftr[i]);
961 rtw_write8(adapter, REG_MACID1+i, macid[i]);
963 rtw_write8(adapter, REG_BSSID1+i, bssid[i]);
966 #ifdef CONFIG_BT_COEXIST
967 #if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)
968 // always enable port0 beacon function for PSTDMA
969 bcn_ctrl_1 |= EN_BCN_FUNCTION;
970 // always disable port1 beacon function for PSTDMA
971 bcn_ctrl &= ~EN_BCN_FUNCTION;
974 rtw_write8(adapter, REG_BCN_CTRL, bcn_ctrl_1);
975 rtw_write8(adapter, REG_BCN_CTRL_1, bcn_ctrl);
977 if (adapter->iface_type == IFACE_PORT0) {
978 adapter->iface_type = IFACE_PORT1;
979 adapter->pbuddy_adapter->iface_type = IFACE_PORT0;
980 DBG_871X_LEVEL(_drv_always_, "port switch - port0("ADPT_FMT"), port1("ADPT_FMT")\n",
981 ADPT_ARG(adapter->pbuddy_adapter), ADPT_ARG(adapter));
983 adapter->iface_type = IFACE_PORT0;
984 adapter->pbuddy_adapter->iface_type = IFACE_PORT1;
985 DBG_871X_LEVEL(_drv_always_, "port switch - port0("ADPT_FMT"), port1("ADPT_FMT")\n",
986 ADPT_ARG(adapter), ADPT_ARG(adapter->pbuddy_adapter));
989 #ifdef DBG_RUNTIME_PORT_SWITCH
990 msr = rtw_read8(adapter, MSR);
991 bcn_ctrl = rtw_read8(adapter, REG_BCN_CTRL);
992 bcn_ctrl_1 = rtw_read8(adapter, REG_BCN_CTRL_1);
995 atimwnd[i] = rtw_read8(adapter, REG_ATIMWND+i);
997 atimwnd_1[i] = rtw_read8(adapter, REG_ATIMWND_1+i);
1000 tsftr[i] = rtw_read8(adapter, REG_TSFTR+i);
1002 tsftr_1[i] = rtw_read8(adapter, REG_TSFTR1+i);
1005 macid[i] = rtw_read8(adapter, REG_MACID+i);
1008 bssid[i] = rtw_read8(adapter, REG_BSSID+i);
1011 macid_1[i] = rtw_read8(adapter, REG_MACID1+i);
1014 bssid_1[i] = rtw_read8(adapter, REG_BSSID1+i);
1016 DBG_871X(FUNC_ADPT_FMT" after switch\n"
1019 "bcn_ctrl_1:0x%02x\n"
1026 "macid_1:"MAC_FMT"\n"
1027 "bssid_1:"MAC_FMT"\n"
1028 , FUNC_ADPT_ARG(adapter)
1033 , *((u16*)atimwnd_1)
1041 #endif /* DBG_RUNTIME_PORT_SWITCH */
1043 #endif /* CONFIG_RUNTIME_PORT_SWITCH */
1044 #endif /* CONFIG_CONCURRENT_MODE */
1047 void rtw_hal_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc)
1049 struct hal_ops *pHalFunc = &padapter->HalFunc;
1050 u8 u1H2CRsvdPageParm[H2C_RSVDPAGE_LOC_LEN]={0};
1053 DBG_871X("RsvdPageLoc: ProbeRsp=%d PsPoll=%d Null=%d QoSNull=%d BTNull=%d\n",
1054 rsvdpageloc->LocProbeRsp, rsvdpageloc->LocPsPoll,
1055 rsvdpageloc->LocNullData, rsvdpageloc->LocQosNull,
1056 rsvdpageloc->LocBTQosNull);
1058 SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1H2CRsvdPageParm, rsvdpageloc->LocProbeRsp);
1059 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1H2CRsvdPageParm, rsvdpageloc->LocPsPoll);
1060 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocNullData);
1061 SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocQosNull);
1062 SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocBTQosNull);
1064 if (pHalFunc->fill_h2c_cmd != NULL) {
1065 ret = pHalFunc->fill_h2c_cmd(padapter,
1067 H2C_RSVDPAGE_LOC_LEN,
1070 DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
1075 #ifdef CONFIG_GPIO_WAKEUP
1076 static void rtw_hal_set_output_gpio(_adapter* padapter, u8 index, u8 outputval)
1082 /* config GPIO mode */
1083 rtw_write8(padapter, REG_GPIO_PIN_CTRL + 3,
1084 rtw_read8(padapter, REG_GPIO_PIN_CTRL + 3) & ~BIT(index) );
1086 /* config GPIO Sel */
1089 rtw_write8(padapter, REG_GPIO_PIN_CTRL + 2,
1090 rtw_read8(padapter, REG_GPIO_PIN_CTRL + 2) | BIT(index));
1092 /* set output value */
1094 rtw_write8(padapter, REG_GPIO_PIN_CTRL + 1,
1095 rtw_read8(padapter, REG_GPIO_PIN_CTRL + 1) | BIT(index));
1097 rtw_write8(padapter, REG_GPIO_PIN_CTRL + 1,
1098 rtw_read8(padapter, REG_GPIO_PIN_CTRL + 1) & ~BIT(index));
1100 } else if (index <= 15) {
1102 /* index: 11~8 transform to 3~0 */
1104 /* index: 12~8 transform to 4~0 */
1105 #ifdef CONFIG_RTL8723B
1106 if ((index == 13) || (index == 14)) {
1107 // Set BIT_GPIO13_14_WL_CTRL_EN to 0
1108 val8 = rtw_read8(padapter, 0x4e);
1109 if (val8 & BIT(6)) {
1111 rtw_write8(padapter, 0x4e, val8);
1112 DBG_871X("%s: set GPIO%d to WL control, 0x4E=0x%02X\n",
1113 __FUNCTION__, index, rtw_read8(padapter, 0x4e));
1116 #endif // CONFIG_RTL8723B
1120 /* config GPIO mode */
1121 rtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 3,
1122 rtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 3) & ~BIT(index) );
1124 /* config GPIO Sel */
1127 rtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 2,
1128 rtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 2) | BIT(index));
1130 /* set output value */
1132 rtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 1,
1133 rtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 1) | BIT(index));
1135 rtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 1,
1136 rtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 1) & ~BIT(index));
1139 DBG_871X("%s: invalid GPIO%d=%d\n", __FUNCTION__, index, outputval);
1144 * Set GPIO high/low under init and
1145 * fw will trigger Low/High Pulse when need to wake up host
1147 void rtw_clear_hostwakeupgpio(PADAPTER padapter)
1152 #ifdef CONFIG_GPIO_WAKEUP_LOW_ACTIVE
1154 #endif // CONFIG_GPIO_WAKEUP_LOW_ACTIVE
1155 DBG_871X("%s: Set GPIO%d to %s for wake\n",
1156 __FUNCTION__, WAKEUP_GPIO_IDX, high?"high":"low");
1157 rtw_hal_set_output_gpio(padapter, WAKEUP_GPIO_IDX, high);
1161 void rtw_hal_set_FwAoacRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc)
1163 struct hal_ops *pHalFunc = &padapter->HalFunc;
1164 struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
1165 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1166 u8 res = 0, count = 0, ret = 0;
1167 #ifdef CONFIG_WOWLAN
1168 u8 u1H2CAoacRsvdPageParm[H2C_AOAC_RSVDPAGE_LOC_LEN]={0};
1170 DBG_871X("AOACRsvdPageLoc: RWC=%d ArpRsp=%d NbrAdv=%d GtkRsp=%d GtkInfo=%d ProbeReq=%d NetworkList=%d\n",
1171 rsvdpageloc->LocRemoteCtrlInfo, rsvdpageloc->LocArpRsp,
1172 rsvdpageloc->LocNbrAdv, rsvdpageloc->LocGTKRsp,
1173 rsvdpageloc->LocGTKInfo, rsvdpageloc->LocProbeReq,
1174 rsvdpageloc->LocNetList);
1176 if (check_fwstate(pmlmepriv, _FW_LINKED)) {
1177 SET_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocRemoteCtrlInfo);
1178 SET_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocArpRsp);
1179 //SET_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(u1H2CAoacRsvdPageParm, rsvdpageloc->LocNbrAdv);
1180 SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKRsp);
1181 SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKInfo);
1182 #ifdef CONFIG_GTK_OL
1183 SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKEXTMEM);
1184 #endif // CONFIG_GTK_OL
1185 if (pHalFunc->fill_h2c_cmd != NULL) {
1186 ret = pHalFunc->fill_h2c_cmd(padapter,
1188 H2C_AOAC_RSVDPAGE_LOC_LEN,
1189 u1H2CAoacRsvdPageParm);
1191 DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
1195 #ifdef CONFIG_PNO_SUPPORT
1199 if(!pwrpriv->pno_in_resume) {
1200 DBG_871X("NLO_INFO=%d\n", rsvdpageloc->LocPNOInfo);
1201 _rtw_memset(&u1H2CAoacRsvdPageParm, 0,
1202 sizeof(u1H2CAoacRsvdPageParm));
1203 SET_H2CCMD_AOAC_RSVDPAGE_LOC_NLO_INFO(u1H2CAoacRsvdPageParm,
1204 rsvdpageloc->LocPNOInfo);
1205 if (pHalFunc->fill_h2c_cmd != NULL) {
1206 ret = pHalFunc->fill_h2c_cmd(padapter,
1208 H2C_AOAC_RSVDPAGE_LOC_LEN,
1209 u1H2CAoacRsvdPageParm);
1211 DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
1216 #endif //CONFIG_PNO_SUPPORT
1217 #endif // CONFIG_WOWLAN
1220 #ifdef CONFIG_WOWLAN
1221 // rtw_hal_check_wow_ctrl
1222 // chk_type: _TRUE means to check enable, if 0x690 & bit1, WOW enable successful
1223 // _FALSE means to check disable, if 0x690 & bit1, WOW disable fail
1224 static u8 rtw_hal_check_wow_ctrl(_adapter* adapter, u8 chk_type)
1230 mstatus = rtw_read8(adapter, REG_WOW_CTRL);
1231 DBG_871X_LEVEL(_drv_info_, "%s mstatus:0x%02x\n", __func__, mstatus);
1234 while(!(mstatus&BIT1) && trycnt>1) {
1235 mstatus = rtw_read8(adapter, REG_WOW_CTRL);
1236 DBG_871X_LEVEL(_drv_always_,
1237 "Loop index: %d :0x%02x\n",
1247 while (mstatus&BIT1 && trycnt>1) {
1248 mstatus = rtw_read8(adapter, REG_WOW_CTRL);
1249 DBG_871X_LEVEL(_drv_always_,
1250 "Loop index: %d :0x%02x\n",
1261 DBG_871X_LEVEL(_drv_always_, "%s check_type: %d res: %d trycnt: %d\n",
1262 __func__, chk_type, res, (25 - trycnt));
1266 #ifdef CONFIG_PNO_SUPPORT
1267 static u8 rtw_hal_check_pno_enabled(_adapter* adapter)
1269 struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(adapter);
1270 u8 res = 0, count = 0;
1272 if (ppwrpriv->wowlan_pno_enable && ppwrpriv->pno_in_resume == _FALSE) {
1273 res = rtw_read8(adapter, REG_PNO_STATUS);
1274 while(!(res&BIT(7)) && count < 25) {
1275 DBG_871X("[%d] cmd: 0x81 REG_PNO_STATUS: 0x%02x\n",
1277 res = rtw_read8(adapter, REG_PNO_STATUS);
1285 DBG_871X("cmd: 0x81 REG_PNO_STATUS: ret(%d)\n", ret);
1291 static void rtw_hal_force_enable_rxdma(_adapter* adapter)
1293 DBG_871X("%s: Set 0x690=0x00\n", __func__);
1294 rtw_write8(adapter, REG_WOW_CTRL,
1295 (rtw_read8(adapter, REG_WOW_CTRL)&0xf0));
1296 DBG_871X_LEVEL(_drv_always_, "%s: Release RXDMA\n", __func__);
1297 rtw_write32(adapter, REG_RXPKT_NUM,
1298 (rtw_read32(adapter,REG_RXPKT_NUM)&(~RW_RELEASE_EN)));
1301 static void rtw_hal_disable_tx_report(_adapter* adapter)
1303 rtw_write8(adapter, REG_TX_RPT_CTRL,
1304 ((rtw_read8(adapter, REG_TX_RPT_CTRL)&~BIT(1)))&~BIT(5));
1305 DBG_871X("disable TXRPT:0x%02x\n", rtw_read8(adapter, REG_TX_RPT_CTRL));
1308 static void rtw_hal_enable_tx_report(_adapter* adapter)
1310 rtw_write8(adapter, REG_TX_RPT_CTRL,
1311 ((rtw_read8(adapter, REG_TX_RPT_CTRL)|BIT(1)))|BIT(5));
1312 DBG_871X("enable TX_RPT:0x%02x\n", rtw_read8(adapter, REG_TX_RPT_CTRL));
1315 void rtw_hal_fill_fake_txdesc(_adapter* padapter, u8* pDesc, u32 BufferLen,
1316 u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame)
1319 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1320 struct hal_ops *pHalFunc = &padapter->HalFunc;
1321 struct tx_desc *ptxdesc;
1324 _rtw_memset(pDesc, 0, TXDESC_SIZE);
1326 if (TXDESC_SIZE == 32) {
1327 ptxdesc = (struct tx_desc*)pDesc;
1329 //own, bFirstSeg, bLastSeg;
1331 cpu_to_le32( BIT(31) | BIT(27)| BIT(26));
1333 //32 bytes for TX Desc
1335 cpu_to_le32(((TXDESC_SIZE + 0) << 16)&0x00ff0000);
1337 // Buffer size + command header
1339 cpu_to_le32(BufferLen&0x0000ffff);
1342 // Fixed queue of Mgnt queue
1343 ptxdesc->txdw1 |= cpu_to_le32((QSLT_MGNT<< 8)&0x00001f00);
1345 //Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by Hw.
1347 ptxdesc->txdw1 |= cpu_to_le32(BIT(20));
1349 // Hw set sequence number
1350 ptxdesc->txdw4 |= cpu_to_le32(BIT(7));
1351 //set bit3 to 1. Suugested by TimChen. 2009.12.29.
1352 ptxdesc->txdw3 |= cpu_to_le32((8 <<28));
1355 if (_TRUE == IsBTQosNull) {
1356 ptxdesc->txdw2 |= cpu_to_le32(BIT(23)); // BT NULL
1361 ptxdesc->txdw4 |= cpu_to_le32(BIT(8));
1363 } else if (TXDESC_SIZE == 40) {
1364 SET_TX_DESC_FIRST_SEG(pDesc, 1); //bFirstSeg;
1365 SET_TX_DESC_LAST_SEG(pDesc, 1); //bLastSeg;
1367 SET_TX_DESC_OFFSET(pDesc, TXDESC_SIZE);
1369 SET_TX_DESC_PKT_SIZE(pDesc, BufferLen); // Buffer size + command header
1371 if (pmlmeext->cur_wireless_mode & WIRELESS_11B) {
1372 SET_TX_DESC_RATE_ID(pDesc, RATR_INX_WIRELESS_B);
1374 SET_TX_DESC_RATE_ID(pDesc, RATR_INX_WIRELESS_G);
1377 SET_TX_DESC_QUEUE_SEL(pDesc, QSLT_MGNT); // Fixed queue of Mgnt queue
1379 // Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by Hw.
1380 if (_TRUE == IsPsPoll) {
1381 SET_TX_DESC_NAV_USE_HDR(pDesc, 1);
1383 SET_TX_DESC_HWSEQ_EN(pDesc, 1); // Hw set sequence number
1384 SET_TX_DESC_HWSEQ_SEL(pDesc, 0);
1387 if (_TRUE ==IsBTQosNull) {
1388 SET_TX_DESC_BT_INT(pDesc, 1);
1391 SET_TX_DESC_USE_RATE(pDesc, 1); // use data rate which is set by Sw
1392 SET_TX_DESC_OWN((pu1Byte)pDesc, 1);
1394 SET_TX_DESC_TX_RATE(pDesc, MRateToHwRate(pmlmeext->tx_rate));
1399 // Encrypt the data frame if under security mode excepct null data.
1400 // Suggested by CCW.
1402 if (_TRUE ==bDataFrame)
1406 EncAlg = padapter->securitypriv.dot11PrivacyAlgrthm;
1410 SET_TX_DESC_SEC_TYPE(pDesc, 0x0);
1415 SET_TX_DESC_SEC_TYPE(pDesc, 0x1);
1418 SET_TX_DESC_SEC_TYPE(pDesc, 0x2);
1421 SET_TX_DESC_SEC_TYPE(pDesc, 0x3);
1424 SET_TX_DESC_SEC_TYPE(pDesc, 0x0);
1429 #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
1430 // USB interface drop packet if the checksum of descriptor isn't correct.
1431 // Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.).
1432 if(pHalFunc->hal_cal_txdesc_chksum != NULL)
1433 #if defined(CONFIG_RTL8188E) || defined(CONFIG_RTL8723A) ||defined(CONFIG_RTL8723B)
1434 pHalFunc->hal_cal_txdesc_chksum((struct tx_desc*)pDesc);
1436 pHalFunc->hal_cal_txdesc_chksum(pDesc);
1437 #endif //CONFIG_RTL8188E || CONFIG_RTL8723B
1441 static void rtw_hal_backup_rate(_adapter* adapter)
1443 DBG_871X("%s\n", __func__);
1444 //backup data rate to register 0x8b for wowlan FW
1445 rtw_write8(adapter, 0x8d, 1);
1446 rtw_write8(adapter, 0x8c, 0);
1447 rtw_write8(adapter, 0x8f, 0x40);
1448 rtw_write8(adapter, 0x8b, rtw_read8(adapter, 0x2f0));
1451 static u8 rtw_hal_pause_rx_dma(_adapter* adapter)
1459 DBG_871X_LEVEL(_drv_always_, "Pause DMA\n");
1460 rtw_write32(adapter, REG_RXPKT_NUM,
1461 (rtw_read32(adapter,REG_RXPKT_NUM)|RW_RELEASE_EN));
1463 if((rtw_read32(adapter, REG_RXPKT_NUM)&RXDMA_IDLE)) {
1464 DBG_871X_LEVEL(_drv_always_, "RX_DMA_IDLE is true\n");
1468 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
1470 // If RX_DMA is not idle, receive one pkt from DMA
1471 res = sdio_local_read(adapter,
1472 SDIO_REG_RX0_REQ_LEN, 4, (u8*)&tmp);
1473 len = le16_to_cpu(tmp);
1474 DBG_871X_LEVEL(_drv_always_, "RX len:%d\n", len);
1477 res = RecvOnePkt(adapter, len);
1479 DBG_871X_LEVEL(_drv_always_, "read length fail %d\n", len);
1481 DBG_871X_LEVEL(_drv_always_, "RecvOnePkt Result: %d\n", res);
1483 #endif //CONFIG_SDIO_HCI || CONFIG_GSPI_HCI
1487 DBG_871X_LEVEL(_drv_always_, "Stop RX DMA failed...... \n");
1494 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
1495 static u8 rtw_hal_enable_cpwm2(_adapter* adapter)
1501 DBG_871X_LEVEL(_drv_always_, "%s\n", __func__);
1503 res = sdio_local_read(adapter, SDIO_REG_HIMR, 4, (u8*)&tmp);
1505 DBG_871X_LEVEL(_drv_info_, "read SDIO_REG_HIMR: 0x%08x\n", tmp);
1507 DBG_871X_LEVEL(_drv_info_, "sdio_local_read fail\n");
1509 tmp = SDIO_HIMR_CPWM2_MSK;
1511 res = sdio_local_write(adapter, SDIO_REG_HIMR, 4, (u8*)&tmp);
1514 res = sdio_local_read(adapter, SDIO_REG_HIMR, 4, (u8*)&tmp);
1515 DBG_871X_LEVEL(_drv_info_, "read again SDIO_REG_HIMR: 0x%08x\n", tmp);
1518 DBG_871X_LEVEL(_drv_info_, "sdio_local_write fail\n");
1524 #endif //CONFIG_SDIO_HCI, CONFIG_GSPI_HCI
1526 #ifdef CONFIG_GTK_OL
1527 static void rtw_hal_fw_sync_cam_id(_adapter* adapter)
1529 struct security_priv *psecuritypriv = &adapter->securitypriv;
1530 u8 null_addr[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
1538 addr = get_bssid(&adapter->mlmepriv);
1541 DBG_871X("%s: get bssid MAC addr fail!!\n", __func__);
1546 cam_id = rtw_camid_search(adapter, addr, index);
1548 DBG_871X("%s: cam_id: %d, key_id:%d\n",
1549 __func__, cam_id, index);
1550 } else if (rtw_camid_is_gk(adapter, cam_id) != _TRUE) {
1551 DBG_871X("%s: cam_id: %d key_id(%d) is not GK\n",
1552 __func__, cam_id, index);
1554 read_cam(adapter ,cam_id, get_key);
1555 algorithm = psecuritypriv->dot11PrivacyAlgrthm;
1556 ctrl = BIT(15) | BIT6 |(algorithm << 2) | index;
1557 write_cam(adapter, index, ctrl, addr, get_key);
1559 write_cam(adapter, cam_id, ctrl, null_addr, get_key);
1562 }while(cam_id != -1);
1564 rtw_write8(adapter, REG_SECCFG, 0xcc);
1567 static void rtw_hal_update_gtk_offload_info(_adapter* adapter)
1569 struct security_priv *psecuritypriv = &adapter->securitypriv;
1572 u8 null_addr[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
1580 addr = get_bssid(&adapter->mlmepriv);
1583 DBG_871X("%s: get bssid MAC addr fail!!\n", __func__);
1587 _rtw_memset(null_key, 0, sizeof(null_key));
1589 algorithm = psecuritypriv->dot11PrivacyAlgrthm;
1591 if(psecuritypriv->binstallKCK_KEK == _TRUE) {
1592 //read gtk key index
1593 gtk_keyindex = rtw_read8(adapter, 0x48c);
1596 cam_id = rtw_camid_search(adapter, addr, index);
1598 DBG_871X("%s: cam_id: %d, key_id:%d\n",
1599 __func__, cam_id, index);
1600 } else if (read_phy_cam_is_gtk(adapter, cam_id) ==
1602 DBG_871X("%s: cam_id: %d, key_id:%d is not GK\n",
1603 __func__, cam_id, index);
1604 } else if (cam_id >= 4) {
1605 DBG_871X("%s: cam_id(%d) is not in default key\n",
1608 read_cam(adapter ,cam_id, get_key);
1609 algorithm = psecuritypriv->dot11PrivacyAlgrthm;
1610 ctrl = BIT(15) | BIT6 |(algorithm << 2) | index;
1611 write_cam(adapter, cam_id+4, ctrl,
1614 write_cam(adapter, cam_id, ctrl,
1615 null_addr, get_key);
1618 if (gtk_keyindex < 4 &&(index == gtk_keyindex)) {
1619 psecuritypriv->dot118021XGrpKeyid = gtk_keyindex;
1620 _rtw_memcpy(psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey,
1623 DBG_871X_LEVEL(_drv_always_, "GTK (%d) = 0x%08x, 0x%08x, 0x%08x, 0x%08x\n",
1625 psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].lkey[0],
1626 psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].lkey[1],
1627 psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].lkey[2],
1628 psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].lkey[3]);
1633 rtw_write8(adapter, REG_SECCFG, 0x0c);
1634 #ifdef CONFIG_GTK_OL_DBG
1635 //if (gtk_keyindex != 5)
1636 dump_cam_table(adapter);
1642 static void rtw_hal_update_tx_iv(_adapter* adapter)
1644 struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
1645 u64 iv_low = 0, iv_high = 0;
1648 iv_low = rtw_read32(adapter, REG_TXPKTBUF_IV_LOW);
1649 //only low two bytes is PN, check AES_IV macro for detail
1651 iv_high = rtw_read32(adapter, REG_TXPKTBUF_IV_HIGH);
1652 //get the real packet number
1653 pwrctl->wowlan_fw_iv = iv_high << 16 | iv_low;
1654 DBG_871X_LEVEL(_drv_always_,
1655 "fw_iv: 0x%016llx\n", pwrctl->wowlan_fw_iv);
1656 //Update TX iv data.
1657 rtw_set_sec_pn(adapter);
1660 static u8 rtw_hal_set_keep_alive_cmd(_adapter *adapter, u8 enable, u8 pkt_type)
1662 struct hal_ops *pHalFunc = &adapter->HalFunc;
1664 u8 u1H2CKeepAliveParm[H2C_KEEP_ALIVE_CTRL_LEN]={0};
1665 u8 adopt = 1, check_period = 5;
1668 DBG_871X("%s(): enable = %d\n", __func__, enable);
1669 SET_H2CCMD_KEEPALIVE_PARM_ENABLE(u1H2CKeepAliveParm, enable);
1670 SET_H2CCMD_KEEPALIVE_PARM_ADOPT(u1H2CKeepAliveParm, adopt);
1671 SET_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(u1H2CKeepAliveParm, pkt_type);
1672 SET_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(u1H2CKeepAliveParm, check_period);
1674 if (pHalFunc->fill_h2c_cmd != NULL) {
1675 ret = pHalFunc->fill_h2c_cmd(adapter,
1677 H2C_KEEP_ALIVE_CTRL_LEN,
1678 u1H2CKeepAliveParm);
1680 DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
1687 static u8 rtw_hal_set_disconnect_decision_cmd(_adapter *adapter, u8 enable)
1689 struct hal_ops *pHalFunc = &adapter->HalFunc;
1690 u8 u1H2CDisconDecisionParm[H2C_DISCON_DECISION_LEN]={0};
1691 u8 adopt = 1, check_period = 10, trypkt_num = 0;
1694 DBG_871X("%s(): enable = %d\n", __func__, enable);
1695 SET_H2CCMD_DISCONDECISION_PARM_ENABLE(u1H2CDisconDecisionParm, enable);
1696 SET_H2CCMD_DISCONDECISION_PARM_ADOPT(u1H2CDisconDecisionParm, adopt);
1697 SET_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(u1H2CDisconDecisionParm, check_period);
1698 SET_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(u1H2CDisconDecisionParm, trypkt_num);
1700 if (pHalFunc->fill_h2c_cmd != NULL) {
1701 ret = pHalFunc->fill_h2c_cmd(adapter,
1702 H2C_DISCON_DECISION,
1703 H2C_DISCON_DECISION_LEN,
1704 u1H2CDisconDecisionParm);
1706 DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
1713 static u8 rtw_hal_set_ap_offload_ctrl_cmd(_adapter *adapter, u8 enable)
1715 struct hal_ops *pHalFunc = &adapter->HalFunc;
1716 u8 u1H2CAPOffloadCtrlParm[H2C_WOWLAN_LEN]={0};
1719 DBG_871X("%s(): bFuncEn=%d\n", __func__, enable);
1721 SET_H2CCMD_AP_WOWLAN_EN(u1H2CAPOffloadCtrlParm, enable);
1723 if (pHalFunc->fill_h2c_cmd != NULL) {
1724 ret = pHalFunc->fill_h2c_cmd(adapter,
1727 u1H2CAPOffloadCtrlParm);
1729 DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
1735 static u8 rtw_hal_set_ap_rsvdpage_loc_cmd(_adapter *adapter,
1736 PRSVDPAGE_LOC rsvdpageloc)
1738 struct hal_ops *pHalFunc = &adapter->HalFunc;
1739 u8 rsvdparm[H2C_AOAC_RSVDPAGE_LOC_LEN]={0};
1740 u8 ret = _FAIL, header = 0;
1742 if (pHalFunc->fill_h2c_cmd == NULL) {
1743 DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
1747 header = rtw_read8(adapter, REG_BCNQ_BDNY);
1749 DBG_871X("%s: beacon: %d, probeRsp: %d, header:0x%02x\n", __func__,
1750 rsvdpageloc->LocApOffloadBCN,
1751 rsvdpageloc->LocProbeRsp,
1754 SET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_BCN(rsvdparm,
1755 rsvdpageloc->LocApOffloadBCN + header);
1757 ret = pHalFunc->fill_h2c_cmd(adapter, H2C_BCN_RSVDPAGE,
1758 H2C_BCN_RSVDPAGE_LEN, rsvdparm);
1761 DBG_871X("%s: H2C_BCN_RSVDPAGE cmd fail\n", __func__);
1763 _rtw_memset(&rsvdparm, 0, sizeof(rsvdparm));
1765 SET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_ProbeRsp(rsvdparm,
1766 rsvdpageloc->LocProbeRsp + header);
1768 ret = pHalFunc->fill_h2c_cmd(adapter, H2C_PROBERSP_RSVDPAGE,
1769 H2C_PROBERSP_RSVDPAGE_LEN, rsvdparm);
1772 DBG_871X("%s: H2C_PROBERSP_RSVDPAGE cmd fail\n", __func__);
1777 u8 rtw_hal_set_wowlan_ctrl_cmd(_adapter *adapter, u8 enable)
1779 struct security_priv *psecpriv = &adapter->securitypriv;
1780 struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(adapter);
1781 struct hal_ops *pHalFunc = &adapter->HalFunc;
1783 u8 u1H2CWoWlanCtrlParm[H2C_WOWLAN_LEN]={0};
1784 u8 discont_wake = 1, gpionum = 0, gpio_dur = 0;
1785 u8 hw_unicast = 0, gpio_pulse_cnt = 0;
1786 u8 sdio_wakeup_enable = 1;
1787 u8 gpio_high_active = 0; //0: low active, 1: high active
1791 #ifdef CONFIG_GPIO_WAKEUP
1792 gpionum = WAKEUP_GPIO_IDX;
1793 sdio_wakeup_enable = 0;
1794 gpio_dur = 32; // 32*32us = 1024us
1795 #ifdef CONFIG_GPIO_WAKEUP_LOW_ACTIVE
1796 gpio_high_active = 0;
1797 #else // !CONFIG_GPIO_WAKEUP_LOW_ACTIVE
1798 gpio_high_active = 1;
1799 #endif // !CONFIG_GPIO_WAKEUP_LOW_ACTIVE
1800 #endif //CONFIG_GPIO_WAKEUP
1802 if (!ppwrpriv->wowlan_pno_enable)
1805 if (psecpriv->dot11PrivacyAlgrthm == _WEP40_ || psecpriv->dot11PrivacyAlgrthm == _WEP104_)
1807 else if (IS_HARDWARE_TYPE_8192E(adapter))
1812 DBG_871X("%s: enable=%d GPIO=%d\n", __FUNCTION__, enable, gpionum);
1814 SET_H2CCMD_WOWLAN_FUNC_ENABLE(u1H2CWoWlanCtrlParm, enable);
1815 SET_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(u1H2CWoWlanCtrlParm, 0);
1816 SET_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(u1H2CWoWlanCtrlParm, magic_pkt);
1817 SET_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(u1H2CWoWlanCtrlParm, hw_unicast);
1818 SET_H2CCMD_WOWLAN_ALL_PKT_DROP(u1H2CWoWlanCtrlParm, 0);
1819 SET_H2CCMD_WOWLAN_GPIO_ACTIVE(u1H2CWoWlanCtrlParm, gpio_high_active);
1820 #ifndef CONFIG_GTK_OL
1821 SET_H2CCMD_WOWLAN_REKEY_WAKE_UP(u1H2CWoWlanCtrlParm, enable);
1823 SET_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(u1H2CWoWlanCtrlParm, discont_wake);
1824 SET_H2CCMD_WOWLAN_GPIONUM(u1H2CWoWlanCtrlParm, gpionum);
1825 SET_H2CCMD_WOWLAN_DATAPIN_WAKE_UP(u1H2CWoWlanCtrlParm, sdio_wakeup_enable);
1826 SET_H2CCMD_WOWLAN_GPIO_DURATION(u1H2CWoWlanCtrlParm, gpio_dur); // (real)unit: 32us
1827 SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(u1H2CWoWlanCtrlParm, 1);
1828 #ifdef CONFIG_PLATFORM_ARM_RK3188
1829 SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(u1H2CWoWlanCtrlParm, 4);
1831 SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(u1H2CWoWlanCtrlParm, gpio_pulse_cnt);
1834 if (pHalFunc->fill_h2c_cmd != NULL) {
1835 ret = pHalFunc->fill_h2c_cmd(adapter,
1838 u1H2CWoWlanCtrlParm);
1840 DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
1846 static u8 rtw_hal_set_remote_wake_ctrl_cmd(_adapter *adapter, u8 enable)
1848 struct hal_ops *pHalFunc = &adapter->HalFunc;
1849 struct security_priv* psecuritypriv=&(adapter->securitypriv);
1850 struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(adapter);
1851 u8 u1H2CRemoteWakeCtrlParm[H2C_REMOTE_WAKE_CTRL_LEN]={0};
1852 u8 ret = _FAIL, count = 0;
1854 DBG_871X("%s(): enable=%d\n", __func__, enable);
1856 if (!ppwrpriv->wowlan_pno_enable) {
1857 SET_H2CCMD_REMOTE_WAKECTRL_ENABLE(
1858 u1H2CRemoteWakeCtrlParm, enable);
1859 SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(
1860 u1H2CRemoteWakeCtrlParm, 1);
1861 #ifdef CONFIG_GTK_OL
1862 if (psecuritypriv->binstallKCK_KEK == _TRUE &&
1863 psecuritypriv->dot11PrivacyAlgrthm == _AES_) {
1864 SET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(
1865 u1H2CRemoteWakeCtrlParm, 1);
1867 DBG_871X("no kck or security is not AES\n");
1868 SET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(
1869 u1H2CRemoteWakeCtrlParm, 0);
1871 #endif //CONFIG_GTK_OL
1873 SET_H2CCMD_REMOTE_WAKE_CTRL_FW_UNICAST_EN(
1874 u1H2CRemoteWakeCtrlParm, 1);
1875 if ((psecuritypriv->dot11PrivacyAlgrthm == _AES_) ||
1876 (psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_)) {
1877 SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(
1878 u1H2CRemoteWakeCtrlParm, 0);
1880 SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(
1881 u1H2CRemoteWakeCtrlParm, 1);
1884 #ifdef CONFIG_PNO_SUPPORT
1886 SET_H2CCMD_REMOTE_WAKECTRL_ENABLE(
1887 u1H2CRemoteWakeCtrlParm, enable);
1888 SET_H2CCMD_REMOTE_WAKE_CTRL_NLO_OFFLOAD_EN(
1889 u1H2CRemoteWakeCtrlParm, enable);
1893 #ifdef CONFIG_P2P_WOWLAN
1894 if (_TRUE == ppwrpriv->wowlan_p2p_mode)
1896 DBG_871X("P2P OFFLOAD ENABLE\n");
1897 SET_H2CCMD_REMOTE_WAKE_CTRL_P2P_OFFLAD_EN(u1H2CRemoteWakeCtrlParm,1);
1901 DBG_871X("P2P OFFLOAD DISABLE\n");
1902 SET_H2CCMD_REMOTE_WAKE_CTRL_P2P_OFFLAD_EN(u1H2CRemoteWakeCtrlParm,0);
1904 #endif //CONFIG_P2P_WOWLAN
1907 if (pHalFunc->fill_h2c_cmd != NULL) {
1908 ret = pHalFunc->fill_h2c_cmd(adapter,
1909 H2C_REMOTE_WAKE_CTRL,
1910 H2C_REMOTE_WAKE_CTRL_LEN,
1911 u1H2CRemoteWakeCtrlParm);
1913 DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
1919 static u8 rtw_hal_set_global_info_cmd(_adapter* adapter, u8 group_alg, u8 pairwise_alg)
1921 struct hal_ops *pHalFunc = &adapter->HalFunc;
1923 u8 u1H2CAOACGlobalInfoParm[H2C_AOAC_GLOBAL_INFO_LEN]={0};
1925 DBG_871X("%s(): group_alg=%d pairwise_alg=%d\n",
1926 __func__, group_alg, pairwise_alg);
1927 SET_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(u1H2CAOACGlobalInfoParm,
1929 SET_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(u1H2CAOACGlobalInfoParm,
1932 if (pHalFunc->fill_h2c_cmd != NULL) {
1933 ret = pHalFunc->fill_h2c_cmd(adapter,
1934 H2C_AOAC_GLOBAL_INFO,
1935 H2C_AOAC_GLOBAL_INFO_LEN,
1936 u1H2CAOACGlobalInfoParm);
1938 DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
1945 #ifdef CONFIG_PNO_SUPPORT
1946 static u8 rtw_hal_set_scan_offload_info_cmd(_adapter* adapter,
1947 PRSVDPAGE_LOC rsvdpageloc, u8 enable)
1949 struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
1950 struct hal_ops *pHalFunc = &adapter->HalFunc;
1952 u8 u1H2CScanOffloadInfoParm[H2C_SCAN_OFFLOAD_CTRL_LEN]={0};
1953 u8 res = 0, count = 0, ret = _FAIL;
1955 DBG_871X("%s: loc_probe_packet:%d, loc_scan_info: %d loc_ssid_info:%d\n",
1956 __func__, rsvdpageloc->LocProbePacket,
1957 rsvdpageloc->LocScanInfo, rsvdpageloc->LocSSIDInfo);
1959 SET_H2CCMD_AOAC_NLO_FUN_EN(u1H2CScanOffloadInfoParm, enable);
1960 SET_H2CCMD_AOAC_RSVDPAGE_LOC_SCAN_INFO(u1H2CScanOffloadInfoParm,
1961 rsvdpageloc->LocScanInfo);
1962 SET_H2CCMD_AOAC_RSVDPAGE_LOC_PROBE_PACKET(u1H2CScanOffloadInfoParm,
1963 rsvdpageloc->LocProbePacket);
1964 SET_H2CCMD_AOAC_RSVDPAGE_LOC_SSID_INFO(u1H2CScanOffloadInfoParm,
1965 rsvdpageloc->LocSSIDInfo);
1967 if (pHalFunc->fill_h2c_cmd != NULL) {
1968 ret = pHalFunc->fill_h2c_cmd(adapter,
1969 H2C_D0_SCAN_OFFLOAD_INFO,
1970 H2C_SCAN_OFFLOAD_CTRL_LEN,
1971 u1H2CScanOffloadInfoParm);
1973 DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
1978 #endif //CONFIG_PNO_SUPPORT
1980 void rtw_hal_set_fw_wow_related_cmd(_adapter* padapter, u8 enable)
1982 struct security_priv *psecpriv = &padapter->securitypriv;
1983 struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter);
1984 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1985 struct sta_info *psta = NULL;
1986 u16 media_status_rpt;
1990 DBG_871X_LEVEL(_drv_always_, "+%s()+: enable=%d\n", __func__, enable);
1993 rtw_hal_set_wowlan_ctrl_cmd(padapter, enable);
1996 rtw_hal_set_global_info_cmd(padapter,
1997 psecpriv->dot118021XGrpPrivacy,
1998 psecpriv->dot11PrivacyAlgrthm);
2000 if (!(ppwrpriv->wowlan_pno_enable)) {
2001 rtw_hal_set_disconnect_decision_cmd(padapter, enable);
2002 #ifdef CONFIG_ARP_KEEP_ALIVE
2003 if ((psecpriv->dot11PrivacyAlgrthm == _WEP40_) ||
2004 (psecpriv->dot11PrivacyAlgrthm == _WEP104_))
2010 #endif //CONFIG_ARP_KEEP_ALIVE
2011 rtw_hal_set_keep_alive_cmd(padapter, enable, pkt_type);
2013 rtw_hal_set_remote_wake_ctrl_cmd(padapter, enable);
2014 #ifdef CONFIG_PNO_SUPPORT
2015 rtw_hal_check_pno_enabled(padapter);
2016 #endif //CONFIG_PNO_SUPPORT
2021 rtw_hal_get_def_var(adapter, HAL_DEF_TX_PAGE_SIZE, (u8 *)&PageSize);
2022 dump_TX_FIFO(padapter, 4, PageSize);
2026 rtw_hal_set_remote_wake_ctrl_cmd(padapter, enable);
2027 rtw_hal_set_wowlan_ctrl_cmd(padapter, enable);
2030 DBG_871X_LEVEL(_drv_always_, "-%s()-\n", __func__);
2032 #endif //CONFIG_WOWLAN
2034 #ifdef CONFIG_P2P_WOWLAN
2035 static int update_hidden_ssid(u8 *ies, u32 ies_len, u8 hidden_ssid_mode)
2041 ssid_ie = rtw_get_ie(ies, WLAN_EID_SSID, &ssid_len_ori, ies_len);
2043 //DBG_871X("%s hidden_ssid_mode:%u, ssid_ie:%p, ssid_len_ori:%d\n", __FUNCTION__, hidden_ssid_mode, ssid_ie, ssid_len_ori);
2045 if(ssid_ie && ssid_len_ori>0)
2047 switch(hidden_ssid_mode)
2051 u8 *next_ie = ssid_ie + 2 + ssid_len_ori;
2054 remain_len = ies_len -(next_ie-ies);
2057 _rtw_memcpy(ssid_ie+2, next_ie, remain_len);
2058 len_diff -= ssid_len_ori;
2063 _rtw_memset(&ssid_ie[2], 0, ssid_len_ori);
2073 static void rtw_hal_construct_P2PBeacon(_adapter *padapter, u8 *pframe, u32 *pLength)
2075 //struct xmit_frame *pmgntframe;
2076 //struct pkt_attrib *pattrib;
2077 //unsigned char *pframe;
2078 struct rtw_ieee80211_hdr *pwlanhdr;
2079 unsigned short *fctrl;
2080 unsigned int rate_len;
2081 struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
2083 //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
2085 // struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
2086 //#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
2087 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
2088 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
2089 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
2090 WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
2091 u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2093 struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
2097 u8 *dbgbuf = pframe;
2098 u8 dbgbufLen = 0, index = 0;
2100 DBG_871X("%s\n", __FUNCTION__);
2101 //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
2102 // _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL);
2103 //#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
2105 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
2108 fctrl = &(pwlanhdr->frame_ctl);
2111 _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
2112 _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
2113 _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN);
2115 SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/);
2116 //pmlmeext->mgnt_seq++;
2117 SetFrameSubType(pframe, WIFI_BEACON);
2119 pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
2120 pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);
2122 if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
2124 //DBG_871X("ie len=%d\n", cur_network->IELength);
2126 // for P2P : Primary Device Type & Device Name
2127 u32 wpsielen=0, insert_len=0;
2129 wpsie = rtw_get_wps_ie(cur_network->IEs+_FIXED_IE_LENGTH_, cur_network->IELength-_FIXED_IE_LENGTH_, NULL, &wpsielen);
2131 if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && wpsie && wpsielen>0)
2133 uint wps_offset, remainder_ielen;
2134 u8 *premainder_ie, *pframe_wscie;
2136 wps_offset = (uint)(wpsie - cur_network->IEs);
2138 premainder_ie = wpsie + wpsielen;
2140 remainder_ielen = cur_network->IELength - wps_offset - wpsielen;
2142 #ifdef CONFIG_IOCTL_CFG80211
2143 if(pwdinfo->driver_interface == DRIVER_CFG80211 )
2145 if(pmlmepriv->wps_beacon_ie && pmlmepriv->wps_beacon_ie_len>0)
2147 _rtw_memcpy(pframe, cur_network->IEs, wps_offset);
2148 pframe += wps_offset;
2149 pktlen += wps_offset;
2151 _rtw_memcpy(pframe, pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len);
2152 pframe += pmlmepriv->wps_beacon_ie_len;
2153 pktlen += pmlmepriv->wps_beacon_ie_len;
2155 //copy remainder_ie to pframe
2156 _rtw_memcpy(pframe, premainder_ie, remainder_ielen);
2157 pframe += remainder_ielen;
2158 pktlen += remainder_ielen;
2162 _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);
2163 pframe += cur_network->IELength;
2164 pktlen += cur_network->IELength;
2168 #endif //CONFIG_IOCTL_CFG80211
2170 pframe_wscie = pframe + wps_offset;
2171 _rtw_memcpy(pframe, cur_network->IEs, wps_offset+wpsielen);
2172 pframe += (wps_offset + wpsielen);
2173 pktlen += (wps_offset + wpsielen);
2175 //now pframe is end of wsc ie, insert Primary Device Type & Device Name
2176 // Primary Device Type
2178 *(u16*) ( pframe + insert_len) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE );
2182 *(u16*) ( pframe + insert_len ) = cpu_to_be16( 0x0008 );
2187 *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
2191 *(u32*) ( pframe + insert_len ) = cpu_to_be32( WPSOUI );
2195 *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
2201 *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
2205 *(u16*) ( pframe + insert_len ) = cpu_to_be16( pwdinfo->device_name_len );
2209 _rtw_memcpy( pframe + insert_len, pwdinfo->device_name, pwdinfo->device_name_len );
2210 insert_len += pwdinfo->device_name_len;
2213 //update wsc ie length
2214 *(pframe_wscie+1) = (wpsielen -2) + insert_len;
2216 //pframe move to end
2218 pktlen += insert_len;
2220 //copy remainder_ie to pframe
2221 _rtw_memcpy(pframe, premainder_ie, remainder_ielen);
2222 pframe += remainder_ielen;
2223 pktlen += remainder_ielen;
2230 _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);
2231 len_diff = update_hidden_ssid(
2232 pframe+_BEACON_IE_OFFSET_
2233 , cur_network->IELength-_BEACON_IE_OFFSET_
2234 , pmlmeinfo->hidden_ssid_mode
2236 pframe += (cur_network->IELength+len_diff);
2237 pktlen += (cur_network->IELength+len_diff);
2244 wps_ie = rtw_get_wps_ie(pmgntframe->buf_addr+TXDESC_OFFSET+sizeof (struct rtw_ieee80211_hdr_3addr)+_BEACON_IE_OFFSET_,
2245 pattrib->pktlen-sizeof (struct rtw_ieee80211_hdr_3addr)-_BEACON_IE_OFFSET_, NULL, &wps_ielen);
2246 if (wps_ie && wps_ielen>0) {
2247 rtw_get_wps_attr_content(wps_ie, wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL);
2250 set_fwstate(pmlmepriv, WIFI_UNDER_WPS);
2252 _clr_fwstate_(pmlmepriv, WIFI_UNDER_WPS);
2256 if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
2259 #ifdef CONFIG_IOCTL_CFG80211
2260 if(pwdinfo->driver_interface == DRIVER_CFG80211 )
2262 len = pmlmepriv->p2p_beacon_ie_len;
2263 if(pmlmepriv->p2p_beacon_ie && len>0)
2264 _rtw_memcpy(pframe, pmlmepriv->p2p_beacon_ie, len);
2267 #endif //CONFIG_IOCTL_CFG80211
2269 len = build_beacon_p2p_ie(pwdinfo, pframe);
2275 #ifdef CONFIG_IOCTL_CFG80211
2276 if(_TRUE == pwdinfo->wfd_info->wfd_enable)
2277 #endif //CONFIG_IOCTL_CFG80211
2279 len = build_beacon_wfd_ie( pwdinfo, pframe );
2281 #ifdef CONFIG_IOCTL_CFG80211
2285 if(pmlmepriv->wfd_beacon_ie && pmlmepriv->wfd_beacon_ie_len>0)
2287 len = pmlmepriv->wfd_beacon_ie_len;
2288 _rtw_memcpy(pframe, pmlmepriv->wfd_beacon_ie, len);
2291 #endif //CONFIG_IOCTL_CFG80211
2302 //below for ad-hoc mode
2304 //timestamp will be inserted by hardware
2308 // beacon interval: 2 bytes
2310 _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2);
2315 // capability info: 2 bytes
2317 _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);
2323 pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen);
2325 // supported rates...
2326 rate_len = rtw_get_rateset_len(cur_network->SupportedRates);
2327 pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen);
2330 pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen);
2332 //if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)
2336 // IBSS Parameter Set...
2337 //ATIMWindow = cur->Configuration.ATIMWindow;
2339 pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen);
2342 pframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pktlen);
2346 // EXTERNDED SUPPORTED RATE
2349 pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen);
2357 //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
2358 // pmlmepriv->update_bcn = _FALSE;
2360 // _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL);
2361 //#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
2367 DBG_871X("======> DBG MSG FOR CONSTRAUCT P2P BEACON\n");
2369 for(index=0;index<dbgbufLen;index++)
2370 printk("%x ",*(dbgbuf+index));
2373 DBG_871X("<====== DBG MSG FOR CONSTRAUCT P2P BEACON\n");
2378 static int get_reg_classes_full_count(struct p2p_channels channel_list) {
2382 for (i = 0; i < channel_list.reg_classes; i++) {
2383 cnt += channel_list.reg_class[i].channels;
2389 static void rtw_hal_construct_P2PProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength)
2391 //struct xmit_frame *pmgntframe;
2392 //struct pkt_attrib *pattrib;
2393 //unsigned char *pframe;
2394 struct rtw_ieee80211_hdr *pwlanhdr;
2395 unsigned short *fctrl;
2397 struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
2398 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
2399 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
2400 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
2401 //WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
2402 u16 beacon_interval = 100;
2404 struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
2405 u8 wpsie[255] = { 0x00 };
2406 u32 wpsielen = 0, p2pielen = 0;
2411 #ifdef CONFIG_INTEL_WIDI
2412 u8 zero_array_check[L2SDTA_SERVICE_VE_LEN] = { 0x00 };
2413 #endif //CONFIG_INTEL_WIDI
2416 u8 *dbgbuf = pframe;
2417 u8 dbgbufLen = 0, index = 0;
2419 DBG_871X("%s\n", __FUNCTION__);
2420 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
2422 mac = myid(&(padapter->eeprompriv));
2424 fctrl = &(pwlanhdr->frame_ctl);
2428 _rtw_memset(pwlanhdr->addr1, 0, ETH_ALEN);
2429 _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);
2431 // Use the device address for BSSID field.
2432 _rtw_memcpy(pwlanhdr->addr3, mac, ETH_ALEN);
2434 SetSeqNum(pwlanhdr, 0);
2435 SetFrameSubType(fctrl, WIFI_PROBERSP);
2437 pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
2441 //timestamp will be inserted by hardware
2445 // beacon interval: 2 bytes
2446 _rtw_memcpy(pframe, (unsigned char *) &beacon_interval, 2);
2450 // capability info: 2 bytes
2451 // ESS and IBSS bits must be 0 (defined in the 3.1.2.1.1 of WiFi Direct Spec)
2452 capInfo |= cap_ShortPremble;
2453 capInfo |= cap_ShortSlot;
2455 _rtw_memcpy(pframe, (unsigned char *) &capInfo, 2);
2461 pframe = rtw_set_ie(pframe, _SSID_IE_, 7, pwdinfo->p2p_wildcard_ssid, &pktlen);
2463 // supported rates...
2464 // Use the OFDM rate in the P2P probe response frame. ( 6(B), 9(B), 12, 18, 24, 36, 48, 54 )
2465 pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pktlen);
2468 pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&pwdinfo->listen_channel, &pktlen);
2470 #ifdef CONFIG_IOCTL_CFG80211
2471 if(pwdinfo->driver_interface == DRIVER_CFG80211 )
2473 if( pmlmepriv->wps_probe_resp_ie != NULL && pmlmepriv->p2p_probe_resp_ie != NULL )
2476 _rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, pmlmepriv->wps_probe_resp_ie_len);
2477 pktlen += pmlmepriv->wps_probe_resp_ie_len;
2478 pframe += pmlmepriv->wps_probe_resp_ie_len;
2481 _rtw_memcpy(pframe, pmlmepriv->p2p_probe_resp_ie, pmlmepriv->p2p_probe_resp_ie_len);
2482 pktlen += pmlmepriv->p2p_probe_resp_ie_len;
2483 pframe += pmlmepriv->p2p_probe_resp_ie_len;
2487 #endif //CONFIG_IOCTL_CFG80211
2491 // Noted by Albert 20100907
2492 // According to the WPS specification, all the WPS attribute is presented by Big Endian.
2496 *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );
2501 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );
2505 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
2509 wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0
2511 #ifdef CONFIG_INTEL_WIDI
2512 // Commented by Kurt
2513 // Appended WiDi info. only if we did issued_probereq_widi(), and then we saved ven. ext. in pmlmepriv->sa_ext.
2514 if( _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE
2515 || pmlmepriv->num_p2p_sdt != 0 )
2518 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SEC_DEV_TYPE_LIST );
2522 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 );
2527 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_DISPLAYS );
2531 *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( INTEL_DEV_TYPE_OUI );
2534 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_WIDI_CONSUMER_SINK );
2537 if( _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE )
2540 _rtw_memcpy( wpsie + wpsielen, pmlmepriv->sa_ext, L2SDTA_SERVICE_VE_LEN );
2541 wpsielen += L2SDTA_SERVICE_VE_LEN;
2544 #endif //CONFIG_INTEL_WIDI
2546 // WiFi Simple Config State
2548 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SIMPLE_CONF_STATE );
2552 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
2556 wpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG; // Not Configured.
2560 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_RESP_TYPE );
2564 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
2568 wpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X;
2572 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E );
2576 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 );
2580 if (pwdinfo->external_uuid == 0) {
2581 _rtw_memset( wpsie + wpsielen, 0x0, 16 );
2582 _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN );
2584 _rtw_memcpy( wpsie + wpsielen, pwdinfo->uuid, 0x10 );
2590 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MANUFACTURER );
2594 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0007 );
2598 _rtw_memcpy( wpsie + wpsielen, "Realtek", 7 );
2603 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NAME );
2607 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0006 );
2611 _rtw_memcpy( wpsie + wpsielen, "8192CU", 6 );
2616 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NUMBER );
2620 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
2624 wpsie[ wpsielen++ ] = 0x31; // character 1
2628 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SERIAL_NUMBER );
2632 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( ETH_ALEN );
2636 _rtw_memcpy( wpsie + wpsielen, "123456" , ETH_ALEN );
2637 wpsielen += ETH_ALEN;
2639 // Primary Device Type
2641 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE );
2645 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 );
2650 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
2654 *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI );
2658 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
2663 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
2667 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len );
2671 _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len );
2672 wpsielen += pwdinfo->device_name_len;
2676 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );
2680 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );
2684 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );
2688 pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pktlen );
2691 p2pielen = build_probe_resp_p2p_ie(pwdinfo, pframe);
2697 #ifdef CONFIG_IOCTL_CFG80211
2698 if ( _TRUE == pwdinfo->wfd_info->wfd_enable )
2699 #endif //CONFIG_IOCTL_CFG80211
2701 wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 0);
2705 #ifdef CONFIG_IOCTL_CFG80211
2706 else if (pmlmepriv->wfd_probe_resp_ie != NULL && pmlmepriv->wfd_probe_resp_ie_len>0)
2709 _rtw_memcpy(pframe, pmlmepriv->wfd_probe_resp_ie, pmlmepriv->wfd_probe_resp_ie_len);
2710 pktlen += pmlmepriv->wfd_probe_resp_ie_len;
2711 pframe += pmlmepriv->wfd_probe_resp_ie_len;
2713 #endif //CONFIG_IOCTL_CFG80211
2721 DBG_871X("======> DBG MSG FOR CONSTRAUCT P2P Probe Rsp\n");
2723 for(index=0;index<dbgbufLen;index++)
2724 printk("%x ",*(dbgbuf+index));
2727 DBG_871X("<====== DBG MSG FOR CONSTRAUCT P2P Probe Rsp\n");
2730 static void rtw_hal_construct_P2PNegoRsp(_adapter *padapter, u8 *pframe, u32 *pLength)
2732 unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
2733 u8 action = P2P_PUB_ACTION_ACTION;
2734 u32 p2poui = cpu_to_be32(P2POUI);
2735 u8 oui_subtype = P2P_GO_NEGO_RESP;
2736 u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 };
2739 u16 wps_devicepassword_id = 0x0000;
2740 uint wps_devicepassword_id_len = 0;
2741 u8 channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh;
2742 u16 len_channellist_attr = 0;
2746 //struct xmit_frame *pmgntframe;
2747 //struct pkt_attrib *pattrib;
2748 //unsigned char *pframe;
2749 struct rtw_ieee80211_hdr *pwlanhdr;
2750 unsigned short *fctrl;
2751 struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
2752 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
2753 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
2754 struct wifidirect_info *pwdinfo = &( padapter->wdinfo);
2755 //WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
2762 u8 *dbgbuf = pframe;
2763 u8 dbgbufLen = 0, index = 0;
2765 DBG_871X( "%s\n", __FUNCTION__);
2766 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
2768 fctrl = &(pwlanhdr->frame_ctl);
2772 _rtw_memset(pwlanhdr->addr1, 0, ETH_ALEN);
2773 _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
2774 _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
2776 SetSeqNum(pwlanhdr, 0);
2777 SetFrameSubType(pframe, WIFI_ACTION);
2779 pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
2782 pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pktlen));
2783 pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pktlen));
2784 pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pktlen));
2785 pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pktlen));
2787 //dialog token, filled by FW
2788 pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pktlen));
2790 _rtw_memset( wpsie, 0x00, 255 );
2796 *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );
2801 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );
2805 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
2809 wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0
2811 // Device Password ID
2813 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID );
2817 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );
2821 if ( wps_devicepassword_id == WPS_DPID_USER_SPEC )
2823 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC );
2825 else if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC )
2827 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC );
2831 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC );
2835 pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pktlen );
2842 p2pie[ p2pielen++ ] = 0x50;
2843 p2pie[ p2pielen++ ] = 0x6F;
2844 p2pie[ p2pielen++ ] = 0x9A;
2845 p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
2847 // Commented by Albert 20100908
2848 // According to the P2P Specification, the group negoitation response frame should contain 9 P2P attributes
2850 // 2. P2P Capability
2851 // 3. Group Owner Intent
2852 // 4. Configuration Timeout
2853 // 5. Operating Channel
2854 // 6. Intended P2P Interface Address
2857 // 9. Group ID ( Only GO )
2864 p2pie[ p2pielen++ ] = P2P_ATTR_STATUS;
2867 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );
2870 // Value, filled by FW
2871 p2pie[ p2pielen++ ] = 1;
2875 p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;
2878 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
2882 // Device Capability Bitmap, 1 byte
2884 if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) )
2886 // Commented by Albert 2011/03/08
2887 // According to the P2P specification
2888 // if the sending device will be client, the P2P Capability should be reserved of group negotation response frame
2889 p2pie[ p2pielen++ ] = 0;
2893 // Be group owner or meet the error case
2894 p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;
2897 // Group Capability Bitmap, 1 byte
2898 if ( pwdinfo->persistent_supported )
2900 p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP;
2904 p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN;
2907 // Group Owner Intent
2909 p2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT;
2912 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );
2916 if ( pwdinfo->peer_intent & 0x01 )
2918 // Peer's tie breaker bit is 1, our tie breaker bit should be 0
2919 p2pie[ p2pielen++ ] = ( pwdinfo->intent << 1 );
2923 // Peer's tie breaker bit is 0, our tie breaker bit should be 1
2924 p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) );
2928 // Configuration Timeout
2930 p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT;
2933 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
2937 p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO
2938 p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client
2940 // Operating Channel
2942 p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;
2945 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );
2950 p2pie[ p2pielen++ ] = 'X';
2951 p2pie[ p2pielen++ ] = 'X';
2953 // The third byte should be set to 0x04.
2954 // Described in the "Operating Channel Attribute" section.
2955 p2pie[ p2pielen++ ] = 0x04;
2958 if ( pwdinfo->operating_channel <= 14 )
2961 p2pie[ p2pielen++ ] = 0x51;
2963 else if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) )
2966 p2pie[ p2pielen++ ] = 0x73;
2971 p2pie[ p2pielen++ ] = 0x7c;
2975 p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number
2977 // Intended P2P Interface Address
2979 p2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR;
2982 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN );
2986 _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN );
2987 p2pielen += ETH_ALEN;
2991 p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;
2993 // Country String(3)
2994 // + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?)
2995 // + number of channels in all classes
2996 len_channellist_attr = 3
2997 + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes
2998 + get_reg_classes_full_count(pmlmeext->channel_list);
3000 #ifdef CONFIG_CONCURRENT_MODE
3001 if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
3003 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 );
3007 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
3011 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
3018 p2pie[ p2pielen++ ] = 'X';
3019 p2pie[ p2pielen++ ] = 'X';
3021 // The third byte should be set to 0x04.
3022 // Described in the "Operating Channel Attribute" section.
3023 p2pie[ p2pielen++ ] = 0x04;
3025 // Channel Entry List
3027 #ifdef CONFIG_CONCURRENT_MODE
3028 if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
3030 _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
3031 struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
3034 if ( pbuddy_mlmeext->cur_channel > 14 )
3036 if ( pbuddy_mlmeext->cur_channel >= 149 )
3038 p2pie[ p2pielen++ ] = 0x7c;
3042 p2pie[ p2pielen++ ] = 0x73;
3047 p2pie[ p2pielen++ ] = 0x51;
3050 // Number of Channels
3051 // Just support 1 channel and this channel is AP's channel
3052 p2pie[ p2pielen++ ] = 1;
3055 p2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel;
3060 for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
3062 p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
3064 // Number of Channels
3065 p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
3068 for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
3069 p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
3073 #else // CONFIG_CONCURRENT_MODE
3076 for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
3078 p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
3080 // Number of Channels
3081 p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
3084 for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
3085 p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
3089 #endif // CONFIG_CONCURRENT_MODE
3094 p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;
3097 // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes)
3098 // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)
3099 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );
3103 // P2P Device Address
3104 _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN );
3105 p2pielen += ETH_ALEN;
3108 // This field should be big endian. Noted by P2P specification.
3110 *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );
3114 // Primary Device Type
3116 *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
3120 *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );
3124 *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
3127 // Number of Secondary Device Types
3128 p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List
3132 *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
3136 *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );
3140 _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len );
3141 p2pielen += pwdinfo->device_name_len;
3143 if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) )
3145 // Group ID Attribute
3147 p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID;
3150 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen );
3154 // p2P Device Address
3155 _rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN );
3156 p2pielen += ETH_ALEN;
3159 _rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen );
3160 p2pielen += pwdinfo->nego_ssidlen;
3164 pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pktlen );
3167 wfdielen = build_nego_resp_wfd_ie(pwdinfo, pframe);
3176 DBG_871X("======> DBG MSG FOR CONSTRAUCT Nego Rsp\n");
3178 for(index=0;index<dbgbufLen;index++)
3179 printk("%x ",*(dbgbuf+index));
3182 DBG_871X("<====== DBG MSG FOR CONSTRAUCT Nego Rsp\n");
3186 static void rtw_hal_construct_P2PInviteRsp(_adapter * padapter, u8 * pframe, u32 * pLength)
3188 unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
3189 u8 action = P2P_PUB_ACTION_ACTION;
3190 u32 p2poui = cpu_to_be32(P2POUI);
3191 u8 oui_subtype = P2P_INVIT_RESP;
3192 u8 p2pie[ 255 ] = { 0x00 };
3194 u8 channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh = 0;
3195 u16 len_channellist_attr = 0;
3198 #ifdef CONFIG_CONCURRENT_MODE
3199 _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
3200 struct wifidirect_info *pbuddy_wdinfo = &pbuddy_adapter->wdinfo;
3201 struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
3202 struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
3208 //struct xmit_frame *pmgntframe;
3209 //struct pkt_attrib *pattrib;
3210 //unsigned char *pframe;
3211 struct rtw_ieee80211_hdr *pwlanhdr;
3212 unsigned short *fctrl;
3213 struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
3214 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
3215 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
3216 struct wifidirect_info *pwdinfo = &( padapter->wdinfo);
3219 u8 *dbgbuf = pframe;
3220 u8 dbgbufLen = 0, index = 0;
3223 DBG_871X( "%s\n", __FUNCTION__);
3224 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
3226 fctrl = &(pwlanhdr->frame_ctl);
3230 _rtw_memset(pwlanhdr->addr1, 0, ETH_ALEN);
3231 _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
3234 _rtw_memset(pwlanhdr->addr3, 0, ETH_ALEN);
3236 SetSeqNum(pwlanhdr, 0);
3237 SetFrameSubType(pframe, WIFI_ACTION);
3239 pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
3240 pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
3242 pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pktlen));
3243 pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pktlen));
3244 pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pktlen));
3245 pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pktlen));
3247 //dialog token, filled by FW
3248 pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pktlen));
3254 p2pie[ p2pielen++ ] = 0x50;
3255 p2pie[ p2pielen++ ] = 0x6F;
3256 p2pie[ p2pielen++ ] = 0x9A;
3257 p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
3259 // Commented by Albert 20101005
3260 // According to the P2P Specification, the P2P Invitation response frame should contain 5 P2P attributes
3262 // 2. Configuration Timeout
3263 // 3. Operating Channel ( Only GO )
3264 // 4. P2P Group BSSID ( Only GO )
3269 p2pie[ p2pielen++ ] = P2P_ATTR_STATUS;
3272 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );
3275 // Value: filled by FW, defult value is FAIL INFO UNAVAILABLE
3276 p2pie[ p2pielen++ ] = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
3278 // Configuration Timeout
3280 p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT;
3283 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
3287 p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO
3288 p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client
3290 // due to defult value is FAIL INFO UNAVAILABLE, so the following IE is not needed
3292 if( status_code == P2P_STATUS_SUCCESS )
3294 if( rtw_p2p_chk_role( pwdinfo, P2P_ROLE_GO ) )
3296 // The P2P Invitation request frame asks this Wi-Fi device to be the P2P GO
3297 // In this case, the P2P Invitation response frame should carry the two more P2P attributes.
3298 // First one is operating channel attribute.
3299 // Second one is P2P Group BSSID attribute.
3301 // Operating Channel
3303 p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;
3306 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );
3311 p2pie[ p2pielen++ ] = 'X';
3312 p2pie[ p2pielen++ ] = 'X';
3314 // The third byte should be set to 0x04.
3315 // Described in the "Operating Channel Attribute" section.
3316 p2pie[ p2pielen++ ] = 0x04;
3319 p2pie[ p2pielen++ ] = 0x51; // Copy from SD7
3322 p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number
3327 p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_BSSID;
3330 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN );
3334 // P2P Device Address for GO
3335 _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN );
3336 p2pielen += ETH_ALEN;
3342 p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;
3345 // Country String(3)
3346 // + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?)
3347 // + number of channels in all classes
3348 len_channellist_attr = 3
3349 + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes
3350 + get_reg_classes_full_count(pmlmeext->channel_list);
3352 #ifdef CONFIG_CONCURRENT_MODE
3353 if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
3355 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 );
3359 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
3363 *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
3370 p2pie[ p2pielen++ ] = 'X';
3371 p2pie[ p2pielen++ ] = 'X';
3373 // The third byte should be set to 0x04.
3374 // Described in the "Operating Channel Attribute" section.
3375 p2pie[ p2pielen++ ] = 0x04;
3377 // Channel Entry List
3378 #ifdef CONFIG_CONCURRENT_MODE
3379 if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
3381 _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
3382 struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
3385 if ( pbuddy_mlmeext->cur_channel > 14 )
3387 if ( pbuddy_mlmeext->cur_channel >= 149 )
3389 p2pie[ p2pielen++ ] = 0x7c;
3393 p2pie[ p2pielen++ ] = 0x73;
3398 p2pie[ p2pielen++ ] = 0x51;
3401 // Number of Channels
3402 // Just support 1 channel and this channel is AP's channel
3403 p2pie[ p2pielen++ ] = 1;
3406 p2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel;
3411 for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
3413 p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
3415 // Number of Channels
3416 p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
3419 for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
3420 p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
3424 #else // CONFIG_CONCURRENT_MODE
3427 for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
3429 p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
3431 // Number of Channels
3432 p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
3435 for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
3436 p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
3440 #endif // CONFIG_CONCURRENT_MODE
3444 pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pktlen );
3447 wfdielen = build_invitation_resp_wfd_ie(pwdinfo, pframe);
3457 DBG_871X("======> DBG MSG FOR CONSTRAUCT Invite Rsp\n");
3459 for(index=0;index<dbgbufLen;index++)
3460 printk("%x ",*(dbgbuf+index));
3463 DBG_871X("<====== DBG MSG FOR CONSTRAUCT Invite Rsp\n");
3468 static void rtw_hal_construct_P2PProvisionDisRsp(_adapter * padapter, u8 * pframe, u32 * pLength)
3470 unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
3471 u8 action = P2P_PUB_ACTION_ACTION;
3473 u32 p2poui = cpu_to_be32(P2POUI);
3474 u8 oui_subtype = P2P_PROVISION_DISC_RESP;
3475 u8 wpsie[ 100 ] = { 0x00 };
3482 //struct xmit_frame *pmgntframe;
3483 //struct pkt_attrib *pattrib;
3484 //unsigned char *pframe;
3485 struct rtw_ieee80211_hdr *pwlanhdr;
3486 unsigned short *fctrl;
3487 struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
3488 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
3489 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
3490 struct wifidirect_info *pwdinfo = &( padapter->wdinfo);
3493 u8 *dbgbuf = pframe;
3494 u8 dbgbufLen = 0, index = 0;
3496 DBG_871X( "%s\n", __FUNCTION__);
3498 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
3500 fctrl = &(pwlanhdr->frame_ctl);
3504 _rtw_memset(pwlanhdr->addr1, 0, ETH_ALEN);
3505 _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
3506 _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
3508 SetSeqNum(pwlanhdr,0);
3509 SetFrameSubType(pframe, WIFI_ACTION);
3511 pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
3512 pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
3514 pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pktlen));
3515 pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pktlen));
3516 pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pktlen));
3517 pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pktlen));
3518 //dialog token, filled by FW
3519 pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pktlen));
3523 //*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );
3524 RTW_PUT_BE32(wpsie, WPSOUI);
3530 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );
3534 *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
3538 wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0
3543 //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );
3544 RTW_PUT_BE16(wpsie + wpsielen, WPS_ATTR_CONF_METHOD);
3548 //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );
3549 RTW_PUT_BE16(wpsie + wpsielen, 0x0002);
3552 // Value: filled by FW, default value is PBC
3553 //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( config_method );
3554 RTW_PUT_BE16(wpsie + wpsielen, WPS_CM_PUSH_BUTTON);
3557 pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pktlen );
3560 wfdielen = build_provdisc_resp_wfd_ie(pwdinfo, pframe);
3570 DBG_871X("======> DBG MSG FOR CONSTRAUCT ProvisionDis Rsp\n");
3572 for(index=0;index<dbgbufLen;index++)
3573 printk("%x ",*(dbgbuf+index));
3576 DBG_871X("<====== DBG MSG FOR CONSTRAUCT ProvisionDis Rsp\n");
3580 u8 rtw_hal_set_FwP2PRsvdPage_cmd(_adapter* adapter, PRSVDPAGE_LOC rsvdpageloc)
3582 u8 u1H2CP2PRsvdPageParm[H2C_P2PRSVDPAGE_LOC_LEN]={0};
3583 struct hal_ops *pHalFunc = &adapter->HalFunc;
3586 DBG_871X("P2PRsvdPageLoc: P2PBeacon=%d P2PProbeRsp=%d NegoRsp=%d InviteRsp=%d PDRsp=%d\n",
3587 rsvdpageloc->LocP2PBeacon, rsvdpageloc->LocP2PProbeRsp,
3588 rsvdpageloc->LocNegoRsp, rsvdpageloc->LocInviteRsp,
3589 rsvdpageloc->LocPDRsp);
3591 SET_H2CCMD_RSVDPAGE_LOC_P2P_BCN(u1H2CP2PRsvdPageParm, rsvdpageloc->LocProbeRsp);
3592 SET_H2CCMD_RSVDPAGE_LOC_P2P_PROBE_RSP(u1H2CP2PRsvdPageParm, rsvdpageloc->LocPsPoll);
3593 SET_H2CCMD_RSVDPAGE_LOC_P2P_NEGO_RSP(u1H2CP2PRsvdPageParm, rsvdpageloc->LocNullData);
3594 SET_H2CCMD_RSVDPAGE_LOC_P2P_INVITE_RSP(u1H2CP2PRsvdPageParm, rsvdpageloc->LocQosNull);
3595 SET_H2CCMD_RSVDPAGE_LOC_P2P_PD_RSP(u1H2CP2PRsvdPageParm, rsvdpageloc->LocBTQosNull);
3597 //FillH2CCmd8723B(padapter, H2C_8723B_P2P_OFFLOAD_RSVD_PAGE, H2C_P2PRSVDPAGE_LOC_LEN, u1H2CP2PRsvdPageParm);
3598 if (pHalFunc->fill_h2c_cmd != NULL) {
3599 ret = pHalFunc->fill_h2c_cmd(adapter,
3600 H2C_P2P_OFFLOAD_RSVD_PAGE,
3601 H2C_P2PRSVDPAGE_LOC_LEN,
3602 u1H2CP2PRsvdPageParm);
3604 DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
3611 u8 rtw_hal_set_p2p_wowlan_offload_cmd(_adapter* adapter)
3614 u8 offload_cmd[H2C_P2P_OFFLOAD_LEN] = {0};
3615 struct wifidirect_info *pwdinfo = &(adapter->wdinfo);
3616 struct P2P_WoWlan_Offload_t *p2p_wowlan_offload = (struct P2P_WoWlan_Offload_t *)offload_cmd;
3617 struct hal_ops *pHalFunc = &adapter->HalFunc;
3620 _rtw_memset(p2p_wowlan_offload,0 ,sizeof(struct P2P_WoWlan_Offload_t));
3621 DBG_871X("%s\n",__func__);
3622 switch(pwdinfo->role)
3624 case P2P_ROLE_DEVICE:
3625 DBG_871X("P2P_ROLE_DEVICE\n");
3626 p2p_wowlan_offload->role = 0;
3628 case P2P_ROLE_CLIENT:
3629 DBG_871X("P2P_ROLE_CLIENT\n");
3630 p2p_wowlan_offload->role = 1;
3633 DBG_871X("P2P_ROLE_GO\n");
3634 p2p_wowlan_offload->role = 2;
3637 DBG_871X("P2P_ROLE_DISABLE\n");
3640 p2p_wowlan_offload->Wps_Config[0] = pwdinfo->supported_wps_cm>>8;
3641 p2p_wowlan_offload->Wps_Config[1] = pwdinfo->supported_wps_cm;
3642 offload_cmd = (u8*)p2p_wowlan_offload;
3643 DBG_871X("p2p_wowlan_offload: %x:%x:%x\n",offload_cmd[0],offload_cmd[1],offload_cmd[2]);
3645 if (pHalFunc->fill_h2c_cmd != NULL) {
3646 ret = pHalFunc->fill_h2c_cmd(adapter,
3648 H2C_P2P_OFFLOAD_LEN,
3651 DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
3657 //FillH2CCmd8723B(adapter, H2C_8723B_P2P_OFFLOAD, sizeof(struct P2P_WoWlan_Offload_t), (u8 *)p2p_wowlan_offload);
3659 #endif //CONFIG_P2P_WOWLAN
3661 static void rtw_hal_construct_beacon(_adapter *padapter,
3662 u8 *pframe, u32 *pLength)
3664 struct rtw_ieee80211_hdr *pwlanhdr;
3666 u32 rate_len, pktlen;
3667 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
3668 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
3669 WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
3670 u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
3673 //DBG_871X("%s\n", __FUNCTION__);
3675 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
3677 fctrl = &(pwlanhdr->frame_ctl);
3680 _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
3681 _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
3682 _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN);
3684 SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/);
3685 //pmlmeext->mgnt_seq++;
3686 SetFrameSubType(pframe, WIFI_BEACON);
3688 pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
3689 pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);
3691 //timestamp will be inserted by hardware
3695 // beacon interval: 2 bytes
3696 _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2);
3701 // capability info: 2 bytes
3702 _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);
3707 if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
3709 //DBG_871X("ie len=%d\n", cur_network->IELength);
3710 pktlen += cur_network->IELength - sizeof(NDIS_802_11_FIXED_IEs);
3711 _rtw_memcpy(pframe, cur_network->IEs+sizeof(NDIS_802_11_FIXED_IEs), pktlen);
3713 goto _ConstructBeacon;
3716 //below for ad-hoc mode
3719 pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen);
3721 // supported rates...
3722 rate_len = rtw_get_rateset_len(cur_network->SupportedRates);
3723 pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen);
3726 pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen);
3728 if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)
3731 // IBSS Parameter Set...
3732 //ATIMWindow = cur->Configuration.ATIMWindow;
3734 pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen);
3741 // EXTERNDED SUPPORTED RATE
3744 pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen);
3752 if ((pktlen + TXDESC_SIZE) > 512)
3754 DBG_871X("beacon frame too large\n");
3760 //DBG_871X("%s bcn_sz=%d\n", __FUNCTION__, pktlen);
3764 static void rtw_hal_construct_PSPoll(_adapter *padapter,
3765 u8 *pframe, u32 *pLength)
3767 struct rtw_ieee80211_hdr *pwlanhdr;
3770 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
3771 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
3773 //DBG_871X("%s\n", __FUNCTION__);
3775 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
3778 fctrl = &(pwlanhdr->frame_ctl);
3781 SetFrameSubType(pframe, WIFI_PSPOLL);
3784 SetDuration(pframe, (pmlmeinfo->aid | 0xc000));
3787 _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
3790 _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
3795 static void rtw_hal_construct_NullFunctionData(
3805 struct rtw_ieee80211_hdr *pwlanhdr;
3808 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3809 struct wlan_network *cur_network = &pmlmepriv->cur_network;
3810 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
3811 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
3814 //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave);
3816 pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;
3818 fctrl = &pwlanhdr->frame_ctl;
3820 if (bForcePowerSave)
3825 switch(cur_network->network.InfrastructureMode)
3827 case Ndis802_11Infrastructure:
3829 _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
3830 _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
3831 _rtw_memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN);
3833 case Ndis802_11APMode:
3835 _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);
3836 _rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
3837 _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
3839 case Ndis802_11IBSS:
3841 _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);
3842 _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
3843 _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
3847 SetSeqNum(pwlanhdr, 0);
3849 if (bQoS == _TRUE) {
3850 struct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr;
3852 SetFrameSubType(pframe, WIFI_QOS_DATA_NULL);
3854 pwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos*)pframe;
3855 SetPriority(&pwlanqoshdr->qc, AC);
3856 SetEOSP(&pwlanqoshdr->qc, bEosp);
3858 pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos);
3860 SetFrameSubType(pframe, WIFI_DATA_NULL);
3862 pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
3868 #ifdef CONFIG_WOWLAN
3871 // Construct the ARP response packet to support ARP offload.
3873 static void rtw_hal_construct_ARPRsp(
3880 struct rtw_ieee80211_hdr *pwlanhdr;
3883 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3884 struct wlan_network *cur_network = &pmlmepriv->cur_network;
3885 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
3886 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
3887 struct security_priv *psecuritypriv = &padapter->securitypriv;
3888 static u8 ARPLLCHeader[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x08, 0x06};
3889 u8 *pARPRspPkt = pframe;
3891 u8 *payload = pframe;
3892 u8 EncryptionHeadOverhead = 0;
3893 //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave);
3895 pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;
3897 fctrl = &pwlanhdr->frame_ctl;
3900 //-------------------------------------------------------------------------
3902 //-------------------------------------------------------------------------
3903 SetFrameType(fctrl, WIFI_DATA);
3904 //SetFrameSubType(fctrl, 0);
3906 _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
3907 _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
3908 _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
3910 SetSeqNum(pwlanhdr, 0);
3911 SetDuration(pwlanhdr, 0);
3912 //SET_80211_HDR_FRAME_CONTROL(pARPRspPkt, 0);
3913 //SET_80211_HDR_TYPE_AND_SUBTYPE(pARPRspPkt, Type_Data);
3914 //SET_80211_HDR_TO_DS(pARPRspPkt, 1);
3915 //SET_80211_HDR_ADDRESS1(pARPRspPkt, pMgntInfo->Bssid);
3916 //SET_80211_HDR_ADDRESS2(pARPRspPkt, Adapter->CurrentAddress);
3917 //SET_80211_HDR_ADDRESS3(pARPRspPkt, pMgntInfo->Bssid);
3919 //SET_80211_HDR_DURATION(pARPRspPkt, 0);
3920 //SET_80211_HDR_FRAGMENT_SEQUENCE(pARPRspPkt, 0);
3921 #ifdef CONFIG_WAPI_SUPPORT
3922 *pLength = sMacHdrLng;
3926 switch (psecuritypriv->dot11PrivacyAlgrthm) {
3929 EncryptionHeadOverhead = 4;
3932 EncryptionHeadOverhead = 8;
3935 EncryptionHeadOverhead = 8;
3937 #ifdef CONFIG_WAPI_SUPPORT
3939 EncryptionHeadOverhead = 18;
3943 EncryptionHeadOverhead = 0;
3946 if(EncryptionHeadOverhead > 0) {
3947 _rtw_memset(&(pframe[*pLength]), 0,EncryptionHeadOverhead);
3948 *pLength += EncryptionHeadOverhead;
3949 //SET_80211_HDR_WEP(pARPRspPkt, 1); //Suggested by CCW.
3953 //-------------------------------------------------------------------------
3955 //-------------------------------------------------------------------------
3956 pARPRspPkt = (u8*)(pframe+ *pLength);
3957 payload = pARPRspPkt; //Get Payload pointer
3959 _rtw_memcpy(pARPRspPkt, ARPLLCHeader, 8);
3964 SET_ARP_PKT_HW(pARPRspPkt, 0x0100);
3965 SET_ARP_PKT_PROTOCOL(pARPRspPkt, 0x0008); // IP protocol
3966 SET_ARP_PKT_HW_ADDR_LEN(pARPRspPkt, 6);
3967 SET_ARP_PKT_PROTOCOL_ADDR_LEN(pARPRspPkt, 4);
3968 SET_ARP_PKT_OPERATION(pARPRspPkt, 0x0200); // ARP response
3969 SET_ARP_PKT_SENDER_MAC_ADDR(pARPRspPkt, myid(&(padapter->eeprompriv)));
3970 SET_ARP_PKT_SENDER_IP_ADDR(pARPRspPkt, pIPAddress);
3971 #ifdef CONFIG_ARP_KEEP_ALIVE
3972 if (rtw_gw_addr_query(padapter)==0) {
3973 SET_ARP_PKT_TARGET_MAC_ADDR(pARPRspPkt, pmlmepriv->gw_mac_addr);
3974 SET_ARP_PKT_TARGET_IP_ADDR(pARPRspPkt, pmlmepriv->gw_ip);
3979 SET_ARP_PKT_TARGET_MAC_ADDR(pARPRspPkt,
3980 get_my_bssid(&(pmlmeinfo->network)));
3981 SET_ARP_PKT_TARGET_IP_ADDR(pARPRspPkt,
3983 DBG_871X("%s Target Mac Addr:" MAC_FMT "\n", __FUNCTION__,
3984 MAC_ARG(get_my_bssid(&(pmlmeinfo->network))));
3985 DBG_871X("%s Target IP Addr" IP_FMT "\n", __FUNCTION__,
3986 IP_ARG(pIPAddress));
3991 if (psecuritypriv->dot11PrivacyAlgrthm == _TKIP_) {
3993 struct mic_data micdata;
3994 struct sta_info *psta = NULL;
3995 u8 priority[4]={0x0,0x0,0x0,0x0};
3996 u8 null_key[16]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
3998 DBG_871X("%s(): Add MIC\n",__FUNCTION__);
4000 psta = rtw_get_stainfo(&padapter->stapriv,
4001 get_my_bssid(&(pmlmeinfo->network)));
4003 if(_rtw_memcmp(&psta->dot11tkiptxmickey.skey[0],
4004 null_key, 16)==_TRUE) {
4005 DBG_871X("%s(): STA dot11tkiptxmickey==0\n",
4008 //start to calculate the mic code
4009 rtw_secmicsetkey(&micdata,
4010 &psta->dot11tkiptxmickey.skey[0]);
4013 rtw_secmicappend(&micdata, pwlanhdr->addr3, 6); //DA
4015 rtw_secmicappend(&micdata, pwlanhdr->addr2, 6); //SA
4019 rtw_secmicappend(&micdata, &priority[0], 4);
4021 rtw_secmicappend(&micdata, payload, 36); //payload length = 8 + 28
4023 rtw_secgetmic(&micdata,&(mic[0]));
4026 _rtw_memcpy(pARPRspPkt, &(mic[0]),8);
4032 #ifdef CONFIG_PNO_SUPPORT
4033 static void rtw_hal_construct_ProbeReq(_adapter *padapter, u8 *pframe,
4034 u32 *pLength, pno_ssid_t *ssid)
4036 struct rtw_ieee80211_hdr *pwlanhdr;
4040 unsigned char bssrate[NumRates];
4041 struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
4042 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
4043 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
4044 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
4045 int bssrate_len = 0;
4046 u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
4048 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
4049 mac = myid(&(padapter->eeprompriv));
4051 fctrl = &(pwlanhdr->frame_ctl);
4054 _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
4055 _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN);
4057 _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);
4059 SetSeqNum(pwlanhdr, 0);
4060 SetFrameSubType(pframe, WIFI_PROBEREQ);
4062 pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
4066 pframe = rtw_set_ie(pframe, _SSID_IE_, 0, NULL, &pktlen);
4068 //DBG_871X("%s len:%d\n", ssid->SSID, ssid->SSID_len);
4069 pframe = rtw_set_ie(pframe, _SSID_IE_, ssid->SSID_len, ssid->SSID, &pktlen);
4072 get_rate_set(padapter, bssrate, &bssrate_len);
4074 if (bssrate_len > 8)
4076 pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &pktlen);
4077 pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &pktlen);
4081 pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &pktlen);
4087 static void rtw_hal_construct_PNO_info(_adapter *padapter,
4088 u8 *pframe, u32*pLength)
4090 struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
4092 u8 *pPnoInfoPkt = pframe;
4093 pPnoInfoPkt = (u8*)(pframe+ *pLength);
4094 _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_num, 1);
4098 _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->hidden_ssid_num, 1);
4102 _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->fast_scan_period, 1);
4106 _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->fast_scan_iterations, 4);
4110 _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->slow_scan_period, 4);
4114 _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_length,
4115 MAX_PNO_LIST_COUNT);
4117 *pLength+=MAX_PNO_LIST_COUNT;
4118 pPnoInfoPkt += MAX_PNO_LIST_COUNT;
4119 _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_cipher_info,
4120 MAX_PNO_LIST_COUNT);
4122 *pLength+=MAX_PNO_LIST_COUNT;
4123 pPnoInfoPkt += MAX_PNO_LIST_COUNT;
4124 _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_channel_info,
4125 MAX_PNO_LIST_COUNT);
4127 *pLength+=MAX_PNO_LIST_COUNT;
4128 pPnoInfoPkt += MAX_PNO_LIST_COUNT;
4129 _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->loc_probe_req,
4132 *pLength+=MAX_HIDDEN_AP;
4133 pPnoInfoPkt += MAX_HIDDEN_AP;
4136 static void rtw_hal_construct_ssid_list(_adapter *padapter,
4137 u8 *pframe, u32 *pLength)
4139 struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
4140 u8 *pSSIDListPkt = pframe;
4143 pSSIDListPkt = (u8*)(pframe+ *pLength);
4145 for(i = 0; i < pwrctl->pnlo_info->ssid_num ; i++) {
4146 _rtw_memcpy(pSSIDListPkt, &pwrctl->pno_ssid_list->node[i].SSID,
4147 pwrctl->pnlo_info->ssid_length[i]);
4149 *pLength += WLAN_SSID_MAXLEN;
4150 pSSIDListPkt += WLAN_SSID_MAXLEN;
4154 static void rtw_hal_construct_scan_info(_adapter *padapter,
4155 u8 *pframe, u32 *pLength)
4157 struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
4158 u8 *pScanInfoPkt = pframe;
4161 pScanInfoPkt = (u8*)(pframe+ *pLength);
4163 _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->channel_num, 1);
4167 _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_ch, 1);
4172 _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_bw, 1);
4177 _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_40_offset, 1);
4181 _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_80_offset, 1);
4185 _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->periodScan, 1);
4189 _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->period_scan_time, 1);
4193 _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->enableRFE, 1);
4197 _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->rfe_type, 8);
4202 for(i = 0 ; i < MAX_SCAN_LIST_COUNT ; i ++) {
4203 _rtw_memcpy(pScanInfoPkt,
4204 &pwrctl->pscan_info->ssid_channel_info[i], 4);
4209 #endif //CONFIG_PNO_SUPPORT
4211 #ifdef CONFIG_GTK_OL
4212 static void rtw_hal_construct_GTKRsp(
4218 struct rtw_ieee80211_hdr *pwlanhdr;
4221 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
4222 struct wlan_network *cur_network = &pmlmepriv->cur_network;
4223 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
4224 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
4225 struct security_priv *psecuritypriv = &padapter->securitypriv;
4226 static u8 LLCHeader[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E};
4227 static u8 GTKbody_a[11] ={0x01, 0x03, 0x00, 0x5F, 0x02, 0x03, 0x12, 0x00, 0x10, 0x42, 0x0B};
4228 u8 *pGTKRspPkt = pframe;
4229 u8 EncryptionHeadOverhead = 0;
4230 //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave);
4232 pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;
4234 fctrl = &pwlanhdr->frame_ctl;
4237 //-------------------------------------------------------------------------
4239 //-------------------------------------------------------------------------
4240 SetFrameType(fctrl, WIFI_DATA);
4241 //SetFrameSubType(fctrl, 0);
4244 _rtw_memcpy(pwlanhdr->addr1,
4245 get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
4247 _rtw_memcpy(pwlanhdr->addr2,
4248 myid(&(padapter->eeprompriv)), ETH_ALEN);
4250 _rtw_memcpy(pwlanhdr->addr3,
4251 get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
4253 SetSeqNum(pwlanhdr, 0);
4254 SetDuration(pwlanhdr, 0);
4256 #ifdef CONFIG_WAPI_SUPPORT
4257 *pLength = sMacHdrLng;
4260 #endif //CONFIG_WAPI_SUPPORT
4262 //-------------------------------------------------------------------------
4263 // Security Header: leave space for it if necessary.
4264 //-------------------------------------------------------------------------
4265 switch (psecuritypriv->dot11PrivacyAlgrthm) {
4268 EncryptionHeadOverhead = 4;
4271 EncryptionHeadOverhead = 8;
4274 EncryptionHeadOverhead = 8;
4276 #ifdef CONFIG_WAPI_SUPPORT
4278 EncryptionHeadOverhead = 18;
4280 #endif //CONFIG_WAPI_SUPPORT
4282 EncryptionHeadOverhead = 0;
4285 if (EncryptionHeadOverhead > 0) {
4286 _rtw_memset(&(pframe[*pLength]), 0,EncryptionHeadOverhead);
4287 *pLength += EncryptionHeadOverhead;
4288 //SET_80211_HDR_WEP(pGTKRspPkt, 1); //Suggested by CCW.
4289 //GTK's privacy bit is done by FW
4290 //SetPrivacy(fctrl);
4292 //-------------------------------------------------------------------------
4294 //-------------------------------------------------------------------------
4295 pGTKRspPkt = (u8*)(pframe+ *pLength);
4297 _rtw_memcpy(pGTKRspPkt, LLCHeader, 8);
4303 //GTK frame body after LLC, part 1
4304 _rtw_memcpy(pGTKRspPkt, GTKbody_a, 11);
4307 //GTK frame body after LLC, part 2
4308 _rtw_memset(&(pframe[*pLength]), 0, 88);
4313 #endif //CONFIG_GTK_OL
4317 // Description: Fill the reserved packets that FW will use to RSVD page.
4318 // Now we just send 4 types packet to rsvd page.
4319 // (1)Beacon, (2)Ps-poll, (3)Null data, (4)ProbeRsp.
4321 // finished - FALSE:At the first time we will send all the packets as a large packet to Hw,
4322 // so we need to set the packet length to total lengh.
4323 // TRUE: At the second time, we should send the first packet (default:beacon)
4324 // to Hw again and set the lengh in descriptor to the real beacon lengh.
4325 // 2009.10.15 by tynli.
4327 //Page Size = 128: 8188e, 8723a/b, 8192c/d,
4328 //Page Size = 256: 8192e, 8821a
4329 //Page Size = 512: 8812a
4330 void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished)
4332 PHAL_DATA_TYPE pHalData;
4333 struct xmit_frame *pcmdframe;
4334 struct pkt_attrib *pattrib;
4335 struct xmit_priv *pxmitpriv;
4336 struct mlme_ext_priv *pmlmeext;
4337 struct mlme_ext_info *pmlmeinfo;
4338 struct pwrctrl_priv *pwrctl;
4339 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
4340 struct hal_ops *pHalFunc = &adapter->HalFunc;
4341 u32 BeaconLength = 0, ProbeRspLength = 0, PSPollLength = 0;
4342 u32 NullDataLength = 0, QosNullLength = 0, BTQosNullLength = 0;
4343 u32 ProbeReqLength = 0, NullFunctionDataLength = 0;
4344 u8 TxDescLen = TXDESC_SIZE, TxDescOffset = TXDESC_OFFSET;
4345 u8 TotalPageNum=0, CurtPktPageNum=0, RsvdPageNum=0;
4346 u8 *ReservedPagePacket;
4348 u32 TotalPacketLen = 0, MaxRsvdPageBufSize = 0, PageSize = 0;
4349 RSVDPAGE_LOC RsvdPageLoc;
4350 #ifdef CONFIG_WOWLAN
4351 u32 ARPLegnth = 0, GTKLegnth = 0, PNOLength = 0, ScanInfoLength = 0;
4353 struct security_priv *psecuritypriv = &adapter->securitypriv; //added by xx
4355 u8 cur_dot11txpn[8];
4356 #ifdef CONFIG_GTK_OL
4357 struct sta_priv *pstapriv = &adapter->stapriv;
4358 struct sta_info * psta;
4359 u8 kek[RTW_KEK_LEN];
4360 u8 kck[RTW_KCK_LEN];
4361 #endif //CONFIG_GTK_OL
4362 #ifdef CONFIG_PNO_SUPPORT
4365 #endif //CONFIG_PNO_SUPPORT
4367 #ifdef DBG_CONFIG_ERROR_DETECT
4368 struct sreset_priv *psrtpriv;
4369 #endif // DBG_CONFIG_ERROR_DETECT
4371 #ifdef CONFIG_P2P_WOWLAN
4372 u32 P2PNegoRspLength = 0, P2PInviteRspLength = 0, P2PPDRspLength = 0, P2PProbeRspLength = 0, P2PBCNLength = 0;
4375 pHalData = GET_HAL_DATA(adapter);
4376 #ifdef DBG_CONFIG_ERROR_DETECT
4377 psrtpriv = &pHalData->srestpriv;
4379 pxmitpriv = &adapter->xmitpriv;
4380 pmlmeext = &adapter->mlmeextpriv;
4381 pmlmeinfo = &pmlmeext->mlmext_info;
4382 pwrctl = adapter_to_pwrctl(adapter);
4384 rtw_hal_get_def_var(adapter, HAL_DEF_TX_PAGE_SIZE, (u8 *)&PageSize);
4385 DBG_871X("%s PAGE_SIZE: %d\n", __func__, PageSize);
4386 if (pHalFunc->hal_get_tx_buff_rsvd_page_num != NULL) {
4388 pHalFunc->hal_get_tx_buff_rsvd_page_num(adapter, _TRUE);
4389 DBG_871X("%s RsvdPageNUm: %d\n", __func__, RsvdPageNum);
4391 DBG_871X("[Error]: %s, missing tx_buff_rsvd_page_num func!!\n",
4395 MaxRsvdPageBufSize = RsvdPageNum*PageSize;
4397 pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv);
4398 if (pcmdframe == NULL) {
4399 DBG_871X("%s: alloc ReservedPagePacket fail!\n", __FUNCTION__);
4403 ReservedPagePacket = pcmdframe->buf_addr;
4404 _rtw_memset(&RsvdPageLoc, 0, sizeof(RSVDPAGE_LOC));
4407 BufIndex = TxDescOffset;
4408 rtw_hal_construct_beacon(adapter,
4409 &ReservedPagePacket[BufIndex], &BeaconLength);
4411 // When we count the first page size, we need to reserve description size for the RSVD
4412 // packet, it will be filled in front of the packet in TXPKTBUF.
4413 CurtPktPageNum = (u8)PageNum_128(TxDescLen + BeaconLength);
4414 //If we don't add 1 more page, the WOWLAN function has a problem. Baron thinks it's a bug of firmware
4415 if (CurtPktPageNum == 1)
4416 CurtPktPageNum += 1;
4418 TotalPageNum += CurtPktPageNum;
4420 BufIndex += (CurtPktPageNum*PageSize);
4423 RsvdPageLoc.LocPsPoll = TotalPageNum;
4424 DBG_871X("LocPsPoll: %d\n", RsvdPageLoc.LocPsPoll);
4425 rtw_hal_construct_PSPoll(adapter,
4426 &ReservedPagePacket[BufIndex], &PSPollLength);
4427 rtw_hal_fill_fake_txdesc(adapter,
4428 &ReservedPagePacket[BufIndex-TxDescLen],
4429 PSPollLength, _TRUE, _FALSE, _FALSE);
4431 CurtPktPageNum = (u8)PageNum((TxDescLen + PSPollLength), PageSize);
4433 TotalPageNum += CurtPktPageNum;
4435 BufIndex += (CurtPktPageNum*PageSize);
4437 #ifdef CONFIG_BT_COEXIST
4438 //BT Qos null data * 1 page
4439 RsvdPageLoc.LocBTQosNull = TotalPageNum;
4440 DBG_871X("LocBTQosNull: %d\n", RsvdPageLoc.LocBTQosNull);
4441 rtw_hal_construct_NullFunctionData(
4443 &ReservedPagePacket[BufIndex],
4445 get_my_bssid(&pmlmeinfo->network),
4446 _TRUE, 0, 0, _FALSE);
4447 rtw_hal_fill_fake_txdesc(adapter,
4448 &ReservedPagePacket[BufIndex-TxDescLen],
4449 BTQosNullLength, _FALSE, _TRUE, _FALSE);
4451 CurtPktPageNum = (u8)PageNum(TxDescLen + BTQosNullLength, PageSize);
4453 TotalPageNum += CurtPktPageNum;
4455 BufIndex += (CurtPktPageNum*PageSize);
4456 #endif //CONFIG_BT_COEXIT
4458 //null data * 1 page
4459 RsvdPageLoc.LocNullData = TotalPageNum;
4460 DBG_871X("LocNullData: %d\n", RsvdPageLoc.LocNullData);
4461 rtw_hal_construct_NullFunctionData(
4463 &ReservedPagePacket[BufIndex],
4465 get_my_bssid(&pmlmeinfo->network),
4466 _FALSE, 0, 0, _FALSE);
4467 rtw_hal_fill_fake_txdesc(adapter,
4468 &ReservedPagePacket[BufIndex-TxDescLen],
4469 NullDataLength, _FALSE, _FALSE, _FALSE);
4471 CurtPktPageNum = (u8)PageNum(TxDescLen + NullDataLength, PageSize);
4473 TotalPageNum += CurtPktPageNum;
4475 BufIndex += (CurtPktPageNum*PageSize);
4477 //Qos null data * 1 page
4478 RsvdPageLoc.LocQosNull = TotalPageNum;
4479 DBG_871X("LocQosNull: %d\n", RsvdPageLoc.LocQosNull);
4480 rtw_hal_construct_NullFunctionData(
4482 &ReservedPagePacket[BufIndex],
4484 get_my_bssid(&pmlmeinfo->network),
4485 _TRUE, 0, 0, _FALSE);
4486 rtw_hal_fill_fake_txdesc(adapter,
4487 &ReservedPagePacket[BufIndex-TxDescLen],
4488 QosNullLength, _FALSE, _FALSE, _FALSE);
4490 CurtPktPageNum = (u8)PageNum(TxDescLen + QosNullLength, PageSize);
4492 TotalPageNum += CurtPktPageNum;
4494 BufIndex += (CurtPktPageNum*PageSize);
4496 #ifdef CONFIG_WOWLAN
4497 if (pwrctl->wowlan_mode == _TRUE &&
4498 check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
4500 rtw_get_current_ip_address(adapter, currentip);
4502 RsvdPageLoc.LocArpRsp= TotalPageNum;
4504 rtw_hal_construct_ARPRsp(
4506 &ReservedPagePacket[BufIndex],
4510 rtw_hal_fill_fake_txdesc(adapter,
4511 &ReservedPagePacket[BufIndex-TxDescLen],
4512 ARPLegnth, _FALSE, _FALSE, _TRUE);
4514 CurtPktPageNum = (u8)PageNum(TxDescLen + ARPLegnth, PageSize);
4516 TotalPageNum += CurtPktPageNum;
4518 BufIndex += (CurtPktPageNum*PageSize);
4521 rtw_get_sec_iv(adapter, cur_dot11txpn,
4522 get_my_bssid(&pmlmeinfo->network));
4524 RsvdPageLoc.LocRemoteCtrlInfo = TotalPageNum;
4526 _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen,
4527 cur_dot11txpn, _AES_IV_LEN_);
4529 CurtPktPageNum = (u8)PageNum(_AES_IV_LEN_, PageSize);
4531 TotalPageNum += CurtPktPageNum;
4532 #ifdef CONFIG_GTK_OL
4533 BufIndex += (CurtPktPageNum*PageSize);
4535 //if the ap staion info. exists, get the kek, kck from staion info.
4536 psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
4538 _rtw_memset(kek, 0, RTW_KEK_LEN);
4539 _rtw_memset(kck, 0, RTW_KCK_LEN);
4540 DBG_8192C("%s, KEK, KCK download rsvd page all zero \n",
4543 _rtw_memcpy(kek, psta->kek, RTW_KEK_LEN);
4544 _rtw_memcpy(kck, psta->kck, RTW_KCK_LEN);
4548 RsvdPageLoc.LocGTKInfo = TotalPageNum;
4549 _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen,
4551 _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen+RTW_KCK_LEN,
4556 printk("\ntoFW KCK: ");
4558 printk(" %02x ", kck[i]);
4559 printk("\ntoFW KEK: ");
4561 printk(" %02x ", kek[i]);
4566 //DBG_871X("%s(): HW_VAR_SET_TX_CMD: KEK KCK %p %d\n",
4567 // __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen],
4568 // (TxDescLen + RTW_KCK_LEN + RTW_KEK_LEN));
4570 CurtPktPageNum = (u8)PageNum(TxDescLen + RTW_KCK_LEN + RTW_KEK_LEN, PageSize);
4572 TotalPageNum += CurtPktPageNum;
4574 BufIndex += (CurtPktPageNum*PageSize);
4577 RsvdPageLoc.LocGTKRsp= TotalPageNum;
4578 rtw_hal_construct_GTKRsp(
4580 &ReservedPagePacket[BufIndex],
4583 rtw_hal_fill_fake_txdesc(adapter,
4584 &ReservedPagePacket[BufIndex-TxDescLen],
4585 GTKLegnth, _FALSE, _FALSE, _TRUE);
4589 printk("123GTK pkt=> \n");
4590 for(gj=0; gj < GTKLegnth+TxDescLen; gj++) {
4591 printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen+gj]);
4599 //DBG_871X("%s(): HW_VAR_SET_TX_CMD: GTK RSP %p %d\n",
4600 // __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen],
4601 // (TxDescLen + GTKLegnth));
4603 CurtPktPageNum = (u8)PageNum(TxDescLen + GTKLegnth, PageSize);
4605 TotalPageNum += CurtPktPageNum;
4607 BufIndex += (CurtPktPageNum*PageSize);
4609 //below page is empty for GTK extension memory
4611 RsvdPageLoc.LocGTKEXTMEM= TotalPageNum;
4615 TotalPageNum += CurtPktPageNum;
4616 //extension memory for FW
4617 TotalPacketLen = BufIndex-TxDescLen + (PageSize*CurtPktPageNum);
4618 #else //CONFIG_GTK_OL
4619 TotalPacketLen = BufIndex + _AES_IV_LEN_;
4620 #endif //CONFIG_GTK_OL
4621 } else if (pwrctl->wowlan_pno_enable == _TRUE) {
4622 #ifdef CONFIG_PNO_SUPPORT
4623 if (pwrctl->pno_in_resume == _FALSE &&
4624 pwrctl->pno_inited == _TRUE) {
4626 //Broadcast Probe Request
4627 RsvdPageLoc.LocProbePacket = TotalPageNum;
4629 DBG_871X("loc_probe_req: %d\n",
4630 RsvdPageLoc.LocProbePacket);
4632 rtw_hal_construct_ProbeReq(
4634 &ReservedPagePacket[BufIndex],
4638 rtw_hal_fill_fake_txdesc(adapter,
4639 &ReservedPagePacket[BufIndex-TxDescLen],
4640 ProbeReqLength, _FALSE, _FALSE, _FALSE);
4642 #ifdef CONFIG_PNO_SET_DEBUG
4645 printk("probe req pkt=> \n");
4646 for(gj=0; gj < ProbeReqLength + TxDescLen; gj++) {
4647 printk(" %02x ",ReservedPagePacket[BufIndex- TxDescLen + gj]);
4655 (u8)PageNum(TxDescLen + ProbeReqLength, PageSize);
4657 TotalPageNum += CurtPktPageNum;
4659 BufIndex += (CurtPktPageNum*PageSize);
4661 //Hidden SSID Probe Request
4662 ssid_num = pwrctl->pnlo_info->hidden_ssid_num;
4664 for (index = 0 ; index < ssid_num ; index++) {
4665 pwrctl->pnlo_info->loc_probe_req[index] =
4668 rtw_hal_construct_ProbeReq(
4670 &ReservedPagePacket[BufIndex],
4672 &pwrctl->pno_ssid_list->node[index]);
4674 rtw_hal_fill_fake_txdesc(adapter,
4675 &ReservedPagePacket[BufIndex-TxDescLen],
4676 ProbeReqLength, _FALSE, _FALSE, _FALSE);
4678 #ifdef CONFIG_PNO_SET_DEBUG
4681 printk("probe req pkt=> \n");
4682 for(gj=0; gj < ProbeReqLength + TxDescLen; gj++) {
4683 printk(" %02x ", ReservedPagePacket[BufIndex- TxDescLen + gj]);
4691 (u8)PageNum(TxDescLen + ProbeReqLength, PageSize);
4693 TotalPageNum += CurtPktPageNum;
4695 BufIndex += (CurtPktPageNum*PageSize);
4699 RsvdPageLoc.LocPNOInfo = TotalPageNum;
4700 rtw_hal_construct_PNO_info(adapter,
4701 &ReservedPagePacket[BufIndex -TxDescLen],
4703 #ifdef CONFIG_PNO_SET_DEBUG
4706 printk("PNO pkt=> \n");
4707 for(gj=0; gj < PNOLength; gj++) {
4708 printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen +gj]);
4716 CurtPktPageNum = (u8)PageNum_128(PNOLength);
4717 TotalPageNum += CurtPktPageNum;
4718 BufIndex += (CurtPktPageNum*PageSize);
4721 RsvdPageLoc.LocSSIDInfo = TotalPageNum;
4722 rtw_hal_construct_ssid_list(adapter,
4723 &ReservedPagePacket[BufIndex-TxDescLen],
4725 #ifdef CONFIG_PNO_SET_DEBUG
4728 printk("SSID list pkt=> \n");
4729 for(gj=0; gj < SSIDLegnth; gj++) {
4730 printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen+gj]);
4737 CurtPktPageNum = (u8)PageNum_128(SSIDLegnth);
4738 TotalPageNum += CurtPktPageNum;
4739 BufIndex += (CurtPktPageNum*PageSize);
4742 RsvdPageLoc.LocScanInfo = TotalPageNum;
4743 rtw_hal_construct_scan_info(adapter,
4744 &ReservedPagePacket[BufIndex-TxDescLen],
4746 #ifdef CONFIG_PNO_SET_DEBUG
4749 printk("Scan info pkt=> \n");
4750 for(gj=0; gj < ScanInfoLength; gj++) {
4751 printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen+gj]);
4758 CurtPktPageNum = (u8)PageNum(ScanInfoLength, PageSize);
4759 TotalPageNum += CurtPktPageNum;
4760 BufIndex += (CurtPktPageNum*PageSize);
4761 TotalPacketLen = BufIndex + ScanInfoLength;
4763 TotalPacketLen = BufIndex + QosNullLength;
4765 #endif //CONFIG_PNO_SUPPORT
4767 TotalPacketLen = BufIndex + QosNullLength;
4769 #else //CONFIG_WOWLAN
4770 TotalPacketLen = BufIndex + QosNullLength;
4771 #endif //CONFIG_WOWLAN
4773 #ifdef CONFIG_P2P_WOWLAN
4774 if(_TRUE == pwrctl->wowlan_p2p_mode)
4778 RsvdPageLoc.LocP2PBeacon= TotalPageNum;
4779 rtw_hal_construct_P2PBeacon(
4781 &ReservedPagePacket[BufIndex],
4783 rtw_hal_fill_fake_txdesc(adapter,
4784 &ReservedPagePacket[BufIndex-TxDescLen],
4785 P2PBCNLength, _FALSE, _FALSE, _FALSE);
4787 //DBG_871X("%s(): HW_VAR_SET_TX_CMD: PROBE RSP %p %d\n",
4788 // __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (P2PBCNLength+TxDescLen));
4790 CurtPktPageNum = (u8)PageNum(TxDescLen + P2PBCNLength, PageSize);
4792 TotalPageNum += CurtPktPageNum;
4794 BufIndex += (CurtPktPageNum*PageSize);
4797 RsvdPageLoc.LocP2PProbeRsp = TotalPageNum;
4798 rtw_hal_construct_P2PProbeRsp(
4800 &ReservedPagePacket[BufIndex],
4801 &P2PProbeRspLength);
4802 rtw_hal_fill_fake_txdesc(adapter,
4803 &ReservedPagePacket[BufIndex-TxDescLen],
4804 P2PProbeRspLength, _FALSE, _FALSE, _FALSE);
4806 //DBG_871X("%s(): HW_VAR_SET_TX_CMD: PROBE RSP %p %d\n",
4807 // __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (P2PProbeRspLength+TxDescLen));
4809 CurtPktPageNum = (u8)PageNum(TxDescLen + P2PProbeRspLength, PageSize);
4811 TotalPageNum += CurtPktPageNum;
4813 BufIndex += (CurtPktPageNum*PageSize);
4816 RsvdPageLoc.LocNegoRsp = TotalPageNum;
4817 rtw_hal_construct_P2PNegoRsp(
4819 &ReservedPagePacket[BufIndex],
4821 rtw_hal_fill_fake_txdesc(adapter,
4822 &ReservedPagePacket[BufIndex-TxDescLen],
4823 P2PNegoRspLength, _FALSE, _FALSE, _FALSE);
4825 //DBG_871X("%s(): HW_VAR_SET_TX_CMD: QOS NULL DATA %p %d\n",
4826 // __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (NegoRspLength+TxDescLen));
4828 CurtPktPageNum = (u8)PageNum(TxDescLen + P2PNegoRspLength, PageSize);
4830 TotalPageNum += CurtPktPageNum;
4832 BufIndex += (CurtPktPageNum*PageSize);
4835 RsvdPageLoc.LocInviteRsp = TotalPageNum;
4836 rtw_hal_construct_P2PInviteRsp(
4838 &ReservedPagePacket[BufIndex],
4839 &P2PInviteRspLength);
4840 rtw_hal_fill_fake_txdesc(adapter,
4841 &ReservedPagePacket[BufIndex-TxDescLen],
4842 P2PInviteRspLength, _FALSE, _FALSE, _FALSE);
4844 //DBG_871X("%s(): HW_VAR_SET_TX_CMD: QOS NULL DATA %p %d\n",
4845 // __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (InviteRspLength+TxDescLen));
4847 CurtPktPageNum = (u8)PageNum(TxDescLen + P2PInviteRspLength, PageSize);
4849 TotalPageNum += CurtPktPageNum;
4851 BufIndex += (CurtPktPageNum*PageSize);
4853 //P2P provision discovery rsp
4854 RsvdPageLoc.LocPDRsp = TotalPageNum;
4855 rtw_hal_construct_P2PProvisionDisRsp(
4857 &ReservedPagePacket[BufIndex],
4859 rtw_hal_fill_fake_txdesc(adapter,
4860 &ReservedPagePacket[BufIndex-TxDescLen],
4861 P2PPDRspLength, _FALSE, _FALSE, _FALSE);
4863 //DBG_871X("%s(): HW_VAR_SET_TX_CMD: QOS NULL DATA %p %d\n",
4864 // __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (PDRspLength+TxDescLen));
4866 CurtPktPageNum = (u8)PageNum(TxDescLen + P2PPDRspLength, PageSize);
4868 TotalPageNum += CurtPktPageNum;
4870 BufIndex += (CurtPktPageNum*PageSize);
4872 TotalPacketLen = BufIndex + P2PPDRspLength;
4874 #endif //CONFIG_P2P_WOWLAN
4876 if(TotalPacketLen > MaxRsvdPageBufSize) {
4877 DBG_871X("%s(ERROR): rsvd page size is not enough!!TotalPacketLen %d, MaxRsvdPageBufSize %d\n",
4878 __FUNCTION__, TotalPacketLen,MaxRsvdPageBufSize);
4882 pattrib = &pcmdframe->attrib;
4883 update_mgntframe_attrib(adapter, pattrib);
4884 pattrib->qsel = 0x10;
4885 pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset;
4886 #ifdef CONFIG_PCI_HCI
4887 dump_mgntframe(adapter, pcmdframe);
4889 dump_mgntframe_and_wait(adapter, pcmdframe, 100);
4893 DBG_871X("%s: Set RSVD page location to Fw ,TotalPacketLen(%d), TotalPageNum(%d)\n",
4894 __func__,TotalPacketLen,TotalPageNum);
4896 if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
4897 rtw_hal_set_FwRsvdPage_cmd(adapter, &RsvdPageLoc);
4898 if (pwrctl->wowlan_mode == _TRUE)
4899 rtw_hal_set_FwAoacRsvdPage_cmd(adapter, &RsvdPageLoc);
4900 } else if (pwrctl->wowlan_pno_enable) {
4901 #ifdef CONFIG_PNO_SUPPORT
4902 rtw_hal_set_FwAoacRsvdPage_cmd(adapter, &RsvdPageLoc);
4903 if(pwrctl->pno_in_resume)
4904 rtw_hal_set_scan_offload_info_cmd(adapter,
4907 rtw_hal_set_scan_offload_info_cmd(adapter,
4909 #endif //CONFIG_PNO_SUPPORT
4911 #ifdef CONFIG_P2P_WOWLAN
4912 if(_TRUE == pwrctl->wowlan_p2p_mode)
4913 rtw_hal_set_FwP2PRsvdPage_cmd(adapter, &RsvdPageLoc);
4915 #endif //CONFIG_P2P_WOWLAN
4918 rtw_free_xmitframe(pxmitpriv, pcmdframe);
4921 static void rtw_hal_download_rsvd_page(_adapter* adapter, u8 mstatus)
4923 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
4924 struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);
4925 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
4926 struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
4927 BOOLEAN bcn_valid = _FALSE;
4934 DBG_8192C("+" FUNC_ADPT_FMT ": iface_type=%d mstatus(%x)\n",
4935 FUNC_ADPT_ARG(adapter), get_iface_type(adapter), mstatus);
4937 if(mstatus == RT_MEDIA_CONNECT) {
4938 BOOLEAN bRecover = _FALSE;
4941 // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C.
4942 // Suggested by filen. Added by tynli.
4943 rtw_write16(adapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid));
4946 v8 = rtw_read8(adapter, REG_CR+1);
4947 v8 |= BIT(0); // ENSWBCN
4948 rtw_write8(adapter, REG_CR+1, v8);
4950 // Disable Hw protection for a time which revserd for Hw sending beacon.
4951 // Fix download reserved page packet fail that access collision with the protection time.
4952 // 2010.05.11. Added by tynli.
4953 val8 = rtw_read8(adapter, REG_BCN_CTRL);
4954 val8 &= ~EN_BCN_FUNCTION;
4955 val8 |= DIS_TSF_UDT;
4956 rtw_write8(adapter, REG_BCN_CTRL, val8);
4958 // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.
4959 if (pHalData->RegFwHwTxQCtrl & BIT(6))
4962 // To tell Hw the packet is not a real beacon frame.
4963 rtw_write8(adapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl & ~BIT(6));
4964 pHalData->RegFwHwTxQCtrl &= ~BIT(6);
4966 // Clear beacon valid check bit.
4967 rtw_hal_set_hwreg(adapter, HW_VAR_BCN_VALID, NULL);
4968 rtw_hal_set_hwreg(adapter, HW_VAR_DL_BCN_SEL, NULL);
4973 // download rsvd page.
4974 rtw_hal_set_fw_rsvd_page(adapter, 0);
4979 //rtw_mdelay_os(10);
4980 // check rsvd page download OK.
4981 rtw_hal_get_hwreg(adapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid));
4983 } while(!bcn_valid && (poll%10)!=0 && !adapter->bSurpriseRemoved && !adapter->bDriverStopped);
4984 }while(!bcn_valid && DLBcnCount<=100 && !adapter->bSurpriseRemoved && !adapter->bDriverStopped);
4986 if(adapter->bSurpriseRemoved || adapter->bDriverStopped) {
4987 DBG_871X(ADPT_FMT": 0 bSurpriseRemoved:%d, bDriverStopped:%d\n",
4988 ADPT_ARG(adapter) ,adapter->bSurpriseRemoved,
4989 adapter->bDriverStopped);
4990 } else if(!bcn_valid) {
4991 DBG_871X(ADPT_FMT": 1 DL RSVD page failed! DLBcnCount:%u, poll:%u\n",
4992 ADPT_ARG(adapter) ,DLBcnCount, poll);
4994 struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
4995 pwrctl->fw_psmode_iface_id = adapter->iface_id;
4996 DBG_871X(ADPT_FMT": 1 DL RSVD page success! DLBcnCount:%u, poll:%u\n",
4997 ADPT_ARG(adapter), DLBcnCount, poll);
5000 // 2010.05.11. Added by tynli.
5001 val8 = rtw_read8(adapter, REG_BCN_CTRL);
5002 val8 |= EN_BCN_FUNCTION;
5003 val8 &= ~DIS_TSF_UDT;
5004 rtw_write8(adapter, REG_BCN_CTRL, val8);
5006 // To make sure that if there exists an adapter which would like to send beacon.
5007 // If exists, the origianl value of 0x422[6] will be 1, we should check this to
5008 // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause
5009 // the beacon cannot be sent by HW.
5010 // 2010.06.23. Added by tynli.
5012 rtw_write8(adapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl | BIT(6));
5013 pHalData->RegFwHwTxQCtrl |= BIT(6);
5016 // Clear CR[8] or beacon packet will not be send to TxBuf anymore.
5017 v8 = rtw_read8(adapter, REG_CR+1);
5018 v8 &= ~BIT(0); // ~ENSWBCN
5019 rtw_write8(adapter, REG_CR+1, v8);
5024 #endif //CONFIG_WOWLAN
5026 void SetHwReg(_adapter *adapter, u8 variable, u8 *val)
5028 HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
5029 DM_ODM_T *odm = &(hal_data->odmpriv);
5034 case HW_VAR_INITIAL_GAIN:
5036 u32 rx_gain = ((u32 *)(val))[0];
5038 if(rx_gain == 0xff){//restore rx gain
5039 //ODM_Write_DIG(podmpriv,pDigTable->BackupIGValue);
5040 odm_PauseDIG(odm, ODM_RESUME_DIG,rx_gain);
5043 //pDigTable->BackupIGValue = pDigTable->CurIGValue;
5044 //ODM_Write_DIG(podmpriv,rx_gain);
5045 odm_PauseDIG(odm, ODM_PAUSE_DIG,rx_gain);
5049 case HW_VAR_PORT_SWITCH:
5050 hw_var_port_switch(adapter);
5052 case HW_VAR_INIT_RTS_RATE:
5054 u16 brate_cfg = *((u16*)val);
5056 HAL_VERSION *hal_ver = &hal_data->VersionID;
5058 if (IS_81XXC(*hal_ver) ||IS_92D(*hal_ver) || IS_8723_SERIES(*hal_ver) || IS_8188E(*hal_ver)) {
5060 while (brate_cfg > 0x1) {
5061 brate_cfg = (brate_cfg >> 1);
5064 rtw_write8(adapter, REG_INIRTS_RATE_SEL, rate_index);
5070 case HW_VAR_SEC_CFG:
5072 #if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC)
5073 // enable tx enc and rx dec engine, and no key search for MC/BC
5074 rtw_write8(adapter, REG_SECCFG, SCR_NoSKMC|SCR_RxDecEnable|SCR_TxEncEnable);
5075 #elif defined(DYNAMIC_CAMID_ALLOC)
5078 reg_scr = rtw_read16(adapter, REG_SECCFG);
5079 rtw_write16(adapter, REG_SECCFG, reg_scr|SCR_CHK_KEYID|SCR_RxDecEnable|SCR_TxEncEnable);
5081 rtw_write8(adapter, REG_SECCFG, *((u8*)val));
5085 case HW_VAR_SEC_DK_CFG:
5087 struct security_priv *sec = &adapter->securitypriv;
5088 u8 reg_scr = rtw_read8(adapter, REG_SECCFG);
5090 if (val) /* Enable default key related setting */
5092 reg_scr |= SCR_TXBCUSEDK;
5093 if (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)
5094 reg_scr |= (SCR_RxUseDK|SCR_TxUseDK);
5096 else /* Disable default key related setting */
5098 reg_scr &= ~(SCR_RXBCUSEDK|SCR_TXBCUSEDK|SCR_RxUseDK|SCR_TxUseDK);
5101 rtw_write8(adapter, REG_SECCFG, reg_scr);
5104 case HW_VAR_DM_FLAG:
5105 odm->SupportAbility = *((u32*)val);
5107 case HW_VAR_DM_FUNC_OP:
5108 if (*((u8*)val) == _TRUE) {
5110 odm->BK_SupportAbility = odm->SupportAbility;
5112 /* restore dm flag */
5113 odm->SupportAbility = odm->BK_SupportAbility;
5116 case HW_VAR_DM_FUNC_SET:
5117 if(*((u32*)val) == DYNAMIC_ALL_FUNC_ENABLE){
5118 struct dm_priv *dm = &hal_data->dmpriv;
5119 dm->DMFlag = dm->InitDMFlag;
5120 odm->SupportAbility = dm->InitODMFlag;
5122 odm->SupportAbility |= *((u32 *)val);
5125 case HW_VAR_DM_FUNC_CLR:
5127 * input is already a mask to clear function
5128 * don't invert it again! George,Lucas@20130513
5130 odm->SupportAbility &= *((u32 *)val);
5132 case HW_VAR_ASIX_IOT:
5133 // enable ASIX IOT function
5134 if (*((u8*)val) == _TRUE) {
5135 // 0xa2e[0]=0 (disable rake receiver)
5136 rtw_write8(adapter, rCCK0_FalseAlarmReport+2,
5137 rtw_read8(adapter, rCCK0_FalseAlarmReport+2) & ~(BIT0));
5138 // 0xa1c=0xa0 (reset channel estimation if signal quality is bad)
5139 rtw_write8(adapter, rCCK0_DSPParameter2, 0xa0);
5141 // restore reg:0xa2e, reg:0xa1c
5142 rtw_write8(adapter, rCCK0_FalseAlarmReport+2,
5143 rtw_read8(adapter, rCCK0_FalseAlarmReport+2)|(BIT0));
5144 rtw_write8(adapter, rCCK0_DSPParameter2, 0x00);
5147 #ifdef CONFIG_WOWLAN
5150 struct wowlan_ioctl_param *poidparam;
5151 struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
5152 struct security_priv *psecuritypriv = &adapter->securitypriv;
5153 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
5154 struct hal_ops *pHalFunc = &adapter->HalFunc;
5155 struct sta_info *psta = NULL;
5157 u16 media_status_rpt;
5160 poidparam = (struct wowlan_ioctl_param *)val;
5161 switch (poidparam->subcode) {
5163 DBG_871X_LEVEL(_drv_always_, "WOWLAN_ENABLE\n");
5165 #ifdef CONFIG_GTK_OL
5166 if (psecuritypriv->dot11PrivacyAlgrthm == _AES_)
5167 rtw_hal_fw_sync_cam_id(adapter);
5169 if (IS_HARDWARE_TYPE_8723B(adapter))
5170 rtw_hal_backup_rate(adapter);
5172 if (pHalFunc->hal_set_wowlan_fw != NULL)
5173 pHalFunc->hal_set_wowlan_fw(adapter, _TRUE);
5175 DBG_871X("hal_set_wowlan_fw is null\n");
5177 rtw_hal_download_rsvd_page(adapter, RT_MEDIA_CONNECT);
5179 if (!pwrctl->wowlan_pno_enable) {
5180 psta = rtw_get_stainfo(&adapter->stapriv,
5181 get_bssid(pmlmepriv));
5183 (u16)((psta->mac_id<<8)|RT_MEDIA_CONNECT);
5185 rtw_hal_set_hwreg(adapter,
5186 HW_VAR_H2C_MEDIA_STATUS_RPT,
5187 (u8 *)&media_status_rpt);
5193 if (IS_HARDWARE_TYPE_8188E(adapter))
5194 rtw_hal_disable_tx_report(adapter);
5197 res = rtw_hal_pause_rx_dma(adapter);
5199 DBG_871X_LEVEL(_drv_always_, "[WARNING] pause RX DMA fail\n");
5201 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
5202 //Enable CPWM2 only.
5203 res = rtw_hal_enable_cpwm2(adapter);
5205 DBG_871X_LEVEL(_drv_always_, "[WARNING] enable cpwm2 fail\n");
5208 //Set WOWLAN H2C command.
5209 DBG_871X_LEVEL(_drv_always_, "Set WOWLan cmd\n");
5210 rtw_hal_set_fw_wow_related_cmd(adapter, 1);
5212 res = rtw_hal_check_wow_ctrl(adapter, _TRUE);
5214 DBG_871X("[Error]%s: set wowlan CMD fail!!\n", __func__);
5216 pwrctl->wowlan_wake_reason =
5217 rtw_read8(adapter, REG_WOWLAN_WAKE_REASON);
5219 DBG_871X_LEVEL(_drv_always_,
5220 "wowlan_wake_reason: 0x%02x\n",
5221 pwrctl->wowlan_wake_reason);
5222 #ifdef CONFIG_GTK_OL_DBG
5223 dump_cam_table(adapter);
5225 #ifdef CONFIG_USB_HCI
5226 if (adapter->intf_stop)
5227 adapter->intf_stop(adapter);
5229 /* Invoid SE0 reset signal during suspending*/
5230 rtw_write8(adapter, REG_RSV_CTRL, 0x20);
5231 rtw_write8(adapter, REG_RSV_CTRL, 0x60);
5232 #endif //CONFIG_USB_HCI
5234 case WOWLAN_DISABLE:
5235 DBG_871X_LEVEL(_drv_always_, "WOWLAN_DISABLE\n");
5237 if (!pwrctl->wowlan_pno_enable) {
5238 psta = rtw_get_stainfo(&adapter->stapriv,
5239 get_bssid(pmlmepriv));
5243 (u16)((psta->mac_id<<8)|RT_MEDIA_DISCONNECT);
5244 rtw_hal_set_hwreg(adapter,
5245 HW_VAR_H2C_MEDIA_STATUS_RPT,
5246 (u8 *)&media_status_rpt);
5248 DBG_871X("%s: psta is null\n", __func__);
5253 DBG_871X("0x630:0x%02x\n",
5254 rtw_read8(adapter, 0x630));
5255 DBG_871X("0x631:0x%02x\n",
5256 rtw_read8(adapter, 0x631));
5259 pwrctl->wowlan_wake_reason = rtw_read8(adapter,
5260 REG_WOWLAN_WAKE_REASON);
5262 DBG_871X_LEVEL(_drv_always_, "wakeup_reason: 0x%02x\n",
5263 pwrctl->wowlan_wake_reason);
5265 rtw_hal_set_fw_wow_related_cmd(adapter, 0);
5267 res = rtw_hal_check_wow_ctrl(adapter, _FALSE);
5268 if (res == _FALSE) {
5269 DBG_871X("[Error]%s: disable WOW cmd fail\n!!", __func__);
5270 rtw_hal_force_enable_rxdma(adapter);
5273 if (IS_HARDWARE_TYPE_8188E(adapter))
5274 rtw_hal_enable_tx_report(adapter);
5276 rtw_hal_update_tx_iv(adapter);
5278 #ifdef CONFIG_GTK_OL
5279 if (psecuritypriv->dot11PrivacyAlgrthm == _AES_)
5280 rtw_hal_update_gtk_offload_info(adapter);
5281 #endif //CONFIG_GTK_OL
5283 if (pHalFunc->hal_set_wowlan_fw != NULL)
5284 pHalFunc->hal_set_wowlan_fw(adapter, _FALSE);
5286 DBG_871X("hal_set_wowlan_fw is null\n");
5287 #ifdef CONFIG_GPIO_WAKEUP
5288 rtw_clear_hostwakeupgpio(adapter);
5290 if((pwrctl->wowlan_wake_reason != FWDecisionDisconnect) &&
5291 (pwrctl->wowlan_wake_reason != Rx_Pairwisekey) &&
5292 (pwrctl->wowlan_wake_reason != Rx_DisAssoc) &&
5293 (pwrctl->wowlan_wake_reason != Rx_DeAuth)) {
5295 rtw_hal_download_rsvd_page(adapter, RT_MEDIA_CONNECT);
5298 (u16)((psta->mac_id<<8)|RT_MEDIA_CONNECT);
5299 rtw_hal_set_hwreg(adapter,
5300 HW_VAR_H2C_MEDIA_STATUS_RPT,
5301 (u8 *)&media_status_rpt);
5310 #endif //CONFIG_WOWLAN
5313 DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" variable(%d) not defined!\n",
5314 FUNC_ADPT_ARG(adapter), variable);
5321 void GetHwReg(_adapter *adapter, u8 variable, u8 *val)
5323 HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
5324 DM_ODM_T *odm = &(hal_data->odmpriv);
5329 case HW_VAR_BASIC_RATE:
5330 *((u16*)val) = hal_data->BasicRateSet;
5332 case HW_VAR_DM_FLAG:
5333 *((u32*)val) = odm->SupportAbility;
5335 case HW_VAR_RF_TYPE:
5336 *((u8*)val) = hal_data->rf_type;
5340 DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" variable(%d) not defined!\n",
5341 FUNC_ADPT_ARG(adapter), variable);
5352 SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
5354 HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
5355 DM_ODM_T *odm = &(hal_data->odmpriv);
5356 u8 bResult = _SUCCESS;
5359 case HW_DEF_FA_CNT_DUMP:
5362 odm->DebugComponents |= (ODM_COMP_DIG |ODM_COMP_FA_CNT);
5364 odm->DebugComponents &= ~(ODM_COMP_DIG |ODM_COMP_FA_CNT);
5366 case HAL_DEF_DBG_RX_INFO_DUMP:
5368 PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( odm , PHYDM_FALSEALMCNT);
5369 pDIG_T pDM_DigTable = &odm->DM_DigTable;
5371 DBG_871X("============ Rx Info dump ===================\n");
5372 DBG_871X("bLinked = %d, RSSI_Min = %d(%%), CurrentIGI = 0x%x \n",
5373 odm->bLinked, odm->RSSI_Min, pDM_DigTable->CurIGValue);
5374 DBG_871X("Cnt_Cck_fail = %d, Cnt_Ofdm_fail = %d, Total False Alarm = %d\n",
5375 FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_all);
5378 DBG_871X("RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n",
5379 HDATA_RATE(odm->RxRate), odm->RSSI_A, odm->RSSI_B);
5381 #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
5382 rtw_dump_raw_rssi_info(adapter);
5387 case HW_DEF_ODM_DBG_FLAG:
5388 ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_COMP, *((u8Byte*)value));
5390 case HW_DEF_ODM_DBG_LEVEL:
5391 ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_LEVEL, *((u4Byte*)value));
5393 case HAL_DEF_DBG_DM_FUNC:
5395 u8 dm_func = *((u8*)value);
5396 struct dm_priv *dm = &hal_data->dmpriv;
5398 if(dm_func == 0){ //disable all dynamic func
5399 pDIG_T pDM_DigTable = &odm->DM_DigTable;
5400 odm->SupportAbility = DYNAMIC_FUNC_DISABLE;
5401 pDM_DigTable->bStopDIG = _TRUE;
5402 DBG_8192C("==> Disable all dynamic function...\n");
5404 else if(dm_func == 1){//disable DIG
5405 pDIG_T pDM_DigTable = &odm->DM_DigTable;
5406 odm->SupportAbility &= (~DYNAMIC_BB_DIG);
5407 pDM_DigTable->bStopDIG = _TRUE;
5408 DBG_8192C("==> Disable DIG...\n");
5410 else if(dm_func == 2){//disable High power
5411 odm->SupportAbility &= (~DYNAMIC_BB_DYNAMIC_TXPWR);
5413 else if(dm_func == 3){//disable tx power tracking
5414 odm->SupportAbility &= (~DYNAMIC_RF_CALIBRATION);
5415 DBG_8192C("==> Disable tx power tracking...\n");
5417 else if(dm_func == 4){//disable BT coexistence
5418 dm->DMFlag &= (~DYNAMIC_FUNC_BT);
5420 else if(dm_func == 5){//disable antenna diversity
5421 odm->SupportAbility &= (~DYNAMIC_BB_ANT_DIV);
5423 else if(dm_func == 6){//turn on all dynamic func
5424 if(!(odm->SupportAbility & DYNAMIC_BB_DIG)) {
5425 DIG_T *pDigTable = &odm->DM_DigTable;
5426 pDigTable->CurIGValue= rtw_read8(adapter, 0xc50);
5427 pDigTable->bStopDIG = _FALSE;
5429 dm->DMFlag |= DYNAMIC_FUNC_BT;
5430 odm->SupportAbility = DYNAMIC_ALL_FUNC_ENABLE;
5432 DBG_8192C("==> Turn on all dynamic function...\n");
5436 case HAL_DEF_DBG_DUMP_RXPKT:
5437 hal_data->bDumpRxPkt = *((u8*)value);
5439 case HAL_DEF_DBG_DUMP_TXPKT:
5440 hal_data->bDumpTxPkt = *((u8*)value);
5442 case HAL_DEF_ANT_DETECT:
5443 hal_data->AntDetection = *((u8 *)value);
5445 case HAL_DEF_DBG_DIS_PWT:
5446 hal_data->bDisableTXPowerTraining = *((u8*)value);
5449 DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __FUNCTION__, variable);
5458 GetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
5460 HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
5461 DM_ODM_T *odm = &(hal_data->odmpriv);
5462 u8 bResult = _SUCCESS;
5465 case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
5467 struct mlme_priv *pmlmepriv;
5468 struct sta_priv *pstapriv;
5469 struct sta_info *psta;
5471 pmlmepriv = &adapter->mlmepriv;
5472 pstapriv = &adapter->stapriv;
5473 psta = rtw_get_stainfo(pstapriv, pmlmepriv->cur_network.network.MacAddress);
5476 *((int*)value) = psta->rssi_stat.UndecoratedSmoothedPWDB;
5480 case HW_DEF_ODM_DBG_FLAG:
5481 *((u8Byte*)value) = odm->DebugComponents;
5483 case HW_DEF_ODM_DBG_LEVEL:
5484 *((u4Byte*)value) = odm->DebugLevel;
5486 case HAL_DEF_DBG_DM_FUNC:
5487 *(( u32*)value) =hal_data->odmpriv.SupportAbility;
5489 case HAL_DEF_DBG_DUMP_RXPKT:
5490 *((u8*)value) = hal_data->bDumpRxPkt;
5492 case HAL_DEF_DBG_DUMP_TXPKT:
5493 *((u8*)value) = hal_data->bDumpTxPkt;
5495 case HAL_DEF_ANT_DETECT:
5496 *((u8 *)value) = hal_data->AntDetection;
5498 case HAL_DEF_MACID_SLEEP:
5499 *(u8*)value = _FALSE;
5501 case HAL_DEF_TX_PAGE_SIZE:
5502 *(( u32*)value) = PAGE_SIZE_128;
5504 case HAL_DEF_DBG_DIS_PWT:
5505 *(u8*)value = hal_data->bDisableTXPowerTraining;
5508 DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __FUNCTION__, variable);
5518 HAL_ODM_VARIABLE eVariable,
5522 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
5523 PDM_ODM_T podmpriv = &pHalData->odmpriv;
5525 #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
5526 case HAL_ODM_NOISE_MONITOR:
5528 u8 chan = *(u8*)pValue1;
5529 *(s16 *)pValue2 = pHalData->noise[chan];
5530 #ifdef DBG_NOISE_MONITOR
5531 DBG_8192C("### Noise monitor chan(%d)-noise:%d (dBm) ###\n",
5532 chan,pHalData->noise[chan]);
5537 #endif//#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
5545 HAL_ODM_VARIABLE eVariable,
5549 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
5550 PDM_ODM_T podmpriv = &pHalData->odmpriv;
5553 case HAL_ODM_STA_INFO:
5555 struct sta_info *psta = (struct sta_info *)pValue1;
5557 DBG_8192C("### Set STA_(%d) info ###\n",psta->mac_id);
5558 ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,psta);
5561 DBG_8192C("### Clean STA_(%d) info ###\n",psta->mac_id);
5562 //_enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
5563 ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,NULL);
5565 //_exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
5569 case HAL_ODM_P2P_STATE:
5570 ODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DIRECT,bSet);
5572 case HAL_ODM_WIFI_DISPLAY_STATE:
5573 ODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DISPLAY,bSet);
5575 case HAL_ODM_REGULATION:
5576 ODM_CmnInfoInit(podmpriv, ODM_CMNINFO_DOMAIN_CODE_2G, pHalData->Regulation2_4G);
5577 ODM_CmnInfoInit(podmpriv, ODM_CMNINFO_DOMAIN_CODE_5G, pHalData->Regulation5G);
5579 #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
5580 case HAL_ODM_NOISE_MONITOR:
5582 struct noise_info *pinfo = (struct noise_info *)pValue1;
5584 #ifdef DBG_NOISE_MONITOR
5585 DBG_8192C("### Noise monitor chan(%d)-bPauseDIG:%d,IGIValue:0x%02x,max_time:%d (ms) ###\n",
5586 pinfo->chan,pinfo->bPauseDIG,pinfo->IGIValue,pinfo->max_time);
5589 pHalData->noise[pinfo->chan] = ODM_InbandNoise_Monitor(podmpriv,pinfo->bPauseDIG,pinfo->IGIValue,pinfo->max_time);
5590 DBG_871X("chan_%d, noise = %d (dBm)\n",pinfo->chan,pHalData->noise[pinfo->chan]);
5591 #ifdef DBG_NOISE_MONITOR
5592 DBG_871X("noise_a = %d, noise_b = %d noise_all:%d \n",
5593 podmpriv->noise_level.noise[ODM_RF_PATH_A],
5594 podmpriv->noise_level.noise[ODM_RF_PATH_B],
5595 podmpriv->noise_level.noise_all);
5599 #endif//#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
5619 if(str1[num]!=str2[num])
5627 // Return TRUE if chTmp is represent for hex digit and
5636 if( (chTmp >= '0' && chTmp <= '9') ||
5637 (chTmp >= 'a' && chTmp <= 'f') ||
5638 (chTmp >= 'A' && chTmp <= 'F') )
5651 // Translate a character to hex digit.
5658 if(chTmp >= '0' && chTmp <= '9')
5659 return (chTmp - '0');
5660 else if(chTmp >= 'a' && chTmp <= 'f')
5661 return (10 + (chTmp - 'a'));
5662 else if(chTmp >= 'A' && chTmp <= 'F')
5663 return (10 + (chTmp - 'A'));
5672 // Parse hex number from the string pucStr.
5675 GetHexValueFromString(
5677 IN OUT u32* pu4bVal,
5678 IN OUT u32* pu4bMove
5681 char* szScan = szStr;
5683 // Check input parameter.
5684 if(szStr == NULL || pu4bVal == NULL || pu4bMove == NULL)
5686 DBG_871X("GetHexValueFromString(): Invalid inpur argumetns! szStr: %p, pu4bVal: %p, pu4bMove: %p\n", szStr, pu4bVal, pu4bMove);
5690 // Initialize output.
5694 // Skip leading space.
5695 while( *szScan != '\0' &&
5696 (*szScan == ' ' || *szScan == '\t') )
5702 // Skip leading '0x' or '0X'.
5703 if(*szScan == '0' && (*(szScan+1) == 'x' || *(szScan+1) == 'X'))
5709 // Check if szScan is now pointer to a character for hex digit,
5710 // if not, it means this is not a valid hex number.
5711 if(!IsHexDigit(*szScan))
5716 // Parse each digit.
5720 *pu4bVal += MapCharToHexDigit(*szScan);
5724 } while(IsHexDigit(*szScan));
5730 GetFractionValueFromString(
5732 IN OUT u8* pInteger,
5733 IN OUT u8* pFraction,
5734 IN OUT u32* pu4bMove
5737 char *szScan = szStr;
5739 // Initialize output.
5744 // Skip leading space.
5745 while ( *szScan != '\0' && (*szScan == ' ' || *szScan == '\t') ) {
5750 // Parse each digit.
5753 *pInteger += ( *szScan - '0' );
5758 if ( *szScan == '.' )
5763 if ( *szScan < '0' || *szScan > '9' )
5766 *pFraction = *szScan - '0';
5772 } while(*szScan >= '0' && *szScan <= '9');
5779 // Return TRUE if szStr is comment out with leading "//".
5786 if(*szStr == '/' && *(szStr+1) == '/')
5797 GetU1ByteIntegerFromStringInDecimal(
5805 while ( Str[i] != '\0' )
5807 if ( Str[i] >= '0' && Str[i] <= '9' )
5810 *pInt += ( Str[i] - '0' );
5822 // <20121004, Kordan> For example,
5823 // ParseQualifiedString(inString, 0, outString, '[', ']') gets "Kordan" from a string "Hello [Kordan]".
5824 // If RightQualifier does not exist, it will hang on in the while loop
5826 ParseQualifiedString(
5830 IN char LeftQualifier,
5831 IN char RightQualifier
5835 char c = In[(*Start)++];
5837 if (c != LeftQualifier)
5841 while ((c = In[(*Start)++]) != RightQualifier)
5844 strncpy((char *)Out, (const char*)(In+i), j-i+1);
5855 u8 cnt = 0, NumOfSpaceAndTab = 0;
5859 if ( data[cnt] == ' ' || data[cnt] == '\t' || data[cnt] == '\0' )
5865 return size == NumOfSpaceAndTab;
5869 void rtw_hal_check_rxfifo_full(_adapter *adapter)
5871 struct dvobj_priv *psdpriv = adapter->dvobj;
5872 struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
5873 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
5874 int save_cnt=_FALSE;
5876 //switch counter to RX fifo
5877 if(IS_81XXC(pHalData->VersionID) || IS_92D(pHalData->VersionID)
5878 || IS_8188E(pHalData->VersionID) || IS_8723_SERIES(pHalData->VersionID)
5879 || IS_8812_SERIES(pHalData->VersionID) || IS_8821_SERIES(pHalData->VersionID)
5880 || IS_8723B_SERIES(pHalData->VersionID) || IS_8192E(pHalData->VersionID))
5882 rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xa0);
5893 //rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xa0);
5894 pdbgpriv->dbg_rx_fifo_last_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow;
5895 pdbgpriv->dbg_rx_fifo_curr_overflow = rtw_read16(adapter, REG_RXERR_RPT);
5896 pdbgpriv->dbg_rx_fifo_diff_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow-pdbgpriv->dbg_rx_fifo_last_overflow;
5900 void linked_info_dump(_adapter *padapter,u8 benable)
5902 struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
5904 if(padapter->bLinkInfoDump == benable)
5907 DBG_871X("%s %s \n",__FUNCTION__,(benable)?"enable":"disable");
5911 pwrctrlpriv->org_power_mgnt = pwrctrlpriv->power_mgnt;//keep org value
5912 rtw_pm_set_lps(padapter,PS_MODE_ACTIVE);
5916 pwrctrlpriv->ips_org_mode = pwrctrlpriv->ips_mode;//keep org value
5917 rtw_pm_set_ips(padapter,IPS_NONE);
5922 rtw_pm_set_ips(padapter, pwrctrlpriv->ips_org_mode);
5923 #endif // CONFIG_IPS
5926 rtw_pm_set_lps(padapter, pwrctrlpriv->org_power_mgnt );
5927 #endif // CONFIG_LPS
5929 padapter->bLinkInfoDump = benable ;
5932 #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
5933 void rtw_get_raw_rssi_info(void *sel, _adapter *padapter)
5935 u8 isCCKrate,rf_path;
5936 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
5937 struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
5939 DBG_871X_SEL_NL(sel,"RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\n",
5940 HDATA_RATE(psample_pkt_rssi->data_rate), psample_pkt_rssi->pwdball, psample_pkt_rssi->pwr_all);
5941 isCCKrate = (psample_pkt_rssi->data_rate <= DESC_RATE11M)?TRUE :FALSE;
5944 psample_pkt_rssi->mimo_singal_strength[0] = psample_pkt_rssi->pwdball;
5946 for(rf_path = 0;rf_path<pHalData->NumTotalRFPath;rf_path++)
5948 DBG_871X_SEL_NL(sel,"RF_PATH_%d=>singal_strength:%d(%%),singal_quality:%d(%%)\n"
5949 ,rf_path,psample_pkt_rssi->mimo_singal_strength[rf_path],psample_pkt_rssi->mimo_singal_quality[rf_path]);
5952 DBG_871X_SEL_NL(sel,"\trx_ofdm_pwr:%d(dBm),rx_ofdm_snr:%d(dB)\n",
5953 psample_pkt_rssi->ofdm_pwr[rf_path],psample_pkt_rssi->ofdm_snr[rf_path]);
5958 void rtw_dump_raw_rssi_info(_adapter *padapter)
5960 u8 isCCKrate,rf_path;
5961 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
5962 struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
5963 DBG_871X("============ RAW Rx Info dump ===================\n");
5964 DBG_871X("RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\n",
5965 HDATA_RATE(psample_pkt_rssi->data_rate), psample_pkt_rssi->pwdball, psample_pkt_rssi->pwr_all);
5967 isCCKrate = (psample_pkt_rssi->data_rate <= DESC_RATE11M)?TRUE :FALSE;
5970 psample_pkt_rssi->mimo_singal_strength[0] = psample_pkt_rssi->pwdball;
5972 for(rf_path = 0;rf_path<pHalData->NumTotalRFPath;rf_path++)
5974 DBG_871X("RF_PATH_%d=>singal_strength:%d(%%),singal_quality:%d(%%)"
5975 ,rf_path,psample_pkt_rssi->mimo_singal_strength[rf_path],psample_pkt_rssi->mimo_singal_quality[rf_path]);
5978 printk(",rx_ofdm_pwr:%d(dBm),rx_ofdm_snr:%d(dB)\n",
5979 psample_pkt_rssi->ofdm_pwr[rf_path],psample_pkt_rssi->ofdm_snr[rf_path]);
5986 void rtw_store_phy_info(_adapter *padapter, union recv_frame *prframe)
5988 u8 isCCKrate,rf_path;
5989 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
5990 struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
5992 PODM_PHY_INFO_T pPhyInfo = (PODM_PHY_INFO_T)(&pattrib->phy_info);
5993 struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
5995 psample_pkt_rssi->data_rate = pattrib->data_rate;
5996 isCCKrate = (pattrib->data_rate <= DESC_RATE11M)?TRUE :FALSE;
5998 psample_pkt_rssi->pwdball = pPhyInfo->RxPWDBAll;
5999 psample_pkt_rssi->pwr_all = pPhyInfo->RecvSignalPower;
6001 for(rf_path = 0;rf_path<pHalData->NumTotalRFPath;rf_path++)
6003 psample_pkt_rssi->mimo_singal_strength[rf_path] = pPhyInfo->RxMIMOSignalStrength[rf_path];
6004 psample_pkt_rssi->mimo_singal_quality[rf_path] = pPhyInfo->RxMIMOSignalQuality[rf_path];
6006 psample_pkt_rssi->ofdm_pwr[rf_path] = pPhyInfo->RxPwr[rf_path];
6007 psample_pkt_rssi->ofdm_snr[rf_path] = pPhyInfo->RxSNR[rf_path];
6013 #ifdef CONFIG_EFUSE_CONFIG_FILE
6014 int check_phy_efuse_tx_power_info_valid(PADAPTER padapter) {
6015 EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
6016 u8* pContent = pEEPROM->efuse_eeprom_data;
6018 u16 tx_index_offset = 0x0000;
6020 switch(padapter->chip_type) {
6022 tx_index_offset = EEPROM_TX_PWR_INX_8723B;
6025 tx_index_offset = EEPROM_TX_PWR_INX_88E;
6028 tx_index_offset = EEPROM_TX_PWR_INX_8192E;
6031 tx_index_offset = 0x0010;
6034 for (index = 0 ; index < 12 ; index++) {
6035 if (pContent[tx_index_offset + index] == 0xFF) {
6038 DBG_871X("0x%02x ,", pContent[EEPROM_TX_PWR_INX_88E+index]);
6045 int check_phy_efuse_macaddr_info_valid(PADAPTER padapter) {
6048 u16 addr_offset = 0x0000;
6050 switch(padapter->chip_type) {
6052 if (padapter->interface_type == RTW_USB) {
6053 addr_offset = EEPROM_MAC_ADDR_8723BU;
6054 DBG_871X("%s: interface is USB\n", __func__);
6055 } else if (padapter->interface_type == RTW_SDIO) {
6056 addr_offset = EEPROM_MAC_ADDR_8723BS;
6057 DBG_871X("%s: interface is SDIO\n", __func__);
6058 } else if (padapter->interface_type == RTW_PCIE) {
6059 addr_offset = EEPROM_MAC_ADDR_8723BE;
6060 DBG_871X("%s: interface is PCIE\n", __func__);
6061 } else if (padapter->interface_type == RTW_GSPI) {
6062 //addr_offset = EEPROM_MAC_ADDR_8723BS;
6063 DBG_871X("%s: interface is GSPI\n", __func__);
6067 if (padapter->interface_type == RTW_USB) {
6068 addr_offset = EEPROM_MAC_ADDR_88EU;
6069 DBG_871X("%s: interface is USB\n", __func__);
6070 } else if (padapter->interface_type == RTW_SDIO) {
6071 addr_offset = EEPROM_MAC_ADDR_88ES;
6072 DBG_871X("%s: interface is SDIO\n", __func__);
6073 } else if (padapter->interface_type == RTW_PCIE) {
6074 addr_offset = EEPROM_MAC_ADDR_88EE;
6075 DBG_871X("%s: interface is PCIE\n", __func__);
6076 } else if (padapter->interface_type == RTW_GSPI) {
6077 //addr_offset = EEPROM_MAC_ADDR_8723BS;
6078 DBG_871X("%s: interface is GSPI\n", __func__);
6083 if (addr_offset == 0x0000) {
6084 DBG_871X("phy efuse MAC addr offset is 0!!\n");
6087 rtw_efuse_map_read(padapter, addr_offset, 1, &val);
6093 DBG_871X("phy efuse with valid MAC addr\n");
6098 u32 Hal_readPGDataFromConfigFile(
6106 EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
6107 u8 *PROMContent = pEEPROM->efuse_eeprom_data;
6109 temp[2] = 0; // add end of string '\0'
6114 for (i = 0 ; i < HWSET_MAX_SIZE ; i++) {
6115 vfs_read(fp, temp, 2, &pos);
6116 PROMContent[i] = simple_strtoul(temp, NULL, 16);
6117 if ((i % EFUSE_FILE_COLUMN_NUM) == (EFUSE_FILE_COLUMN_NUM - 1)) {
6118 //Filter the lates space char.
6119 vfs_read(fp, temp, 1, &pos);
6120 if (strchr(temp, ' ') == NULL) {
6122 vfs_read(fp, temp, 2, &pos);
6125 pos += 1; // Filter the space character
6130 pEEPROM->bloadfile_fail_flag = _FALSE;
6133 DBG_871X("Efuse configure file:\n");
6134 for (i=0; i<HWSET_MAX_SIZE; i++)
6139 printk("%02X ", PROMContent[i]);
6147 void Hal_ReadMACAddrFromFile(
6155 u32 curtime = rtw_get_current_time();
6156 EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
6159 _rtw_memset(source_addr, 0, 18);
6160 _rtw_memset(pEEPROM->mac_addr, 0, ETH_ALEN);
6165 DBG_871X("wifi mac address:\n");
6166 vfs_read(fp, source_addr, 18, &pos);
6167 source_addr[17] = ':';
6169 head = end = source_addr;
6170 for (i=0; i<ETH_ALEN; i++) {
6171 while (end && (*end != ':') )
6174 if (end && (*end == ':') )
6177 pEEPROM->mac_addr[i] = simple_strtoul(head, NULL, 16 );
6186 pEEPROM->bloadmac_fail_flag = _FALSE;
6188 if (rtw_check_invalid_mac_address(pEEPROM->mac_addr) == _TRUE) {
6189 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
6190 get_random_bytes(pEEPROM->mac_addr, ETH_ALEN);
6191 pEEPROM->mac_addr[0] = 0x00;
6192 pEEPROM->mac_addr[1] = 0xe0;
6193 pEEPROM->mac_addr[2] = 0x4c;
6195 pEEPROM->mac_addr[0] = 0x00;
6196 pEEPROM->mac_addr[1] = 0xe0;
6197 pEEPROM->mac_addr[2] = 0x4c;
6198 pEEPROM->mac_addr[3] = (u8)(curtime & 0xff) ;
6199 pEEPROM->mac_addr[4] = (u8)((curtime>>8) & 0xff) ;
6200 pEEPROM->mac_addr[5] = (u8)((curtime>>16) & 0xff) ;
6202 DBG_871X("MAC Address from wifimac error is invalid, assign random MAC !!!\n");
6205 DBG_871X("%s: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
6206 __func__, pEEPROM->mac_addr[0], pEEPROM->mac_addr[1],
6207 pEEPROM->mac_addr[2], pEEPROM->mac_addr[3],
6208 pEEPROM->mac_addr[4], pEEPROM->mac_addr[5]);
6211 void Hal_GetPhyEfuseMACAddr(PADAPTER padapter, u8* mac_addr) {
6213 u16 addr_offset = 0x0000;
6215 switch(padapter->chip_type) {
6217 if (padapter->interface_type == RTW_USB) {
6218 addr_offset = EEPROM_MAC_ADDR_8723BU;
6219 DBG_871X("%s: interface is USB\n", __func__);
6220 } else if (padapter->interface_type == RTW_SDIO) {
6221 addr_offset = EEPROM_MAC_ADDR_8723BS;
6222 DBG_871X("%s: interface is SDIO\n", __func__);
6223 } else if (padapter->interface_type == RTW_PCIE) {
6224 addr_offset = EEPROM_MAC_ADDR_8723BE;
6225 DBG_871X("%s: interface is PCIE\n", __func__);
6226 } else if (padapter->interface_type == RTW_GSPI){
6227 //addr_offset = EEPROM_MAC_ADDR_8723BS;
6228 DBG_871X("%s: interface is GSPI\n", __func__);
6232 if (padapter->interface_type == RTW_USB) {
6233 addr_offset = EEPROM_MAC_ADDR_88EU;
6234 DBG_871X("%s: interface is USB\n", __func__);
6235 } else if (padapter->interface_type == RTW_SDIO) {
6236 addr_offset = EEPROM_MAC_ADDR_88ES;
6237 DBG_871X("%s: interface is SDIO\n", __func__);
6238 } else if (padapter->interface_type == RTW_PCIE) {
6239 addr_offset = EEPROM_MAC_ADDR_88EE;
6240 DBG_871X("%s: interface is PCIE\n", __func__);
6241 } else if (padapter->interface_type == RTW_GSPI){
6242 //addr_offset = EEPROM_MAC_ADDR_8723BS;
6243 DBG_871X("%s: interface is GSPI\n", __func__);
6248 rtw_efuse_map_read(padapter, addr_offset, ETH_ALEN, mac_addr);
6250 if (rtw_check_invalid_mac_address(mac_addr) == _TRUE) {
6251 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
6252 get_random_bytes(mac_addr, ETH_ALEN);
6260 mac_addr[3] = (u8)(curtime & 0xff) ;
6261 mac_addr[4] = (u8)((curtime>>8) & 0xff) ;
6262 mac_addr[5] = (u8)((curtime>>16) & 0xff) ;
6264 DBG_871X("MAC Address from phy efuse error, assign random MAC !!!\n");
6267 DBG_871X("%s: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
6268 __func__, mac_addr[0], mac_addr[1], mac_addr[2],
6269 mac_addr[3], mac_addr[4], mac_addr[5]);
6271 #endif //CONFIG_EFUSE_CONFIG_FILE
6273 #ifdef CONFIG_RF_GAIN_OFFSET
6274 u32 Array_kfreemap[] = {
6287 void rtw_bb_rf_gain_offset(_adapter *padapter)
6289 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
6290 u8 value = padapter->eeprompriv.EEPROMRFGainOffset;
6293 u4Byte ArrayLen = sizeof(Array_kfreemap)/sizeof(u32);
6294 pu4Byte Array = Array_kfreemap;
6295 u4Byte v1=0,v2=0,GainValue,target=0;
6296 //DBG_871X("+%s value: 0x%02x+\n", __func__, value);
6297 #if defined(CONFIG_RTL8723A)
6299 DBG_871X("Offset RF Gain.\n");
6300 DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal);
6301 if(padapter->eeprompriv.EEPROMRFGainVal != 0xff){
6302 res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0xd, 0xffffffff);
6303 DBG_871X("Offset RF Gain. reg 0xd=0x%x\n",res);
6306 res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15;
6307 DBG_871X("Offset RF Gain. reg 0xd=0x%x\n",res);
6309 rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET_CCK, RF_GAIN_OFFSET_MASK, res);
6311 res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0xe, 0xffffffff);
6312 DBG_871X("Offset RF Gain. reg 0xe=0x%x\n",res);
6315 res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f);
6316 DBG_871X("Offset RF Gain. reg 0xe=0x%x\n",res);
6318 rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET_OFDM, RF_GAIN_OFFSET_MASK, res);
6322 DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x != 0xff, didn't run Kfree\n",padapter->eeprompriv.EEPROMRFGainVal);
6325 DBG_871X("Using the default RF gain.\n");
6327 #elif defined(CONFIG_RTL8723B)
6329 DBG_871X("Offset RF Gain.\n");
6330 DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal);
6332 if(padapter->eeprompriv.EEPROMRFGainVal != 0xff){
6334 if(pHalData->ant_path == ODM_RF_PATH_A) {
6335 GainValue=(padapter->eeprompriv.EEPROMRFGainVal & 0x0f);
6338 GainValue=(padapter->eeprompriv.EEPROMRFGainVal & 0xf0)>>4;
6340 DBG_871X("Ant PATH_%d GainValue Offset = 0x%x\n",(pHalData->ant_path == ODM_RF_PATH_A) ? (ODM_RF_PATH_A) : (ODM_RF_PATH_B),GainValue);
6342 for (i = 0; i < ArrayLen; i += 2 )
6344 //DBG_871X("ArrayLen in =%d ,Array 1 =0x%x ,Array2 =0x%x \n",i,Array[i],Array[i]+1);
6347 if ( v1 == GainValue ) {
6348 DBG_871X("Offset RF Gain. got v1 =0x%x ,v2 =0x%x \n",v1,v2);
6353 DBG_871X("padapter->eeprompriv.EEPROMRFGainVal=0x%x ,Gain offset Target Value=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal,target);
6355 res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
6356 DBG_871X("Offset RF Gain. before reg 0x7f=0x%08x\n",res);
6357 PHY_SetRFReg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, BIT18|BIT17|BIT16|BIT15, target);
6358 res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
6360 DBG_871X("Offset RF Gain. After reg 0x7f=0x%08x\n",res);
6364 DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x != 0xff, didn't run Kfree\n",padapter->eeprompriv.EEPROMRFGainVal);
6367 DBG_871X("Using the default RF gain.\n");
6370 #elif defined(CONFIG_RTL8188E)
6372 DBG_871X("8188ES Offset RF Gain.\n");
6373 DBG_871X("8188ES Offset RF Gain. EEPROMRFGainVal=0x%x\n",
6374 padapter->eeprompriv.EEPROMRFGainVal);
6376 if (padapter->eeprompriv.EEPROMRFGainVal != 0xff) {
6377 res = rtw_hal_read_rfreg(padapter, RF_PATH_A,
6378 REG_RF_BB_GAIN_OFFSET, 0xffffffff);
6380 DBG_871X("Offset RF Gain. reg 0x55=0x%x\n",res);
6383 res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f) << 15;
6384 DBG_871X("Offset RF Gain. res=0x%x\n",res);
6386 rtw_hal_write_rfreg(padapter, RF_PATH_A,
6387 REG_RF_BB_GAIN_OFFSET,
6388 RF_GAIN_OFFSET_MASK, res);
6390 DBG_871X("Offset RF Gain. EEPROMRFGainVal=0x%x == 0xff, didn't run Kfree\n",
6391 padapter->eeprompriv.EEPROMRFGainVal);
6394 DBG_871X("Using the default RF gain.\n");
6397 if (!(value & 0x01)) {
6398 //DBG_871X("Offset RF Gain.\n");
6399 res = rtw_hal_read_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, 0xffffffff);
6402 rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res);
6404 DBG_871X("Using the default RF gain.\n");
6409 #endif //CONFIG_RF_GAIN_OFFSET
6411 //To avoid RX affect TX throughput
6412 void dm_DynamicUsbTxAgg(_adapter *padapter, u8 from_timer)
6414 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
6415 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
6416 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
6417 #ifdef CONFIG_USB_RX_AGGREGATION
6418 if(IS_HARDWARE_TYPE_8821U(padapter) )//|| IS_HARDWARE_TYPE_8192EU(padapter))
6420 //This AGG_PH_TH only for UsbRxAggMode == USB_RX_AGG_USB
6421 if((pHalData->UsbRxAggMode == USB_RX_AGG_USB) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE))
6423 if(pdvobjpriv->traffic_stat.cur_tx_tp > 2 && pdvobjpriv->traffic_stat.cur_rx_tp < 30)
6424 rtw_write16(padapter, REG_RXDMA_AGG_PG_TH,0x1003);
6426 rtw_write16(padapter, REG_RXDMA_AGG_PG_TH,0x2005); //dmc agg th 20K
6428 //DBG_871X("TX_TP=%u, RX_TP=%u \n", pdvobjpriv->traffic_stat.cur_tx_tp, pdvobjpriv->traffic_stat.cur_rx_tp);
6434 //bus-agg check for SoftAP mode
6435 inline u8 rtw_hal_busagg_qsel_check(_adapter *padapter,u8 pre_qsel,u8 next_qsel)
6437 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
6438 u8 chk_rst = _SUCCESS;
6440 if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)
6443 //if((pre_qsel == 0xFF)||(next_qsel== 0xFF))
6446 if( ((pre_qsel == QSLT_HIGH)||((next_qsel== QSLT_HIGH)))
6447 && (pre_qsel != next_qsel )){
6448 //DBG_871X("### bus-agg break cause of qsel misatch, pre_qsel=0x%02x,next_qsel=0x%02x ###\n",
6449 // pre_qsel,next_qsel);
6457 * dump_TX_FIFO: This is only used to dump TX_FIFO for debug WoW mode offload
6461 * adapter: adapter pointer.
6462 * page_num: The max. page number that user want to dump.
6463 * page_size: page size of each page. eg. 128 bytes, 256 bytes.
6465 void dump_TX_FIFO(_adapter* padapter, u8 page_num, u16 page_size){
6471 u32 count = (page_size / 8);
6473 if (page_num <= 0) {
6474 DBG_871X("!!%s: incorrect input page_num paramter!\n", __func__);
6478 if (page_size < 128 || page_size > 256) {
6479 DBG_871X("!!%s: incorrect input page_size paramter!\n", __func__);
6483 DBG_871X("+%s+\n", __func__);
6484 val = rtw_read8(padapter, 0x106);
6485 rtw_write8(padapter, 0x106, 0x69);
6486 DBG_871X("0x106: 0x%02x\n", val);
6487 base = rtw_read8(padapter, 0x209);
6488 DBG_871X("0x209: 0x%02x\n", base);
6490 addr = ((base) * page_size)/8;
6491 for (i = 0 ; i < page_num * count ; i+=2) {
6492 rtw_write32(padapter, 0x140, addr + i);
6493 printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
6494 rtw_write32(padapter, 0x140, addr + i + 1);
6495 printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
6499 #ifdef CONFIG_GPIO_API
6500 u8 rtw_hal_get_gpio(_adapter* adapter, u8 gpio_num)
6504 struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
6506 rtw_ps_deny(adapter, PS_DENY_IOCTL);
6508 DBG_871X("rf_pwrstate=0x%02x\n", pwrpriv->rf_pwrstate);
6509 LeaveAllPowerSaveModeDirect(adapter);
6511 /* Read GPIO Direction */
6512 direction = (rtw_read8(adapter,REG_GPIO_PIN_CTRL + 2) & BIT(gpio_num)) >> gpio_num;
6514 /* According the direction to read register value */
6516 value = (rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1)& BIT(gpio_num)) >> gpio_num;
6518 value = (rtw_read8(adapter, REG_GPIO_PIN_CTRL)& BIT(gpio_num)) >> gpio_num;
6520 rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
6521 DBG_871X("%s direction=%d value=%d\n",__FUNCTION__,direction,value);
6526 int rtw_hal_set_gpio_output_value(_adapter* adapter, u8 gpio_num, BOOLEAN isHigh)
6530 if (IS_HARDWARE_TYPE_8188E(adapter)){
6531 /* Check GPIO is 4~7 */
6532 if( gpio_num > 7 || gpio_num < 4)
6534 DBG_871X("%s The gpio number does not included 4~7.\n",__FUNCTION__);
6539 rtw_ps_deny(adapter, PS_DENY_IOCTL);
6541 LeaveAllPowerSaveModeDirect(adapter);
6543 /* Read GPIO direction */
6544 direction = (rtw_read8(adapter,REG_GPIO_PIN_CTRL + 2) & BIT(gpio_num)) >> gpio_num;
6546 /* If GPIO is output direction, setting value. */
6550 rtw_write8(adapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1) | BIT(gpio_num));
6552 rtw_write8(adapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1) & ~BIT(gpio_num));
6554 DBG_871X("%s Set gpio %x[%d]=%d\n",__FUNCTION__,REG_GPIO_PIN_CTRL+1,gpio_num,isHigh );
6559 DBG_871X("%s The gpio is input,not be set!\n",__FUNCTION__);
6563 rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
6567 int rtw_hal_config_gpio(_adapter* adapter, u8 gpio_num, BOOLEAN isOutput)
6569 if (IS_HARDWARE_TYPE_8188E(adapter)){
6570 if( gpio_num > 7 || gpio_num < 4)
6572 DBG_871X("%s The gpio number does not included 4~7.\n",__FUNCTION__);
6577 DBG_871X("%s gpio_num =%d direction=%d\n",__FUNCTION__,gpio_num,isOutput);
6579 rtw_ps_deny(adapter, PS_DENY_IOCTL);
6581 LeaveAllPowerSaveModeDirect(adapter);
6585 rtw_write8(adapter, REG_GPIO_PIN_CTRL + 2, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 2) | BIT(gpio_num));
6589 rtw_write8(adapter, REG_GPIO_PIN_CTRL + 2, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 2) & ~BIT(gpio_num));
6592 rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);