W załączniku zamieszczam sterowniki do karty WLAN 8level WPCIE-300A V2. Zdjęcie urządzenia: http://obrazki.elektroda.pl/7896173300_1420880698_thumb.jpg Windows nie instaluje automatycznie tej karty, na stronie producenta także brak sterowników. Pliki zostały zgrane z płyty dołączonej do urządzenia.
/*
*************************************************************************
* Ralink Tech Inc.
* 5F., No.36, Taiyuan St., Jhubei City,
* Hsinchu County 302,
* Taiwan, R.O.C.
*
* (c) Copyright 2002-2010, Ralink Technology, Inc.
*
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*************************************************************************/
#ifndef __AGS_H__
#define __AGS_H__
extern UCHAR AGS1x1HTRateTable[];
extern UCHAR AGS2x2HTRateTable[];
extern UCHAR AGS3x3HTRateTable[];
#define AGS_TX_QUALITY_WORST_BOUND 8
//
// The size, in bytes, of an AGS entry in the rate switch table
//
#define SIZE_OF_AGS_RATE_TABLE_ENTRY 9
typedef struct _RTMP_TX_RATE_SWITCH_AGS {
UCHAR ItemNo;
#ifdef RT_BIG_ENDIAN
UCHAR Rsv2:2;
UCHAR Mode:2;
UCHAR Rsv1:1;
UCHAR BW:1;
UCHAR ShortGI:1;
UCHAR STBC:1;
#else
UCHAR STBC:1;
UCHAR ShortGI:1;
UCHAR BW:1;
UCHAR Rsv1:1;
UCHAR Mode:2;
UCHAR Rsv2:2;
#endif // RT_BIG_ENDIAN //
UCHAR CurrMCS;
UCHAR TrainUp;
UCHAR TrainDown;
UCHAR downMcs;
UCHAR upMcs3;
UCHAR upMcs2;
UCHAR upMcs1;
UCHAR dataRate;
} RTMP_TX_RATE_SWITCH_AGS, *PRTMP_TX_RATE_SWITCH_AGS;
//
// AGS control
//
typedef struct _AGS_CONTROL {
UCHAR MCSGroup; // The MCS group under testing
UCHAR lastRateIdx;
} AGS_CONTROL,*PAGS_CONTROL;
//
// The statistics information for AGS
//
typedef struct _AGS_STATISTICS_INFO {
CHAR RSSI;
ULONG TxErrorRatio;
ULONG AccuTxTotalCnt;
ULONG TxTotalCnt;
ULONG TxSuccess;
ULONG TxRetransmit;
ULONG TxFailCount;
} AGS_STATISTICS_INFO, *PAGS_STATISTICS_INFO;
//
// Support AGS (Adaptive Group Switching)
//
#define SUPPORT_AGS(__pAd) (IS_RT3593(__pAd))
#define AGS_IS_USING(__pAd, __pRateTable) \
(SUPPORT_AGS(__pAd) & & \
((__pRateTable == AGS1x1HTRateTable) || \
(__pRateTable == AGS2x2HTRateTable) || \
(__pRateTable == AGS3x3HTRateTable)))
#endif // __AGS_H__ //
/* End of ags.h */
===================================================================================================
ATE Test Command Format for station driver
****** IMPORTANT ******
If you are not familiar with hardware, it is recommanded not to modify hardware default value.
It may damage hardware.
===================================================================================================
Usage:
iwpriv ra0 [act] [parameters]=[val]
where
[act] [parameters] [val] constraints explaination
----- ------------- ----------------- --------------------------------
=====================================
1. Set ATE actions.
Value:
ATESTART - Start ATE function and stop station function.
ATESTOP - Stop ATE function and start station function.
TXCONT - Start continuous TX, for power mask.
TXCARR - Start carrier test, for frequency calibration.
TXFRAME - Transmit frame, for EVM.
RXFRAME - Continuous RX, for PER/FER.
1.1 ATEDA
Set ATE frame header destination address.
Value:
xx:xx:xx:xx:xx:xx ; hex
1.2 ATESA
Set ATE frame header source addr.
Value:
xx:xx:xx:xx:xx:xx ; hex
1.3 ATEBSSID
Set ATE frame header BSSID.
Value:
xx:xx:xx:xx:xx:xx ; hex
1.4 ATECHANNEL
Set ATE Channel, deimal.
Value:
802.11b/g: 1 ~ 14 depends on CountryRegion setting
1.5 ATETXPOW0
Set ATE Tx power for Antenna 1.
Value:
0 ~ 31 ; 2.4GHz, deimal
-7 ~15 ; 5.5GHz, deimal
1.6 ATETXPOW1
Set ATE Tx power for Antenna 2.
Value:
0 ~ 31 ; 2.4GHz, decimal
-7 ~15 ; 5.5GHz, deimal
1.7 ATETXFREQOFFSET
Set ATE RF frequency offset.
Value:
0 ~ 63 ; unit: 2KHz, decimal
1.8 ATETXLEN
Set ATE frame length.
Value:
24 ~ 2312 ; decimal
1.9 ATETXCNT
Set ATE frame Tx count.
Value:
1 ~ ; 32-bit, decimal
1.10 ATETXMODE (Refer to TxMode)
Set ATE Tx Mode.
Value:
0: CCK 802.11b
1: OFDM 802.11g
2: HT_MIX 802.11b/g/n
3: Green Field 802.11n
1.11 ATETXBW (Refer to TxMode)
Set ATE Tx and Rx Bandwidth.
Value:
0: 20MHz
1: 40MHz
1.12 ATETXGI (Refer to TxMode)
Set ATE Tx Guard Interval.
Value:
0: Long
1: Short
1.13 ATETXMCS (Refer to TxMode)
Set ATE Tx MCS type.
Value:
0 ~ 15
1.14 ATETXANT
Set ATE TX antenna.
Value:
0: All
1: Antenna one
2: Antenna two
1.15 ATERXANT
Set ATE RX antenna.
Value:
0: All
1: Antenna one
2: Antenna two
3: Antenna three
1.16 ATERXFER
Set ATE to periodically reset and show up RxCount (per-second) and RxTotalCount.
Value:
0: Disable counter visability
1: Enable counter visability
1.17 ATESHOW
Show all parameters of ATE.
Value:
1
1.18 ATEHELP
List all commands of ATE.
Value:
1
1.19 ResetCounter
Reset statistic counter.
Value:
1
1.20 ATERRF
Read all of the RF registers.
Value:
1
1.21 ATEWRF1
Write the RF register 1.
Value:
xxxxxxxx ;32-bit, hex
1.22 ATEWRF2
Write the RF register 2.
Value:
xxxxxxxx ;32-bit, hex
1.23 ATEWRF3
Write the RF register 3.
Value:
xxxxxxxx ;32-bit, hex
1.24 ATEWRF4
Write the RF register 4.
Value:
xxxxxxxx ;32-bit, hex
1.25 ATELDE2P
Overwrite all EEPROM contents
Value:
1
E.g.
iwpriv ra0 set ATELDE2P=1
1.26 ATERE2P
Display all EEPROM content.
Value:
1
E.g.
iwpriv ra0 set ATERE2P=1
===================================================================================================
2. Examples:
=========
2.1 Check EVM & Power
iwpriv ra0 set ATE=ATESTART
iwpriv ra0 set ATEDA=00:11:22:33:44:55
iwpriv ra0 set ATESA=00:aa:bb:cc:dd:ee
iwpriv ra0 set ATEBSSID=00:11:22:33:44:55
iwpriv ra0 set ATECHANNEL=1 ; set Channel
iwpriv ra0 set ATETXMODE=1 ; set TX-Mode.
iwpriv ra0 set ATETXMCS=7 ; set MCS type.
iwpriv ra0 set ATETXBW=0 ; set Bandwidth
iwpriv ra0 set ATETXGI=0 ; set Long GI.
iwpriv ra0 set ATETXLEN=1024 ; set packet length.
iwpriv ra0 set ATETXPOW0=18
iwpriv ra0 set ATETXPOW1=18
iwpriv ra0 set ATETXCNT=100000
iwpriv ra0 set ATE=TXFRAME
¡K
iwpriv ra0 set ATETXPOW0=19
¡K
iwpriv ra0 set ATETXPOW0=20
¡K
iwpriv ra0 set ATE=ATESTART
2.2 Check Carrier
iwpriv ra0 set ATE=ATESTART
iwpriv ra0 set ATECHANNEL=1 ; set Channel
iwpriv ra0 set ATETXMODE=1 ; set TX-Mode.
iwpriv ra0 set ATETXMCS=7 ; set MCS type.
iwpriv ra0 set ATETXBW=0 ; set Bandwidth
iwpriv ra0 set ATETXCNT=200 ; Tx frame count(decmial)
iwpriv ra0 set ATE=TXFRAME ; Start Tx Frame(inform BBP to change, modulation mode)
iwpriv ra0 set ATE=TXCARR ; Start Tx carrier, Measure carrier with instrument
iwpriv ra0 set ATETXPOW0=05
iwpriv ra0 set ATETXPOW1=05
iwpriv ra0 set ATETXFREQOFFSET=19
iwpriv ra0 set ATE=ATESTART
2.3 Check specturm mask
iwpriv ra0 set ATE=ATESTART
iwpriv ra0 set ATECHANNEL=1 ; set Channel
iwpriv ra0 set ATETXMODE=1 ; set TX-Mode.
iwpriv ra0 set ATETXMCS=7 ; set MCS type.
iwpriv ra0 set ATETXBW=0 ; set Bandwidth
iwpriv ra0 set ATETXCNT=200 ; Tx frame count(decmial)
iwpriv ra0 set ATE=TXFRAME ; Start Tx Frame(inform BBP to change, modulation mode)
iwpriv ra0 set ATE=TXCONT ; Start continuous TX, Measure specturm mask with instrument
iwpriv ra0 set ATETXPOW0=5
iwpriv ra0 set ATETXPOW1=5
iwpriv ra0 set ATE=ATESTART
2.4 Frequency offset tuning
iwpriv ra0 set ATE=ATESTART
iwpriv ra0 set ATECHANNEL=1 ; set Channel
iwpriv ra0 set ATETXMODE=1 ; set TX-Mode.
iwpriv ra0 set ATETXMCS=7 ; set MCS type.
iwpriv ra0 set ATETXCNT=200 ; Tx frame count(decmial)
iwpriv ra0 set ATETXFREQOFFSET=0 ; Set frequency offset 0(decimal)
iwpriv ra0 set ATE=TXFRAME ; Start Tx Frame
iwpriv ra0 set ATE=TXCARR ; Start Tx carrier, Measure carrier frequency with instrument
iwpriv ra0 set ATETXFREQOFFSET=10 ; Dynamic turning frequency offset, 10(decimal)
iwpriv ra0 set ATETXFREQOFFSET=20 ; Dynamic turning frequency offset, 20(decimal)
iwpriv ra0 set ATE=ATESTART ; Stop, Store the tuning result to EEPROM
2.5 Rx
iwpriv ra0 set ATE=ATESTART
iwpriv ra0 set ATECHANNEL=1 ; set Channel
iwpriv ra0 set ResetCounter=1 ; Reset statistic counter
iwpriv ra0 set ATETXFREQOFFSET=value ;To use the ¡§value¡¨(decimal) you got in tx calibration
iwpriv ra0 set ATETXMODE=1 ; set TX-Mode.
iwpriv ra0 set ATETXMCS=7 ; set MCS type.
iwpriv ra0 set ATETXBW=0 ; set Bandwidth
iwpriv ra0 set ATE=RXFRAME ; Start Rx,
iwpriv ra0 set ATERXFER=1 ; show RxCnt and RSSI/per-antenna, Transmit test packets
iwpriv ra0 set ATE=ATESTART ; Stop
iwpriv ra0 stat ; get statistics counter
iwpriv ra0 set ATERXFER=1
iwpriv ra0 set ATERXANT=1
iwpriv ra0 set ATE=ATESTART
iwpriv ra0 set ATERXANT=0
iwpriv ra0 set ATE=RXFRAME
2.6 Show all ate parameters
iwpriv ra0 set ATESHOW=1
Mode=4
TxPower0=0
TxPower1=0
TxAntennaSel=0
RxAntennaSel=0
BBPCurrentBW=0
GI=0
MCS=7
TxMode=1
Addr1=00:11:22:aa:bb:cc
Addr2=00:11:22:aa:bb:cc
Addr3=00:11:22:aa:bb:cc
Channel=1
TxLength=1024
TxCount=40000
TxRate=11
RFFreqOffset=0
2.7 Online help
iwpriv ra0 set ATEHELP=1
ATE=ATESTART, ATESTOP, TXCONT, TXCARR, TXFRAME, RXFRAME
ATEDA
ATESA
ATEBSSID
ATECHANNEL, range:0~14(unless A band !).
ATETXPOW0, set power level of antenna 1.
ATETXPOW1, set power level of antenna 2.
ATETXANT, set TX antenna. 0: all, 1: antenna one, 2: antenna two.
ATERXANT, set RX antenna.0: all, 1: antenna one, 2: antenna two, 3: antenna three.
ATETXFREQOFFSET, set frequency offset, range 0~63.
ATETXBW, set BandWidth, 0:20MHz, 1:40MHz.
ATETXLEN, set Frame length, range 24~2312.
ATETXCNT, set how many frame going to transmit.
ATETXMCS, set MCS, reference to rate table.
ATETXMODE, set Mode 0: CCK, 1: OFDM, 2: HT-Mix, 3: GreenField, reference to rate table.
ATETXGI, set GI interval, 0: Long, 1: Short.
ATERXFER, 0: disable Rx Frame error rate. 1: enable Rx Frame error rate.
ATERRF, show all RF registers.
ATEWRF1, set RF1 register.
ATEWRF2, set RF2 register.
ATEWRF3, set RF3 register.
ATEWRF4, set RF4 register.
ATELDE2P, load EEPROM from .bin file.
ATERE2P, display all EEPROM content.
ATESHOW, display all parameters of ATE.
ATEHELP, online help.
2.8 Display Rx Packet Count and RSSI
iwpriv ra0 set ATERXANT=0 == & gt; Enable All Three Rx Antennas
iwpriv ra0 set ATERXFER=1 == & gt; Enable Rx Frame Error Rate: RxCnt/RxTotal
iwpriv ra0 set ATE=RXFRAME == & gt; Start Rx
MlmePeriodicExec: Rx packet cnt = 2/4
MlmePeriodicExec: Rx AvgRssi0=-88, AvgRssi1=-80, AvgRssi2=-91
MlmePeriodicExec: Rx packet cnt = 2/6
MlmePeriodicExec: Rx AvgRssi0=-86, AvgRssi1=-77, AvgRssi2=-89¡K
¡K
iwpriv ra0 set ATERXANT=1 == & gt; Enable Three Rx Antenna-1
iwpriv ra0 set ATERXFER=1 == & gt; Enable Rx Frame Error Rate: RxCnt/RxTotal
iwpriv ra0 set ATE=RXFRAME == & gt; Start Rx
MlmePeriodicExec: Rx packet cnt = 0/7
MlmePeriodicExec: Rx AvgRssi=-87
MlmePeriodicExec: Rx packet cnt = 7/14
MlmePeriodicExec: Rx AvgRssi=-90
¡K
¡K
===================================================================================================
3. Hardware Access
==================
=====================================
3.1 iwpriv ra0 bbp [parameters]=[Value]
Read/Write BBP registers by ID number.
BBPID
3.1.1 Read BBP register, BBPID only, no ¡§=¡¨ symbol.
BBPID:
0 ~ xx ; decimal, 8-bit
BBPID=Value
3.1.2 Write BBP register.
BBPID:
0 ~ xx ; decimal, 8-bit
Value:
00 ~FF ; hexdecimal, 8-bit
=====================================
3.2 iwpriv ra0 mac [parameters]=[val]
Read/Write MAC registers by offset.
MAC_OFFSET
3.2.1 Read MAC register, MAC_OFFSET only, no ¡§=¡¨ symbol.
MAC_OFFSET:
0000 ~ FFFF ; hexdecimal, 16-bit
MAC_OFFSET=Value
3.2.2 Write MAC register.
MAC_OFFSET:
0000 ~ FFFF ; hexdecimal, 16-bit
Value:
0000 ~FFFF ; hexdecimal, 32-bit
=====================================
3.3 iwpriv ra0 e2p [parameters]=[val]
Read/Write EEPROM content by address.
EEP_ADDR
3.3.1 Read EEPROM content, EEP_ADDR only, no ¡§=¡¨ symbol.
EEP_ADDR:
00 ~ FF ; hexdecimal, 16-bit alignment (0, 2, 4, 6, 8, A, C, ¡K)
EEP_ADDR=Value
3.3.2 Write EEPROM content.
EEP_ADDR:
00 ~ FF ; hexdecimal, 16-bit alignment (0, 2, 4, 6, 8, A, C, ¡K)
Value:
0000 ~FFFF ; hexdecimal, 16-bit
=====================================
3.4 Example
3.4.1 Hardware access
iwpriv ra0 bbp 0 # read BBP register 0
iwpriv ra0 bbp 0=12 # write BBP register 0 as 0x12
iwpriv ra0 mac 0 # read MAC register 0
iwpriv ra0 mac 0=1234abcd # write MAC register 0 as 0x1234abcd
iwpriv ra0 e2p 0 # read E2PROM 0
iwpriv ra0 e2p c=12ab # write E2PROM 0xc as 0x12ab
3.4.2 Statistic counter operation
iwpriv ra0 stat # read statistic counter
iwpriv ra0 set ResetCounter=0 # reset statistic counter
Suggestion:
1. To turn on ATE functionality, you have to add compile flag " RALINK_ATE " to Makefile
2. Before doing ATE testing, please stop AP function
3. If you want to test another ATE action, prefer to stop AP & ATE function
4. All ATE function settings will lose efficacy after reboot.
5. Before hardware register access, please reference hardware spec.
Note.
In ATE mode, the channel must set via " ATECHANNEL "
===================================================================================================
4. ated
=======
4.1 Introduction
The ated is an optional user space component for RT28xx Linux driver.
When Windows GUI starts, AP enters ATE mode (i.e.,ATESTART) immediately.
It behaves as a proxy between Windows GUI and RT28xx Linux driver when ATE process proceeds.
The ated will be killed automatically when Windows GUI is closed.
You can kill it manually, too(for example, type '$killall ated').
RT28xx linux driver will leave ATE mode either ated is killed or Windows GUI is closed.
4.2 Environment setup
1. Connect the platform you want to test directly with a Windows host by ether network line.
2. In the Windows host, run WinPcap_4_0.exe for the QA GUI or ./RT2880_ATE/RaUI.exe(please unrar " RT2880_ATE.rar " to get it).
4.3 How to use ated for ATE purpose
0. First you should set both " HAS_ATE=y " and " HAS_QA_SUPPORT=y " in the file ~/Module/os/linux/config.mk and compile the driver.
1. Modify the Makefile according to our target " PLATFORM " .
2. Change the path of " CROSS_COMPILE " if needed.
3. Then type 'make' command to compile the source code of the daemon.
4. After the driver interface has started up, attach both of the wireless interface and the ethernet interface to the bridge interface.
5. If you have no bridge interface, please give an IP address to the ethernet interface.
(for example : '$ated -beth0')
6. After the interfaces have entered forwarding states, manually start ated, type '$ated -bbrX -iraX'.
7. If your WLAN interface and Bridge interface is " ra0 " and " br0 " respectively, just type $ated.
(For further usage of options, type $ated -h)
8. In the Windows host, run RT28xxQA_ATE.exe or ./RT2880_ATE/RaUI.exe.
9. Select the wired network adapter, then press OK and wait for a moment.
10.If the Windows host cannot tolerate such a broadcast storm from ated,
please run ated with option -u.(for example : '$ated -ira1 -u')
11.If your target platform concerns its network security, please run RT28xxQA_unicast.exe instead of RT28xxQA_ATE.exe.
Note :
a. The names of WLAN interface(default is " ra0 " ) and Bridge interface(default is " br0 " ) must be specified manually(for example : '$ated -bbr1 -ira2') if your WLAN interface or Bridge interface is not " ra0 " or " br0 " respectively !
b. Please make sure no other RaUI is running before you excute ./RT2880_ATE/RaUI.exe.
iwpriv
=================
This is detailed explanation of each parameters for iwpriv.
Before reading this document, make sure you already read README.
-------------------------------------------------------------------------------------------------------
USAGE:
iwpriv ra0 commands val
NOTE:
Wireless Extension Private Handlers
where
[commands] [val]
{range}
----------------- -------------------------------------------------
wsc_conf_mode {0, 1, 2}
::Set WPS conf mode
0: WPS Disabled
1: Enrollee
2: Registrar
wsc_mode {1, 2}
::PIN or PBC
1: PIN
2: PBC
wsc_pin {00000000 ~ 99999999}
::Set Enrollee's PIN Code
wsc_ssid {0~z, 1~32 ascii characters}
::Set WPS AP SSID
wsc_start NULL
::Trigger RT2860 STA driver to do WPS process
wsc_stop NULL
::Stop WPS process
wsc_gen_pincode NULL
::Generate new PIN code
wsc_cred_count {1 ~ 8}
::Set count of WPS credential
wsc_cred_ssid { " idx ssid_str " }
::Set SSID into credtentail[idx]
idx: 0 ~ 7
ssid_str: 0~z, 1~32 ascii characters
wsc_cred_auth { " idx auth_str " }
::Set AuthMode into credtentail[idx]
idx: 0 ~ 7
auth_str: OPEN, WPAPSK, WPA2PSK, SHARED, WPA, WPA2
wsc_cred_encr { " idx encr_str " }
::Set EncrypType into credtentail[idx]
idx: 0 ~ 7
encr_str: NONE, WEP, TKIP, AES
wsc_cred_keyIdx { " idx key_index " }
::Set Key Index into credtentail[idx]
idx: 0 ~ 7
key_index: 1 ~ 4
wsc_cred_key { " idx key " }
::Set Key into credtentail[idx]
idx: 0 ~ 7
key: ASCII string (wep_key_len(=5,13), passphrase_len(=8~63))
OR
Hex string (wep_key_len(=10,26), passphrase_len(=64))
wsc_cred_mac { " idx mac_str " }
::Set AP's MAC into credtentail[idx]
idx: 0 ~ 7
mac_str: xx:xx:xx:xx:xx:xx
wsc_conn_by_idx {0 ~ 7}
::Connect AP by credential index
wsc_auto_conn {0, 1}
::Set driver to re-connecting to AP or not after registration.
0: Disabled, driver won't re-connect to AP with new configurations.
1: Enabled, driver will re-connect to AP with new configurations.
wsc_ap_band {0, 1, 2}
::Set prefer band to do WPS with dual band WPS AP
0 : prefer 2.4G
1 : prefer 5G
2 : auto
Default value is auto (2)
-------------------------------------------------------------------------------------------------------
USAGE:
iwpriv ra0 set [parameters]=[val]
NOTE:
Execute one iwpriv/set command simultaneously.
where
[parameters] [val]
{range}
----------------- -------------------------------------------------
CountryRegion {0~7}
::Set country region
0: 1 ~ 11 ch
1: 1 ~ 13 ch
2: 10, 11 ch
3: 10 ~ 13 ch
4: 14 ch
5: 1 ~ 14 ch
6: 3 ~ 9 ch
7: 5 ~ 13 ch
31: 1 ~ 14 ch (ch1-11:active scan, ch12-14 passive scan)
CountryRegionABand {0~11}
::Set country region for A band
0: 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165 ch
1: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 ch
2: 36, 40, 44, 48, 52, 56, 60, 64 ch
3: 52, 56, 60, 64, 149, 153, 157, 161 ch
4: 149, 153, 157, 161, 165 ch
5: 149, 153, 157, 161 ch
6: 36, 40, 44, 48 ch
7: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 ch
8: 52, 56, 60, 64 ch
9: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165 ch
10: 36, 40, 44, 48, 149, 153, 157, 161, 165 ch
11: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153, 157, 161 ch
SSID {0~z, 1~32 ascii characters}
::Set AP SSID
WirelessMode {0~10}
::Set Wireless Mode
0: legacy 11b/g mixed
1: legacy 11B only
2: legacy 11A only
3: legacy 11a/b/g mixed
4: legacy 11G only
5: 11ABGN mixed
6: 11N only
7: 11GN mixed
8: 11AN mixed
9: 11BGN mixed
10: 11AGN mixed
Channel depends on CountryRegion or CountryRegionForABand
::Set Channel
BGProtection {0~2}
::Set 11B/11G Protection
0:Auto,
1:Always on,
2:Always off
TxPreamble {0~2}
::Set TxPreamble
0:Preamble Long,
1:Preamble Short,
2:Auto
RTSThreshold {1~2347}
::Set RTS Threshold
FragThreshold {256~2346}
::Set Fragment Threshold
TxBurst {0,1}
::Set TxBurst Enable or Disable
0:Disable,
1:Enable
NetworkType {Infra,Adhoc}
::Set Network type
AuthMode {OPEN,SHARED,WEPAUTO,WPAPSK,WPA2PSK,WPANONE}
::Set Authentication Mode
EncrypType {NONE,WEP,TKIP,AES}
::Set Encryption Type
DefaultKeyID {1~4}
::Set Default Key ID
Key1 {5 ascii characters or 10 hex number or
13 ascii characters or 26 hex numbers}
::Set Key1 String
Key2 {5 ascii characters or 10 hex number or
13 ascii characters or 26 hex numbers}
::Set Key2 String
Key3 {5 ascii characters or 10 hex number or
13 ascii characters or 26 hex numbers}
::Set Key3 String
Key4 {5 ascii characters or 10 hex number or
13 ascii characters or 26 hex numbers}
::Set Key4 String
WPAPSK {8~63 ascii or 64 hex characters}
::WPA Pre-Shared Key
WmmCapable {0,1}
::Set WMM Capable
0:Disable WMM,
1:Enable WMM
PSMode {CAM, MAX_PSP, FAST_PSP}
::Set Power Saving Mode
HtBw {0,1}
::Set BandWidth
0: 20Hz
1: 40Hz
HtMcs {0 ~ 15, 33}
::Set MCS
33: Auto Rate
HtGi {0,1}
::Set Guard Interval(GI)
0: long GI
1: short GI
HtOpMode {0,1}
::Set HT Operation Mode
0: HT mixed format
1: HT greenfield format
HtExtcha {0,1}
::Set Extended Channel Switch Announcement
0: Below
1: Above
HtMpduDensity {0 ~ 7}
::Set The Minimum Time Between MPDUs within an AMPDU
HtBaWinSize {1 ~ 64}
::Set BA WinSize
HtRdg {0,1}
::Set RDG Capable
0: Disabled
1: Enabled
HtAmsdu {0,1}
::Set AMSDU Capable
0: Disabled
1: Enabled
HtAutoBa {0,1}
::Set Auto BA Capable
0: Disabled
1: Enabled
HtBaDecline {0,1}
::Reject BA request from AP
0: Disabled
1: Enabled
HtProtect {0,1}
::Set HT Protect Capable
0: Disabled
1: Enabled
FixedTxMode {CCK, OFDM}
:: Set Fixed Tx Mode for fixed rate setting
Mode = CCK
MCS = 0 = & gt; 1Mbps
= 1 = & gt; 2Mbps
= 2 = & gt; 5.5 Mbps
= 3 = & gt; 11 Mbps
Mode = OFDM
MCS = 0 = & gt; 6Mbps
= 1 = & gt; 9Mbps
= 2 = & gt; 12Mbps
= 3 = & gt; 18Mbps
= 4 = & gt; 24Mbps
= 5 = & gt; 36Mbps
= 6 = & gt; 48Mbps
= 7 = & gt; 54Mbps
== & gt; Build Ethernet Convert function. Please set 'HAS_ETH_CONVERT_SUPPORT=y' in os/linux/config.mk
EthConvertMode {dongle, clone, hybrid}
::Set Ethernet Convert Mode
EthCloneMac {xx:xx:xx:xx:xx:xx}
:: Set Clone MAC
LongRetry {0,255}
:: Set Tx Long Retry Limit
ShortRetry {0,255}
:: Set Tx Short Retry Limit
MeshId {Length 1~32 ascii characters}
:: Set Mesh ID
MeshHostName {Length 1~32 ascii characters}
:: Set Mesh Host Name
MeshAutoLink {1,0}
:: Set Mesh Auto Link Capable
0: Disabled
1: Enabled
MeshAddLink {xx:xx:xx:xx:xx:xx}
:: Add Mesh Link
MeshDelLink {xx:xx:xx:xx:xx:xx}
:: Delete Mesh Link
MeshMultiCastAgeOut {20 ~ 65535 seconds}
:: Set AgeOut time for Mesh MultiCast
MeshAuthMode {OPEN, WPANONE}
:: Set Mesh Authentication Mode
MeshEncrypType {NONE, WEP, TKIP, AES}
:: Set Mesh Encryption Type
MeshDefaultkey {1 ~ 4}
:: Set Mesh Default Key ID
MeshWEPKEY {5 ascii characters or 10 hex number or
13 ascii characters or 26 hex numbers}
:: Set Mesh WEP Key String
MeshWPAKEY {8~63 ascii or 64 hex characters}
:: Set Mesh WPA Pre-Shared Key
Examples
===================================================================
-------------------------------------------------------------------------------------------------------
a & gt; Config STA to link with AP which is OPEN/NONE(Authentication/Encryption)
1. iwpriv ra0 set NetworkType=Infra
2. iwpriv ra0 set AuthMode=OPEN
3. iwpriv ra0 set EncrypType=NONE
4. iwpriv ra0 set SSID= " AP's SSID "
b & gt; Config STA to link with AP which is SHARED/WEP(Authentication/Encryption)
1. iwpriv ra0 set NetworkType=Infra
2. iwpriv ra0 set AuthMode=SHARED
3. iwpriv ra0 set EncrypType=WEP
4. iwpriv ra0 set DefaultKeyID=1
5. iwpriv ra0 set Key1= " AP's wep key "
6. iwpriv ra0 set SSID= " AP's SSID "
c & gt; Config STA to link with AP which is WPAPSK/TKIP(Authentication/Encryption)
1. iwpriv ra0 set NetworkType=Infra
2. iwpriv ra0 set AuthMode=WPAPSK
3. iwpriv ra0 set EncrypType=TKIP
4. iwpriv ra0 set SSID= " AP's SSID "
5. iwpriv ra0 set WPAPSK= " AP's wpa-preshared key "
6. iwpriv ra0 set SSID= " AP's SSID "
d & gt; Config STA to link with AP which is WPAPSK/AES(Authentication/Encryption)
1. iwpriv ra0 set NetworkType=Infra
2. iwpriv ra0 set AuthMode=WPAPSK
3. iwpriv ra0 set EncrypType=AES
4. iwpriv ra0 set SSID= " AP's SSID "
5. iwpriv ra0 set WPAPSK= " AP's wpa-preshared key "
6. iwpriv ra0 set SSID= " AP's SSID "
e & gt; Config STA to link with AP which is WPA2PSK/TKIP(Authentication/Encryption)
1. iwpriv ra0 set NetworkType=Infra
2. iwpriv ra0 set AuthMode=WPA2PSK
3. iwpriv ra0 set EncrypType=TKIP
4. iwpriv ra0 set SSID= " AP's SSID "
5. iwpriv ra0 set WPAPSK=12345678
6. iwpriv ra0 set SSID= " AP's SSID "
f & gt; Config STA to create/link as adhoc mode, which is OPEN/NONE(Authentication/Encryption)
1. iwpriv ra0 set NetworkType=Adhoc
2. iwpriv ra0 set AuthMode=OPEN
3. iwpriv ra0 set EncrypType=NONE
4. iwpriv ra0 set SSID= " Adhoc's SSID "
g & gt; Config STA to create/link as adhoc mode, which is WPANONE/TKIP(Authentication/Encryption)
1. iwpriv ra0 set NetworkType=Adhoc
2. iwpriv ra0 set AuthMode=WPANONE
3. iwpriv ra0 set EncrypType=TKIP
4. iwpriv ra0 set SSID= " AP's SSID "
5. iwpriv ra0 set WPAPSK=12345678
6. iwpriv ra0 set SSID= " AP's SSID "
h & gt; Get site survey
usage: iwpriv ra0 get_site_survey
i & gt; Get Statistics
usage: iwpriv ra0 stat ; read statistic counter
iwpriv ra0 set ResetCounter=0 ; reset statistic counter
j & gt; Link with an AP which is the largest strength ; set ANY SSID (ssidLen=0)
usage: iwconfig ra0 essid " "
or
usage: iwpriv ra0 set SSID= " "
k & gt; Config STA to link as dongle mode with STA own MAC
usage: iwpriv ra0 set EthConvertMode=dongle
l & gt; Config STA to link as clone mode
usage: iwpriv ra0 set EthConvertMode=clone
iwpriv ra0 set EthCloneMac= " Desired MAC " ;; 00:00:00:00:00:00 means using STA own MAC
;; FF:FF:FF:FF:FF:FF means using source MAC of first packet coming from wired device
m & gt; Config STA to link as hybrid(dongle+clone) mode
usage: iwpriv ra0 set EthConvertMode=hybrid
iwpriv ra0 set EthCloneMac= " Desired MAC " ;; 00:00:00:00:00:00 means using STA own MAC
;; FF:FF:FF:FF:FF:FF means using source MAC of first packet coming from wired device
===================================================================
iwlist
=================
This is detailed explanation of each parameters for iwlist.
-------------------------------------------------------------------------------------------------------
iwlist ra0 scanning ; list the results after scanning(manual rescan)
=======================================================================================================
iwconfig
=================
The following are our support in standard configuration - iwconfig
-------------------------------------------------------------------------------------------------------
iwconfig ra0 essid {NN|on|off} ; set essid
iwconfig ra0 mode {managed|ad-hoc|...} ; set wireless mode
& gt; & gt; rt2860sta driver support monitor mode with linux kernel & gt; 2.4.20.
& gt; & gt; Note: For using monitor mode = & gt; if mesh interface is ON, please down the mesh interface first.
iwconfig ra0 freq N.NNNN[k|M|G]] ; set frequency
iwconfig ra0 channel N ; set channel
iwconfig ra0 ap {N|off|auto} ; set AP address
iwconfig ra0 nick N ; set nickname
iwconfig ra0 rate {N|auto|fixed} ; set rate (only support legacy rate setting)
iwconfig ra0 rts {N|auto|fixed|off} ; set RTS threshold
iwconfig ra0 frag {N|auto|fixed|off} ; set Fragment threshold
iwconfig ra0 enc {NNNN-NNNN|off} ; set encryption type
iwconfig ra0 power {period N|timeout N} ; set power management modes
*** Wireless extension usage please refer to man page of 'iwconfig', 'iwlist' and 'iwpriv'. ***
/*
*************************************************************************
* Ralink Tech Inc.
* 5F., No.36, Taiyuan St., Jhubei City,
* Hsinchu County 302,
* Taiwan, R.O.C.
*
* (c) Copyright 2002-2010, Ralink Technology, Inc.
*
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*************************************************************************/
#ifndef __CRYPT_AES_H__
#define __CRYPT_AES_H__
#include " rt_config.h "
/*
//#undef SWAP32
//#define SWAP32(x) \
// ((unsigned long)( \
// (((unsigned long)(x) & (unsigned long) 0x000000ffUL) & lt; & lt; 24) | \
// (((unsigned long)(x) & (unsigned long) 0x0000ff00UL) & lt; & lt; 8) | \
// (((unsigned long)(x) & (unsigned long) 0x00ff0000UL) & gt; & gt; 8) | \
// (((unsigned long)(x) & (unsigned long) 0xff000000UL) & gt; & gt; 24) ))
*/
#define GETU32(p) cpu2be32(get_unaligned((u32 *) (p)))
#define PUTU32(ct, st) put_unaligned(cpu2be32(st), (u32*)(ct)) //{ *((u32 *)(ct)) = cpu2be32((st)); }
#define AES_ENCRYPT 1
#define AES_DECRYPT 0
/* Because array size can't be a const in C, the following two are macros.
Both sizes are in bytes. */
#define AES_MAXNR 14
#define AES_BLOCK_SIZE 16
/* This should be a hidden type, but EVP requires that the size be known */
struct aes_key_st {
#ifdef AES_LONG
unsigned long rd_key[4 *(AES_MAXNR + 1)];
#else
unsigned int rd_key[4 *(AES_MAXNR + 1)];
#endif
int rounds;
};
typedef struct aes_key_st AES_KEY;
typedef struct _EVP_CIPHER_CTX_ {
unsigned long flag;
unsigned long type;
unsigned long encrypt; //1: Encrypt 0: Decrypt,
unsigned char key[16];
unsigned char iv[8 + 16];
unsigned long bufferlen;
unsigned char buffer[AES_BLOCK_SIZE];
AES_KEY aesKey;
} EVP_CIPHER_CTX, *PEVP_CIPHER_CTX;
void evp_aes_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key);
void evp_aes_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key);
int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);
int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);
int EVP_aes_128_cbc(void);
int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, int type, unsigned char *key, unsigned char *iv);
int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *outbuf, int *outlen, unsigned char *inbuf, int inlen);
int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outbuf, int *outlen);
int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, int type, unsigned char *key, unsigned char *iv);
int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *outbuf, int *outlen, unsigned char *inbuf, int inlen);
int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outbuf, int *outlen);
void evp_aes_cbc_encrypt(const unsigned char *in, unsigned char *out,
const unsigned long length, const AES_KEY *key,
unsigned char *ivec, const int enc);
void WscEncryptData(
unsigned char *plainText, int ptx_len,
unsigned char *key, unsigned char *iv,
unsigned char *cipherText, int *ctx_len);
void WscDecryptData(
unsigned char *cipherText, int ctx_len,
unsigned char *key, unsigned char *iv,
unsigned char *plainText, int *ptx_len);
#define AES_CBC_Encrypt(Plain, PlainL, Key, KeyL, IV, IVL, Cipher, CipherL) \
WscEncryptData((Plain), (PlainL), (Key), (IV), (Cipher), (int *) (CipherL));
#define AES_CBC_Decrypt(Cipher, CipherL, Key, KeyL, IV, IVL, Plain, PlainL) \
WscDecryptData((Cipher), (CipherL), (Key), (IV), (Plain), (int *) (PlainL));
typedef struct
{
uint32 erk[64]; /* encryption round keys */
uint32 drk[64]; /* decryption round keys */
int nr; /* number of rounds */
}
aes_context;
int rtmp_aes_set_key( aes_context *ctx, uint8 *key, int nbits );
void rtmp_aes_encrypt( aes_context *ctx, uint8 input[16], uint8 output[16] );
void rtmp_aes_decrypt( aes_context *ctx, uint8 input[16], uint8 output[16] );
VOID AES_GTK_KEY_WRAP(
IN UCHAR *key,
IN UCHAR *plaintext,
IN UINT p_len,
OUT UCHAR *ciphertext,
OUT UINT *c_len);
VOID AES_GTK_KEY_UNWRAP(
IN UCHAR *key,
OUT UCHAR *plaintext,
OUT UINT *p_len,
IN UCHAR *ciphertext,
IN UINT c_len);
#define AES_Key_Wrap(Plain, PlainL, Key, KeyL, Cipher, CipherL) \
AES_GTK_KEY_WRAP((Key), (Plain), (PlainL), (Cipher), (CipherL))
#define AES_Key_Unwrap(Cipher, CipherL, Key, KeyL, Plain, PlainL) \
AES_GTK_KEY_UNWRAP((Key), (Plain), (PlainL), (Cipher), (CipherL))
/* AES definition & structure */
#define AES_STATE_ROWS 4 /* Block size: 4*4*8 = 128 bits */
#define AES_STATE_COLUMNS 4
#define AES_BLOCK_SIZES AES_STATE_ROWS*AES_STATE_COLUMNS
#define AES_KEY_ROWS 4
#define AES_KEY_COLUMNS 8 /*Key length: 4*{4,6,8}*8 = 128, 192, 256 bits */
#define AES_KEY128_LENGTH 16
#define AES_KEY192_LENGTH 24
#define AES_KEY256_LENGTH 32
#define AES_CBC_IV_LENGTH 16
typedef struct {
UINT8 State[AES_STATE_ROWS][AES_STATE_COLUMNS];
UINT8 KeyWordExpansion[AES_KEY_ROWS][AES_KEY_ROWS*((AES_KEY256_LENGTH & gt; & gt; 2) + 6 + 1)];
} AES_CTX_STRUC, *PAES_CTX_STRUC;
/* AES operations */
VOID RT_AES_KeyExpansion (
IN UINT8 Key[],
IN UINT KeyLength,
INOUT AES_CTX_STRUC *paes_ctx);
VOID RT_AES_Encrypt (
IN UINT8 PlainBlock[],
IN UINT PlainBlockSize,
IN UINT8 Key[],
IN UINT KeyLength,
OUT UINT8 CipherBlock[],
INOUT UINT *CipherBlockSize);
VOID RT_AES_Decrypt (
IN UINT8 CipherBlock[],
IN UINT CipherBlockSize,
IN UINT8 Key[],
IN UINT KeyLength,
OUT UINT8 PlainBlock[],
INOUT UINT *PlainBlockSize);
/* AES Counter with CBC-MAC operations */
VOID AES_CCM_MAC (
IN UINT8 Payload[],
IN UINT PayloadLength,
IN UINT8 Key[],
IN UINT KeyLength,
IN UINT8 Nonce[],
IN UINT NonceLength,
IN UINT8 AAD[],
IN UINT AADLength,
IN UINT MACLength,
OUT UINT8 MACText[]);
INT AES_CCM_Encrypt (
IN UINT8 PlainText[],
IN UINT PlainTextLength,
IN UINT8 Key[],
IN UINT KeyLength,
IN UINT8 Nonce[],
IN UINT NonceLength,
IN UINT8 AAD[],
IN UINT AADLength,
IN UINT MACLength,
OUT UINT8 CipherText[],
INOUT UINT *CipherTextLength);
INT AES_CCM_Decrypt (
IN UINT8 CipherText[],
IN UINT CipherTextLength,
IN UINT8 Key[],
IN UINT KeyLength,
IN UINT8 Nonce[],
IN UINT NonceLength,
IN UINT8 AAD[],
IN UINT AADLength,
IN UINT MACLength,
OUT UINT8 PlainText[],
INOUT UINT *PlainTextLength);
/* AES-CMAC operations */
VOID AES_CMAC_GenerateSubKey (
IN UINT8 Key[],
IN UINT KeyLength,
OUT UINT8 SubKey1[],
OUT UINT8 SubKey2[]);
VOID AES_CMAC (
IN UINT8 PlainText[],
IN UINT PlainTextLength,
IN UINT8 Key[],
IN UINT KeyLength,
OUT UINT8 MACText[],
INOUT UINT *MACTextLength);
#endif /* __CRYPT_AES_H__ */
/*
*************************************************************************
* Ralink Tech Inc.
* 5F., No.36, Taiyuan St., Jhubei City,
* Hsinchu County 302,
* Taiwan, R.O.C.
*
* (c) Copyright 2002-2010, Ralink Technology, Inc.
*
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*************************************************************************/
#ifndef __RTMP_H__
#define __RTMP_H__
#include " link_list.h "
#include " spectrum_def.h "
#include " rtmp_dot11.h "
#include " wpa_cmm.h "
#ifdef CONFIG_STA_SUPPORT
#endif // CONFIG_STA_SUPPORT //
#include " wsc.h "
#include " rtmp_chip.h "
#ifdef CLIENT_WDS
#include " client_wds_cmm.h "
#endif // CLIENT_WDS //
#include " misc_cmm.h "
typedef struct _RTMP_ADAPTER RTMP_ADAPTER;
typedef struct _RTMP_ADAPTER *PRTMP_ADAPTER;
typedef struct _RTMP_CHIP_OP_ RTMP_CHIP_OP;
//#define DBG 1
//#define DBG_DIAGNOSE 1
//+++Add by shiang for merge MiniportMMRequest() and MiniportDataMMRequest() into one function
#define MAX_DATAMM_RETRY 3
#define MGMT_USE_QUEUE_FLAG 0x80
//---Add by shiang for merge MiniportMMRequest() and MiniportDataMMRequest() into one function
#define MAXSEQ (0xFFF)
#define MAX_MCS_SET 16 /* From MCS 0 ~ MCS 15 */
#if defined(CONFIG_AP_SUPPORT) & & defined(CONFIG_STA_SUPPORT)
#define IF_DEV_CONFIG_OPMODE_ON_AP(_pAd) if(_pAd- & gt; OpMode == OPMODE_AP)
#define IF_DEV_CONFIG_OPMODE_ON_STA(_pAd) if(_pAd- & gt; OpMode == OPMODE_STA)
#else
#define IF_DEV_CONFIG_OPMODE_ON_AP(_pAd)
#define IF_DEV_CONFIG_OPMODE_ON_STA(_pAd)
#endif
#define MAX_TXPOWER_ARRAY_SIZE 5
extern unsigned char CISCO_OUI[];
extern UCHAR BaSizeArray[4];
extern UCHAR BROADCAST_ADDR[MAC_ADDR_LEN];
extern UCHAR ZERO_MAC_ADDR[MAC_ADDR_LEN];
extern ULONG BIT32[32];
extern UCHAR BIT8[8];
extern char* CipherName[];
extern UCHAR RxwiMCSToOfdmRate[12];
extern UCHAR SNAP_802_1H[6];
extern UCHAR SNAP_BRIDGE_TUNNEL[6];
extern UCHAR EAPOL[2];
extern UCHAR IPX[2];
extern UCHAR TPID[];
extern UCHAR APPLE_TALK[2];
extern UCHAR OfdmRateToRxwiMCS[];
extern UCHAR MapUserPriorityToAccessCategory[8];
extern USHORT RateUpPER[];
extern USHORT RateDownPER[];
extern UCHAR Phy11BNextRateDownward[];
extern UCHAR Phy11BNextRateUpward[];
extern UCHAR Phy11BGNextRateDownward[];
extern UCHAR Phy11BGNextRateUpward[];
extern UCHAR Phy11ANextRateDownward[];
extern UCHAR Phy11ANextRateUpward[];
extern unsigned char RateIdToMbps[];
extern USHORT RateIdTo500Kbps[];
extern UCHAR CipherSuiteWpaNoneTkip[];
extern UCHAR CipherSuiteWpaNoneTkipLen;
extern UCHAR CipherSuiteWpaNoneAes[];
extern UCHAR CipherSuiteWpaNoneAesLen;
extern UCHAR SsidIe;
extern UCHAR SupRateIe;
extern UCHAR ExtRateIe;
#ifdef DOT11_N_SUPPORT
extern UCHAR HtCapIe;
extern UCHAR AddHtInfoIe;
extern UCHAR NewExtChanIe;
extern UCHAR BssCoexistIe;
extern UCHAR ExtHtCapIe;
#endif // DOT11_N_SUPPORT //
extern UCHAR ExtCapIe;
extern UCHAR ErpIe;
extern UCHAR DsIe;
extern UCHAR TimIe;
extern UCHAR WpaIe;
extern UCHAR Wpa2Ie;
extern UCHAR IbssIe;
extern UCHAR WapiIe;
extern UCHAR WPA_OUI[];
extern UCHAR RSN_OUI[];
extern UCHAR WAPI_OUI[];
extern UCHAR WME_INFO_ELEM[];
extern UCHAR WME_PARM_ELEM[];
extern UCHAR RALINK_OUI[];
extern UCHAR PowerConstraintIE[];
extern UCHAR RateSwitchTable[];
extern UCHAR RateSwitchTable11B[];
extern UCHAR RateSwitchTable11G[];
extern UCHAR RateSwitchTable11BG[];
#ifdef DOT11_N_SUPPORT
extern UCHAR RateSwitchTable11BGN1S[];
extern UCHAR RateSwitchTable11BGN2S[];
extern UCHAR RateSwitchTable11BGN2SForABand[];
extern UCHAR RateSwitchTable11N1S[];
extern UCHAR RateSwitchTable11N2S[];
extern UCHAR RateSwitchTable11N3S[];
extern UCHAR RateSwitchTable11N3SReplacement[];
extern UCHAR RateSwitchTable11N2SForABand[];
extern UCHAR RateSwitchTable11BGN3S[];
extern UCHAR RateSwitchTable11BGN3SForABand[];
#ifdef CONFIG_STA_SUPPORT
extern UCHAR PRE_N_HT_OUI[];
#endif // CONFIG_STA_SUPPORT //
#endif // DOT11_N_SUPPORT //
#ifdef RALINK_ATE
typedef struct _ATE_INFO {
UCHAR Mode;
BOOLEAN PassiveMode;
CHAR TxPower0;
CHAR TxPower1;
CHAR TxAntennaSel;
CHAR RxAntennaSel;
TXWI_STRUC TxWI; // TXWI
USHORT QID;
UCHAR Addr1[MAC_ADDR_LEN];
UCHAR Addr2[MAC_ADDR_LEN];
UCHAR Addr3[MAC_ADDR_LEN];
UCHAR Channel;
UCHAR Payload; // Payload pattern
UINT32 TxLength;
UINT32 TxCount;
UINT32 TxDoneCount; // Tx DMA Done
UINT32 RFFreqOffset;
UINT32 IPG;
BOOLEAN bRxFER; // Show Rx Frame Error Rate
BOOLEAN bQATxStart; // Have compiled QA in and use it to ATE tx.
BOOLEAN bQARxStart; // Have compiled QA in and use it to ATE rx.
BOOLEAN bAutoTxAlc; // Set Auto Tx Alc
#ifdef RTMP_MAC_PCI
BOOLEAN bFWLoading; // Reload firmware when ATE is done.
#endif // RTMP_MAC_PCI //
UINT32 RxTotalCnt;
UINT32 RxCntPerSec;
CHAR LastSNR0; // last received SNR
CHAR LastSNR1; // last received SNR for 2nd antenna
CHAR LastRssi0; // last received RSSI
CHAR LastRssi1; // last received RSSI for 2nd antenna
CHAR LastRssi2; // last received RSSI for 3rd antenna
CHAR AvgRssi0; // last 8 frames' average RSSI
CHAR AvgRssi1; // last 8 frames' average RSSI
CHAR AvgRssi2; // last 8 frames' average RSSI
SHORT AvgRssi0X8; // sum of last 8 frames' RSSI
SHORT AvgRssi1X8; // sum of last 8 frames' RSSI
SHORT AvgRssi2X8; // sum of last 8 frames' RSSI
UINT32 NumOfAvgRssiSample;
#ifdef RALINK_QA
// Tx frame
USHORT HLen; // Header Length
USHORT PLen; // Pattern Length
UCHAR Header[32]; // Header buffer
UCHAR Pattern[32]; // Pattern buffer
USHORT DLen; // Data Length
USHORT seq;
UINT32 CID;
RTMP_OS_PID AtePid;
// counters
UINT32 U2M;
UINT32 OtherData;
UINT32 Beacon;
UINT32 OtherCount;
UINT32 TxAc0;
UINT32 TxAc1;
UINT32 TxAc2;
UINT32 TxAc3;
UINT32 TxHCCA;
UINT32 TxMgmt;
UINT32 RSSI0;
UINT32 RSSI1;
UINT32 RSSI2;
UINT32 SNR0;
UINT32 SNR1;
// TxStatus : 0 -- & gt; task is idle, 1 -- & gt; task is running
UCHAR TxStatus;
#endif // RALINK_QA //
} ATE_INFO, *PATE_INFO;
#ifdef RALINK_QA
struct ate_racfghdr {
UINT32 magic_no;
USHORT command_type;
USHORT command_id;
USHORT length;
USHORT sequence;
USHORT status;
UCHAR data[2046];
} __attribute__((packed));
#endif // RALINK_QA //
#endif // RALINK_ATE //
typedef struct _RSSI_SAMPLE {
CHAR LastRssi0; // last received RSSI
CHAR LastRssi1; // last received RSSI
CHAR LastRssi2; // last received RSSI
CHAR AvgRssi0;
CHAR AvgRssi1;
CHAR AvgRssi2;
SHORT AvgRssi0X8;
SHORT AvgRssi1X8;
SHORT AvgRssi2X8;
CHAR LastSnr0;
CHAR LastSnr1;
CHAR LastSnr2;
CHAR AvgSnr0;
CHAR AvgSnr1;
CHAR AvgSnr2;
SHORT AvgSnr0X8;
SHORT AvgSnr1X8;
SHORT AvgSnr2X8;
CHAR LastNoiseLevel0;
CHAR LastNoiseLevel1;
CHAR LastNoiseLevel2;
} RSSI_SAMPLE;
//
// Queue structure and macros
//
#define InitializeQueueHeader(QueueHeader) \
{ \
(QueueHeader)- & gt; Head = (QueueHeader)- & gt; Tail = NULL; \
(QueueHeader)- & gt; Number = 0; \
}
#define RemoveHeadQueue(QueueHeader) \
(QueueHeader)- & gt; Head; \
{ \
PQUEUE_ENTRY pNext; \
if ((QueueHeader)- & gt; Head != NULL) \
{ \
pNext = (QueueHeader)- & gt; Head- & gt; Next; \
(QueueHeader)- & gt; Head- & gt; Next = NULL; \
(QueueHeader)- & gt; Head = pNext; \
if (pNext == NULL) \
(QueueHeader)- & gt; Tail = NULL; \
(QueueHeader)- & gt; Number--; \
} \
}
#define InsertHeadQueue(QueueHeader, QueueEntry) \
{ \
((PQUEUE_ENTRY)QueueEntry)- & gt; Next = (QueueHeader)- & gt; Head; \
(QueueHeader)- & gt; Head = (PQUEUE_ENTRY)(QueueEntry); \
if ((QueueHeader)- & gt; Tail == NULL) \
(QueueHeader)- & gt; Tail = (PQUEUE_ENTRY)(QueueEntry); \
(QueueHeader)- & gt; Number++; \
}
#define InsertTailQueue(QueueHeader, QueueEntry) \
{ \
((PQUEUE_ENTRY)QueueEntry)- & gt; Next = NULL; \
if ((QueueHeader)- & gt; Tail) \
(QueueHeader)- & gt; Tail- & gt; Next = (PQUEUE_ENTRY)(QueueEntry); \
else \
(QueueHeader)- & gt; Head = (PQUEUE_ENTRY)(QueueEntry); \
(QueueHeader)- & gt; Tail = (PQUEUE_ENTRY)(QueueEntry); \
(QueueHeader)- & gt; Number++; \
}
#define InsertTailQueueAc(pAd, pEntry, QueueHeader, QueueEntry) \
{ \
((PQUEUE_ENTRY)QueueEntry)- & gt; Next = NULL; \
if ((QueueHeader)- & gt; Tail) \
(QueueHeader)- & gt; Tail- & gt; Next = (PQUEUE_ENTRY)(QueueEntry); \
else \
(QueueHeader)- & gt; Head = (PQUEUE_ENTRY)(QueueEntry); \
(QueueHeader)- & gt; Tail = (PQUEUE_ENTRY)(QueueEntry); \
(QueueHeader)- & gt; Number++; \
}
//
// Macros for flag and ref count operations
//
#define RTMP_SET_FLAG(_M, _F) ((_M)- & gt; Flags |= (_F))
#define RTMP_CLEAR_FLAG(_M, _F) ((_M)- & gt; Flags & = ~(_F))
#define RTMP_CLEAR_FLAGS(_M) ((_M)- & gt; Flags = 0)
#define RTMP_TEST_FLAG(_M, _F) (((_M)- & gt; Flags & (_F)) != 0)
#define RTMP_TEST_FLAGS(_M, _F) (((_M)- & gt; Flags & (_F)) == (_F))
// Macro for power save flag.
#define RTMP_SET_PSFLAG(_M, _F) ((_M)- & gt; PSFlags |= (_F))
#define RTMP_CLEAR_PSFLAG(_M, _F) ((_M)- & gt; PSFlags & = ~(_F))
#define RTMP_CLEAR_PSFLAGS(_M) ((_M)- & gt; PSFlags = 0)
#define RTMP_TEST_PSFLAG(_M, _F) (((_M)- & gt; PSFlags & (_F)) != 0)
#define RTMP_TEST_PSFLAGS(_M, _F) (((_M)- & gt; PSFlags & (_F)) == (_F))
#define OPSTATUS_SET_FLAG(_pAd, _F) ((_pAd)- & gt; CommonCfg.OpStatusFlags |= (_F))
#define OPSTATUS_CLEAR_FLAG(_pAd, _F) ((_pAd)- & gt; CommonCfg.OpStatusFlags & = ~(_F))
#define OPSTATUS_TEST_FLAG(_pAd, _F) (((_pAd)- & gt; CommonCfg.OpStatusFlags & (_F)) != 0)
#define CLIENT_STATUS_SET_FLAG(_pEntry,_F) ((_pEntry)- & gt; ClientStatusFlags |= (_F))
#define CLIENT_STATUS_CLEAR_FLAG(_pEntry,_F) ((_pEntry)- & gt; ClientStatusFlags & = ~(_F))
#define CLIENT_STATUS_TEST_FLAG(_pEntry,_F) (((_pEntry)- & gt; ClientStatusFlags & (_F)) != 0)
#define RX_FILTER_SET_FLAG(_pAd, _F) ((_pAd)- & gt; CommonCfg.PacketFilter |= (_F))
#define RX_FILTER_CLEAR_FLAG(_pAd, _F) ((_pAd)- & gt; CommonCfg.PacketFilter & = ~(_F))
#define RX_FILTER_TEST_FLAG(_pAd, _F) (((_pAd)- & gt; CommonCfg.PacketFilter & (_F)) != 0)
#define RTMP_SET_MORE_FLAG(_M, _F) ((_M)- & gt; MoreFlags |= (_F))
#define RTMP_TEST_MORE_FLAG(_M, _F) (((_M)- & gt; MoreFlags & (_F)) != 0)
#define RTMP_CLEAR_MORE_FLAG(_M, _F) ((_M)- & gt; MoreFlags & = ~(_F))
#ifdef CONFIG_STA_SUPPORT
#define STA_NO_SECURITY_ON(_p) (_p- & gt; StaCfg.WepStatus == Ndis802_11EncryptionDisabled)
#define STA_WEP_ON(_p) (_p- & gt; StaCfg.WepStatus == Ndis802_11Encryption1Enabled)
#define STA_TKIP_ON(_p) (_p- & gt; StaCfg.WepStatus == Ndis802_11Encryption2Enabled)
#define STA_AES_ON(_p) (_p- & gt; StaCfg.WepStatus == Ndis802_11Encryption3Enabled)
#define STA_TGN_WIFI_ON(_p) (_p- & gt; StaCfg.bTGnWifiTest == TRUE)
#endif // CONFIG_STA_SUPPORT //
#define CKIP_KP_ON(_p) ((((_p)- & gt; StaCfg.CkipFlag) & 0x10) & & ((_p)- & gt; StaCfg.bCkipCmicOn == TRUE))
#define CKIP_CMIC_ON(_p) ((((_p)- & gt; StaCfg.CkipFlag) & 0x08) & & ((_p)- & gt; StaCfg.bCkipCmicOn == TRUE))
#define INC_RING_INDEX(_idx, _RingSize) \
{ \
(_idx) = (_idx+1) % (_RingSize); \
}
#ifdef DOT11_N_SUPPORT
// StaActive.SupportedHtPhy.MCSSet is copied from AP beacon. Don't need to update here.
#define COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(_pAd) \
{ \
_pAd- & gt; StaActive.SupportedHtPhy.ChannelWidth = _pAd- & gt; MlmeAux.HtCapability.HtCapInfo.ChannelWidth; \
_pAd- & gt; StaActive.SupportedHtPhy.MimoPs = _pAd- & gt; MlmeAux.HtCapability.HtCapInfo.MimoPs; \
_pAd- & gt; StaActive.SupportedHtPhy.GF = _pAd- & gt; MlmeAux.HtCapability.HtCapInfo.GF; \
_pAd- & gt; StaActive.SupportedHtPhy.ShortGIfor20 = _pAd- & gt; MlmeAux.HtCapability.HtCapInfo.ShortGIfor20; \
_pAd- & gt; StaActive.SupportedHtPhy.ShortGIfor40 = _pAd- & gt; MlmeAux.HtCapability.HtCapInfo.ShortGIfor40; \
_pAd- & gt; StaActive.SupportedHtPhy.TxSTBC = _pAd- & gt; MlmeAux.HtCapability.HtCapInfo.TxSTBC; \
_pAd- & gt; StaActive.SupportedHtPhy.RxSTBC = _pAd- & gt; MlmeAux.HtCapability.HtCapInfo.RxSTBC; \
_pAd- & gt; StaActive.SupportedHtPhy.ExtChanOffset = _pAd- & gt; MlmeAux.AddHtInfo.AddHtInfo.ExtChanOffset; \
_pAd- & gt; StaActive.SupportedHtPhy.RecomWidth = _pAd- & gt; MlmeAux.AddHtInfo.AddHtInfo.RecomWidth; \
_pAd- & gt; StaActive.SupportedHtPhy.OperaionMode = _pAd- & gt; MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode; \
_pAd- & gt; StaActive.SupportedHtPhy.NonGfPresent = _pAd- & gt; MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent; \
NdisMoveMemory((_pAd)- & gt; MacTab.Content[BSSID_WCID].HTCapability.MCSSet, (_pAd)- & gt; StaActive.SupportedPhyInfo.MCSSet, sizeof(UCHAR) * 16);\
}
#define COPY_AP_HTSETTINGS_FROM_BEACON(_pAd, _pHtCapability) \
{ \
_pAd- & gt; MacTab.Content[BSSID_WCID].AMsduSize = (UCHAR)(_pHtCapability- & gt; HtCapInfo.AMsduSize); \
_pAd- & gt; MacTab.Content[BSSID_WCID].MmpsMode= (UCHAR)(_pHtCapability- & gt; HtCapInfo.MimoPs); \
_pAd- & gt; MacTab.Content[BSSID_WCID].MaxRAmpduFactor = (UCHAR)(_pHtCapability- & gt; HtCapParm.MaxRAmpduFactor); \
}
#endif // DOT11_N_SUPPORT //
//
// MACRO for 32-bit PCI register read / write
//
// Usage : RTMP_IO_READ32(
// PRTMP_ADAPTER pAd,
// ULONG Register_Offset,
// PULONG pValue)
//
// RTMP_IO_WRITE32(
// PRTMP_ADAPTER pAd,
// ULONG Register_Offset,
// ULONG Value)
//
//
// Common fragment list structure - Identical to the scatter gather frag list structure
//
//#define RTMP_SCATTER_GATHER_ELEMENT SCATTER_GATHER_ELEMENT
//#define PRTMP_SCATTER_GATHER_ELEMENT PSCATTER_GATHER_ELEMENT
#define NIC_MAX_PHYS_BUF_COUNT 8
typedef struct _RTMP_SCATTER_GATHER_ELEMENT {
PVOID Address;
ULONG Length;
PULONG Reserved;
} RTMP_SCATTER_GATHER_ELEMENT, *PRTMP_SCATTER_GATHER_ELEMENT;
typedef struct _RTMP_SCATTER_GATHER_LIST {
ULONG NumberOfElements;
PULONG Reserved;
RTMP_SCATTER_GATHER_ELEMENT Elements[NIC_MAX_PHYS_BUF_COUNT];
} RTMP_SCATTER_GATHER_LIST, *PRTMP_SCATTER_GATHER_LIST;
//
// Some utility macros
//
#ifndef min
#define min(_a, _b) (((_a) & lt; (_b)) ? (_a) : (_b))
#endif
#ifndef max
#define max(_a, _b) (((_a) & gt; (_b)) ? (_a) : (_b))
#endif
#define GET_LNA_GAIN(_pAd) ((_pAd- & gt; LatchRfRegs.Channel & lt; = 14) ? (_pAd- & gt; BLNAGain) : ((_pAd- & gt; LatchRfRegs.Channel & lt; = 64) ? (_pAd- & gt; ALNAGain0) : ((_pAd- & gt; LatchRfRegs.Channel & lt; = 128) ? (_pAd- & gt; ALNAGain1) : (_pAd- & gt; ALNAGain2))))
#define INC_COUNTER64(Val) (Val.QuadPart++)
#define INFRA_ON(_p) (OPSTATUS_TEST_FLAG(_p, fOP_STATUS_INFRA_ON))
#define ADHOC_ON(_p) (OPSTATUS_TEST_FLAG(_p, fOP_STATUS_ADHOC_ON))
#define MONITOR_ON(_p) (((_p)- & gt; StaCfg.BssType) == BSS_MONITOR)
#define IDLE_ON(_p) (!INFRA_ON(_p) & & !ADHOC_ON(_p))
// Check LEAP & CCKM flags
#define LEAP_ON(_p) (((_p)- & gt; StaCfg.LeapAuthMode) == CISCO_AuthModeLEAP)
#define LEAP_CCKM_ON(_p) ((((_p)- & gt; StaCfg.LeapAuthMode) == CISCO_AuthModeLEAP) & & ((_p)- & gt; StaCfg.LeapAuthInfo.CCKM == TRUE))
// if orginal Ethernet frame contains no LLC/SNAP, then an extra LLC/SNAP encap is required
#define EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(_pBufVA, _pExtraLlcSnapEncap) \
{ \
if (((*(_pBufVA + 12) & lt; & lt; 8) + *(_pBufVA + 13)) & gt; 1500) \
{ \
_pExtraLlcSnapEncap = SNAP_802_1H; \
if (NdisEqualMemory(IPX, _pBufVA + 12, 2) || \
NdisEqualMemory(APPLE_TALK, _pBufVA + 12, 2)) \
{ \
_pExtraLlcSnapEncap = SNAP_BRIDGE_TUNNEL; \
} \
} \
else \
{ \
_pExtraLlcSnapEncap = NULL; \
} \
}
// New Define for new Tx Path.
#define EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(_pBufVA, _pExtraLlcSnapEncap) \
{ \
if (((*(_pBufVA) & lt; & lt; 8) + *(_pBufVA + 1)) & gt; 1500) \
{ \
_pExtraLlcSnapEncap = SNAP_802_1H; \
if (NdisEqualMemory(IPX, _pBufVA, 2) || \
NdisEqualMemory(APPLE_TALK, _pBufVA, 2)) \
{ \
_pExtraLlcSnapEncap = SNAP_BRIDGE_TUNNEL; \
} \
} \
else \
{ \
_pExtraLlcSnapEncap = NULL; \
} \
}
#define MAKE_802_3_HEADER(_p, _pMac1, _pMac2, _pType) \
{ \
NdisMoveMemory(_p, _pMac1, MAC_ADDR_LEN); \
NdisMoveMemory((_p + MAC_ADDR_LEN), _pMac2, MAC_ADDR_LEN); \
NdisMoveMemory((_p + MAC_ADDR_LEN * 2), _pType, LENGTH_802_3_TYPE); \
}
// if pData has no LLC/SNAP (neither RFC1042 nor Bridge tunnel), keep it that way.
// else if the received frame is LLC/SNAP-encaped IPX or APPLETALK, preserve the LLC/SNAP field
// else remove the LLC/SNAP field from the result Ethernet frame
// Patch for WHQL only, which did not turn on Netbios but use IPX within its payload
// Note:
// _pData & _DataSize may be altered (remove 8-byte LLC/SNAP) by this MACRO
// _pRemovedLLCSNAP: pointer to removed LLC/SNAP; NULL is not removed
#define CONVERT_TO_802_3(_p8023hdr, _pDA, _pSA, _pData, _DataSize, _pRemovedLLCSNAP) \
{ \
char LLC_Len[2]; \
\
_pRemovedLLCSNAP = NULL; \
if (NdisEqualMemory(SNAP_802_1H, _pData, 6) || \
NdisEqualMemory(SNAP_BRIDGE_TUNNEL, _pData, 6)) \
{ \
PUCHAR pProto = _pData + 6; \
\
if ((NdisEqualMemory(IPX, pProto, 2) || NdisEqualMemory(APPLE_TALK, pProto, 2)) & & \
NdisEqualMemory(SNAP_802_1H, _pData, 6)) \
{ \
LLC_Len[0] = (UCHAR)(_DataSize & gt; & gt; 8); \
LLC_Len[1] = (UCHAR)(_DataSize & (256 - 1)); \
MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, LLC_Len); \
} \
else \
{ \
MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, pProto); \
_pRemovedLLCSNAP = _pData; \
_DataSize -= LENGTH_802_1_H; \
_pData += LENGTH_802_1_H; \
} \
} \
else \
{ \
LLC_Len[0] = (UCHAR)(_DataSize & gt; & gt; 8); \
LLC_Len[1] = (UCHAR)(_DataSize & (256 - 1)); \
MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, LLC_Len); \
} \
}
// Enqueue this frame to MLME engine
// We need to enqueue the whole frame because MLME need to pass data type
// information from 802.11 header
#ifdef RTMP_MAC_PCI
#define REPORT_MGMT_FRAME_TO_MLME(_pAd, Wcid, _pFrame, _FrameSize, _Rssi0, _Rssi1, _Rssi2, _MinSNR) \
{ \
UINT32 High32TSF, Low32TSF; \
RTMP_IO_READ32(_pAd, TSF_TIMER_DW1, & High32TSF); \
RTMP_IO_READ32(_pAd, TSF_TIMER_DW0, & Low32TSF); \
MlmeEnqueueForRecv(_pAd, Wcid, High32TSF, Low32TSF, (UCHAR)_Rssi0, (UCHAR)_Rssi1,(UCHAR)_Rssi2,_FrameSize, _pFrame, (UCHAR)_MinSNR); \
}
#endif // RTMP_MAC_PCI //
#define MAC_ADDR_EQUAL(pAddr1,pAddr2) RTMPEqualMemory((PVOID)(pAddr1), (PVOID)(pAddr2), MAC_ADDR_LEN)
#define SSID_EQUAL(ssid1, len1, ssid2, len2) ((len1==len2) & & (RTMPEqualMemory(ssid1, ssid2, len1)))
//
// Check if it is Japan W53(ch52,56,60,64) channel.
//
#define JapanChannelCheck(channel) ((channel == 52) || (channel == 56) || (channel == 60) || (channel == 64))
#ifdef CONFIG_STA_SUPPORT
#define STA_EXTRA_SETTING(_pAd)
#define STA_PORT_SECURED(_pAd) \
{ \
BOOLEAN Cancelled; \
(_pAd)- & gt; StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; \
RTMP_IndicateMediaState(_pAd, NdisMediaStateConnected); \
NdisAcquireSpinLock( & ((_pAd)- & gt; MacTabLock)); \
(_pAd)- & gt; MacTab.Content[BSSID_WCID].PortSecured = (_pAd)- & gt; StaCfg.PortSecured; \
(_pAd)- & gt; MacTab.Content[BSSID_WCID].PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\
NdisReleaseSpinLock( & (_pAd)- & gt; MacTabLock); \
RTMPCancelTimer( & ((_pAd)- & gt; Mlme.LinkDownTimer), & Cancelled);\
STA_EXTRA_SETTING(_pAd); \
}
#endif // CONFIG_STA_SUPPORT //
//
// Data buffer for DMA operation, the buffer must be contiguous physical memory
// Both DMA to / from CPU use the same structure.
//
typedef struct _RTMP_DMABUF
{
ULONG AllocSize;
PVOID AllocVa; // TxBuf virtual address
NDIS_PHYSICAL_ADDRESS AllocPa; // TxBuf physical address
} RTMP_DMABUF, *PRTMP_DMABUF;
//
// Control block (Descriptor) for all ring descriptor DMA operation, buffer must be
// contiguous physical memory. NDIS_PACKET stored the binding Rx packet descriptor
// which won't be released, driver has to wait until upper layer return the packet
// before giveing up this rx ring descriptor to ASIC. NDIS_BUFFER is assocaited pair
// to describe the packet buffer. For Tx, NDIS_PACKET stored the tx packet descriptor
// which driver should ACK upper layer when the tx is physically done or failed.
//
typedef struct _RTMP_DMACB
{
ULONG AllocSize; // Control block size
PVOID AllocVa; // Control block virtual address
NDIS_PHYSICAL_ADDRESS AllocPa; // Control block physical address
PNDIS_PACKET pNdisPacket;
PNDIS_PACKET pNextNdisPacket;
RTMP_DMABUF DmaBuf; // Associated DMA buffer structure
} RTMP_DMACB, *PRTMP_DMACB;
typedef struct _RTMP_TX_RING
{
RTMP_DMACB Cell[TX_RING_SIZE];
UINT32 TxCpuIdx;
UINT32 TxDmaIdx;
UINT32 TxSwFreeIdx; // software next free tx index
} RTMP_TX_RING, *PRTMP_TX_RING;
typedef struct _RTMP_RX_RING
{
RTMP_DMACB Cell[RX_RING_SIZE];
UINT32 RxCpuIdx;
UINT32 RxDmaIdx;
INT32 RxSwReadIdx; // software next read index
} RTMP_RX_RING, *PRTMP_RX_RING;
typedef struct _RTMP_MGMT_RING
{
RTMP_DMACB Cell[MGMT_RING_SIZE];
UINT32 TxCpuIdx;
UINT32 TxDmaIdx;
UINT32 TxSwFreeIdx; // software next free tx index
} RTMP_MGMT_RING, *PRTMP_MGMT_RING;
//
// Statistic counter structure
//
typedef struct _COUNTER_802_3
{
// General Stats
ULONG GoodTransmits;
ULONG GoodReceives;
ULONG TxErrors;
ULONG RxErrors;
ULONG RxNoBuffer;
// Ethernet Stats
ULONG RcvAlignmentErrors;
ULONG OneCollision;
ULONG MoreCollisions;
} COUNTER_802_3, *PCOUNTER_802_3;
typedef struct _COUNTER_802_11 {
ULONG Length;
// LARGE_INTEGER LastTransmittedFragmentCount;
LARGE_INTEGER TransmittedFragmentCount;
LARGE_INTEGER MulticastTransmittedFrameCount;
LARGE_INTEGER FailedCount;
LARGE_INTEGER RetryCount;
LARGE_INTEGER MultipleRetryCount;
LARGE_INTEGER RTSSuccessCount;
LARGE_INTEGER RTSFailureCount;
LARGE_INTEGER ACKFailureCount;
LARGE_INTEGER FrameDuplicateCount;
LARGE_INTEGER ReceivedFragmentCount;
LARGE_INTEGER MulticastReceivedFrameCount;
LARGE_INTEGER FCSErrorCount;
} COUNTER_802_11, *PCOUNTER_802_11;
typedef struct _COUNTER_RALINK {
UINT32 OneSecStart; /* for one sec count clear use */
UINT32 OneSecBeaconSentCnt;
UINT32 OneSecFalseCCACnt; // CCA error count, for debug purpose, might move to global counter
UINT32 OneSecRxFcsErrCnt; // CRC error
UINT32 OneSecRxOkCnt; // RX without error
UINT32 OneSecTxFailCount;
UINT32 OneSecTxNoRetryOkCount;
UINT32 OneSecTxRetryOkCount;
UINT32 OneSecRxOkDataCnt; // unicast-to-me DATA frame count
UINT32 OneSecTransmittedByteCount; // both successful and failure, used to calculate TX throughput
ULONG OneSecOsTxCount[NUM_OF_TX_RING];
ULONG OneSecDmaDoneCount[NUM_OF_TX_RING];
UINT32 OneSecTxDoneCount;
ULONG OneSecRxCount;
UINT32 OneSecReceivedByteCount;
UINT32 OneSecTxAggregationCount;
UINT32 OneSecRxAggregationCount;
UINT32 OneSecEnd; /* for one sec count clear use */
ULONG TransmittedByteCount; // both successful and failure, used to calculate TX throughput
ULONG ReceivedByteCount; // both CRC okay and CRC error, used to calculate RX throughput
ULONG BadCQIAutoRecoveryCount;
ULONG PoorCQIRoamingCount;
ULONG MgmtRingFullCount;
ULONG RxCountSinceLastNULL;
ULONG RxCount;
ULONG KickTxCount;
LARGE_INTEGER RealFcsErrCount;
ULONG PendingNdisPacketCount;
// ULONG OneSecOsTxCount[NUM_OF_TX_RING];
// ULONG OneSecDmaDoneCount[NUM_OF_TX_RING];
// UINT32 OneSecTxDoneCount;
// ULONG OneSecRxCount;
// UINT32 OneSecTxAggregationCount;
// UINT32 OneSecRxAggregationCount;
// UINT32 OneSecReceivedByteCount;
// UINT32 OneSecFrameDuplicateCount;
// UINT32 OneSecTransmittedByteCount; // both successful and failure, used to calculate TX throughput
// UINT32 OneSecTxNoRetryOkCount;
// UINT32 OneSecTxRetryOkCount;
// UINT32 OneSecTxFailCount;
// UINT32 OneSecFalseCCACnt; // CCA error count, for debug purpose, might move to global counter
// UINT32 OneSecRxOkCnt; // RX without error
// UINT32 OneSecRxOkDataCnt; // unicast-to-me DATA frame count
// UINT32 OneSecRxFcsErrCnt; // CRC error
// UINT32 OneSecBeaconSentCnt;
UINT32 LastOneSecTotalTxCount; // OneSecTxNoRetryOkCount + OneSecTxRetryOkCount + OneSecTxFailCount
UINT32 LastOneSecRxOkDataCnt; // OneSecRxOkDataCnt
ULONG DuplicateRcv;
ULONG TxAggCount;
ULONG TxNonAggCount;
ULONG TxAgg1MPDUCount;
ULONG TxAgg2MPDUCount;
ULONG TxAgg3MPDUCount;
ULONG TxAgg4MPDUCount;
ULONG TxAgg5MPDUCount;
ULONG TxAgg6MPDUCount;
ULONG TxAgg7MPDUCount;
ULONG TxAgg8MPDUCount;
ULONG TxAgg9MPDUCount;
ULONG TxAgg10MPDUCount;
ULONG TxAgg11MPDUCount;
ULONG TxAgg12MPDUCount;
ULONG TxAgg13MPDUCount;
ULONG TxAgg14MPDUCount;
ULONG TxAgg15MPDUCount;
ULONG TxAgg16MPDUCount;
LARGE_INTEGER TransmittedOctetsInAMSDU;
LARGE_INTEGER TransmittedAMSDUCount;
LARGE_INTEGER ReceivedOctesInAMSDUCount;
LARGE_INTEGER ReceivedAMSDUCount;
LARGE_INTEGER TransmittedAMPDUCount;
LARGE_INTEGER TransmittedMPDUsInAMPDUCount;
LARGE_INTEGER TransmittedOctetsInAMPDUCount;
LARGE_INTEGER MPDUInReceivedAMPDUCount;
} COUNTER_RALINK, *PCOUNTER_RALINK;
typedef struct _COUNTER_DRS {
// to record the each TX rate's quality. 0 is best, the bigger the worse.
USHORT TxQuality[MAX_STEP_OF_TX_RATE_SWITCH];
UCHAR PER[MAX_STEP_OF_TX_RATE_SWITCH];
UCHAR TxRateUpPenalty; // extra # of second penalty due to last unstable condition
ULONG CurrTxRateStableTime; // # of second in current TX rate
//BOOLEAN fNoisyEnvironment;
BOOLEAN fLastSecAccordingRSSI;
UCHAR LastSecTxRateChangeAction; // 0: no change, 1:rate UP, 2:rate down
UCHAR LastTimeTxRateChangeAction; //Keep last time value of LastSecTxRateChangeAction
ULONG LastTxOkCount;
} COUNTER_DRS, *PCOUNTER_DRS;
#ifdef DOT11_N_SUPPORT
#ifdef TXBF_SUPPORT
typedef
struct {
ULONG TxSuccessCount;
ULONG TxRetryCount;
ULONG TxFailCount;
ULONG ETxSuccessCount;
ULONG ETxRetryCount;
ULONG ETxFailCount;
ULONG ITxSuccessCount;
ULONG ITxRetryCount;
ULONG ITxFailCount;
} COUNTER_TXBF;
#endif
#endif // DOT11_N_SUPPORT //
/***************************************************************************
* security key related data structure
**************************************************************************/
// structure to define WPA Group Key Rekey Interval
typedef struct GNU_PACKED _RT_802_11_WPA_REKEY {
ULONG ReKeyMethod; // mechanism for rekeying: 0:disable, 1: time-based, 2: packet-based
ULONG ReKeyInterval; // time-based: seconds, packet-based: kilo-packets
} RT_WPA_REKEY,*PRT_WPA_REKEY, RT_802_11_WPA_REKEY, *PRT_802_11_WPA_REKEY;
typedef struct {
UCHAR Addr[MAC_ADDR_LEN];
UCHAR ErrorCode[2]; //00 01-Invalid authentication type
//00 02-Authentication timeout
//00 03-Challenge from AP failed
//00 04-Challenge to AP failed
BOOLEAN Reported;
} ROGUEAP_ENTRY, *PROGUEAP_ENTRY;
typedef struct {
UCHAR RogueApNr;
ROGUEAP_ENTRY RogueApEntry[MAX_LEN_OF_BSS_TABLE];
} ROGUEAP_TABLE, *PROGUEAP_TABLE;
/*
* Fragment Frame structure
*/
typedef struct _FRAGMENT_FRAME {
PNDIS_PACKET pFragPacket;
ULONG RxSize;
USHORT Sequence;
USHORT LastFrag;
ULONG Flags; // Some extra frame information. bit 0: LLC presented
} FRAGMENT_FRAME, *PFRAGMENT_FRAME;
//
// Packet information for NdisQueryPacket
//
typedef struct _PACKET_INFO {
UINT PhysicalBufferCount; // Physical breaks of buffer descripor chained
UINT BufferCount ; // Number of Buffer descriptor chained
UINT TotalPacketLength ; // Self explained
PNDIS_BUFFER pFirstBuffer; // Pointer to first buffer descriptor
} PACKET_INFO, *PPACKET_INFO;
//
// Tkip Key structure which RC4 key & MIC calculation
//
typedef struct _TKIP_KEY_INFO {
UINT nBytesInM; // # bytes in M for MICKEY
ULONG IV16;
ULONG IV32;
ULONG K0; // for MICKEY Low
ULONG K1; // for MICKEY Hig
ULONG L; // Current state for MICKEY
ULONG R; // Current state for MICKEY
ULONG M; // Message accumulator for MICKEY
UCHAR RC4KEY[16];
UCHAR MIC[8];
} TKIP_KEY_INFO, *PTKIP_KEY_INFO;
//
// Private / Misc data, counters for driver internal use
//
typedef struct __PRIVATE_STRUC {
UINT SystemResetCnt; // System reset counter
UINT TxRingFullCnt; // Tx ring full occurrance number
UINT PhyRxErrCnt; // PHY Rx error count, for debug purpose, might move to global counter
// Variables for WEP encryption / decryption in rtmp_wep.c
// Tkip stuff
TKIP_KEY_INFO Tx;
TKIP_KEY_INFO Rx;
} PRIVATE_STRUC, *PPRIVATE_STRUC;
/***************************************************************************
* Channel and BBP related data structures
**************************************************************************/
// structure to tune BBP R66 (BBP TUNING)
typedef struct _BBP_R66_TUNING {
BOOLEAN bEnable;
USHORT FalseCcaLowerThreshold; // default 100
USHORT FalseCcaUpperThreshold; // default 512
UCHAR R66Delta;
UCHAR R66CurrentValue;
BOOLEAN R66LowerUpperSelect; //Before LinkUp, Used LowerBound or UpperBound as R66 value.
} BBP_R66_TUNING, *PBBP_R66_TUNING;
#ifdef DOT11_N_SUPPORT
#ifdef DOT11N_DRAFT3
#define EFFECTED_CH_SECONDARY 0x1
#define EFFECTED_CH_PRIMARY 0x2
#define EFFECTED_CH_LEGACY 0x4
#endif // DOT11N_DRAFT3 //
#endif // DOT11_N_SUPPORT //
// structure to store channel TX power
typedef struct _CHANNEL_TX_POWER {
USHORT RemainingTimeForUse; //unit: sec
UCHAR Channel;
#ifdef DOT11N_DRAFT3
BOOLEAN bEffectedChannel; // For BW 40 operating in 2.4GHz , the " effected channel " is the channel that is covered in 40Mhz.
#endif // DOT11N_DRAFT3 //
CHAR Power;
CHAR Power2;
UCHAR MaxTxPwr;
UCHAR DfsReq;
UCHAR RegulatoryDomain;
/*
Channel property:
CHANNEL_DISABLED: The channel is disabled.
CHANNEL_PASSIVE_SCAN: Only passive scanning is allowed.
CHANNEL_NO_IBSS: IBSS is not allowed.
CHANNEL_RADAR: Radar detection is required.
CHANNEL_NO_FAT_ABOVE: Extension channel above this channel is not allowed.
CHANNEL_NO_FAT_BELOW: Extension channel below this channel is not allowed.
*/
#define CHANNEL_DISABLED 0x01 /* no use */
#define CHANNEL_PASSIVE_SCAN 0x02
#define CHANNEL_NO_IBSS 0x04
#define CHANNEL_RADAR 0x08
#define CHANNEL_NO_FAT_ABOVE 0x10
#define CHANNEL_NO_FAT_BELOW 0x20
UCHAR Flags;
#ifdef RT30xx
UCHAR Tx0FinePowerCtrl; // Tx0 fine power control in 0.1dB step
UCHAR Tx1FinePowerCtrl; // Tx1 fine power control in 0.1dB step
UCHAR Tx2FinePowerCtrl; // Tx2 fine power control in 0.1dB step
#endif // RT30xx //
} CHANNEL_TX_POWER, *PCHANNEL_TX_POWER;
typedef struct _SOFT_RX_ANT_DIVERSITY_STRUCT {
UCHAR EvaluatePeriod; // 0:not evalute status, 1: evaluate status, 2: switching status
UCHAR EvaluateStableCnt;
UCHAR Pair1PrimaryRxAnt; // 0:Ant-E1, 1:Ant-E2
UCHAR Pair1SecondaryRxAnt; // 0:Ant-E1, 1:Ant-E2
#ifdef CONFIG_STA_SUPPORT
SHORT Pair1AvgRssi[2]; // AvgRssi[0]:E1, AvgRssi[1]:E2
SHORT Pair2AvgRssi[2]; // AvgRssi[0]:E3, AvgRssi[1]:E4
#endif // CONFIG_STA_SUPPORT //
SHORT Pair1LastAvgRssi; //
SHORT Pair2LastAvgRssi; //
ULONG RcvPktNumWhenEvaluate;
BOOLEAN FirstPktArrivedWhenEvaluate;
} SOFT_RX_ANT_DIVERSITY, *PSOFT_RX_ANT_DIVERSITY;
/***************************************************************************
* structure for radar detection and channel switch
**************************************************************************/
typedef struct _RADAR_DETECT_STRUCT {
//BOOLEAN IEEE80211H; // 0: disable, 1: enable IEEE802.11h
UCHAR CSCount; //Channel switch counter
UCHAR CSPeriod; //Channel switch period (beacon count)
UCHAR RDCount; //Radar detection counter
UCHAR RDMode; //Radar Detection mode
UCHAR RDDurRegion; //Radar detection duration region
UCHAR BBPR16;
UCHAR BBPR17;
UCHAR BBPR18;
UCHAR BBPR21;
UCHAR BBPR22;
UCHAR BBPR64;
ULONG InServiceMonitorCount; // unit: sec
UINT8 DfsSessionTime;
BOOLEAN bFastDfs;
USHORT ChMovingTime;
UINT8 LongPulseRadarTh;
#if defined(RTMP_RBUS_SUPPORT)||defined(DFS_INTERRUPT_SUPPORT)
CHAR AvgRssiReq;
ULONG DfsLowerLimit;
ULONG DfsUpperLimit;
UINT8 FixDfsLimit;
ULONG upperlimit;
ULONG lowerlimit;
#endif // defined(RTMP_RBUS_SUPPORT)||defined(DFS_INTERRUPT_SUPPORT) //
} RADAR_DETECT_STRUCT, *PRADAR_DETECT_STRUCT;
#ifdef DFS_SUPPORT
typedef enum _DFS_VERSION
{
SOFTWARE_DFS=0,
HARDWARE_DFS_V1,
HARDWARE_DFS_V2
} DFS_VERSION;
#endif // DFS_SUPPORT //
#ifdef CARRIER_DETECTION_SUPPORT
typedef enum CD_STATE_n
{
CD_NORMAL,
CD_SILENCE,
CD_MAX_STATE
} CD_STATE;
typedef enum _TONE_RADAR_VERSION
{
DISABLE_TONE_RADAR=0,
TONE_RADAR_V1,
TONE_RADAR_V2
} TONE_RADAR_VERSION;
#ifdef TONE_RADAR_DETECT_SUPPORT
#define CARRIER_DETECT_RECHECK_TIME 3
#define CARRIER_DETECT_CRITIRIA 7000
#define CARRIER_DETECT_STOP_RATIO 2
#define CARRIER_DETECT_STOP_RECHECK_TIME 4
#define CARRIER_DETECT_CRITIRIA_A 230
#define CARRIER_DETECT_DELTA 7
#define CARRIER_DETECT_DIV_FLAG 0
#define CARRIER_DETECT_THRESHOLD 0x0fffffff
#endif // TONE_RADAR_DETECT_SUPPORT //
typedef struct CARRIER_DETECTION_s
{
BOOLEAN Enable;
UINT8 CDSessionTime;
UINT8 CDPeriod;
CD_STATE CD_State;
#ifdef TONE_RADAR_DETECT_SUPPORT
UINT8 delta;
UINT8 div_flag;
UINT32 threshold;
UINT8 recheck;
UINT8 recheck1;
UINT32 TimeStamp;
UINT32 criteria;
UINT32 CarrierDebug;
ULONG idle_time;
ULONG busy_time;
ULONG Debug;
ULONG OneSecIntCount;
#ifdef TONE_RADAR_DETECT_V2
UCHAR Symmetric_Round;
UCHAR VGA_Mask;
UCHAR Packet_End_Mask;
UCHAR Rx_PE_Mask;
#endif // TONE_RADAR_DETECT_V2 //
#endif // TONE_RADAR_DETECT_SUPPORT //
}CARRIER_DETECTION_STRUCT, *PCARRIER_DETECTION_STRUCT;
#endif // CARRIER_DETECTION_SUPPORT //
#ifdef DFS_HARDWARE_SUPPORT
typedef struct _NewDFSDebug
{
UCHAR channel;
ULONG wait_time;
UCHAR delta_delay_range;
UCHAR delta_delay_step;
UCHAR EL_range;
UCHAR EL_step;
UCHAR EH_range;
UCHAR EH_step;
UCHAR WL_range;
UCHAR WL_step;
UCHAR WH_range;
UCHAR WH_step;
ULONG T_expected;
ULONG T_margin;
UCHAR start;
ULONG count;
ULONG idx;
}NewDFSDebug, *pNewDFSDebug;
#define NEW_DFS_FCC_5_ENT_NUM 5
#define NEW_DFS_DBG_PORT_ENT_NUM_POWER 8
#define NEW_DFS_DBG_PORT_ENT_NUM (1 & lt; & lt; NEW_DFS_DBG_PORT_ENT_NUM_POWER) // CE Debug Port entry number, 256
#define NEW_DFS_DBG_PORT_MASK (NEW_DFS_DBG_PORT_ENT_NUM - 1) // 0xff
// Matched Period definition
#define NEW_DFS_MPERIOD_ENT_NUM_POWER 8
#define NEW_DFS_MPERIOD_ENT_NUM (1 & lt; & lt; NEW_DFS_MPERIOD_ENT_NUM_POWER) // CE Period Table entry number, 512
#define NEW_DFS_MAX_CHANNEL 4
typedef struct _NewDFSDebugPort{
ULONG counter;
ULONG timestamp;
USHORT width;
USHORT start_idx; // start index to period table
USHORT end_idx; // end index to period table
}NewDFSDebugPort, *pNewDFSDebugPort;
// Matched Period Table
typedef struct _NewDFSMPeriod{
USHORT idx;
USHORT width;
USHORT idx2;
USHORT width2;
ULONG period;
}NewDFSMPeriod, *pNewDFSMPeriod;
typedef struct _NewDFSParam{
BOOLEAN valid;
UCHAR mode;
USHORT avgLen;
USHORT ELow;
USHORT EHigh;
USHORT WLow;
USHORT WHigh;
UCHAR EpsilonW;
ULONG TLow;
ULONG THigh;
UCHAR EpsilonT;
#ifdef DFS_2_SUPPORT
ULONG BLow;
ULONG BHigh;
#endif //DFS_2_SUPPORT
}NewDFSParam, *pNewDFSParam;
#endif // DFS_HARDWARE_SUPPORT //
typedef enum _ABGBAND_STATE_ {
UNKNOWN_BAND,
BG_BAND,
A_BAND,
} ABGBAND_STATE;
#ifdef CONFIG_STA_SUPPORT
#ifdef RTMP_MAC_PCI
// Power save method control
typedef union _PS_CONTROL {
struct {
ULONG EnablePSinIdle:1; // Enable radio off when not connect to AP. radio on only when sitesurvey,
ULONG EnableNewPS:1; // Enable new Chip power save fucntion . New method can only be applied in chip version after 2872. and PCIe.
ULONG rt30xxPowerMode:2; // Power Level Mode for rt30xx chip
ULONG rt30xxFollowHostASPM:1; // Card Follows Host's setting for rt30xx chip.
ULONG rt30xxForceASPMTest:1; // Force enable L1 for rt30xx chip. This has higher priority than rt30xxFollowHostASPM Mode.
// ULONG rsv:26; // Radio Measurement Enable
ULONG AMDNewPSOn:1; // Enable for AMD L1 (toggle)
ULONG LedMode:2; // 0: Blink normal. 1: Slow blink not normal.
ULONG rt30xxForceL0:1; // Force only use L0 for rt30xx
ULONG rsv:22; // Radio Measurement Enable
} field;
ULONG word;
} PS_CONTROL, *PPS_CONTROL;
#endif // RTMP_MAC_PCI //
#endif // CONFIG_STA_SUPPORT //
/***************************************************************************
* structure for MLME state machine
**************************************************************************/
typedef struct _MLME_STRUCT {
#ifdef CONFIG_STA_SUPPORT
// STA state machines
STATE_MACHINE CntlMachine;
STATE_MACHINE AssocMachine;
STATE_MACHINE AuthMachine;
STATE_MACHINE AuthRspMachine;
STATE_MACHINE SyncMachine;
STATE_MACHINE WpaPskMachine;
STATE_MACHINE LeapMachine;
STATE_MACHINE_FUNC AssocFunc[ASSOC_FUNC_SIZE];
STATE_MACHINE_FUNC AuthFunc[AUTH_FUNC_SIZE];
STATE_MACHINE_FUNC AuthRspFunc[AUTH_RSP_FUNC_SIZE];
STATE_MACHINE_FUNC SyncFunc[SYNC_FUNC_SIZE];
#endif // CONFIG_STA_SUPPORT //
STATE_MACHINE_FUNC ActFunc[ACT_FUNC_SIZE];
// Action
STATE_MACHINE ActMachine;
#ifdef QOS_DLS_SUPPORT
STATE_MACHINE DlsMachine;
STATE_MACHINE_FUNC DlsFunc[DLS_FUNC_SIZE];
#endif // QOS_DLS_SUPPORT //
// common WPA state machine
STATE_MACHINE WpaMachine;
STATE_MACHINE_FUNC WpaFunc[WPA_FUNC_SIZE];
ULONG ChannelQuality; // 0..100, Channel Quality Indication for Roaming
ULONG Now32; // latch the value of NdisGetSystemUpTime()
ULONG LastSendNULLpsmTime;
BOOLEAN bRunning;
NDIS_SPIN_LOCK TaskLock;
MLME_QUEUE Queue;
UINT ShiftReg;
RALINK_TIMER_STRUCT MiscDetectTimer;
RALINK_TIMER_STRUCT PeriodicTimer;
RALINK_TIMER_STRUCT APSDPeriodicTimer;
RALINK_TIMER_STRUCT LinkDownTimer;
RALINK_TIMER_STRUCT LinkUpTimer;
#ifdef RTMP_MAC_PCI
UCHAR bPsPollTimerRunning;
RALINK_TIMER_STRUCT PsPollTimer;
RALINK_TIMER_STRUCT RadioOnOffTimer;
#endif // RTMP_MAC_PCI //
ULONG PeriodicRound;
ULONG GPIORound;
ULONG OneSecPeriodicRound;
UCHAR RealRxPath;
BOOLEAN bLowThroughput;
BOOLEAN bEnableAutoAntennaCheck;
RALINK_TIMER_STRUCT RxAntEvalTimer;
#ifdef RT30xx
UCHAR CaliBW40RfR24;
UCHAR CaliBW20RfR24;
UCHAR CaliBW20RfR31;
UCHAR CaliBW40RfR31;
#endif // RT30xx //
} MLME_STRUCT, *PMLME_STRUCT;
#ifdef DOT11_N_SUPPORT
/***************************************************************************
* 802.11 N related data structures
**************************************************************************/
struct reordering_mpdu
{
struct reordering_mpdu *next;
PNDIS_PACKET pPacket; /* coverted to 802.3 frame */
int Sequence; /* sequence number of MPDU */
BOOLEAN bAMSDU;
};
struct reordering_list
{
struct reordering_mpdu *next;
int qlen;
};
struct reordering_mpdu_pool
{
PVOID mem;
NDIS_SPIN_LOCK lock;
struct reordering_list freelist;
};
typedef enum _REC_BLOCKACK_STATUS
{
Recipient_NONE=0,
Recipient_USED,
Recipient_HandleRes,
Recipient_Accept
} REC_BLOCKACK_STATUS, *PREC_BLOCKACK_STATUS;
typedef enum _ORI_BLOCKACK_STATUS
{
Originator_NONE=0,
Originator_USED,
Originator_WaitRes,
Originator_Done
} ORI_BLOCKACK_STATUS, *PORI_BLOCKACK_STATUS;
typedef struct _BA_ORI_ENTRY{
UCHAR Wcid;
UCHAR TID;
UCHAR BAWinSize;
UCHAR Token;
// Sequence is to fill every outgoing QoS DATA frame's sequence field in 802.11 header.
USHORT Sequence;
USHORT TimeOutValue;
ORI_BLOCKACK_STATUS ORI_BA_Status;
RALINK_TIMER_STRUCT ORIBATimer;
PVOID pAdapter;
} BA_ORI_ENTRY, *PBA_ORI_ENTRY;
typedef struct _BA_REC_ENTRY {
UCHAR Wcid;
UCHAR TID;
UCHAR BAWinSize; // 7.3.1.14. each buffer is capable of holding a max AMSDU or MSDU.
//UCHAR NumOfRxPkt;
//UCHAR Curindidx; // the head in the RX reordering buffer
USHORT LastIndSeq;
// USHORT LastIndSeqAtTimer;
USHORT TimeOutValue;
RALINK_TIMER_STRUCT RECBATimer;
ULONG LastIndSeqAtTimer;
ULONG nDropPacket;
ULONG rcvSeq;
REC_BLOCKACK_STATUS REC_BA_Status;
// UCHAR RxBufIdxUsed;
// corresponding virtual address for RX reordering packet storage.
//RTMP_REORDERDMABUF MAP_RXBuf[MAX_RX_REORDERBUF];
NDIS_SPIN_LOCK RxReRingLock; // Rx Ring spinlock
// struct _BA_REC_ENTRY *pNext;
PVOID pAdapter;
struct reordering_list list;
} BA_REC_ENTRY, *PBA_REC_ENTRY;
typedef struct {
ULONG numAsRecipient; // I am recipient of numAsRecipient clients. These client are in the BARecEntry[]
ULONG numAsOriginator; // I am originator of numAsOriginator clients. These clients are in the BAOriEntry[]
ULONG numDoneOriginator; // count Done Originator sessions
BA_ORI_ENTRY BAOriEntry[MAX_LEN_OF_BA_ORI_TABLE];
BA_REC_ENTRY BARecEntry[MAX_LEN_OF_BA_REC_TABLE];
} BA_TABLE, *PBA_TABLE;
//For QureyBATableOID use;
typedef struct GNU_PACKED _OID_BA_REC_ENTRY{
UCHAR MACAddr[MAC_ADDR_LEN];
UCHAR BaBitmap; // if (BaBitmap & (1 & lt; & lt; TID)), this session with{MACAddr, TID}exists, so read BufSize[TID] for BufferSize
UCHAR rsv;
UCHAR BufSize[8];
REC_BLOCKACK_STATUS REC_BA_Status[8];
} OID_BA_REC_ENTRY, *POID_BA_REC_ENTRY;
//For QureyBATableOID use;
typedef struct GNU_PACKED _OID_BA_ORI_ENTRY{
UCHAR MACAddr[MAC_ADDR_LEN];
UCHAR BaBitmap; // if (BaBitmap & (1 & lt; & lt; TID)), this session with{MACAddr, TID}exists, so read BufSize[TID] for BufferSize, read ORI_BA_Status[TID] for status
UCHAR rsv;
UCHAR BufSize[8];
ORI_BLOCKACK_STATUS ORI_BA_Status[8];
} OID_BA_ORI_ENTRY, *POID_BA_ORI_ENTRY;
typedef struct _QUERYBA_TABLE{
OID_BA_ORI_ENTRY BAOriEntry[32];
OID_BA_REC_ENTRY BARecEntry[32];
UCHAR OriNum;// Number of below BAOriEntry
UCHAR RecNum;// Number of below BARecEntry
} QUERYBA_TABLE, *PQUERYBA_TABLE;
typedef union _BACAP_STRUC {
#ifdef RT_BIG_ENDIAN
struct {
UINT32 :4;
UINT32 b2040CoexistScanSup:1; //As Sta, support do 2040 coexistence scan for AP. As Ap, support monitor trigger event to check if can use BW 40MHz.
UINT32 bHtAdhoc:1; // adhoc can use ht rate.
UINT32 MMPSmode:2; // MIMO power save more, 0:static, 1:dynamic, 2:rsv, 3:mimo enable
UINT32 AmsduSize:1; // 0:3839, 1:7935 bytes. UINT MSDUSizeToBytes[] = { 3839, 7935};
UINT32 AmsduEnable:1; //Enable AMSDU transmisstion
UINT32 MpduDensity:3;
UINT32 Policy:2; // 0: DELAY_BA 1:IMMED_BA (//BA Policy subfiled value in ADDBA frame) 2:BA-not use
UINT32 AutoBA:1; // automatically BA
UINT32 TxBAWinLimit:8;
UINT32 RxBAWinLimit:8;
} field;
#else
struct {
UINT32 RxBAWinLimit:8;
UINT32 TxBAWinLimit:8;
UINT32 AutoBA:1; // automatically BA
UINT32 Policy:2; // 0: DELAY_BA 1:IMMED_BA (//BA Policy subfiled value in ADDBA frame) 2:BA-not use
UINT32 MpduDensity:3;
UINT32 AmsduEnable:1; //Enable AMSDU transmisstion
UINT32 AmsduSize:1; // 0:3839, 1:7935 bytes. UINT MSDUSizeToBytes[] = { 3839, 7935};
UINT32 MMPSmode:2; // MIMO power save more, 0:static, 1:dynamic, 2:rsv, 3:mimo enable
UINT32 bHtAdhoc:1; // adhoc can use ht rate.
UINT32 b2040CoexistScanSup:1; //As Sta, support do 2040 coexistence scan for AP. As Ap, support monitor trigger event to check if can use BW 40MHz.
UINT32 :4;
} field;
#endif
UINT32 word;
} BACAP_STRUC, *PBACAP_STRUC;
typedef struct {
BOOLEAN IsRecipient;
UCHAR MACAddr[MAC_ADDR_LEN];
UCHAR TID;
UCHAR nMSDU;
USHORT TimeOut;
BOOLEAN bAllTid; // If True, delete all TID for BA sessions with this MACaddr.
} OID_ADD_BA_ENTRY, *POID_ADD_BA_ENTRY;
#ifdef DOT11N_DRAFT3
typedef enum _BSS2040COEXIST_FLAG{
BSS_2040_COEXIST_DISABLE = 0,
BSS_2040_COEXIST_TIMER_FIRED = 1,
BSS_2040_COEXIST_INFO_SYNC = 2,
BSS_2040_COEXIST_INFO_NOTIFY = 4,
}BSS2040COEXIST_FLAG;
typedef struct _BssCoexChRange_{
UCHAR primaryCh;
UCHAR secondaryCh;
UCHAR effectChStart;
UCHAR effectChEnd;
}BSS_COEX_CH_RANGE;
#endif // DOT11N_DRAFT3 //
#define IS_HT_STA(_pMacEntry) \
(_pMacEntry- & gt; MaxHTPhyMode.field.MODE & gt; = MODE_HTMIX)
#define IS_HT_RATE(_pMacEntry) \
(_pMacEntry- & gt; HTPhyMode.field.MODE & gt; = MODE_HTMIX)
#define PEER_IS_HT_RATE(_pMacEntry) \
(_pMacEntry- & gt; HTPhyMode.field.MODE & gt; = MODE_HTMIX)
#endif // DOT11_N_SUPPORT //
//This structure is for all 802.11n card InterOptibilityTest action. Reset all Num every n second. (Details see MLMEPeriodic)
typedef struct _IOT_STRUC {
BOOLEAN bRTSLongProtOn;
#ifdef CONFIG_STA_SUPPORT
BOOLEAN bLastAtheros;
BOOLEAN bCurrentAtheros;
BOOLEAN bNowAtherosBurstOn;
BOOLEAN bNextDisableRxBA;
BOOLEAN bToggle;
#endif // CONFIG_STA_SUPPORT //
} IOT_STRUC, *PIOT_STRUC;
// This is the registry setting for 802.11n transmit setting. Used in advanced page.
typedef union _REG_TRANSMIT_SETTING {
#ifdef RT_BIG_ENDIAN
struct {
UINT32 rsv:13;
UINT32 EXTCHA:2;
UINT32 HTMODE:1;
UINT32 TRANSNO:2;
UINT32 STBC:1; //SPACE
UINT32 ShortGI:1;
UINT32 BW:1; //channel bandwidth 20MHz or 40 MHz
UINT32 TxBF:1; // 3*3
UINT32 ITxBfEn:1;
UINT32 rsv0:9;
//UINT32 MCS:7; // MCS
//UINT32 PhyMode:4;
} field;
#else
struct {
//UINT32 PhyMode:4;
//UINT32 MCS:7; // MCS
UINT32 rsv0:9;
UINT32 ITxBfEn:1;
UINT32 TxBF:1;
UINT32 BW:1; //channel bandwidth 20MHz or 40 MHz
UINT32 ShortGI:1;
UINT32 STBC:1; //SPACE
UINT32 TRANSNO:2;
UINT32 HTMODE:1;
UINT32 EXTCHA:2;
UINT32 rsv:13;
} field;
#endif
UINT32 word;
} REG_TRANSMIT_SETTING, *PREG_TRANSMIT_SETTING;
typedef union _DESIRED_TRANSMIT_SETTING {
#ifdef RT_BIG_ENDIAN
struct {
USHORT rsv:3;
USHORT FixedTxMode:2; // If MCS isn't AUTO, fix rate in CCK, OFDM or HT mode.
USHORT PhyMode:4;
USHORT MCS:7; // MCS
} field;
#else
struct {
USHORT MCS:7; // MCS
USHORT PhyMode:4;
USHORT FixedTxMode:2; // If MCS isn't AUTO, fix rate in CCK, OFDM or HT mode.
USHORT rsv:3;
} field;
#endif
USHORT word;
} DESIRED_TRANSMIT_SETTING, *PDESIRED_TRANSMIT_SETTING;
/***************************************************************************
* Multiple SSID related data structures
**************************************************************************/
#define WLAN_MAX_NUM_OF_TIM ((MAX_LEN_OF_MAC_TABLE & gt; & gt; 3) + 1) /* /8 + 1 */
#define WLAN_CT_TIM_BCMC_OFFSET 0 /* unit: 32B */
/* clear bcmc TIM bit */
#define WLAN_MR_TIM_BCMC_CLEAR(apidx) \
pAd- & gt; ApCfg.MBSSID[apidx].TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] & = ~BIT8[0];
/* set bcmc TIM bit */
#define WLAN_MR_TIM_BCMC_SET(apidx) \
pAd- & gt; ApCfg.MBSSID[apidx].TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] |= BIT8[0];
/* clear a station PS TIM bit */
#define WLAN_MR_TIM_BIT_CLEAR(ad_p, apidx, wcid) \
{ UCHAR tim_offset = wcid & gt; & gt; 3; \
UCHAR bit_offset = wcid & 0x7; \
ad_p- & gt; ApCfg.MBSSID[apidx].TimBitmaps[tim_offset] & = (~BIT8[bit_offset]); }
/* set a station PS TIM bit */
#define WLAN_MR_TIM_BIT_SET(ad_p, apidx, wcid) \
{ UCHAR tim_offset = wcid & gt; & gt; 3; \
UCHAR bit_offset = wcid & 0x7; \
ad_p- & gt; ApCfg.MBSSID[apidx].TimBitmaps[tim_offset] |= BIT8[bit_offset]; }
// configuration common to OPMODE_AP as well as OPMODE_STA
typedef struct _COMMON_CONFIG {
BOOLEAN bCountryFlag;
UCHAR CountryCode[3];
#ifdef EXT_BUILD_CHANNEL_LIST
UCHAR Geography;
#endif // EXT_BUILD_CHANNEL_LIST //
UCHAR CountryRegion; // Enum of country region, 0:FCC, 1:IC, 2:ETSI, 3:SPAIN, 4:France, 5:MKK, 6:MKK1, 7:Israel
UCHAR CountryRegionForABand; // Enum of country region for A band
UCHAR PhyMode; // PHY_11A, PHY_11B, PHY_11BG_MIXED, PHY_ABG_MIXED
UCHAR DesiredPhyMode; // PHY_11A, PHY_11B, PHY_11BG_MIXED, PHY_ABG_MIXED
USHORT Dsifs; // in units of usec
ULONG PacketFilter; // Packet filter for receiving
UINT8 RegulatoryClass[MAX_NUM_OF_REGULATORY_CLASS];
CHAR Ssid[MAX_LEN_OF_SSID]; // NOT NULL-terminated
UCHAR SsidLen; // the actual ssid length in used
UCHAR LastSsidLen; // the actual ssid length in used
CHAR LastSsid[MAX_LEN_OF_SSID]; // NOT NULL-terminated
UCHAR LastBssid[MAC_ADDR_LEN];
UCHAR Bssid[MAC_ADDR_LEN];
USHORT BeaconPeriod;
UCHAR Channel;
UCHAR CentralChannel; // Central Channel when using 40MHz is indicating. not real channel.
UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES];
UCHAR SupRateLen;
UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES];
UCHAR ExtRateLen;
UCHAR DesireRate[MAX_LEN_OF_SUPPORTED_RATES]; // OID_802_11_DESIRED_RATES
UCHAR MaxDesiredRate;
UCHAR ExpectedACKRate[MAX_LEN_OF_SUPPORTED_RATES];
ULONG BasicRateBitmap; // backup basic ratebitmap
ULONG BasicRateBitmapOld; // backup basic ratebitmap
BOOLEAN bAPSDCapable;
BOOLEAN bInServicePeriod;
BOOLEAN bAPSDAC_BE;
BOOLEAN bAPSDAC_BK;
BOOLEAN bAPSDAC_VI;
BOOLEAN bAPSDAC_VO;
/* because TSPEC can modify the APSD flag, we need to keep the APSD flag
requested in association stage from the station;
we need to recover the APSD flag after the TSPEC is deleted. */
BOOLEAN bACMAPSDBackup[4]; /* for delivery-enabled & trigger-enabled both */
BOOLEAN bACMAPSDTr[4]; /* no use */
BOOLEAN bNeedSendTriggerFrame;
BOOLEAN bAPSDForcePowerSave; // Force power save mode, should only use in APSD-STAUT
ULONG TriggerTimerCount;
UCHAR MaxSPLength;
UCHAR BBPCurrentBW; // BW_10, BW_20, BW_40
// move to MULTISSID_STRUCT for MBSS
//HTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI.
REG_TRANSMIT_SETTING RegTransmitSetting; //registry transmit setting. this is for reading registry setting only. not useful.
//UCHAR FixedTxMode; // Fixed Tx Mode (CCK, OFDM), for HT fixed tx mode (GF, MIX) , refer to RegTransmitSetting.field.HTMode
UCHAR TxRate; // Same value to fill in TXD. TxRate is 6-bit
UCHAR MaxTxRate; // RATE_1, RATE_2, RATE_5_5, RATE_11
UCHAR TxRateIndex; // Tx rate index in RateSwitchTable
UCHAR TxRateTableSize; // Valid Tx rate table size in RateSwitchTable
//BOOLEAN bAutoTxRateSwitch;
UCHAR MinTxRate; // RATE_1, RATE_2, RATE_5_5, RATE_11
UCHAR RtsRate; // RATE_xxx
HTTRANSMIT_SETTING MlmeTransmit; // MGMT frame PHY rate setting when operatin at Ht rate.
UCHAR MlmeRate; // RATE_xxx, used to send MLME frames
UCHAR BasicMlmeRate; // Default Rate for sending MLME frames
USHORT RtsThreshold; // in unit of BYTE
USHORT FragmentThreshold; // in unit of BYTE
UCHAR TxPower; // in unit of mW
ULONG TxPowerPercentage; // 0~100 %
ULONG TxPowerDefault; // keep for TxPowerPercentage
UINT8 PwrConstraint;
#ifdef DOT11_N_SUPPORT
BACAP_STRUC BACapability; // NO USE = 0XFF ; IMMED_BA =1 ; DELAY_BA=0
BACAP_STRUC REGBACapability; // NO USE = 0XFF ; IMMED_BA =1 ; DELAY_BA=0
#endif // DOT11_N_SUPPORT //
IOT_STRUC IOTestParm; // 802.11n InterOpbility Test Parameter;
ULONG TxPreamble; // Rt802_11PreambleLong, Rt802_11PreambleShort, Rt802_11PreambleAuto
BOOLEAN bUseZeroToDisableFragment; // Microsoft use 0 as disable
ULONG UseBGProtection; // 0: auto, 1: always use, 2: always not use
BOOLEAN bUseShortSlotTime; // 0: disable, 1 - use short slot (9us)
BOOLEAN bEnableTxBurst; // 1: enble TX PACKET BURST (when BA is established or AP is not a legacy WMM AP), 0: disable TX PACKET BURST
BOOLEAN bAggregationCapable; // 1: enable TX aggregation when the peer supports it
BOOLEAN bPiggyBackCapable; // 1: enable TX piggy-back according MAC's version
BOOLEAN bIEEE80211H; // 1: enable IEEE802.11h spec.
ULONG DisableOLBCDetect; // 0: enable OLBC detect; 1 disable OLBC detect
#ifdef DOT11_N_SUPPORT
BOOLEAN bRdg;
#endif // DOT11_N_SUPPORT //
BOOLEAN bWmmCapable; // 0:disable WMM, 1:enable WMM
QOS_CAPABILITY_PARM APQosCapability; // QOS capability of the current associated AP
EDCA_PARM APEdcaParm; // EDCA parameters of the current associated AP
QBSS_LOAD_PARM APQbssLoad; // QBSS load of the current associated AP
UCHAR AckPolicy[4]; // ACK policy of the specified AC. see ACK_xxx
#ifdef CONFIG_STA_SUPPORT
BOOLEAN bDLSCapable; // 0:disable DLS, 1:enable DLS
#endif // CONFIG_STA_SUPPORT //
// a bitmap of BOOLEAN flags. each bit represent an operation status of a particular
// BOOLEAN control, either ON or OFF. These flags should always be accessed via
// OPSTATUS_TEST_FLAG(), OPSTATUS_SET_FLAG(), OP_STATUS_CLEAR_FLAG() macros.
// see fOP_STATUS_xxx in RTMP_DEF.C for detail bit definition
ULONG OpStatusFlags;
BOOLEAN NdisRadioStateOff; //For HCT 12.0, set this flag to TRUE instead of called MlmeRadioOff.
ABGBAND_STATE BandState; // For setting BBP used on B/G or A mode.
#ifdef ANT_DIVERSITY_SUPPORT
UCHAR bRxAntDiversity; // 0:disable, 1:enable Software Rx Antenna Diversity.
#endif // ANT_DIVERSITY_SUPPORT //
// IEEE802.11H--DFS.
RADAR_DETECT_STRUCT RadarDetect;
BOOLEAN bDFSIndoor;
#ifdef CARRIER_DETECTION_SUPPORT
CARRIER_DETECTION_STRUCT CarrierDetect;
UCHAR carrier_func;
#endif // CARRIER_DETECTION_SUPPORT //
#ifdef DOT11_N_SUPPORT
// HT
//UCHAR BASize; // USer desired BAWindowSize. Should not exceed our max capability
//RT_HT_CAPABILITY SupportedHtPhy;
RT_HT_CAPABILITY DesiredHtPhy;
HT_CAPABILITY_IE HtCapability;
ADD_HT_INFO_IE AddHTInfo; // Useful as AP.
//This IE is used with channel switch announcement element when changing to a new 40MHz.
//This IE is included in channel switch ammouncement frames 7.4.1.5, beacons, probe Rsp.
NEW_EXT_CHAN_IE NewExtChanOffset; //7.3.2.20A, 1 if extension channel is above the control channel, 3 if below, 0 if not present
EXT_CAP_INFO_ELEMENT ExtCapIE; // this is the extened capibility IE appreed in MGMT frames. Doesn't need to update once set in Init.
#ifdef DOT11N_DRAFT3
BOOLEAN bBssCoexEnable;
/*
Following two paramters now only used for the initial scan operation. the AP only do
bandwidth fallback when BssCoexApCnt & gt; BssCoexApCntThr
By default, the " BssCoexApCntThr " is set as 0 in " UserCfgInit() " .
*/
UCHAR BssCoexApCntThr;
UCHAR BssCoexApCnt;
UCHAR Bss2040CoexistFlag; // bit 0: bBssCoexistTimerRunning, bit 1: NeedSyncAddHtInfo.
RALINK_TIMER_STRUCT Bss2040CoexistTimer;
UCHAR Bss2040NeedFallBack;
//This IE is used for 20/40 BSS Coexistence.
BSS_2040_COEXIST_IE BSS2040CoexistInfo;
// ====== 11n D3.0 ======================= & gt;
USHORT Dot11OBssScanPassiveDwell; // Unit : TU. 5~1000
USHORT Dot11OBssScanActiveDwell; // Unit : TU. 10~1000
USHORT Dot11BssWidthTriggerScanInt; // Unit : Second
USHORT Dot11OBssScanPassiveTotalPerChannel; // Unit : TU. 200~10000
USHORT Dot11OBssScanActiveTotalPerChannel; // Unit : TU. 20~10000
USHORT Dot11BssWidthChanTranDelayFactor;
USHORT Dot11OBssScanActivityThre; // Unit : percentage
ULONG Dot11BssWidthChanTranDelay; // multiple of (Dot11BssWidthTriggerScanInt * Dot11BssWidthChanTranDelayFactor)
ULONG CountDownCtr; // CountDown Counter from (Dot11BssWidthTriggerScanInt * Dot11BssWidthChanTranDelayFactor)
BSS_2040_COEXIST_IE LastBSSCoexist2040;
BSS_2040_COEXIST_IE BSSCoexist2040;
TRIGGER_EVENT_TAB TriggerEventTab;
UCHAR ChannelListIdx;
// & lt; ====== 11n D3.0 =======================
BOOLEAN bOverlapScanning;
BOOLEAN bBssCoexNotify;
#endif // DOT11N_DRAFT3 //
BOOLEAN bHTProtect;
BOOLEAN bMIMOPSEnable;
BOOLEAN bBADecline;
BOOLEAN bDisableReordering;
BOOLEAN bForty_Mhz_Intolerant;
BOOLEAN bExtChannelSwitchAnnouncement;
BOOLEAN bRcvBSSWidthTriggerEvents;
ULONG LastRcvBSSWidthTriggerEventsTime;
UCHAR TxBASize;
#endif // DOT11_N_SUPPORT //
#ifdef SYSTEM_LOG_SUPPORT
// Enable wireless event
BOOLEAN bWirelessEvent;
#endif // SYSTEM_LOG_SUPPORT //
BOOLEAN bWiFiTest; // Enable this parameter for WiFi test
// Tx & Rx Stream number selection
UCHAR TxStream;
UCHAR RxStream;
// transmit phy mode, trasmit rate for Multicast.
#ifdef MCAST_RATE_SPECIFIC
UCHAR McastTransmitMcs;
UCHAR McastTransmitPhyMode;
#endif // MCAST_RATE_SPECIFIC //
BOOLEAN bHardwareRadio; // Hardware controlled Radio enabled
NDIS_SPIN_LOCK MeasureReqTabLock;
PMEASURE_REQ_TAB pMeasureReqTab;
NDIS_SPIN_LOCK TpcReqTabLock;
PTPC_REQ_TAB pTpcReqTab;
// transmit phy mode, trasmit rate for Multicast.
#ifdef MCAST_RATE_SPECIFIC
HTTRANSMIT_SETTING MCastPhyMode;
#endif // MCAST_RATE_SPECIFIC //
#ifdef SINGLE_SKU
UINT16 DefineMaxTxPwr;
BOOLEAN bSKUMode;
UINT16 AntGain;
UINT16 BandedgeDelta;
#endif // SINGLE_SKU //
#ifdef DFS_SUPPORT
#if defined(RTMP_RBUS_SUPPORT) || defined(DFS_INTERRUPT_SUPPORT)
ULONG CID;
ULONG CN;
// Radar and carrier detection in 2880-SW-MCU
UCHAR McuRadarCmd; // RADAR_DETECTION==1 or CARRIER_DETECTION==2, use bit map
UCHAR McuRadarEvent; // signal between Driver and 2880-SW-MCU
UCHAR McuRadarProtection;
UCHAR McuRadarState; // WAIT_CTS_BEING_SENT / DO_DETECTION / FREE_FOR_TX
UCHAR McuCarrierState;
// old value
ULONG OldRtsRetryLimit;
UCHAR _R65;
UCHAR _R66;
UCHAR _R69;
UCHAR _R70;
UCHAR _R73;
UCHAR R65;
UCHAR R66;
UCHAR DFS_R66;
#endif // defined(RTMP_RBUS_SUPPORT) || defined(DFS_INTERRUPT_SUPPORT) //
#ifdef DFS_HARDWARE_SUPPORT
ULONG MCURadarRegion;
UCHAR DeltaDelay;
UCHAR RadarReEnable;
USHORT PollTime;
USHORT ChEnable;
INT DfsRssiHigh;
INT DfsRssiLow;
INT DfsRssiHighFromCfg;
INT DfsRssiLowFromCfg;
BOOLEAN DfsRssiHighCfgValid;
BOOLEAN DfsRssiLowCfgValid;
NewDFSDebug DfsDebug;
NewDFSDebugPort FCC_5[NEW_DFS_FCC_5_ENT_NUM];
UCHAR fcc_5_idx;
UCHAR fcc_5_last_idx;
USHORT fcc_5_threshold; // to check the width of long pulse radar
ULONG fcc_5_counter;
UCHAR use_tasklet;
UCHAR DFSParamFromConfig;
NewDFSParam NewDFSTableEntry[16];
#ifdef DFS_DEBUG
// Roger debug
UCHAR DebugPort[384];
UCHAR DebugPortPrint; // 0 = stop, 1 = log req, 2 = loging, 3 = log done
ULONG TotalEntries[4];
ULONG T_Matched_2;
ULONG T_Matched_3;
ULONG T_Matched_4;
ULONG T_Matched_5;
UCHAR BBP127Repeat;
ULONG CounterStored[5];
ULONG CounterStored2[5];
ULONG CounterStored3;
NewDFSDebugPort CE_DebugCh0[NEW_DFS_DBG_PORT_ENT_NUM];
NewDFSMPeriod CE_TCh0[NEW_DFS_MPERIOD_ENT_NUM];
#endif
// CE Staggered radar / weather radar
NewDFSDebugPort DFS_W[NEW_DFS_MAX_CHANNEL][NEW_DFS_DBG_PORT_ENT_NUM];
USHORT dfs_w_idx[NEW_DFS_MAX_CHANNEL];
USHORT dfs_w_last_idx[NEW_DFS_MAX_CHANNEL];
ULONG dfs_w_counter;
NewDFSMPeriod DFS_T[NEW_DFS_MAX_CHANNEL][NEW_DFS_MPERIOD_ENT_NUM]; // period table
USHORT dfs_t_idx[NEW_DFS_MAX_CHANNEL];
USHORT dfs_width_diff_ch1_Shift;
USHORT dfs_width_diff_ch2_Shift;
USHORT dfs_width_diff_Shift;
USHORT dfs_period_err;
ULONG dfs_max_period; // Max possible Period
USHORT dfs_width_diff;
USHORT dfs_width_ch0_err_L;
USHORT dfs_width_ch0_err_H;
UCHAR dfs_check_loop;
UCHAR dfs_declare_thres;
UCHAR radarDeclared;
UCHAR Ch0Overflow;
UCHAR ce_staggered_check;
UCHAR hw_dfs_disabled;
UINT sw_idx[NEW_DFS_MAX_CHANNEL];
UINT hw_idx[NEW_DFS_MAX_CHANNEL];
UINT pr_idx[NEW_DFS_MAX_CHANNEL];
// Hardware detection re-check
ULONG re_check_jiffies[NEW_DFS_MAX_CHANNEL];
ULONG re_check_Width[NEW_DFS_MAX_CHANNEL];
ULONG re_check_Period[NEW_DFS_MAX_CHANNEL];
// false detection filter
UCHAR BUM_time; // Bandwidth Usage monitor time
ULONG idle_time;
ULONG busy_time;
int rssi;
UCHAR ch_busy;
UCHAR ch_busy_idle_ratio;
UCHAR BusyIdleFromCfg;
BOOLEAN BusyIdleCfgValid;
// Dfs: Radar event expiration parameter
ULONG RadarEventExpire[4];
#define CH_BUSY_NEGATIVE_MASK 0xe0000000 // this mask is used when use shift operation instead of division on negative integer.
#define CH_BUSY_SAMPLE_POWER 3
#define CH_BUSY_SAMPLE (1 & lt; & lt; CH_BUSY_SAMPLE_POWER)
#define CH_BUSY_MASK (CH_BUSY_SAMPLE - 1)
UCHAR print_ch_busy_sta;
ULONG ch_busy_sta[CH_BUSY_SAMPLE];
ULONG ch_idle_sta[CH_BUSY_SAMPLE];
UCHAR ch_busy_sta_index;
int ch_busy_sum;
int ch_idle_sum;
#define MAX_FDF_NUMBER 5 // max false-detection-filter number
UCHAR fdf_num;
USHORT ch_busy_threshold[MAX_FDF_NUMBER];
int rssi_threshold[MAX_FDF_NUMBER];
// Support after dfs_func & gt; = 2
UCHAR Symmetric_Round;
UCHAR VGA_Mask;
UCHAR Packet_End_Mask;
UCHAR Rx_PE_Mask;
UCHAR SymRoundFromCfg;
UCHAR SymRoundCfgValid;
#endif // DFS_HARDWARE_SUPPORT //
// DFS patch for long pulse
UCHAR W56_debug;
ULONG W56_idx;
ULONG W56_1s;
ULONG W56_4s[4];
ULONG W56_total;
ULONG W56_hw_1;
ULONG W56_hw_2;
ULONG W56_hw_sum;
UCHAR RadarElectNum;
//UCHAR BlockCh[MAX_NUM_OF_CHANNELS];
//USHORT ChRemainTime[MAX_NUM_OF_CHANNELS];
//UCHAR BlockChNum;
UCHAR McuRadarDebug;
// Radar detection
UCHAR McuRadarTick;
UCHAR McuRadarPeriod;
UCHAR McuRadarDetectPeriod;
UCHAR McuRadarCtsProtect;
UCHAR McuRadarDetectCount;
ULONG RadarTimeStampHigh;
ULONG RadarTimeStampLow;
//BOOLEAN bDFSIndoor;
#endif // DFS_SUPPORT //
#ifdef CARRIER_DETECTION_SUPPORT
// Carrier detection
USHORT McuCarrierTick;
USHORT McuCarrierDetectCount;
USHORT McuCarrierPeriod;
UCHAR McuCarrierDetectPeriod;
UCHAR McuCarrierCtsProtect;
#endif // CARRIER_DETECTION_SUPPORT //
#ifdef DFS_SUPPORT
DFS_VERSION dfs_func;
#ifdef DFS_HARDWARE_SUPPORT
UCHAR DFSAPRestart;
RALINK_TIMER_STRUCT DFSWatchDogTimer;
BOOLEAN DFSWatchDogIsRunning;
RALINK_TIMER_STRUCT CSWatchDogTimer;
#endif // DFS_HARDWARE_SUPPORT //
#endif // DFS_SUPPORT //
#if defined(RT305x)||defined(RT30xx)
// request by Gary, for High Power issue
UCHAR HighPowerPatchDisabled;
#endif // defined(RT305x)|| defined(RT30xx) //
BOOLEAN HT_DisallowTKIP; /* Restrict the encryption type in 11n HT mode */
BOOLEAN HT_Disable; /* 1: disable HT function; 0: enable HT function */
//#ifdef RTMP_RBUS_SUPPORT
#ifdef DOT11_N_SUPPORT
#ifdef TXBF_SUPPORT
ULONG ITxBfTimeout;
ULONG ETxBfTimeout;
ULONG ETxBfEnCond;
BOOLEAN ETxBfNoncompress;
#endif // TXBF_SUPPORT //
#endif // DOT11_N_SUPPORT //
ULONG DebugFlags; // Temporary debug flags
//#endif // RTMP_RBUS_SUPPORT //
#ifdef RTMP_MAC_PCI
BOOLEAN bPCIeBus; // The adapter runs over PCIe bus
#endif // RTMP_MAC_PCI //
} COMMON_CONFIG, *PCOMMON_CONFIG;
//#ifdef RTMP_RBUS_SUPPORT
// DebugFlag definitions
#define DBF_LESS_AGG_UP 0x0001 // Less aggressive traing up
#define DBF_CHECK_UP_PER 0x0002 // Don't train up if PER too high
#define DBF_NO_TXBF_3SS 0x0004 // Disable TXBF for 3SS
#define DBF_LOW_RA_THRESHOLDS 0x0008 // Use low RA thresholds
#define DBF_UNUSED0 0x0010 // unused
#define DBF_INIT_MCS_MARGIN 0x0020 // Use 6 dB margin when selecting initial MCS
#define DBF_INIT_MCS_DIS1 0x0040 // Disable highest MCSs when selecting initial MCS
#define DBF_INIT_MCS_DIS2 0x0080 // Disable 2nd highest MCSs when selecting initial MCS
#define DBF_FORCE_SGI 0x0100 // Force Short GI
#define DBF_UNUSED0200 0x0200 // unused
#define DBF_UNUSED0400 0x0400 // unused
#define DBF_UNUSED0800 0x0800 // unused
#define DBF_FORCE_AC_VI 0x1000 // Force AC_VI category
#define DBF_UNUSED2000 0x2000 // unused
#define DBF_UNUSED4000 0x4000 // unused
#define DBF_UNUSED8000 0x8000 // unused
//#endif // RTMP_RBUS_SUPPORT //
#ifdef CONFIG_STA_SUPPORT
#ifdef CREDENTIAL_STORE
typedef struct _STA_CONNECT_INFO {
BOOLEAN Changeable;
BOOLEAN IEEE8021X;
CHAR Ssid[MAX_LEN_OF_SSID]; // NOT NULL-terminated
UCHAR SsidLen; // the actual ssid length in used
NDIS_802_11_AUTHENTICATION_MODE AuthMode; // This should match to whatever microsoft defined
NDIS_802_11_WEP_STATUS WepStatus;
UCHAR DefaultKeyId;
UCHAR PMK[LEN_PMK]; // WPA PSK mode PMK
UCHAR WpaPassPhrase[64]; // WPA PSK pass phrase
UINT WpaPassPhraseLen; // the length of WPA PSK pass phrase
UINT8 WpaState;
CIPHER_KEY SharedKey[MAX_MBSSID_NUM][4]; // STA always use SharedKey[BSS0][0..3]
NDIS_SPIN_LOCK Lock;
} STA_CONNECT_INFO, *P_STA_CONNECT_INFO;
#endif /* CREDENTIAL_STORE */
/* Modified by Wu Xi-Kun 4/21/2006 */
// STA configuration and status
typedef struct _STA_ADMIN_CONFIG {
// GROUP 1 -
// User configuration loaded from Registry, E2PROM or OID_xxx. These settings describe
// the user intended configuration, but not necessary fully equal to the final
// settings in ACTIVE BSS after negotiation/compromize with the BSS holder (either
// AP or IBSS holder).
// Once initialized, user configuration can only be changed via OID_xxx
UCHAR BssType; // BSS_INFRA or BSS_ADHOC
#ifdef MONITOR_FLAG_11N_SNIFFER_SUPPORT
#define MONITOR_FLAG_11N_SNIFFER 0x01
UCHAR BssMonitorFlag; // Specific flag for monitor
#endif // MONITOR_FLAG_11N_SNIFFER_SUPPORT //
USHORT AtimWin; // used when starting a new IBSS
// GROUP 2 -
// User configuration loaded from Registry, E2PROM or OID_xxx. These settings describe
// the user intended configuration, and should be always applied to the final
// settings in ACTIVE BSS without compromising with the BSS holder.
// Once initialized, user configuration can only be changed via OID_xxx
UCHAR RssiTrigger;
UCHAR RssiTriggerMode; // RSSI_TRIGGERED_UPON_BELOW_THRESHOLD or RSSI_TRIGGERED_UPON_EXCCEED_THRESHOLD
USHORT DefaultListenCount; // default listen count;
ULONG WindowsPowerMode; // Power mode for AC power
ULONG WindowsBatteryPowerMode; // Power mode for battery if exists
BOOLEAN bWindowsACCAMEnable; // Enable CAM power mode when AC on
BOOLEAN bAutoReconnect; // Set to TRUE when setting OID_802_11_SSID with no matching BSSID
ULONG WindowsPowerProfile; // Windows power profile, for NDIS5.1 PnP
#ifdef AUTO_RETRY_CNT_LIMIT
ULONG AutoReconntectCnt;
#endif /* AUTO_RETRY_CNT_LIMIT */
// MIB:ieee802dot11.dot11smt(1).dot11StationConfigTable(1)
USHORT Psm; // power management mode (PWR_ACTIVE|PWR_SAVE)
USHORT DisassocReason;
UCHAR DisassocSta[MAC_ADDR_LEN];
USHORT DeauthReason;
UCHAR DeauthSta[MAC_ADDR_LEN];
USHORT AuthFailReason;
UCHAR AuthFailSta[MAC_ADDR_LEN];
NDIS_802_11_PRIVACY_FILTER PrivacyFilter; // PrivacyFilter enum for 802.1X
NDIS_802_11_AUTHENTICATION_MODE AuthMode; // This should match to whatever microsoft defined
NDIS_802_11_WEP_STATUS WepStatus;
// Add to support different cipher suite for WPA2/WPA mode
NDIS_802_11_ENCRYPTION_STATUS GroupCipher; // Multicast cipher suite
NDIS_802_11_ENCRYPTION_STATUS PairCipher; // Unicast cipher suite
BOOLEAN bMixCipher; // Indicate current Pair & Group use different cipher suites
USHORT RsnCapability;
NDIS_802_11_WEP_STATUS GroupKeyWepStatus;
UCHAR WpaPassPhrase[64]; // WPA PSK pass phrase
UINT WpaPassPhraseLen; // the length of WPA PSK pass phrase
UCHAR PMK[LEN_PMK]; // WPA PSK mode PMK
UCHAR PTK[LEN_PTK]; // WPA PSK mode PTK
UCHAR GMK[LEN_GMK]; // WPA PSK mode GMK
UCHAR GTK[MAX_LEN_GTK]; // GTK from authenticator
UCHAR GNonce[32]; // GNonce for WPA2PSK from authenticator
CIPHER_KEY TxGTK;
BSSID_INFO SavedPMK[PMKID_NO];
UINT SavedPMKNum; // Saved PMKID number
UCHAR DefaultKeyId;
// WPA 802.1x port control, WPA_802_1X_PORT_SECURED, WPA_802_1X_PORT_NOT_SECURED
UCHAR PortSecured;
// For WPA countermeasures
ULONG LastMicErrorTime; // record last MIC error time
ULONG MicErrCnt; // Should be 0, 1, 2, then reset to zero (after disassoiciation).
BOOLEAN bBlockAssoc; // Block associate attempt for 60 seconds after counter measure occurred.
// For WPA-PSK supplicant state
UINT8 WpaState; // Default is SS_NOTUSE and handled by microsoft 802.1x
UCHAR ReplayCounter[8];
UCHAR ANonce[32]; // ANonce for WPA-PSK from aurhenticator
UCHAR SNonce[32]; // SNonce for WPA-PSK
UCHAR LastSNR0; // last received BEACON's SNR
UCHAR LastSNR1; // last received BEACON's SNR for 2nd antenna
RSSI_SAMPLE RssiSample;
ULONG NumOfAvgRssiSample;
ULONG LastBeaconRxTime; // OS's timestamp of the last BEACON RX time
ULONG Last11bBeaconRxTime; // OS's timestamp of the last 11B BEACON RX time
ULONG Last11gBeaconRxTime; // OS's timestamp of the last 11G BEACON RX time
ULONG Last20NBeaconRxTime; // OS's timestamp of the last 20MHz N BEACON RX time
ULONG LastScanTime; // Record last scan time for issue BSSID_SCAN_LIST
BOOLEAN bNotFirstScan; // Sam add for ADHOC flag to do first scan when do initialization
BOOLEAN bSwRadio; // Software controlled Radio On/Off, TRUE: On
BOOLEAN bHwRadio; // Hardware controlled Radio On/Off, TRUE: On
BOOLEAN bRadio; // Radio state, And of Sw & Hw radio state
BOOLEAN bHardwareRadio; // Hardware controlled Radio enabled
BOOLEAN bShowHiddenSSID; // Show all known SSID in SSID list get operation
// New for WPA, windows want us to to keep association information and
// Fixed IEs from last association response
NDIS_802_11_ASSOCIATION_INFORMATION AssocInfo;
USHORT ReqVarIELen; // Length of next VIE include EID & Length
UCHAR ReqVarIEs[MAX_VIE_LEN]; // The content saved here should be little-endian format.
USHORT ResVarIELen; // Length of next VIE include EID & Length
UCHAR ResVarIEs[MAX_VIE_LEN];
UCHAR RSNIE_Len;
UCHAR RSN_IE[MAX_LEN_OF_RSNIE]; // The content saved here should be little-endian format.
ULONG CLBusyBytes; // Save the total bytes received durning channel load scan time
USHORT RPIDensity[8]; // Array for RPI density collection
UCHAR RMReqCnt; // Number of measurement request saved.
UCHAR CurrentRMReqIdx; // Number of measurement request saved.
BOOLEAN ParallelReq; // Parallel measurement, only one request performed,
// It must be the same channel with maximum duration
USHORT ParallelDuration; // Maximum duration for parallel measurement
UCHAR ParallelChannel; // Only one channel with parallel measurement
USHORT IAPPToken; // IAPP dialog token
// Hack for channel load and noise histogram parameters
UCHAR NHFactor; // Parameter for Noise histogram
UCHAR CLFactor; // Parameter for channel load
RALINK_TIMER_STRUCT StaQuickResponeForRateUpTimer;
BOOLEAN StaQuickResponeForRateUpTimerRunning;
UCHAR DtimCount; // 0.. DtimPeriod-1
UCHAR DtimPeriod; // default = 3
#ifdef QOS_DLS_SUPPORT
RT_802_11_DLS DLSEntry[MAX_NUM_OF_DLS_ENTRY];
UCHAR DlsReplayCounter[8];
#endif // QOS_DLS_SUPPORT //
BOOLEAN bTDLSCapable; // 0:disable TDLS, 1:enable TDLS
////////////////////////////////////////////////////////////////////////////////////////
// This is only for WHQL test.
BOOLEAN WhqlTest;
////////////////////////////////////////////////////////////////////////////////////////
RALINK_TIMER_STRUCT WpaDisassocAndBlockAssocTimer;
// Fast Roaming
BOOLEAN bAutoRoaming; // 0:disable auto roaming by RSSI, 1:enable auto roaming by RSSI
CHAR dBmToRoam; // the condition to roam when receiving Rssi less than this value. It's negative value.
#ifdef WPA_SUPPLICANT_SUPPORT
BOOLEAN IEEE8021X;
BOOLEAN IEEE8021x_required_keys;
CIPHER_KEY DesireSharedKey[4]; // Record user desired WEP keys
UCHAR DesireSharedKeyId;
// 0x00: driver ignores wpa_supplicant
// 0x01: wpa_supplicant initiates scanning and AP selection
// 0x02: driver takes care of scanning, AP selection, and IEEE 802.11 association parameters
// 0x80: wpa_supplicant trigger driver to do WPS
UCHAR WpaSupplicantUP;
UCHAR WpaSupplicantScanCount;
BOOLEAN bRSN_IE_FromWpaSupplicant;
BOOLEAN bLostAp;
UCHAR *pWpsProbeReqIe;
UINT WpsProbeReqIeLen;
UCHAR *pWpaAssocIe;
UINT WpaAssocIeLen;
#endif // WPA_SUPPLICANT_SUPPORT //
CHAR dev_name[16];
USHORT OriDevType;
BOOLEAN bTGnWifiTest;
BOOLEAN bScanReqIsFromWebUI;
HTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI.
DESIRED_TRANSMIT_SETTING DesiredTransmitSetting;
RT_HT_PHY_INFO DesiredHtPhyInfo;
BOOLEAN bAutoTxRateSwitch;
#ifdef RTMP_MAC_PCI
UCHAR BBPR3;
// PS Control has 2 meanings for advanced power save function.
// 1. EnablePSinIdle : When no connection, always radio off except need to do site survey.
// 2. EnableNewPS : will save more current in sleep or radio off mode.
PS_CONTROL PSControl;
#endif // RTMP_MAC_PCI //
#ifdef EXT_BUILD_CHANNEL_LIST
UCHAR IEEE80211dClientMode;
UCHAR StaOriCountryCode[3];
UCHAR StaOriGeography;
#endif // EXT_BUILD_CHANNEL_LIST //
BOOLEAN bAutoConnectByBssid;
ULONG BeaconLostTime; // seconds
BOOLEAN bForceTxBurst; // 1: force enble TX PACKET BURST, 0: disable
#ifdef XLINK_SUPPORT
BOOLEAN PSPXlink; // 0: Disable. 1: Enable
#endif // XLINK_SUPPORT //
BOOLEAN bAutoConnectIfNoSSID;
#ifdef DOT11_N_SUPPORT
#ifdef DOT11N_DRAFT3
UCHAR RegClass; //IE_SUPP_REG_CLASS: 2009 PF#3: For 20/40 Intolerant Channel Report
#endif // DOT11N_DRAFT3 //
BOOLEAN bAdhocN;
#endif // DOT11_N_SUPPORT //
BOOLEAN bAdhocCreator; //TRUE indicates divice is Creator.
/*
Enhancement Scanning Mechanism
To decrease the possibility of ping loss
*/
BOOLEAN bImprovedScan;
BOOLEAN BssNr;
UCHAR ScanChannelCnt; // 0 at the beginning of scan, stop at 7
UCHAR LastScanChannel;
/************************************/
BOOLEAN bFastConnect;
} STA_ADMIN_CONFIG, *PSTA_ADMIN_CONFIG;
// This data structure keep the current active BSS/IBSS's configuration that this STA
// had agreed upon joining the network. Which means these parameters are usually decided
// by the BSS/IBSS creator instead of user configuration. Data in this data structurre
// is valid only when either ADHOC_ON(pAd) or INFRA_ON(pAd) is TRUE.
// Normally, after SCAN or failed roaming attempts, we need to recover back to
// the current active settings.
typedef struct _STA_ACTIVE_CONFIG {
USHORT Aid;
USHORT AtimWin; // in kusec; IBSS parameter set element
USHORT CapabilityInfo;
USHORT CfpMaxDuration;
USHORT CfpPeriod;
// Copy supported rate from desired AP's beacon. We are trying to match
// AP's supported and extended rate settings.
UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES];
UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES];
UCHAR SupRateLen;
UCHAR ExtRateLen;
// Copy supported ht from desired AP's beacon. We are trying to match
RT_HT_PHY_INFO SupportedPhyInfo;
RT_HT_CAPABILITY SupportedHtPhy;
} STA_ACTIVE_CONFIG, *PSTA_ACTIVE_CONFIG;
#endif // CONFIG_STA_SUPPORT //
typedef struct _MAC_TABLE_ENTRY {
/*
0:Invalid,
Bit 0: AsCli, Bit 1: AsWds, Bit 2: AsAPCLI,
Bit 3: AsMesh, Bit 4: AsDls, Bit 5: AsTDls
*/
UINT32 EntryType;
BOOLEAN isCached;
BOOLEAN bIAmBadAtheros; // Flag if this is Atheros chip that has IOT problem. We need to turn on RTS/CTS protection.
/* WPA/WPA2 4-way database */
UCHAR EnqueueEapolStartTimerRunning; // Enqueue EAPoL-Start for triggering EAP SM
RALINK_TIMER_STRUCT EnqueueStartForPSKTimer; // A timer which enqueue EAPoL-Start for triggering PSK SM
//jan for wpa
// record which entry revoke MIC Failure , if it leaves the BSS itself, AP won't update aMICFailTime MIB
UCHAR CMTimerRunning;
UCHAR apidx; // MBSS number
UCHAR RSNIE_Len;
UCHAR RSN_IE[MAX_LEN_OF_RSNIE];
UCHAR ANonce[LEN_KEY_DESC_NONCE];
UCHAR SNonce[LEN_KEY_DESC_NONCE];
UCHAR R_Counter[LEN_KEY_DESC_REPLAY];
UCHAR PTK[64];
UCHAR ReTryCounter;
RALINK_TIMER_STRUCT RetryTimer;
NDIS_802_11_AUTHENTICATION_MODE AuthMode; // This should match to whatever microsoft defined
NDIS_802_11_WEP_STATUS WepStatus;
NDIS_802_11_WEP_STATUS GroupKeyWepStatus;
UINT8 WpaState;
UINT8 GTKState;
USHORT PortSecured;
NDIS_802_11_PRIVACY_FILTER PrivacyFilter; // PrivacyFilter enum for 802.1X
CIPHER_KEY PairwiseKey;
PVOID pAd;
INT PMKID_CacheIdx;
UCHAR PMKID[LEN_PMKID];
UCHAR NegotiatedAKM[LEN_OUI_SUITE]; // It indicate the negotiated AKM suite
UCHAR Addr[MAC_ADDR_LEN];
UCHAR PsMode;
SST Sst;
AUTH_STATE AuthState; // for SHARED KEY authentication state machine used only
BOOLEAN IsReassocSta; // Indicate whether this is a reassociation procedure
USHORT Aid;
USHORT CapabilityInfo;
UCHAR LastRssi;
ULONG NoDataIdleCount;
UINT16 StationKeepAliveCount; // unit: second
ULONG PsQIdleCount;
QUEUE_HEADER PsQueue;
UINT32 StaConnectTime; // the live time of this station since associated with AP
UINT32 StaIdleTimeout; /* idle timeout per entry */
#ifdef DOT11_N_SUPPORT
BOOLEAN bSendBAR;
USHORT NoBADataCountDown;
UINT32 CachedBuf[16]; // UINT (4 bytes) for alignment
#ifdef TXBF_SUPPORT
UINT TxBFCount;
COUNTER_TXBF TxBFCounters;
#endif // TXBF_SUPPORT //
#endif // DOT11_N_SUPPORT //
UINT FIFOCount;
UINT DebugFIFOCount;
UINT DebugTxCount;
BOOLEAN bDlsInit;
//====================================================
//WDS entry needs these
// if ValidAsWDS==TRUE, MatchWDSTabIdx is the index in WdsTab.MacTab
UINT MatchWDSTabIdx;
UCHAR MaxSupportedRate;
UCHAR CurrTxRate;
UCHAR CurrTxRateIndex;
//#ifdef RTMP_RBUS_SUPPORT
#ifdef NEW_RATE_ADAPT_SUPPORT
UCHAR lastRateIdx;
UCHAR fewPktsCnt;
BOOLEAN perThrdAdj;
#endif // NEW_RATE_ADAPT_SUPPORT //
UCHAR mcsGroup;//the mcs group to be tried
UCHAR lastLegalMfb;//last legal mfb which is used to set rate
BOOLEAN isMfbChanged;//purpose: true when mfb has changed but the new mfb is not adopted for Tx
PRTMP_TX_RATE_SWITCH LegalMfbRS;
BOOLEAN fLastChangeAccordingMfb;
NDIS_SPIN_LOCK fLastChangeAccordingMfbLock;
//Tx MRQ
BOOLEAN toTxMrq;
UCHAR msiToTx, mrqCnt;//mrqCnt is used to count down the inverted-BF mrq to be sent
//Rx mfb
UCHAR pendingMfsi;
//Tx MFB
BOOLEAN toTxMfb;
UCHAR mfbToTx;
#ifdef TXBF_SUPPORT
UCHAR TxSndgType;
UCHAR TxSndgBW;
UCHAR TxSndgMcs;
NDIS_SPIN_LOCK TxSndgLock;
#endif // TXBF_SUPPORT //
//ETxBF
// UCHAR legalMfbOld;
UCHAR bfState;
UCHAR bestMethod;
UCHAR mfb0, mfb1;
// BOOLEAN isTxBFOld;
BOOLEAN toTxSndg;
UCHAR sndgMcs;
UCHAR sndgBW;
UCHAR sndgRateIdx;
BOOLEAN ndpSndg;
UCHAR sndg0Mcs, bf0Mcs, sndg0RateIdx, bf0RateIdx;
INT sndg0Snr0, sndg0Snr1, sndg0Snr2;
UCHAR sndg1Mcs, bf1Mcs, sndg1RateIdx, bf1RateIdx;
INT sndg1Snr0, sndg1Snr1, sndg1Snr2;
UCHAR noSndgCnt;
UCHAR eTxBfEnCond, noSndgCntThrd, ndpSndgStreams;
BOOLEAN useNewRateAdapt;
//#endif // RTMP_RBUS_SUPPORT //
// to record the each TX rate's quality. 0 is best, the bigger the worse.
USHORT TxQuality[MAX_STEP_OF_TX_RATE_SWITCH];
// USHORT OneSecTxOkCount;
UINT32 OneSecTxNoRetryOkCount;
UINT32 OneSecTxRetryOkCount;
UINT32 OneSecTxFailCount;
UINT32 ContinueTxFailCnt;
UINT32 CurrTxRateStableTime; // # of second in current TX rate
UCHAR TxRateUpPenalty; // extra # of second penalty due to last unstable condition
#ifdef WDS_SUPPORT
BOOLEAN LockEntryTx; // TRUE = block to WDS Entry traffic, FALSE = not.
#endif // WDS_SUPPORT //
ULONG TimeStamp_toTxRing;
//====================================================
#ifdef CONFIG_STA_SUPPORT
#ifdef QOS_DLS_SUPPORT
UINT MatchDlsEntryIdx; // indicate the index in pAd- & gt; StaCfg.DLSEntry
#endif // QOS_DLS_SUPPORT //
#endif // CONFIG_STA_SUPPORT //
BOOLEAN fLastSecAccordingRSSI;
UCHAR LastSecTxRateChangeAction; // 0: no change, 1:rate UP, 2:rate down
CHAR LastTimeTxRateChangeAction; //Keep last time value of LastSecTxRateChangeAction
ULONG LastTxOkCount;
UCHAR PER[MAX_STEP_OF_TX_RATE_SWITCH];
// a bitmap of BOOLEAN flags. each bit represent an operation status of a particular
// BOOLEAN control, either ON or OFF. These flags should always be accessed via
// CLIENT_STATUS_TEST_FLAG(), CLIENT_STATUS_SET_FLAG(), CLIENT_STATUS_CLEAR_FLAG() macros.
// see fOP_STATUS_xxx in RTMP_DEF.C for detail bit definition. fCLIENT_STATUS_AMSDU_INUSED
ULONG ClientStatusFlags;
HTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI.
#ifdef DOT11_N_SUPPORT
// HT EWC MIMO-N used parameters
USHORT RXBAbitmap; // fill to on-chip RXWI_BA_BITMASK in 8.1.3RX attribute entry format
USHORT TXBAbitmap; // This bitmap as originator, only keep in software used to mark AMPDU bit in TXWI
USHORT TXAutoBAbitmap;
USHORT BADeclineBitmap;
USHORT BARecWcidArray[NUM_OF_TID]; // The mapping wcid of recipient session. if RXBAbitmap bit is masked
USHORT BAOriWcidArray[NUM_OF_TID]; // The mapping wcid of originator session. if TXBAbitmap bit is masked
USHORT BAOriSequence[NUM_OF_TID]; // The mapping wcid of originator session. if TXBAbitmap bit is masked
// 802.11n features.
UCHAR MpduDensity;
UCHAR MaxRAmpduFactor;
UCHAR AMsduSize;
UCHAR MmpsMode; // MIMO power save more.
HT_CAPABILITY_IE HTCapability;
#ifdef DOT11N_DRAFT3
UCHAR BSS2040CoexistenceMgmtSupport;
BOOLEAN bForty_Mhz_Intolerant;
#endif // DOT11N_DRAFT3 //
#endif // DOT11_N_SUPPORT //
BOOLEAN bAutoTxRateSwitch;
UCHAR RateLen;
struct _MAC_TABLE_ENTRY *pNext;
USHORT TxSeq[NUM_OF_TID];
USHORT NonQosDataSeq;
RSSI_SAMPLE RssiSample;
UINT32 LastRxRate;
BOOLEAN bWscCapable;
UCHAR Receive_EapolStart_EapRspId;
UINT32 TXMCSExpected[MAX_MCS_SET];
UINT32 TXMCSSuccessful[MAX_MCS_SET];
UINT32 TXMCSFailed[MAX_MCS_SET];
UINT32 TXMCSAutoFallBack[MAX_MCS_SET][MAX_MCS_SET];
#ifdef CONFIG_STA_SUPPORT
ULONG LastBeaconRxTime;
#endif // CONFIG_STA_SUPPORT //
ULONG AssocDeadLine;
ULONG ChannelQuality; // 0..100, Channel Quality Indication for Roaming
#ifdef VENDOR_FEATURE1_SUPPORT
// total 128B, use UINT32 to avoid alignment problem
UINT32 HeaderBuf[32]; // (total 128B) TempBuffer for TX_INFO + TX_WI + 802.11 Header + padding + AMSDU SubHeader + LLC/SNAP
UCHAR HdrPadLen; // recording Header Padding Length;
UCHAR MpduHeaderLen;
UINT16 Protocol;
#endif // VENDOR_FEATURE1_SUPPORT //
#ifdef AGS_SUPPORT
AGS_CONTROL AGSCtrl; // AGS control
#endif // AGS_SUPPORT //
} MAC_TABLE_ENTRY, *PMAC_TABLE_ENTRY;
typedef struct _MAC_TABLE {
USHORT Size;
MAC_TABLE_ENTRY *Hash[HASH_TABLE_SIZE];
MAC_TABLE_ENTRY Content[MAX_LEN_OF_MAC_TABLE];
QUEUE_HEADER McastPsQueue;
ULONG PsQIdleCount;
BOOLEAN fAnyStationInPsm;
BOOLEAN fAnyStationBadAtheros; // Check if any Station is atheros 802.11n Chip. We need to use RTS/CTS with Atheros 802,.11n chip.
BOOLEAN fAnyTxOPForceDisable; // Check if it is necessary to disable BE TxOP
BOOLEAN fAllStationAsRalink; // Check if all stations are ralink-chipset
#ifdef DOT11_N_SUPPORT
BOOLEAN fAnyStationIsLegacy; // Check if I use legacy rate to transmit to my BSS Station/
BOOLEAN fAnyStationNonGF; // Check if any Station can't support GF.
BOOLEAN fAnyStation20Only; // Check if any Station can't support GF.
BOOLEAN fAnyStationMIMOPSDynamic; // Check if any Station is MIMO Dynamic
BOOLEAN fAnyBASession; // Check if there is BA session. Force turn on RTS/CTS
BOOLEAN fAnyStaFortyIntolerant; // Check if still has any station set the Intolerant bit on!
//2008/10/28: KH add to support Antenna power-saving of AP & lt; --
//2008/10/28: KH add to support Antenna power-saving of AP-- & gt;
#endif // DOT11_N_SUPPORT //
} MAC_TABLE, *PMAC_TABLE;
#ifdef BLOCK_NET_IF
typedef struct _BLOCK_QUEUE_ENTRY
{
BOOLEAN SwTxQueueBlockFlag;
LIST_HEADER NetIfList;
} BLOCK_QUEUE_ENTRY, *PBLOCK_QUEUE_ENTRY;
#endif // BLOCK_NET_IF //
struct wificonf
{
BOOLEAN bShortGI;
BOOLEAN bGreenField;
};
typedef struct _RTMP_DEV_INFO_
{
UCHAR chipName[16];
RTMP_INF_TYPE infType;
}RTMP_DEV_INFO;
#ifdef DBG_DIAGNOSE
#define DIAGNOSE_TIME 10 // 10 sec
typedef struct _RtmpDiagStrcut_
{ // Diagnosis Related element
unsigned char inited;
unsigned char qIdx;
unsigned char ArrayStartIdx;
unsigned char ArrayCurIdx;
// Tx Related Count
USHORT TxDataCnt[DIAGNOSE_TIME];
USHORT TxFailCnt[DIAGNOSE_TIME];
// USHORT TxDescCnt[DIAGNOSE_TIME][16]; // TxDesc queue length in scale of 0~14, & gt; =15
USHORT TxDescCnt[DIAGNOSE_TIME][24]; // 3*3 // TxDesc queue length in scale of 0~14, & gt; =15
// USHORT TxMcsCnt[DIAGNOSE_TIME][16]; // TxDate MCS Count in range from 0 to 15, step in 1.
USHORT TxMcsCnt[DIAGNOSE_TIME][MAX_MCS_SET]; // 3*3
USHORT TxSWQueCnt[DIAGNOSE_TIME][9]; // TxSwQueue length in scale of 0, 1, 2, 3, 4, 5, 6, 7, & gt; =8
USHORT TxAggCnt[DIAGNOSE_TIME];
USHORT TxNonAggCnt[DIAGNOSE_TIME];
// USHORT TxAMPDUCnt[DIAGNOSE_TIME][16]; // 10 sec, TxDMA APMDU Aggregation count in range from 0 to 15, in setp of 1.
USHORT TxAMPDUCnt[DIAGNOSE_TIME][MAX_MCS_SET]; // 3*3 // 10 sec, TxDMA APMDU Aggregation count in range from 0 to 15, in setp of 1.
USHORT TxRalinkCnt[DIAGNOSE_TIME]; // TxRalink Aggregation Count in 1 sec scale.
USHORT TxAMSDUCnt[DIAGNOSE_TIME]; // TxAMSUD Aggregation Count in 1 sec scale.
// Rx Related Count
USHORT RxDataCnt[DIAGNOSE_TIME]; // Rx Total Data count.
USHORT RxCrcErrCnt[DIAGNOSE_TIME];
// USHORT RxMcsCnt[DIAGNOSE_TIME][16]; // Rx MCS Count in range from 0 to 15, step in 1.
USHORT RxMcsCnt[DIAGNOSE_TIME][MAX_MCS_SET]; // 3*3
}RtmpDiagStruct;
#endif // DBG_DIAGNOSE //
struct _RTMP_CHIP_OP_
{
/* Calibration access related callback functions */
int (*eeinit)(RTMP_ADAPTER *pAd); /* int (*eeinit)(RTMP_ADAPTER *pAd); */
int (*eeread)(RTMP_ADAPTER *pAd, USHORT offset, PUSHORT pValue); /* int (*eeread)(RTMP_ADAPTER *pAd, int offset, PUSHORT pValue); */
int (*eewrite)(RTMP_ADAPTER *pAd, USHORT offset, USHORT value); /* int (*eewrite)(RTMP_ADAPTER *pAd, int offset, USHORT value); */
/* MCU related callback functions */
int (*loadFirmware)(RTMP_ADAPTER *pAd); /* int (*loadFirmware)(RTMP_ADAPTER *pAd); */
int (*eraseFirmware)(RTMP_ADAPTER *pAd); /* int (*eraseFirmware)(RTMP_ADAPTER *pAd); */
int (*sendCommandToMcu)(RTMP_ADAPTER *pAd, BOOLEAN bNeedSpinLock, UCHAR cmd, UCHAR token, UCHAR arg0, UCHAR arg1); /* int (*sendCommandToMcu)(RTMP_ADAPTER *pAd, UCHAR cmd, UCHAR token, UCHAR arg0, UCHAR arg1); */
/* RF access related callback functions */
REG_PAIR *pRFRegTable;
REG_PAIR *pBBPRegTable;
UCHAR bbpRegTbSize;
void (*AsicRfInit)(RTMP_ADAPTER *pAd);
void (*AsicRfTurnOn)(RTMP_ADAPTER *pAd);
void (*AsicRfTurnOff)(RTMP_ADAPTER *pAd);
void (*AsicReverseRfFromSleepMode)(RTMP_ADAPTER *pAd);
void (*AsicHaltAction)(RTMP_ADAPTER *pAd);
};
#ifdef RTMP_INTERNAL_TX_ALC
//
// The number of channels for per-channel Tx power offset
//
#define NUM_OF_CH_FOR_PER_CH_TX_PWR_OFFSET 14
//
// The Tx power control using the internal ALC
//
typedef struct _TX_POWER_CONTROL
{
BOOLEAN bInternalTxALC; // Internal Tx ALC
BOOLEAN bExtendedTssiMode; // The extended TSSI mode (each channel has different Tx power if needed)
CHAR PerChTxPwrOffset[NUM_OF_CH_FOR_PER_CH_TX_PWR_OFFSET + 1]; // Per-channel Tx power offset
CHAR idxTxPowerTable; // The index of the Tx power table
CHAR RF_R12_Value; // RF R12[4:0]: Tx0 ALC
CHAR MAC_PowerDelta; // Tx power control over MAC 0x1314~0x1324
} TX_POWER_CONTROL, *PTX_POWER_CONTROL;
#endif // RTMP_INTERNAL_TX_ALC //
//
// The entry of transmit power control over MAC
//
typedef struct _TX_POWER_CONTROL_OVER_MAC_ENTRY
{
USHORT MACRegisterOffset; // MAC register offset
ULONG RegisterValue; // Register value
} TX_POWER_CONTROL_OVER_MAC_ENTRY, *PTX_POWER_CONTROL_OVER_MAC_ENTRY;
//
// The maximum registers of transmit power control
//
#define MAX_TX_PWR_CONTROL_OVER_MAC_REGISTERS 5
//
// The configuration of the transmit power control over MAC
//
typedef struct _CONFIGURATION_OF_TX_POWER_CONTROL_OVER_MAC
{
UCHAR NumOfEntries; // Number of entries
TX_POWER_CONTROL_OVER_MAC_ENTRY TxPwrCtrlOverMAC[MAX_TX_PWR_CONTROL_OVER_MAC_REGISTERS];
} CONFIGURATION_OF_TX_POWER_CONTROL_OVER_MAC, *PCONFIGURATION_OF_TX_POWER_CONTROL_OVER_MAC;
//
// The extension of the transmit power control over MAC
//
typedef struct _TX_POWER_CONTROL_EXT_OVER_MAC
{
struct
{
ULONG TxPwrCfg0; // MAC 0x1314
ULONG TxPwrCfg0Ext; // MAC 0x1390
ULONG TxPwrCfg1; // MAC 0x1318
ULONG TxPwrCfg1Ext; // MAC 0x1394
ULONG TxPwrCfg2; // MAC 0x131C
ULONG TxPwrCfg2Ext; // MAC 0x1398
ULONG TxPwrCfg3; // MAC 0x1320
ULONG TxPwrCfg3Ext; // MAC 0x139C
ULONG TxPwrCfg4; // MAC 0x1324
ULONG TxPwrCfg4Ext; // MAC 0x13A0
ULONG TxPwrCfg5; // MAC 0x1384
ULONG TxPwrCfg6; // MAC 0x1388
ULONG TxPwrCfg7; // MAC 0x13D4
ULONG TxPwrCfg8; // MAC 0x13D8
ULONG TxPwrCfg9; // MAC 0x13DC
} BW20Over2Dot4G;
struct
{
ULONG TxPwrCfg0; // MAC 0x1314
ULONG TxPwrCfg0Ext; // MAC 0x1390
ULONG TxPwrCfg1; // MAC 0x1318
ULONG TxPwrCfg1Ext; // MAC 0x1394
ULONG TxPwrCfg2; // MAC 0x131C
ULONG TxPwrCfg2Ext; // MAC 0x1398
ULONG TxPwrCfg3; // MAC 0x1320
ULONG TxPwrCfg3Ext; // MAC 0x139C
ULONG TxPwrCfg4; // MAC 0x1324
ULONG TxPwrCfg4Ext; // MAC 0x13A0
ULONG TxPwrCfg5; // MAC 0x1384
ULONG TxPwrCfg6; // MAC 0x1388
ULONG TxPwrCfg7; // MAC 0x13D4
ULONG TxPwrCfg8; // MAC 0x13D8
ULONG TxPwrCfg9; // MAC 0x13DC
} BW40Over2Dot4G;
struct
{
ULONG TxPwrCfg0; // MAC 0x1314
ULONG TxPwrCfg0Ext; // MAC 0x1390
ULONG TxPwrCfg1; // MAC 0x1318
ULONG TxPwrCfg1Ext; // MAC 0x1394
ULONG TxPwrCfg2; // MAC 0x131C
ULONG TxPwrCfg2Ext; // MAC 0x1398
ULONG TxPwrCfg3; // MAC 0x1320
ULONG TxPwrCfg3Ext; // MAC 0x139C
ULONG TxPwrCfg4; // MAC 0x1324
ULONG TxPwrCfg4Ext; // MAC 0x13A0
ULONG TxPwrCfg5; // MAC 0x1384
ULONG TxPwrCfg6; // MAC 0x1388
ULONG TxPwrCfg7; // MAC 0x13D4
ULONG TxPwrCfg8; // MAC 0x13D8
ULONG TxPwrCfg9; // MAC 0x13DC
} BW20Over5G;
struct
{
ULONG TxPwrCfg0; // MAC 0x1314
ULONG TxPwrCfg0Ext; // MAC 0x1390
ULONG TxPwrCfg1; // MAC 0x1318
ULONG TxPwrCfg1Ext; // MAC 0x1394
ULONG TxPwrCfg2; // MAC 0x131C
ULONG TxPwrCfg2Ext; // MAC 0x1398
ULONG TxPwrCfg3; // MAC 0x1320
ULONG TxPwrCfg3Ext; // MAC 0x139C
ULONG TxPwrCfg4; // MAC 0x1324
ULONG TxPwrCfg4Ext; // MAC 0x13A0
ULONG TxPwrCfg5; // MAC 0x1384
ULONG TxPwrCfg6; // MAC 0x1388
ULONG TxPwrCfg7; // MAC 0x13D4
ULONG TxPwrCfg8; // MAC 0x13D8
ULONG TxPwrCfg9; // MAC 0x13DC
} BW40Over5G;
} TX_POWER_CONTROL_EXT_OVER_MAC, *PTX_POWER_CONTROL_EXT_OVER_MAC;
//
// The miniport adapter structure
//
struct _RTMP_ADAPTER
{
PVOID OS_Cookie; // save specific structure relative to OS
PNET_DEV net_dev;
ULONG VirtualIfCnt;
RTMP_CHIP_OP chipOps;
#ifdef CONFIG_STA_SUPPORT
USHORT ThisTbttNumToNextWakeUp;
#endif // CONFIG_STA_SUPPORT //
#ifdef HOSTAPD_SUPPORT
UINT32 IoctlIF;
#endif//HOSTAPD_SUPPORT//
#ifdef INF_PPA_SUPPORT
UINT32 g_if_id;
BOOLEAN PPAEnable;
PPA_DIRECTPATH_CB *pDirectpathCb;
#endif // INF_PPA_SUPPORT //
#ifdef RTMP_MAC_PCI
/*****************************************************************************************/
/* PCI related parameters */
/*****************************************************************************************/
PUCHAR CSRBaseAddress; // PCI MMIO Base Address, all access will use
unsigned int irq_num;
#ifdef CONFIG_STA_SUPPORT
USHORT LnkCtrlBitMask;
USHORT RLnkCtrlConfiguration;
USHORT RLnkCtrlOffset;
USHORT HostLnkCtrlConfiguration;
USHORT HostLnkCtrlOffset;
USHORT PCIePowerSaveLevel;
ULONG Rt3xxHostLinkCtrl; // USed for 3090F chip
ULONG Rt3xxRalinkLinkCtrl; // USed for 3090F chip
#endif // CONFIG_STA_SUPPORT //
USHORT DeviceID; // Read from PCI config
ULONG AccessBBPFailCount;
BOOLEAN bPCIclkOff; // flag that indicate if the PICE power status in Configuration SPace..
BOOLEAN bPCIclkOffDisableTx; //
BOOLEAN brt30xxBanMcuCmd; //when = 0xff means all commands are ok to set .
BOOLEAN b3090ESpecialChip; //3090E special chip that write EEPROM 0x24=0x9280.
//ULONG CheckDmaBusyCount; // Check Interrupt Status Register Count.
UINT int_enable_reg;
UINT int_disable_mask;
UINT int_pending;
RTMP_DMABUF TxBufSpace[NUM_OF_TX_RING]; // Shared memory of all 1st pre-allocated TxBuf associated with each TXD
RTMP_DMABUF RxDescRing; // Shared memory for RX descriptors
RTMP_DMABUF TxDescRing[NUM_OF_TX_RING]; // Shared memory for Tx descriptors
RTMP_TX_RING TxRing[NUM_OF_TX_RING]; // AC0~4 + HCCA
#endif // RTMP_MAC_PCI //
NDIS_SPIN_LOCK irq_lock;
UCHAR irq_disabled;
//======Cmd Thread in PCI/RBUS/USB
CmdQ CmdQ;
NDIS_SPIN_LOCK CmdQLock; // CmdQLock spinlock
RTMP_OS_TASK cmdQTask;
/*****************************************************************************************/
/* RBUS related parameters */
/*****************************************************************************************/
/*****************************************************************************************/
/* Both PCI/USB related parameters */
/*****************************************************************************************/
//RTMP_DEV_INFO chipInfo;
RTMP_INF_TYPE infType;
/*****************************************************************************************/
/* Driver Mgmt related parameters */
/*****************************************************************************************/
RTMP_OS_TASK mlmeTask;
#ifdef RTMP_TIMER_TASK_SUPPORT
// If you want use timer task to handle the timer related jobs, enable this.
RTMP_TIMER_TASK_QUEUE TimerQ;
NDIS_SPIN_LOCK TimerQLock;
RTMP_OS_TASK timerTask;
#endif // RTMP_TIMER_TASK_SUPPORT //
/*****************************************************************************************/
/* Tx related parameters */
/*****************************************************************************************/
BOOLEAN DeQueueRunning[NUM_OF_TX_RING]; // for ensuring RTUSBDeQueuePacket get call once
NDIS_SPIN_LOCK DeQueueLock[NUM_OF_TX_RING];
// resource for software backlog queues
QUEUE_HEADER TxSwQueue[NUM_OF_TX_RING]; // 4 AC + 1 HCCA
NDIS_SPIN_LOCK TxSwQueueLock[NUM_OF_TX_RING]; // TxSwQueue spinlock
RTMP_DMABUF MgmtDescRing; // Shared memory for MGMT descriptors
RTMP_MGMT_RING MgmtRing;
NDIS_SPIN_LOCK MgmtRingLock; // Prio Ring spinlock
UCHAR LastMCUCmd;
/*****************************************************************************************/
/* Rx related parameters */
/*****************************************************************************************/
#ifdef RTMP_MAC_PCI
RTMP_RX_RING RxRing;
NDIS_SPIN_LOCK RxRingLock; // Rx Ring spinlock
#if defined(RT3090) || defined(RT3592) || defined(RT3390) || defined(RT3593)
NDIS_SPIN_LOCK McuCmdLock; //MCU Command Queue spinlock
#endif // defined(RT3090) || defined(RT3592) || defined(RT3390) || defined(RT3593) //
#endif // RTMP_MAC_PCI //
/*****************************************************************************************/
/* ASIC related parameters */
/*****************************************************************************************/
UINT32 MACVersion; // MAC version. Record rt2860C(0x28600100) or rt2860D (0x28600101)..
// ---------------------------
// E2PROM
// ---------------------------
ULONG EepromVersion; // byte 0: version, byte 1: revision, byte 2~3: unused
ULONG FirmwareVersion; // byte 0: Minor version, byte 1: Major version, otherwise unused.
USHORT EEPROMDefaultValue[NUM_EEPROM_BBP_PARMS];
UCHAR EEPROMAddressNum; // 93c46=6 93c66=8
BOOLEAN EepromAccess;
UCHAR EFuseTag;
// ---------------------------
// BBP Control
// ---------------------------
UCHAR BbpWriteLatch[BBP_MAX_IDX]; // record last BBP register value written via BBP_IO_WRITE/BBP_IO_WRITE_VY_REG_ID
CHAR BbpRssiToDbmDelta; // change from UCHAR to CHAR for high power
BBP_R66_TUNING BbpTuning;
// ----------------------------
// RFIC control
// ----------------------------
UCHAR RfIcType; // RFIC_xxx
ULONG RfFreqOffset; // Frequency offset for channel switching
#ifdef RTMP_MAC_PCI
UCHAR ShowRf; // Show RF register write for 2880
#endif // RTMP_MAC_PCI //
RTMP_RF_REGS LatchRfRegs; // latch th latest RF programming value since RF IC doesn't support READ
EEPROM_ANTENNA_STRUC Antenna; // Since ANtenna definition is different for a & g. We need to save it for future reference.
EEPROM_NIC_CONFIG2_STRUC NicConfig2;
EEPROM_NIC_CONFIG3_STRUC NicConfig3;
// This soft Rx Antenna Diversity mechanism is used only when user set
// RX Antenna = DIVERSITY ON
SOFT_RX_ANT_DIVERSITY RxAnt;
CHANNEL_TX_POWER TxPower[MAX_NUM_OF_CHANNELS]; // Store Tx power value for all channels.
CHANNEL_TX_POWER ChannelList[MAX_NUM_OF_CHANNELS]; // list all supported channels for site survey
//CHANNEL_11J_TX_POWER TxPower11J[MAX_NUM_OF_11JCHANNELS]; // 802.11j channel and bw
UCHAR ChannelListNum; // number of channel in ChannelList[]
UCHAR Bbp94;
BOOLEAN BbpForCCK;
ULONG Tx20MPwrCfgABand[MAX_TXPOWER_ARRAY_SIZE];
ULONG Tx20MPwrCfgGBand[MAX_TXPOWER_ARRAY_SIZE];
ULONG Tx40MPwrCfgABand[MAX_TXPOWER_ARRAY_SIZE];
ULONG Tx40MPwrCfgGBand[MAX_TXPOWER_ARRAY_SIZE];
BOOLEAN bAutoTxAgcA; // Enable driver auto Tx Agc control
UCHAR TssiRefA; // Store Tssi reference value as 25 temperature.
UCHAR TssiPlusBoundaryA[5]; // Tssi boundary for increase Tx power to compensate.
UCHAR TssiMinusBoundaryA[5]; // Tssi boundary for decrease Tx power to compensate.
UCHAR TxAgcStepA; // Store Tx TSSI delta increment / decrement value
CHAR TxAgcCompensateA; // Store the compensation (TxAgcStep * (idx-1))
BOOLEAN bAutoTxAgcG; // Enable driver auto Tx Agc control
UCHAR TssiRefG; // Store Tssi reference value as 25 temperature.
UCHAR TssiPlusBoundaryG[5]; // Tssi boundary for increase Tx power to compensate.
UCHAR TssiMinusBoundaryG[5]; // Tssi boundary for decrease Tx power to compensate.
UCHAR TxAgcStepG; // Store Tx TSSI delta increment / decrement value
CHAR TxAgcCompensateG; // Store the compensation (TxAgcStep * (idx-1))
#ifdef RTMP_INTERNAL_TX_ALC
TX_POWER_CONTROL TxPowerCtrl; // The Tx power control using the internal ALC
#endif // RTMP_INTERNAL_TX_ALC //
signed char BGRssiOffset0; // Store B/G RSSI#0 Offset value on EEPROM 0x46h
signed char BGRssiOffset1; // Store B/G RSSI#1 Offset value
signed char BGRssiOffset2; // Store B/G RSSI#2 Offset value
signed char ARssiOffset0; // Store A RSSI#0 Offset value on EEPROM 0x4Ah
signed char ARssiOffset1; // Store A RSSI#1 Offset value
signed char ARssiOffset2; // Store A RSSI#2 Offset value
CHAR BLNAGain; // Store B/G external LNA#0 value on EEPROM 0x44h
CHAR ALNAGain0; // Store A external LNA#0 value for ch36~64
CHAR ALNAGain1; // Store A external LNA#1 value for ch100~128
CHAR ALNAGain2; // Store A external LNA#2 value for ch132~165
#ifdef RT30xx
// for 3572
UCHAR Bbp25;
UCHAR Bbp26;
UCHAR TxMixerGain24G; // Tx mixer gain value from EEPROM to improve Tx EVM / Tx DAC, 2.4G
UCHAR TxMixerGain5G;
#endif // RT30xx //
// ----------------------------
// LED control
// ----------------------------
MCU_LEDCS_STRUC LedCntl;
USHORT Led1; // read from EEPROM 0x3c
USHORT Led2; // EEPROM 0x3e
USHORT Led3; // EEPROM 0x40
UCHAR LedIndicatorStrength;
UCHAR RssiSingalstrengthOffet;
BOOLEAN bLedOnScanning;
UCHAR LedStatus;
// ----------------------------
// MAC control
// ----------------------------
#ifdef SPECIFIC_BCN_BUF_SUPPORT
UCHAR ShrMSel;
NDIS_SPIN_LOCK ShrMemLock;
#endif // SPECIFIC_BCN_BUF_SUPPORT //
/*****************************************************************************************/
/* 802.11 related parameters */
/*****************************************************************************************/
// outgoing BEACON frame buffer and corresponding TXD
TXWI_STRUC BeaconTxWI;
PUCHAR BeaconBuf;
USHORT BeaconOffset[HW_BEACON_MAX_COUNT];
// pre-build PS-POLL and NULL frame upon link up. for efficiency purpose.
#ifdef CONFIG_STA_SUPPORT
PSPOLL_FRAME PsPollFrame;
#endif // CONFIG_STA_SUPPORT //
HEADER_802_11 NullFrame;
//=========AP===========
//=======STA===========
#ifdef CONFIG_STA_SUPPORT
// -----------------------------------------------
// STA specific configuration & operation status
// used only when pAd- & gt; OpMode == OPMODE_STA
// -----------------------------------------------
STA_ADMIN_CONFIG StaCfg; // user desired settings
STA_ACTIVE_CONFIG StaActive; // valid only when ADHOC_ON(pAd) || INFRA_ON(pAd)
CHAR nickname[IW_ESSID_MAX_SIZE+1]; // nickname, only used in the iwconfig i/f
NDIS_MEDIA_STATE PreMediaState;
#endif // CONFIG_STA_SUPPORT //
//=======Common===========
// OP mode: either AP or STA
UCHAR OpMode; // OPMODE_STA, OPMODE_AP
NDIS_MEDIA_STATE IndicateMediaState; // Base on Indication state, default is NdisMediaStateDisConnected
#ifdef PROFILE_STORE
RTMP_OS_TASK WriteDatTask;
BOOLEAN bWriteDat;
#endif // PROFILE_STORE //
#ifdef CREDENTIAL_STORE
STA_CONNECT_INFO StaCtIf;
#endif /* CREDENTIAL_STORE */
/* MAT related parameters */
// configuration: read from Registry & E2PROM
BOOLEAN bLocalAdminMAC; // Use user changed MAC
UCHAR PermanentAddress[MAC_ADDR_LEN]; // Factory default MAC address
UCHAR CurrentAddress[MAC_ADDR_LEN]; // User changed MAC address
// ------------------------------------------------------
// common configuration to both OPMODE_STA and OPMODE_AP
// ------------------------------------------------------
COMMON_CONFIG CommonCfg;
MLME_STRUCT Mlme;
// AP needs those vaiables for site survey feature.
MLME_AUX MlmeAux; // temporary settings used during MLME state machine
#if defined(AP_SCAN_SUPPORT) || defined(CONFIG_STA_SUPPORT)
BSS_TABLE ScanTab; // store the latest SCAN result
#endif
//About MacTab, the sta driver will use #0 and #1 for multicast and AP.
MAC_TABLE MacTab; // ASIC on-chip WCID entry table. At TX, ASIC always use key according to this on-chip table.
NDIS_SPIN_LOCK MacTabLock;
#ifdef DOT11_N_SUPPORT
BA_TABLE BATable;
NDIS_SPIN_LOCK BATabLock;
RALINK_TIMER_STRUCT RECBATimer;
#endif // DOT11_N_SUPPORT //
// encryption/decryption KEY tables
CIPHER_KEY SharedKey[MAX_MBSSID_NUM][4]; // STA always use SharedKey[BSS0][0..3]
// RX re-assembly buffer for fragmentation
FRAGMENT_FRAME FragFrame; // Frame storage for fragment frame
// various Counters
COUNTER_802_3 Counters8023; // 802.3 counters
COUNTER_802_11 WlanCounters; // 802.11 MIB counters
COUNTER_RALINK RalinkCounters; // Ralink propriety counters
COUNTER_DRS DrsCounters; // counters for Dynamic TX Rate Switching
PRIVATE_STRUC PrivateInfo; // Private information & counters
// flags, see fRTMP_ADAPTER_xxx flags
ULONG Flags; // Represent current device status
ULONG PSFlags; // Power Save operation flag.
ULONG MoreFlags; // Represent specific requirement
// current TX sequence #
USHORT Sequence;
// Control disconnect / connect event generation
//+++Didn't used anymore
ULONG LinkDownTime;
//---
ULONG LastRxRate;
ULONG LastTxRate;
//+++Used only for Station
BOOLEAN bConfigChanged; // Config Change flag for the same SSID setting
//---
ULONG ExtraInfo; // Extra information for displaying status
ULONG SystemErrorBitmap; // b0: E2PROM version error
//+++Didn't used anymore
ULONG MacIcVersion; // MAC/BBP serial interface issue solved after ver.D
//---
#ifdef SYSTEM_LOG_SUPPORT
// ---------------------------
// System event log
// ---------------------------
RT_802_11_EVENT_TABLE EventTab;
#endif // SYSTEM_LOG_SUPPORT //
BOOLEAN HTCEnable;
/*****************************************************************************************/
/* Statistic related parameters */
/*****************************************************************************************/
BOOLEAN bUpdateBcnCntDone;
ULONG macwd;
// ----------------------------
// DEBUG paramerts
// ----------------------------
//ULONG DebugSetting[4];
BOOLEAN bPromiscuous;
// ----------------------------
// rt2860c emulation-use Parameters
// ----------------------------
//ULONG rtsaccu[30];
//ULONG ctsaccu[30];
//ULONG cfendaccu[30];
//ULONG bacontent[16];
//ULONG rxint[RX_RING_SIZE+1];
//UCHAR rcvba[60];
BOOLEAN bLinkAdapt;
BOOLEAN bForcePrintTX;
BOOLEAN bForcePrintRX;
//BOOLEAN bDisablescanning; //defined in RT2870 USB
BOOLEAN bStaFifoTest;
BOOLEAN bProtectionTest;
BOOLEAN bHCCATest;
BOOLEAN bGenOneHCCA;
BOOLEAN bBroadComHT;
//+++Following add from RT2870 USB.
ULONG BulkOutReq;
ULONG BulkOutComplete;
ULONG BulkOutCompleteOther;
ULONG BulkOutCompleteCancel; // seems not use now?
ULONG BulkInReq;
ULONG BulkInComplete;
ULONG BulkInCompleteFail;
//---
struct wificonf WIFItestbed;
#ifdef RALINK_ATE
ATE_INFO ate;
#endif // RALINK_ATE //
#ifdef DOT11_N_SUPPORT
struct reordering_mpdu_pool mpdu_blk_pool;
#endif // DOT11_N_SUPPORT //
/* statistics count */
#ifdef LINUX
#if WIRELESS_EXT & gt; = 12
struct iw_statistics iw_stats;
#endif
struct net_device_stats stats;
#endif // LINUX //
#ifdef BLOCK_NET_IF
BLOCK_QUEUE_ENTRY blockQueueTab[NUM_OF_TX_RING];
#endif // BLOCK_NET_IF //
#ifdef MULTIPLE_CARD_SUPPORT
INT32 MC_RowID;
STRING MC_FileName[256];
#endif // MULTIPLE_CARD_SUPPORT //
ULONG TbttTickCount; /* beacon timestamp work-around */
#ifdef PCI_MSI_SUPPORT
BOOLEAN HaveMsi;
#endif // PCI_MSI_SUPPORT //
/* for detect_wmm_traffic() BE TXOP use */
ULONG OneSecondnonBEpackets; // record non BE packets per second
UCHAR is_on;
/* for detect_wmm_traffic() BE/BK TXOP use */
#define TIME_BASE (1000000/OS_HZ)
#define TIME_ONE_SECOND (1000000/TIME_BASE)
UCHAR flg_be_adjust;
ULONG be_adjust_last_time;
#ifdef NINTENDO_AP
NINDO_CTRL_BLOCK nindo_ctrl_block;
#endif // NINTENDO_AP //
#ifdef IKANOS_VX_1X0
struct IKANOS_TX_INFO IkanosTxInfo;
struct IKANOS_TX_INFO IkanosRxInfo[MAX_MBSSID_NUM + MAX_WDS_ENTRY + MAX_APCLI_NUM + MAX_MESH_NUM];
#endif // IKANOS_VX_1X0 //
#ifdef DBG_DIAGNOSE
RtmpDiagStruct DiagStruct;
#endif // DBG_DIAGNOSE //
UINT8 FlgCtsEnabled;
UINT8 PM_FlgSuspend;
#ifdef RT30xx
#ifdef RTMP_EFUSE_SUPPORT
BOOLEAN bUseEfuse;
BOOLEAN bEEPROMFile;
BOOLEAN bFroceEEPROMBuffer;
UCHAR EEPROMImage[1024];
#endif // RTMP_EFUSE_SUPPORT //
#endif // RT30xx //
#ifdef CONFIG_STA_SUPPORT
#endif // CONFIG_STA_SUPPORT //
EXT_CAP_INFO_ELEMENT ExtCapInfo;
#ifdef VENDOR_FEATURE1_SUPPORT
UCHAR FifoUpdateDone, FifoUpdateRx;
#endif // VENDOR_FEATURE1_SUPPORT //
#ifdef VENDOR_FEATURE2_SUPPORT
#define MEM_DBG_PKT_ALLOC_INC(_pAd) _pAd- & gt; NumOfPktAlloc ++
#define MEM_DBG_PKT_FREE_INC(_pAd) _pAd- & gt; NumOfPktFree ++
UINT32 NumOfPktAlloc, NumOfPktFree; // used in memory debug
#else
#define MEM_DBG_PKT_ALLOC_INC(_pAd)
#define MEM_DBG_PKT_FREE_INC(_pAd)
#endif // VENDOR_FEATURE2_SUPPORT //
#define RFIC_24GHZ 0x01
#define RFIC_5GHZ 0x02
UINT8 RFICType;
#ifdef LINUX
#ifdef RT_CFG80211_SUPPORT
VOID *pCfgDev;
VOID *pCfg80211_CB;
BOOLEAN FlgCfg80211Scanning;
BOOLEAN FlgCfg80211Connecting;
UCHAR Cfg80211_Alpha2[2];
/* function pointers used in driver.ko */
VOID (*CFG80211_Register)(
IN VOID *pAd,
IN struct device *pDev,
IN struct net_device *pNetDev);
CFG80211_FUNC_OPS;
#endif // RT_CFG80211_SUPPORT //
#endif // LINUX //
#ifdef OS_ABL_SUPPORT
#endif // OS_ABL_SUPPORT //
struct {
INT IeLen;
UCHAR *pIe;
} ProbeRespIE[MAX_LEN_OF_BSS_TABLE];
BOOLEAN bHWCoexistenceInit;
BOOLEAN bWiMaxCoexistenceOn;
BOOLEAN bMiscOn;
#ifdef DOT11_N_SUPPORT
BOOLEAN bPermitRecBaDown;
BOOLEAN bPermitMcsDown;
BOOLEAN bPermitTxBaSizeDown;
BOOLEAN bPermitTxBaDensityDown;
#endif // DOT11_N_SUPPORT //
BOOLEAN bPermitTxPowerDown;
BOOLEAN bPermitLnaGainDown;
ULONG ulConfiguration;
ULONG ulActiveCountPastPeriod; /* Record Buletooth activities in the past period */
BUSY_DEGREE BusyDegree; /* BT Device Status */
};
#ifdef RTMP_INTERNAL_TX_ALC
// The Tx power tuning entry
typedef struct _TX_POWER_TUNING_ENTRY_STRUCT
{
CHAR RF_R12_Value; // RF R12[4:0]: Tx0 ALC
CHAR MAC_PowerDelta; // Tx power control over MAC 0x1314~0x1324
} TX_POWER_TUNING_ENTRY_STRUCT, *PTX_POWER_TUNING_ENTRY_STRUCT;
// The offset of the Tx power tuning entry (zero-based array)
#define TX_POWER_TUNING_ENTRY_OFFSET 30
// The lower-bound of the Tx power tuning entry
#define LOWERBOUND_TX_POWER_TUNING_ENTRY -30
// The upper-bound of the Tx power tuning entry
#define UPPERBOUND_TX_POWER_TUNING_ENTRY 45 // zero-based array
#endif // RTMP_INTERNAL_TX_ALC //
//
// The RF DAC extension
//
typedef struct _RF_DAC_EXT_ENTRY_STRUCT
{
CHAR DAC_EEPROM; // DAC in the EEPROM
CHAR MAC_PowerDelta; // Tx power control over MAC 0x1314~0x1324
CHAR RF_R12_Value; // RF R12[4:0]: Tx0 ALC
} RF_DAC_EXT_ENTRY_STRUCT, *PRF_DAC_EXT_ENTRY_STRUCT;
#ifdef TONE_RADAR_DETECT_SUPPORT
#define DELAYINTMASK 0x0013fffb
#define INTMASK 0x0013fffb
#define IndMask 0x0013fffc
#define RadarInt 0x00100000
#else
#define DELAYINTMASK 0x0003fffb
#define INTMASK 0x0003fffb
#define IndMask 0x0003fffc
#endif // TONE_RADAR_DETECT_SUPPORT //
#define RxINT 0x00000005 // Delayed Rx or indivi rx
#define TxDataInt 0x000000fa // Delayed Tx or indivi tx
#define TxMgmtInt 0x00000102 // Delayed Tx or indivi tx
#define TxCoherent 0x00020000 // tx coherent
#define RxCoherent 0x00010000 // rx coherent
#define McuCommand 0x00000200 // mcu
#define PreTBTTInt 0x00001000 // Pre-TBTT interrupt
#define TBTTInt 0x00000800 // TBTT interrupt
#define GPTimeOutInt 0x00008000 // GPtimeout interrupt
#define AutoWakeupInt 0x00004000 // AutoWakeupInt interrupt
#define FifoStaFullInt 0x00002000 // fifo statistics full interrupt
/***************************************************************************
* Rx Path software control block related data structures
**************************************************************************/
typedef struct _RX_BLK_
{
// RXD_STRUC RxD; // sample
RT28XX_RXD_STRUC RxD;
PRXWI_STRUC pRxWI;
PHEADER_802_11 pHeader;
PNDIS_PACKET pRxPacket;
UCHAR *pData;
USHORT DataSize;
USHORT Flags;
UCHAR UserPriority; // for calculate TKIP MIC using
} RX_BLK;
#define RX_BLK_SET_FLAG(_pRxBlk, _flag) (_pRxBlk- & gt; Flags |= _flag)
#define RX_BLK_TEST_FLAG(_pRxBlk, _flag) (_pRxBlk- & gt; Flags & _flag)
#define RX_BLK_CLEAR_FLAG(_pRxBlk, _flag) (_pRxBlk- & gt; Flags & = ~(_flag))
#define fRX_WDS 0x0001
#define fRX_AMSDU 0x0002
#define fRX_ARALINK 0x0004
#define fRX_HTC 0x0008
#define fRX_PAD 0x0010
#define fRX_AMPDU 0x0020
#define fRX_QOS 0x0040
#define fRX_INFRA 0x0080
#define fRX_EAP 0x0100
#define fRX_MESH 0x0200
#define fRX_APCLI 0x0400
#define fRX_DLS 0x0800
#define fRX_WPI 0x1000
#define LENGTH_AMSDU_SUBFRAMEHEAD 14
#define LENGTH_ARALINK_SUBFRAMEHEAD 14
#define LENGTH_ARALINK_HEADER_FIELD 2
/***************************************************************************
* Tx Path software control block related data structures
**************************************************************************/
#define TX_UNKOWN_FRAME 0x00
#define TX_MCAST_FRAME 0x01
#define TX_LEGACY_FRAME 0x02
#define TX_AMPDU_FRAME 0x04
#define TX_AMSDU_FRAME 0x08
#define TX_RALINK_FRAME 0x10
#define TX_FRAG_FRAME 0x20
// Currently the sizeof(TX_BLK) is 148 bytes.
typedef struct _TX_BLK_
{
UCHAR QueIdx;
UCHAR TxFrameType; // Indicate the Transmission type of the all frames in one batch
UCHAR TotalFrameNum; // Total frame number want to send-out in one batch
USHORT TotalFragNum; // Total frame fragments required in one batch
USHORT TotalFrameLen; // Total length of all frames want to send-out in one batch
QUEUE_HEADER TxPacketList;
MAC_TABLE_ENTRY *pMacEntry; // NULL: packet with 802.11 RA field is multicast/broadcast address
HTTRANSMIT_SETTING *pTransmit;
// Following structure used for the characteristics of a specific packet.
PNDIS_PACKET pPacket;
PUCHAR pSrcBufHeader; // Reference to the head of sk_buff- & gt; data
PUCHAR pSrcBufData; // Reference to the sk_buff- & gt; data, will changed depends on hanlding progresss
UINT SrcBufLen; // Length of packet payload which not including Layer 2 header
PUCHAR pExtraLlcSnapEncap; // NULL means no extra LLC/SNAP is required
#ifndef VENDOR_FEATURE1_SUPPORT
/*
Note: Can not insert any other new parameters
between pExtraLlcSnapEncap & HeaderBuf; Or
the start address of HeaderBuf will not be aligned by 4.
But we can not change HeaderBuf[128] to HeaderBuf[32] because
many codes use HeaderBuf[index].
*/
UCHAR HeaderBuf[128]; // TempBuffer for TX_INFO + TX_WI + 802.11 Header + padding + AMSDU SubHeader + LLC/SNAP
#else
UINT32 HeaderBuffer[32]; // total 128B, use UINT32 to avoid alignment problem
UCHAR *HeaderBuf;
#endif // VENDOR_FEATURE1_SUPPORT //
UCHAR MpduHeaderLen; // 802.11 header length NOT including the padding
UCHAR HdrPadLen; // recording Header Padding Length;
UCHAR apidx; // The interface associated to this packet
UCHAR Wcid; // The MAC entry associated to this packet
UCHAR UserPriority; // priority class of packet
UCHAR FrameGap; // what kind of IFS this packet use
UCHAR MpduReqNum; // number of fragments of this frame
UCHAR TxRate; // TODO: Obsoleted? Should change to MCS?
UCHAR CipherAlg; // cipher alogrithm
PCIPHER_KEY pKey;
UCHAR KeyIdx; // Indicate the transmit key index
UINT32 Flags; //See following definitions for detail.
//YOU SHOULD NOT TOUCH IT! Following parameters are used for hardware-depended layer.
ULONG Priv; // Hardware specific value saved in here.
} TX_BLK, *PTX_BLK;
#define fTX_bRtsRequired 0x0001 // Indicate if need send RTS frame for protection. Not used in RT2860/RT2870.
#define fTX_bAckRequired 0x0002 // the packet need ack response
#define fTX_bPiggyBack 0x0004 // Legacy device use Piggback or not
#define fTX_bHTRate 0x0008 // allow to use HT rate
#define fTX_bForceNonQoS 0x0010 // force to transmit frame without WMM-QoS in HT mode
#define fTX_bAllowFrag 0x0020 // allow to fragment the packet, A-MPDU, A-MSDU, A-Ralink is not allowed to fragment
#define fTX_bMoreData 0x0040 // there are more data packets in PowerSave Queue
#define fTX_bWMM 0x0080 // QOS Data
#define fTX_bClearEAPFrame 0x0100
#define fTX_bSwEncrypt 0x0400 // this packet need to be encrypted by software before TX
#ifdef CONFIG_STA_SUPPORT
#endif // CONFIG_STA_SUPPORT //
#ifdef CLIENT_WDS
#define fTX_bClientWDSFrame 0x10000
#endif // CLIENT_WDS //
#define TX_BLK_SET_FLAG(_pTxBlk, _flag) (_pTxBlk- & gt; Flags |= _flag)
#define TX_BLK_TEST_FLAG(_pTxBlk, _flag) (((_pTxBlk- & gt; Flags & _flag) == _flag) ? 1 : 0)
#define TX_BLK_CLEAR_FLAG(_pTxBlk, _flag) (_pTxBlk- & gt; Flags & = ~(_flag))
#ifdef RT_BIG_ENDIAN
/***************************************************************************
* Endian conversion related functions
**************************************************************************/
/*
========================================================================
Routine Description:
Endian conversion of Tx/Rx descriptor .
Arguments:
pAd Pointer to our adapter
pData Pointer to Tx/Rx descriptor
DescriptorType Direction of the frame
Return Value:
None
Note:
Call this function when read or update descriptor
========================================================================
*/
static inline VOID RTMPWIEndianChange(
IN PUCHAR pData,
IN ULONG DescriptorType)
{
int size;
int i;
size = ((DescriptorType == TYPE_TXWI) ? TXWI_SIZE : RXWI_SIZE);
if(DescriptorType == TYPE_TXWI)
{
*((UINT32 *)(pData)) = SWAP32(*((UINT32 *)(pData))); // Byte 0~3
*((UINT32 *)(pData + 4)) = SWAP32(*((UINT32 *)(pData+4))); // Byte 4~7
}
else
{
for(i=0; i & lt; size/4 ; i++)
*(((UINT32 *)pData) +i) = SWAP32(*(((UINT32 *)pData)+i));
}
}
#ifdef RTMP_MAC_PCI
static inline VOID WriteBackToDescriptor(
IN PUCHAR Dest,
IN PUCHAR Src,
IN BOOLEAN DoEncrypt,
IN ULONG DescriptorType)
{
UINT32 *p1, *p2;
p1 = ((UINT32 *)Dest);
p2 = ((UINT32 *)Src);
*p1 = *p2;
*(p1+2) = *(p2+2);
*(p1+3) = *(p2+3);
*(p1+1) = *(p2+1); // Word 1; this must be written back last
}
#endif // RTMP_MAC_PCI //
/*
========================================================================
Routine Description:
Endian conversion of Tx/Rx descriptor .
Arguments:
pAd Pointer to our adapter
pData Pointer to Tx/Rx descriptor
DescriptorType Direction of the frame
Return Value:
None
Note:
Call this function when read or update descriptor
========================================================================
*/
#ifdef RTMP_MAC_PCI
static inline VOID RTMPDescriptorEndianChange(
IN PUCHAR pData,
IN ULONG DescriptorType)
{
*((UINT32 *)(pData)) = SWAP32(*((UINT32 *)(pData))); // Byte 0~3
*((UINT32 *)(pData + 8)) = SWAP32(*((UINT32 *)(pData+8))); // Byte 8~11
*((UINT32 *)(pData +12)) = SWAP32(*((UINT32 *)(pData + 12))); // Byte 12~15
*((UINT32 *)(pData + 4)) = SWAP32(*((UINT32 *)(pData + 4))); // Byte 4~7, this must be swapped last
}
#endif // RTMP_MAC_PCI //
/*
========================================================================
Routine Description:
Endian conversion of all kinds of 802.11 frames .
Arguments:
pAd Pointer to our adapter
pData Pointer to the 802.11 frame structure
Dir Direction of the frame
FromRxDoneInt Caller is from RxDone interrupt
Return Value:
None
Note:
Call this function when read or update buffer data
========================================================================
*/
static inline VOID RTMPFrameEndianChange(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pData,
IN ULONG Dir,
IN BOOLEAN FromRxDoneInt)
{
PHEADER_802_11 pFrame;
PUCHAR pMacHdr;
// swab 16 bit fields - Frame Control field
if(Dir == DIR_READ)
{
*(USHORT *)pData = SWAP16(*(USHORT *)pData);
}
pFrame = (PHEADER_802_11) pData;
pMacHdr = (PUCHAR) pFrame;
// swab 16 bit fields - Duration/ID field
*(USHORT *)(pMacHdr + 2) = SWAP16(*(USHORT *)(pMacHdr + 2));
if (pFrame- & gt; FC.Type != BTYPE_CNTL)
{
// swab 16 bit fields - Sequence Control field
*(USHORT *)(pMacHdr + 22) = SWAP16(*(USHORT *)(pMacHdr + 22));
}
if(pFrame- & gt; FC.Type == BTYPE_MGMT)
{
switch(pFrame- & gt; FC.SubType)
{
case SUBTYPE_ASSOC_REQ:
case SUBTYPE_REASSOC_REQ:
// swab 16 bit fields - CapabilityInfo field
pMacHdr += sizeof(HEADER_802_11);
*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
// swab 16 bit fields - Listen Interval field
pMacHdr += 2;
*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
break;
case SUBTYPE_ASSOC_RSP:
case SUBTYPE_REASSOC_RSP:
// swab 16 bit fields - CapabilityInfo field
pMacHdr += sizeof(HEADER_802_11);
*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
// swab 16 bit fields - Status Code field
pMacHdr += 2;
*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
// swab 16 bit fields - AID field
pMacHdr += 2;
*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
break;
case SUBTYPE_AUTH:
/* When the WEP bit is on, don't do the conversion here.
This is only shared WEP can hit this condition.
For AP, it shall do conversion after decryption.
For STA, it shall do conversion before encryption. */
if (pFrame- & gt; FC.Wep == 1)
break;
else
{
// swab 16 bit fields - Auth Alg No. field
pMacHdr += sizeof(HEADER_802_11);
*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
// swab 16 bit fields - Auth Seq No. field
pMacHdr += 2;
*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
// swab 16 bit fields - Status Code field
pMacHdr += 2;
*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
}
break;
case SUBTYPE_BEACON:
case SUBTYPE_PROBE_RSP:
// swab 16 bit fields - BeaconInterval field
pMacHdr += (sizeof(HEADER_802_11) + TIMESTAMP_LEN);
*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
// swab 16 bit fields - CapabilityInfo field
pMacHdr += sizeof(USHORT);
*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
break;
case SUBTYPE_DEAUTH:
case SUBTYPE_DISASSOC:
/* If the PMF is negotiated, those frames shall be encrypted */
if(!FromRxDoneInt & & pFrame- & gt; FC.Wep == 1)
break;
else
{
// swab 16 bit fields - Reason code field
pMacHdr += sizeof(HEADER_802_11);
*(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
}
break;
}
}
else if( pFrame- & gt; FC.Type == BTYPE_DATA )
{
}
else if(pFrame- & gt; FC.Type == BTYPE_CNTL)
{
switch(pFrame- & gt; FC.SubType)
{
case SUBTYPE_BLOCK_ACK_REQ:
{
PFRAME_BA_REQ pBAReq = (PFRAME_BA_REQ)pFrame;
*(USHORT *)( & pBAReq- & gt; BARControl) = SWAP16(*(USHORT *)( & pBAReq- & gt; BARControl));
pBAReq- & gt; BAStartingSeq.word = SWAP16(pBAReq- & gt; BAStartingSeq.word);
}
break;
case SUBTYPE_BLOCK_ACK:
// For Block Ack packet, the HT_CONTROL field is in the same offset with Addr3
*(UINT32 *)( & pFrame- & gt; Addr3[0]) = SWAP32(*(UINT32 *)( & pFrame- & gt; Addr3[0]));
break;
case SUBTYPE_ACK:
//For ACK packet, the HT_CONTROL field is in the same offset with Addr2
*(UINT32 *)( & pFrame- & gt; Addr2[0])= SWAP32(*(UINT32 *)( & pFrame- & gt; Addr2[0]));
break;
}
}
else
{
DBGPRINT(RT_DEBUG_ERROR,( " Invalid Frame Type!!!\n " ));
}
// swab 16 bit fields - Frame Control
if(Dir == DIR_WRITE)
{
*(USHORT *)pData = SWAP16(*(USHORT *)pData);
}
}
#endif // RT_BIG_ENDIAN //
/***************************************************************************
* Other static inline function definitions
**************************************************************************/
static inline VOID ConvertMulticastIP2MAC(
IN PUCHAR pIpAddr,
IN PUCHAR *ppMacAddr,
IN UINT16 ProtoType)
{
if (pIpAddr == NULL)
return;
if (ppMacAddr == NULL || *ppMacAddr == NULL)
return;
switch (ProtoType)
{
case ETH_P_IPV6:
// memset(*ppMacAddr, 0, ETH_LENGTH_OF_ADDRESS);
*(*ppMacAddr) = 0x33;
*(*ppMacAddr + 1) = 0x33;
*(*ppMacAddr + 2) = pIpAddr[12];
*(*ppMacAddr + 3) = pIpAddr[13];
*(*ppMacAddr + 4) = pIpAddr[14];
*(*ppMacAddr + 5) = pIpAddr[15];
break;
case ETH_P_IP:
default:
// memset(*ppMacAddr, 0, ETH_LENGTH_OF_ADDRESS);
*(*ppMacAddr) = 0x01;
*(*ppMacAddr + 1) = 0x00;
*(*ppMacAddr + 2) = 0x5e;
*(*ppMacAddr + 3) = pIpAddr[1] & 0x7f;
*(*ppMacAddr + 4) = pIpAddr[2];
*(*ppMacAddr + 5) = pIpAddr[3];
break;
}
return;
}
char *GetPhyMode(int Mode);
char* GetBW(int BW);
BOOLEAN RTMPCheckForHang(
IN NDIS_HANDLE MiniportAdapterContext);
//
// Private routines in rtmp_init.c
//
NDIS_STATUS RTMPAllocAdapterBlock(
IN PVOID handle,
OUT PRTMP_ADAPTER *ppAdapter);
NDIS_STATUS RTMPAllocTxRxRingMemory(
IN PRTMP_ADAPTER pAd);
#ifdef RESOURCE_PRE_ALLOC
NDIS_STATUS RTMPInitTxRxRingMemory(
IN RTMP_ADAPTER *pAd);
#endif // RESOURCE_PRE_ALLOC //
NDIS_STATUS RTMPReadParametersHook(
IN PRTMP_ADAPTER pAd);
NDIS_STATUS RTMPSetProfileParameters(
IN RTMP_ADAPTER *pAd,
IN PSTRING pBuffer);
INT RTMPGetKeyParameter(
IN PSTRING key,
OUT PSTRING dest,
IN INT destsize,
IN PSTRING buffer,
IN BOOLEAN bTrimSpace);
VOID RTMPFreeAdapter(
IN PRTMP_ADAPTER pAd);
#ifdef RTMP_RF_RW_SUPPORT
VOID NICInitRFRegisters(
IN PRTMP_ADAPTER pAd);
VOID RtmpChipOpsRFHook(
IN RTMP_ADAPTER *pAd);
NDIS_STATUS RT30xxWriteRFRegister(
IN PRTMP_ADAPTER pAd,
IN UCHAR regID,
IN UCHAR value);
NDIS_STATUS RT30xxReadRFRegister(
IN PRTMP_ADAPTER pAd,
IN UCHAR regID,
IN PUCHAR pValue);
#endif // RTMP_RF_RW_SUPPORT //
VOID NICReadEEPROMParameters(
IN PRTMP_ADAPTER pAd,
IN PSTRING mac_addr);
VOID NICInitAsicFromEEPROM(
IN PRTMP_ADAPTER pAd);
NDIS_STATUS NICInitializeAdapter(
IN PRTMP_ADAPTER pAd,
IN BOOLEAN bHardReset);
NDIS_STATUS NICInitializeAsic(
IN PRTMP_ADAPTER pAd,
IN BOOLEAN bHardReset);
VOID RTMPRingCleanUp(
IN PRTMP_ADAPTER pAd,
IN UCHAR RingType);
VOID UserCfgExit(
IN RTMP_ADAPTER *pAd);
VOID UserCfgInit(
IN PRTMP_ADAPTER pAd);
NDIS_STATUS NICLoadFirmware(
IN PRTMP_ADAPTER pAd);
VOID NICEraseFirmware(
IN PRTMP_ADAPTER pAd);
NDIS_STATUS NICLoadRateSwitchingParams(
IN PRTMP_ADAPTER pAd);
VOID NICUpdateFifoStaCounters(
IN PRTMP_ADAPTER pAd);
VOID NICUpdateRawCounters(
IN PRTMP_ADAPTER pAd);
VOID RTMPZeroMemory(
IN PVOID pSrc,
IN ULONG Length);
ULONG RTMPCompareMemory(
IN PVOID pSrc1,
IN PVOID pSrc2,
IN ULONG Length);
VOID RTMPMoveMemory(
OUT PVOID pDest,
IN PVOID pSrc,
IN ULONG Length);
VOID AtoH(
PSTRING src,
PUCHAR dest,
int destlen);
UCHAR BtoH(
char ch);
VOID RTMPInitTimer(
IN PRTMP_ADAPTER pAd,
IN PRALINK_TIMER_STRUCT pTimer,
IN PVOID pTimerFunc,
IN PVOID pData,
IN BOOLEAN Repeat);
VOID RTMPSetTimer(
IN PRALINK_TIMER_STRUCT pTimer,
IN ULONG Value);
VOID RTMPModTimer(
IN PRALINK_TIMER_STRUCT pTimer,
IN ULONG Value);
VOID RTMPCancelTimer(
IN PRALINK_TIMER_STRUCT pTimer,
OUT BOOLEAN *pCancelled);
#ifdef LED_CONTROL_SUPPORT
VOID RTMPSetLED(
IN PRTMP_ADAPTER pAd,
IN UCHAR Status);
VOID RTMPSetSignalLED(
IN PRTMP_ADAPTER pAd,
IN NDIS_802_11_RSSI Dbm);
#endif // LED_CONTROL_SUPPORT //
VOID RTMPEnableRxTx(
IN PRTMP_ADAPTER pAd);
//
// prototype in action.c
//
VOID ActionStateMachineInit(
IN PRTMP_ADAPTER pAd,
IN STATE_MACHINE *S,
OUT STATE_MACHINE_FUNC Trans[]);
VOID MlmeADDBAAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID MlmeDELBAAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID MlmeDLSAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID MlmeInvalidAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID MlmeQOSAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
#ifdef DOT11_N_SUPPORT
VOID PeerAddBAReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerAddBARspAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerDelBAAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerBAAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
#endif // DOT11_N_SUPPORT //
VOID SendPSMPAction(
IN PRTMP_ADAPTER pAd,
IN UCHAR Wcid,
IN UCHAR Psmp);
VOID PeerRMAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerPublicAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
#ifdef CONFIG_STA_SUPPORT
VOID StaPublicAction(
IN PRTMP_ADAPTER pAd,
IN BSS_2040_COEXIST_IE *pBss2040CoexIE);
#endif // CONFIG_STA_SUPPORT //
VOID PeerBSSTranAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
#ifdef DOT11_N_SUPPORT
VOID PeerHTAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
#endif // DOT11_N_SUPPORT //
VOID PeerQOSAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
#ifdef QOS_DLS_SUPPORT
VOID PeerDLSAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
#endif // QOS_DLS_SUPPORT //
#ifdef CONFIG_STA_SUPPORT
#ifdef QOS_DLS_SUPPORT
VOID DlsParmFill(
IN PRTMP_ADAPTER pAd,
IN OUT MLME_DLS_REQ_STRUCT *pDlsReq,
IN PRT_802_11_DLS pDls,
IN USHORT reason);
#endif // QOS_DLS_SUPPORT //
#endif // CONFIG_STA_SUPPORT //
#ifdef DOT11_N_SUPPORT
VOID RECBATimerTimeout(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID ORIBATimerTimeout(
IN PRTMP_ADAPTER pAd);
VOID SendRefreshBAR(
IN PRTMP_ADAPTER pAd,
IN MAC_TABLE_ENTRY *pEntry);
#ifdef DOT11N_DRAFT3
VOID RTMP_11N_D3_TimerInit(
IN PRTMP_ADAPTER pAd);
VOID SendBSS2040CoexistMgmtAction(
IN PRTMP_ADAPTER pAd,
IN UCHAR Wcid,
IN UCHAR apidx,
IN UCHAR InfoReq);
VOID SendNotifyBWActionFrame(
IN PRTMP_ADAPTER pAd,
IN UCHAR Wcid,
IN UCHAR apidx);
BOOLEAN ChannelSwitchSanityCheck(
IN PRTMP_ADAPTER pAd,
IN UCHAR Wcid,
IN UCHAR NewChannel,
IN UCHAR Secondary);
VOID ChannelSwitchAction(
IN PRTMP_ADAPTER pAd,
IN UCHAR Wcid,
IN UCHAR Channel,
IN UCHAR Secondary);
ULONG BuildIntolerantChannelRep(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pDest);
VOID Update2040CoexistFrameAndNotify(
IN PRTMP_ADAPTER pAd,
IN UCHAR Wcid,
IN BOOLEAN bAddIntolerantCha);
VOID Send2040CoexistAction(
IN PRTMP_ADAPTER pAd,
IN UCHAR Wcid,
IN BOOLEAN bAddIntolerantCha);
VOID UpdateBssScanParm(
IN PRTMP_ADAPTER pAd,
IN OVERLAP_BSS_SCAN_IE APBssScan);
#endif // DOT11N_DRAFT3 //
#endif // DOT11_N_SUPPORT //
VOID ActHeaderInit(
IN PRTMP_ADAPTER pAd,
IN OUT PHEADER_802_11 pHdr80211,
IN PUCHAR Addr1,
IN PUCHAR Addr2,
IN PUCHAR Addr3);
VOID BarHeaderInit(
IN PRTMP_ADAPTER pAd,
IN OUT PFRAME_BAR pCntlBar,
IN PUCHAR pDA,
IN PUCHAR pSA);
VOID InsertActField(
IN PRTMP_ADAPTER pAd,
OUT PUCHAR pFrameBuf,
OUT PULONG pFrameLen,
IN UINT8 Category,
IN UINT8 ActCode);
BOOLEAN QosBADataParse(
IN PRTMP_ADAPTER pAd,
IN BOOLEAN bAMSDU,
IN PUCHAR p8023Header,
IN UCHAR WCID,
IN UCHAR TID,
IN USHORT Sequence,
IN UCHAR DataOffset,
IN USHORT Datasize,
IN UINT CurRxIndex);
#ifdef DOT11_N_SUPPORT
BOOLEAN CntlEnqueueForRecv(
IN PRTMP_ADAPTER pAd,
IN ULONG Wcid,
IN ULONG MsgLen,
IN PFRAME_BA_REQ pMsg);
VOID BaAutoManSwitch(
IN PRTMP_ADAPTER pAd);
#endif // DOT11_N_SUPPORT //
VOID HTIOTCheck(
IN PRTMP_ADAPTER pAd,
IN UCHAR BatRecIdx);
//
// Private routines in rtmp_data.c
//
BOOLEAN RTMPHandleTxRingDmaDoneInterrupt(
IN PRTMP_ADAPTER pAd,
IN INT_SOURCE_CSR_STRUC TxRingBitmap);
VOID RTMPHandleMgmtRingDmaDoneInterrupt(
IN PRTMP_ADAPTER pAd);
VOID RTMPHandleTBTTInterrupt(
IN PRTMP_ADAPTER pAd);
VOID RTMPHandlePreTBTTInterrupt(
IN PRTMP_ADAPTER pAd);
void RTMPHandleTwakeupInterrupt(
IN PRTMP_ADAPTER pAd);
VOID RTMPHandleRxCoherentInterrupt(
IN PRTMP_ADAPTER pAd);
NDIS_STATUS Sniff2BytesFromNdisBuffer(
IN PNDIS_BUFFER pFirstBuffer,
IN UCHAR DesiredOffset,
OUT PUCHAR pByte0,
OUT PUCHAR pByte1);
NDIS_STATUS STASendPacket(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket);
VOID STASendPackets(
IN NDIS_HANDLE MiniportAdapterContext,
IN PPNDIS_PACKET ppPacketArray,
IN UINT NumberOfPackets);
VOID RTMPDeQueuePacket(
IN PRTMP_ADAPTER pAd,
IN BOOLEAN bIntContext,
IN UCHAR QueIdx,
IN UCHAR Max_Tx_Packets);
NDIS_STATUS RTMPHardTransmit(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket,
IN UCHAR QueIdx,
OUT PULONG pFreeTXDLeft);
NDIS_STATUS STAHardTransmit(
IN PRTMP_ADAPTER pAd,
IN TX_BLK *pTxBlk,
IN UCHAR QueIdx);
VOID STARxEAPOLFrameIndicate(
IN PRTMP_ADAPTER pAd,
IN MAC_TABLE_ENTRY *pEntry,
IN RX_BLK *pRxBlk,
IN UCHAR FromWhichBSSID);
NDIS_STATUS RTMPFreeTXDRequest(
IN PRTMP_ADAPTER pAd,
IN UCHAR RingType,
IN UCHAR NumberRequired,
IN PUCHAR FreeNumberIs);
NDIS_STATUS MlmeHardTransmit(
IN PRTMP_ADAPTER pAd,
IN UCHAR QueIdx,
IN PNDIS_PACKET pPacket);
NDIS_STATUS MlmeHardTransmitMgmtRing(
IN PRTMP_ADAPTER pAd,
IN UCHAR QueIdx,
IN PNDIS_PACKET pPacket);
#ifdef RTMP_MAC_PCI
NDIS_STATUS MlmeHardTransmitTxRing(
IN PRTMP_ADAPTER pAd,
IN UCHAR QueIdx,
IN PNDIS_PACKET pPacket);
NDIS_STATUS MlmeDataHardTransmit(
IN PRTMP_ADAPTER pAd,
IN UCHAR QueIdx,
IN PNDIS_PACKET pPacket);
VOID RTMPWriteTxDescriptor(
IN PRTMP_ADAPTER pAd,
IN PTXD_STRUC pTxD,
IN BOOLEAN bWIV,
IN UCHAR QSEL);
#endif // RTMP_MAC_PCI //
USHORT RTMPCalcDuration(
IN PRTMP_ADAPTER pAd,
IN UCHAR Rate,
IN ULONG Size);
VOID RTMPWriteTxWI(
IN PRTMP_ADAPTER pAd,
IN PTXWI_STRUC pTxWI,
IN BOOLEAN FRAG,
IN BOOLEAN CFACK,
IN BOOLEAN InsTimestamp,
IN BOOLEAN AMPDU,
IN BOOLEAN Ack,
IN BOOLEAN NSeq, // HW new a sequence.
IN UCHAR BASize,
IN UCHAR WCID,
IN ULONG Length,
IN UCHAR PID,
IN UCHAR TID,
IN UCHAR TxRate,
IN UCHAR Txopmode,
IN BOOLEAN CfAck,
IN HTTRANSMIT_SETTING *pTransmit);
VOID RTMPWriteTxWI_Data(
IN PRTMP_ADAPTER pAd,
IN OUT PTXWI_STRUC pTxWI,
IN TX_BLK *pTxBlk);
VOID RTMPWriteTxWI_Cache(
IN PRTMP_ADAPTER pAd,
IN OUT PTXWI_STRUC pTxWI,
IN TX_BLK *pTxBlk);
VOID RTMPSuspendMsduTransmission(
IN PRTMP_ADAPTER pAd);
VOID RTMPResumeMsduTransmission(
IN PRTMP_ADAPTER pAd);
NDIS_STATUS MiniportMMRequest(
IN PRTMP_ADAPTER pAd,
IN UCHAR QueIdx,
IN PUCHAR pData,
IN UINT Length);
VOID RTMPSendNullFrame(
IN PRTMP_ADAPTER pAd,
IN UCHAR TxRate,
IN BOOLEAN bQosNull);
#ifdef CONFIG_STA_SUPPORT
VOID RTMPReportMicError(
IN PRTMP_ADAPTER pAd,
IN PCIPHER_KEY pWpaKey);
VOID WpaMicFailureReportFrame(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID WpaDisassocApAndBlockAssoc(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID WpaStaPairwiseKeySetting(
IN PRTMP_ADAPTER pAd);
VOID WpaStaGroupKeySetting(
IN PRTMP_ADAPTER pAd);
VOID WpaSendEapolStart(
IN PRTMP_ADAPTER pAdapter,
IN PUCHAR pBssid);
#endif // CONFIG_STA_SUPPORT //
NDIS_STATUS RTMPAllocateNdisPacket(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET *pPacket,
IN PUCHAR pHeader,
IN UINT HeaderLen,
IN PUCHAR pData,
IN UINT DataLen);
VOID RTMPFreeNdisPacket(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket);
BOOLEAN RTMPFreeTXDUponTxDmaDone(
IN PRTMP_ADAPTER pAd,
IN UCHAR QueIdx);
BOOLEAN RTMPCheckEtherType(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket,
IN PMAC_TABLE_ENTRY pMacEntry,
OUT PUCHAR pUserPriority,
OUT PUCHAR pQueIdx);
VOID RTMPCckBbpTuning(
IN PRTMP_ADAPTER pAd,
IN UINT TxRate);
//
// MLME routines
//
// Asic/RF/BBP related functions
VOID AsicAdjustTxPower(
IN PRTMP_ADAPTER pAd);
VOID AsicUpdateProtect(
IN PRTMP_ADAPTER pAd,
IN USHORT OperaionMode,
IN UCHAR SetMask,
IN BOOLEAN bDisableBGProtect,
IN BOOLEAN bNonGFExist);
VOID AsicBBPAdjust(
IN RTMP_ADAPTER *pAd);
VOID AsicSwitchChannel(
IN PRTMP_ADAPTER pAd,
IN UCHAR Channel,
IN BOOLEAN bScan);
VOID AsicLockChannel(
IN PRTMP_ADAPTER pAd,
IN UCHAR Channel) ;
VOID AsicAntennaSelect(
IN PRTMP_ADAPTER pAd,
IN UCHAR Channel);
#ifdef CONFIG_STA_SUPPORT
VOID AsicResetBBPAgent(
IN PRTMP_ADAPTER pAd);
VOID AsicSleepThenAutoWakeup(
IN PRTMP_ADAPTER pAd,
IN USHORT TbttNumToNextWakeUp);
VOID AsicForceSleep(
IN PRTMP_ADAPTER pAd);
VOID AsicForceWakeup(
IN PRTMP_ADAPTER pAd,
IN BOOLEAN bFromTx);
#endif // CONFIG_STA_SUPPORT //
VOID AsicSetBssid(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pBssid);
VOID AsicSetMcastWC(
IN PRTMP_ADAPTER pAd);
VOID AsicDelWcidTab(
IN PRTMP_ADAPTER pAd,
IN UCHAR Wcid);
#ifdef DOT11_N_SUPPORT
VOID AsicEnableRDG(
IN PRTMP_ADAPTER pAd);
VOID AsicDisableRDG(
IN PRTMP_ADAPTER pAd);
#endif // DOT11_N_SUPPORT //
VOID AsicDisableSync(
IN PRTMP_ADAPTER pAd);
VOID AsicEnableBssSync(
IN PRTMP_ADAPTER pAd);
VOID AsicEnableIbssSync(
IN PRTMP_ADAPTER pAd);
VOID AsicSetEdcaParm(
IN PRTMP_ADAPTER pAd,
IN PEDCA_PARM pEdcaParm);
VOID AsicSetSlotTime(
IN PRTMP_ADAPTER pAd,
IN BOOLEAN bUseShortSlotTime);
//
// Update the Tx chain address
//
// Parameters
// pAd: The adapter data structure
// pMacAddress: The MAC address of the peer STA
//
// Return Value:
// None
//
VOID AiscUpdateTxChainAddress(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pMacAddress);
VOID AsicAddSharedKeyEntry(
IN PRTMP_ADAPTER pAd,
IN UCHAR BssIndex,
IN UCHAR KeyIdx,
IN PCIPHER_KEY pCipherKey);
VOID AsicRemoveSharedKeyEntry(
IN PRTMP_ADAPTER pAd,
IN UCHAR BssIndex,
IN UCHAR KeyIdx);
VOID AsicUpdateWCIDIVEIV(
IN PRTMP_ADAPTER pAd,
IN USHORT WCID,
IN ULONG uIV,
IN ULONG uEIV);
VOID AsicUpdateRxWCIDTable(
IN PRTMP_ADAPTER pAd,
IN USHORT WCID,
IN PUCHAR pAddr);
VOID AsicUpdateWcidAttributeEntry(
IN PRTMP_ADAPTER pAd,
IN UCHAR BssIdx,
IN UCHAR KeyIdx,
IN UCHAR CipherAlg,
IN UINT8 Wcid,
IN UINT8 KeyTabFlag);
VOID AsicAddPairwiseKeyEntry(
IN PRTMP_ADAPTER pAd,
IN UCHAR WCID,
IN PCIPHER_KEY pCipherKey);
VOID AsicRemovePairwiseKeyEntry(
IN PRTMP_ADAPTER pAd,
IN UCHAR Wcid);
BOOLEAN AsicSendCommandToMcu(
IN PRTMP_ADAPTER pAd,
IN BOOLEAN bNeedSpinLock,
IN UCHAR Command,
IN UCHAR Token,
IN UCHAR Arg0,
IN UCHAR Arg1);
#ifdef RTMP_MAC_PCI
BOOLEAN AsicCheckCommanOk(
IN PRTMP_ADAPTER pAd,
IN UCHAR Command);
#endif // RTMP_MAC_PCI //
VOID MacAddrRandomBssid(
IN PRTMP_ADAPTER pAd,
OUT PUCHAR pAddr);
VOID MgtMacHeaderInit(
IN PRTMP_ADAPTER pAd,
IN OUT PHEADER_802_11 pHdr80211,
IN UCHAR SubType,
IN UCHAR ToDs,
IN PUCHAR pDA,
IN PUCHAR pBssid);
VOID MlmeRadioOff(
IN PRTMP_ADAPTER pAd);
VOID MlmeRadioOn(
IN PRTMP_ADAPTER pAd);
VOID BssTableInit(
IN BSS_TABLE *Tab);
#ifdef DOT11_N_SUPPORT
VOID BATableInit(
IN PRTMP_ADAPTER pAd,
IN BA_TABLE *Tab);
VOID BATableExit(
IN RTMP_ADAPTER *pAd);
#endif // DOT11_N_SUPPORT //
ULONG BssTableSearch(
IN BSS_TABLE *Tab,
IN PUCHAR pBssid,
IN UCHAR Channel);
ULONG BssSsidTableSearch(
IN BSS_TABLE *Tab,
IN PUCHAR pBssid,
IN PUCHAR pSsid,
IN UCHAR SsidLen,
IN UCHAR Channel);
ULONG BssTableSearchWithSSID(
IN BSS_TABLE *Tab,
IN PUCHAR Bssid,
IN PUCHAR pSsid,
IN UCHAR SsidLen,
IN UCHAR Channel);
ULONG BssSsidTableSearchBySSID(
IN BSS_TABLE *Tab,
IN PUCHAR pSsid,
IN UCHAR SsidLen);
VOID BssTableDeleteEntry(
IN OUT PBSS_TABLE pTab,
IN PUCHAR pBssid,
IN UCHAR Channel);
VOID BssEntrySet(
IN PRTMP_ADAPTER pAd,
OUT PBSS_ENTRY pBss,
IN PUCHAR pBssid,
IN CHAR Ssid[],
IN UCHAR SsidLen,
IN UCHAR BssType,
IN USHORT BeaconPeriod,
IN PCF_PARM CfParm,
IN USHORT AtimWin,
IN USHORT CapabilityInfo,
IN UCHAR SupRate[],
IN UCHAR SupRateLen,
IN UCHAR ExtRate[],
IN UCHAR ExtRateLen,
IN HT_CAPABILITY_IE *pHtCapability,
IN ADD_HT_INFO_IE *pAddHtInfo, // AP might use this additional ht info IE
IN UCHAR HtCapabilityLen,
IN UCHAR AddHtInfoLen,
IN UCHAR NewExtChanOffset,
IN UCHAR Channel,
IN CHAR Rssi,
IN LARGE_INTEGER TimeStamp,
IN UCHAR CkipFlag,
IN PEDCA_PARM pEdcaParm,
IN PQOS_CAPABILITY_PARM pQosCapability,
IN PQBSS_LOAD_PARM pQbssLoad,
IN USHORT LengthVIE,
IN PNDIS_802_11_VARIABLE_IEs pVIE);
ULONG BssTableSetEntry(
IN PRTMP_ADAPTER pAd,
OUT PBSS_TABLE pTab,
IN PUCHAR pBssid,
IN CHAR Ssid[],
IN UCHAR SsidLen,
IN UCHAR BssType,
IN USHORT BeaconPeriod,
IN CF_PARM *CfParm,
IN USHORT AtimWin,
IN USHORT CapabilityInfo,
IN UCHAR SupRate[],
IN UCHAR SupRateLen,
IN UCHAR ExtRate[],
IN UCHAR ExtRateLen,
IN HT_CAPABILITY_IE *pHtCapability,
IN ADD_HT_INFO_IE *pAddHtInfo, // AP might use this additional ht info IE
IN UCHAR HtCapabilityLen,
IN UCHAR AddHtInfoLen,
IN UCHAR NewExtChanOffset,
IN UCHAR Channel,
IN CHAR Rssi,
IN LARGE_INTEGER TimeStamp,
IN UCHAR CkipFlag,
IN PEDCA_PARM pEdcaParm,
IN PQOS_CAPABILITY_PARM pQosCapability,
IN PQBSS_LOAD_PARM pQbssLoad,
IN USHORT LengthVIE,
IN PNDIS_802_11_VARIABLE_IEs pVIE);
#ifdef DOT11_N_SUPPORT
VOID BATableInsertEntry(
IN PRTMP_ADAPTER pAd,
IN USHORT Aid,
IN USHORT TimeOutValue,
IN USHORT StartingSeq,
IN UCHAR TID,
IN UCHAR BAWinSize,
IN UCHAR OriginatorStatus,
IN BOOLEAN IsRecipient);
#ifdef DOT11N_DRAFT3
VOID Bss2040CoexistTimeOut(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID TriEventInit(
IN PRTMP_ADAPTER pAd);
INT TriEventTableSetEntry(
IN PRTMP_ADAPTER pAd,
OUT TRIGGER_EVENT_TAB *Tab,
IN PUCHAR pBssid,
IN HT_CAPABILITY_IE *pHtCapability,
IN UCHAR HtCapabilityLen,
IN UCHAR RegClass,
IN UCHAR ChannelNo);
#endif // DOT11N_DRAFT3 //
#endif // DOT11_N_SUPPORT //
VOID BssTableSsidSort(
IN PRTMP_ADAPTER pAd,
OUT BSS_TABLE *OutTab,
IN CHAR Ssid[],
IN UCHAR SsidLen);
VOID BssTableSortByRssi(
IN OUT BSS_TABLE *OutTab);
VOID BssCipherParse(
IN OUT PBSS_ENTRY pBss);
NDIS_STATUS MlmeQueueInit(
IN MLME_QUEUE *Queue);
VOID MlmeQueueDestroy(
IN MLME_QUEUE *Queue);
BOOLEAN MlmeEnqueue(
IN PRTMP_ADAPTER pAd,
IN ULONG Machine,
IN ULONG MsgType,
IN ULONG MsgLen,
IN VOID *Msg,
IN ULONG Priv);
BOOLEAN MlmeEnqueueForRecv(
IN PRTMP_ADAPTER pAd,
IN ULONG Wcid,
IN ULONG TimeStampHigh,
IN ULONG TimeStampLow,
IN UCHAR Rssi0,
IN UCHAR Rssi1,
IN UCHAR Rssi2,
IN ULONG MsgLen,
IN PVOID Msg,
IN UCHAR Signal);
BOOLEAN MlmeDequeue(
IN MLME_QUEUE *Queue,
OUT MLME_QUEUE_ELEM **Elem);
VOID MlmeRestartStateMachine(
IN PRTMP_ADAPTER pAd);
BOOLEAN MlmeQueueEmpty(
IN MLME_QUEUE *Queue);
BOOLEAN MlmeQueueFull(
IN MLME_QUEUE *Queue);
BOOLEAN MsgTypeSubst(
IN PRTMP_ADAPTER pAd,
IN PFRAME_802_11 pFrame,
OUT INT *Machine,
OUT INT *MsgType);
VOID StateMachineInit(
IN STATE_MACHINE *Sm,
IN STATE_MACHINE_FUNC Trans[],
IN ULONG StNr,
IN ULONG MsgNr,
IN STATE_MACHINE_FUNC DefFunc,
IN ULONG InitState,
IN ULONG Base);
VOID StateMachineSetAction(
IN STATE_MACHINE *S,
IN ULONG St,
ULONG Msg,
IN STATE_MACHINE_FUNC F);
VOID StateMachinePerformAction(
IN PRTMP_ADAPTER pAd,
IN STATE_MACHINE *S,
IN MLME_QUEUE_ELEM *Elem,
IN ULONG CurrState);
VOID Drop(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID AssocStateMachineInit(
IN PRTMP_ADAPTER pAd,
IN STATE_MACHINE *Sm,
OUT STATE_MACHINE_FUNC Trans[]);
VOID ReassocTimeout(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID AssocTimeout(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID DisassocTimeout(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
//----------------------------------------------
VOID MlmeDisassocReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID MlmeAssocReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID MlmeReassocReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID MlmeDisassocReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerAssocRspAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerReassocRspAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerDisassocAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID DisassocTimeoutAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID AssocTimeoutAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID ReassocTimeoutAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID Cls3errAction(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pAddr);
VOID InvalidStateWhenAssoc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID InvalidStateWhenReassoc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID InvalidStateWhenDisassociate(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID ComposePsPoll(
IN PRTMP_ADAPTER pAd);
VOID ComposeNullFrame(
IN PRTMP_ADAPTER pAd);
VOID AssocPostProc(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pAddr2,
IN USHORT CapabilityInfo,
IN USHORT Aid,
IN UCHAR SupRate[],
IN UCHAR SupRateLen,
IN UCHAR ExtRate[],
IN UCHAR ExtRateLen,
IN PEDCA_PARM pEdcaParm,
IN HT_CAPABILITY_IE *pHtCapability,
IN UCHAR HtCapabilityLen,
IN ADD_HT_INFO_IE *pAddHtInfo);
VOID AuthStateMachineInit(
IN PRTMP_ADAPTER pAd,
IN PSTATE_MACHINE sm,
OUT STATE_MACHINE_FUNC Trans[]);
VOID AuthTimeout(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID MlmeAuthReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerAuthRspAtSeq2Action(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerAuthRspAtSeq4Action(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID AuthTimeoutAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID Cls2errAction(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pAddr);
VOID MlmeDeauthReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID InvalidStateWhenAuth(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
//=============================================
VOID AuthRspStateMachineInit(
IN PRTMP_ADAPTER pAd,
IN PSTATE_MACHINE Sm,
IN STATE_MACHINE_FUNC Trans[]);
VOID PeerDeauthAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerAuthSimpleRspGenAndSend(
IN PRTMP_ADAPTER pAd,
IN PHEADER_802_11 pHdr80211,
IN USHORT Alg,
IN USHORT Seq,
IN USHORT Reason,
IN USHORT Status);
//
// Private routines in dls.c
//
#ifdef CONFIG_STA_SUPPORT
#ifdef QOS_DLS_SUPPORT
void DlsStateMachineInit(
IN PRTMP_ADAPTER pAd,
IN STATE_MACHINE *Sm,
OUT STATE_MACHINE_FUNC Trans[]);
VOID MlmeDlsReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerDlsReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerDlsRspAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID MlmeDlsTearDownAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerDlsTearDownAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID RTMPCheckDLSTimeOut(
IN PRTMP_ADAPTER pAd);
BOOLEAN RTMPRcvFrameDLSCheck(
IN PRTMP_ADAPTER pAd,
IN PHEADER_802_11 pHeader,
IN ULONG Len,
IN PRT28XX_RXD_STRUC pRxD);
INT RTMPCheckDLSFrame(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pDA);
VOID RTMPSendDLSTearDownFrame(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pDA);
NDIS_STATUS RTMPSendSTAKeyRequest(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pDA);
NDIS_STATUS RTMPSendSTAKeyHandShake(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pDA);
VOID DlsTimeoutAction(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
BOOLEAN MlmeDlsReqSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
OUT PRT_802_11_DLS *pDLS,
OUT PUSHORT pReason);
INT Set_DlsEntryInfo_Display_Proc(
IN PRTMP_ADAPTER pAd,
IN PUCHAR arg);
MAC_TABLE_ENTRY *MacTableInsertDlsEntry(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pAddr,
IN UINT DlsEntryIdx);
BOOLEAN MacTableDeleteDlsEntry(
IN PRTMP_ADAPTER pAd,
IN USHORT wcid,
IN PUCHAR pAddr);
MAC_TABLE_ENTRY *DlsEntryTableLookup(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pAddr,
IN BOOLEAN bResetIdelCount);
MAC_TABLE_ENTRY *DlsEntryTableLookupByWcid(
IN PRTMP_ADAPTER pAd,
IN UCHAR wcid,
IN PUCHAR pAddr,
IN BOOLEAN bResetIdelCount);
INT Set_DlsAddEntry_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_DlsTearDownEntry_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif // QOS_DLS_SUPPORT //
#endif // CONFIG_STA_SUPPORT //
#ifdef QOS_DLS_SUPPORT
BOOLEAN PeerDlsReqSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
OUT PUCHAR pDA,
OUT PUCHAR pSA,
OUT USHORT *pCapabilityInfo,
OUT USHORT *pDlsTimeout,
OUT UCHAR *pRatesLen,
OUT UCHAR Rates[],
OUT UCHAR *pHtCapabilityLen,
OUT HT_CAPABILITY_IE *pHtCapability);
BOOLEAN PeerDlsRspSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
OUT PUCHAR pDA,
OUT PUCHAR pSA,
OUT USHORT *pCapabilityInfo,
OUT USHORT *pStatus,
OUT UCHAR *pRatesLen,
OUT UCHAR Rates[],
OUT UCHAR *pHtCapabilityLen,
OUT HT_CAPABILITY_IE *pHtCapability);
BOOLEAN PeerDlsTearDownSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
OUT PUCHAR pDA,
OUT PUCHAR pSA,
OUT USHORT *pReason);
#endif // QOS_DLS_SUPPORT //
BOOLEAN PeerProbeReqSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
OUT PUCHAR pAddr2,
OUT CHAR Ssid[],
OUT UCHAR *SsidLen,
OUT BOOLEAN *bRequestRssi);
//========================================
VOID SyncStateMachineInit(
IN PRTMP_ADAPTER pAd,
IN STATE_MACHINE *Sm,
OUT STATE_MACHINE_FUNC Trans[]);
VOID BeaconTimeout(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID ScanTimeout(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID MlmeScanReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID InvalidStateWhenScan(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID InvalidStateWhenJoin(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID InvalidStateWhenStart(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerBeacon(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID EnqueueProbeRequest(
IN PRTMP_ADAPTER pAd);
BOOLEAN ScanRunning(
IN PRTMP_ADAPTER pAd);
//=========================================
VOID MlmeCntlInit(
IN PRTMP_ADAPTER pAd,
IN STATE_MACHINE *S,
OUT STATE_MACHINE_FUNC Trans[]);
VOID MlmeCntlMachinePerformAction(
IN PRTMP_ADAPTER pAd,
IN STATE_MACHINE *S,
IN MLME_QUEUE_ELEM *Elem);
VOID CntlIdleProc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID CntlOidScanProc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID CntlOidSsidProc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM * Elem);
VOID CntlOidRTBssidProc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM * Elem);
VOID CntlMlmeRoamingProc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM * Elem);
VOID CntlWaitDisassocProc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID CntlWaitJoinProc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID CntlWaitReassocProc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID CntlWaitStartProc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID CntlWaitAuthProc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID CntlWaitAuthProc2(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID CntlWaitAssocProc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
#ifdef QOS_DLS_SUPPORT
VOID CntlOidDLSSetupProc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
#endif // QOS_DLS_SUPPORT //
VOID LinkUp(
IN PRTMP_ADAPTER pAd,
IN UCHAR BssType);
VOID LinkDown(
IN PRTMP_ADAPTER pAd,
IN BOOLEAN IsReqFromAP);
VOID IterateOnBssTab(
IN PRTMP_ADAPTER pAd);
VOID IterateOnBssTab2(
IN PRTMP_ADAPTER pAd);;
VOID JoinParmFill(
IN PRTMP_ADAPTER pAd,
IN OUT MLME_JOIN_REQ_STRUCT *JoinReq,
IN ULONG BssIdx);
VOID AssocParmFill(
IN PRTMP_ADAPTER pAd,
IN OUT MLME_ASSOC_REQ_STRUCT *AssocReq,
IN PUCHAR pAddr,
IN USHORT CapabilityInfo,
IN ULONG Timeout,
IN USHORT ListenIntv);
VOID ScanParmFill(
IN PRTMP_ADAPTER pAd,
IN OUT MLME_SCAN_REQ_STRUCT *ScanReq,
IN STRING Ssid[],
IN UCHAR SsidLen,
IN UCHAR BssType,
IN UCHAR ScanType);
VOID DisassocParmFill(
IN PRTMP_ADAPTER pAd,
IN OUT MLME_DISASSOC_REQ_STRUCT *DisassocReq,
IN PUCHAR pAddr,
IN USHORT Reason);
VOID StartParmFill(
IN PRTMP_ADAPTER pAd,
IN OUT MLME_START_REQ_STRUCT *StartReq,
IN CHAR Ssid[],
IN UCHAR SsidLen);
VOID AuthParmFill(
IN PRTMP_ADAPTER pAd,
IN OUT MLME_AUTH_REQ_STRUCT *AuthReq,
IN PUCHAR pAddr,
IN USHORT Alg);
VOID EnqueuePsPoll(
IN PRTMP_ADAPTER pAd);
VOID EnqueueBeaconFrame(
IN PRTMP_ADAPTER pAd);
VOID MlmeJoinReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID MlmeScanReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID MlmeStartReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID ScanTimeoutAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID BeaconTimeoutAtJoinAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerBeaconAtScanAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerBeaconAtJoinAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerBeacon(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerProbeReqAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem);
VOID ScanNextChannel(
IN PRTMP_ADAPTER pAd);
ULONG MakeIbssBeacon(
IN PRTMP_ADAPTER pAd);
#ifdef CONFIG_STA_SUPPORT
VOID InitChannelRelatedValue(
IN PRTMP_ADAPTER pAd);
#endif // CONFIG_STA_SUPPORT //
BOOLEAN MlmeScanReqSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
OUT UCHAR *BssType,
OUT CHAR ssid[],
OUT UCHAR *SsidLen,
OUT UCHAR *ScanType);
BOOLEAN PeerBeaconAndProbeRspSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
IN UCHAR MsgChannel,
OUT PUCHAR pAddr2,
OUT PUCHAR pBssid,
OUT CHAR Ssid[],
OUT UCHAR *pSsidLen,
OUT UCHAR *pBssType,
OUT USHORT *pBeaconPeriod,
OUT UCHAR *pChannel,
OUT UCHAR *pNewChannel,
OUT LARGE_INTEGER *pTimestamp,
OUT CF_PARM *pCfParm,
OUT USHORT *pAtimWin,
OUT USHORT *pCapabilityInfo,
OUT UCHAR *pErp,
OUT UCHAR *pDtimCount,
OUT UCHAR *pDtimPeriod,
OUT UCHAR *pBcastFlag,
OUT UCHAR *pMessageToMe,
OUT UCHAR SupRate[],
OUT UCHAR *pSupRateLen,
OUT UCHAR ExtRate[],
OUT UCHAR *pExtRateLen,
OUT UCHAR *pCkipFlag,
OUT UCHAR *pAironetCellPowerLimit,
OUT PEDCA_PARM pEdcaParm,
OUT PQBSS_LOAD_PARM pQbssLoad,
OUT PQOS_CAPABILITY_PARM pQosCapability,
OUT ULONG *pRalinkIe,
OUT UCHAR *pHtCapabilityLen,
#ifdef CONFIG_STA_SUPPORT
OUT UCHAR *pPreNHtCapabilityLen,
#endif // CONFIG_STA_SUPPORT //
OUT HT_CAPABILITY_IE *pHtCapability,
OUT EXT_CAP_INFO_ELEMENT *pExtCapInfo,
OUT UCHAR *AddHtInfoLen,
OUT ADD_HT_INFO_IE *AddHtInfo,
OUT UCHAR *NewExtChannel,
OUT USHORT *LengthVIE,
OUT PNDIS_802_11_VARIABLE_IEs pVIE);
#ifdef DOT11_N_SUPPORT
#ifdef DOT11N_DRAFT3
BOOLEAN PeerBeaconAndProbeRspSanity2(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
IN OVERLAP_BSS_SCAN_IE *BssScan,
OUT UCHAR *RegClass);
#endif // DOT11N_DRAFT3 //
#endif // DOT11_N_SUPPORT //
BOOLEAN PeerAddBAReqActionSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *pMsg,
IN ULONG MsgLen,
OUT PUCHAR pAddr2);
BOOLEAN PeerAddBARspActionSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *pMsg,
IN ULONG MsgLen);
BOOLEAN PeerDelBAActionSanity(
IN PRTMP_ADAPTER pAd,
IN UCHAR Wcid,
IN VOID *pMsg,
IN ULONG MsgLen);
BOOLEAN MlmeAssocReqSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
OUT PUCHAR pApAddr,
OUT USHORT *CapabilityInfo,
OUT ULONG *Timeout,
OUT USHORT *ListenIntv);
BOOLEAN MlmeAuthReqSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
OUT PUCHAR pAddr,
OUT ULONG *Timeout,
OUT USHORT *Alg);
BOOLEAN MlmeStartReqSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
OUT CHAR Ssid[],
OUT UCHAR *Ssidlen);
BOOLEAN PeerAuthSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
OUT PUCHAR pAddr,
OUT USHORT *Alg,
OUT USHORT *Seq,
OUT USHORT *Status,
OUT CHAR ChlgText[]);
BOOLEAN PeerAssocRspSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *pMsg,
IN ULONG MsgLen,
OUT PUCHAR pAddr2,
OUT USHORT *pCapabilityInfo,
OUT USHORT *pStatus,
OUT USHORT *pAid,
OUT UCHAR SupRate[],
OUT UCHAR *pSupRateLen,
OUT UCHAR ExtRate[],
OUT UCHAR *pExtRateLen,
OUT HT_CAPABILITY_IE *pHtCapability,
OUT ADD_HT_INFO_IE *pAddHtInfo, // AP might use this additional ht info IE
OUT UCHAR *pHtCapabilityLen,
OUT UCHAR *pAddHtInfoLen,
OUT UCHAR *pNewExtChannelOffset,
OUT PEDCA_PARM pEdcaParm,
OUT EXT_CAP_INFO_ELEMENT *pExtCapInfo,
OUT UCHAR *pCkipFlag);
BOOLEAN PeerDisassocSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
OUT PUCHAR pAddr2,
OUT USHORT *Reason);
BOOLEAN PeerDeauthSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
OUT PUCHAR pAddr1,
OUT PUCHAR pAddr2,
OUT PUCHAR pAddr3,
OUT USHORT *Reason);
BOOLEAN GetTimBit(
IN CHAR *Ptr,
IN USHORT Aid,
OUT UCHAR *TimLen,
OUT UCHAR *BcastFlag,
OUT UCHAR *DtimCount,
OUT UCHAR *DtimPeriod,
OUT UCHAR *MessageToMe);
UCHAR ChannelSanity(
IN PRTMP_ADAPTER pAd,
IN UCHAR channel);
NDIS_802_11_NETWORK_TYPE NetworkTypeInUseSanity(
IN PBSS_ENTRY pBss);
BOOLEAN MlmeDelBAReqSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen);
BOOLEAN MlmeAddBAReqSanity(
IN PRTMP_ADAPTER pAd,
IN VOID *Msg,
IN ULONG MsgLen,
OUT PUCHAR pAddr2);
ULONG MakeOutgoingFrame(
OUT UCHAR *Buffer,
OUT ULONG *Length, ...);
UCHAR RandomByte(
IN PRTMP_ADAPTER pAd);
UCHAR RandomByte2(
IN PRTMP_ADAPTER pAd);
VOID AsicUpdateAutoFallBackTable(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pTxRate);
VOID MlmePeriodicExec(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID LinkDownExec(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID LinkUpExec(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID STAMlmePeriodicExec(
PRTMP_ADAPTER pAd);
VOID MlmeAutoScan(
IN PRTMP_ADAPTER pAd);
VOID MlmeAutoReconnectLastSSID(
IN PRTMP_ADAPTER pAd);
BOOLEAN MlmeValidateSSID(
IN PUCHAR pSsid,
IN UCHAR SsidLen);
VOID MlmeCheckForRoaming(
IN PRTMP_ADAPTER pAd,
IN ULONG Now32);
BOOLEAN MlmeCheckForFastRoaming(
IN PRTMP_ADAPTER pAd);
VOID MlmeDynamicTxRateSwitching(
IN PRTMP_ADAPTER pAd);
#ifdef NEW_RATE_ADAPT_SUPPORT
VOID MlmeDynamicTxRateSwitchingAdapt(
IN PRTMP_ADAPTER pAd,
IN ULONG i);
#endif // NEW_RATE_ADAPT_SUPPORT //
VOID MlmeSelectRateSwitchTable11N3SReplacement(
IN PUCHAR *ppTable);
#ifdef AGS_SUPPORT
INT Show_AGS_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
//
// The dynamic Tx rate switching for AGS (Adaptive Group Switching)
//
// Parameters
// pAd: The adapter data structure
// pEntry: Pointer to a caller-supplied variable in which points to a MAC table entry
// pTable: Pointer to a caller-supplied variable in wich points to a Tx rate switching table
// TableSize: The size, in bytes, of the specified Tx rate switching table
// pAGSStatisticsInfo: Pointer to a caller-supplied variable in which points to the statistics information
//
// Return Value:
// None
//
VOID MlmeDynamicTxRateSwitchingAGS(
IN PRTMP_ADAPTER pAd,
IN PMAC_TABLE_ENTRY pEntry,
IN PUCHAR pTable,
IN UCHAR TableSize,
IN PAGS_STATISTICS_INFO pAGSStatisticsInfo,
IN UCHAR InitTxRateIdx);
//
// Auto Tx rate faster train up/down for AGS (Adaptive Group Switching)
//
// Parameters
// pAd: The adapter data structure
// pEntry: Pointer to a caller-supplied variable in which points to a MAC table entry
// pTable: Pointer to a caller-supplied variable in wich points to a Tx rate switching table
// TableSize: The size, in bytes, of the specified Tx rate switching table
// pAGSStatisticsInfo: Pointer to a caller-supplied variable in which points to the statistics information
//
// Return Value:
// None
//
VOID StaQuickResponeForRateUpExecAGS(
IN PRTMP_ADAPTER pAd,
IN PMAC_TABLE_ENTRY pEntry,
IN PUCHAR pTable,
IN UCHAR TableSize,
IN PAGS_STATISTICS_INFO pAGSStatisticsInfo,
IN UCHAR InitTxRateIdx);
#endif // AGS_SUPPORT //
VOID MlmeSetTxRate(
IN PRTMP_ADAPTER pAd,
IN PMAC_TABLE_ENTRY pEntry,
IN PRTMP_TX_RATE_SWITCH pTxRate);
VOID MlmeSelectTxRateTable(
IN PRTMP_ADAPTER pAd,
IN PMAC_TABLE_ENTRY pEntry,
IN PUCHAR *ppTable,
IN PUCHAR pTableSize,
IN PUCHAR pInitTxRateIdx);
VOID MlmeCalculateChannelQuality(
IN PRTMP_ADAPTER pAd,
IN PMAC_TABLE_ENTRY pMacEntry,
IN ULONG Now);
VOID MlmeCheckPsmChange(
IN PRTMP_ADAPTER pAd,
IN ULONG Now32);
VOID MlmeSetPsmBit(
IN PRTMP_ADAPTER pAd,
IN USHORT psm);
VOID MlmeSetTxPreamble(
IN PRTMP_ADAPTER pAd,
IN USHORT TxPreamble);
VOID UpdateBasicRateBitmap(
IN PRTMP_ADAPTER pAd);
VOID MlmeUpdateTxRates(
IN PRTMP_ADAPTER pAd,
IN BOOLEAN bLinkUp,
IN UCHAR apidx);
#ifdef DOT11_N_SUPPORT
VOID MlmeUpdateHtTxRates(
IN PRTMP_ADAPTER pAd,
IN UCHAR apidx);
#endif // DOT11_N_SUPPORT //
VOID RTMPCheckRates(
IN PRTMP_ADAPTER pAd,
IN OUT UCHAR SupRate[],
IN OUT UCHAR *SupRateLen);
#ifdef CONFIG_STA_SUPPORT
BOOLEAN RTMPCheckChannel(
IN PRTMP_ADAPTER pAd,
IN UCHAR CentralChannel,
IN UCHAR Channel);
#endif // CONFIG_STA_SUPPORT //
BOOLEAN RTMPCheckHt(
IN PRTMP_ADAPTER pAd,
IN UCHAR Wcid,
IN OUT HT_CAPABILITY_IE *pHtCapability,
IN OUT ADD_HT_INFO_IE *pAddHtInfo);
VOID StaQuickResponeForRateUpExec(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
#ifdef NEW_RATE_ADAPT_SUPPORT
VOID StaQuickResponeForRateUpExecAdapt(
IN PRTMP_ADAPTER pAd,
IN ULONG i);
#endif // NEW_RATE_ADAPT_SUPPORT //
VOID RTMPUpdateMlmeRate(
IN PRTMP_ADAPTER pAd);
CHAR RTMPMaxRssi(
IN PRTMP_ADAPTER pAd,
IN CHAR Rssi0,
IN CHAR Rssi1,
IN CHAR Rssi2);
CHAR RTMPMinSnr(
IN PRTMP_ADAPTER pAd,
IN CHAR Snr0,
IN CHAR Snr1);
CHAR RTMPMinNoiseLevel(
IN PRTMP_ADAPTER pAd,
IN CHAR NoiseLevel0,
IN CHAR NoiseLevel1,
IN CHAR NoiseLevel2);
VOID AsicSetRxAnt(
IN PRTMP_ADAPTER pAd,
IN UCHAR Ant);
#ifdef RT30xx
VOID RTMPFilterCalibration(
IN PRTMP_ADAPTER pAd);
#ifdef RTMP_EFUSE_SUPPORT
//2008/09/11:KH add to support efuse & lt; --
INT set_eFuseGetFreeBlockCount_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT set_eFusedump_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT set_eFuseLoadFromBin_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
VOID eFusePhysicalReadRegisters(
IN PRTMP_ADAPTER pAd,
IN USHORT Offset,
IN USHORT Length,
OUT USHORT* pData);
int RtmpEfuseSupportCheck(
IN RTMP_ADAPTER *pAd);
#ifdef RALINK_ATE
INT set_eFuseBufferModeWriteBack_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif // RALINK_ATE //
INT eFuseLoadEEPROM(
IN PRTMP_ADAPTER pAd);
INT eFuseWriteEeeppromBuf(
IN PRTMP_ADAPTER pAd);
VOID eFuseGetFreeBlockCount(IN PRTMP_ADAPTER pAd,
PUINT EfuseFreeBlock);
INT eFuse_init(
IN PRTMP_ADAPTER pAd);
NTSTATUS eFuseRead(
IN PRTMP_ADAPTER pAd,
IN USHORT Offset,
OUT PUSHORT pData,
IN USHORT Length);
NTSTATUS eFuseWrite(
IN PRTMP_ADAPTER pAd,
IN USHORT Offset,
IN PUSHORT pData,
IN USHORT length);
//2008/09/11:KH add to support efuse-- & gt;
#endif // RTMP_EFUSE_SUPPORT //
// add by johnli, RF power sequence setup
VOID RT30xxLoadRFNormalModeSetup(
IN PRTMP_ADAPTER pAd);
VOID RT30xxLoadRFSleepModeSetup(
IN PRTMP_ADAPTER pAd);
VOID RT30xxReverseRFSleepModeSetup(
IN PRTMP_ADAPTER pAd);
// end johnli
#ifdef RT3090
VOID NICInitRT3090RFRegisters(
IN RTMP_ADAPTER *pAd);
#endif // RT3090 //
VOID RT30xxHaltAction(
IN PRTMP_ADAPTER pAd);
VOID RT30xxSetRxAnt(
IN PRTMP_ADAPTER pAd,
IN UCHAR Ant);
VOID PostBBPInitialization(
IN PRTMP_ADAPTER pAd);
#endif // RT30xx //
#ifdef RT33xx
VOID RT33xxLoadRFNormalModeSetup(
IN PRTMP_ADAPTER pAd);
VOID RT33xxLoadRFSleepModeSetup(
IN PRTMP_ADAPTER pAd);
VOID RT33xxReverseRFSleepModeSetup(
IN PRTMP_ADAPTER pAd);
#ifdef RT3390
VOID NICInitRT3390RFRegisters(
IN RTMP_ADAPTER *pAd);
#endif // RT3090 //
VOID RT33xxHaltAction(
IN PRTMP_ADAPTER pAd);
VOID RT33xxSetRxAnt(
IN PRTMP_ADAPTER pAd,
IN UCHAR Ant);
#endif // RT33xx //
VOID AsicEvaluateRxAnt(
IN PRTMP_ADAPTER pAd);
VOID AsicRxAntEvalTimeout(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID APSDPeriodicExec(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
BOOLEAN RTMPCheckEntryEnableAutoRateSwitch(
IN PRTMP_ADAPTER pAd,
IN PMAC_TABLE_ENTRY pEntry);
UCHAR RTMPStaFixedTxMode(
IN PRTMP_ADAPTER pAd,
IN PMAC_TABLE_ENTRY pEntry);
VOID RTMPUpdateLegacyTxSetting(
UCHAR fixed_tx_mode,
PMAC_TABLE_ENTRY pEntry);
BOOLEAN RTMPAutoRateSwitchCheck(
IN PRTMP_ADAPTER pAd);
NDIS_STATUS MlmeInit(
IN PRTMP_ADAPTER pAd);
#ifdef RTMP_INTERNAL_TX_ALC
//
// Initialize the desired TSSI table
//
// Parameters
// pAd: The adapter data structure
//
// Return Value:
// None
//
VOID InitDesiredTSSITable(
IN PRTMP_ADAPTER pAd);
//
// Get the desired TSSI based on the latest packet
//
// Parameters
// pAd: The adapter data structure
//
// Return Value:
// The desired TSSI
//
UCHAR GetDesiredTSSI(
IN PRTMP_ADAPTER pAd);
#endif // RTMP_INTERNAL_TX_ALC //
VOID MlmeHandler(
IN PRTMP_ADAPTER pAd);
VOID MlmeHalt(
IN PRTMP_ADAPTER pAd);
VOID MlmeResetRalinkCounters(
IN PRTMP_ADAPTER pAd);
VOID BuildChannelList(
IN PRTMP_ADAPTER pAd);
UCHAR FirstChannel(
IN PRTMP_ADAPTER pAd);
UCHAR NextChannel(
IN PRTMP_ADAPTER pAd,
IN UCHAR channel);
VOID ChangeToCellPowerLimit(
IN PRTMP_ADAPTER pAd,
IN UCHAR AironetCellPowerLimit);
//
// Prototypes of function definition in cmm_tkip.c
//
VOID RTMPInitMICEngine(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pKey,
IN PUCHAR pDA,
IN PUCHAR pSA,
IN UCHAR UserPriority,
IN PUCHAR pMICKey);
BOOLEAN RTMPTkipCompareMICValue(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pSrc,
IN PUCHAR pDA,
IN PUCHAR pSA,
IN PUCHAR pMICKey,
IN UCHAR UserPriority,
IN UINT Len);
VOID RTMPCalculateMICValue(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket,
IN PUCHAR pEncap,
IN PCIPHER_KEY pKey,
IN UCHAR apidx);
VOID RTMPTkipAppendByte(
IN PTKIP_KEY_INFO pTkip,
IN UCHAR uChar);
VOID RTMPTkipAppend(
IN PTKIP_KEY_INFO pTkip,
IN PUCHAR pSrc,
IN UINT nBytes);
VOID RTMPTkipGetMIC(
IN PTKIP_KEY_INFO pTkip);
//
// Prototypes of function definition in cmm_cfg.c
//
INT RT_CfgSetCountryRegion(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg,
IN INT band);
INT RT_CfgSetWirelessMode(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT RT_CfgSetShortSlot(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT RT_CfgSetWepKey(
IN PRTMP_ADAPTER pAd,
IN PSTRING keyString,
IN CIPHER_KEY *pSharedKey,
IN INT keyIdx);
INT RT_CfgSetWPAPSKKey(
IN RTMP_ADAPTER *pAd,
IN PSTRING keyString,
IN UCHAR *pHashStr,
IN INT hashStrLen,
OUT PUCHAR pPMKBuf);
INT RT_CfgSetFixedTxPhyMode(
IN PSTRING arg);
INT RT_CfgSetMacAddress(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT RT_CfgSetTxMCSProc(
IN PSTRING arg,
OUT BOOLEAN *pAutoRate);
INT RT_CfgSetAutoFallBack(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
//
// Prototypes of function definition in cmm_info.c
//
NDIS_STATUS RTMPWPARemoveKeyProc(
IN PRTMP_ADAPTER pAd,
IN PVOID pBuf);
VOID RTMPWPARemoveAllKeys(
IN PRTMP_ADAPTER pAd);
BOOLEAN RTMPCheckStrPrintAble(
IN CHAR *pInPutStr,
IN UCHAR strLen);
VOID RTMPSetPhyMode(
IN PRTMP_ADAPTER pAd,
IN ULONG phymode);
VOID RTMPUpdateHTIE(
IN RT_HT_CAPABILITY *pRtHt,
IN UCHAR *pMcsSet,
OUT HT_CAPABILITY_IE *pHtCapability,
OUT ADD_HT_INFO_IE *pAddHtInfo);
VOID RTMPAddWcidAttributeEntry(
IN PRTMP_ADAPTER pAd,
IN UCHAR BssIdx,
IN UCHAR KeyIdx,
IN UCHAR CipherAlg,
IN MAC_TABLE_ENTRY *pEntry);
PSTRING GetEncryptType(
CHAR enc);
PSTRING GetAuthMode(
CHAR auth);
#ifdef DOT11_N_SUPPORT
VOID RTMPSetHT(
IN PRTMP_ADAPTER pAd,
IN OID_SET_HT_PHYMODE *pHTPhyMode);
VOID RTMPSetIndividualHT(
IN PRTMP_ADAPTER pAd,
IN UCHAR apidx);
#endif // DOT11_N_SUPPORT //
#ifdef SYSTEM_LOG_SUPPORT
VOID RTMPSendWirelessEvent(
IN PRTMP_ADAPTER pAd,
IN USHORT Event_flag,
IN PUCHAR pAddr,
IN UCHAR BssIdx,
IN CHAR Rssi);
#else
#define RTMPSendWirelessEvent(_pAd, _Event_flag, _pAddr, _BssIdx, _Rssi)
#endif // SYSTEM_LOG_SUPPORT //
CHAR ConvertToRssi(
IN PRTMP_ADAPTER pAd,
IN CHAR Rssi,
IN UCHAR RssiNumber);
CHAR ConvertToSnr(
IN PRTMP_ADAPTER pAd,
IN UCHAR Snr);
#ifdef DOT11N_DRAFT3
VOID BuildEffectedChannelList(
IN PRTMP_ADAPTER pAd);
VOID DeleteEffectedChannelList(
IN PRTMP_ADAPTER pAd);
VOID CntlChannelWidth(
IN PRTMP_ADAPTER pAd,
IN UCHAR PrimaryChannel,
IN UCHAR CentralChannel,
IN UCHAR ChannelWidth,
IN UCHAR SecondaryChannelOffset);
#endif // DOT11N_DRAFT3 //
VOID APAsicEvaluateRxAnt(
IN PRTMP_ADAPTER pAd);
#ifdef ANT_DIVERSITY_SUPPORT
VOID APAsicAntennaAvg(
IN PRTMP_ADAPTER pAd,
IN UCHAR AntSelect,
IN SHORT *RssiAvg);
#endif // ANT_DIVERSITY_SUPPORT //
VOID APAsicRxAntEvalTimeout(
IN PRTMP_ADAPTER pAd);
//
// function prototype in ap_wpa.c
//
VOID RTMPGetTxTscFromAsic(
IN PRTMP_ADAPTER pAd,
IN UCHAR apidx,
OUT PUCHAR pTxTsc);
MAC_TABLE_ENTRY *PACInquiry(
IN PRTMP_ADAPTER pAd,
IN ULONG Wcid);
UINT APValidateRSNIE(
IN PRTMP_ADAPTER pAd,
IN PMAC_TABLE_ENTRY pEntry,
IN PUCHAR pRsnIe,
IN UCHAR rsnie_len);
VOID HandleCounterMeasure(
IN PRTMP_ADAPTER pAd,
IN MAC_TABLE_ENTRY *pEntry);
VOID WPAStart4WayHS(
IN PRTMP_ADAPTER pAd,
IN MAC_TABLE_ENTRY *pEntry,
IN ULONG TimeInterval);
VOID WPAStart2WayGroupHS(
IN PRTMP_ADAPTER pAd,
IN MAC_TABLE_ENTRY *pEntry);
VOID PeerPairMsg1Action(
IN PRTMP_ADAPTER pAd,
IN MAC_TABLE_ENTRY *pEntry,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerPairMsg2Action(
IN PRTMP_ADAPTER pAd,
IN MAC_TABLE_ENTRY *pEntry,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerPairMsg3Action(
IN PRTMP_ADAPTER pAd,
IN MAC_TABLE_ENTRY *pEntry,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerPairMsg4Action(
IN PRTMP_ADAPTER pAd,
IN MAC_TABLE_ENTRY *pEntry,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerGroupMsg1Action(
IN PRTMP_ADAPTER pAd,
IN PMAC_TABLE_ENTRY pEntry,
IN MLME_QUEUE_ELEM *Elem);
VOID PeerGroupMsg2Action(
IN PRTMP_ADAPTER pAd,
IN PMAC_TABLE_ENTRY pEntry,
IN VOID *Msg,
IN UINT MsgLen);
VOID CMTimerExec(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID WPARetryExec(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID EnqueueStartForPSKExec(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID RTMPHandleSTAKey(
IN PRTMP_ADAPTER pAdapter,
IN MAC_TABLE_ENTRY *pEntry,
IN MLME_QUEUE_ELEM *Elem);
VOID MlmeDeAuthAction(
IN PRTMP_ADAPTER pAd,
IN PMAC_TABLE_ENTRY pEntry,
IN USHORT Reason,
IN BOOLEAN bDataFrameFirst);
VOID GREKEYPeriodicExec(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID AES_128_CMAC(
IN PUCHAR key,
IN PUCHAR input,
IN INT len,
OUT PUCHAR mac);
#ifdef DOT1X_SUPPORT
VOID WpaSend(
IN PRTMP_ADAPTER pAdapter,
IN PUCHAR pPacket,
IN ULONG Len);
VOID RTMPAddPMKIDCache(
IN PRTMP_ADAPTER pAd,
IN INT apidx,
IN PUCHAR pAddr,
IN UCHAR *PMKID,
IN UCHAR *PMK);
INT RTMPSearchPMKIDCache(
IN PRTMP_ADAPTER pAd,
IN INT apidx,
IN PUCHAR pAddr);
VOID RTMPDeletePMKIDCache(
IN PRTMP_ADAPTER pAd,
IN INT apidx,
IN INT idx);
VOID RTMPMaintainPMKIDCache(
IN PRTMP_ADAPTER pAd);
#else
#define RTMPMaintainPMKIDCache(_pAd)
#endif // DOT1X_SUPPORT //
/* timeout -- ms */
VOID RTMP_SetPeriodicTimer(
IN NDIS_MINIPORT_TIMER *pTimer,
IN unsigned long timeout);
VOID RTMP_OS_Init_Timer(
IN PRTMP_ADAPTER pAd,
IN NDIS_MINIPORT_TIMER *pTimer,
IN TIMER_FUNCTION function,
IN PVOID data);
VOID RTMP_OS_Add_Timer(
IN NDIS_MINIPORT_TIMER *pTimer,
IN unsigned long timeout);
VOID RTMP_OS_Mod_Timer(
IN NDIS_MINIPORT_TIMER *pTimer,
IN unsigned long timeout);
VOID RTMP_OS_Del_Timer(
IN NDIS_MINIPORT_TIMER *pTimer,
OUT BOOLEAN *pCancelled);
VOID RTMPusecDelay(
IN ULONG usec);
NDIS_STATUS os_alloc_mem(
IN RTMP_ADAPTER *pAd,
OUT UCHAR **mem,
IN ULONG size);
NDIS_STATUS os_free_mem(
IN PRTMP_ADAPTER pAd,
IN PVOID mem);
#ifdef RESOURCE_PRE_ALLOC
VOID RTMPResetTxRxRingMemory(
IN RTMP_ADAPTER *pAd);
#endif // RESOURCE_PRE_ALLOC //
VOID RTMPFreeTxRxRingMemory(
IN PRTMP_ADAPTER pAd);
NDIS_STATUS AdapterBlockAllocateMemory(
IN PVOID handle,
OUT PVOID *ppAd);
void RTMP_AllocateTxDescMemory(
IN PRTMP_ADAPTER pAd,
IN UINT Index,
IN ULONG Length,
IN BOOLEAN Cached,
OUT PVOID *VirtualAddress,
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
void RTMP_AllocateFirstTxBuffer(
IN PRTMP_ADAPTER pAd,
IN UINT Index,
IN ULONG Length,
IN BOOLEAN Cached,
OUT PVOID *VirtualAddress,
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
void RTMP_FreeFirstTxBuffer(
IN PRTMP_ADAPTER pAd,
IN ULONG Length,
IN BOOLEAN Cached,
IN PVOID VirtualAddress,
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress);
void RTMP_AllocateMgmtDescMemory(
IN PRTMP_ADAPTER pAd,
IN ULONG Length,
IN BOOLEAN Cached,
OUT PVOID *VirtualAddress,
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
void RTMP_AllocateRxDescMemory(
IN PRTMP_ADAPTER pAd,
IN ULONG Length,
IN BOOLEAN Cached,
OUT PVOID *VirtualAddress,
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
void RTMP_FreeDescMemory(
IN PRTMP_ADAPTER pAd,
IN ULONG Length,
IN PVOID VirtualAddress,
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress);
PNDIS_PACKET RtmpOSNetPktAlloc(
IN RTMP_ADAPTER *pAd,
IN int size);
PNDIS_PACKET RTMP_AllocateRxPacketBuffer(
IN PRTMP_ADAPTER pAd,
IN ULONG Length,
IN BOOLEAN Cached,
OUT PVOID *VirtualAddress,
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
PNDIS_PACKET RTMP_AllocateFragPacketBuffer(
IN PRTMP_ADAPTER pAd,
IN ULONG Length);
void RTMP_QueryPacketInfo(
IN PNDIS_PACKET pPacket,
OUT PACKET_INFO *pPacketInfo,
OUT PUCHAR *pSrcBufVA,
OUT UINT *pSrcBufLen);
BOOLEAN RTMP_FillTxBlkInfo(
IN RTMP_ADAPTER *pAd,
IN TX_BLK *pTxBlk);
PRTMP_SCATTER_GATHER_LIST
rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg);
void announce_802_3_packet(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket);
#ifdef DOT11_N_SUPPORT
UINT BA_Reorder_AMSDU_Annnounce(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket);
#endif // DOT11_N_SUPPORT //
PNET_DEV get_netdev_from_bssid(
IN PRTMP_ADAPTER pAd,
IN UCHAR FromWhichBSSID);
PNDIS_PACKET duplicate_pkt(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pHeader802_3,
IN UINT HdrLen,
IN PUCHAR pData,
IN ULONG DataSize,
IN UCHAR FromWhichBSSID);
PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pOldPkt);
PNDIS_PACKET duplicate_pkt_with_VLAN(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pHeader802_3,
IN UINT HdrLen,
IN PUCHAR pData,
IN ULONG DataSize,
IN UCHAR FromWhichBSSID,
IN UCHAR *TPID);
BOOLEAN RTMPL2FrameTxAction(
IN PRTMP_ADAPTER pAd,
IN UCHAR apidx,
IN PUCHAR pData,
IN UINT32 data_len);
PNDIS_PACKET ExpandPacket(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket,
IN UINT32 ext_head_len,
IN UINT32 ext_tail_len);
UCHAR VLAN_8023_Header_Copy(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pHeader802_3,
IN UINT HdrLen,
OUT PUCHAR pData,
IN UCHAR FromWhichBSSID,
IN UCHAR *TPID);
#ifdef DOT11_N_SUPPORT
void ba_flush_reordering_timeout_mpdus(
IN PRTMP_ADAPTER pAd,
IN PBA_REC_ENTRY pBAEntry,
IN ULONG Now32);
VOID BAOriSessionSetUp(
IN PRTMP_ADAPTER pAd,
IN MAC_TABLE_ENTRY *pEntry,
IN UCHAR TID,
IN USHORT TimeOut,
IN ULONG DelayTime,
IN BOOLEAN isForced);
VOID BASessionTearDownALL(
IN OUT PRTMP_ADAPTER pAd,
IN UCHAR Wcid);
VOID BAOriSessionTearDown(
IN OUT PRTMP_ADAPTER pAd,
IN UCHAR Wcid,
IN UCHAR TID,
IN BOOLEAN bPassive,
IN BOOLEAN bForceSend);
VOID BARecSessionTearDown(
IN OUT PRTMP_ADAPTER pAd,
IN UCHAR Wcid,
IN UCHAR TID,
IN BOOLEAN bPassive);
#endif // DOT11_N_SUPPORT //
BOOLEAN ba_reordering_resource_init(PRTMP_ADAPTER pAd, int num);
void ba_reordering_resource_release(PRTMP_ADAPTER pAd);
INT ComputeChecksum(
IN UINT PIN);
UINT GenerateWpsPinCode(
IN PRTMP_ADAPTER pAd,
IN BOOLEAN bFromApcli,
IN UCHAR apidx);
#ifdef NINTENDO_AP
VOID InitNINTENDO_TABLE(
IN PRTMP_ADAPTER pAd);
UCHAR CheckNINTENDO_TABLE(
IN PRTMP_ADAPTER pAd,
PCHAR pDS_Ssid,
UCHAR DS_SsidLen,
PUCHAR pDS_Addr);
UCHAR DelNINTENDO_ENTRY(
IN PRTMP_ADAPTER pAd,
UCHAR * pDS_Addr);
VOID RTMPIoctlNintendoCapable(
IN PRTMP_ADAPTER pAd,
IN struct iwreq *wrq);
VOID RTMPIoctlNintendoGetTable(
IN PRTMP_ADAPTER pAd,
IN struct iwreq *wrq);
VOID RTMPIoctlNintendoSetTable(
IN PRTMP_ADAPTER pAd,
IN struct iwreq *wrq);
#endif // NINTENDO_AP //
BOOLEAN rtstrmactohex(
IN PSTRING s1,
IN PSTRING s2);
BOOLEAN rtstrcasecmp(
IN PSTRING s1,
IN PSTRING s2);
PSTRING rtstrstruncasecmp(
IN PSTRING s1,
IN PSTRING s2);
PSTRING rtstrstr(
IN const PSTRING s1,
IN const PSTRING s2);
PSTRING rstrtok(
IN PSTRING s,
IN const PSTRING ct);
int rtinet_aton(
const PSTRING cp,
unsigned int *addr);
////////// common ioctl functions //////////
INT Set_DriverVersion_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_CountryRegion_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_CountryRegionABand_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_WirelessMode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_MBSS_WirelessMode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_Channel_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_ShortSlot_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_TxPower_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_BGProtection_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_TxPreamble_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_RTSThreshold_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_FragThreshold_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_TxBurst_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#ifdef RTMP_MAC_PCI
INT Set_ShowRF_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif // RTMP_MAC_PCI //
#ifdef AGGREGATION_SUPPORT
INT Set_PktAggregate_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif // AGGREGATION_SUPPORT //
#ifdef INF_PPA_SUPPORT
INT Set_INF_AMAZON_SE_PPA_Proc(
IN PRTMP_ADAPTER pAd,
IN PUCHAR arg);
#endif // INF_PPA_SUPPORT //
INT Set_IEEE80211H_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#ifdef DBG
INT Set_Debug_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif
INT Show_DescInfo_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_ResetStatCounter_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#ifdef DOT11_N_SUPPORT
INT Set_BASetup_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_BADecline_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_BAOriTearDown_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_BARecTearDown_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtBw_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtMcs_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtGi_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtOpMode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtStbc_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtHtc_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtExtcha_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtMpduDensity_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtBaWinSize_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtRdg_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtLinkAdapt_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtAmsdu_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtAutoBa_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtProtect_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtMimoPs_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#ifdef DOT11N_DRAFT3
INT Set_HT_BssCoex_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING pParam);
INT Set_HT_BssCoexApCntThr_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING pParam);
#endif // DOT11N_DRAFT3 //
INT Set_ForceShortGI_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_ForceGF_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT SetCommonHT(
IN PRTMP_ADAPTER pAd);
INT Set_SendPSMPAction_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtMIMOPSmode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtTxBASize_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtDisallowTKIP_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif // DOT11_N_SUPPORT //
#ifdef APCLI_SUPPORT
INT RTMPIoctlConnStatus(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
#endif //APCLI_SUPPORT//
#ifdef CONFIG_STA_SUPPORT
//Dls , kathy
VOID RTMPSendDLSTearDownFrame(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pDA);
#ifdef DOT11_N_SUPPORT
//Block ACK
VOID QueryBATABLE(
IN PRTMP_ADAPTER pAd,
OUT PQUERYBA_TABLE pBAT);
#endif // DOT11_N_SUPPORT //
#ifdef WPA_SUPPLICANT_SUPPORT
INT WpaCheckEapCode(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pFrame,
IN USHORT FrameLen,
IN USHORT OffSet);
VOID WpaSendMicFailureToWpaSupplicant(
IN PRTMP_ADAPTER pAd,
IN BOOLEAN bUnicast);
VOID SendAssocIEsToWpaSupplicant(
IN PRTMP_ADAPTER pAd);
#endif // WPA_SUPPLICANT_SUPPORT //
#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
int wext_notify_event_assoc(
IN RTMP_ADAPTER *pAd);
#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
#endif // CONFIG_STA_SUPPORT //
#ifdef DOT11_N_SUPPORT
VOID Handle_BSS_Width_Trigger_Events(
IN PRTMP_ADAPTER pAd);
void build_ext_channel_switch_ie(
IN PRTMP_ADAPTER pAd,
IN HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE *pIE);
#endif // DOT11_N_SUPPORT //
BOOLEAN APRxDoneInterruptHandle(
IN PRTMP_ADAPTER pAd);
BOOLEAN STARxDoneInterruptHandle(
IN PRTMP_ADAPTER pAd,
IN BOOLEAN argc);
#ifdef DOT11_N_SUPPORT
// AMPDU packet indication
VOID Indicate_AMPDU_Packet(
IN PRTMP_ADAPTER pAd,
IN RX_BLK *pRxBlk,
IN UCHAR FromWhichBSSID);
// AMSDU packet indication
VOID Indicate_AMSDU_Packet(
IN PRTMP_ADAPTER pAd,
IN RX_BLK *pRxBlk,
IN UCHAR FromWhichBSSID);
#endif // DOT11_N_SUPPORT //
// Normal legacy Rx packet indication
VOID Indicate_Legacy_Packet(
IN PRTMP_ADAPTER pAd,
IN RX_BLK *pRxBlk,
IN UCHAR FromWhichBSSID);
VOID Indicate_EAPOL_Packet(
IN PRTMP_ADAPTER pAd,
IN RX_BLK *pRxBlk,
IN UCHAR FromWhichBSSID);
void update_os_packet_info(
IN PRTMP_ADAPTER pAd,
IN RX_BLK *pRxBlk,
IN UCHAR FromWhichBSSID);
void wlan_802_11_to_802_3_packet(
IN PRTMP_ADAPTER pAd,
IN RX_BLK *pRxBlk,
IN PUCHAR pHeader802_3,
IN UCHAR FromWhichBSSID,
IN UCHAR *TPID);
UINT deaggregate_AMSDU_announce(
IN PRTMP_ADAPTER pAd,
PNDIS_PACKET pPacket,
IN PUCHAR pData,
IN ULONG DataSize);
#ifdef CONFIG_STA_SUPPORT
// remove LLC and get 802_3 Header
#define RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(_pRxBlk, _pHeader802_3) \
{ \
PUCHAR _pRemovedLLCSNAP = NULL, _pDA, _pSA; \
\
if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_WDS) || RX_BLK_TEST_FLAG(_pRxBlk, fRX_MESH)) \
{ \
_pDA = _pRxBlk- & gt; pHeader- & gt; Addr3; \
_pSA = (PUCHAR)_pRxBlk- & gt; pHeader + sizeof(HEADER_802_11); \
} \
else \
{ \
if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_INFRA)) \
{ \
_pDA = _pRxBlk- & gt; pHeader- & gt; Addr1; \
if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_DLS)) \
_pSA = _pRxBlk- & gt; pHeader- & gt; Addr2; \
else \
_pSA = _pRxBlk- & gt; pHeader- & gt; Addr3; \
} \
else \
{ \
_pDA = _pRxBlk- & gt; pHeader- & gt; Addr1; \
_pSA = _pRxBlk- & gt; pHeader- & gt; Addr2; \
} \
} \
\
CONVERT_TO_802_3(_pHeader802_3, _pDA, _pSA, _pRxBlk- & gt; pData, \
_pRxBlk- & gt; DataSize, _pRemovedLLCSNAP); \
}
#endif // CONFIG_STA_SUPPORT //
BOOLEAN APFowardWirelessStaToWirelessSta(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket,
IN ULONG FromWhichBSSID);
VOID Announce_or_Forward_802_3_Packet(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket,
IN UCHAR FromWhichBSSID);
VOID Sta_Announce_or_Forward_802_3_Packet(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket,
IN UCHAR FromWhichBSSID);
#ifdef CONFIG_STA_SUPPORT
#define ANNOUNCE_OR_FORWARD_802_3_PACKET(_pAd, _pPacket, _FromWhichBSS)\
Sta_Announce_or_Forward_802_3_Packet(_pAd, _pPacket, _FromWhichBSS);
//announce_802_3_packet(_pAd, _pPacket);
#endif // CONFIG_STA_SUPPORT //
PNDIS_PACKET DuplicatePacket(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket,
IN UCHAR FromWhichBSSID);
PNDIS_PACKET ClonePacket(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket,
IN PUCHAR pData,
IN ULONG DataSize);
// Normal, AMPDU or AMSDU
VOID CmmRxnonRalinkFrameIndicate(
IN PRTMP_ADAPTER pAd,
IN RX_BLK *pRxBlk,
IN UCHAR FromWhichBSSID);
VOID CmmRxRalinkFrameIndicate(
IN PRTMP_ADAPTER pAd,
IN MAC_TABLE_ENTRY *pEntry,
IN RX_BLK *pRxBlk,
IN UCHAR FromWhichBSSID);
VOID Update_Rssi_Sample(
IN PRTMP_ADAPTER pAd,
IN RSSI_SAMPLE *pRssi,
IN PRXWI_STRUC pRxWI);
PNDIS_PACKET GetPacketFromRxRing(
IN PRTMP_ADAPTER pAd,
OUT PRT28XX_RXD_STRUC pSaveRxD,
OUT BOOLEAN *pbReschedule,
IN OUT UINT32 *pRxPending);
PNDIS_PACKET RTMPDeFragmentDataFrame(
IN PRTMP_ADAPTER pAd,
IN RX_BLK *pRxBlk);
////////////////////////////////////////
#if defined (AP_SCAN_SUPPORT) || defined (CONFIG_STA_SUPPORT)
VOID RTMPIoctlGetSiteSurvey(
IN PRTMP_ADAPTER pAdapter,
IN struct iwreq *wrq);
#endif
#ifdef SNMP_SUPPORT
//for snmp , kathy
typedef struct _DefaultKeyIdxValue
{
UCHAR KeyIdx;
UCHAR Value[16];
} DefaultKeyIdxValue, *PDefaultKeyIdxValue;
#endif
#ifdef CONFIG_STA_SUPPORT
enum {
DIDmsg_lnxind_wlansniffrm = 0x00000044,
DIDmsg_lnxind_wlansniffrm_hosttime = 0x00010044,
DIDmsg_lnxind_wlansniffrm_mactime = 0x00020044,
DIDmsg_lnxind_wlansniffrm_channel = 0x00030044,
DIDmsg_lnxind_wlansniffrm_rssi = 0x00040044,
DIDmsg_lnxind_wlansniffrm_sq = 0x00050044,
DIDmsg_lnxind_wlansniffrm_signal = 0x00060044,
DIDmsg_lnxind_wlansniffrm_noise = 0x00070044,
DIDmsg_lnxind_wlansniffrm_rate = 0x00080044,
DIDmsg_lnxind_wlansniffrm_istx = 0x00090044,
DIDmsg_lnxind_wlansniffrm_frmlen = 0x000A0044
};
enum {
P80211ENUM_msgitem_status_no_value = 0x00
};
enum {
P80211ENUM_truth_false = 0x00,
P80211ENUM_truth_true = 0x01
};
/* Definition from madwifi */
typedef struct {
UINT32 did;
UINT16 status;
UINT16 len;
UINT32 data;
} p80211item_uint32_t;
typedef struct {
UINT32 msgcode;
UINT32 msglen;
#define WLAN_DEVNAMELEN_MAX 16
UINT8 devname[WLAN_DEVNAMELEN_MAX];
p80211item_uint32_t hosttime;
p80211item_uint32_t mactime;
p80211item_uint32_t channel;
p80211item_uint32_t rssi;
p80211item_uint32_t sq;
p80211item_uint32_t signal;
p80211item_uint32_t noise;
p80211item_uint32_t rate;
p80211item_uint32_t istx;
p80211item_uint32_t frmlen;
} wlan_ng_prism2_header;
#ifdef MONITOR_FLAG_11N_SNIFFER_SUPPORT
/*
Note: 2009/11/10
Used in WiFi Sigma Test Engine RT3593 (replace RT2883).
*/
/*
From modified wireshark source code:
2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108, 109, 110, 111, 112,
13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78, 104, 156, 208, 234, 260, // long GI
27, 54, 81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540,
14, 29, 43, 57, 87, 115, 130, 144, 29, 59, 87, 115, 173, 230, 260, 288, // short GI
30, 60, 90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600,
39, 78, 117, 156, 234, 312, 351, 390, 52, 104, 156, 208, 312, 416, 486, 520,
81, 162, 243, 324, 486, 648, 729, 810, 108, 216, 324, 432, 648, 864, 972, 1080,
43, 87, 130, 173, 260, 347, 391, 433, 58, 116, 173, 231, 347, 462, 520, 578,
90, 180, 270, 360, 540 ,720, 810, 900, 120, 240, 360, 480, 720, 960, 1080, 1200,
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80
*/
#ifdef RT_BIG_ENDIAN
typedef struct _ETHEREAL_RADIO {
UCHAR Flag_80211n;
UCHAR signal_level; /* dBm */
UCHAR data_rate; /* rate index */
UCHAR channel; /* Channel number */
} ETHEREAL_RADIO, *PETHEREAL_RADIO;
#else
typedef struct _ETHEREAL_RADIO {
UCHAR channel; /* Channel number */
UCHAR data_rate; /* rate index */
UCHAR signal_level; /* dBm */
UCHAR Flag_80211n;
} ETHEREAL_RADIO, *PETHEREAL_RADIO;
#endif
#define WIRESHARK_11N_FLAG_3x3 0x01
#define WIRESHARK_11N_FLAG_GF 0x02
#define WIRESHARK_11N_FLAG_AMPDU 0x04
#define WIRESHARK_11N_FLAG_STBC 0x08
#define WIRESHARK_11N_FLAG_SGI 0x10
#define WIRESHARK_11N_FLAG_BW20U 0x20
#define WIRESHARK_11N_FLAG_BW20D 0x40
#define WIRESHARK_11N_FLAG_BW40 0x80
#endif // MONITOR_FLAG_11N_SNIFFER_SUPPORT //
/* The radio capture header precedes the 802.11 header. */
typedef struct GNU_PACKED _ieee80211_radiotap_header {
UINT8 it_version; /* Version 0. Only increases
* for drastic changes,
* introduction of compatible
* new fields does not count.
*/
UINT8 it_pad;
UINT16 it_len; /* length of the whole
* header in bytes, including
* it_version, it_pad,
* it_len, and data fields.
*/
UINT32 it_present; /* A bitmap telling which
* fields are present. Set bit 31
* (0x80000000) to extend the
* bitmap by another 32 bits.
* Additional extensions are made
* by setting bit 31.
*/
}ieee80211_radiotap_header ;
enum ieee80211_radiotap_type {
IEEE80211_RADIOTAP_TSFT = 0,
IEEE80211_RADIOTAP_FLAGS = 1,
IEEE80211_RADIOTAP_RATE = 2,
IEEE80211_RADIOTAP_CHANNEL = 3,
IEEE80211_RADIOTAP_FHSS = 4,
IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5,
IEEE80211_RADIOTAP_DBM_ANTNOISE = 6,
IEEE80211_RADIOTAP_LOCK_QUALITY = 7,
IEEE80211_RADIOTAP_TX_ATTENUATION = 8,
IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9,
IEEE80211_RADIOTAP_DBM_TX_POWER = 10,
IEEE80211_RADIOTAP_ANTENNA = 11,
IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12,
IEEE80211_RADIOTAP_DB_ANTNOISE = 13
};
#define WLAN_RADIOTAP_PRESENT ( \
(1 & lt; & lt; IEEE80211_RADIOTAP_TSFT) | \
(1 & lt; & lt; IEEE80211_RADIOTAP_FLAGS) | \
(1 & lt; & lt; IEEE80211_RADIOTAP_RATE) | \
0)
typedef struct _wlan_radiotap_header {
ieee80211_radiotap_header wt_ihdr;
INT64 wt_tsft;
UINT8 wt_flags;
UINT8 wt_rate;
} wlan_radiotap_header;
/* Definition from madwifi */
void send_monitor_packets(
IN PRTMP_ADAPTER pAd,
IN RX_BLK *pRxBlk,
IN CHAR (*RTMPMaxRssi)(
IN PRTMP_ADAPTER pAd,
IN CHAR Rssi0,
IN CHAR Rssi1,
IN CHAR Rssi2),
IN CHAR (*ConvertToRssi)(
IN PRTMP_ADAPTER pAd,
IN CHAR Rssi,
IN UCHAR RssiNumber));
VOID RTMPSetDesiredRates(
IN PRTMP_ADAPTER pAdapter,
IN LONG Rates);
#ifdef XLINK_SUPPORT
INT Set_XlinkMode_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
#endif // XLINK_SUPPORT //
#endif // CONFIG_STA_SUPPORT //
INT Set_FixedTxMode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#ifdef CONFIG_APSTA_MIXED_SUPPORT
INT Set_OpMode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif // CONFIG_APSTA_MIXED_SUPPORT //
INT Set_LongRetryLimit_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_ShortRetryLimit_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_AutoFallBack_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
VOID RT28XXDMADisable(
IN RTMP_ADAPTER *pAd);
VOID RT28XXDMAEnable(
IN RTMP_ADAPTER *pAd);
VOID RT28xx_UpdateBeaconToAsic(
IN RTMP_ADAPTER * pAd,
IN INT apidx,
IN ULONG BeaconLen,
IN ULONG UpdatePos);
void CfgInitHook(PRTMP_ADAPTER pAd);
int rt28xx_init(
IN PRTMP_ADAPTER pAd,
IN PSTRING pDefaultMac,
IN PSTRING pHostName);
NDIS_STATUS RtmpNetTaskInit(
IN RTMP_ADAPTER *pAd);
VOID RtmpNetTaskExit(
IN PRTMP_ADAPTER pAd);
NDIS_STATUS RtmpMgmtTaskInit(
IN RTMP_ADAPTER *pAd);
VOID RtmpMgmtTaskExit(
IN RTMP_ADAPTER *pAd);
#ifdef WORKQUEUE_BH
void tbtt_workq(struct work_struct *work);
#else
void tbtt_tasklet(unsigned long data);
#endif // WORKQUEUE_BH //
PNET_DEV RtmpPhyNetDevInit(
IN RTMP_ADAPTER *pAd,
IN RTMP_OS_NETDEV_OP_HOOK *pNetHook);
BOOLEAN RtmpPhyNetDevExit(
IN RTMP_ADAPTER *pAd,
IN PNET_DEV net_dev);
INT RtmpRaDevCtrlInit(
IN RTMP_ADAPTER *pAd,
IN RTMP_INF_TYPE infType);
BOOLEAN RtmpRaDevCtrlExit(
IN RTMP_ADAPTER *pAd);
#ifdef RTMP_MAC_PCI
//
// Function Prototype in cmm_data_pci.c
//
USHORT RtmpPCI_WriteSingleTxResource(
IN PRTMP_ADAPTER pAd,
IN TX_BLK *pTxBlk,
IN BOOLEAN bIsLast,
OUT USHORT *FreeNumber);
USHORT RtmpPCI_WriteMultiTxResource(
IN PRTMP_ADAPTER pAd,
IN TX_BLK *pTxBlk,
IN UCHAR frameNum,
OUT USHORT *FreeNumber);
USHORT RtmpPCI_WriteFragTxResource(
IN PRTMP_ADAPTER pAd,
IN TX_BLK *pTxBlk,
IN UCHAR fragNum,
OUT USHORT *FreeNumber);
VOID RtmpPCI_FinalWriteTxResource(
IN PRTMP_ADAPTER pAd,
IN TX_BLK *pTxBlk,
IN USHORT totalMPDUSize,
IN USHORT FirstTxIdx);
int RtmpPCIMgmtKickOut(
IN RTMP_ADAPTER *pAd,
IN UCHAR QueIdx,
IN PNDIS_PACKET pPacket,
IN PUCHAR pSrcBufVA,
IN UINT SrcBufLen);
NDIS_STATUS RTMPCheckRxError(
IN PRTMP_ADAPTER pAd,
IN PHEADER_802_11 pHeader,
IN PRXWI_STRUC pRxWI,
IN PRT28XX_RXD_STRUC pRxD);
BOOLEAN RT28xxPciAsicRadioOff(
IN PRTMP_ADAPTER pAd,
IN UCHAR Level,
IN USHORT TbttNumToNextWakeUp);
BOOLEAN RT28xxPciAsicRadioOn(
IN PRTMP_ADAPTER pAd,
IN UCHAR Level);
#ifdef CONFIG_STA_SUPPORT
#ifdef PCIE_PS_SUPPORT
VOID RTMPInitPCIeLinkCtrlValue(
IN PRTMP_ADAPTER pAd);
VOID RTMPFindHostPCIDev(
IN PRTMP_ADAPTER pAd);
VOID RTMPPCIeLinkCtrlValueRestore(
IN PRTMP_ADAPTER pAd,
IN UCHAR Level);
VOID RTMPPCIeLinkCtrlSetting(
IN PRTMP_ADAPTER pAd,
IN USHORT Max);
VOID RTMPrt3xSetPCIePowerLinkCtrl(
IN PRTMP_ADAPTER pAd);
VOID PsPollWakeExec(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
VOID RadioOnExec(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
#endif // PCIE_PS_SUPPORT //
VOID RT28xxPciStaAsicForceWakeup(
IN PRTMP_ADAPTER pAd,
IN BOOLEAN bFromTx);
VOID RT28xxPciStaAsicSleepThenAutoWakeup(
IN PRTMP_ADAPTER pAd,
IN USHORT TbttNumToNextWakeUp);
#ifdef CREDENTIAL_STORE
NDIS_STATUS RecoverConnectInfo(
IN RTMP_ADAPTER *pAd);
NDIS_STATUS StoreConnectInfo(
IN RTMP_ADAPTER *pAd);
#endif /* CREDENTIAL_STORE */
#endif // CONFIG_STA_SUPPORT //
VOID RT28xxPciMlmeRadioOn(
IN PRTMP_ADAPTER pAd);
VOID RT28xxPciMlmeRadioOFF(
IN PRTMP_ADAPTER pAd);
#endif // RTMP_MAC_PCI //
VOID AsicTurnOffRFClk(
IN PRTMP_ADAPTER pAd,
IN UCHAR Channel);
#ifdef RTMP_TIMER_TASK_SUPPORT
INT RtmpTimerQThread(
IN ULONG Context);
RTMP_TIMER_TASK_ENTRY *RtmpTimerQInsert(
IN RTMP_ADAPTER *pAd,
IN RALINK_TIMER_STRUCT *pTimer);
BOOLEAN RtmpTimerQRemove(
IN RTMP_ADAPTER *pAd,
IN RALINK_TIMER_STRUCT *pTimer);
void RtmpTimerQExit(
IN RTMP_ADAPTER *pAd);
void RtmpTimerQInit(
IN RTMP_ADAPTER *pAd);
#endif // RTMP_TIMER_TASK_SUPPORT //
////////////////////////////////////////
#ifdef AP_QLOAD_SUPPORT
VOID QBSS_LoadInit(
IN RTMP_ADAPTER *pAd);
VOID QBSS_LoadAlarmReset(
IN RTMP_ADAPTER *pAd);
VOID QBSS_LoadAlarmResume(
IN RTMP_ADAPTER *pAd);
UINT32 QBSS_LoadBusyTimeGet(
IN RTMP_ADAPTER *pAd);
BOOLEAN QBSS_LoadIsAlarmIssued(
IN RTMP_ADAPTER *pAd);
BOOLEAN QBSS_LoadIsBusyTimeAccepted(
IN RTMP_ADAPTER *pAd,
IN UINT32 BusyTime);
UINT32 QBSS_LoadElementAppend(
IN RTMP_ADAPTER *pAd,
OUT UINT8 *buf_p);
UINT32 QBSS_LoadElementParse(
IN RTMP_ADAPTER *pAd,
IN UINT8 *pElement,
OUT UINT16 *pStationCount,
OUT UINT8 *pChanUtil,
OUT UINT16 *pAvalAdmCap);
VOID QBSS_LoadUpdate(
IN RTMP_ADAPTER *pAd,
IN ULONG UpTime);
VOID QBSS_LoadStatusClear(
IN RTMP_ADAPTER *pAd);
INT Show_QoSLoad_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif // AP_QLOAD_SUPPORT //
///////////////////////////////////////
INT RTMPShowCfgValue(
IN PRTMP_ADAPTER pAd,
IN PSTRING pName,
IN PSTRING pBuf);
PSTRING RTMPGetRalinkAuthModeStr(
IN NDIS_802_11_AUTHENTICATION_MODE authMode);
PSTRING RTMPGetRalinkEncryModeStr(
IN USHORT encryMode);
//////////////////////////////////////
#ifdef CONFIG_STA_SUPPORT
VOID AsicStaBbpTuning(
IN PRTMP_ADAPTER pAd);
BOOLEAN StaAddMacTableEntry(
IN PRTMP_ADAPTER pAd,
IN PMAC_TABLE_ENTRY pEntry,
IN UCHAR MaxSupportedRateIn500Kbps,
IN HT_CAPABILITY_IE *pHtCapability,
IN UCHAR HtCapabilityLen,
IN ADD_HT_INFO_IE *pAddHtInfo,
IN UCHAR AddHtInfoLen,
IN USHORT CapabilityInfo);
BOOLEAN AUTH_ReqSend(
IN PRTMP_ADAPTER pAd,
IN PMLME_QUEUE_ELEM pElem,
IN PRALINK_TIMER_STRUCT pAuthTimer,
IN PSTRING pSMName,
IN USHORT SeqNo,
IN PUCHAR pNewElement,
IN ULONG ElementLen);
#endif // CONFIG_STA_SUPPORT //
void RTMP_IndicateMediaState(
IN PRTMP_ADAPTER pAd,
IN NDIS_MEDIA_STATE media_state);
VOID ReSyncBeaconTime(
IN PRTMP_ADAPTER pAd);
VOID RTMPSetAGCInitValue(
IN PRTMP_ADAPTER pAd,
IN UCHAR BandWidth);
int rt28xx_close(IN PNET_DEV dev);
int rt28xx_open(IN PNET_DEV dev);
#define VIRTUAL_IF_INC(__pAd) ((__pAd)- & gt; VirtualIfCnt++)
#define VIRTUAL_IF_DEC(__pAd) ((__pAd)- & gt; VirtualIfCnt--)
#define VIRTUAL_IF_NUM(__pAd) ((__pAd)- & gt; VirtualIfCnt)
#ifdef LINUX
__inline INT VIRTUAL_IF_UP(PRTMP_ADAPTER pAd)
{
if (VIRTUAL_IF_NUM(pAd) == 0)
{
if (rt28xx_open(pAd- & gt; net_dev) != 0)
{
DBGPRINT(RT_DEBUG_TRACE, ( " rt28xx_open return fail!\n " ));
return -1;
}
}
else
{
}
VIRTUAL_IF_INC(pAd);
return 0;
}
__inline VOID VIRTUAL_IF_DOWN(PRTMP_ADAPTER pAd)
{
VIRTUAL_IF_DEC(pAd);
if (VIRTUAL_IF_NUM(pAd) == 0)
rt28xx_close(pAd- & gt; net_dev);
return;
}
#endif // LINUX //
#ifdef SOFT_ENCRYPT
BOOLEAN RTMPExpandPacketForSwEncrypt(
IN PRTMP_ADAPTER pAd,
IN PTX_BLK pTxBlk);
VOID RTMPUpdateSwCacheCipherInfo(
IN PRTMP_ADAPTER pAd,
IN PTX_BLK pTxBlk,
IN PUCHAR pHdr);
#endif // SOFT_ENCRYPT //
/*
OS Related funciton prototype definitions.
TODO: Maybe we need to move these function prototypes to other proper place.
*/
int RtmpOSWrielessEventSend(
IN RTMP_ADAPTER *pAd,
IN UINT32 eventType,
IN INT flags,
IN PUCHAR pSrcMac,
IN PUCHAR pData,
IN UINT32 dataLen);
int RtmpOSNetDevAddrSet(
IN PNET_DEV pNetDev,
IN PUCHAR pMacAddr);
int RtmpOSNetDevAttach(
IN PNET_DEV pNetDev,
IN RTMP_OS_NETDEV_OP_HOOK *pDevOpHook);
void RtmpOSNetDevClose(
IN PNET_DEV pNetDev);
void RtmpOSNetDevDetach(
IN PNET_DEV pNetDev);
INT RtmpOSNetDevAlloc(
IN PNET_DEV *pNewNetDev,
IN UINT32 privDataSize);
#ifdef LINUX
#if LINUX_VERSION_CODE & gt; = KERNEL_VERSION(2,6,31)
INT RtmpOSNetDevOpsAlloc(
IN PVOID *pNetDevOps);
#endif
#endif // LINUX //
void RtmpOSNetDevFree(
IN PNET_DEV pNetDev);
PNET_DEV RtmpOSNetDevGetByName(
IN PNET_DEV pNetDev,
IN PSTRING pDevName);
void RtmpOSNetDeviceRefPut(
IN PNET_DEV pNetDev);
PNET_DEV RtmpOSNetDevCreate(
IN RTMP_ADAPTER *pAd,
IN INT devType,
IN INT devNum,
IN INT privMemSize,
IN PSTRING pNamePrefix);
/*
Task operation related function prototypes
*/
void RtmpOSTaskCustomize(
IN RTMP_OS_TASK *pTask);
INT RtmpOSTaskNotifyToExit(
IN RTMP_OS_TASK *pTask);
NDIS_STATUS RtmpOSTaskKill(
IN RTMP_OS_TASK *pTask);
NDIS_STATUS RtmpOSTaskInit(
IN RTMP_OS_TASK *pTask,
PSTRING pTaskName,
VOID *pPriv);
NDIS_STATUS RtmpOSTaskAttach(
IN RTMP_OS_TASK *pTask,
IN RTMP_OS_TASK_CALLBACK taskEntryPoint,
IN ULONG arg);
/*
File operation related function prototypes
*/
RTMP_OS_FD RtmpOSFileOpen(
IN char *pPath,
IN int flag,
IN int mode);
int RtmpOSFileClose(
IN RTMP_OS_FD osfd);
void RtmpOSFileSeek(
IN RTMP_OS_FD osfd,
IN int offset);
int RtmpOSFileRead(
IN RTMP_OS_FD osfd,
IN char *pDataPtr,
IN int readLen);
int RtmpOSFileWrite(
IN RTMP_OS_FD osfd,
IN char *pDataPtr,
IN int writeLen);
void RtmpOSFSInfoChange(
IN RTMP_OS_FS_INFO *pOSFSInfo,
IN BOOLEAN bSet);
VOID RTInitializeCmdQ(
IN PCmdQ cmdq);
INT RTPCICmdThread(
IN ULONG Context);
VOID CMDHandler(
IN PRTMP_ADAPTER pAd);
VOID RTThreadDequeueCmd(
IN PCmdQ cmdq,
OUT PCmdQElmt *pcmdqelmt);
NDIS_STATUS RTEnqueueInternalCmd(
IN PRTMP_ADAPTER pAd,
IN NDIS_OID Oid,
IN PVOID pInformationBuffer,
IN UINT32 InformationBufferLength);
#ifdef HOSTAPD_SUPPORT
VOID ieee80211_notify_michael_failure(
IN PRTMP_ADAPTER pAd,
IN PHEADER_802_11 pHeader,
IN UINT keyix,
IN INT report);
const CHAR* ether_sprintf(const UINT8 *mac);
#endif//HOSTAPD_SUPPORT//
#ifdef VENDOR_FEATURE3_SUPPORT
VOID RTMP_IO_WRITE32(
PRTMP_ADAPTER pAd,
UINT32 Offset,
UINT32 Value);
VOID RTMP_BBP_IO_READ8_BY_REG_ID(
PRTMP_ADAPTER pAd,
UINT32 Offset,
UINT8 *pValue);
VOID RTMP_BBP_IO_READ8(
PRTMP_ADAPTER pAd,
UCHAR Offset,
UINT8 *pValue,
BOOLEAN FlgValidMCR);
VOID RTMP_BBP_IO_WRITE8_BY_REG_ID(
PRTMP_ADAPTER pAd,
UINT32 Offset,
UINT8 Value);
VOID RTMP_BBP_IO_WRITE8(
PRTMP_ADAPTER pAd,
UCHAR Offset,
UINT8 Value,
BOOLEAN FlgValidMCR);
#endif // VENDOR_FEATURE3_SUPPORT //
BOOLEAN CHAN_PropertyCheck(
IN PRTMP_ADAPTER pAd,
IN UINT32 ChanNum,
IN UCHAR Property);
#ifdef CONFIG_STA_SUPPORT
// command
INT Set_SSID_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
#ifdef WMM_SUPPORT
INT Set_WmmCapable_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif
INT Set_NetworkType_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_AuthMode_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_EncrypType_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_DefaultKeyID_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_Key1_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_Key2_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_Key3_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_Key4_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_WPAPSK_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_PSMode_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
#ifdef WPA_SUPPLICANT_SUPPORT
INT Set_Wpa_Support(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif // WPA_SUPPLICANT_SUPPORT //
#ifdef DBG
VOID RTMPIoctlMAC(
IN PRTMP_ADAPTER pAdapter,
IN struct iwreq *wrq);
VOID RTMPIoctlE2PROM(
IN PRTMP_ADAPTER pAdapter,
IN struct iwreq *wrq);
#endif // DBG //
NDIS_STATUS RTMPWPANoneAddKeyProc(
IN PRTMP_ADAPTER pAd,
IN PVOID pBuf);
INT Set_FragTest_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
#ifdef DOT11_N_SUPPORT
INT Set_TGnWifiTest_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif // DOT11_N_SUPPORT //
INT Set_LongRetryLimit_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_ShortRetryLimit_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
#ifdef EXT_BUILD_CHANNEL_LIST
INT Set_Ieee80211dClientMode_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
#endif // EXT_BUILD_CHANNEL_LIST //
#ifdef CARRIER_DETECTION_SUPPORT
INT Set_CarrierDetect_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif // CARRIER_DETECTION_SUPPORT //
INT Show_Adhoc_MacTable_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING extra);
#ifdef RTMP_RF_RW_SUPPORT
VOID RTMPIoctlRF(
IN PRTMP_ADAPTER pAdapter,
IN struct iwreq *wrq);
#endif // RTMP_RF_RW_SUPPORT //
INT Set_BeaconLostTime_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_AutoRoaming_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_SiteSurvey_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_ForceTxBurst_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
VOID RTMPAddKey(
IN PRTMP_ADAPTER pAd,
IN PNDIS_802_11_KEY pKey);
VOID StaSiteSurvey(
IN PRTMP_ADAPTER pAd,
IN PNDIS_802_11_SSID pSsid,
IN UCHAR ScanType);
#endif // CONFIG_STA_SUPPORT //
#ifdef ANT_DIVERSITY_SUPPORT
INT Set_Antenna_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif // ANT_DIVERSITY_SUPPORT //
void getRate(
IN HTTRANSMIT_SETTING HTSetting,
OUT ULONG* fLastTxRxRate);
#if defined(RT3350) || defined(RT33xx)
VOID RTMP_TxEvmCalibration(
IN PRTMP_ADAPTER pAd);
#endif // defined(RT3350) || defined(RT33xx) //
#endif // __RTMP_H__
/*
*************************************************************************
* Ralink Tech Inc.
* 5F., No.36, Taiyuan St., Jhubei City,
* Hsinchu County 302,
* Taiwan, R.O.C.
*
* (c) Copyright 2002-2010, Ralink Technology, Inc.
*
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*************************************************************************/
#ifndef __CRYPT_ARC4_H__
#define __CRYPT_ARC4_H__
#include " rt_config.h "
/* ARC4 definition & structure */
#define ARC4_KEY_BLOCK_SIZE 256
typedef struct {
UINT BlockIndex1;
UINT BlockIndex2;
UINT8 KeyBlock[256];
} ARC4_CTX_STRUC, *PARC4_CTX_STRUC;
/* ARC4 operations */
VOID ARC4_INIT (
IN ARC4_CTX_STRUC *pARC4_CTX,
IN PUCHAR pKey,
IN UINT KeyLength);
VOID ARC4_Compute (
IN ARC4_CTX_STRUC *pARC4_CTX,
IN UINT8 InputBlock[],
IN UINT InputBlockSize,
OUT UINT8 OutputBlock[]);
VOID ARC4_Discard_KeyLength (
IN ARC4_CTX_STRUC *pARC4_CTX,
IN UINT Length);
#endif /* __CRYPT_ARC4_H__ */
/* AUTO GEN PLEASE DO NOT MODIFY IT */
/* AUTO GEN PLEASE DO NOT MODIFY IT */
UCHAR FirmwareImage [] = {
0x02, 0x03, 0x5b, 0x02, 0x02, 0xa6, 0x22, 0x22, 0xff, 0xff, 0xff, 0x02, 0x01, 0x2c, 0xff, 0xff,
0xff, 0xff, 0xff, 0x02, 0x00, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0xdd, 0xc0, 0xe0,
0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x18, 0xc2, 0xaf, 0x30, 0x45, 0x03,
0x12, 0x10, 0x09, 0x90, 0x04, 0x16, 0xe0, 0x30, 0xe3, 0x03, 0x74, 0x08, 0xf0, 0x90, 0x04, 0x14,
0xe0, 0x20, 0xe7, 0x03, 0x02, 0x00, 0xcb, 0x74, 0x80, 0xf0, 0x90, 0x70, 0x12, 0xe0, 0xf5, 0x36,
0x90, 0x04, 0x04, 0xe0, 0x24, 0xcf, 0x60, 0x30, 0x14, 0x60, 0x42, 0x24, 0xe2, 0x60, 0x47, 0x14,
0x60, 0x55, 0x24, 0x21, 0x70, 0x60, 0xe5, 0x55, 0x24, 0xfe, 0x60, 0x07, 0x14, 0x60, 0x08, 0x24,
0x02, 0x70, 0x08, 0x7d, 0x01, 0x80, 0x28, 0x7d, 0x02, 0x80, 0x24, 0x90, 0x70, 0x10, 0xe0, 0xf5,
0x50, 0x85, 0x36, 0x40, 0xd2, 0x01, 0x80, 0x3e, 0xe5, 0x55, 0x64, 0x03, 0x60, 0x04, 0xe5, 0x55,
0x70, 0x04, 0x7d, 0x02, 0x80, 0x09, 0x85, 0x36, 0x41, 0xd2, 0x02, 0x80, 0x29, 0xad, 0x55, 0xaf,
0x36, 0x12, 0x02, 0x82, 0x80, 0x20, 0x90, 0x70, 0x10, 0xe0, 0xf5, 0x47, 0x90, 0x70, 0x11, 0xe0,
0xf5, 0x44, 0x12, 0x10, 0x25, 0x80, 0x06, 0x90, 0x70, 0x10, 0xe0, 0xf5, 0x45, 0xe4, 0xfd, 0xaf,
0x36, 0x12, 0x02, 0x82, 0xd2, 0x04, 0x90, 0x70, 0x13, 0xe4, 0xf0, 0x90, 0x70, 0x13, 0xe4, 0xf0,
0xd2, 0xaf, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0,
0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0xe8, 0xc0, 0xe0, 0xe9, 0xc0, 0xe0, 0xea, 0xc0, 0xe0,
0xeb, 0xc0, 0xe0, 0xec, 0xc0, 0xe0, 0xed, 0xc0, 0xe0, 0xee, 0xc0, 0xe0, 0xef, 0xc0, 0xe0, 0xc2,
0xaf, 0x30, 0x45, 0x03, 0x12, 0x10, 0x12, 0xd2, 0xaf, 0xd0, 0xe0, 0xff, 0xd0, 0xe0, 0xfe, 0xd0,
0xe0, 0xfd, 0xd0, 0xe0, 0xfc, 0xd0, 0xe0, 0xfb, 0xd0, 0xe0, 0xfa, 0xd0, 0xe0, 0xf9, 0xd0, 0xe0,
0xf8, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0,
0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0xc2, 0xaf, 0x30, 0x45, 0x03, 0x12, 0x10,
0x0c, 0x30, 0x58, 0x0a, 0xe5, 0x54, 0x60, 0x04, 0x15, 0x54, 0x80, 0x02, 0xc2, 0x58, 0x30, 0x59,
0x0a, 0xe5, 0x50, 0x60, 0x04, 0x15, 0x50, 0x80, 0x02, 0xc2, 0x59, 0xd5, 0x53, 0x07, 0x30, 0x60,
0x04, 0x15, 0x46, 0xd2, 0x04, 0x30, 0x45, 0x03, 0x12, 0x10, 0x0f, 0xc2, 0x8d, 0xd2, 0xaf, 0xd0,
0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x90, 0x70, 0x2a, 0xe0, 0x30, 0xe1,
0x43, 0xc2, 0xaf, 0x90, 0x70, 0x28, 0xe0, 0x90, 0x10, 0x1c, 0xf0, 0x90, 0x70, 0x29, 0xe0, 0x90,
0x10, 0x1d, 0xf0, 0x90, 0x70, 0x2a, 0xe0, 0x90, 0x10, 0x1e, 0xf0, 0x90, 0x10, 0x1c, 0xe0, 0xf5,
0x37, 0x90, 0x10, 0x1e, 0xe0, 0x20, 0xe1, 0xf3, 0x90, 0x10, 0x1c, 0xe0, 0x90, 0x70, 0x28, 0xf0,
0x90, 0x10, 0x1d, 0xe0, 0x90, 0x70, 0x29, 0xf0, 0x90, 0x10, 0x1e, 0xe0, 0x90, 0x70, 0x2a, 0xf0,
0xc2, 0x05, 0xd2, 0xaf, 0x22, 0x12, 0x02, 0xc8, 0x30, 0x45, 0x03, 0x12, 0x10, 0x03, 0x30, 0x01,
0x06, 0x20, 0x09, 0x03, 0x12, 0x10, 0x1c, 0x30, 0x02, 0x06, 0x20, 0x0a, 0x03, 0x12, 0x10, 0x1f,
0x30, 0x03, 0x06, 0x20, 0x0b, 0x03, 0x12, 0x10, 0x1f, 0x30, 0x04, 0x06, 0x20, 0x0c, 0x03, 0x12,
0x10, 0x22, 0x20, 0x13, 0x09, 0x20, 0x11, 0x06, 0xe5, 0x2b, 0x45, 0x2c, 0x60, 0x03, 0xd3, 0x80,
0x01, 0xc3, 0x92, 0xa9, 0x12, 0x03, 0x1c, 0x80, 0xbf, 0xc2, 0x43, 0xd2, 0x45, 0xe4, 0xf5, 0x20,
0xf5, 0x21, 0xf5, 0x53, 0xf5, 0x46, 0xf5, 0x2b, 0xf5, 0x2c, 0xc2, 0x42, 0xf5, 0x51, 0xf5, 0x52,
0xf5, 0x55, 0x90, 0x04, 0x18, 0x74, 0x80, 0xf0, 0x90, 0x04, 0x1a, 0x74, 0x08, 0xf0, 0xc2, 0x1a,
0xc2, 0x18, 0xc2, 0x1b, 0x22, 0xc8, 0xef, 0xc8, 0xe6, 0xfa, 0x08, 0xe6, 0x4a, 0x60, 0x0c, 0xc8,
0xef, 0xc8, 0x08, 0xe6, 0x16, 0x18, 0x70, 0x01, 0x16, 0xc3, 0x22, 0xed, 0x24, 0xff, 0xfd, 0xec,
0x34, 0xff, 0xc8, 0xef, 0xc8, 0xf6, 0x08, 0xc6, 0xed, 0xc6, 0xd3, 0x22, 0xd0, 0x83, 0xd0, 0x82,
0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01,
0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3,
0x80, 0xdf, 0xef, 0xf4, 0x60, 0x1f, 0xe4, 0xfe, 0x12, 0x03, 0x67, 0xe0, 0xb4, 0xff, 0x12, 0x12,
0x03, 0x67, 0xef, 0xf0, 0x74, 0x1c, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xed, 0xf0,
0x22, 0x0e, 0xbe, 0x04, 0xe3, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0,
0x75, 0xd0, 0x08, 0xc2, 0xaf, 0x30, 0x45, 0x03, 0x12, 0x10, 0x06, 0xd2, 0xaf, 0xd0, 0xd0, 0xd0,
0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc2, 0xaf, 0x12, 0x00, 0x06, 0x12, 0x02, 0x09,
0x12, 0x02, 0xe1, 0xe4, 0xf5, 0x22, 0xf5, 0x47, 0x90, 0x04, 0x00, 0x74, 0x80, 0xf0, 0xd2, 0xaf,
0x22, 0x75, 0x89, 0x02, 0xe4, 0xf5, 0x8c, 0xf5, 0x8a, 0xf5, 0x88, 0xf5, 0xb8, 0xf5, 0xe8, 0x75,
0x90, 0x18, 0xd2, 0x8c, 0x75, 0xa8, 0x05, 0x22, 0xef, 0x60, 0x03, 0x1f, 0x80, 0xfa, 0x22, 0xff,
0xc0, 0x26, 0x74, 0x03, 0xc0, 0xe0, 0xc0, 0x82, 0xc0, 0x83, 0x75, 0x26, 0x0a, 0x22, 0xc0, 0x26,
0x74, 0x03, 0xc0, 0xe0, 0xc0, 0x82, 0xc0, 0x83, 0x75, 0x26, 0x18, 0x22, 0x30, 0x45, 0x03, 0x12,
0x10, 0x15, 0xe5, 0x20, 0x70, 0x03, 0x20, 0x10, 0x03, 0x30, 0x11, 0x03, 0x43, 0x87, 0x01, 0x22,
0xce, 0xef, 0xce, 0xee, 0x60, 0x08, 0x7f, 0xff, 0x12, 0x02, 0xf8, 0x1e, 0x80, 0xf5, 0x22, 0xc8,
0xef, 0xc8, 0xe6, 0x60, 0x03, 0x16, 0xc3, 0x22, 0xed, 0x14, 0xf6, 0xd3, 0x22, 0xc8, 0xef, 0xc8,
0xe6, 0x60, 0x06, 0x16, 0xe6, 0x24, 0xff, 0xb3, 0x22, 0xc3, 0x22, 0x78, 0x7f, 0xe4, 0xf6, 0xd8,
0xfd, 0x75, 0x81, 0x5f, 0x02, 0x01, 0xc5, 0x74, 0x14, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5,
0x83, 0x22, 0xef, 0x90, 0x03, 0x7b, 0x93, 0x90, 0x03, 0x00, 0x73, 0x0a, 0x18, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x02, 0x10, 0x28, 0x02, 0x10, 0x3b, 0x02, 0x10, 0x3c, 0x02, 0x13, 0xbc, 0x02,
0x13, 0xbd, 0x02, 0x14, 0x72, 0x02, 0x14, 0x73, 0xc3, 0x22, 0xff, 0xff, 0x02, 0x19, 0x4a, 0x02,
0x1a, 0xf4, 0x02, 0x15, 0x6c, 0x02, 0x14, 0xa7, 0x30, 0x05, 0x06, 0x20, 0x0d, 0x03, 0x12, 0x01,
0x7a, 0x30, 0x06, 0x06, 0x20, 0x0e, 0x03, 0x12, 0x1c, 0x2e, 0x22, 0x22, 0x90, 0x04, 0x14, 0xe0,
0x20, 0xe7, 0x03, 0x02, 0x13, 0xbb, 0x90, 0x70, 0x12, 0xe0, 0xf5, 0x56, 0x90, 0x04, 0x04, 0xe0,
0x12, 0x02, 0x5c, 0x10, 0xfb, 0x30, 0x10, 0xd2, 0x31, 0x10, 0x93, 0x33, 0x10, 0xa1, 0x34, 0x10,
0xb4, 0x35, 0x10, 0xab, 0x36, 0x11, 0x09, 0x50, 0x11, 0x4e, 0x51, 0x11, 0x57, 0x52, 0x11, 0x57,
0x53, 0x11, 0x57, 0x54, 0x11, 0x93, 0x55, 0x11, 0xf0, 0x56, 0x12, 0x43, 0x70, 0x12, 0x69, 0x71,
0x12, 0x92, 0x72, 0x13, 0x3e, 0x73, 0x13, 0x61, 0x80, 0x13, 0x88, 0x83, 0x13, 0xa0, 0x84, 0x00,
0x00, 0x13, 0xbb, 0xd2, 0x18, 0xd2, 0x61, 0x75, 0x35, 0x2a, 0x75, 0x32, 0x0b, 0x75, 0x33, 0xb8,
0x22, 0xc2, 0x18, 0x90, 0x01, 0x14, 0xe0, 0x54, 0xfd, 0xf0, 0x22, 0x90, 0x70, 0x11, 0xe0, 0xf5,
0x3c, 0x02, 0x13, 0xb5, 0xe5, 0x55, 0xb4, 0x02, 0x0f, 0xe5, 0x58, 0x30, 0xe0, 0x06, 0x90, 0x01,
0x0d, 0x74, 0x08, 0xf0, 0x7d, 0x01, 0x80, 0x02, 0x7d, 0x02, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x02,
0x13, 0xb5, 0x20, 0x02, 0x03, 0x30, 0x03, 0x0a, 0x7d, 0x02, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x02,
0x13, 0xb5, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x0c, 0x90, 0x01, 0x0c, 0xe0, 0x44, 0x02, 0xf0,
0xa3, 0xe0, 0x44, 0x04, 0xf0, 0x85, 0x56, 0x41, 0xd2, 0x02, 0x22, 0x90, 0x70, 0x11, 0xe0, 0xf4,
0x70, 0x03, 0x02, 0x13, 0xbb, 0xe0, 0xf5, 0x30, 0x22, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07,
0xe5, 0x55, 0x60, 0x03, 0x02, 0x13, 0xbb, 0x90, 0x70, 0x10, 0xe0, 0x54, 0x7f, 0xff, 0xbf, 0x0a,
0x0d, 0x90, 0x70, 0x11, 0xe0, 0xb4, 0x08, 0x06, 0x75, 0x4e, 0x01, 0x75, 0x4f, 0x84, 0x90, 0x70,
0x10, 0xe0, 0x54, 0x7f, 0xff, 0xbf, 0x02, 0x12, 0x90, 0x70, 0x11, 0xe0, 0x64, 0x08, 0x60, 0x04,
0xe0, 0xb4, 0x20, 0x06, 0x75, 0x4e, 0x03, 0x75, 0x4f, 0x20, 0xe4, 0xf5, 0x27, 0x22, 0x90, 0x70,
0x11, 0xe0, 0x24, 0xff, 0x92, 0x47, 0x22, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07, 0xe5, 0x55,
0x60, 0x03, 0x02, 0x13, 0x49, 0x90, 0x04, 0x04, 0xe0, 0x25, 0xe0, 0x24, 0x5d, 0xf5, 0x57, 0x90,
0x70, 0x10, 0xe0, 0xff, 0x74, 0x47, 0x25, 0x57, 0xf8, 0xc6, 0xef, 0xc6, 0x90, 0x70, 0x11, 0xe0,
0xff, 0x74, 0x48, 0x25, 0x57, 0xf8, 0xc6, 0xef, 0xc6, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82,
0x02, 0x13, 0xb5, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07, 0xe5, 0x55, 0x60, 0x03, 0x02, 0x13,
0x49, 0xe5, 0x47, 0x64, 0x07, 0x60, 0x1d, 0xe5, 0x47, 0x64, 0x08, 0x60, 0x17, 0xe5, 0x47, 0x64,
0x09, 0x60, 0x11, 0xe5, 0x47, 0x64, 0x0a, 0x60, 0x0b, 0xe5, 0x47, 0x64, 0x0b, 0x60, 0x05, 0xe5,
0x47, 0xb4, 0x0c, 0x08, 0x90, 0x70, 0x11, 0xe0, 0x54, 0x0f, 0xf5, 0x3a, 0xe5, 0x47, 0xb4, 0x09,
0x08, 0xe5, 0x3a, 0xb4, 0x03, 0x03, 0xe4, 0xf5, 0x46, 0xe5, 0x47, 0xb4, 0x0a, 0x08, 0xe5, 0x3a,
0xb4, 0x01, 0x03, 0xe4, 0xf5, 0x46, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0xd2, 0x04, 0x22,
0x90, 0x70, 0x11, 0xe0, 0xf4, 0xff, 0x90, 0x70, 0x10, 0xe0, 0x5f, 0xff, 0x90, 0x70, 0x11, 0xe0,
0x55, 0x27, 0x4f, 0x90, 0x70, 0x18, 0xf0, 0x90, 0x70, 0x11, 0xe0, 0x90, 0x70, 0x19, 0xf0, 0xe4,
0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x30, 0x15, 0x03, 0xd2, 0x14, 0x22, 0x90, 0x70, 0x18, 0xe0,
0xf5, 0x27, 0x90, 0x02, 0x29, 0xe0, 0xff, 0x90, 0x70, 0x19, 0xe0, 0xfe, 0xef, 0x5e, 0x90, 0x02,
0x29, 0xf0, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x90, 0x02, 0x28,
0xef, 0xf0, 0x22, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07, 0xe5, 0x55, 0x60, 0x03, 0x02, 0x13,
0x49, 0x90, 0x70, 0x10, 0xe0, 0xfe, 0x90, 0x70, 0x11, 0xe0, 0xfd, 0xed, 0xf8, 0xe6, 0xf5, 0x57,
0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x02, 0x13, 0xb5, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07,
0xe5, 0x55, 0x60, 0x03, 0x02, 0x13, 0x49, 0x90, 0x70, 0x10, 0xe0, 0xfe, 0x90, 0x70, 0x11, 0xe0,
0xfd, 0xed, 0xf5, 0x82, 0x8e, 0x83, 0xe0, 0xf5, 0x57, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x02,
0x13, 0xb5, 0x90, 0x10, 0x00, 0xe0, 0xf5, 0x57, 0xe4, 0xf5, 0x58, 0xf5, 0x59, 0x90, 0x10, 0x03,
0xe0, 0xb4, 0x28, 0x05, 0x75, 0x58, 0x01, 0x80, 0x3c, 0x90, 0x10, 0x03, 0xe0, 0xb4, 0x30, 0x05,
0x75, 0x58, 0x02, 0x80, 0x30, 0x90, 0x10, 0x03, 0xe0, 0xb4, 0x33, 0x05, 0x75, 0x58, 0x04, 0x80,
0x24, 0x90, 0x10, 0x03, 0xe0, 0xb4, 0x35, 0x0c, 0x90, 0x10, 0x02, 0xe0, 0xb4, 0x72, 0x05, 0x75,
0x58, 0x08, 0x80, 0x11, 0x90, 0x10, 0x03, 0xe0, 0xb4, 0x35, 0x0a, 0x90, 0x10, 0x02, 0xe0, 0xb4,
0x93, 0x03, 0x75, 0x58, 0x10, 0xe5, 0x58, 0x30, 0xe1, 0x19, 0x90, 0x05, 0x08, 0xe0, 0x44, 0x01,
0xf0, 0xfd, 0x90, 0x05, 0x05, 0xe0, 0x54, 0xfb, 0xf0, 0x44, 0x04, 0xf0, 0xed, 0x54, 0xfe, 0x90,
0x05, 0x08, 0xf0, 0xe4, 0xf5, 0x4e, 0xf5, 0x4f, 0x75, 0x3a, 0xff, 0xc2, 0x1a, 0xc2, 0x18, 0xc2,
0x1b, 0xf5, 0x34, 0x90, 0x05, 0xa4, 0x74, 0x11, 0xf0, 0xa3, 0x74, 0xff, 0xf0, 0xa3, 0x74, 0x03,
0xf0, 0xe4, 0xf5, 0x30, 0xc2, 0x19, 0x90, 0x01, 0x0d, 0xe0, 0x44, 0x40, 0xf0, 0x75, 0x3c, 0xff,
0xad, 0x57, 0xaf, 0x56, 0x12, 0x02, 0x82, 0xe4, 0x90, 0x70, 0x32, 0xf0, 0x80, 0x77, 0xe5, 0x34,
0xd3, 0x94, 0x01, 0x40, 0x0b, 0xe5, 0x55, 0x60, 0x07, 0x7d, 0x03, 0xaf, 0x56, 0x02, 0x02, 0x82,
0x90, 0x70, 0x10, 0xe0, 0x24, 0xff, 0x92, 0x93, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x80,
0x54, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x0d, 0xe5, 0x55, 0x60, 0x09, 0x7d, 0x03, 0xaf, 0x56,
0x12, 0x02, 0x82, 0x80, 0x40, 0x90, 0x70, 0x10, 0xe0, 0x24, 0xff, 0x92, 0x4a, 0xd2, 0x05, 0xad,
0x57, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x80, 0x2d, 0xe4, 0xf5, 0x34, 0xf5, 0x30, 0x90, 0x70, 0x10,
0xe0, 0xf4, 0x60, 0x03, 0xe0, 0xf5, 0x34, 0xad, 0x57, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x80, 0x15,
0xd2, 0x19, 0x05, 0x2f, 0xe5, 0x2f, 0xb4, 0x1a, 0x03, 0xe4, 0xf5, 0x2f, 0xd2, 0x04, 0xad, 0x57,
0xaf, 0x56, 0x12, 0x02, 0x82, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0x22, 0x22, 0xe5, 0x34, 0xc3,
0x94, 0x03, 0x40, 0x17, 0xe5, 0x55, 0xb4, 0x02, 0x12, 0xe5, 0x30, 0x60, 0x0e, 0x30, 0x60, 0x0b,
0x74, 0xfd, 0x25, 0x46, 0xf5, 0x46, 0xd2, 0x04, 0xe4, 0xf5, 0x53, 0xe5, 0x53, 0x60, 0x03, 0x02,
0x14, 0x71, 0x30, 0x60, 0x21, 0xb2, 0x4d, 0x30, 0x4d, 0x1c, 0xe5, 0x34, 0xc3, 0x94, 0x03, 0x40,
0x11, 0xe5, 0x55, 0xb4, 0x02, 0x0c, 0xe5, 0x30, 0x60, 0x08, 0x74, 0x03, 0x25, 0x46, 0xf5, 0x46,
0x80, 0x02, 0x05, 0x46, 0xc2, 0x04, 0xe5, 0x4f, 0x45, 0x4e, 0x60, 0x08, 0xe5, 0x4f, 0x15, 0x4f,
0x70, 0x02, 0x15, 0x4e, 0x30, 0x1a, 0x49, 0x7f, 0x32, 0x7d, 0xb8, 0x7c, 0x0b, 0x12, 0x02, 0x35,
0x50, 0x06, 0x90, 0x04, 0x10, 0x74, 0x40, 0xf0, 0x7f, 0x35, 0x7d, 0x32, 0x12, 0x03, 0x3f, 0x50,
0x09, 0x90, 0x10, 0x04, 0xe0, 0x54, 0xf7, 0xf0, 0xd2, 0x06, 0xe5, 0x35, 0xd3, 0x94, 0x2d, 0x40,
0x30, 0x30, 0x1b, 0x2d, 0xc2, 0x1b, 0xa2, 0x18, 0x92, 0x1a, 0x20, 0x1a, 0x24, 0x90, 0x04, 0x09,
0xe0, 0x54, 0xdd, 0xf0, 0x90, 0x10, 0x04, 0xe0, 0x44, 0x08, 0xf0, 0xc2, 0x61, 0xd2, 0x03, 0x22,
0xe4, 0xf5, 0x35, 0xa2, 0x18, 0x92, 0x1a, 0x30, 0x1a, 0x07, 0x90, 0x04, 0x09, 0xe0, 0x44, 0x22,
0xf0, 0x22, 0x22, 0x30, 0x14, 0x30, 0x90, 0x70, 0x19, 0xe0, 0x55, 0x27, 0xff, 0x90, 0x70, 0x18,
0xe0, 0x4f, 0xf5, 0x27, 0x90, 0x02, 0x29, 0xe0, 0xff, 0x90, 0x70, 0x19, 0xe0, 0xfe, 0xef, 0x5e,
0x90, 0x02, 0x29, 0xf0, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x90,
0x02, 0x28, 0xef, 0xf0, 0xc2, 0x14, 0x22, 0xc2, 0x4b, 0xc2, 0x4c, 0xe5, 0x44, 0x12, 0x02, 0x5c,
0x14, 0xc9, 0x00, 0x15, 0x57, 0x04, 0x15, 0x53, 0x08, 0x15, 0x33, 0x10, 0x14, 0xdd, 0x20, 0x14,
0xfd, 0x60, 0x15, 0x0e, 0xa0, 0x00, 0x00, 0x15, 0x59, 0x85, 0x48, 0x43, 0x85, 0x4a, 0x42, 0x85,
0x4c, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x60, 0x03, 0x02, 0x15, 0x59, 0x80, 0x1b, 0xe5, 0x48, 0xc4,
0x54, 0x0f, 0xf5, 0x43, 0xe5, 0x4a, 0xc4, 0x54, 0x0f, 0xf5, 0x42, 0xe5, 0x4c, 0xc4, 0x54, 0x0f,
0xf5, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x61, 0x53, 0x43, 0x0f, 0x80, 0x5c, 0x85, 0x49, 0x43,
0x85, 0x4b, 0x42, 0x85, 0x4d, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x4d, 0x80, 0x1b, 0xe5, 0x49,
0xc4, 0x54, 0x0f, 0xf5, 0x43, 0xe5, 0x4b, 0xc4, 0x54, 0x0f, 0xf5, 0x42, 0xe5, 0x4d, 0xc4, 0x54,
0x0f, 0xf5, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x30, 0xe5, 0x43, 0x54, 0x0f, 0x44, 0x10, 0xf5,
0x43, 0x80, 0x26, 0xe5, 0x47, 0x64, 0x04, 0x60, 0x05, 0xe5, 0x47, 0xb4, 0x05, 0x06, 0x43, 0x5e,
0x04, 0x75, 0x42, 0x09, 0xe5, 0x47, 0xb4, 0x06, 0x10, 0xe5, 0x43, 0x54, 0x0f, 0x44, 0x30, 0xf5,
0x43, 0x80, 0x06, 0xd2, 0x4b, 0x80, 0x02, 0xd2, 0x4c, 0xe4, 0xf5, 0x2a, 0xe5, 0x42, 0xc4, 0x54,
0xf0, 0xff, 0xe5, 0x43, 0x54, 0x0f, 0x4f, 0xf5, 0x5f, 0xd2, 0x60, 0x22, 0xd2, 0x15, 0xe5, 0x47,
0x24, 0xf5, 0x60, 0x0b, 0x24, 0xcb, 0x60, 0x07, 0x24, 0x40, 0x70, 0x06, 0xc2, 0x15, 0x22, 0x12,
0x19, 0x15, 0x12, 0x15, 0x8e, 0xc2, 0x15, 0xc2, 0xaf, 0xc2, 0x04, 0xd2, 0xaf, 0x22, 0xc2, 0xaf,
0x90, 0x04, 0x14, 0xe0, 0x54, 0x0e, 0x60, 0x04, 0xd2, 0x1c, 0x80, 0x08, 0xe5, 0x4e, 0x45, 0x4f,
0x24, 0xff, 0x92, 0x1c, 0xd2, 0xaf, 0x90, 0x04, 0x14, 0xe0, 0xa2, 0xe4, 0x92, 0x1d, 0x74, 0x1e,
0xf0, 0xe5, 0x5f, 0x54, 0x0f, 0xf5, 0x2d, 0xe5, 0x2a, 0x70, 0x13, 0x30, 0x1c, 0x05, 0xe5, 0x5f,
0x20, 0xe5, 0x0b, 0x30, 0x1d, 0x29, 0xe5, 0x5f, 0x54, 0x30, 0x64, 0x30, 0x70, 0x21, 0xe5, 0x2a,
0x70, 0x15, 0xe5, 0x34, 0xc3, 0x94, 0x03, 0x40, 0x09, 0xe5, 0x30, 0x60, 0x05, 0x75, 0x2a, 0x05,
0x80, 0x07, 0x75, 0x2a, 0x0c, 0x80, 0x02, 0x15, 0x2a, 0xd2, 0x6c, 0xd2, 0x6d, 0x80, 0x0f, 0xe5,
0x5f, 0x30, 0xe6, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x04, 0xd2, 0x6c, 0xc2, 0x6d, 0xe5, 0x47,
0x64, 0x03, 0x70, 0x21, 0x30, 0x4b, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x18, 0xe5, 0x2a, 0x70,
0x03, 0x30, 0x4c, 0x11, 0xc2, 0x4c, 0xe5, 0x2a, 0x70, 0x05, 0x75, 0x2a, 0x07, 0x80, 0x02, 0x15,
0x2a, 0xd2, 0x6c, 0xd2, 0x6d, 0xe5, 0x47, 0xb4, 0x09, 0x14, 0xe5, 0x44, 0x20, 0xe3, 0x0b, 0xe5,
0x3a, 0x64, 0x02, 0x60, 0x05, 0xe5, 0x3a, 0xb4, 0x03, 0x04, 0xc2, 0x6c, 0xd2, 0x6d, 0xe5, 0x47,
0xb4, 0x0a, 0x13, 0xe5, 0x3a, 0xb4, 0x01, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x08, 0xe5, 0x3a,
0x70, 0x04, 0xd2, 0x6c, 0xc2, 0x6d, 0x20, 0x69, 0x07, 0xe5, 0x5e, 0x20, 0xe0, 0x02, 0xb2, 0x68,
0x20, 0x6b, 0x07, 0xe5, 0x5e, 0x20, 0xe1, 0x02, 0xb2, 0x6a, 0x20, 0x6d, 0x07, 0xe5, 0x5e, 0x20,
0xe2, 0x02, 0xb2, 0x6c, 0x75, 0x2e, 0x40, 0x20, 0x69, 0x04, 0xa2, 0x68, 0x80, 0x45, 0x30, 0x68,
0x06, 0xe5, 0x46, 0xa2, 0xe2, 0x80, 0x3c, 0x30, 0x19, 0x1c, 0xe5, 0x5e, 0x20, 0xe0, 0x04, 0x7f,
0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x2f, 0xb4, 0x19, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00,
0xee, 0x6f, 0x24, 0xff, 0x80, 0x1d, 0xe5, 0x5e, 0x20, 0xe0, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f,
0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee,
0x6f, 0x24, 0xff, 0x92, 0x73, 0x92, 0x72, 0x20, 0x6b, 0x04, 0xa2, 0x6a, 0x80, 0x45, 0x30, 0x6a,
0x06, 0xe5, 0x46, 0xa2, 0xe2, 0x80, 0x3c, 0x30, 0x19, 0x1c, 0xe5, 0x5e, 0x20, 0xe1, 0x04, 0x7f,
0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x2f, 0xb4, 0x19, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00,
0xee, 0x6f, 0x24, 0xff, 0x80, 0x1d, 0xe5, 0x5e, 0x20, 0xe1, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f,
0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee,
0x6f, 0x24, 0xff, 0x92, 0x75, 0x92, 0x74, 0x20, 0x6d, 0x04, 0xa2, 0x6c, 0x80, 0x26, 0xe5, 0x47,
0x64, 0x0a, 0x70, 0x22, 0x30, 0x6c, 0x06, 0xe5, 0x46, 0xa2, 0xe3, 0x80, 0x17, 0xe5, 0x3a, 0xb4,
0x01, 0x06, 0xe5, 0x46, 0xa2, 0xe3, 0x80, 0x53, 0xe5, 0x46, 0x20, 0xe4, 0x03, 0x30, 0xe5, 0x03,
0xd3, 0x80, 0x01, 0xc3, 0x80, 0x45, 0x30, 0x6c, 0x06, 0xe5, 0x46, 0xa2, 0xe2, 0x80, 0x3c, 0x30,
0x19, 0x1c, 0xe5, 0x5e, 0x20, 0xe2, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x2f, 0xb4,
0x19, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee, 0x6f, 0x24, 0xff, 0x80, 0x1d, 0xe5, 0x5e,
0x20, 0xe2, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0,
0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee, 0x6f, 0x24, 0xff, 0x92, 0x71, 0x92, 0x70, 0x90,
0x10, 0x00, 0xe0, 0x90, 0x10, 0x2c, 0xf0, 0x90, 0x10, 0x03, 0xe0, 0xc3, 0x94, 0x30, 0x40, 0x14,
0xa2, 0x71, 0x92, 0x77, 0xa2, 0x70, 0x92, 0x76, 0xe5, 0x2e, 0x13, 0x13, 0x54, 0x3f, 0xf5, 0x2e,
0xc2, 0x77, 0xd2, 0x76, 0x90, 0x10, 0x2f, 0xe5, 0x2e, 0xf0, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x39,
0x90, 0x02, 0x29, 0xe0, 0x54, 0xfe, 0xf0, 0xe5, 0x43, 0xc4, 0x54, 0x0f, 0x14, 0x60, 0x0c, 0x24,
0xfe, 0x60, 0x0c, 0x24, 0x03, 0x70, 0x13, 0xc2, 0x38, 0x80, 0x0f, 0xd2, 0x38, 0x80, 0x0b, 0xe5,
0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x38, 0x30, 0x47, 0x05, 0xaf, 0x27, 0x02,
0x19, 0x0f, 0xe5, 0x27, 0xf4, 0xff, 0x02, 0x19, 0x0f, 0xe5, 0x47, 0x64, 0x07, 0x60, 0x0f, 0xe5,
0x47, 0x64, 0x08, 0x60, 0x09, 0xe5, 0x47, 0x64, 0x09, 0x60, 0x03, 0x02, 0x18, 0x8e, 0x90, 0x02,
0x29, 0xe0, 0x54, 0xfc, 0xf0, 0xe5, 0x3a, 0x14, 0x60, 0x22, 0x14, 0x60, 0x25, 0x14, 0x60, 0x2d,
0x24, 0xfc, 0x60, 0x49, 0x24, 0xf9, 0x60, 0x14, 0x24, 0x0e, 0x70, 0x50, 0xe5, 0x46, 0x13, 0x13,
0x54, 0x3f, 0x75, 0xf0, 0x03, 0x84, 0xe5, 0xf0, 0x24, 0xff, 0x80, 0x3a, 0xd2, 0x39, 0xc2, 0x38,
0x80, 0x3e, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x1d, 0xc3, 0x80, 0x1a, 0xe5, 0x46, 0x30,
0xe2, 0x0d, 0x54, 0x38, 0xc3, 0x94, 0x30, 0x50, 0x06, 0x7e, 0x00, 0x7f, 0x01, 0x80, 0x04, 0x7e,
0x00, 0x7f, 0x00, 0xee, 0x4f, 0x24, 0xff, 0x92, 0x38, 0xc2, 0x39, 0x80, 0x13, 0xe5, 0x46, 0x30,
0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x39, 0xc2, 0x38, 0x80, 0x04, 0xc2, 0x38, 0xc2, 0x39,
0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x02, 0x19, 0x0f, 0xe5, 0x47,
0x64, 0x0c, 0x60, 0x06, 0xe5, 0x47, 0x64, 0x0b, 0x70, 0x7a, 0x90, 0x02, 0x29, 0xe0, 0x54, 0xfd,
0xf0, 0xe5, 0x3a, 0x14, 0x60, 0x20, 0x14, 0x60, 0x21, 0x14, 0x60, 0x2b, 0x24, 0xfc, 0x60, 0x45,
0x24, 0xf9, 0x60, 0x12, 0x24, 0x0e, 0x70, 0x4a, 0xe5, 0x46, 0x13, 0x13, 0x54, 0x3f, 0x75, 0xf0,
0x03, 0x84, 0xe5, 0xf0, 0x80, 0x29, 0xd2, 0x39, 0x80, 0x3a, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3,
0x80, 0x01, 0xc3, 0x92, 0x39, 0x80, 0x2d, 0xe5, 0x46, 0x30, 0xe2, 0x0d, 0x54, 0x38, 0xc3, 0x94,
0x30, 0x50, 0x06, 0x7e, 0x00, 0x7f, 0x01, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x00, 0xee, 0x4f, 0x24,
0xff, 0x92, 0x39, 0x80, 0x0f, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x39,
0x80, 0x02, 0xc2, 0x39, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x90,
0x02, 0x28, 0xef, 0xf0, 0x22, 0xe5, 0x47, 0xb4, 0x0b, 0x10, 0x90, 0x02, 0x29, 0xe0, 0x54, 0xeb,
0xf0, 0xe5, 0x27, 0x54, 0xeb, 0x45, 0x45, 0xf5, 0x27, 0x22, 0xe4, 0x90, 0x02, 0x29, 0xf0, 0x30,
0x47, 0x04, 0xaf, 0x45, 0x80, 0x04, 0xe5, 0x45, 0xf4, 0xff, 0x90, 0x02, 0x28, 0xef, 0xf0, 0x22,
0x8f, 0x50, 0xd2, 0x59, 0x22, 0x8f, 0x54, 0xd2, 0x58, 0x22, 0xe4, 0xf5, 0x37, 0xc2, 0xaf, 0xe5,
0x51, 0x14, 0x60, 0x4a, 0x14, 0x60, 0x6b, 0x24, 0x02, 0x60, 0x03, 0x02, 0x1a, 0xd5, 0xd2, 0x59,
0x75, 0x55, 0x01, 0x20, 0x1a, 0x1c, 0x90, 0x02, 0x08, 0xe0, 0x54, 0xfe, 0xf0, 0xe0, 0x20, 0xe1,
0x23, 0x90, 0x04, 0x34, 0xe0, 0xb4, 0x02, 0x1c, 0xa3, 0xe0, 0xb4, 0x02, 0x17, 0xa3, 0xe0, 0xb4,
0x02, 0x12, 0x7f, 0x20, 0x12, 0x19, 0x40, 0x90, 0x10, 0x04, 0xe0, 0x54, 0xf3, 0xf0, 0x75, 0x51,
0x01, 0x02, 0x1a, 0xd5, 0xe5, 0x50, 0x70, 0x06, 0x75, 0x37, 0x03, 0x02, 0x1a, 0xd5, 0x90, 0x12,
0x00, 0xe0, 0x54, 0x03, 0x70, 0x15, 0x7f, 0x20, 0x12, 0x19, 0x40, 0x20, 0x1a, 0x07, 0x90, 0x02,
0x08, 0xe0, 0x54, 0xfb, 0xf0, 0x75, 0x51, 0x02, 0x02, 0x1a, 0xd5, 0xe5, 0x50, 0x70, 0x03, 0x02,
0x1a, 0xd0, 0x20, 0x1a, 0x15, 0x90, 0x02, 0x08, 0xe0, 0x30, 0xe3, 0x03, 0x02, 0x1a, 0xcc, 0x90,
0x04, 0x37, 0xe0, 0x64, 0x22, 0x60, 0x03, 0x02, 0x1a, 0xcc, 0x90, 0x12, 0x04, 0x74, 0x0a, 0xf0,
0xe5, 0x58, 0x30, 0xe3, 0x15, 0xe4, 0x90, 0x05, 0x00, 0xf0, 0xa3, 0x74, 0x08, 0xf0, 0xa3, 0x74,
0x01, 0xf0, 0x74, 0x03, 0xf0, 0x7f, 0x01, 0x12, 0x03, 0x30, 0x90, 0x13, 0x28, 0xe0, 0x90, 0x70,
0x1a, 0xf0, 0x90, 0x13, 0x29, 0xe0, 0x90, 0x70, 0x1b, 0xf0, 0x90, 0x13, 0x2b, 0xe0, 0x90, 0x70,
0x22, 0xf0, 0x90, 0x13, 0x28, 0xe0, 0x54, 0xf0, 0xf0, 0xa3, 0xe0, 0x54, 0xf0, 0xf0, 0x90, 0x13,
0x2b, 0xe0, 0x54, 0xcc, 0xf0, 0xe5, 0x58, 0x30, 0xe3, 0x17, 0xe5, 0x34, 0x70, 0x13, 0xe5, 0x3c,
0xf4, 0x90, 0x13, 0x2a, 0x60, 0x05, 0xe0, 0x54, 0xf3, 0x80, 0x11, 0xe0, 0x54, 0xfb, 0xf0, 0x80,
0x14, 0xe5, 0x3c, 0xf4, 0x90, 0x13, 0x2a, 0x60, 0x08, 0xe0, 0x54, 0xf2, 0x45, 0x3c, 0xf0, 0x80,
0x04, 0xe0, 0x54, 0xfa, 0xf0, 0x20, 0x1a, 0x07, 0x90, 0x04, 0x01, 0xe0, 0x44, 0x10, 0xf0, 0xe5,
0x34, 0xd3, 0x94, 0x01, 0x40, 0x09, 0xe5, 0x30, 0x70, 0x05, 0x75, 0x8c, 0x40, 0x80, 0x03, 0x75,
0x8c, 0x80, 0x90, 0x04, 0x01, 0xe0, 0x54, 0xfd, 0xf0, 0x20, 0x1a, 0x07, 0x90, 0x12, 0x04, 0xe0,
0x44, 0x04, 0xf0, 0xe5, 0x58, 0x30, 0xe0, 0x06, 0x90, 0x01, 0x0d, 0xe0, 0xf5, 0x31, 0xe5, 0x34,
0xd3, 0x94, 0x01, 0x40, 0x2c, 0x90, 0x01, 0x0d, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x58, 0x20, 0xe3,
0x0c, 0xe5, 0x34, 0xb4, 0x03, 0x07, 0x90, 0x12, 0x04, 0xe0, 0x54, 0xfd, 0xf0, 0x20, 0x02, 0x11,
0x20, 0x03, 0x0e, 0x90, 0x01, 0x0d, 0xe0, 0x54, 0xfb, 0xf0, 0x90, 0x01, 0x0c, 0xe0, 0x54, 0xfd,
0xf0, 0x75, 0x37, 0x01, 0x75, 0x55, 0x02, 0xe4, 0xf5, 0x51, 0x80, 0x09, 0xe5, 0x50, 0x70, 0x05,
0x75, 0x37, 0x03, 0xf5, 0x51, 0xe5, 0x37, 0x60, 0x18, 0xc2, 0x01, 0xe4, 0xf5, 0x51, 0xc2, 0x59,
0x20, 0x1a, 0x0e, 0xad, 0x37, 0xaf, 0x40, 0x12, 0x1b, 0xfa, 0xe5, 0x37, 0xb4, 0x03, 0x02, 0xd2,
0x03, 0xd2, 0xaf, 0x22, 0xc2, 0xaf, 0x30, 0x01, 0x0e, 0xe4, 0xf5, 0x51, 0xc2, 0x59, 0xc2, 0x01,
0x7d, 0x02, 0xaf, 0x40, 0x12, 0x1b, 0xfa, 0xe5, 0x52, 0x14, 0x60, 0x56, 0x14, 0x60, 0x33, 0x24,
0x02, 0x60, 0x03, 0x02, 0x1b, 0xf7, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x1f, 0x90, 0x01, 0x0c,
0xe0, 0x44, 0x02, 0xf0, 0xa3, 0xe0, 0x44, 0x04, 0xf0, 0x90, 0x12, 0x04, 0xe0, 0x44, 0x02, 0xf0,
0x7f, 0x32, 0x12, 0x03, 0x30, 0x90, 0x01, 0x0d, 0xe0, 0x54, 0xfe, 0xf0, 0x75, 0x52, 0x02, 0x75,
0x55, 0x03, 0xe5, 0x58, 0x30, 0xe0, 0x06, 0x90, 0x01, 0x0d, 0xe5, 0x31, 0xf0, 0x90, 0x12, 0x04,
0xe0, 0x54, 0xfb, 0xf0, 0x7f, 0x20, 0x12, 0x19, 0x45, 0x75, 0x52, 0x01, 0x75, 0x55, 0x03, 0x02,
0x1b, 0xf7, 0xe5, 0x54, 0x60, 0x03, 0x02, 0x1b, 0xf7, 0x90, 0x04, 0x01, 0xe0, 0x44, 0x0e, 0xf0,
0x20, 0x1a, 0x04, 0xe0, 0x54, 0xef, 0xf0, 0xe4, 0xf5, 0x8c, 0xe5, 0x58, 0x54, 0x18, 0x60, 0x1e,
0x90, 0x70, 0x1a, 0xe0, 0x90, 0x13, 0x28, 0xf0, 0x90, 0x70, 0x1b, 0xe0, 0x90, 0x13, 0x29, 0xf0,
0xa3, 0x74, 0x05, 0xf0, 0x90, 0x70, 0x22, 0xe0, 0x90, 0x13, 0x2b, 0xf0, 0x80, 0x11, 0x90, 0x13,
0x28, 0xe0, 0x44, 0x0f, 0xf0, 0xa3, 0xe0, 0x44, 0x0f, 0xf0, 0xa3, 0xe0, 0x44, 0x05, 0xf0, 0x90,
0x12, 0x04, 0x74, 0x03, 0xf0, 0xe5, 0x58, 0x30, 0xe3, 0x16, 0x90, 0x05, 0x00, 0x74, 0xe2, 0xf0,
0xa3, 0x74, 0x08, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0x74, 0x03, 0xf0, 0x7f, 0x01, 0x12, 0x03, 0x30,
0x20, 0x1a, 0x07, 0x90, 0x02, 0x08, 0xe0, 0x44, 0x05, 0xf0, 0x90, 0x10, 0x04, 0xe0, 0x44, 0x0c,
0xf0, 0xe4, 0xf5, 0x52, 0xf5, 0x55, 0x30, 0x02, 0x09, 0xc2, 0x02, 0x7d, 0x01, 0xaf, 0x41, 0x12,
0x1b, 0xfa, 0x30, 0x03, 0x02, 0xc2, 0x03, 0xd2, 0xaf, 0x22, 0xef, 0xf4, 0x60, 0x2d, 0xe4, 0xfe,
0x74, 0x14, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xe0, 0xb4, 0xff, 0x19, 0x74, 0x14,
0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xef, 0xf0, 0x74, 0x1c, 0x2e, 0xf5, 0x82, 0xe4,
0x34, 0x70, 0xf5, 0x83, 0xed, 0xf0, 0x22, 0x0e, 0xbe, 0x04, 0xd5, 0x22, 0x22, 0x22, 0x30, 0x1a,
0x77, 0x90, 0x04, 0x37, 0xe0, 0x20, 0xe5, 0x6c, 0x90, 0x04, 0x28, 0xe0, 0xf5, 0x38, 0xa3, 0xe0,
0xf5, 0x37, 0xf5, 0x39, 0xe4, 0xf5, 0x25, 0xe5, 0x39, 0x75, 0xf0, 0x80, 0xa4, 0x24, 0x00, 0xff,
0xe5, 0xf0, 0x34, 0x80, 0xfe, 0xe5, 0x37, 0x65, 0x39, 0x70, 0x05, 0xfc, 0x7d, 0x28, 0x80, 0x04,
0x7c, 0x00, 0x7d, 0x00, 0xef, 0x2d, 0xff, 0xee, 0x3c, 0xfe, 0x12, 0x1c, 0xa9, 0x50, 0x07, 0x90,
0x01, 0x14, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x39, 0x65, 0x38, 0x60, 0x10, 0xe4, 0x25, 0x39, 0xff,
0xe4, 0x34, 0x80, 0x8f, 0x82, 0xf5, 0x83, 0xe0, 0xf5, 0x39, 0x80, 0xbb, 0x90, 0x04, 0x10, 0x74,
0x01, 0xf0, 0x90, 0x04, 0x28, 0xe5, 0x38, 0xf0, 0xa3, 0xe5, 0x37, 0xf0, 0x90, 0x04, 0x11, 0x74,
0x01, 0xf0, 0x80, 0x8d, 0xc2, 0x06, 0xd2, 0x1b, 0x22, 0xe5, 0x25, 0xc3, 0x94, 0x06, 0x50, 0x19,
0x8f, 0x82, 0x8e, 0x83, 0xe0, 0xb4, 0xff, 0x07, 0x05, 0x25, 0xe4, 0xf5, 0x24, 0x80, 0x2e, 0xe4,
0xf5, 0x25, 0x8f, 0x82, 0x8e, 0x83, 0xf0, 0x80, 0x24, 0xe5, 0x24, 0x75, 0xf0, 0x06, 0x84, 0x74,
0x08, 0x25, 0xf0, 0xf5, 0x82, 0xe4, 0x34, 0x10, 0xf5, 0x83, 0xe0, 0xfd, 0x8f, 0x82, 0x8e, 0x83,
0xe0, 0x6d, 0x70, 0x06, 0x05, 0x25, 0x05, 0x24, 0x80, 0x03, 0xe4, 0xf5, 0x25, 0x0f, 0xbf, 0x00,
0x01, 0x0e, 0xef, 0x54, 0x7f, 0x60, 0x07, 0xe5, 0x25, 0xc3, 0x94, 0x2a, 0x40, 0xab, 0xe5, 0x25,
0xb4, 0x2a, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x53, 0x88, } ;
/*
*************************************************************************
* Ralink Tech Inc.
* 5F., No.36, Taiyuan St., Jhubei City,
* Hsinchu County 302,
* Taiwan, R.O.C.
*
* (c) Copyright 2002-2010, Ralink Technology, Inc.
*
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*************************************************************************/
#ifndef __RTMP_TIMER_H__
#define __RTMP_TIMER_H__
#include " rtmp_os.h "
#define DECLARE_TIMER_FUNCTION(_func) \
void rtmp_timer_##_func(unsigned long data)
#define GET_TIMER_FUNCTION(_func) \
(PVOID)rtmp_timer_##_func
/* ----------------- Timer Related MARCO ---------------*/
// In some os or chipset, we have a lot of timer functions and will read/write register,
// it's not allowed in Linux USB sub-system to do it ( because of sleep issue when
// submit to ctrl pipe). So we need a wrapper function to take care it.
#ifdef RTMP_TIMER_TASK_SUPPORT
typedef VOID (*RTMP_TIMER_TASK_HANDLE)(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3);
#endif // RTMP_TIMER_TASK_SUPPORT //
typedef struct _RALINK_TIMER_STRUCT {
RTMP_OS_TIMER TimerObj; // Ndis Timer object
BOOLEAN Valid; // Set to True when call RTMPInitTimer
BOOLEAN State; // True if timer cancelled
BOOLEAN PeriodicType; // True if timer is periodic timer
BOOLEAN Repeat; // True if periodic timer
ULONG TimerValue; // Timer value in milliseconds
ULONG cookie; // os specific object
void *pAd;
#ifdef RTMP_TIMER_TASK_SUPPORT
RTMP_TIMER_TASK_HANDLE handle;
#endif // RTMP_TIMER_TASK_SUPPORT //
}RALINK_TIMER_STRUCT, *PRALINK_TIMER_STRUCT;
#ifdef RTMP_TIMER_TASK_SUPPORT
typedef struct _RTMP_TIMER_TASK_ENTRY_
{
RALINK_TIMER_STRUCT *pRaTimer;
struct _RTMP_TIMER_TASK_ENTRY_ *pNext;
}RTMP_TIMER_TASK_ENTRY;
#define TIMER_QUEUE_SIZE_MAX 128
typedef struct _RTMP_TIMER_TASK_QUEUE_
{
unsigned int status;
unsigned char *pTimerQPoll;
RTMP_TIMER_TASK_ENTRY *pQPollFreeList;
RTMP_TIMER_TASK_ENTRY *pQHead;
RTMP_TIMER_TASK_ENTRY *pQTail;
}RTMP_TIMER_TASK_QUEUE;
#define BUILD_TIMER_FUNCTION(_func) \
void rtmp_timer_##_func(unsigned long data) \
{ \
PRALINK_TIMER_STRUCT _pTimer = (PRALINK_TIMER_STRUCT)data; \
RTMP_TIMER_TASK_ENTRY *_pQNode; \
RTMP_ADAPTER *_pAd; \
\
_pTimer- & gt; handle = _func; \
_pAd = (RTMP_ADAPTER *)_pTimer- & gt; pAd; \
_pQNode = RtmpTimerQInsert(_pAd, _pTimer); \
if ((_pQNode == NULL) & & (_pAd- & gt; TimerQ.status & RTMP_TASK_CAN_DO_INSERT)) \
RTMP_OS_Add_Timer( & _pTimer- & gt; TimerObj, OS_HZ); \
}
#else
#define BUILD_TIMER_FUNCTION(_func) \
void rtmp_timer_##_func(unsigned long data) \
{ \
PRALINK_TIMER_STRUCT pTimer = (PRALINK_TIMER_STRUCT) data; \
\
_func(NULL, (PVOID) pTimer- & gt; cookie, NULL, pTimer); \
if (pTimer- & gt; Repeat) \
RTMP_OS_Add_Timer( & pTimer- & gt; TimerObj, pTimer- & gt; TimerValue); \
}
#endif // RTMP_TIMER_TASK_SUPPORT //
DECLARE_TIMER_FUNCTION(MlmePeriodicExec);
DECLARE_TIMER_FUNCTION(MlmeRssiReportExec);
DECLARE_TIMER_FUNCTION(AsicRxAntEvalTimeout);
DECLARE_TIMER_FUNCTION(APSDPeriodicExec);
DECLARE_TIMER_FUNCTION(EnqueueStartForPSKExec);
#ifdef CONFIG_STA_SUPPORT
#endif // CONFIG_STA_SUPPORT //
#ifdef CONFIG_STA_SUPPORT
DECLARE_TIMER_FUNCTION(BeaconTimeout);
DECLARE_TIMER_FUNCTION(ScanTimeout);
DECLARE_TIMER_FUNCTION(AuthTimeout);
DECLARE_TIMER_FUNCTION(AssocTimeout);
DECLARE_TIMER_FUNCTION(ReassocTimeout);
DECLARE_TIMER_FUNCTION(DisassocTimeout);
DECLARE_TIMER_FUNCTION(LinkDownExec);
DECLARE_TIMER_FUNCTION(StaQuickResponeForRateUpExec);
DECLARE_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc);
#ifdef RTMP_PCI_SUPPORT
DECLARE_TIMER_FUNCTION(PsPollWakeExec);
DECLARE_TIMER_FUNCTION(RadioOnExec);
#endif // RTMP_PCI_SUPPORT //
#ifdef QOS_DLS_SUPPORT
DECLARE_TIMER_FUNCTION(DlsTimeoutAction);
#endif // QOS_DLS_SUPPORT //
#endif // CONFIG_STA_SUPPORT //
#if defined (WLAN_LED)
DECLARE_TIMER_FUNCTION(LedCtrlMain);
#endif // WLAN_LED //
#endif // __RTMP_TIMER_H__ //
/*
*************************************************************************
* Ralink Tech Inc.
* 5F., No.36, Taiyuan St., Jhubei City,
* Hsinchu County 302,
* Taiwan, R.O.C.
*
* (c) Copyright 2002-2010, Ralink Technology, Inc.
*
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*************************************************************************/
#ifndef __RTMP_IFACE_H__
#define __RTMP_IFACE_H__
#ifdef RTMP_PCI_SUPPORT
#include " iface/rtmp_pci.h "
#endif // RTMP_PCI_SUPPORT //
typedef struct _INF_PCI_CONFIG_
{
unsigned long CSRBaseAddress; // PCI MMIO Base Address, all access will use
unsigned int irq_num;
}INF_PCI_CONFIG;
typedef struct _INF_USB_CONFIG_
{
unsigned char BulkInEpAddr; // bulk-in endpoint address
unsigned char BulkOutEpAddr[6]; // bulk-out endpoint address
}INF_USB_CONFIG;
typedef struct _INF_RBUS_CONFIG_
{
unsigned long csr_addr;
unsigned int irq;
}INF_RBUS_CONFIG;
typedef enum _RTMP_INF_TYPE_
{
RTMP_DEV_INF_UNKNOWN = 0,
RTMP_DEV_INF_PCI = 1,
RTMP_DEV_INF_USB = 2,
RTMP_DEV_INF_RBUS = 4,
RTMP_DEV_INF_PCIE = 5,
}RTMP_INF_TYPE;
typedef union _RTMP_INF_CONFIG_{
struct _INF_PCI_CONFIG_ pciConfig;
struct _INF_USB_CONFIG_ usbConfig;
struct _INF_RBUS_CONFIG_ rbusConfig;
}RTMP_INF_CONFIG;
#endif // __RTMP_IFACE_H__ //
/*
*************************************************************************
* Ralink Tech Inc.
* 5F., No.36, Taiyuan St., Jhubei City,
* Hsinchu County 302,
* Taiwan, R.O.C.
*
* (c) Copyright 2002-2010, Ralink Technology, Inc.
*
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*************************************************************************/
#ifndef __SPECTRUM_DEF_H__
#define __SPECTRUM_DEF_H__
#define MAX_MEASURE_REQ_TAB_SIZE 32
/* Size of hash tab must be power of 2. */
#define MAX_HASH_MEASURE_REQ_TAB_SIZE MAX_MEASURE_REQ_TAB_SIZE
#define MAX_TPC_REQ_TAB_SIZE 32
/* Size of hash tab must be power of 2. */
#define MAX_HASH_TPC_REQ_TAB_SIZE MAX_TPC_REQ_TAB_SIZE
#define MIN_RCV_PWR 100 /* Negative value ((dBm) */
#define TPC_REQ_AGE_OUT 500 /* ms */
#define MQ_REQ_AGE_OUT 500 /* ms */
#define TPC_DIALOGTOKEN_HASH_INDEX(_DialogToken) ((_DialogToken) & (MAX_HASH_TPC_REQ_TAB_SIZE - 1))
#define MQ_DIALOGTOKEN_HASH_INDEX(_DialogToken) ((_DialogToken) & (MAX_MEASURE_REQ_TAB_SIZE - 1))
typedef struct _MEASURE_REQ_ENTRY
{
struct _MEASURE_REQ_ENTRY *pNext;
ULONG lastTime;
BOOLEAN Valid;
UINT8 DialogToken;
UINT8 MeasureDialogToken[3]; // 0:basic measure, 1: CCA measure, 2: RPI_Histogram measure.
} MEASURE_REQ_ENTRY, *PMEASURE_REQ_ENTRY;
typedef struct _MEASURE_REQ_TAB
{
UCHAR Size;
PMEASURE_REQ_ENTRY Hash[MAX_HASH_MEASURE_REQ_TAB_SIZE];
MEASURE_REQ_ENTRY Content[MAX_MEASURE_REQ_TAB_SIZE];
} MEASURE_REQ_TAB, *PMEASURE_REQ_TAB;
typedef struct _TPC_REQ_ENTRY
{
struct _TPC_REQ_ENTRY *pNext;
ULONG lastTime;
BOOLEAN Valid;
UINT8 DialogToken;
} TPC_REQ_ENTRY, *PTPC_REQ_ENTRY;
typedef struct _TPC_REQ_TAB
{
UCHAR Size;
PTPC_REQ_ENTRY Hash[MAX_HASH_TPC_REQ_TAB_SIZE];
TPC_REQ_ENTRY Content[MAX_TPC_REQ_TAB_SIZE];
} TPC_REQ_TAB, *PTPC_REQ_TAB;
/* The regulatory information */
typedef struct _DOT11_CHANNEL_SET
{
UCHAR NumberOfChannels;
UINT8 MaxTxPwr;
UCHAR ChannelList[16];
} DOT11_CHANNEL_SET, *PDOT11_CHANNEL_SET;
typedef struct _DOT11_REGULATORY_INFORMATION
{
UCHAR RegulatoryClass;
DOT11_CHANNEL_SET ChannelSet;
} DOT11_REGULATORY_INFORMATION, *PDOT11_REGULATORY_INFORMATION;
#define RM_TPC_REQ 0
#define RM_MEASURE_REQ 1
#define RM_BASIC 0
#define RM_CCA 1
#define RM_RPI_HISTOGRAM 2
#define RM_CH_LOAD 3
#define RM_NOISE_HISTOGRAM 4
typedef struct GNU_PACKED _TPC_REPORT_INFO
{
UINT8 TxPwr;
UINT8 LinkMargin;
} TPC_REPORT_INFO, *PTPC_REPORT_INFO;
typedef struct GNU_PACKED _CH_SW_ANN_INFO
{
UINT8 ChSwMode;
UINT8 Channel;
UINT8 ChSwCnt;
} CH_SW_ANN_INFO, *PCH_SW_ANN_INFO;
typedef union GNU_PACKED _MEASURE_REQ_MODE
{
#ifdef RT_BIG_ENDIAN
struct GNU_PACKED
{
UINT8 :3;
UINT8 DurationMandatory:1;
UINT8 Report:1;
UINT8 Request:1;
UINT8 Enable:1;
UINT8 Parallel:1;
} field;
#else
struct GNU_PACKED
{
UINT8 Parallel:1;
UINT8 Enable:1;
UINT8 Request:1;
UINT8 Report:1;
UINT8 DurationMandatory:1;
UINT8 :3;
} field;
#endif // RT_BIG_ENDIAN //
UINT8 word;
} MEASURE_REQ_MODE, *PMEASURE_REQ_MODE;
typedef struct GNU_PACKED _MEASURE_REQ
{
UINT8 ChNum;
UINT64 MeasureStartTime;
UINT16 MeasureDuration;
} MEASURE_REQ, *PMEASURE_REQ;
typedef struct GNU_PACKED _MEASURE_REQ_INFO
{
UINT8 Token;
MEASURE_REQ_MODE ReqMode;
UINT8 ReqType;
UINT8 Oct[0];
} MEASURE_REQ_INFO, *PMEASURE_REQ_INFO;
typedef union GNU_PACKED _MEASURE_BASIC_REPORT_MAP
{
#ifdef RT_BIG_ENDIAN
struct GNU_PACKED
{
UINT8 Rev:3;
UINT8 Unmeasure:1;
UINT8 Radar:1;
UINT8 UnidentifiedSignal:1;
UINT8 OfdmPreamble:1;
UINT8 BSS:1;
} field;
#else
struct GNU_PACKED
{
UINT8 BSS:1;
UINT8 OfdmPreamble:1;
UINT8 UnidentifiedSignal:1;
UINT8 Radar:1;
UINT8 Unmeasure:1;
UINT8 Rev:3;
} field;
#endif // RT_BIG_ENDIAN //
UINT8 word;
} MEASURE_BASIC_REPORT_MAP, *PMEASURE_BASIC_REPORT_MAP;
typedef struct GNU_PACKED _MEASURE_BASIC_REPORT
{
UINT8 ChNum;
UINT64 MeasureStartTime;
UINT16 MeasureDuration;
MEASURE_BASIC_REPORT_MAP Map;
} MEASURE_BASIC_REPORT, *PMEASURE_BASIC_REPORT;
typedef struct GNU_PACKED _MEASURE_CCA_REPORT
{
UINT8 ChNum;
UINT64 MeasureStartTime;
UINT16 MeasureDuration;
UINT8 CCA_Busy_Fraction;
} MEASURE_CCA_REPORT, *PMEASURE_CCA_REPORT;
typedef struct GNU_PACKED _MEASURE_RPI_REPORT
{
UINT8 ChNum;
UINT64 MeasureStartTime;
UINT16 MeasureDuration;
UINT8 RPI_Density[8];
} MEASURE_RPI_REPORT, *PMEASURE_RPI_REPORT;
typedef union GNU_PACKED _MEASURE_REPORT_MODE
{
struct GNU_PACKED
{
#ifdef RT_BIG_ENDIAN
UINT8 Rev:5;
UINT8 Refused:1;
UINT8 Incapable:1;
UINT8 Late:1;
#else
UINT8 Late:1;
UINT8 Incapable:1;
UINT8 Refused:1;
UINT8 Rev:5;
#endif // RT_BIG_ENDIAN //
} field;
UINT8 word;
} MEASURE_REPORT_MODE, *PMEASURE_REPORT_MODE;
typedef struct GNU_PACKED _MEASURE_REPORT_INFO
{
UINT8 Token;
UINT8 ReportMode;
UINT8 ReportType;
UINT8 Octect[0];
} MEASURE_REPORT_INFO, *PMEASURE_REPORT_INFO;
typedef struct GNU_PACKED _QUIET_INFO
{
UINT8 QuietCnt;
UINT8 QuietPeriod;
UINT16 QuietDuration;
UINT16 QuietOffset;
} QUIET_INFO, *PQUIET_INFO;
#endif // __SPECTRUM_DEF_H__ //
/*
*************************************************************************
* Ralink Tech Inc.
* 5F., No.36, Taiyuan St., Jhubei City,
* Hsinchu County 302,
* Taiwan, R.O.C.
*
* (c) Copyright 2002-2010, Ralink Technology, Inc.
*
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*************************************************************************/
#ifndef __EEPROM_H__
#define __EEPROM_H__
#ifdef RTMP_MAC_PCI
#define EEPROM_SIZE 0x200
#endif // RTMP_MAC_PCI //
#ifdef RTMP_PCI_SUPPORT
/*************************************************************************
* Public function declarations for prom-based chipset
************************************************************************/
int rtmp_ee_prom_read16(
IN PRTMP_ADAPTER pAd,
IN USHORT Offset,
OUT USHORT *pValue);
int rtmp_ee_prom_write16(
IN PRTMP_ADAPTER pAd,
IN USHORT Offset,
IN USHORT value);
#endif // RTMP_PCI_SUPPORT //
#if defined(RTMP_RBUS_SUPPORT) || defined(RTMP_FLASH_SUPPORT)
/*************************************************************************
* Public function declarations for flash-based chipset
************************************************************************/
NDIS_STATUS rtmp_nv_init(
IN PRTMP_ADAPTER pAd);
int rtmp_ee_flash_read(
IN PRTMP_ADAPTER pAd,
IN USHORT Offset,
OUT USHORT *pValue);
int rtmp_ee_flash_write(
IN PRTMP_ADAPTER pAd,
IN USHORT Offset,
IN USHORT Data);
VOID rtmp_ee_flash_read_all(
IN PRTMP_ADAPTER pAd,
IN USHORT *Data);
VOID rtmp_ee_flash_write_all(
IN PRTMP_ADAPTER pAd,
IN USHORT *Data);
#endif // defined(RTMP_RBUS_SUPPORT) || defined(RTMP_FLASH_SUPPORT) //
#ifdef RT30xx
#ifdef RTMP_EFUSE_SUPPORT
int rtmp_ee_efuse_read16(
IN RTMP_ADAPTER *pAd,
IN USHORT Offset,
OUT USHORT *pValue);
int rtmp_ee_efuse_write16(
IN RTMP_ADAPTER *pAd,
IN USHORT Offset,
IN USHORT data);
#endif // RTMP_EFUSE_SUPPORT //
#endif // RT30xx //
/*************************************************************************
* Public function declarations for prom operation callback functions setting
************************************************************************/
INT RtmpChipOpsEepromHook(
IN RTMP_ADAPTER *pAd,
IN INT infType);
#endif // __EEPROM_H__ //