]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - drivers/net/wireless/realtek/rtl8192cu/core/rtw_wlan_util.c
net: rtl8192cu: Fix outstanding GCC 6.4.0 warnings
[mirror_ubuntu-bionic-kernel.git] / drivers / net / wireless / realtek / rtl8192cu / core / rtw_wlan_util.c
1 /******************************************************************************
2 *
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
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
17 *
18 *
19 ******************************************************************************/
20 #define _RTW_WLAN_UTIL_C_
21
22 #include <drv_conf.h>
23 #include <osdep_service.h>
24 #include <drv_types.h>
25 #include <wifi.h>
26
27
28 unsigned char ARTHEROS_OUI1[] = {0x00, 0x03, 0x7f};
29 unsigned char ARTHEROS_OUI2[] = {0x00, 0x13, 0x74};
30
31 unsigned char BROADCOM_OUI1[] = {0x00, 0x10, 0x18};
32 unsigned char BROADCOM_OUI2[] = {0x00, 0x0a, 0xf7};
33 unsigned char BROADCOM_OUI3[] = {0x00, 0x05, 0xb5};
34
35 unsigned char CISCO_OUI[] = {0x00, 0x40, 0x96};
36 unsigned char MARVELL_OUI[] = {0x00, 0x50, 0x43};
37 unsigned char RALINK_OUI[] = {0x00, 0x0c, 0x43};
38 unsigned char REALTEK_OUI[] = {0x00, 0xe0, 0x4c};
39 unsigned char AIRGOCAP_OUI[] = {0x00, 0x0a, 0xf5};
40
41 unsigned char REALTEK_96B_IE[] = {0x00, 0xe0, 0x4c, 0x02, 0x01, 0x20};
42
43 extern unsigned char MCS_rate_2R[16];
44 #ifdef CONFIG_DISABLE_MCS13TO15
45 extern unsigned char MCS_rate_2R_MCS13TO15_OFF[16];
46 #endif //CONFIG_DISABLE_MCS13TO15
47 extern unsigned char MCS_rate_1R[16];
48 extern unsigned char RTW_WPA_OUI[];
49 extern unsigned char WPA_TKIP_CIPHER[4];
50 extern unsigned char RSN_TKIP_CIPHER[4];
51
52 #define R2T_PHY_DELAY (0)
53
54 //#define WAIT_FOR_BCN_TO_MIN (3000)
55 #define WAIT_FOR_BCN_TO_MIN (6000)
56 #define WAIT_FOR_BCN_TO_MAX (20000)
57
58 static u8 rtw_basic_rate_cck[4] = {
59 IEEE80211_CCK_RATE_1MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB|IEEE80211_BASIC_RATE_MASK,
60 IEEE80211_CCK_RATE_5MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB|IEEE80211_BASIC_RATE_MASK
61 };
62
63 static u8 rtw_basic_rate_ofdm[3] = {
64 IEEE80211_OFDM_RATE_6MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB|IEEE80211_BASIC_RATE_MASK,
65 IEEE80211_OFDM_RATE_24MB|IEEE80211_BASIC_RATE_MASK
66 };
67
68 static u8 rtw_basic_rate_mix[7] = {
69 IEEE80211_CCK_RATE_1MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB|IEEE80211_BASIC_RATE_MASK,
70 IEEE80211_CCK_RATE_5MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB|IEEE80211_BASIC_RATE_MASK,
71 IEEE80211_OFDM_RATE_6MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB|IEEE80211_BASIC_RATE_MASK,
72 IEEE80211_OFDM_RATE_24MB|IEEE80211_BASIC_RATE_MASK
73 };
74
75
76 int cckrates_included(unsigned char *rate, int ratelen)
77 {
78 int i;
79
80 for(i = 0; i < ratelen; i++)
81 {
82 if ( (((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) ||
83 (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22) )
84 return _TRUE;
85 }
86
87 return _FALSE;
88
89 }
90
91 int cckratesonly_included(unsigned char *rate, int ratelen)
92 {
93 int i;
94
95 for(i = 0; i < ratelen; i++)
96 {
97 if ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) &&
98 (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22) )
99 return _FALSE;
100 }
101
102 return _TRUE;
103 }
104
105 unsigned char networktype_to_raid(unsigned char network_type)
106 {
107 unsigned char raid;
108
109 switch(network_type)
110 {
111 case WIRELESS_11B:
112 raid = 6;
113 break;
114 case WIRELESS_11A:
115 case WIRELESS_11G:
116 raid = 5;
117 break;
118 case WIRELESS_11BG:
119 raid = 4;
120 break;
121 case WIRELESS_11_24N:
122 case WIRELESS_11_5N:
123 raid = 3;
124 break;
125 case WIRELESS_11A_5N:
126 case WIRELESS_11G_24N:
127 raid = 1;
128 break;
129 case WIRELESS_11BG_24N:
130 raid = 0;
131 break;
132 default:
133 raid = 4;
134 break;
135
136 }
137
138 return raid;
139
140 }
141
142 int judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen)
143 {
144 int network_type = 0;
145 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
146 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
147
148
149 if(pmlmeext->cur_channel > 14)
150 {
151 if (pmlmeinfo->HT_enable)
152 {
153 network_type = WIRELESS_11_5N;
154 }
155
156 network_type |= WIRELESS_11A;
157 }
158 else
159 {
160 if (pmlmeinfo->HT_enable)
161 {
162 network_type = WIRELESS_11_24N;
163 }
164
165 if ((cckratesonly_included(rate, ratelen)) == _TRUE)
166 {
167 network_type |= WIRELESS_11B;
168 }
169 else if((cckrates_included(rate, ratelen)) == _TRUE)
170 {
171 network_type |= WIRELESS_11BG;
172 }
173 else
174 {
175 network_type |= WIRELESS_11G;
176 }
177 }
178
179 return network_type;
180 }
181
182 unsigned char ratetbl_val_2wifirate(unsigned char rate);
183 unsigned char ratetbl_val_2wifirate(unsigned char rate)
184 {
185 unsigned char val = 0;
186
187 switch (rate & 0x7f)
188 {
189 case 0:
190 val = IEEE80211_CCK_RATE_1MB;
191 break;
192
193 case 1:
194 val = IEEE80211_CCK_RATE_2MB;
195 break;
196
197 case 2:
198 val = IEEE80211_CCK_RATE_5MB;
199 break;
200
201 case 3:
202 val = IEEE80211_CCK_RATE_11MB;
203 break;
204
205 case 4:
206 val = IEEE80211_OFDM_RATE_6MB;
207 break;
208
209 case 5:
210 val = IEEE80211_OFDM_RATE_9MB;
211 break;
212
213 case 6:
214 val = IEEE80211_OFDM_RATE_12MB;
215 break;
216
217 case 7:
218 val = IEEE80211_OFDM_RATE_18MB;
219 break;
220
221 case 8:
222 val = IEEE80211_OFDM_RATE_24MB;
223 break;
224
225 case 9:
226 val = IEEE80211_OFDM_RATE_36MB;
227 break;
228
229 case 10:
230 val = IEEE80211_OFDM_RATE_48MB;
231 break;
232
233 case 11:
234 val = IEEE80211_OFDM_RATE_54MB;
235 break;
236
237 }
238
239 return val;
240
241 }
242
243 int is_basicrate(_adapter *padapter, unsigned char rate);
244 int is_basicrate(_adapter *padapter, unsigned char rate)
245 {
246 int i;
247 unsigned char val;
248 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
249
250 for(i = 0; i < NumRates; i++)
251 {
252 val = pmlmeext->basicrate[i];
253
254 if ((val != 0xff) && (val != 0xfe))
255 {
256 if (rate == ratetbl_val_2wifirate(val))
257 {
258 return _TRUE;
259 }
260 }
261 }
262
263 return _FALSE;
264 }
265
266 unsigned int ratetbl2rateset(_adapter *padapter, unsigned char *rateset);
267 unsigned int ratetbl2rateset(_adapter *padapter, unsigned char *rateset)
268 {
269 int i;
270 unsigned char rate;
271 unsigned int len = 0;
272 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
273
274 for (i = 0; i < NumRates; i++)
275 {
276 rate = pmlmeext->datarate[i];
277
278 switch (rate)
279 {
280 case 0xff:
281 return len;
282
283 case 0xfe:
284 continue;
285
286 default:
287 rate = ratetbl_val_2wifirate(rate);
288
289 if (is_basicrate(padapter, rate) == _TRUE)
290 {
291 rate |= IEEE80211_BASIC_RATE_MASK;
292 }
293
294 rateset[len] = rate;
295 len++;
296 break;
297 }
298 }
299 return len;
300 }
301
302
303 void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len)
304 {
305 unsigned char supportedrates[NumRates];
306
307 _rtw_memset(supportedrates, 0, NumRates);
308 *bssrate_len = ratetbl2rateset(padapter, supportedrates);
309 _rtw_memcpy(pbssrate, supportedrates, *bssrate_len);
310 }
311
312 void UpdateBrateTbl(
313 IN PADAPTER Adapter,
314 IN u8 *mBratesOS
315 )
316 {
317 u8 i;
318 u8 rate;
319
320 // 1M, 2M, 5.5M, 11M, 6M, 12M, 24M are mandatory.
321 for(i=0;i<NDIS_802_11_LENGTH_RATES_EX;i++)
322 {
323 rate = mBratesOS[i] & 0x7f;
324 switch(rate)
325 {
326 case IEEE80211_CCK_RATE_1MB:
327 case IEEE80211_CCK_RATE_2MB:
328 case IEEE80211_CCK_RATE_5MB:
329 case IEEE80211_CCK_RATE_11MB:
330 case IEEE80211_OFDM_RATE_6MB:
331 case IEEE80211_OFDM_RATE_12MB:
332 case IEEE80211_OFDM_RATE_24MB:
333 mBratesOS[i] |= IEEE80211_BASIC_RATE_MASK;
334 break;
335 }
336 }
337
338 }
339
340 void UpdateBrateTblForSoftAP(u8 *bssrateset, u32 bssratelen)
341 {
342 u8 i;
343 u8 rate;
344
345 for(i=0;i<bssratelen;i++)
346 {
347 rate = bssrateset[i] & 0x7f;
348 switch(rate)
349 {
350 case IEEE80211_CCK_RATE_1MB:
351 case IEEE80211_CCK_RATE_2MB:
352 case IEEE80211_CCK_RATE_5MB:
353 case IEEE80211_CCK_RATE_11MB:
354 bssrateset[i] |= IEEE80211_BASIC_RATE_MASK;
355 break;
356 }
357 }
358
359 }
360
361 void Save_DM_Func_Flag(_adapter *padapter)
362 {
363 u8 bSaveFlag = _TRUE;
364
365 #ifdef CONFIG_CONCURRENT_MODE
366 _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
367 if(pbuddy_adapter)
368 rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag));
369 #endif
370
371 rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag));
372
373 }
374
375 void Restore_DM_Func_Flag(_adapter *padapter)
376 {
377 u8 bSaveFlag = _FALSE;
378 #ifdef CONFIG_CONCURRENT_MODE
379 _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
380 if(pbuddy_adapter)
381 rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag));
382 #endif
383 rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag));
384 }
385
386 void Switch_DM_Func(_adapter *padapter, u8 mode, u8 enable)
387 {
388 #ifdef CONFIG_CONCURRENT_MODE
389 _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
390 #endif
391
392 if(enable == _TRUE)
393 {
394 #ifdef CONFIG_CONCURRENT_MODE
395 if(pbuddy_adapter)
396 rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_DM_FUNC_SET, (u8 *)(&mode));
397 #endif
398 rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_SET, (u8 *)(&mode));
399 }
400 else
401 {
402 #ifdef CONFIG_CONCURRENT_MODE
403 if(pbuddy_adapter)
404 rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_DM_FUNC_CLR, (u8 *)(&mode));
405 #endif
406 rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_CLR, (u8 *)(&mode));
407 }
408
409 #if 0
410 u8 val8;
411
412 val8 = rtw_read8(padapter, FW_DYNAMIC_FUN_SWITCH);
413
414 if(enable == _TRUE)
415 {
416 rtw_write8(padapter, FW_DYNAMIC_FUN_SWITCH, (val8 | mode));
417 }
418 else
419 {
420 rtw_write8(padapter, FW_DYNAMIC_FUN_SWITCH, (val8 & mode));
421 }
422 #endif
423
424 }
425
426 static void Set_NETYPE1_MSR(_adapter *padapter, u8 type)
427 {
428 rtw_hal_set_hwreg(padapter, HW_VAR_MEDIA_STATUS1, (u8 *)(&type));
429 }
430
431 static void Set_NETYPE0_MSR(_adapter *padapter, u8 type)
432 {
433 rtw_hal_set_hwreg(padapter, HW_VAR_MEDIA_STATUS, (u8 *)(&type));
434 }
435
436 void Set_MSR(_adapter *padapter, u8 type)
437 {
438 #ifdef CONFIG_CONCURRENT_MODE
439 if(padapter->iface_type == IFACE_PORT1)
440 {
441 Set_NETYPE1_MSR(padapter, type);
442 }
443 else
444 #endif
445 {
446 Set_NETYPE0_MSR(padapter, type);
447 }
448 }
449
450 inline u8 rtw_get_oper_ch(_adapter *adapter)
451 {
452 return adapter_to_dvobj(adapter)->oper_channel;
453 }
454
455 inline void rtw_set_oper_ch(_adapter *adapter, u8 ch)
456 {
457 if (adapter_to_dvobj(adapter)->oper_channel != ch)
458 adapter_to_dvobj(adapter)->on_oper_ch_time = rtw_get_current_time();
459
460 adapter_to_dvobj(adapter)->oper_channel = ch;
461 }
462
463 inline u8 rtw_get_oper_bw(_adapter *adapter)
464 {
465 return adapter_to_dvobj(adapter)->oper_bwmode;
466 }
467
468 inline void rtw_set_oper_bw(_adapter *adapter, u8 bw)
469 {
470 adapter_to_dvobj(adapter)->oper_bwmode = bw;
471 }
472
473 inline u8 rtw_get_oper_choffset(_adapter *adapter)
474 {
475 return adapter_to_dvobj(adapter)->oper_ch_offset;
476 }
477
478 inline void rtw_set_oper_choffset(_adapter *adapter, u8 offset)
479 {
480 adapter_to_dvobj(adapter)->oper_ch_offset = offset;
481 }
482
483 inline u32 rtw_get_on_oper_ch_time(_adapter *adapter)
484 {
485 return adapter_to_dvobj(adapter)->on_oper_ch_time;
486 }
487
488 inline u32 rtw_get_on_cur_ch_time(_adapter *adapter)
489 {
490 if (adapter->mlmeextpriv.cur_channel == adapter_to_dvobj(adapter)->oper_channel)
491 return adapter_to_dvobj(adapter)->on_oper_ch_time;
492 else
493 return 0;
494 }
495
496 void SelectChannel(_adapter *padapter, unsigned char channel)
497 {
498 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
499
500 #ifdef CONFIG_DUALMAC_CONCURRENT
501 //saved channel info
502 rtw_set_oper_ch(padapter, channel);
503 dc_SelectChannel(padapter, channel);
504 #else //CONFIG_DUALMAC_CONCURRENT
505
506 _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);
507
508 //saved channel info
509 rtw_set_oper_ch(padapter, channel);
510
511 rtw_hal_set_chan(padapter, channel);
512
513 _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);
514
515 #endif // CONFIG_DUALMAC_CONCURRENT
516 }
517
518 void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset)
519 {
520 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
521
522 #ifdef CONFIG_DUALMAC_CONCURRENT
523 //saved bw info
524 rtw_set_oper_bw(padapter, bwmode);
525 rtw_set_oper_choffset(padapter, channel_offset);
526 dc_SetBWMode(padapter, bwmode, channel_offset);
527 #else //CONFIG_DUALMAC_CONCURRENT
528
529 _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setbw_mutex), NULL);
530
531 //saved bw info
532 rtw_set_oper_bw(padapter, bwmode);
533 rtw_set_oper_choffset(padapter, channel_offset);
534
535 rtw_hal_set_bwmode(padapter, (HT_CHANNEL_WIDTH)bwmode, channel_offset);
536
537 _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setbw_mutex), NULL);
538
539 #endif // CONFIG_DUALMAC_CONCURRENT
540 }
541
542 void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode)
543 {
544 u8 center_ch;
545 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
546
547 if ( padapter->bNotifyChannelChange )
548 {
549 DBG_871X( "[%s] ch = %d, offset = %d, bwmode = %d\n", __FUNCTION__, channel, channel_offset, bwmode );
550 }
551
552 if((bwmode == HT_CHANNEL_WIDTH_20)||(channel_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE))
553 {
554 //SelectChannel(padapter, channel);
555 center_ch = channel;
556 }
557 else
558 {
559 //switch to the proper channel
560 if (channel_offset == HAL_PRIME_CHNL_OFFSET_LOWER)
561 {
562 //SelectChannel(padapter, channel + 2);
563 center_ch = channel + 2;
564 }
565 else
566 {
567 //SelectChannel(padapter, channel - 2);
568 center_ch = channel - 2;
569 }
570 }
571
572 //set Channel , must be independant for correct co_ch value/
573 #ifdef CONFIG_DUALMAC_CONCURRENT
574 //saved channel/bw info
575 rtw_set_oper_ch(padapter, channel);
576 rtw_set_oper_bw(padapter, bwmode);
577 rtw_set_oper_choffset(padapter, channel_offset);
578 dc_SelectChannel(padapter, center_ch);// set center channel
579 #else //CONFIG_DUALMAC_CONCURRENT
580
581 _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);
582
583 //saved channel/bw info
584 rtw_set_oper_ch(padapter, channel);
585 rtw_set_oper_bw(padapter, bwmode);
586 rtw_set_oper_choffset(padapter, channel_offset);
587
588 rtw_hal_set_chan(padapter, center_ch);
589
590 _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);
591
592 #endif // CONFIG_DUALMAC_CONCURRENT
593
594
595 //set BandWidth
596 SetBWMode(padapter, bwmode, channel_offset);
597
598 }
599
600 int get_bsstype(unsigned short capability)
601 {
602 if (capability & BIT(0))
603 {
604 return WIFI_FW_AP_STATE;
605 }
606 else if (capability & BIT(1))
607 {
608 return WIFI_FW_ADHOC_STATE;
609 }
610 else
611 {
612 return 0;
613 }
614 }
615
616 __inline u8 *get_my_bssid(WLAN_BSSID_EX *pnetwork)
617 {
618 return (pnetwork->MacAddress);
619 }
620
621 u16 get_beacon_interval(WLAN_BSSID_EX *bss)
622 {
623 unsigned short val;
624 _rtw_memcpy((unsigned char *)&val, rtw_get_beacon_interval_from_ie(bss->IEs), 2);
625
626 return le16_to_cpu(val);
627
628 }
629
630 int is_client_associated_to_ap(_adapter *padapter)
631 {
632 struct mlme_ext_priv *pmlmeext;
633 struct mlme_ext_info *pmlmeinfo;
634
635 if(!padapter)
636 return _FAIL;
637
638 pmlmeext = &padapter->mlmeextpriv;
639 pmlmeinfo = &(pmlmeext->mlmext_info);
640
641 if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE))
642 {
643 return _TRUE;
644 }
645 else
646 {
647 return _FAIL;
648 }
649 }
650
651 int is_client_associated_to_ibss(_adapter *padapter)
652 {
653 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
654 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
655
656 if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE))
657 {
658 return _TRUE;
659 }
660 else
661 {
662 return _FAIL;
663 }
664 }
665
666 int is_IBSS_empty(_adapter *padapter)
667 {
668 unsigned int i;
669 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
670 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
671
672 for (i = IBSS_START_MAC_ID; i < NUM_STA; i++)
673 {
674 if (pmlmeinfo->FW_sta_info[i].status == 1)
675 {
676 return _FAIL;
677 }
678 }
679
680 return _TRUE;
681
682 }
683
684 unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval)
685 {
686 if ((bcn_interval << 2) < WAIT_FOR_BCN_TO_MIN)
687 {
688 return WAIT_FOR_BCN_TO_MIN;
689 }
690 else if ((bcn_interval << 2) > WAIT_FOR_BCN_TO_MAX)
691 {
692 return WAIT_FOR_BCN_TO_MAX;
693 }
694 else
695 {
696 return ((bcn_interval << 2));
697 }
698 }
699
700 void CAM_empty_entry(
701 PADAPTER Adapter,
702 u8 ucIndex
703 )
704 {
705 rtw_hal_set_hwreg(Adapter, HW_VAR_CAM_EMPTY_ENTRY, (u8 *)(&ucIndex));
706 }
707
708 void invalidate_cam_all(_adapter *padapter)
709 {
710 rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);
711 }
712 #if 0
713 static u32 _ReadCAM(_adapter *padapter ,u32 addr)
714 {
715 u32 count = 0, cmd;
716 cmd = CAM_POLLINIG |addr ;
717 rtw_write32(padapter, RWCAM, cmd);
718
719 do{
720 if(0 == (rtw_read32(padapter,REG_CAMCMD) & CAM_POLLINIG)){
721 break;
722 }
723 }while(count++ < 100);
724
725 return rtw_read32(padapter,REG_CAMREAD);
726 }
727 void read_cam(_adapter *padapter ,u8 entry)
728 {
729 u32 j,count = 0, addr, cmd;
730 addr = entry << 3;
731
732 printk("********* DUMP CAM Entry_#%02d***************\n",entry);
733 for (j = 0; j < 6; j++)
734 {
735 cmd = _ReadCAM(padapter ,addr+j);
736 printk("offset:0x%02x => 0x%08x \n",addr+j,cmd);
737 }
738 printk("*********************************\n");
739 }
740 #endif
741
742 void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key)
743 {
744 unsigned int i, val, addr;
745 //unsigned int cmd;
746 int j;
747 u32 cam_val[2];
748
749 addr = entry << 3;
750
751 for (j = 5; j >= 0; j--)
752 {
753 switch (j)
754 {
755 case 0:
756 val = (ctrl | (mac[0] << 16) | (mac[1] << 24) );
757 break;
758
759 case 1:
760 val = (mac[2] | ( mac[3] << 8) | (mac[4] << 16) | (mac[5] << 24));
761 break;
762
763 default:
764 i = (j - 2) << 2;
765 val = (key[i] | (key[i+1] << 8) | (key[i+2] << 16) | (key[i+3] << 24));
766 break;
767
768 }
769
770 cam_val[0] = val;
771 cam_val[1] = addr + (unsigned int)j;
772
773 rtw_hal_set_hwreg(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val);
774
775 //rtw_write32(padapter, WCAMI, val);
776
777 //cmd = CAM_POLLINIG | CAM_WRITE | (addr + j);
778 //rtw_write32(padapter, RWCAM, cmd);
779
780 //DBG_871X("%s=> cam write: %x, %x\n",__FUNCTION__, cmd, val);
781
782 }
783
784 }
785
786 void clear_cam_entry(_adapter *padapter, u8 entry)
787 {
788 #if 0
789 u32 addr, val=0;
790 u32 cam_val[2];
791
792 addr = entry << 3;
793
794
795 cam_val[0] = val;
796 cam_val[1] = addr + (unsigned int)0;
797
798 rtw_hal_set_hwreg(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val);
799
800
801
802 cam_val[0] = val;
803 cam_val[1] = addr + (unsigned int)1;
804
805 rtw_hal_set_hwreg(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val);
806 #else
807
808 unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
809
810 unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00};
811
812 write_cam(padapter, entry, 0, null_sta, null_key);
813
814 #endif
815 }
816
817 int allocate_fw_sta_entry(_adapter *padapter)
818 {
819 unsigned int mac_id;
820 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
821 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
822
823 for (mac_id = IBSS_START_MAC_ID; mac_id < NUM_STA; mac_id++)
824 {
825 if (pmlmeinfo->FW_sta_info[mac_id].status == 0)
826 {
827 pmlmeinfo->FW_sta_info[mac_id].status = 1;
828 pmlmeinfo->FW_sta_info[mac_id].retry = 0;
829 break;
830 }
831 }
832
833 return mac_id;
834 }
835
836 void flush_all_cam_entry(_adapter *padapter)
837 {
838 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
839 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
840
841 #ifdef CONFIG_CONCURRENT_MODE
842
843 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
844
845 //if(check_buddy_mlmeinfo_state(padapter, _HW_STATE_NOLINK_))
846 if(check_buddy_fwstate(padapter, _FW_LINKED) == _FALSE)
847 {
848 rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);
849 }
850 else
851 {
852 if(check_fwstate(pmlmepriv, WIFI_STATION_STATE))
853 {
854 struct sta_priv *pstapriv = &padapter->stapriv;
855 struct sta_info *psta;
856 u8 cam_id=0;//cam_entry
857
858 psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress);
859 if(psta) {
860 if(psta->state & WIFI_AP_STATE)
861 {} //clear cam when ap free per sta_info
862 else {
863 if(psta->mac_id==2)
864 cam_id = 5;
865 else
866 cam_id = 4;
867 }
868 //clear_cam_entry(padapter, cam_id);
869 rtw_clearstakey_cmd(padapter, (u8*)psta, cam_id, _FALSE);
870 }
871 }
872 else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
873 {
874 //clear cam when ap free per sta_info
875 }
876 }
877 #else //CONFIG_CONCURRENT_MODE
878
879 rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);
880
881 #endif //CONFIG_CONCURRENT_MODE
882
883 _rtw_memset((u8 *)(pmlmeinfo->FW_sta_info), 0, sizeof(pmlmeinfo->FW_sta_info));
884
885 }
886
887 #if defined(CONFIG_P2P) && defined(CONFIG_WFD)
888 int WFD_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
889 {
890 struct registry_priv *pregpriv = &padapter->registrypriv;
891 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
892 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
893 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
894 struct wifidirect_info *pwdinfo;
895 u8 wfd_ie[ 128 ] = { 0x00 };
896 u32 wfd_ielen = 0;
897
898
899 pwdinfo = &padapter->wdinfo;
900 if ( rtw_get_wfd_ie( ( u8* ) pIE, pIE->Length, wfd_ie, &wfd_ielen ) )
901 {
902 u8 attr_content[ 10 ] = { 0x00 };
903 u32 attr_contentlen = 0;
904
905 printk( "[%s] Found WFD IE\n", __FUNCTION__ );
906 rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);
907 if ( attr_contentlen )
908 {
909 pwdinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 );
910 DBG_8192C( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport );
911 return( _TRUE );
912 }
913 }
914 else
915 {
916 printk( "[%s] NO WFD IE\n", __FUNCTION__ );
917
918 }
919 return( _FAIL );
920 }
921 #endif
922
923 int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
924 {
925 //struct registry_priv *pregpriv = &padapter->registrypriv;
926 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
927 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
928 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
929
930 if(pmlmepriv->qospriv.qos_option==0)
931 {
932 pmlmeinfo->WMM_enable = 0;
933 return _FAIL;
934 }
935
936 pmlmeinfo->WMM_enable = 1;
937 _rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element));
938 return _TRUE;
939
940 /*if (pregpriv->wifi_spec == 1)
941 {
942 if (pmlmeinfo->WMM_enable == 1)
943 {
944 //todo: compare the parameter set count & decide wheher to update or not
945 return _FAIL;
946 }
947 else
948 {
949 pmlmeinfo->WMM_enable = 1;
950 _rtw_rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element));
951 return _TRUE;
952 }
953 }
954 else
955 {
956 pmlmeinfo->WMM_enable = 0;
957 return _FAIL;
958 }*/
959
960 }
961
962 void WMMOnAssocRsp(_adapter *padapter)
963 {
964 u8 ACI, ACM, AIFS, ECWMin, ECWMax, aSifsTime;
965 u8 acm_mask;
966 u16 TXOP;
967 u32 acParm, i;
968 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
969 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
970
971 if (pmlmeinfo->WMM_enable == 0)
972 {
973 padapter->mlmepriv.acm_mask = 0;
974 return;
975 }
976
977 acm_mask = 0;
978
979 if( pmlmeext->cur_wireless_mode == WIRELESS_11B)
980 aSifsTime = 10;
981 else
982 aSifsTime = 16;
983
984 for (i = 0; i < 4; i++)
985 {
986 ACI = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 5) & 0x03;
987 ACM = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 4) & 0x01;
988
989 //AIFS = AIFSN * slot time + SIFS - r2t phy delay
990 AIFS = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN & 0x0f) * pmlmeinfo->slotTime + aSifsTime;
991
992 ECWMin = (pmlmeinfo->WMM_param.ac_param[i].CW & 0x0f);
993 ECWMax = (pmlmeinfo->WMM_param.ac_param[i].CW & 0xf0) >> 4;
994 TXOP = le16_to_cpu(pmlmeinfo->WMM_param.ac_param[i].TXOP_limit);
995
996 acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16);
997
998 switch (ACI)
999 {
1000 case 0x0:
1001 rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm));
1002 acm_mask |= (ACM? BIT(1):0);
1003 break;
1004
1005 case 0x1:
1006 rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm));
1007 //acm_mask |= (ACM? BIT(0):0);
1008 break;
1009
1010 case 0x2:
1011 rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm));
1012 acm_mask |= (ACM? BIT(2):0);
1013 break;
1014
1015 case 0x3:
1016 rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm));
1017 acm_mask |= (ACM? BIT(3):0);
1018 break;
1019 }
1020
1021 DBG_871X("WMM(%x): %x, %x\n", ACI, ACM, acParm);
1022 }
1023
1024 if(padapter->registrypriv.acm_method == 1)
1025 rtw_hal_set_hwreg(padapter, HW_VAR_ACM_CTRL, (u8 *)(&acm_mask));
1026 else
1027 padapter->mlmepriv.acm_mask = acm_mask;
1028
1029 return;
1030 }
1031
1032 static void bwmode_update_check(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
1033 {
1034 unsigned char new_bwmode;
1035 unsigned char new_ch_offset;
1036 struct HT_info_element *pHT_info;
1037 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
1038 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1039 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1040 struct registry_priv *pregistrypriv = &padapter->registrypriv;
1041 struct ht_priv *phtpriv = &pmlmepriv->htpriv;
1042 u8 cbw40_enable=0;
1043
1044 if(!pIE)
1045 return;
1046
1047 if(phtpriv->ht_option == _FALSE) return;
1048
1049 if(pIE->Length > sizeof(struct HT_info_element))
1050 return;
1051
1052 pHT_info = (struct HT_info_element *)pIE->data;
1053
1054 if (pmlmeext->cur_channel > 14) {
1055 if (pregistrypriv->cbw40_enable & BIT(1))
1056 cbw40_enable = 1;
1057 } else {
1058 if (pregistrypriv->cbw40_enable & BIT(0))
1059 cbw40_enable = 1;
1060 }
1061
1062 if((pHT_info->infos[0] & BIT(2)) && cbw40_enable )
1063 {
1064 new_bwmode = HT_CHANNEL_WIDTH_40;
1065
1066 switch (pHT_info->infos[0] & 0x3)
1067 {
1068 case 1:
1069 new_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
1070 break;
1071
1072 case 3:
1073 new_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
1074 break;
1075
1076 default:
1077 new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
1078 break;
1079 }
1080 }
1081 else
1082 {
1083 new_bwmode = HT_CHANNEL_WIDTH_20;
1084 new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
1085 }
1086
1087
1088 if((new_bwmode!= pmlmeext->cur_bwmode) || (new_ch_offset!=pmlmeext->cur_ch_offset))
1089 {
1090 pmlmeinfo->bwmode_updated = _TRUE;
1091
1092 pmlmeext->cur_bwmode = new_bwmode;
1093 pmlmeext->cur_ch_offset = new_ch_offset;
1094
1095 //update HT info also
1096 HT_info_handler(padapter, pIE);
1097 }
1098 else
1099 {
1100 pmlmeinfo->bwmode_updated = _FALSE;
1101 }
1102
1103
1104 if(_TRUE == pmlmeinfo->bwmode_updated)
1105 {
1106 struct sta_info *psta;
1107 WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
1108 struct sta_priv *pstapriv = &padapter->stapriv;
1109
1110 //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
1111
1112
1113 //update ap's stainfo
1114 psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress);
1115 if(psta)
1116 {
1117 struct ht_priv *phtpriv_sta = &psta->htpriv;
1118
1119 if(phtpriv_sta->ht_option)
1120 {
1121 // bwmode
1122 phtpriv_sta->bwmode = pmlmeext->cur_bwmode;
1123 phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset;
1124 }
1125 else
1126 {
1127 phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_20;
1128 phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
1129 }
1130
1131 }
1132
1133 //pmlmeinfo->bwmode_updated = _FALSE;//bwmode_updated done, reset it!
1134
1135 }
1136
1137 }
1138
1139 void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
1140 {
1141 unsigned int i;
1142 u8 rf_type;
1143 u8 max_AMPDU_len, min_MPDU_spacing;
1144 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1145 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1146 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1147 struct ht_priv *phtpriv = &pmlmepriv->htpriv;
1148 struct registry_priv *pregistrypriv = &padapter->registrypriv;
1149
1150 if(pIE==NULL) return;
1151
1152 if(phtpriv->ht_option == _FALSE) return;
1153
1154 pmlmeinfo->HT_caps_enable = 1;
1155
1156 for (i = 0; i < (pIE->Length); i++)
1157 {
1158 if (i != 2)
1159 {
1160 // Commented by Albert 2010/07/12
1161 // Got the endian issue here.
1162 pmlmeinfo->HT_caps.u.HT_cap[i] &= (pIE->data[i]);
1163 }
1164 else
1165 {
1166 //modify from fw by Thomas 2010/11/17
1167 if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3) > (pIE->data[i] & 0x3))
1168 {
1169 max_AMPDU_len = (pIE->data[i] & 0x3);
1170 }
1171 else
1172 {
1173 max_AMPDU_len = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3);
1174 }
1175
1176 if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) > (pIE->data[i] & 0x1c))
1177 {
1178 min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c);
1179 }
1180 else
1181 {
1182 min_MPDU_spacing = (pIE->data[i] & 0x1c);
1183 }
1184
1185 pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para = max_AMPDU_len | min_MPDU_spacing;
1186 }
1187 }
1188
1189 // Commented by Albert 2010/07/12
1190 // Have to handle the endian issue after copying.
1191 // HT_ext_caps didn't be used yet.
1192 pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info = le16_to_cpu( pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info );
1193 pmlmeinfo->HT_caps.u.HT_cap_element.HT_ext_caps = le16_to_cpu( pmlmeinfo->HT_caps.u.HT_cap_element.HT_ext_caps );
1194
1195 rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
1196
1197 //update the MCS rates
1198 for (i = 0; i < 16; i++)
1199 {
1200 if((rf_type == RF_1T1R) || (rf_type == RF_1T2R))
1201 {
1202 pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
1203 }
1204 else
1205 {
1206 #ifdef CONFIG_DISABLE_MCS13TO15
1207 if(pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40 && (pregistrypriv->wifi_spec!=1))
1208 pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R_MCS13TO15_OFF[i];
1209 else
1210 pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
1211 #else
1212 pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
1213 #endif //CONFIG_DISABLE_MCS13TO15
1214 }
1215 #ifdef RTL8192C_RECONFIG_TO_1T1R
1216 {
1217 pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
1218 }
1219 #endif
1220
1221 if(pregistrypriv->special_rf_path)
1222 pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
1223
1224 }
1225
1226 return;
1227 }
1228
1229 void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
1230 {
1231 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1232 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1233 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1234 struct ht_priv *phtpriv = &pmlmepriv->htpriv;
1235
1236 if(pIE==NULL) return;
1237
1238 if(phtpriv->ht_option == _FALSE) return;
1239
1240
1241 if(pIE->Length > sizeof(struct HT_info_element))
1242 return;
1243
1244 pmlmeinfo->HT_info_enable = 1;
1245 _rtw_memcpy(&(pmlmeinfo->HT_info), pIE->data, pIE->Length);
1246
1247 return;
1248 }
1249
1250 void HTOnAssocRsp(_adapter *padapter)
1251 {
1252 unsigned char max_AMPDU_len;
1253 unsigned char min_MPDU_spacing;
1254 //struct registry_priv *pregpriv = &padapter->registrypriv;
1255 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1256 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1257
1258 DBG_871X("%s\n", __FUNCTION__);
1259
1260 if ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable))
1261 {
1262 pmlmeinfo->HT_enable = 1;
1263 }
1264 else
1265 {
1266 pmlmeinfo->HT_enable = 0;
1267 //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
1268 return;
1269 }
1270
1271 //handle A-MPDU parameter field
1272 /*
1273 AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k
1274 AMPDU_para [4:2]:Min MPDU Start Spacing
1275 */
1276 max_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03;
1277
1278 min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2;
1279
1280 rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing));
1281
1282 rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len));
1283
1284 #if 0 //move to rtw_update_ht_cap()
1285 if ((pregpriv->cbw40_enable) &&
1286 (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & BIT(1)) &&
1287 (pmlmeinfo->HT_info.infos[0] & BIT(2)))
1288 {
1289 //switch to the 40M Hz mode accoring to the AP
1290 pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40;
1291 switch ((pmlmeinfo->HT_info.infos[0] & 0x3))
1292 {
1293 case HT_EXTCHNL_OFFSET_UPPER:
1294 pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
1295 break;
1296
1297 case HT_EXTCHNL_OFFSET_LOWER:
1298 pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
1299 break;
1300
1301 default:
1302 pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
1303 break;
1304 }
1305
1306 //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset);
1307 }
1308 #endif
1309
1310 //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
1311
1312 #if 0 //move to rtw_update_ht_cap()
1313 //
1314 // Config SM Power Save setting
1315 //
1316 pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2;
1317 if(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC)
1318 {
1319 /*u8 i;
1320 //update the MCS rates
1321 for (i = 0; i < 16; i++)
1322 {
1323 pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
1324 }*/
1325 DBG_871X("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__);
1326 }
1327
1328 //
1329 // Config current HT Protection mode.
1330 //
1331 pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3;
1332 #endif
1333
1334 }
1335
1336 void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
1337 {
1338 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1339 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1340
1341 if(pIE->Length>1)
1342 return;
1343
1344 pmlmeinfo->ERP_enable = 1;
1345 _rtw_memcpy(&(pmlmeinfo->ERP_IE), pIE->data, pIE->Length);
1346 }
1347
1348 void VCS_update(_adapter *padapter, struct sta_info *psta)
1349 {
1350 struct registry_priv *pregpriv = &padapter->registrypriv;
1351 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1352 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1353
1354 switch (pregpriv->vrtl_carrier_sense)/* 0:off 1:on 2:auto */
1355 {
1356 case 0: //off
1357 psta->rtsen = 0;
1358 psta->cts2self = 0;
1359 break;
1360
1361 case 1: //on
1362 if (pregpriv->vcs_type == 1) /* 1:RTS/CTS 2:CTS to self */
1363 {
1364 psta->rtsen = 1;
1365 psta->cts2self = 0;
1366 }
1367 else
1368 {
1369 psta->rtsen = 0;
1370 psta->cts2self = 1;
1371 }
1372 break;
1373
1374 case 2: //auto
1375 default:
1376 if ((pmlmeinfo->ERP_enable) && (pmlmeinfo->ERP_IE & BIT(1)))
1377 {
1378 if (pregpriv->vcs_type == 1)
1379 {
1380 psta->rtsen = 1;
1381 psta->cts2self = 0;
1382 }
1383 else
1384 {
1385 psta->rtsen = 0;
1386 psta->cts2self = 1;
1387 }
1388 }
1389 else
1390 {
1391 psta->rtsen = 0;
1392 psta->cts2self = 0;
1393 }
1394 break;
1395 }
1396 }
1397
1398 #ifdef CONFIG_TDLS
1399 int check_ap_tdls_prohibited(u8 *pframe, u8 pkt_len)
1400 {
1401 u8 tdls_prohibited_bit = 0x40; //bit(38); TDLS_prohibited
1402
1403 if(pkt_len < 5)
1404 {
1405 return _FALSE;
1406 }
1407
1408 pframe += 4;
1409 if( (*pframe) & tdls_prohibited_bit )
1410 return _TRUE;
1411
1412 return _FALSE;
1413 }
1414 #endif //CONFIG_TDLS
1415
1416 void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta_info *psta)
1417 {
1418 unsigned int i;
1419 unsigned int len;
1420 PNDIS_802_11_VARIABLE_IEs pIE;
1421
1422 #ifdef CONFIG_TDLS
1423 struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
1424 u8 tdls_prohibited[] = { 0x00, 0x00, 0x00, 0x00, 0x10 }; //bit(38): TDLS_prohibited
1425 #endif //CONFIG_TDLS
1426
1427 len = pkt_len - (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN);
1428
1429 for (i = 0; i < len;)
1430 {
1431 pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN) + i);
1432
1433 switch (pIE->ElementID)
1434 {
1435 #if 0
1436 case _VENDOR_SPECIFIC_IE_:
1437 //todo: to update WMM paramter set while receiving beacon
1438 if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6)) //WMM
1439 {
1440 (WMM_param_handler(padapter, pIE))? WMMOnAssocRsp(padapter): 0;
1441 }
1442 break;
1443 #endif
1444
1445 case _HT_EXTRA_INFO_IE_: //HT info
1446 //HT_info_handler(padapter, pIE);
1447 bwmode_update_check(padapter, pIE);
1448 break;
1449
1450 case _ERPINFO_IE_:
1451 ERP_IE_handler(padapter, pIE);
1452 VCS_update(padapter, psta);
1453 break;
1454
1455 #ifdef CONFIG_TDLS
1456 case _EXT_CAP_IE_:
1457 if( check_ap_tdls_prohibited(pIE->data, pIE->Length) == _TRUE )
1458 ptdlsinfo->ap_prohibited = _TRUE;
1459 break;
1460 #endif //CONFIG_TDLS
1461 default:
1462 break;
1463 }
1464
1465 i += (pIE->Length + 2);
1466 }
1467 }
1468
1469 #ifdef CONFIG_DFS
1470 void process_csa_ie(_adapter *padapter, u8 *pframe, uint pkt_len)
1471 {
1472 unsigned int i;
1473 unsigned int len;
1474 PNDIS_802_11_VARIABLE_IEs pIE;
1475 u8 new_ch_no = 0;
1476
1477 len = pkt_len - (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN);
1478
1479 for (i = 0; i < len;)
1480 {
1481 pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN) + i);
1482
1483 switch (pIE->ElementID)
1484 {
1485 case _CH_SWTICH_ANNOUNCE_:
1486 _rtw_memcpy(&new_ch_no, pIE->data+1, 1);
1487 rtw_set_csa_cmd(padapter, new_ch_no);
1488 break;
1489
1490 default:
1491 break;
1492 }
1493
1494 i += (pIE->Length + 2);
1495 }
1496 }
1497 #endif //CONFIG_DFS
1498
1499 unsigned int is_ap_in_tkip(_adapter *padapter)
1500 {
1501 u32 i;
1502 PNDIS_802_11_VARIABLE_IEs pIE;
1503 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1504 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1505 WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
1506
1507 if (rtw_get_capability((WLAN_BSSID_EX *)cur_network) & WLAN_CAPABILITY_PRIVACY)
1508 {
1509 for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;)
1510 {
1511 pIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i);
1512
1513 switch (pIE->ElementID)
1514 {
1515 case _VENDOR_SPECIFIC_IE_:
1516 if ((_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4)) && (_rtw_memcmp((pIE->data + 12), WPA_TKIP_CIPHER, 4)))
1517 {
1518 return _TRUE;
1519 }
1520 break;
1521
1522 case _RSN_IE_2_:
1523 if (_rtw_memcmp((pIE->data + 8), RSN_TKIP_CIPHER, 4))
1524 {
1525 return _TRUE;
1526 }
1527
1528 default:
1529 break;
1530 }
1531
1532 i += (pIE->Length + 2);
1533 }
1534
1535 return _FALSE;
1536 }
1537 else
1538 {
1539 return _FALSE;
1540 }
1541
1542 }
1543
1544 int wifirate2_ratetbl_inx(unsigned char rate);
1545 int wifirate2_ratetbl_inx(unsigned char rate)
1546 {
1547 int inx = 0;
1548 rate = rate & 0x7f;
1549
1550 switch (rate)
1551 {
1552 case 54*2:
1553 inx = 11;
1554 break;
1555
1556 case 48*2:
1557 inx = 10;
1558 break;
1559
1560 case 36*2:
1561 inx = 9;
1562 break;
1563
1564 case 24*2:
1565 inx = 8;
1566 break;
1567
1568 case 18*2:
1569 inx = 7;
1570 break;
1571
1572 case 12*2:
1573 inx = 6;
1574 break;
1575
1576 case 9*2:
1577 inx = 5;
1578 break;
1579
1580 case 6*2:
1581 inx = 4;
1582 break;
1583
1584 case 11*2:
1585 inx = 3;
1586 break;
1587 case 11:
1588 inx = 2;
1589 break;
1590
1591 case 2*2:
1592 inx = 1;
1593 break;
1594
1595 case 1*2:
1596 inx = 0;
1597 break;
1598
1599 }
1600 return inx;
1601 }
1602
1603 unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz)
1604 {
1605 unsigned int i, num_of_rate;
1606 unsigned int mask = 0;
1607
1608 num_of_rate = (ptn_sz > NumRates)? NumRates: ptn_sz;
1609
1610 for (i = 0; i < num_of_rate; i++)
1611 {
1612 if ((*(ptn + i)) & 0x80)
1613 {
1614 mask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i));
1615 }
1616 }
1617 return mask;
1618 }
1619
1620 unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz)
1621 {
1622 unsigned int i, num_of_rate;
1623 unsigned int mask = 0;
1624
1625 num_of_rate = (ptn_sz > NumRates)? NumRates: ptn_sz;
1626
1627 for (i = 0; i < num_of_rate; i++)
1628 {
1629 mask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i));
1630 }
1631
1632 return mask;
1633 }
1634
1635 unsigned int update_MSC_rate(struct HT_caps_element *pHT_caps)
1636 {
1637 unsigned int mask = 0;
1638
1639 mask = ((pHT_caps->u.HT_cap_element.MCS_rate[0] << 12) | (pHT_caps->u.HT_cap_element.MCS_rate[1] << 20));
1640
1641 return mask;
1642 }
1643
1644 int support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps)
1645 {
1646 unsigned char bit_offset;
1647 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1648 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1649
1650 if (!(pmlmeinfo->HT_enable))
1651 return _FAIL;
1652
1653 if ((pmlmeinfo->assoc_AP_vendor == ralinkAP))
1654 return _FAIL;
1655
1656 bit_offset = (pmlmeext->cur_bwmode & HT_CHANNEL_WIDTH_40)? 6: 5;
1657
1658 if (pHT_caps->u.HT_cap_element.HT_caps_info & (0x1 << bit_offset))
1659 {
1660 return _SUCCESS;
1661 }
1662 else
1663 {
1664 return _FAIL;
1665 }
1666 }
1667
1668 unsigned char get_highest_rate_idx(u32 mask)
1669 {
1670 int i;
1671 unsigned char rate_idx=0;
1672
1673 for(i=27; i>=0; i--)
1674 {
1675 if(mask & BIT(i))
1676 {
1677 rate_idx = i;
1678 break;
1679 }
1680 }
1681
1682 return rate_idx;
1683 }
1684
1685 unsigned char get_highest_mcs_rate(struct HT_caps_element *pHT_caps);
1686 unsigned char get_highest_mcs_rate(struct HT_caps_element *pHT_caps)
1687 {
1688 int i, mcs_rate;
1689
1690 mcs_rate = (pHT_caps->u.HT_cap_element.MCS_rate[0] | (pHT_caps->u.HT_cap_element.MCS_rate[1] << 8));
1691
1692 for (i = 15; i >= 0; i--)
1693 {
1694 if (mcs_rate & (0x1 << i))
1695 {
1696 break;
1697 }
1698 }
1699
1700 return i;
1701 }
1702
1703 void Update_RA_Entry(_adapter *padapter, u32 mac_id)
1704 {
1705 rtw_hal_update_ra_mask(padapter, mac_id);
1706 }
1707
1708 void enable_rate_adaptive(_adapter *padapter, u32 mac_id);
1709 void enable_rate_adaptive(_adapter *padapter, u32 mac_id)
1710 {
1711 Update_RA_Entry(padapter, mac_id);
1712 }
1713
1714 void set_sta_rate(_adapter *padapter, struct sta_info *psta)
1715 {
1716 //rate adaptive
1717 enable_rate_adaptive(padapter, psta->mac_id);
1718 }
1719
1720 // Update RRSR and Rate for USERATE
1721 void update_tx_basic_rate(_adapter *padapter, u8 wirelessmode)
1722 {
1723 NDIS_802_11_RATES_EX supported_rates;
1724 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1725 #ifdef CONFIG_P2P
1726 struct wifidirect_info* pwdinfo = &padapter->wdinfo;
1727
1728 // Added by Albert 2011/03/22
1729 // In the P2P mode, the driver should not support the b mode.
1730 // So, the Tx packet shouldn't use the CCK rate
1731 if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
1732 return;
1733 #endif //CONFIG_P2P
1734 #ifdef CONFIG_INTEL_WIDI
1735 if (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_NONE)
1736 return;
1737 #endif //CONFIG_INTEL_WIDI
1738
1739 _rtw_memset(supported_rates, 0, NDIS_802_11_LENGTH_RATES_EX);
1740
1741 //clear B mod if current channel is in 5G band, avoid tx cck rate in 5G band.
1742 if(pmlmeext->cur_channel > 14)
1743 wirelessmode &= ~(WIRELESS_11B);
1744
1745 if ((wirelessmode & WIRELESS_11B) && (wirelessmode == WIRELESS_11B)) {
1746 _rtw_memcpy(supported_rates, rtw_basic_rate_cck, 4);
1747 } else if (wirelessmode & WIRELESS_11B) {
1748 _rtw_memcpy(supported_rates, rtw_basic_rate_mix, 7);
1749 } else {
1750 _rtw_memcpy(supported_rates, rtw_basic_rate_ofdm, 3);
1751 }
1752
1753 if (wirelessmode & WIRELESS_11B)
1754 update_mgnt_tx_rate(padapter, IEEE80211_CCK_RATE_1MB);
1755 else
1756 update_mgnt_tx_rate(padapter, IEEE80211_OFDM_RATE_6MB);
1757
1758 rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, supported_rates);
1759 }
1760
1761 unsigned char check_assoc_AP(u8 *pframe, uint len)
1762 {
1763 unsigned int i;
1764 PNDIS_802_11_VARIABLE_IEs pIE;
1765
1766 for (i = sizeof(NDIS_802_11_FIXED_IEs); i < len;)
1767 {
1768 pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + i);
1769
1770 switch (pIE->ElementID)
1771 {
1772 case _VENDOR_SPECIFIC_IE_:
1773 if ((_rtw_memcmp(pIE->data, ARTHEROS_OUI1, 3)) || (_rtw_memcmp(pIE->data, ARTHEROS_OUI2, 3)))
1774 {
1775 DBG_871X("link to Artheros AP\n");
1776 return atherosAP;
1777 }
1778 else if ((_rtw_memcmp(pIE->data, BROADCOM_OUI1, 3))
1779 || (_rtw_memcmp(pIE->data, BROADCOM_OUI2, 3))
1780 || (_rtw_memcmp(pIE->data, BROADCOM_OUI2, 3)))
1781 {
1782 DBG_871X("link to Broadcom AP\n");
1783 return broadcomAP;
1784 }
1785 else if (_rtw_memcmp(pIE->data, MARVELL_OUI, 3))
1786 {
1787 DBG_871X("link to Marvell AP\n");
1788 return marvellAP;
1789 }
1790 else if (_rtw_memcmp(pIE->data, RALINK_OUI, 3))
1791 {
1792 DBG_871X("link to Ralink AP\n");
1793 return ralinkAP;
1794 }
1795 else if (_rtw_memcmp(pIE->data, CISCO_OUI, 3))
1796 {
1797 DBG_871X("link to Cisco AP\n");
1798 return ciscoAP;
1799 }
1800 else if (_rtw_memcmp(pIE->data, REALTEK_OUI, 3))
1801 {
1802 DBG_871X("link to Realtek 96B\n");
1803 return realtekAP;
1804 }
1805 else if (_rtw_memcmp(pIE->data, AIRGOCAP_OUI,3))
1806 {
1807 DBG_871X("link to Airgo Cap\n");
1808 return airgocapAP;
1809 }
1810 else
1811 {
1812 break;
1813 }
1814
1815 default:
1816 break;
1817 }
1818
1819 i += (pIE->Length + 2);
1820 }
1821
1822 DBG_871X("link to new AP\n");
1823 return unknownAP;
1824 }
1825
1826 void update_IOT_info(_adapter *padapter)
1827 {
1828 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1829 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1830
1831 switch (pmlmeinfo->assoc_AP_vendor)
1832 {
1833 case marvellAP:
1834 pmlmeinfo->turboMode_cts2self = 1;
1835 pmlmeinfo->turboMode_rtsen = 0;
1836 break;
1837
1838 case ralinkAP:
1839 pmlmeinfo->turboMode_cts2self = 0;
1840 pmlmeinfo->turboMode_rtsen = 1;
1841 //disable high power
1842 Switch_DM_Func(padapter, (~DYNAMIC_FUNC_HP), _FALSE);
1843 break;
1844 case realtekAP:
1845 //rtw_write16(padapter, 0x4cc, 0xffff);
1846 //rtw_write16(padapter, 0x546, 0x01c0);
1847 //disable high power
1848 Switch_DM_Func(padapter, (~DYNAMIC_FUNC_HP), _FALSE);
1849 break;
1850 default:
1851 pmlmeinfo->turboMode_cts2self = 0;
1852 pmlmeinfo->turboMode_rtsen = 1;
1853 break;
1854 }
1855
1856 }
1857
1858 void update_capinfo(PADAPTER Adapter, u16 updateCap)
1859 {
1860 struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
1861 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1862 BOOLEAN ShortPreamble;
1863
1864 // Check preamble mode, 2005.01.06, by rcnjko.
1865 // Mark to update preamble value forever, 2008.03.18 by lanhsin
1866 //if( pMgntInfo->RegPreambleMode == PREAMBLE_AUTO )
1867 {
1868
1869 if(updateCap & cShortPreamble)
1870 { // Short Preamble
1871 if(pmlmeinfo->preamble_mode != PREAMBLE_SHORT) // PREAMBLE_LONG or PREAMBLE_AUTO
1872 {
1873 ShortPreamble = _TRUE;
1874 pmlmeinfo->preamble_mode = PREAMBLE_SHORT;
1875 rtw_hal_set_hwreg( Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble );
1876 }
1877 }
1878 else
1879 { // Long Preamble
1880 if(pmlmeinfo->preamble_mode != PREAMBLE_LONG) // PREAMBLE_SHORT or PREAMBLE_AUTO
1881 {
1882 ShortPreamble = _FALSE;
1883 pmlmeinfo->preamble_mode = PREAMBLE_LONG;
1884 rtw_hal_set_hwreg( Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble );
1885 }
1886 }
1887 }
1888
1889 if ( updateCap & cIBSS ) {
1890 //Filen: See 802.11-2007 p.91
1891 pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME;
1892 }
1893 else
1894 {
1895 //Filen: See 802.11-2007 p.90
1896 if( pmlmeext->cur_wireless_mode & (WIRELESS_11G | WIRELESS_11_24N))
1897 {
1898 if( (updateCap & cShortSlotTime) /* && (!(pMgntInfo->pHTInfo->RT2RT_HT_Mode & RT_HT_CAP_USE_LONG_PREAMBLE)) */)
1899 { // Short Slot Time
1900 if(pmlmeinfo->slotTime != SHORT_SLOT_TIME)
1901 {
1902 pmlmeinfo->slotTime = SHORT_SLOT_TIME;
1903 }
1904 }
1905 else
1906 { // Long Slot Time
1907 if(pmlmeinfo->slotTime != NON_SHORT_SLOT_TIME)
1908 {
1909 pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME;
1910 }
1911 }
1912 }
1913 else if( pmlmeext->cur_wireless_mode & (WIRELESS_11A | WIRELESS_11_5N))
1914 {
1915 pmlmeinfo->slotTime = SHORT_SLOT_TIME;
1916 }
1917 else
1918 {
1919 //B Mode
1920 pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME;
1921 }
1922 }
1923
1924 rtw_hal_set_hwreg( Adapter, HW_VAR_SLOT_TIME, &pmlmeinfo->slotTime );
1925
1926 }
1927
1928 void update_wireless_mode(_adapter *padapter)
1929 {
1930 u8 init_rate=0;
1931 int ratelen, network_type = 0;
1932 u32 SIFS_Timer, mask;
1933 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1934 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1935 WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
1936 unsigned char *rate = cur_network->SupportedRates;
1937 #ifdef CONFIG_CONCURRENT_MODE
1938 _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
1939 #endif //CONFIG_CONCURRENT_MODE
1940
1941 ratelen = rtw_get_rateset_len(cur_network->SupportedRates);
1942
1943 if ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable))
1944 {
1945 pmlmeinfo->HT_enable = 1;
1946 }
1947
1948 if(pmlmeext->cur_channel > 14)
1949 {
1950 if (pmlmeinfo->HT_enable)
1951 {
1952 network_type = WIRELESS_11_5N;
1953 }
1954
1955 network_type |= WIRELESS_11A;
1956 }
1957 else
1958 {
1959 if (pmlmeinfo->HT_enable)
1960 {
1961 network_type = WIRELESS_11_24N;
1962 }
1963
1964 if ((cckratesonly_included(rate, ratelen)) == _TRUE)
1965 {
1966 network_type |= WIRELESS_11B;
1967 }
1968 else if((cckrates_included(rate, ratelen)) == _TRUE)
1969 {
1970 network_type |= WIRELESS_11BG;
1971 }
1972 else
1973 {
1974 network_type |= WIRELESS_11G;
1975 }
1976 }
1977
1978 pmlmeext->cur_wireless_mode = network_type & padapter->registrypriv.wireless_mode;
1979
1980 //For STA mode, driver need to modify initial data rate, or MAC will use wrong tx rate.
1981 //Modified by Thomas 2012-12-3
1982 mask = update_supported_rate(cur_network->SupportedRates, ratelen);
1983 init_rate = get_highest_rate_idx(mask)&0x3f;
1984 rtw_hal_set_hwreg( padapter, HW_VAR_INIT_DATA_RATE, (u8 *)&init_rate);
1985
1986 /*
1987 if((pmlmeext->cur_wireless_mode==WIRELESS_11G) ||
1988 (pmlmeext->cur_wireless_mode==WIRELESS_11BG))//WIRELESS_MODE_G)
1989 SIFS_Timer = 0x0a0a;//CCK
1990 else
1991 SIFS_Timer = 0x0e0e;//pHalData->SifsTime; //OFDM
1992 */
1993
1994 SIFS_Timer = 0x0a0a0808; //0x0808 -> for CCK, 0x0a0a -> for OFDM
1995 //change this value if having IOT issues.
1996
1997 rtw_hal_set_hwreg( padapter, HW_VAR_RESP_SIFS, (u8 *)&SIFS_Timer);
1998
1999 if (pmlmeext->cur_wireless_mode & WIRELESS_11B)
2000 update_mgnt_tx_rate(padapter, IEEE80211_CCK_RATE_1MB);
2001 else
2002 {
2003 update_mgnt_tx_rate(padapter, IEEE80211_OFDM_RATE_6MB);
2004 #ifdef CONFIG_CONCURRENT_MODE
2005 if(pbuddy_adapter && (pmlmeext->cur_wireless_mode & WIRELESS_11A))
2006 update_mgnt_tx_rate(pbuddy_adapter, IEEE80211_OFDM_RATE_6MB);
2007 #endif //CONFIG_CONCURRENT_MODE
2008 }
2009 }
2010
2011 void fire_write_MAC_cmd(_adapter *padapter, unsigned int addr, unsigned int value);
2012 void fire_write_MAC_cmd(_adapter *padapter, unsigned int addr, unsigned int value)
2013 {
2014 #if 0
2015 struct cmd_obj *ph2c;
2016 struct reg_rw_parm *pwriteMacPara;
2017 struct cmd_priv *pcmdpriv = &(padapter->cmdpriv);
2018
2019 if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
2020 {
2021 return;
2022 }
2023
2024 if ((pwriteMacPara = (struct reg_rw_parm*)rtw_malloc(sizeof(struct reg_rw_parm))) == NULL)
2025 {
2026 rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
2027 return;
2028 }
2029
2030 pwriteMacPara->rw = 1;
2031 pwriteMacPara->addr = addr;
2032 pwriteMacPara->value = value;
2033
2034 init_h2fwcmd_w_parm_no_rsp(ph2c, pwriteMacPara, GEN_CMD_CODE(_Write_MACREG));
2035 rtw_enqueue_cmd(pcmdpriv, ph2c);
2036 #endif
2037 }
2038
2039 void update_bmc_sta_support_rate(_adapter *padapter, u32 mac_id)
2040 {
2041 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
2042 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
2043
2044 if(pmlmeext->cur_wireless_mode & WIRELESS_11B)
2045 {
2046 // Only B, B/G, and B/G/N AP could use CCK rate
2047 _rtw_memcpy((pmlmeinfo->FW_sta_info[mac_id].SupportedRates), rtw_basic_rate_cck, 4);
2048 }
2049 else
2050 {
2051 _rtw_memcpy((pmlmeinfo->FW_sta_info[mac_id].SupportedRates), rtw_basic_rate_ofdm, 3);
2052 }
2053 }
2054
2055 int update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx)
2056 {
2057 unsigned int ie_len;
2058 PNDIS_802_11_VARIABLE_IEs pIE;
2059 int supportRateNum = 0;
2060 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
2061 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
2062
2063 pIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _SUPPORTEDRATES_IE_, &ie_len, var_ie_len);
2064 if (pIE == NULL)
2065 {
2066 return _FAIL;
2067 }
2068
2069 _rtw_memcpy(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates, pIE->data, ie_len);
2070 supportRateNum = ie_len;
2071
2072 pIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _EXT_SUPPORTEDRATES_IE_, &ie_len, var_ie_len);
2073 if (pIE)
2074 {
2075 _rtw_memcpy((pmlmeinfo->FW_sta_info[cam_idx].SupportedRates + supportRateNum), pIE->data, ie_len);
2076 }
2077
2078 return _SUCCESS;
2079
2080 }
2081
2082 void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr)
2083 {
2084 struct sta_info *psta;
2085 u16 tid, start_seq, param;
2086 struct recv_reorder_ctrl *preorder_ctrl;
2087 struct sta_priv *pstapriv = &padapter->stapriv;
2088 struct ADDBA_request *preq = (struct ADDBA_request*)paddba_req;
2089 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
2090 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
2091
2092 psta = rtw_get_stainfo(pstapriv, addr);
2093
2094 if(psta)
2095 {
2096 start_seq = le16_to_cpu(preq->BA_starting_seqctrl) >> 4;
2097
2098 param = le16_to_cpu(preq->BA_para_set);
2099 tid = (param>>2)&0x0f;
2100
2101 preorder_ctrl = &psta->recvreorder_ctrl[tid];
2102
2103 #ifdef CONFIG_UPDATE_INDICATE_SEQ_WHILE_PROCESS_ADDBA_REQ
2104 preorder_ctrl->indicate_seq = start_seq;
2105 #ifdef DBG_RX_SEQ
2106 DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, start_seq: %d\n", __FUNCTION__, __LINE__,
2107 preorder_ctrl->indicate_seq, start_seq);
2108 #endif
2109 #else
2110 preorder_ctrl->indicate_seq = 0xffff;
2111 #endif
2112
2113 preorder_ctrl->enable =(pmlmeinfo->bAcceptAddbaReq == _TRUE)? _TRUE :_FALSE;
2114 }
2115
2116 }
2117
2118 void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len)
2119 {
2120 u8* pIE;
2121 u32 *pbuf;
2122
2123 pIE = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);
2124 pbuf = (u32*)pIE;
2125
2126 pmlmeext->TSFValue = le32_to_cpu(*(pbuf+1));
2127
2128 pmlmeext->TSFValue = pmlmeext->TSFValue << 32;
2129
2130 pmlmeext->TSFValue |= le32_to_cpu(*pbuf);
2131 }
2132
2133 void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext)
2134 {
2135 rtw_hal_set_hwreg(padapter, HW_VAR_CORRECT_TSF, 0);
2136 }
2137
2138 void beacon_timing_control(_adapter *padapter)
2139 {
2140 rtw_hal_bcn_related_reg_setting(padapter);
2141 }
2142
2143 #if 0
2144 unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame)
2145 {
2146 unsigned short ATIMWindow;
2147 unsigned char *pframe;
2148 struct tx_desc *ptxdesc;
2149 struct rtw_ieee80211_hdr *pwlanhdr;
2150 unsigned short *fctrl;
2151 unsigned int rate_len, len = 0;
2152 struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
2153 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
2154 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
2155 WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
2156 u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2157
2158 _rtw_memset(beacon_frame, 0, 256);
2159
2160 pframe = beacon_frame + TXDESC_SIZE;
2161
2162 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
2163
2164 fctrl = &(pwlanhdr->frame_ctl);
2165 *(fctrl) = 0;
2166
2167 _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
2168 _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
2169 _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN);
2170
2171 SetFrameSubType(pframe, WIFI_BEACON);
2172
2173 pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
2174 len = sizeof(struct rtw_ieee80211_hdr_3addr);
2175
2176 //timestamp will be inserted by hardware
2177 pframe += 8;
2178 len += 8;
2179
2180 // beacon interval: 2 bytes
2181 _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2);
2182
2183 pframe += 2;
2184 len += 2;
2185
2186 // capability info: 2 bytes
2187 _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);
2188
2189 pframe += 2;
2190 len += 2;
2191
2192 // SSID
2193 pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &len);
2194
2195 // supported rates...
2196 rate_len = rtw_get_rateset_len(cur_network->SupportedRates);
2197 pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &len);
2198
2199 // DS parameter set
2200 pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &len);
2201
2202 // IBSS Parameter Set...
2203 //ATIMWindow = cur->Configuration.ATIMWindow;
2204 ATIMWindow = 0;
2205 pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &len);
2206
2207 //todo: ERP IE
2208
2209 // EXTERNDED SUPPORTED RATE
2210 if (rate_len > 8)
2211 {
2212 pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &len);
2213 }
2214
2215 if ((len + TXDESC_SIZE) > 256)
2216 {
2217 //DBG_871X("marc: beacon frame too large\n");
2218 return 0;
2219 }
2220
2221 //fill the tx descriptor
2222 ptxdesc = (struct tx_desc *)beacon_frame;
2223
2224 //offset 0
2225 ptxdesc->txdw0 |= cpu_to_le32(len & 0x0000ffff);
2226 ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00ff0000); //default = 32 bytes for TX Desc
2227
2228 //offset 4
2229 ptxdesc->txdw1 |= cpu_to_le32((0x10 << QSEL_SHT) & 0x00001f00);
2230
2231 //offset 8
2232 ptxdesc->txdw2 |= cpu_to_le32(BMC);
2233 ptxdesc->txdw2 |= cpu_to_le32(BK);
2234
2235 //offset 16
2236 ptxdesc->txdw4 = 0x80000000;
2237
2238 //offset 20
2239 ptxdesc->txdw5 = 0x00000000; //1M
2240
2241 return (len + TXDESC_SIZE);
2242 }
2243 #endif
2244
2245 static _adapter *pbuddy_padapter = NULL;
2246
2247 int rtw_handle_dualmac(_adapter *adapter, bool init)
2248 {
2249 int status = _SUCCESS;
2250 struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
2251
2252 if (!IS_HARDWARE_TYPE_8192D(adapter))
2253 goto exit;
2254
2255 if (init) {
2256 rtw_hal_get_def_var(adapter, HAL_DEF_DUAL_MAC_MODE, &dvobj->DualMacMode);
2257 if (dvobj->DualMacMode == _TRUE) {
2258 // temply disable IPS For 92D-VC
2259 adapter->registrypriv.ips_mode = IPS_NONE;
2260 }
2261
2262 /* For SMSP on 92DU-VC, driver do not probe another Interface. */
2263 if ((dvobj->DualMacMode != _TRUE) && (dvobj->InterfaceNumber != 0)) {
2264 DBG_871X("%s(): Do not init another Interface because SMSP\n",__FUNCTION__);
2265 status = _FAIL;
2266 goto exit;
2267 }
2268
2269 #ifndef CONFIG_CONCURRENT_MODE
2270 if (dvobj->DualMacMode == _TRUE) {
2271 if (pbuddy_padapter == NULL) {
2272 pbuddy_padapter = adapter;
2273 DBG_871X("%s(): pbuddy_padapter == NULL, Set pbuddy_padapter\n",__FUNCTION__);
2274 } else {
2275 adapter->pbuddy_adapter = pbuddy_padapter;
2276 pbuddy_padapter->pbuddy_adapter = adapter;
2277 // clear global value
2278 pbuddy_padapter = NULL;
2279 DBG_871X("%s(): pbuddy_padapter exist, Exchange Information\n",__FUNCTION__);
2280 }
2281 }
2282
2283 #ifdef CONFIG_DUALMAC_CONCURRENT
2284 if (dvobj->InterfaceNumber == 0) {
2285 //set adapter_type/iface type
2286 adapter->isprimary = _TRUE;
2287 adapter->adapter_type = PRIMARY_ADAPTER;
2288 adapter->iface_type = IFACE_PORT0;
2289 DBG_871X("%s(): PRIMARY_ADAPTER\n",__FUNCTION__);
2290 } else {
2291 //set adapter_type/iface type
2292 adapter->isprimary = _FALSE;
2293 adapter->adapter_type = SECONDARY_ADAPTER;
2294 adapter->iface_type = IFACE_PORT1;
2295 DBG_871X("%s(): SECONDARY_ADAPTER\n",__FUNCTION__);
2296 }
2297 #endif
2298 #endif
2299 }else {
2300 pbuddy_padapter = NULL;
2301 }
2302 exit:
2303 return status;
2304 }
2305