Commit | Line | Data |
---|---|---|
5449c685 FB |
1 | /* |
2 | * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. | |
3 | * All rights reserved. | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify | |
6 | * it under the terms of the GNU General Public License as published by | |
7 | * the Free Software Foundation; either version 2 of the License, or | |
8 | * (at your option) any later version. | |
9 | * | |
10 | * This program is distributed in the hope that it will be useful, | |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | * GNU General Public License for more details. | |
14 | * | |
15 | * You should have received a copy of the GNU General Public License along | |
16 | * with this program; if not, write to the Free Software Foundation, Inc., | |
17 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 | * | |
19 | * File: card.c | |
20 | * Purpose: Provide functions to setup NIC operation mode | |
21 | * Functions: | |
22 | * s_vSafeResetTx - Rest Tx | |
23 | * CARDvSetRSPINF - Set RSPINF | |
24 | * vUpdateIFS - Update slotTime,SIFS,DIFS, and EIFS | |
25 | * CARDvUpdateBasicTopRate - Update BasicTopRate | |
26 | * CARDbAddBasicRate - Add to BasicRateSet | |
27 | * CARDbSetBasicRate - Set Basic Tx Rate | |
28 | * CARDbIsOFDMinBasicRate - Check if any OFDM rate is in BasicRateSet | |
29 | * CARDvSetLoopbackMode - Set Loopback mode | |
30 | * CARDbSoftwareReset - Sortware reset NIC | |
31 | * CARDqGetTSFOffset - Caculate TSFOffset | |
32 | * CARDbGetCurrentTSF - Read Current NIC TSF counter | |
33 | * CARDqGetNextTBTT - Caculate Next Beacon TSF counter | |
34 | * CARDvSetFirstNextTBTT - Set NIC Beacon time | |
35 | * CARDvUpdateNextTBTT - Sync. NIC Beacon time | |
36 | * CARDbRadioPowerOff - Turn Off NIC Radio Power | |
37 | * CARDbRadioPowerOn - Turn On NIC Radio Power | |
38 | * CARDbSetWEPMode - Set NIC Wep mode | |
39 | * CARDbSetTxPower - Set NIC tx power | |
40 | * | |
41 | * Revision History: | |
42 | * 06-10-2003 Bryan YC Fan: Re-write codes to support VT3253 spec. | |
43 | * 08-26-2003 Kyle Hsu: Modify the defination type of dwIoBase. | |
44 | * 09-01-2003 Bryan YC Fan: Add vUpdateIFS(). | |
45 | * | |
46 | */ | |
47 | ||
5449c685 | 48 | #include "tmacro.h" |
5449c685 | 49 | #include "card.h" |
5449c685 | 50 | #include "baseband.h" |
5449c685 | 51 | #include "mac.h" |
5449c685 | 52 | #include "desc.h" |
5449c685 | 53 | #include "rf.h" |
5449c685 | 54 | #include "vntwifi.h" |
5449c685 | 55 | #include "power.h" |
5449c685 | 56 | #include "key.h" |
5449c685 | 57 | #include "rc4.h" |
5449c685 | 58 | #include "country.h" |
5449c685 FB |
59 | |
60 | /*--------------------- Static Definitions -------------------------*/ | |
61 | ||
62 | //static int msglevel =MSG_LEVEL_DEBUG; | |
63 | static int msglevel =MSG_LEVEL_INFO; | |
64 | ||
65 | #define C_SIFS_A 16 // micro sec. | |
66 | #define C_SIFS_BG 10 | |
67 | ||
68 | #define C_EIFS 80 // micro sec. | |
69 | ||
70 | ||
71 | #define C_SLOT_SHORT 9 // micro sec. | |
72 | #define C_SLOT_LONG 20 | |
73 | ||
74 | #define C_CWMIN_A 15 // slot time | |
75 | #define C_CWMIN_B 31 | |
76 | ||
77 | #define C_CWMAX 1023 // slot time | |
78 | ||
79 | #define CARD_MAX_CHANNEL_TBL 56 | |
80 | ||
81 | #define WAIT_BEACON_TX_DOWN_TMO 3 // Times | |
82 | ||
83 | typedef struct tagSChannelTblElement { | |
84 | BYTE byChannelNumber; | |
85 | UINT uFrequency; | |
86 | BOOL bValid; | |
87 | BYTE byMAP; | |
a884847a | 88 | }SChannelTblElement, *PSChannelTblElement; |
5449c685 FB |
89 | |
90 | //1M, 2M, 5M, 11M, 18M, 24M, 36M, 54M | |
91 | static BYTE abyDefaultSuppRatesG[] = {WLAN_EID_SUPP_RATES, 8, 0x02, 0x04, 0x0B, 0x16, 0x24, 0x30, 0x48, 0x6C}; | |
92 | //6M, 9M, 12M, 48M | |
93 | static BYTE abyDefaultExtSuppRatesG[] = {WLAN_EID_EXTSUPP_RATES, 4, 0x0C, 0x12, 0x18, 0x60}; | |
94 | //6M, 9M, 12M, 18M, 24M, 36M, 48M, 54M | |
95 | static BYTE abyDefaultSuppRatesA[] = {WLAN_EID_SUPP_RATES, 8, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C}; | |
96 | //1M, 2M, 5M, 11M, | |
97 | static BYTE abyDefaultSuppRatesB[] = {WLAN_EID_SUPP_RATES, 4, 0x02, 0x04, 0x0B, 0x16}; | |
98 | ||
99 | ||
100 | ||
101 | /*--------------------- Static Classes ----------------------------*/ | |
102 | ||
103 | /*--------------------- Static Variables --------------------------*/ | |
104 | ||
105 | ||
106 | const WORD cwRXBCNTSFOff[MAX_RATE] = | |
107 | {17, 17, 17, 17, 34, 23, 17, 11, 8, 5, 4, 3}; | |
108 | ||
109 | static SChannelTblElement sChannelTbl[CARD_MAX_CHANNEL_TBL+1] = | |
110 | { | |
111 | {0, 0, FALSE, 0}, | |
112 | {1, 2412, TRUE, 0}, | |
113 | {2, 2417, TRUE, 0}, | |
114 | {3, 2422, TRUE, 0}, | |
115 | {4, 2427, TRUE, 0}, | |
116 | {5, 2432, TRUE, 0}, | |
117 | {6, 2437, TRUE, 0}, | |
118 | {7, 2442, TRUE, 0}, | |
119 | {8, 2447, TRUE, 0}, | |
120 | {9, 2452, TRUE, 0}, | |
121 | {10, 2457, TRUE, 0}, | |
122 | {11, 2462, TRUE, 0}, | |
123 | {12, 2467, TRUE, 0}, | |
124 | {13, 2472, TRUE, 0}, | |
125 | {14, 2484, TRUE, 0}, | |
126 | {183, 4915, TRUE, 0}, | |
127 | {184, 4920, TRUE, 0}, | |
128 | {185, 4925, TRUE, 0}, | |
129 | {187, 4935, TRUE, 0}, | |
130 | {188, 4940, TRUE, 0}, | |
131 | {189, 4945, TRUE, 0}, | |
132 | {192, 4960, TRUE, 0}, | |
133 | {196, 4980, TRUE, 0}, | |
134 | {7, 5035, TRUE, 0}, | |
135 | {8, 5040, TRUE, 0}, | |
136 | {9, 5045, TRUE, 0}, | |
137 | {11, 5055, TRUE, 0}, | |
138 | {12, 5060, TRUE, 0}, | |
139 | {16, 5080, TRUE, 0}, | |
140 | {34, 5170, TRUE, 0}, | |
141 | {36, 5180, TRUE, 0}, | |
142 | {38, 5190, TRUE, 0}, | |
143 | {40, 5200, TRUE, 0}, | |
144 | {42, 5210, TRUE, 0}, | |
145 | {44, 5220, TRUE, 0}, | |
146 | {46, 5230, TRUE, 0}, | |
147 | {48, 5240, TRUE, 0}, | |
148 | {52, 5260, TRUE, 0}, | |
149 | {56, 5280, TRUE, 0}, | |
150 | {60, 5300, TRUE, 0}, | |
151 | {64, 5320, TRUE, 0}, | |
152 | {100, 5500, TRUE, 0}, | |
153 | {104, 5520, TRUE, 0}, | |
154 | {108, 5540, TRUE, 0}, | |
155 | {112, 5560, TRUE, 0}, | |
156 | {116, 5580, TRUE, 0}, | |
157 | {120, 5600, TRUE, 0}, | |
158 | {124, 5620, TRUE, 0}, | |
159 | {128, 5640, TRUE, 0}, | |
160 | {132, 5660, TRUE, 0}, | |
161 | {136, 5680, TRUE, 0}, | |
162 | {140, 5700, TRUE, 0}, | |
163 | {149, 5745, TRUE, 0}, | |
164 | {153, 5765, TRUE, 0}, | |
165 | {157, 5785, TRUE, 0}, | |
166 | {161, 5805, TRUE, 0}, | |
167 | {165, 5825, TRUE, 0} | |
168 | }; | |
169 | ||
170 | ||
171 | /************************************************************************ | |
172 | * The Radar regulation rules for each country | |
173 | ************************************************************************/ | |
174 | SCountryTable ChannelRuleTab[CCODE_MAX+1] = | |
175 | { | |
176 | /************************************************************************ | |
177 | * This table is based on Athero driver rules | |
178 | ************************************************************************/ | |
179 | /* Country Available channels, ended with 0 */ | |
180 | /* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 */ | |
181 | {CCODE_FCC, {'U','S'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
182 | , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
183 | {CCODE_TELEC, {'J','P'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
184 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 23, 0, 0, 23, 0, 23, 23, 0, 23, 0, 0, 23, 23, 23, 0, 23, 0, 23, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
185 | {CCODE_ETSI, {'E','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
186 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
187 | {CCODE_RESV3, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
188 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
189 | {CCODE_RESV4, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
190 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
191 | {CCODE_RESV5, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
192 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
193 | {CCODE_RESV6, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
194 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
195 | {CCODE_RESV7, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
196 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
197 | {CCODE_RESV8, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
198 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
199 | {CCODE_RESV9, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
200 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
201 | {CCODE_RESVa, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
202 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
203 | {CCODE_RESVb, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
204 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
205 | {CCODE_RESVc, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
206 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
207 | {CCODE_RESVd, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
208 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
209 | {CCODE_RESVe, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
210 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
211 | {CCODE_ALLBAND, {' ',' '}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} | |
212 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
213 | {CCODE_ALBANIA, {'A','L'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
214 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
215 | {CCODE_ALGERIA, {'D','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
216 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
217 | {CCODE_ARGENTINA, {'A','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} | |
218 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 0} }, | |
219 | {CCODE_ARMENIA, {'A','M'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
220 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
221 | {CCODE_AUSTRALIA, {'A','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
222 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
223 | {CCODE_AUSTRIA, {'A','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
224 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 15, 0, 15, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
225 | {CCODE_AZERBAIJAN, {'A','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
226 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
227 | {CCODE_BAHRAIN, {'B','H'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
228 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
229 | {CCODE_BELARUS, {'B','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
230 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
231 | {CCODE_BELGIUM, {'B','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
232 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
233 | {CCODE_BELIZE, {'B','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
234 | , { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
235 | {CCODE_BOLIVIA, {'B','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
236 | , { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
237 | {CCODE_BRAZIL, {'B','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
238 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
239 | {CCODE_BRUNEI_DARUSSALAM, {'B','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
240 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
241 | {CCODE_BULGARIA, {'B','G'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
242 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 0, 0, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0} }, | |
243 | {CCODE_CANADA, {'C','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
244 | , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
245 | {CCODE_CHILE, {'C','L'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
246 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17} }, | |
247 | {CCODE_CHINA, {'C','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
248 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
249 | {CCODE_COLOMBIA, {'C','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
250 | , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
251 | {CCODE_COSTA_RICA, {'C','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
252 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
253 | {CCODE_CROATIA, {'H','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
254 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
255 | {CCODE_CYPRUS, {'C','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
256 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
257 | {CCODE_CZECH, {'C','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
258 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
259 | {CCODE_DENMARK, {'D','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
260 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
261 | {CCODE_DOMINICAN_REPUBLIC, {'D','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
262 | , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
263 | {CCODE_ECUADOR, {'E','C'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
264 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
265 | {CCODE_EGYPT, {'E','G'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
266 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
267 | {CCODE_EL_SALVADOR, {'S','V'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
268 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
269 | {CCODE_ESTONIA, {'E','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
270 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
271 | {CCODE_FINLAND, {'F','I'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
272 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
273 | {CCODE_FRANCE, {'F','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
274 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
275 | {CCODE_GERMANY, {'D','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
276 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
277 | {CCODE_GREECE, {'G','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
278 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
279 | {CCODE_GEORGIA, {'G','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
280 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
281 | {CCODE_GUATEMALA, {'G','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
282 | , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
283 | {CCODE_HONDURAS, {'H','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
284 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
285 | {CCODE_HONG_KONG, {'H','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
286 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
287 | {CCODE_HUNGARY, {'H','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
288 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
289 | {CCODE_ICELAND, {'I','S'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
290 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
291 | {CCODE_INDIA, {'I','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
292 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
293 | {CCODE_INDONESIA, {'I','D'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
294 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
295 | {CCODE_IRAN, {'I','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
296 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
297 | {CCODE_IRELAND, {'I','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
298 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
299 | {CCODE_ITALY, {'I','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
300 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
301 | {CCODE_ISRAEL, {'I','L'}, { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
302 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
303 | {CCODE_JAPAN, {'J','P'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
304 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
305 | {CCODE_JORDAN, {'J','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
306 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
307 | {CCODE_KAZAKHSTAN, {'K','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
308 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
309 | {CCODE_KUWAIT, {'K','W'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
310 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
311 | {CCODE_LATVIA, {'L','V'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
312 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
313 | {CCODE_LEBANON, {'L','B'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
314 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
315 | {CCODE_LEICHTENSTEIN, {'L','I'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
316 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
317 | {CCODE_LITHUANIA, {'L','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
318 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
319 | {CCODE_LUXEMBURG, {'L','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
320 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
321 | {CCODE_MACAU, {'M','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
322 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
323 | {CCODE_MACEDONIA, {'M','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
324 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
325 | {CCODE_MALTA, {'M','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} | |
326 | , { 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 16, 0, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 0} }, | |
327 | {CCODE_MALAYSIA, {'M','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
328 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
329 | {CCODE_MEXICO, {'M','X'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
330 | , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
331 | {CCODE_MONACO, {'M','C'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
332 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
333 | {CCODE_MOROCCO, {'M','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
334 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
335 | {CCODE_NETHERLANDS, {'N','L'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
336 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
337 | {CCODE_NEW_ZEALAND, {'N','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
338 | , { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
339 | {CCODE_NORTH_KOREA, {'K','P'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} | |
340 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} }, | |
341 | {CCODE_NORWAY, {'N','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
342 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
343 | {CCODE_OMAN, {'O','M'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
344 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
345 | {CCODE_PAKISTAN, {'P','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
346 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
347 | {CCODE_PANAMA, {'P','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
348 | , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
349 | {CCODE_PERU, {'P','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
350 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
351 | {CCODE_PHILIPPINES, {'P','H'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
352 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
353 | {CCODE_POLAND, {'P','L'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
354 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
355 | {CCODE_PORTUGAL, {'P','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
356 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
357 | {CCODE_PUERTO_RICO, {'P','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
358 | , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
359 | {CCODE_QATAR, {'Q','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
360 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
361 | {CCODE_ROMANIA, {'R','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
362 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
363 | {CCODE_RUSSIA, {'R','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
364 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
365 | {CCODE_SAUDI_ARABIA, {'S','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
366 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
367 | {CCODE_SINGAPORE, {'S','G'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
368 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20} }, | |
369 | {CCODE_SLOVAKIA, {'S','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} | |
370 | , { 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 16, 0, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 0} }, | |
371 | {CCODE_SLOVENIA, {'S','I'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
372 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
373 | {CCODE_SOUTH_AFRICA, {'Z','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
374 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
375 | {CCODE_SOUTH_KOREA, {'K','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} | |
376 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} }, | |
377 | {CCODE_SPAIN, {'E','S'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} | |
378 | , { 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 16, 0, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 0} }, | |
379 | {CCODE_SWEDEN, {'S','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
380 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
381 | {CCODE_SWITZERLAND, {'C','H'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
382 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
383 | {CCODE_SYRIA, {'S','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
384 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
385 | {CCODE_TAIWAN, {'T','W'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} | |
386 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 0} }, | |
387 | {CCODE_THAILAND, {'T','H'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} | |
388 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} }, | |
389 | {CCODE_TRINIDAD_TOBAGO, {'T','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
390 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
391 | {CCODE_TUNISIA, {'T','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
392 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
393 | {CCODE_TURKEY, {'T','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
394 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
395 | {CCODE_UK, {'G','B'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} | |
396 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, | |
397 | {CCODE_UKRAINE, {'U','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
398 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
399 | {CCODE_UNITED_ARAB_EMIRATES, {'A','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
400 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
401 | {CCODE_UNITED_STATES, {'U','S'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} | |
402 | , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, | |
403 | {CCODE_URUGUAY, {'U','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} | |
404 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} }, | |
405 | {CCODE_UZBEKISTAN, {'U','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
406 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
407 | {CCODE_VENEZUELA, {'V','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} | |
408 | , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} }, | |
409 | {CCODE_VIETNAM, {'V','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
410 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
411 | {CCODE_YEMEN, {'Y','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
412 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
413 | {CCODE_ZIMBABWE, {'Z','W'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
414 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
415 | {CCODE_JAPAN_W52_W53, {'J','J'}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
416 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, | |
417 | {CCODE_MAX, {'U','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} | |
418 | , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} } | |
419 | /* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 */ | |
420 | }; | |
421 | ||
422 | ||
423 | /*--------------------- Static Functions --------------------------*/ | |
424 | ||
425 | static | |
426 | VOID | |
427 | s_vCaculateOFDMRParameter( | |
428 | IN BYTE byRate, | |
429 | IN CARD_PHY_TYPE ePHYType, | |
430 | OUT PBYTE pbyTxRate, | |
431 | OUT PBYTE pbyRsvTime | |
432 | ); | |
433 | ||
434 | ||
435 | /*--------------------- Export Variables --------------------------*/ | |
436 | ||
437 | /*--------------------- Export Functions --------------------------*/ | |
438 | ||
439 | ||
440 | /*--------------------- Export function -------------------------*/ | |
441 | /************************************************************************ | |
442 | * Country Channel Valid | |
443 | * Input: CountryCode, ChannelNum | |
444 | * ChanneIndex is defined as VT3253 MAC channel: | |
445 | * 1 = 2.4G channel 1 | |
446 | * 2 = 2.4G channel 2 | |
447 | * ... | |
448 | * 14 = 2.4G channel 14 | |
449 | * 15 = 4.9G channel 183 | |
450 | * 16 = 4.9G channel 184 | |
451 | * ..... | |
452 | * Output: TRUE if the specified 5GHz band is allowed to be used. | |
453 | False otherwise. | |
454 | // 4.9G => Ch 183, 184, 185, 187, 188, 189, 192, 196 (Value:15 ~ 22) | |
455 | ||
456 | // 5G => Ch 7, 8, 9, 11, 12, 16, 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64, | |
457 | // 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 (Value 23 ~ 56) | |
458 | ************************************************************************/ | |
459 | //2008-8-4 <add> by chester | |
460 | BOOL | |
461 | ChannelValid(UINT CountryCode, UINT ChannelIndex) | |
462 | { | |
463 | BOOL bValid; | |
464 | ||
465 | bValid = FALSE; | |
466 | /* | |
467 | * If Channel Index is invalid, return invalid | |
468 | */ | |
469 | if ((ChannelIndex > CB_MAX_CHANNEL) || | |
470 | (ChannelIndex == 0)) | |
471 | { | |
472 | bValid = FALSE; | |
473 | goto exit; | |
474 | } | |
475 | ||
476 | bValid = sChannelTbl[ChannelIndex].bValid; | |
477 | ||
478 | exit: | |
479 | return (bValid); | |
480 | ||
481 | } /* end ChannelValid */ | |
482 | ||
483 | ||
484 | /* | |
485 | * Description: Caculate TxRate and RsvTime fields for RSPINF in OFDM mode. | |
486 | * | |
487 | * Parameters: | |
488 | * In: | |
489 | * wRate - Tx Rate | |
490 | * byPktType - Tx Packet type | |
491 | * Out: | |
492 | * pbyTxRate - pointer to RSPINF TxRate field | |
493 | * pbyRsvTime - pointer to RSPINF RsvTime field | |
494 | * | |
495 | * Return Value: none | |
496 | * | |
497 | */ | |
498 | static | |
499 | VOID | |
500 | s_vCaculateOFDMRParameter ( | |
501 | IN BYTE byRate, | |
502 | IN CARD_PHY_TYPE ePHYType, | |
503 | OUT PBYTE pbyTxRate, | |
504 | OUT PBYTE pbyRsvTime | |
505 | ) | |
506 | { | |
507 | switch (byRate) { | |
508 | case RATE_6M : | |
509 | if (ePHYType == PHY_TYPE_11A) {//5GHZ | |
510 | *pbyTxRate = 0x9B; | |
511 | *pbyRsvTime = 44; | |
512 | } | |
513 | else { | |
514 | *pbyTxRate = 0x8B; | |
515 | *pbyRsvTime = 50; | |
516 | } | |
517 | break; | |
518 | ||
519 | case RATE_9M : | |
520 | if (ePHYType == PHY_TYPE_11A) {//5GHZ | |
521 | *pbyTxRate = 0x9F; | |
522 | *pbyRsvTime = 36; | |
523 | } | |
524 | else { | |
525 | *pbyTxRate = 0x8F; | |
526 | *pbyRsvTime = 42; | |
527 | } | |
528 | break; | |
529 | ||
530 | case RATE_12M : | |
531 | if (ePHYType == PHY_TYPE_11A) {//5GHZ | |
532 | *pbyTxRate = 0x9A; | |
533 | *pbyRsvTime = 32; | |
534 | } | |
535 | else { | |
536 | *pbyTxRate = 0x8A; | |
537 | *pbyRsvTime = 38; | |
538 | } | |
539 | break; | |
540 | ||
541 | case RATE_18M : | |
542 | if (ePHYType == PHY_TYPE_11A) {//5GHZ | |
543 | *pbyTxRate = 0x9E; | |
544 | *pbyRsvTime = 28; | |
545 | } | |
546 | else { | |
547 | *pbyTxRate = 0x8E; | |
548 | *pbyRsvTime = 34; | |
549 | } | |
550 | break; | |
551 | ||
552 | case RATE_36M : | |
553 | if (ePHYType == PHY_TYPE_11A) {//5GHZ | |
554 | *pbyTxRate = 0x9D; | |
555 | *pbyRsvTime = 24; | |
556 | } | |
557 | else { | |
558 | *pbyTxRate = 0x8D; | |
559 | *pbyRsvTime = 30; | |
560 | } | |
561 | break; | |
562 | ||
563 | case RATE_48M : | |
564 | if (ePHYType == PHY_TYPE_11A) {//5GHZ | |
565 | *pbyTxRate = 0x98; | |
566 | *pbyRsvTime = 24; | |
567 | } | |
568 | else { | |
569 | *pbyTxRate = 0x88; | |
570 | *pbyRsvTime = 30; | |
571 | } | |
572 | break; | |
573 | ||
574 | case RATE_54M : | |
575 | if (ePHYType == PHY_TYPE_11A) {//5GHZ | |
576 | *pbyTxRate = 0x9C; | |
577 | *pbyRsvTime = 24; | |
578 | } | |
579 | else { | |
580 | *pbyTxRate = 0x8C; | |
581 | *pbyRsvTime = 30; | |
582 | } | |
583 | break; | |
584 | ||
585 | case RATE_24M : | |
586 | default : | |
587 | if (ePHYType == PHY_TYPE_11A) {//5GHZ | |
588 | *pbyTxRate = 0x99; | |
589 | *pbyRsvTime = 28; | |
590 | } | |
591 | else { | |
592 | *pbyTxRate = 0x89; | |
593 | *pbyRsvTime = 34; | |
594 | } | |
595 | break; | |
596 | } | |
597 | } | |
598 | ||
599 | ||
600 | ||
601 | /* | |
602 | * Description: Set RSPINF | |
603 | * | |
604 | * Parameters: | |
605 | * In: | |
606 | * pDevice - The adapter to be set | |
607 | * Out: | |
608 | * none | |
609 | * | |
610 | * Return Value: None. | |
611 | * | |
612 | */ | |
613 | static | |
614 | VOID | |
615 | s_vSetRSPINF (PSDevice pDevice, CARD_PHY_TYPE ePHYType, PVOID pvSupportRateIEs, PVOID pvExtSupportRateIEs) | |
616 | { | |
617 | BYTE byServ = 0, bySignal = 0; // For CCK | |
618 | WORD wLen = 0; | |
619 | BYTE byTxRate = 0, byRsvTime = 0; // For OFDM | |
620 | ||
621 | //Set to Page1 | |
622 | MACvSelectPage1(pDevice->PortOffset); | |
623 | ||
624 | //RSPINF_b_1 | |
625 | BBvCaculateParameter(pDevice, | |
626 | 14, | |
627 | VNTWIFIbyGetACKTxRate(RATE_1M, pvSupportRateIEs, pvExtSupportRateIEs), | |
628 | PK_TYPE_11B, | |
629 | &wLen, | |
630 | &byServ, | |
631 | &bySignal | |
632 | ); | |
633 | ||
634 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_1, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ))); | |
635 | ///RSPINF_b_2 | |
636 | BBvCaculateParameter(pDevice, | |
637 | 14, | |
638 | VNTWIFIbyGetACKTxRate(RATE_2M, pvSupportRateIEs, pvExtSupportRateIEs), | |
639 | PK_TYPE_11B, | |
640 | &wLen, | |
641 | &byServ, | |
642 | &bySignal | |
643 | ); | |
644 | ||
645 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_2, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ))); | |
646 | //RSPINF_b_5 | |
647 | BBvCaculateParameter(pDevice, | |
648 | 14, | |
649 | VNTWIFIbyGetACKTxRate(RATE_5M, pvSupportRateIEs, pvExtSupportRateIEs), | |
650 | PK_TYPE_11B, | |
651 | &wLen, | |
652 | &byServ, | |
653 | &bySignal | |
654 | ); | |
655 | ||
656 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_5, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ))); | |
657 | //RSPINF_b_11 | |
658 | BBvCaculateParameter(pDevice, | |
659 | 14, | |
660 | VNTWIFIbyGetACKTxRate(RATE_11M, pvSupportRateIEs, pvExtSupportRateIEs), | |
661 | PK_TYPE_11B, | |
662 | &wLen, | |
663 | &byServ, | |
664 | &bySignal | |
665 | ); | |
666 | ||
667 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_11, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ))); | |
668 | //RSPINF_a_6 | |
669 | s_vCaculateOFDMRParameter(RATE_6M, | |
670 | ePHYType, | |
671 | &byTxRate, | |
672 | &byRsvTime); | |
673 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_6, MAKEWORD(byTxRate,byRsvTime)); | |
674 | //RSPINF_a_9 | |
675 | s_vCaculateOFDMRParameter(RATE_9M, | |
676 | ePHYType, | |
677 | &byTxRate, | |
678 | &byRsvTime); | |
679 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_9, MAKEWORD(byTxRate,byRsvTime)); | |
680 | //RSPINF_a_12 | |
681 | s_vCaculateOFDMRParameter(RATE_12M, | |
682 | ePHYType, | |
683 | &byTxRate, | |
684 | &byRsvTime); | |
685 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_12, MAKEWORD(byTxRate,byRsvTime)); | |
686 | //RSPINF_a_18 | |
687 | s_vCaculateOFDMRParameter(RATE_18M, | |
688 | ePHYType, | |
689 | &byTxRate, | |
690 | &byRsvTime); | |
691 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_18, MAKEWORD(byTxRate,byRsvTime)); | |
692 | //RSPINF_a_24 | |
693 | s_vCaculateOFDMRParameter(RATE_24M, | |
694 | ePHYType, | |
695 | &byTxRate, | |
696 | &byRsvTime); | |
697 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_24, MAKEWORD(byTxRate,byRsvTime)); | |
698 | //RSPINF_a_36 | |
699 | s_vCaculateOFDMRParameter( | |
700 | VNTWIFIbyGetACKTxRate(RATE_36M, pvSupportRateIEs, pvExtSupportRateIEs), | |
701 | ePHYType, | |
702 | &byTxRate, | |
703 | &byRsvTime); | |
704 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_36, MAKEWORD(byTxRate,byRsvTime)); | |
705 | //RSPINF_a_48 | |
706 | s_vCaculateOFDMRParameter( | |
707 | VNTWIFIbyGetACKTxRate(RATE_48M, pvSupportRateIEs, pvExtSupportRateIEs), | |
708 | ePHYType, | |
709 | &byTxRate, | |
710 | &byRsvTime); | |
711 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_48, MAKEWORD(byTxRate,byRsvTime)); | |
712 | //RSPINF_a_54 | |
713 | s_vCaculateOFDMRParameter( | |
714 | VNTWIFIbyGetACKTxRate(RATE_54M, pvSupportRateIEs, pvExtSupportRateIEs), | |
715 | ePHYType, | |
716 | &byTxRate, | |
717 | &byRsvTime); | |
718 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_54, MAKEWORD(byTxRate,byRsvTime)); | |
719 | //RSPINF_a_72 | |
720 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_72, MAKEWORD(byTxRate,byRsvTime)); | |
721 | //Set to Page0 | |
722 | MACvSelectPage0(pDevice->PortOffset); | |
723 | } | |
724 | ||
725 | ||
726 | ||
727 | ||
728 | /*--------------------- Export Variables --------------------------*/ | |
729 | ||
730 | /*--------------------- Export Functions --------------------------*/ | |
731 | BYTE CARDbyGetChannelMapping (PVOID pDeviceHandler, BYTE byChannelNumber, CARD_PHY_TYPE ePhyType) | |
732 | { | |
733 | UINT ii; | |
734 | ||
735 | if ((ePhyType == PHY_TYPE_11B) || (ePhyType == PHY_TYPE_11G)) { | |
736 | return (byChannelNumber); | |
737 | } | |
738 | ||
739 | for(ii = (CB_MAX_CHANNEL_24G + 1); ii <= CB_MAX_CHANNEL; ) { | |
740 | if (sChannelTbl[ii].byChannelNumber == byChannelNumber) { | |
741 | return ((BYTE) ii); | |
742 | } | |
743 | ii++; | |
744 | } | |
745 | return (0); | |
746 | } | |
747 | ||
748 | ||
749 | BYTE CARDbyGetChannelNumber (PVOID pDeviceHandler, BYTE byChannelIndex) | |
750 | { | |
751 | // PSDevice pDevice = (PSDevice) pDeviceHandler; | |
752 | return(sChannelTbl[byChannelIndex].byChannelNumber); | |
753 | } | |
754 | ||
755 | /* | |
756 | * Description: Set NIC media channel | |
757 | * | |
758 | * Parameters: | |
759 | * In: | |
760 | * pDeviceHandler - The adapter to be set | |
761 | * uConnectionChannel - Channel to be set | |
762 | * Out: | |
763 | * none | |
764 | * | |
765 | * Return Value: TRUE if succeeded; FALSE if failed. | |
766 | * | |
767 | */ | |
768 | BOOL CARDbSetChannel (PVOID pDeviceHandler, UINT uConnectionChannel) | |
769 | { | |
770 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
771 | BOOL bResult = TRUE; | |
772 | ||
773 | ||
774 | if (pDevice->byCurrentCh == uConnectionChannel) { | |
775 | return bResult; | |
776 | } | |
777 | ||
778 | if (sChannelTbl[uConnectionChannel].bValid == FALSE) { | |
779 | return (FALSE); | |
780 | } | |
781 | ||
782 | if ((uConnectionChannel > CB_MAX_CHANNEL_24G) && | |
783 | (pDevice->eCurrentPHYType != PHY_TYPE_11A)) { | |
784 | CARDbSetPhyParameter(pDevice, PHY_TYPE_11A, 0, 0, NULL, NULL); | |
785 | } else if ((uConnectionChannel <= CB_MAX_CHANNEL_24G) && | |
786 | (pDevice->eCurrentPHYType == PHY_TYPE_11A)) { | |
787 | CARDbSetPhyParameter(pDevice, PHY_TYPE_11G, 0, 0, NULL, NULL); | |
788 | } | |
789 | // clear NAV | |
790 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MACCR, MACCR_CLRNAV); | |
791 | ||
792 | //{{ RobertYu: 20041202 | |
793 | //// TX_PE will reserve 3 us for MAX2829 A mode only, it is for better TX throughput | |
794 | ||
795 | if ( pDevice->byRFType == RF_AIROHA7230 ) | |
796 | { | |
797 | RFbAL7230SelectChannelPostProcess(pDevice->PortOffset, pDevice->byCurrentCh, (BYTE)uConnectionChannel); | |
798 | } | |
799 | //}} RobertYu | |
800 | ||
801 | ||
802 | pDevice->byCurrentCh = (BYTE)uConnectionChannel; | |
803 | bResult &= RFbSelectChannel(pDevice->PortOffset, pDevice->byRFType, (BYTE)uConnectionChannel); | |
804 | ||
805 | // Init Synthesizer Table | |
806 | if (pDevice->bEnablePSMode == TRUE) | |
807 | RFvWriteWakeProgSyn(pDevice->PortOffset, pDevice->byRFType, uConnectionChannel); | |
808 | ||
809 | ||
7e809a9b | 810 | //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"CARDbSetMediaChannel: %d\n", (BYTE)uConnectionChannel); |
5449c685 FB |
811 | BBvSoftwareReset(pDevice->PortOffset); |
812 | ||
813 | if (pDevice->byLocalID > REV_ID_VT3253_B1) { | |
814 | // set HW default power register | |
815 | MACvSelectPage1(pDevice->PortOffset); | |
816 | RFbSetPower(pDevice, RATE_1M, pDevice->byCurrentCh); | |
817 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_PWRCCK, pDevice->byCurPwr); | |
818 | RFbSetPower(pDevice, RATE_6M, pDevice->byCurrentCh); | |
819 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_PWROFDM, pDevice->byCurPwr); | |
820 | MACvSelectPage0(pDevice->PortOffset); | |
821 | } | |
822 | ||
823 | if (pDevice->eCurrentPHYType == PHY_TYPE_11B) { | |
824 | #ifdef PLICE_DEBUG | |
825 | //printk("Func:CARDbSetChannel:call RFbSetPower:11B\n"); | |
826 | #endif | |
827 | RFbSetPower(pDevice, RATE_1M, pDevice->byCurrentCh); | |
828 | } else { | |
829 | #ifdef PLICE_DEBUG | |
830 | //printk("Func:CARDbSetChannel:call RFbSetPower\n"); | |
831 | #endif | |
832 | RFbSetPower(pDevice, RATE_6M, pDevice->byCurrentCh); | |
833 | } | |
834 | ||
835 | return(bResult); | |
836 | } | |
837 | ||
838 | ||
839 | ||
840 | /* | |
841 | * Description: Card Send packet function | |
842 | * | |
843 | * Parameters: | |
844 | * In: | |
845 | * pDeviceHandler - The adapter to be set | |
846 | * pPacket - Packet buffer pointer | |
847 | * ePktType - Packet type | |
848 | * uLength - Packet length | |
849 | * Out: | |
850 | * none | |
851 | * | |
852 | * Return Value: TRUE if succeeded; FALSE if failed. | |
853 | * | |
854 | */ | |
855 | /* | |
856 | BOOL CARDbSendPacket (PVOID pDeviceHandler, PVOID pPacket, CARD_PKT_TYPE ePktType, UINT uLength) | |
857 | { | |
858 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
859 | if (ePktType == PKT_TYPE_802_11_MNG) { | |
860 | return TXbTD0Send(pDevice, pPacket, uLength); | |
861 | } else if (ePktType == PKT_TYPE_802_11_BCN) { | |
862 | return TXbBeaconSend(pDevice, pPacket, uLength); | |
863 | } if (ePktType == PKT_TYPE_802_11_DATA) { | |
864 | return TXbTD1Send(pDevice, pPacket, uLength); | |
865 | } | |
866 | ||
867 | return (TRUE); | |
868 | } | |
869 | */ | |
870 | ||
871 | ||
872 | /* | |
873 | * Description: Get Card short preamble option value | |
874 | * | |
875 | * Parameters: | |
876 | * In: | |
877 | * pDevice - The adapter to be set | |
878 | * Out: | |
879 | * none | |
880 | * | |
881 | * Return Value: TRUE if short preamble; otherwise FALSE | |
882 | * | |
883 | */ | |
884 | BOOL CARDbIsShortPreamble (PVOID pDeviceHandler) | |
885 | { | |
886 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
887 | if (pDevice->byPreambleType == 0) { | |
888 | return(FALSE); | |
889 | } | |
890 | return(TRUE); | |
891 | } | |
892 | ||
893 | /* | |
894 | * Description: Get Card short slot time option value | |
895 | * | |
896 | * Parameters: | |
897 | * In: | |
898 | * pDevice - The adapter to be set | |
899 | * Out: | |
900 | * none | |
901 | * | |
902 | * Return Value: TRUE if short slot time; otherwise FALSE | |
903 | * | |
904 | */ | |
905 | BOOL CARDbIsShorSlotTime (PVOID pDeviceHandler) | |
906 | { | |
907 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
908 | return(pDevice->bShortSlotTime); | |
909 | } | |
910 | ||
911 | ||
912 | /* | |
913 | * Description: Update IFS | |
914 | * | |
915 | * Parameters: | |
916 | * In: | |
917 | * pDevice - The adapter to be set | |
918 | * Out: | |
919 | * none | |
920 | * | |
921 | * Return Value: None. | |
922 | * | |
923 | */ | |
924 | BOOL CARDbSetPhyParameter (PVOID pDeviceHandler, CARD_PHY_TYPE ePHYType, WORD wCapInfo, BYTE byERPField, PVOID pvSupportRateIEs, PVOID pvExtSupportRateIEs) | |
925 | { | |
926 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
927 | BYTE byCWMaxMin = 0; | |
928 | BYTE bySlot = 0; | |
929 | BYTE bySIFS = 0; | |
930 | BYTE byDIFS = 0; | |
931 | BYTE byData; | |
932 | // PWLAN_IE_SUPP_RATES pRates = NULL; | |
933 | PWLAN_IE_SUPP_RATES pSupportRates = (PWLAN_IE_SUPP_RATES) pvSupportRateIEs; | |
934 | PWLAN_IE_SUPP_RATES pExtSupportRates = (PWLAN_IE_SUPP_RATES) pvExtSupportRateIEs; | |
935 | ||
936 | ||
937 | //Set SIFS, DIFS, EIFS, SlotTime, CwMin | |
938 | if (ePHYType == PHY_TYPE_11A) { | |
939 | if (pSupportRates == NULL) { | |
940 | pSupportRates = (PWLAN_IE_SUPP_RATES) abyDefaultSuppRatesA; | |
941 | } | |
942 | if (pDevice->byRFType == RF_AIROHA7230) { | |
943 | // AL7230 use single PAPE and connect to PAPE_2.4G | |
944 | MACvSetBBType(pDevice->PortOffset, BB_TYPE_11G); | |
945 | pDevice->abyBBVGA[0] = 0x20; | |
946 | pDevice->abyBBVGA[2] = 0x10; | |
947 | pDevice->abyBBVGA[3] = 0x10; | |
948 | BBbReadEmbeded(pDevice->PortOffset, 0xE7, &byData); | |
949 | if (byData == 0x1C) { | |
950 | BBbWriteEmbeded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]); | |
951 | } | |
952 | } else if (pDevice->byRFType == RF_UW2452) { | |
953 | MACvSetBBType(pDevice->PortOffset, BB_TYPE_11A); | |
954 | pDevice->abyBBVGA[0] = 0x18; | |
955 | BBbReadEmbeded(pDevice->PortOffset, 0xE7, &byData); | |
956 | if (byData == 0x14) { | |
957 | BBbWriteEmbeded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]); | |
958 | BBbWriteEmbeded(pDevice->PortOffset, 0xE1, 0x57); | |
959 | } | |
960 | } else { | |
961 | MACvSetBBType(pDevice->PortOffset, BB_TYPE_11A); | |
962 | } | |
963 | BBbWriteEmbeded(pDevice->PortOffset, 0x88, 0x03); | |
964 | bySlot = C_SLOT_SHORT; | |
965 | bySIFS = C_SIFS_A; | |
966 | byDIFS = C_SIFS_A + 2*C_SLOT_SHORT; | |
967 | byCWMaxMin = 0xA4; | |
968 | } else if (ePHYType == PHY_TYPE_11B) { | |
969 | if (pSupportRates == NULL) { | |
970 | pSupportRates = (PWLAN_IE_SUPP_RATES) abyDefaultSuppRatesB; | |
971 | } | |
972 | MACvSetBBType(pDevice->PortOffset, BB_TYPE_11B); | |
973 | if (pDevice->byRFType == RF_AIROHA7230) { | |
974 | pDevice->abyBBVGA[0] = 0x1C; | |
975 | pDevice->abyBBVGA[2] = 0x00; | |
976 | pDevice->abyBBVGA[3] = 0x00; | |
977 | BBbReadEmbeded(pDevice->PortOffset, 0xE7, &byData); | |
978 | if (byData == 0x20) { | |
979 | BBbWriteEmbeded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]); | |
980 | } | |
981 | } else if (pDevice->byRFType == RF_UW2452) { | |
982 | pDevice->abyBBVGA[0] = 0x14; | |
983 | BBbReadEmbeded(pDevice->PortOffset, 0xE7, &byData); | |
984 | if (byData == 0x18) { | |
985 | BBbWriteEmbeded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]); | |
986 | BBbWriteEmbeded(pDevice->PortOffset, 0xE1, 0xD3); | |
987 | } | |
988 | } | |
989 | BBbWriteEmbeded(pDevice->PortOffset, 0x88, 0x02); | |
990 | bySlot = C_SLOT_LONG; | |
991 | bySIFS = C_SIFS_BG; | |
992 | byDIFS = C_SIFS_BG + 2*C_SLOT_LONG; | |
993 | byCWMaxMin = 0xA5; | |
994 | } else {// PK_TYPE_11GA & PK_TYPE_11GB | |
995 | if (pSupportRates == NULL) { | |
996 | pSupportRates = (PWLAN_IE_SUPP_RATES) abyDefaultSuppRatesG; | |
997 | pExtSupportRates = (PWLAN_IE_SUPP_RATES) abyDefaultExtSuppRatesG; | |
998 | } | |
999 | MACvSetBBType(pDevice->PortOffset, BB_TYPE_11G); | |
1000 | if (pDevice->byRFType == RF_AIROHA7230) { | |
1001 | pDevice->abyBBVGA[0] = 0x1C; | |
1002 | pDevice->abyBBVGA[2] = 0x00; | |
1003 | pDevice->abyBBVGA[3] = 0x00; | |
1004 | BBbReadEmbeded(pDevice->PortOffset, 0xE7, &byData); | |
1005 | if (byData == 0x20) { | |
1006 | BBbWriteEmbeded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]); | |
1007 | } | |
1008 | } else if (pDevice->byRFType == RF_UW2452) { | |
1009 | pDevice->abyBBVGA[0] = 0x14; | |
1010 | BBbReadEmbeded(pDevice->PortOffset, 0xE7, &byData); | |
1011 | if (byData == 0x18) { | |
1012 | BBbWriteEmbeded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]); | |
1013 | BBbWriteEmbeded(pDevice->PortOffset, 0xE1, 0xD3); | |
1014 | } | |
1015 | } | |
1016 | BBbWriteEmbeded(pDevice->PortOffset, 0x88, 0x08); | |
1017 | bySIFS = C_SIFS_BG; | |
1018 | if(VNTWIFIbIsShortSlotTime(wCapInfo)) { | |
1019 | bySlot = C_SLOT_SHORT; | |
1020 | byDIFS = C_SIFS_BG + 2*C_SLOT_SHORT; | |
1021 | } else { | |
1022 | bySlot = C_SLOT_LONG; | |
1023 | byDIFS = C_SIFS_BG + 2*C_SLOT_LONG; | |
1024 | } | |
1025 | if (VNTWIFIbyGetMaxSupportRate(pSupportRates, pExtSupportRates) > RATE_11M) { | |
1026 | byCWMaxMin = 0xA4; | |
1027 | } else { | |
1028 | byCWMaxMin = 0xA5; | |
1029 | } | |
1030 | if (pDevice->bProtectMode != VNTWIFIbIsProtectMode(byERPField)) { | |
1031 | pDevice->bProtectMode = VNTWIFIbIsProtectMode(byERPField); | |
1032 | if (pDevice->bProtectMode) { | |
1033 | MACvEnableProtectMD(pDevice->PortOffset); | |
1034 | } else { | |
1035 | MACvDisableProtectMD(pDevice->PortOffset); | |
1036 | } | |
1037 | } | |
1038 | if (pDevice->bBarkerPreambleMd != VNTWIFIbIsBarkerMode(byERPField)) { | |
1039 | pDevice->bBarkerPreambleMd = VNTWIFIbIsBarkerMode(byERPField); | |
1040 | if (pDevice->bBarkerPreambleMd) { | |
1041 | MACvEnableBarkerPreambleMd(pDevice->PortOffset); | |
1042 | } else { | |
1043 | MACvDisableBarkerPreambleMd(pDevice->PortOffset); | |
1044 | } | |
1045 | } | |
1046 | } | |
1047 | ||
1048 | if (pDevice->byRFType == RF_RFMD2959) { | |
1049 | // bcs TX_PE will reserve 3 us | |
1050 | // hardware's processing time here is 2 us. | |
1051 | bySIFS -= 3; | |
1052 | byDIFS -= 3; | |
1053 | //{{ RobertYu: 20041202 | |
1054 | //// TX_PE will reserve 3 us for MAX2829 A mode only, it is for better TX throughput | |
1055 | //// MAC will need 2 us to process, so the SIFS, DIFS can be shorter by 2 us. | |
1056 | } | |
1057 | ||
1058 | if (pDevice->bySIFS != bySIFS) { | |
1059 | pDevice->bySIFS = bySIFS; | |
1060 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_SIFS, pDevice->bySIFS); | |
1061 | } | |
1062 | if (pDevice->byDIFS != byDIFS) { | |
1063 | pDevice->byDIFS = byDIFS; | |
1064 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_DIFS, pDevice->byDIFS); | |
1065 | } | |
1066 | if (pDevice->byEIFS != C_EIFS) { | |
1067 | pDevice->byEIFS = C_EIFS; | |
1068 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_EIFS, pDevice->byEIFS); | |
1069 | } | |
1070 | if (pDevice->bySlot != bySlot) { | |
1071 | pDevice->bySlot = bySlot; | |
1072 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_SLOT, pDevice->bySlot); | |
1073 | if (pDevice->bySlot == C_SLOT_SHORT) { | |
1074 | pDevice->bShortSlotTime = TRUE; | |
1075 | } else { | |
1076 | pDevice->bShortSlotTime = FALSE; | |
1077 | } | |
1078 | BBvSetShortSlotTime(pDevice); | |
1079 | } | |
1080 | if (pDevice->byCWMaxMin != byCWMaxMin) { | |
1081 | pDevice->byCWMaxMin = byCWMaxMin; | |
1082 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_CWMAXMIN0, pDevice->byCWMaxMin); | |
1083 | } | |
1084 | if (VNTWIFIbIsShortPreamble(wCapInfo)) { | |
1085 | pDevice->byPreambleType = pDevice->byShortPreamble; | |
1086 | } else { | |
1087 | pDevice->byPreambleType = 0; | |
1088 | } | |
1089 | s_vSetRSPINF(pDevice, ePHYType, pSupportRates, pExtSupportRates); | |
1090 | pDevice->eCurrentPHYType = ePHYType; | |
1091 | // set for NDIS OID_802_11SUPPORTED_RATES | |
1092 | return (TRUE); | |
1093 | } | |
1094 | ||
1095 | /* | |
1096 | * Description: Sync. TSF counter to BSS | |
1097 | * Get TSF offset and write to HW | |
1098 | * | |
1099 | * Parameters: | |
1100 | * In: | |
1101 | * pDevice - The adapter to be sync. | |
1102 | * byRxRate - data rate of receive beacon | |
1103 | * qwBSSTimestamp - Rx BCN's TSF | |
1104 | * qwLocalTSF - Local TSF | |
1105 | * Out: | |
1106 | * none | |
1107 | * | |
1108 | * Return Value: none | |
1109 | * | |
1110 | */ | |
1111 | BOOL CARDbUpdateTSF (PVOID pDeviceHandler, BYTE byRxRate, QWORD qwBSSTimestamp, QWORD qwLocalTSF) | |
1112 | { | |
1113 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1114 | QWORD qwTSFOffset; | |
1115 | ||
1116 | HIDWORD(qwTSFOffset) = 0; | |
1117 | LODWORD(qwTSFOffset) = 0; | |
1118 | ||
1119 | if ((HIDWORD(qwBSSTimestamp) != HIDWORD(qwLocalTSF)) || | |
1120 | (LODWORD(qwBSSTimestamp) != LODWORD(qwLocalTSF))) { | |
1121 | qwTSFOffset = CARDqGetTSFOffset(byRxRate, qwBSSTimestamp, qwLocalTSF); | |
1122 | // adjust TSF | |
1123 | // HW's TSF add TSF Offset reg | |
1124 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_TSFOFST, LODWORD(qwTSFOffset)); | |
1125 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_TSFOFST + 4, HIDWORD(qwTSFOffset)); | |
1126 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TFTCTL, TFTCTL_TSFSYNCEN); | |
1127 | } | |
1128 | return(TRUE); | |
1129 | } | |
1130 | ||
1131 | ||
1132 | /* | |
1133 | * Description: Set NIC TSF counter for first Beacon time | |
1134 | * Get NEXTTBTT from adjusted TSF and Beacon Interval | |
1135 | * | |
1136 | * Parameters: | |
1137 | * In: | |
1138 | * pDevice - The adapter to be set. | |
1139 | * wBeaconInterval - Beacon Interval | |
1140 | * Out: | |
1141 | * none | |
1142 | * | |
1143 | * Return Value: TRUE if succeed; otherwise FALSE | |
1144 | * | |
1145 | */ | |
1146 | BOOL CARDbSetBeaconPeriod (PVOID pDeviceHandler, WORD wBeaconInterval) | |
1147 | { | |
1148 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1149 | UINT uBeaconInterval = 0; | |
1150 | UINT uLowNextTBTT = 0; | |
1151 | UINT uHighRemain = 0; | |
1152 | UINT uLowRemain = 0; | |
1153 | QWORD qwNextTBTT; | |
1154 | ||
1155 | HIDWORD(qwNextTBTT) = 0; | |
1156 | LODWORD(qwNextTBTT) = 0; | |
1157 | CARDbGetCurrentTSF(pDevice->PortOffset, &qwNextTBTT); //Get Local TSF counter | |
1158 | uBeaconInterval = wBeaconInterval * 1024; | |
1159 | // Next TBTT = ((local_current_TSF / beacon_interval) + 1 ) * beacon_interval | |
1160 | uLowNextTBTT = (LODWORD(qwNextTBTT) >> 10) << 10; | |
1161 | uLowRemain = (uLowNextTBTT) % uBeaconInterval; | |
1162 | // high dword (mod) bcn | |
1163 | uHighRemain = (((0xffffffff % uBeaconInterval) + 1) * HIDWORD(qwNextTBTT)) | |
1164 | % uBeaconInterval; | |
1165 | uLowRemain = (uHighRemain + uLowRemain) % uBeaconInterval; | |
1166 | uLowRemain = uBeaconInterval - uLowRemain; | |
1167 | ||
1168 | // check if carry when add one beacon interval | |
1169 | if ((~uLowNextTBTT) < uLowRemain) { | |
1170 | HIDWORD(qwNextTBTT) ++ ; | |
1171 | } | |
1172 | LODWORD(qwNextTBTT) = uLowNextTBTT + uLowRemain; | |
1173 | ||
1174 | // set HW beacon interval | |
1175 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_BI, wBeaconInterval); | |
1176 | pDevice->wBeaconInterval = wBeaconInterval; | |
1177 | // Set NextTBTT | |
1178 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_NEXTTBTT, LODWORD(qwNextTBTT)); | |
1179 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_NEXTTBTT + 4, HIDWORD(qwNextTBTT)); | |
1180 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN); | |
1181 | ||
1182 | return(TRUE); | |
1183 | } | |
1184 | ||
1185 | ||
1186 | ||
1187 | /* | |
1188 | * Description: Card Stop Hardware Tx | |
1189 | * | |
1190 | * Parameters: | |
1191 | * In: | |
1192 | * pDeviceHandler - The adapter to be set | |
1193 | * ePktType - Packet type to stop | |
1194 | * Out: | |
1195 | * none | |
1196 | * | |
1197 | * Return Value: TRUE if all data packet complete; otherwise FALSE. | |
1198 | * | |
1199 | */ | |
1200 | BOOL CARDbStopTxPacket (PVOID pDeviceHandler, CARD_PKT_TYPE ePktType) | |
1201 | { | |
1202 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1203 | ||
1204 | ||
1205 | if (ePktType == PKT_TYPE_802_11_ALL) { | |
1206 | pDevice->bStopBeacon = TRUE; | |
1207 | pDevice->bStopTx0Pkt = TRUE; | |
1208 | pDevice->bStopDataPkt = TRUE; | |
1209 | } else if (ePktType == PKT_TYPE_802_11_BCN) { | |
1210 | pDevice->bStopBeacon = TRUE; | |
1211 | } else if (ePktType == PKT_TYPE_802_11_MNG) { | |
1212 | pDevice->bStopTx0Pkt = TRUE; | |
1213 | } else if (ePktType == PKT_TYPE_802_11_DATA) { | |
1214 | pDevice->bStopDataPkt = TRUE; | |
1215 | } | |
1216 | ||
1217 | if (pDevice->bStopBeacon == TRUE) { | |
1218 | if (pDevice->bIsBeaconBufReadySet == TRUE) { | |
1219 | if (pDevice->cbBeaconBufReadySetCnt < WAIT_BEACON_TX_DOWN_TMO) { | |
1220 | pDevice->cbBeaconBufReadySetCnt ++; | |
1221 | return(FALSE); | |
1222 | } | |
1223 | } | |
1224 | pDevice->bIsBeaconBufReadySet = FALSE; | |
1225 | pDevice->cbBeaconBufReadySetCnt = 0; | |
1226 | MACvRegBitsOff(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX); | |
1227 | } | |
1228 | // wait all TD0 complete | |
1229 | if (pDevice->bStopTx0Pkt == TRUE) { | |
1230 | if (pDevice->iTDUsed[TYPE_TXDMA0] != 0){ | |
1231 | return(FALSE); | |
1232 | } | |
1233 | } | |
1234 | // wait all Data TD complete | |
1235 | if (pDevice->bStopDataPkt == TRUE) { | |
1236 | if (pDevice->iTDUsed[TYPE_AC0DMA] != 0){ | |
1237 | return(FALSE); | |
1238 | } | |
1239 | } | |
1240 | ||
1241 | return(TRUE); | |
1242 | } | |
1243 | ||
1244 | ||
1245 | /* | |
1246 | * Description: Card Start Hardware Tx | |
1247 | * | |
1248 | * Parameters: | |
1249 | * In: | |
1250 | * pDeviceHandler - The adapter to be set | |
1251 | * ePktType - Packet type to start | |
1252 | * Out: | |
1253 | * none | |
1254 | * | |
1255 | * Return Value: TRUE if success; FALSE if failed. | |
1256 | * | |
1257 | */ | |
1258 | BOOL CARDbStartTxPacket (PVOID pDeviceHandler, CARD_PKT_TYPE ePktType) | |
1259 | { | |
1260 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1261 | ||
1262 | ||
1263 | if (ePktType == PKT_TYPE_802_11_ALL) { | |
1264 | pDevice->bStopBeacon = FALSE; | |
1265 | pDevice->bStopTx0Pkt = FALSE; | |
1266 | pDevice->bStopDataPkt = FALSE; | |
1267 | } else if (ePktType == PKT_TYPE_802_11_BCN) { | |
1268 | pDevice->bStopBeacon = FALSE; | |
1269 | } else if (ePktType == PKT_TYPE_802_11_MNG) { | |
1270 | pDevice->bStopTx0Pkt = FALSE; | |
1271 | } else if (ePktType == PKT_TYPE_802_11_DATA) { | |
1272 | pDevice->bStopDataPkt = FALSE; | |
1273 | } | |
1274 | ||
1275 | if ((pDevice->bStopBeacon == FALSE) && | |
1276 | (pDevice->bBeaconBufReady == TRUE) && | |
1277 | (pDevice->eOPMode == OP_MODE_ADHOC)) { | |
1278 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX); | |
1279 | } | |
1280 | ||
1281 | return(TRUE); | |
1282 | } | |
1283 | ||
1284 | ||
1285 | ||
1286 | /* | |
1287 | * Description: Card Set BSSID value | |
1288 | * | |
1289 | * Parameters: | |
1290 | * In: | |
1291 | * pDeviceHandler - The adapter to be set | |
1292 | * pbyBSSID - pointer to BSSID field | |
1293 | * bAdhoc - flag to indicate IBSS | |
1294 | * Out: | |
1295 | * none | |
1296 | * | |
1297 | * Return Value: TRUE if success; FALSE if failed. | |
1298 | * | |
1299 | */ | |
1300 | BOOL CARDbSetBSSID(PVOID pDeviceHandler, PBYTE pbyBSSID, CARD_OP_MODE eOPMode) | |
1301 | { | |
1302 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1303 | ||
1304 | MACvWriteBSSIDAddress(pDevice->PortOffset, pbyBSSID); | |
51b6d9c2 | 1305 | memcpy(pDevice->abyBSSID, pbyBSSID, WLAN_BSSID_LEN); |
5449c685 FB |
1306 | if (eOPMode == OP_MODE_ADHOC) { |
1307 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_ADHOC); | |
1308 | } else { | |
1309 | MACvRegBitsOff(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_ADHOC); | |
1310 | } | |
1311 | if (eOPMode == OP_MODE_AP) { | |
1312 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_AP); | |
1313 | } else { | |
1314 | MACvRegBitsOff(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_AP); | |
1315 | } | |
1316 | if (eOPMode == OP_MODE_UNKNOWN) { | |
1317 | MACvRegBitsOff(pDevice->PortOffset, MAC_REG_RCR, RCR_BSSID); | |
1318 | pDevice->bBSSIDFilter = FALSE; | |
1319 | pDevice->byRxMode &= ~RCR_BSSID; | |
7e809a9b | 1320 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wcmd: rx_mode = %x\n", pDevice->byRxMode ); |
5449c685 FB |
1321 | } else { |
1322 | if (IS_NULL_ADDRESS(pDevice->abyBSSID) == FALSE) { | |
1323 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_RCR, RCR_BSSID); | |
1324 | pDevice->bBSSIDFilter = TRUE; | |
1325 | pDevice->byRxMode |= RCR_BSSID; | |
1326 | } | |
7e809a9b | 1327 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: rx_mode = %x\n", pDevice->byRxMode ); |
5449c685 FB |
1328 | } |
1329 | // Adopt BSS state in Adapter Device Object | |
1330 | pDevice->eOPMode = eOPMode; | |
1331 | return(TRUE); | |
1332 | } | |
1333 | ||
1334 | ||
1335 | /* | |
1336 | * Description: Card indicate status | |
1337 | * | |
1338 | * Parameters: | |
1339 | * In: | |
1340 | * pDeviceHandler - The adapter to be set | |
1341 | * eStatus - Status | |
1342 | * Out: | |
1343 | * none | |
1344 | * | |
1345 | * Return Value: TRUE if success; FALSE if failed. | |
1346 | * | |
1347 | */ | |
1348 | ||
1349 | ||
1350 | ||
1351 | ||
1352 | /* | |
1353 | * Description: Save Assoc info. contain in assoc. response frame | |
1354 | * | |
1355 | * Parameters: | |
1356 | * In: | |
1357 | * pDevice - The adapter to be set | |
1358 | * wCapabilityInfo - Capability information | |
1359 | * wStatus - Status code | |
1360 | * wAID - Assoc. ID | |
1361 | * uLen - Length of IEs | |
1362 | * pbyIEs - pointer to IEs | |
1363 | * Out: | |
1364 | * none | |
1365 | * | |
1366 | * Return Value: TRUE if succeed; otherwise FALSE | |
1367 | * | |
1368 | */ | |
1369 | BOOL CARDbSetTxDataRate( | |
1370 | PVOID pDeviceHandler, | |
1371 | WORD wDataRate | |
1372 | ) | |
1373 | { | |
1374 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1375 | ||
1376 | pDevice->wCurrentRate = wDataRate; | |
1377 | return(TRUE); | |
1378 | } | |
1379 | ||
1380 | /*+ | |
1381 | * | |
1382 | * Routine Description: | |
1383 | * Consider to power down when no more packets to tx or rx. | |
1384 | * | |
1385 | * Parameters: | |
1386 | * In: | |
1387 | * pDevice - The adapter to be set | |
1388 | * Out: | |
1389 | * none | |
1390 | * | |
1391 | * Return Value: TRUE if power down success; otherwise FALSE | |
1392 | * | |
1393 | -*/ | |
1394 | BOOL | |
1395 | CARDbPowerDown( | |
1396 | PVOID pDeviceHandler | |
1397 | ) | |
1398 | { | |
1399 | PSDevice pDevice = (PSDevice)pDeviceHandler; | |
1400 | UINT uIdx; | |
1401 | ||
1402 | // check if already in Doze mode | |
1403 | if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) | |
1404 | return TRUE; | |
1405 | ||
1406 | // Froce PSEN on | |
1407 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PSEN); | |
1408 | ||
1409 | // check if all TD are empty, | |
1410 | ||
1411 | for (uIdx = 0; uIdx < TYPE_MAXTD; uIdx ++) { | |
1412 | if (pDevice->iTDUsed[uIdx] != 0) | |
1413 | return FALSE; | |
1414 | } | |
1415 | ||
1416 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_GO2DOZE); | |
7e809a9b | 1417 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Go to Doze ZZZZZZZZZZZZZZZ\n"); |
5449c685 FB |
1418 | return TRUE; |
1419 | } | |
1420 | ||
1421 | /* | |
1422 | * Description: Turn off Radio power | |
1423 | * | |
1424 | * Parameters: | |
1425 | * In: | |
1426 | * pDevice - The adapter to be turned off | |
1427 | * Out: | |
1428 | * none | |
1429 | * | |
1430 | * Return Value: TRUE if success; otherwise FALSE | |
1431 | * | |
1432 | */ | |
1433 | BOOL CARDbRadioPowerOff (PVOID pDeviceHandler) | |
1434 | { | |
1435 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1436 | BOOL bResult = TRUE; | |
1437 | ||
1438 | if (pDevice->bRadioOff == TRUE) | |
1439 | return TRUE; | |
1440 | ||
1441 | ||
1442 | switch (pDevice->byRFType) { | |
1443 | ||
1444 | case RF_RFMD2959: | |
1445 | MACvWordRegBitsOff(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_TXPEINV); | |
1446 | MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE1); | |
1447 | break; | |
1448 | ||
1449 | case RF_AIROHA: | |
1450 | case RF_AL2230S: | |
1451 | case RF_AIROHA7230: //RobertYu:20050104 | |
1452 | MACvWordRegBitsOff(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE2); | |
1453 | MACvWordRegBitsOff(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE3); | |
1454 | break; | |
1455 | ||
1456 | } | |
1457 | ||
1458 | MACvRegBitsOff(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_RXON); | |
1459 | ||
1460 | BBvSetDeepSleep(pDevice->PortOffset, pDevice->byLocalID); | |
1461 | ||
1462 | pDevice->bRadioOff = TRUE; | |
1463 | //2007-0409-03,<Add> by chester | |
1464 | printk("chester power off\n"); | |
1465 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_GPIOCTL0, LED_ACTSET); //LED issue | |
1466 | return bResult; | |
1467 | } | |
1468 | ||
1469 | ||
1470 | /* | |
1471 | * Description: Turn on Radio power | |
1472 | * | |
1473 | * Parameters: | |
1474 | * In: | |
1475 | * pDevice - The adapter to be turned on | |
1476 | * Out: | |
1477 | * none | |
1478 | * | |
1479 | * Return Value: TRUE if success; otherwise FALSE | |
1480 | * | |
1481 | */ | |
1482 | BOOL CARDbRadioPowerOn (PVOID pDeviceHandler) | |
1483 | { | |
1484 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1485 | BOOL bResult = TRUE; | |
1486 | printk("chester power on\n"); | |
1487 | if (pDevice->bRadioControlOff == TRUE){ | |
1488 | if (pDevice->bHWRadioOff == TRUE) printk("chester bHWRadioOff\n"); | |
1489 | if (pDevice->bRadioControlOff == TRUE) printk("chester bRadioControlOff\n"); | |
1490 | return FALSE;} | |
1491 | ||
1492 | if (pDevice->bRadioOff == FALSE) | |
1493 | { | |
1494 | printk("chester pbRadioOff\n"); | |
1495 | return TRUE;} | |
1496 | ||
1497 | BBvExitDeepSleep(pDevice->PortOffset, pDevice->byLocalID); | |
1498 | ||
1499 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_RXON); | |
1500 | ||
1501 | switch (pDevice->byRFType) { | |
1502 | ||
1503 | case RF_RFMD2959: | |
1504 | MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_TXPEINV); | |
1505 | MACvWordRegBitsOff(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE1); | |
1506 | break; | |
1507 | ||
1508 | case RF_AIROHA: | |
1509 | case RF_AL2230S: | |
1510 | case RF_AIROHA7230: //RobertYu:20050104 | |
1511 | MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPE2 | | |
1512 | SOFTPWRCTL_SWPE3)); | |
1513 | break; | |
1514 | ||
1515 | } | |
1516 | ||
1517 | pDevice->bRadioOff = FALSE; | |
1518 | // 2007-0409-03,<Add> by chester | |
1519 | printk("chester power on\n"); | |
1520 | MACvRegBitsOff(pDevice->PortOffset, MAC_REG_GPIOCTL0, LED_ACTSET); //LED issue | |
1521 | return bResult; | |
1522 | } | |
1523 | ||
1524 | ||
1525 | ||
1526 | BOOL CARDbRemoveKey (PVOID pDeviceHandler, PBYTE pbyBSSID) | |
1527 | { | |
1528 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1529 | ||
1530 | KeybRemoveAllKey(&(pDevice->sKey), pbyBSSID, pDevice->PortOffset); | |
1531 | return (TRUE); | |
1532 | } | |
1533 | ||
1534 | ||
1535 | /* | |
1536 | * | |
1537 | * Description: | |
1538 | * Add BSSID in PMKID Candidate list. | |
1539 | * | |
1540 | * Parameters: | |
1541 | * In: | |
1542 | * hDeviceContext - device structure point | |
1543 | * pbyBSSID - BSSID address for adding | |
1544 | * wRSNCap - BSS's RSN capability | |
1545 | * Out: | |
1546 | * none | |
1547 | * | |
1548 | * Return Value: none. | |
1549 | * | |
1550 | -*/ | |
1551 | BOOL | |
1552 | CARDbAdd_PMKID_Candidate ( | |
1553 | IN PVOID pDeviceHandler, | |
1554 | IN PBYTE pbyBSSID, | |
1555 | IN BOOL bRSNCapExist, | |
1556 | IN WORD wRSNCap | |
1557 | ) | |
1558 | { | |
1559 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1560 | PPMKID_CANDIDATE pCandidateList; | |
1561 | UINT ii = 0; | |
1562 | ||
7e809a9b | 1563 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"bAdd_PMKID_Candidate START: (%d)\n", (int)pDevice->gsPMKIDCandidate.NumCandidates); |
5449c685 FB |
1564 | |
1565 | if (pDevice->gsPMKIDCandidate.NumCandidates >= MAX_PMKIDLIST) { | |
7e809a9b | 1566 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFlush_PMKID_Candidate: 3\n"); |
51b6d9c2 | 1567 | memset(&pDevice->gsPMKIDCandidate, 0, sizeof(SPMKIDCandidateEvent)); |
5449c685 FB |
1568 | } |
1569 | ||
1570 | for (ii = 0; ii < 6; ii++) { | |
7e809a9b | 1571 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02X ", *(pbyBSSID + ii)); |
5449c685 | 1572 | } |
7e809a9b | 1573 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); |
5449c685 FB |
1574 | |
1575 | ||
1576 | // Update Old Candidate | |
1577 | for (ii = 0; ii < pDevice->gsPMKIDCandidate.NumCandidates; ii++) { | |
1578 | pCandidateList = &pDevice->gsPMKIDCandidate.CandidateList[ii]; | |
51b6d9c2 | 1579 | if ( !memcmp(pCandidateList->BSSID, pbyBSSID, U_ETHER_ADDR_LEN)) { |
5449c685 FB |
1580 | if ((bRSNCapExist == TRUE) && (wRSNCap & BIT0)) { |
1581 | pCandidateList->Flags |= NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED; | |
1582 | } else { | |
1583 | pCandidateList->Flags &= ~(NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED); | |
1584 | } | |
1585 | return TRUE; | |
1586 | } | |
1587 | } | |
1588 | ||
1589 | // New Candidate | |
1590 | pCandidateList = &pDevice->gsPMKIDCandidate.CandidateList[pDevice->gsPMKIDCandidate.NumCandidates]; | |
1591 | if ((bRSNCapExist == TRUE) && (wRSNCap & BIT0)) { | |
1592 | pCandidateList->Flags |= NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED; | |
1593 | } else { | |
1594 | pCandidateList->Flags &= ~(NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED); | |
1595 | } | |
51b6d9c2 | 1596 | memcpy(pCandidateList->BSSID, pbyBSSID, U_ETHER_ADDR_LEN); |
5449c685 | 1597 | pDevice->gsPMKIDCandidate.NumCandidates++; |
7e809a9b | 1598 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"NumCandidates:%d\n", (int)pDevice->gsPMKIDCandidate.NumCandidates); |
5449c685 FB |
1599 | return TRUE; |
1600 | } | |
1601 | ||
1602 | PVOID | |
1603 | CARDpGetCurrentAddress ( | |
1604 | IN PVOID pDeviceHandler | |
1605 | ) | |
1606 | { | |
1607 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1608 | ||
1609 | return (pDevice->abyCurrentNetAddr); | |
1610 | } | |
1611 | ||
1612 | ||
1613 | ||
1614 | VOID CARDvInitChannelTable (PVOID pDeviceHandler) | |
1615 | { | |
1616 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1617 | BOOL bMultiBand = FALSE; | |
1618 | UINT ii; | |
1619 | ||
1620 | for(ii=1;ii<=CARD_MAX_CHANNEL_TBL;ii++) { | |
1621 | sChannelTbl[ii].bValid = FALSE; | |
1622 | } | |
1623 | ||
1624 | switch (pDevice->byRFType) { | |
1625 | case RF_RFMD2959 : | |
1626 | case RF_AIROHA : | |
1627 | case RF_AL2230S: | |
1628 | case RF_UW2451 : | |
1629 | case RF_VT3226 : | |
1630 | // printk("chester-false\n"); | |
1631 | bMultiBand = FALSE; | |
1632 | break; | |
1633 | case RF_AIROHA7230 : | |
1634 | case RF_UW2452 : | |
1635 | case RF_NOTHING : | |
1636 | default : | |
1637 | bMultiBand = TRUE; | |
1638 | break; | |
1639 | } | |
1640 | ||
1641 | if ((pDevice->dwDiagRefCount != 0) || | |
1642 | (pDevice->b11hEnable == TRUE)) { | |
1643 | if (bMultiBand == TRUE) { | |
1644 | for(ii=0;ii<CARD_MAX_CHANNEL_TBL;ii++) { | |
1645 | sChannelTbl[ii+1].bValid = TRUE; | |
1646 | pDevice->abyRegPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1]; | |
1647 | pDevice->abyLocalPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1]; | |
1648 | } | |
1649 | for(ii=0;ii<CHANNEL_MAX_24G;ii++) { | |
1650 | pDevice->abyRegPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1]; | |
1651 | pDevice->abyLocalPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1]; | |
1652 | } | |
1653 | } else { | |
1654 | for(ii=0;ii<CHANNEL_MAX_24G;ii++) { | |
1655 | //2008-8-4 <add> by chester | |
1656 | if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] != 0) { | |
1657 | sChannelTbl[ii+1].bValid = TRUE; | |
1658 | pDevice->abyRegPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1]; | |
1659 | pDevice->abyLocalPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1]; | |
1660 | } | |
1661 | } | |
1662 | } | |
1663 | } else if (pDevice->byZoneType <= CCODE_MAX) { | |
1664 | if (bMultiBand == TRUE) { | |
1665 | for(ii=0;ii<CARD_MAX_CHANNEL_TBL;ii++) { | |
1666 | if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] != 0) { | |
1667 | sChannelTbl[ii+1].bValid = TRUE; | |
1668 | pDevice->abyRegPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii]; | |
1669 | pDevice->abyLocalPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii]; | |
1670 | } | |
1671 | } | |
1672 | } else { | |
1673 | for(ii=0;ii<CHANNEL_MAX_24G;ii++) { | |
1674 | if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] != 0) { | |
1675 | sChannelTbl[ii+1].bValid = TRUE; | |
1676 | pDevice->abyRegPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii]; | |
1677 | pDevice->abyLocalPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii]; | |
1678 | } | |
1679 | } | |
1680 | } | |
1681 | } | |
7e809a9b | 1682 | DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO"Zone=[%d][%c][%c]!!\n",pDevice->byZoneType,ChannelRuleTab[pDevice->byZoneType].chCountryCode[0],ChannelRuleTab[pDevice->byZoneType].chCountryCode[1]); |
5449c685 FB |
1683 | for(ii=0;ii<CARD_MAX_CHANNEL_TBL;ii++) { |
1684 | if (pDevice->abyRegPwr[ii+1] == 0) { | |
1685 | pDevice->abyRegPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1]; | |
1686 | } | |
1687 | if (pDevice->abyLocalPwr[ii+1] == 0) { | |
1688 | pDevice->abyLocalPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1]; | |
1689 | } | |
1690 | } | |
1691 | } | |
1692 | ||
1693 | ||
1694 | ||
1695 | /* | |
1696 | * | |
1697 | * Description: | |
1698 | * Start Spectrum Measure defined in 802.11h | |
1699 | * | |
1700 | * Parameters: | |
1701 | * In: | |
1702 | * hDeviceContext - device structure point | |
1703 | * Out: | |
1704 | * none | |
1705 | * | |
1706 | * Return Value: none. | |
1707 | * | |
1708 | -*/ | |
1709 | BOOL | |
1710 | CARDbStartMeasure ( | |
1711 | IN PVOID pDeviceHandler, | |
1712 | IN PVOID pvMeasureEIDs, | |
1713 | IN UINT uNumOfMeasureEIDs | |
1714 | ) | |
1715 | { | |
1716 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1717 | PWLAN_IE_MEASURE_REQ pEID = (PWLAN_IE_MEASURE_REQ) pvMeasureEIDs; | |
1718 | QWORD qwCurrTSF; | |
1719 | QWORD qwStartTSF; | |
1720 | BOOL bExpired = TRUE; | |
1721 | WORD wDuration = 0; | |
1722 | ||
1723 | if ((pEID == NULL) || | |
1724 | (uNumOfMeasureEIDs == 0)) { | |
1725 | return (TRUE); | |
1726 | } | |
1727 | CARDbGetCurrentTSF(pDevice->PortOffset, &qwCurrTSF); | |
1728 | if (pDevice->bMeasureInProgress == TRUE) { | |
1729 | pDevice->bMeasureInProgress = FALSE; | |
1730 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byOrgRCR); | |
1731 | MACvSelectPage1(pDevice->PortOffset); | |
1732 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, pDevice->dwOrgMAR0); | |
1733 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR4, pDevice->dwOrgMAR4); | |
1734 | // clear measure control | |
1735 | MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN); | |
1736 | MACvSelectPage0(pDevice->PortOffset); | |
1737 | CARDbSetChannel(pDevice, pDevice->byOrgChannel); | |
1738 | MACvSelectPage1(pDevice->PortOffset); | |
1739 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE); | |
1740 | MACvSelectPage0(pDevice->PortOffset); | |
1741 | } | |
1742 | pDevice->uNumOfMeasureEIDs = uNumOfMeasureEIDs; | |
1743 | ||
1744 | do { | |
1745 | pDevice->pCurrMeasureEID = pEID; | |
1746 | pEID++; | |
1747 | pDevice->uNumOfMeasureEIDs--; | |
1748 | ||
1749 | if (pDevice->byLocalID > REV_ID_VT3253_B1) { | |
1750 | HIDWORD(qwStartTSF) = HIDWORD(*((PQWORD) (pDevice->pCurrMeasureEID->sReq.abyStartTime))); | |
1751 | LODWORD(qwStartTSF) = LODWORD(*((PQWORD) (pDevice->pCurrMeasureEID->sReq.abyStartTime))); | |
1752 | wDuration = *((PWORD) (pDevice->pCurrMeasureEID->sReq.abyDuration)); | |
1753 | wDuration += 1; // 1 TU for channel switching | |
1754 | ||
1755 | if ((LODWORD(qwStartTSF) == 0) && (HIDWORD(qwStartTSF) == 0)) { | |
1756 | // start imediately by setting start TSF == current TSF + 2 TU | |
1757 | LODWORD(qwStartTSF) = LODWORD(qwCurrTSF) + 2048; | |
1758 | HIDWORD(qwStartTSF) = HIDWORD(qwCurrTSF); | |
1759 | if (LODWORD(qwCurrTSF) > LODWORD(qwStartTSF)) { | |
1760 | HIDWORD(qwStartTSF)++; | |
1761 | } | |
1762 | bExpired = FALSE; | |
1763 | break; | |
1764 | } else { | |
1765 | // start at setting start TSF - 1TU(for channel switching) | |
1766 | if (LODWORD(qwStartTSF) < 1024) { | |
1767 | HIDWORD(qwStartTSF)--; | |
1768 | } | |
1769 | LODWORD(qwStartTSF) -= 1024; | |
1770 | } | |
1771 | ||
1772 | if ((HIDWORD(qwCurrTSF) < HIDWORD(qwStartTSF)) || | |
1773 | ((HIDWORD(qwCurrTSF) == HIDWORD(qwStartTSF)) && | |
1774 | (LODWORD(qwCurrTSF) < LODWORD(qwStartTSF))) | |
1775 | ) { | |
1776 | bExpired = FALSE; | |
1777 | break; | |
1778 | } | |
1779 | VNTWIFIbMeasureReport( pDevice->pMgmt, | |
1780 | FALSE, | |
1781 | pDevice->pCurrMeasureEID, | |
1782 | MEASURE_MODE_LATE, | |
1783 | pDevice->byBasicMap, | |
1784 | pDevice->byCCAFraction, | |
1785 | pDevice->abyRPIs | |
1786 | ); | |
1787 | } else { | |
1788 | // hardware do not support measure | |
1789 | VNTWIFIbMeasureReport( pDevice->pMgmt, | |
1790 | FALSE, | |
1791 | pDevice->pCurrMeasureEID, | |
1792 | MEASURE_MODE_INCAPABLE, | |
1793 | pDevice->byBasicMap, | |
1794 | pDevice->byCCAFraction, | |
1795 | pDevice->abyRPIs | |
1796 | ); | |
1797 | } | |
1798 | } while (pDevice->uNumOfMeasureEIDs != 0); | |
1799 | ||
1800 | if (bExpired == FALSE) { | |
1801 | MACvSelectPage1(pDevice->PortOffset); | |
1802 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_MSRSTART, LODWORD(qwStartTSF)); | |
1803 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_MSRSTART + 4, HIDWORD(qwStartTSF)); | |
1804 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_MSRDURATION, wDuration); | |
1805 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN); | |
1806 | MACvSelectPage0(pDevice->PortOffset); | |
1807 | } else { | |
1808 | // all measure start time expired we should complete action | |
1809 | VNTWIFIbMeasureReport( pDevice->pMgmt, | |
1810 | TRUE, | |
1811 | NULL, | |
1812 | 0, | |
1813 | pDevice->byBasicMap, | |
1814 | pDevice->byCCAFraction, | |
1815 | pDevice->abyRPIs | |
1816 | ); | |
1817 | } | |
1818 | return (TRUE); | |
1819 | } | |
1820 | ||
1821 | ||
1822 | /* | |
1823 | * | |
1824 | * Description: | |
1825 | * Do Channel Switch defined in 802.11h | |
1826 | * | |
1827 | * Parameters: | |
1828 | * In: | |
1829 | * hDeviceContext - device structure point | |
1830 | * Out: | |
1831 | * none | |
1832 | * | |
1833 | * Return Value: none. | |
1834 | * | |
1835 | -*/ | |
1836 | BOOL | |
1837 | CARDbChannelSwitch ( | |
1838 | IN PVOID pDeviceHandler, | |
1839 | IN BYTE byMode, | |
1840 | IN BYTE byNewChannel, | |
1841 | IN BYTE byCount | |
1842 | ) | |
1843 | { | |
1844 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1845 | BOOL bResult = TRUE; | |
1846 | ||
1847 | if (byCount == 0) { | |
1848 | bResult = CARDbSetChannel(pDevice, byNewChannel); | |
1849 | VNTWIFIbChannelSwitch(pDevice->pMgmt, byNewChannel); | |
1850 | MACvSelectPage1(pDevice->PortOffset); | |
1851 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE); | |
1852 | MACvSelectPage0(pDevice->PortOffset); | |
1853 | return(bResult); | |
1854 | } | |
1855 | pDevice->byChannelSwitchCount = byCount; | |
1856 | pDevice->byNewChannel = byNewChannel; | |
1857 | pDevice->bChannelSwitch = TRUE; | |
1858 | if (byMode == 1) { | |
1859 | bResult=CARDbStopTxPacket(pDevice, PKT_TYPE_802_11_ALL); | |
1860 | } | |
1861 | return (bResult); | |
1862 | } | |
1863 | ||
1864 | ||
1865 | /* | |
1866 | * | |
1867 | * Description: | |
1868 | * Handle Quiet EID defined in 802.11h | |
1869 | * | |
1870 | * Parameters: | |
1871 | * In: | |
1872 | * hDeviceContext - device structure point | |
1873 | * Out: | |
1874 | * none | |
1875 | * | |
1876 | * Return Value: none. | |
1877 | * | |
1878 | -*/ | |
1879 | BOOL | |
1880 | CARDbSetQuiet ( | |
1881 | IN PVOID pDeviceHandler, | |
1882 | IN BOOL bResetQuiet, | |
1883 | IN BYTE byQuietCount, | |
1884 | IN BYTE byQuietPeriod, | |
1885 | IN WORD wQuietDuration, | |
1886 | IN WORD wQuietOffset | |
1887 | ) | |
1888 | { | |
1889 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1890 | UINT ii = 0; | |
1891 | ||
1892 | if (bResetQuiet == TRUE) { | |
1893 | MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN)); | |
1894 | for(ii=0;ii<MAX_QUIET_COUNT;ii++) { | |
1895 | pDevice->sQuiet[ii].bEnable = FALSE; | |
1896 | } | |
1897 | pDevice->uQuietEnqueue = 0; | |
1898 | pDevice->bEnableFirstQuiet = FALSE; | |
1899 | pDevice->bQuietEnable = FALSE; | |
1900 | pDevice->byQuietStartCount = byQuietCount; | |
1901 | } | |
1902 | if (pDevice->sQuiet[pDevice->uQuietEnqueue].bEnable == FALSE) { | |
1903 | pDevice->sQuiet[pDevice->uQuietEnqueue].bEnable = TRUE; | |
1904 | pDevice->sQuiet[pDevice->uQuietEnqueue].byPeriod = byQuietPeriod; | |
1905 | pDevice->sQuiet[pDevice->uQuietEnqueue].wDuration = wQuietDuration; | |
1906 | pDevice->sQuiet[pDevice->uQuietEnqueue].dwStartTime = (DWORD) byQuietCount; | |
1907 | pDevice->sQuiet[pDevice->uQuietEnqueue].dwStartTime *= pDevice->wBeaconInterval; | |
1908 | pDevice->sQuiet[pDevice->uQuietEnqueue].dwStartTime += wQuietOffset; | |
1909 | pDevice->uQuietEnqueue++; | |
1910 | pDevice->uQuietEnqueue %= MAX_QUIET_COUNT; | |
1911 | if (pDevice->byQuietStartCount < byQuietCount) { | |
1912 | pDevice->byQuietStartCount = byQuietCount; | |
1913 | } | |
1914 | } else { | |
1915 | // we can not handle Quiet EID more | |
1916 | } | |
1917 | return (TRUE); | |
1918 | } | |
1919 | ||
1920 | ||
1921 | /* | |
1922 | * | |
1923 | * Description: | |
1924 | * Do Quiet, It will called by either ISR (after start) or VNTWIFI (before start) so do not need SPINLOCK | |
1925 | * | |
1926 | * Parameters: | |
1927 | * In: | |
1928 | * hDeviceContext - device structure point | |
1929 | * Out: | |
1930 | * none | |
1931 | * | |
1932 | * Return Value: none. | |
1933 | * | |
1934 | -*/ | |
1935 | BOOL | |
1936 | CARDbStartQuiet ( | |
1937 | IN PVOID pDeviceHandler | |
1938 | ) | |
1939 | { | |
1940 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
1941 | UINT ii = 0; | |
1942 | DWORD dwStartTime = 0xFFFFFFFF; | |
1943 | UINT uCurrentQuietIndex = 0; | |
1944 | DWORD dwNextTime = 0; | |
1945 | DWORD dwGap = 0; | |
1946 | DWORD dwDuration = 0; | |
1947 | ||
1948 | for(ii=0;ii<MAX_QUIET_COUNT;ii++) { | |
1949 | if ((pDevice->sQuiet[ii].bEnable == TRUE) && | |
1950 | (dwStartTime > pDevice->sQuiet[ii].dwStartTime)) { | |
1951 | dwStartTime = pDevice->sQuiet[ii].dwStartTime; | |
1952 | uCurrentQuietIndex = ii; | |
1953 | } | |
1954 | } | |
1955 | if (dwStartTime == 0xFFFFFFFF) { | |
1956 | // no more quiet | |
1957 | pDevice->bQuietEnable = FALSE; | |
1958 | MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN)); | |
1959 | } else { | |
1960 | if (pDevice->bQuietEnable == FALSE) { | |
1961 | // first quiet | |
1962 | pDevice->byQuietStartCount--; | |
1963 | dwNextTime = pDevice->sQuiet[uCurrentQuietIndex].dwStartTime; | |
1964 | dwNextTime %= pDevice->wBeaconInterval; | |
1965 | MACvSelectPage1(pDevice->PortOffset); | |
1966 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_QUIETINIT, (WORD) dwNextTime); | |
1967 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_QUIETDUR, (WORD) pDevice->sQuiet[uCurrentQuietIndex].wDuration); | |
1968 | if (pDevice->byQuietStartCount == 0) { | |
1969 | pDevice->bEnableFirstQuiet = FALSE; | |
1970 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN)); | |
1971 | } else { | |
1972 | pDevice->bEnableFirstQuiet = TRUE; | |
1973 | } | |
1974 | MACvSelectPage0(pDevice->PortOffset); | |
1975 | } else { | |
1976 | if (pDevice->dwCurrentQuietEndTime > pDevice->sQuiet[uCurrentQuietIndex].dwStartTime) { | |
1977 | // overlap with previous Quiet | |
1978 | dwGap = pDevice->dwCurrentQuietEndTime - pDevice->sQuiet[uCurrentQuietIndex].dwStartTime; | |
1979 | if (dwGap >= pDevice->sQuiet[uCurrentQuietIndex].wDuration) { | |
1980 | // return FALSE to indicate next quiet expired, should call this function again | |
1981 | return (FALSE); | |
1982 | } | |
1983 | dwDuration = pDevice->sQuiet[uCurrentQuietIndex].wDuration - dwGap; | |
1984 | dwGap = 0; | |
1985 | } else { | |
1986 | dwGap = pDevice->sQuiet[uCurrentQuietIndex].dwStartTime - pDevice->dwCurrentQuietEndTime; | |
1987 | dwDuration = pDevice->sQuiet[uCurrentQuietIndex].wDuration; | |
1988 | } | |
1989 | // set GAP and Next duration | |
1990 | MACvSelectPage1(pDevice->PortOffset); | |
1991 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_QUIETGAP, (WORD) dwGap); | |
1992 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_QUIETDUR, (WORD) dwDuration); | |
1993 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_QUIETRPT); | |
1994 | MACvSelectPage0(pDevice->PortOffset); | |
1995 | } | |
1996 | pDevice->bQuietEnable = TRUE; | |
1997 | pDevice->dwCurrentQuietEndTime = pDevice->sQuiet[uCurrentQuietIndex].dwStartTime; | |
1998 | pDevice->dwCurrentQuietEndTime += pDevice->sQuiet[uCurrentQuietIndex].wDuration; | |
1999 | if (pDevice->sQuiet[uCurrentQuietIndex].byPeriod == 0) { | |
2000 | // not period disable current quiet element | |
2001 | pDevice->sQuiet[uCurrentQuietIndex].bEnable = FALSE; | |
2002 | } else { | |
2003 | // set next period start time | |
2004 | dwNextTime = (DWORD) pDevice->sQuiet[uCurrentQuietIndex].byPeriod; | |
2005 | dwNextTime *= pDevice->wBeaconInterval; | |
2006 | pDevice->sQuiet[uCurrentQuietIndex].dwStartTime = dwNextTime; | |
2007 | } | |
2008 | if (pDevice->dwCurrentQuietEndTime > 0x80010000) { | |
2009 | // decreament all time to avoid wrap around | |
2010 | for(ii=0;ii<MAX_QUIET_COUNT;ii++) { | |
2011 | if (pDevice->sQuiet[ii].bEnable == TRUE) { | |
2012 | pDevice->sQuiet[ii].dwStartTime -= 0x80000000; | |
2013 | } | |
2014 | } | |
2015 | pDevice->dwCurrentQuietEndTime -= 0x80000000; | |
2016 | } | |
2017 | } | |
2018 | return (TRUE); | |
2019 | } | |
2020 | ||
2021 | ||
2022 | /* | |
2023 | * | |
2024 | * Description: | |
2025 | * Set Channel Info of Country | |
2026 | * | |
2027 | * Parameters: | |
2028 | * In: | |
2029 | * hDeviceContext - device structure point | |
2030 | * Out: | |
2031 | * none | |
2032 | * | |
2033 | * Return Value: none. | |
2034 | * | |
2035 | -*/ | |
2036 | VOID | |
2037 | CARDvSetCountryInfo ( | |
2038 | IN PVOID pDeviceHandler, | |
2039 | IN CARD_PHY_TYPE ePHYType, | |
2040 | IN PVOID pIE | |
2041 | ) | |
2042 | { | |
2043 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2044 | UINT ii = 0; | |
2045 | UINT uu = 0; | |
2046 | UINT step = 0; | |
2047 | UINT uNumOfCountryInfo = 0; | |
2048 | BYTE byCh = 0; | |
2049 | PWLAN_IE_COUNTRY pIE_Country = (PWLAN_IE_COUNTRY) pIE; | |
2050 | ||
2051 | ||
2052 | uNumOfCountryInfo = (pIE_Country->len - 3); | |
2053 | uNumOfCountryInfo /= 3; | |
2054 | ||
2055 | if (ePHYType == PHY_TYPE_11A) { | |
2056 | pDevice->bCountryInfo5G = TRUE; | |
2057 | for(ii=CB_MAX_CHANNEL_24G+1;ii<=CARD_MAX_CHANNEL_TBL;ii++) { | |
2058 | sChannelTbl[ii].bValid = FALSE; | |
2059 | } | |
2060 | step = 4; | |
2061 | } else { | |
2062 | pDevice->bCountryInfo24G = TRUE; | |
2063 | for(ii=1;ii<=CB_MAX_CHANNEL_24G;ii++) { | |
2064 | sChannelTbl[ii].bValid = FALSE; | |
2065 | } | |
2066 | step = 1; | |
2067 | } | |
2068 | pDevice->abyCountryCode[0] = pIE_Country->abyCountryString[0]; | |
2069 | pDevice->abyCountryCode[1] = pIE_Country->abyCountryString[1]; | |
2070 | pDevice->abyCountryCode[2] = pIE_Country->abyCountryString[2]; | |
2071 | ||
2072 | for(ii=0;ii<uNumOfCountryInfo;ii++) { | |
2073 | for(uu=0;uu<pIE_Country->abyCountryInfo[ii*3+1];uu++) { | |
2074 | byCh = CARDbyGetChannelMapping(pDevice, (BYTE)(pIE_Country->abyCountryInfo[ii*3]+step*uu), ePHYType); | |
2075 | sChannelTbl[byCh].bValid = TRUE; | |
2076 | pDevice->abyRegPwr[byCh] = pIE_Country->abyCountryInfo[ii*3+2]; | |
2077 | } | |
2078 | } | |
2079 | } | |
2080 | ||
2081 | /* | |
2082 | * | |
2083 | * Description: | |
2084 | * Set Local Power Constraint | |
2085 | * | |
2086 | * Parameters: | |
2087 | * In: | |
2088 | * hDeviceContext - device structure point | |
2089 | * Out: | |
2090 | * none | |
2091 | * | |
2092 | * Return Value: none. | |
2093 | * | |
2094 | -*/ | |
2095 | VOID | |
2096 | CARDvSetPowerConstraint ( | |
2097 | IN PVOID pDeviceHandler, | |
2098 | IN BYTE byChannel, | |
2099 | IN I8 byPower | |
2100 | ) | |
2101 | { | |
2102 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2103 | ||
2104 | if (byChannel > CB_MAX_CHANNEL_24G) { | |
2105 | if (pDevice->bCountryInfo5G == TRUE) { | |
2106 | pDevice->abyLocalPwr[byChannel] = pDevice->abyRegPwr[byChannel] - byPower; | |
2107 | } | |
2108 | } else { | |
2109 | if (pDevice->bCountryInfo24G == TRUE) { | |
2110 | pDevice->abyLocalPwr[byChannel] = pDevice->abyRegPwr[byChannel] - byPower; | |
2111 | } | |
2112 | } | |
2113 | } | |
2114 | ||
2115 | ||
2116 | /* | |
2117 | * | |
2118 | * Description: | |
2119 | * Set Local Power Constraint | |
2120 | * | |
2121 | * Parameters: | |
2122 | * In: | |
2123 | * hDeviceContext - device structure point | |
2124 | * Out: | |
2125 | * none | |
2126 | * | |
2127 | * Return Value: none. | |
2128 | * | |
2129 | -*/ | |
2130 | VOID | |
2131 | CARDvGetPowerCapability ( | |
2132 | IN PVOID pDeviceHandler, | |
2133 | OUT PBYTE pbyMinPower, | |
2134 | OUT PBYTE pbyMaxPower | |
2135 | ) | |
2136 | { | |
2137 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2138 | BYTE byDec = 0; | |
2139 | ||
2140 | *pbyMaxPower = pDevice->abyOFDMDefaultPwr[pDevice->byCurrentCh]; | |
2141 | byDec = pDevice->abyOFDMPwrTbl[pDevice->byCurrentCh]; | |
2142 | if (pDevice->byRFType == RF_UW2452) { | |
2143 | byDec *= 3; | |
2144 | byDec >>= 1; | |
2145 | } else { | |
2146 | byDec <<= 1; | |
2147 | } | |
2148 | *pbyMinPower = pDevice->abyOFDMDefaultPwr[pDevice->byCurrentCh] - byDec; | |
2149 | } | |
2150 | ||
2151 | ||
2152 | /* | |
2153 | * | |
2154 | * Description: | |
2155 | * Set Support Channels IE defined in 802.11h | |
2156 | * | |
2157 | * Parameters: | |
2158 | * In: | |
2159 | * hDeviceContext - device structure point | |
2160 | * Out: | |
2161 | * none | |
2162 | * | |
2163 | * Return Value: none. | |
2164 | * | |
2165 | -*/ | |
2166 | BYTE | |
2167 | CARDbySetSupportChannels ( | |
2168 | IN PVOID pDeviceHandler, | |
2169 | IN OUT PBYTE pbyIEs | |
2170 | ) | |
2171 | { | |
2172 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2173 | UINT ii; | |
2174 | BYTE byCount; | |
2175 | PWLAN_IE_SUPP_CH pIE = (PWLAN_IE_SUPP_CH) pbyIEs; | |
2176 | PBYTE pbyChTupple; | |
2177 | BYTE byLen = 0; | |
2178 | ||
2179 | ||
2180 | pIE->byElementID = WLAN_EID_SUPP_CH; | |
2181 | pIE->len = 0; | |
2182 | pbyChTupple = pIE->abyChannelTuple; | |
2183 | byLen = 2; | |
2184 | // lower band | |
2185 | byCount = 0; | |
2186 | if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[28] == TRUE) { | |
2187 | for (ii=28;ii<36;ii+=2) { | |
2188 | if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] == TRUE) { | |
2189 | byCount++; | |
2190 | } | |
2191 | } | |
2192 | *pbyChTupple++ = 34; | |
2193 | *pbyChTupple++ = byCount; | |
2194 | byLen += 2; | |
2195 | } else if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[29] == TRUE) { | |
2196 | for (ii=29;ii<36;ii+=2) { | |
2197 | if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] == TRUE) { | |
2198 | byCount++; | |
2199 | } | |
2200 | } | |
2201 | *pbyChTupple++ = 36; | |
2202 | *pbyChTupple++ = byCount; | |
2203 | byLen += 2; | |
2204 | } | |
2205 | // middle band | |
2206 | byCount = 0; | |
2207 | if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[36] == TRUE) { | |
2208 | for (ii=36;ii<40;ii++) { | |
2209 | if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] == TRUE) { | |
2210 | byCount++; | |
2211 | } | |
2212 | } | |
2213 | *pbyChTupple++ = 52; | |
2214 | *pbyChTupple++ = byCount; | |
2215 | byLen += 2; | |
2216 | } | |
2217 | // higher band | |
2218 | byCount = 0; | |
2219 | if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[40] == TRUE) { | |
2220 | for (ii=40;ii<51;ii++) { | |
2221 | if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] == TRUE) { | |
2222 | byCount++; | |
2223 | } | |
2224 | } | |
2225 | *pbyChTupple++ = 100; | |
2226 | *pbyChTupple++ = byCount; | |
2227 | byLen += 2; | |
2228 | } else if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[51] == TRUE) { | |
2229 | for (ii=51;ii<56;ii++) { | |
2230 | if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] == TRUE) { | |
2231 | byCount++; | |
2232 | } | |
2233 | } | |
2234 | *pbyChTupple++ = 149; | |
2235 | *pbyChTupple++ = byCount; | |
2236 | byLen += 2; | |
2237 | } | |
2238 | pIE->len += (byLen - 2); | |
2239 | return (byLen); | |
2240 | } | |
2241 | ||
2242 | ||
2243 | /* | |
2244 | * | |
2245 | * Description: | |
2246 | * Get Current Tx Power | |
2247 | * | |
2248 | * Parameters: | |
2249 | * In: | |
2250 | * hDeviceContext - device structure point | |
2251 | * Out: | |
2252 | * none | |
2253 | * | |
2254 | * Return Value: none. | |
2255 | * | |
2256 | -*/ | |
2257 | I8 | |
2258 | CARDbyGetTransmitPower ( | |
2259 | IN PVOID pDeviceHandler | |
2260 | ) | |
2261 | { | |
2262 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2263 | ||
2264 | return (pDevice->byCurPwrdBm); | |
2265 | } | |
2266 | ||
2267 | ||
2268 | BOOL | |
2269 | CARDbChannelGetList ( | |
2270 | IN UINT uCountryCodeIdx, | |
2271 | OUT PBYTE pbyChannelTable | |
2272 | ) | |
2273 | { | |
2274 | if (uCountryCodeIdx >= CCODE_MAX) { | |
2275 | return (FALSE); | |
2276 | } | |
51b6d9c2 | 2277 | memcpy(pbyChannelTable, ChannelRuleTab[uCountryCodeIdx].bChannelIdxList, CB_MAX_CHANNEL); |
5449c685 FB |
2278 | return (TRUE); |
2279 | } | |
2280 | ||
2281 | ||
2282 | VOID | |
2283 | CARDvSetCountryIE( | |
2284 | IN PVOID pDeviceHandler, | |
2285 | IN PVOID pIE | |
2286 | ) | |
2287 | { | |
2288 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2289 | UINT ii; | |
2290 | PWLAN_IE_COUNTRY pIECountry = (PWLAN_IE_COUNTRY) pIE; | |
2291 | ||
2292 | pIECountry->byElementID = WLAN_EID_COUNTRY; | |
2293 | pIECountry->len = 0; | |
2294 | pIECountry->abyCountryString[0] = ChannelRuleTab[pDevice->byZoneType].chCountryCode[0]; | |
2295 | pIECountry->abyCountryString[1] = ChannelRuleTab[pDevice->byZoneType].chCountryCode[1]; | |
2296 | pIECountry->abyCountryString[2] = ' '; | |
2297 | for (ii = CB_MAX_CHANNEL_24G; ii < CB_MAX_CHANNEL; ii++ ) { | |
2298 | if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] != 0) { | |
2299 | pIECountry->abyCountryInfo[pIECountry->len++] = sChannelTbl[ii+1].byChannelNumber; | |
2300 | pIECountry->abyCountryInfo[pIECountry->len++] = 1; | |
2301 | pIECountry->abyCountryInfo[pIECountry->len++] = ChannelRuleTab[pDevice->byZoneType].byPower[ii]; | |
2302 | } | |
2303 | } | |
2304 | pIECountry->len += 3; | |
2305 | } | |
2306 | ||
2307 | ||
2308 | BOOL | |
2309 | CARDbGetChannelMapInfo( | |
2310 | IN PVOID pDeviceHandler, | |
2311 | IN UINT uChannelIndex, | |
2312 | OUT PBYTE pbyChannelNumber, | |
2313 | OUT PBYTE pbyMap | |
2314 | ) | |
2315 | { | |
2316 | // PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2317 | ||
2318 | if (uChannelIndex > CB_MAX_CHANNEL) { | |
2319 | return FALSE; | |
2320 | } | |
2321 | *pbyChannelNumber = sChannelTbl[uChannelIndex].byChannelNumber; | |
2322 | *pbyMap = sChannelTbl[uChannelIndex].byMAP; | |
2323 | return sChannelTbl[uChannelIndex].bValid; | |
2324 | } | |
2325 | ||
2326 | ||
2327 | VOID | |
2328 | CARDvSetChannelMapInfo( | |
2329 | IN PVOID pDeviceHandler, | |
2330 | IN UINT uChannelIndex, | |
2331 | IN BYTE byMap | |
2332 | ) | |
2333 | { | |
2334 | // PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2335 | ||
2336 | if (uChannelIndex > CB_MAX_CHANNEL) { | |
2337 | return; | |
2338 | } | |
2339 | sChannelTbl[uChannelIndex].byMAP |= byMap; | |
2340 | } | |
2341 | ||
2342 | ||
2343 | VOID | |
2344 | CARDvClearChannelMapInfo( | |
2345 | IN PVOID pDeviceHandler | |
2346 | ) | |
2347 | { | |
2348 | // PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2349 | UINT ii = 0; | |
2350 | ||
2351 | for (ii = 1; ii <= CB_MAX_CHANNEL; ii++) { | |
2352 | sChannelTbl[ii].byMAP = 0; | |
2353 | } | |
2354 | } | |
2355 | ||
2356 | ||
2357 | BYTE | |
2358 | CARDbyAutoChannelSelect( | |
2359 | IN PVOID pDeviceHandler, | |
2360 | CARD_PHY_TYPE ePHYType | |
2361 | ) | |
2362 | { | |
2363 | // PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2364 | UINT ii = 0; | |
2365 | BYTE byOptionChannel = 0; | |
2366 | INT aiWeight[CB_MAX_CHANNEL_24G+1] = {-1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; | |
2367 | ||
2368 | if (ePHYType == PHY_TYPE_11A) { | |
2369 | for(ii=CB_MAX_CHANNEL_24G+1;ii<=CB_MAX_CHANNEL;ii++) { | |
2370 | if (sChannelTbl[ii].bValid == TRUE) { | |
2371 | if (byOptionChannel == 0) { | |
2372 | byOptionChannel = (BYTE) ii; | |
2373 | } | |
2374 | if (sChannelTbl[ii].byMAP == 0) { | |
2375 | return ((BYTE) ii); | |
256a816b | 2376 | } else if ( !(sChannelTbl[ii].byMAP & 0x08)) { |
5449c685 FB |
2377 | byOptionChannel = (BYTE) ii; |
2378 | } | |
2379 | } | |
2380 | } | |
2381 | } else { | |
2382 | byOptionChannel = 0; | |
2383 | for(ii=1;ii<=CB_MAX_CHANNEL_24G;ii++) { | |
2384 | if (sChannelTbl[ii].bValid == TRUE) { | |
2385 | if (sChannelTbl[ii].byMAP == 0) { | |
2386 | aiWeight[ii] += 100; | |
256a816b | 2387 | } else if (sChannelTbl[ii].byMAP & 0x01) { |
5449c685 FB |
2388 | if (ii > 3) { |
2389 | aiWeight[ii-3] -= 10; | |
2390 | } | |
2391 | if (ii > 2) { | |
2392 | aiWeight[ii-2] -= 20; | |
2393 | } | |
2394 | if (ii > 1) { | |
2395 | aiWeight[ii-1] -= 40; | |
2396 | } | |
2397 | aiWeight[ii] -= 80; | |
2398 | if (ii < CB_MAX_CHANNEL_24G) { | |
2399 | aiWeight[ii+1] -= 40; | |
2400 | } | |
2401 | if (ii < (CB_MAX_CHANNEL_24G - 1)) { | |
2402 | aiWeight[ii+2] -= 20; | |
2403 | } | |
2404 | if (ii < (CB_MAX_CHANNEL_24G - 2)) { | |
2405 | aiWeight[ii+3] -= 10; | |
2406 | } | |
2407 | } | |
2408 | } | |
2409 | } | |
2410 | for(ii=1;ii<=CB_MAX_CHANNEL_24G;ii++) { | |
2411 | if ((sChannelTbl[ii].bValid == TRUE) && | |
2412 | (aiWeight[ii] > aiWeight[byOptionChannel])) { | |
2413 | byOptionChannel = (BYTE) ii; | |
2414 | } | |
2415 | } | |
2416 | } | |
2417 | return (byOptionChannel); | |
2418 | } | |
2419 | ||
2420 | ||
2421 | ||
2422 | //xxx | |
2423 | VOID | |
2424 | CARDvSafeResetTx ( | |
2425 | IN PVOID pDeviceHandler | |
2426 | ) | |
2427 | { | |
2428 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2429 | UINT uu; | |
2430 | PSTxDesc pCurrTD; | |
2431 | ||
2432 | // initialize TD index | |
2433 | pDevice->apTailTD[0] = pDevice->apCurrTD[0] = &(pDevice->apTD0Rings[0]); | |
2434 | pDevice->apTailTD[1] = pDevice->apCurrTD[1] = &(pDevice->apTD1Rings[0]); | |
2435 | ||
2436 | for (uu = 0; uu < TYPE_MAXTD; uu ++) | |
2437 | pDevice->iTDUsed[uu] = 0; | |
2438 | ||
2439 | for (uu = 0; uu < pDevice->sOpts.nTxDescs[0]; uu++) { | |
2440 | pCurrTD = &(pDevice->apTD0Rings[uu]); | |
2441 | pCurrTD->m_td0TD0.f1Owner = OWNED_BY_HOST; | |
2442 | // init all Tx Packet pointer to NULL | |
2443 | } | |
2444 | for (uu = 0; uu < pDevice->sOpts.nTxDescs[1]; uu++) { | |
2445 | pCurrTD = &(pDevice->apTD1Rings[uu]); | |
2446 | pCurrTD->m_td0TD0.f1Owner = OWNED_BY_HOST; | |
2447 | // init all Tx Packet pointer to NULL | |
2448 | } | |
2449 | ||
2450 | // set MAC TD pointer | |
2451 | MACvSetCurrTXDescAddr(TYPE_TXDMA0, pDevice->PortOffset, | |
2452 | (pDevice->td0_pool_dma)); | |
2453 | ||
2454 | MACvSetCurrTXDescAddr(TYPE_AC0DMA, pDevice->PortOffset, | |
2455 | (pDevice->td1_pool_dma)); | |
2456 | ||
2457 | // set MAC Beacon TX pointer | |
2458 | MACvSetCurrBCNTxDescAddr(pDevice->PortOffset, | |
2459 | (pDevice->tx_beacon_dma)); | |
2460 | ||
2461 | } | |
2462 | ||
2463 | ||
2464 | ||
2465 | /*+ | |
2466 | * | |
2467 | * Description: | |
2468 | * Reset Rx | |
2469 | * | |
2470 | * Parameters: | |
2471 | * In: | |
2472 | * pDevice - Pointer to the adapter | |
2473 | * Out: | |
2474 | * none | |
2475 | * | |
2476 | * Return Value: none | |
2477 | * | |
2478 | -*/ | |
2479 | VOID | |
2480 | CARDvSafeResetRx ( | |
2481 | IN PVOID pDeviceHandler | |
2482 | ) | |
2483 | { | |
2484 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2485 | UINT uu; | |
2486 | PSRxDesc pDesc; | |
2487 | ||
2488 | ||
2489 | ||
2490 | // initialize RD index | |
2491 | pDevice->pCurrRD[0]=&(pDevice->aRD0Ring[0]); | |
2492 | pDevice->pCurrRD[1]=&(pDevice->aRD1Ring[0]); | |
2493 | ||
2494 | // init state, all RD is chip's | |
2495 | for (uu = 0; uu < pDevice->sOpts.nRxDescs0; uu++) { | |
2496 | pDesc =&(pDevice->aRD0Ring[uu]); | |
2497 | pDesc->m_rd0RD0.wResCount = (WORD)(pDevice->rx_buf_sz); | |
2498 | pDesc->m_rd0RD0.f1Owner=OWNED_BY_NIC; | |
2499 | pDesc->m_rd1RD1.wReqCount = (WORD)(pDevice->rx_buf_sz); | |
2500 | } | |
2501 | ||
2502 | // init state, all RD is chip's | |
2503 | for (uu = 0; uu < pDevice->sOpts.nRxDescs1; uu++) { | |
2504 | pDesc =&(pDevice->aRD1Ring[uu]); | |
2505 | pDesc->m_rd0RD0.wResCount = (WORD)(pDevice->rx_buf_sz); | |
2506 | pDesc->m_rd0RD0.f1Owner=OWNED_BY_NIC; | |
2507 | pDesc->m_rd1RD1.wReqCount = (WORD)(pDevice->rx_buf_sz); | |
2508 | } | |
2509 | ||
2510 | pDevice->cbDFCB = CB_MAX_RX_FRAG; | |
2511 | pDevice->cbFreeDFCB = pDevice->cbDFCB; | |
2512 | ||
2513 | // set perPkt mode | |
2514 | MACvRx0PerPktMode(pDevice->PortOffset); | |
2515 | MACvRx1PerPktMode(pDevice->PortOffset); | |
2516 | // set MAC RD pointer | |
2517 | MACvSetCurrRx0DescAddr(pDevice->PortOffset, | |
2518 | pDevice->rd0_pool_dma); | |
2519 | ||
2520 | MACvSetCurrRx1DescAddr(pDevice->PortOffset, | |
2521 | pDevice->rd1_pool_dma); | |
2522 | } | |
2523 | ||
2524 | ||
2525 | ||
2526 | ||
2527 | /* | |
2528 | * Description: Get response Control frame rate in CCK mode | |
2529 | * | |
2530 | * Parameters: | |
2531 | * In: | |
2532 | * pDevice - The adapter to be set | |
2533 | * wRateIdx - Receiving data rate | |
2534 | * Out: | |
2535 | * none | |
2536 | * | |
2537 | * Return Value: response Control frame rate | |
2538 | * | |
2539 | */ | |
2540 | WORD CARDwGetCCKControlRate(PVOID pDeviceHandler, WORD wRateIdx) | |
2541 | { | |
2542 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2543 | UINT ui = (UINT)wRateIdx; | |
2544 | ||
2545 | while (ui > RATE_1M) { | |
2546 | if (pDevice->wBasicRate & ((WORD)1 << ui)) { | |
2547 | return (WORD)ui; | |
2548 | } | |
2549 | ui --; | |
2550 | } | |
2551 | return (WORD)RATE_1M; | |
2552 | } | |
2553 | ||
2554 | /* | |
2555 | * Description: Get response Control frame rate in OFDM mode | |
2556 | * | |
2557 | * Parameters: | |
2558 | * In: | |
2559 | * pDevice - The adapter to be set | |
2560 | * wRateIdx - Receiving data rate | |
2561 | * Out: | |
2562 | * none | |
2563 | * | |
2564 | * Return Value: response Control frame rate | |
2565 | * | |
2566 | */ | |
2567 | WORD CARDwGetOFDMControlRate (PVOID pDeviceHandler, WORD wRateIdx) | |
2568 | { | |
2569 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2570 | UINT ui = (UINT)wRateIdx; | |
2571 | ||
7e809a9b | 2572 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BASIC RATE: %X\n", pDevice->wBasicRate); |
5449c685 FB |
2573 | |
2574 | if (!CARDbIsOFDMinBasicRate((PVOID)pDevice)) { | |
7e809a9b | 2575 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"CARDwGetOFDMControlRate:(NO OFDM) %d\n", wRateIdx); |
5449c685 FB |
2576 | if (wRateIdx > RATE_24M) |
2577 | wRateIdx = RATE_24M; | |
2578 | return wRateIdx; | |
2579 | } | |
2580 | while (ui > RATE_11M) { | |
2581 | if (pDevice->wBasicRate & ((WORD)1 << ui)) { | |
7e809a9b | 2582 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"CARDwGetOFDMControlRate : %d\n", ui); |
5449c685 FB |
2583 | return (WORD)ui; |
2584 | } | |
2585 | ui --; | |
2586 | } | |
7e809a9b | 2587 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"CARDwGetOFDMControlRate: 6M\n"); |
5449c685 FB |
2588 | return (WORD)RATE_24M; |
2589 | } | |
2590 | ||
2591 | ||
2592 | /* | |
2593 | * Description: Set RSPINF | |
2594 | * | |
2595 | * Parameters: | |
2596 | * In: | |
2597 | * pDevice - The adapter to be set | |
2598 | * Out: | |
2599 | * none | |
2600 | * | |
2601 | * Return Value: None. | |
2602 | * | |
2603 | */ | |
2604 | void CARDvSetRSPINF (PVOID pDeviceHandler, CARD_PHY_TYPE ePHYType) | |
2605 | { | |
2606 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2607 | BYTE byServ = 0x00, bySignal = 0x00; //For CCK | |
2608 | WORD wLen = 0x0000; | |
2609 | BYTE byTxRate, byRsvTime; //For OFDM | |
2610 | ||
2611 | //Set to Page1 | |
2612 | MACvSelectPage1(pDevice->PortOffset); | |
2613 | ||
2614 | //RSPINF_b_1 | |
2615 | BBvCaculateParameter(pDevice, | |
2616 | 14, | |
2617 | CARDwGetCCKControlRate((PVOID)pDevice, RATE_1M), | |
2618 | PK_TYPE_11B, | |
2619 | &wLen, | |
2620 | &byServ, | |
2621 | &bySignal | |
2622 | ); | |
2623 | ||
2624 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_1, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ))); | |
2625 | ///RSPINF_b_2 | |
2626 | BBvCaculateParameter(pDevice, | |
2627 | 14, | |
2628 | CARDwGetCCKControlRate((PVOID)pDevice, RATE_2M), | |
2629 | PK_TYPE_11B, | |
2630 | &wLen, | |
2631 | &byServ, | |
2632 | &bySignal | |
2633 | ); | |
2634 | ||
2635 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_2, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ))); | |
2636 | //RSPINF_b_5 | |
2637 | BBvCaculateParameter(pDevice, | |
2638 | 14, | |
2639 | CARDwGetCCKControlRate((PVOID)pDevice, RATE_5M), | |
2640 | PK_TYPE_11B, | |
2641 | &wLen, | |
2642 | &byServ, | |
2643 | &bySignal | |
2644 | ); | |
2645 | ||
2646 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_5, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ))); | |
2647 | //RSPINF_b_11 | |
2648 | BBvCaculateParameter(pDevice, | |
2649 | 14, | |
2650 | CARDwGetCCKControlRate((PVOID)pDevice, RATE_11M), | |
2651 | PK_TYPE_11B, | |
2652 | &wLen, | |
2653 | &byServ, | |
2654 | &bySignal | |
2655 | ); | |
2656 | ||
2657 | VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_11, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ))); | |
2658 | //RSPINF_a_6 | |
2659 | s_vCaculateOFDMRParameter(RATE_6M, | |
2660 | ePHYType, | |
2661 | &byTxRate, | |
2662 | &byRsvTime); | |
2663 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_6, MAKEWORD(byTxRate,byRsvTime)); | |
2664 | //RSPINF_a_9 | |
2665 | s_vCaculateOFDMRParameter(RATE_9M, | |
2666 | ePHYType, | |
2667 | &byTxRate, | |
2668 | &byRsvTime); | |
2669 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_9, MAKEWORD(byTxRate,byRsvTime)); | |
2670 | //RSPINF_a_12 | |
2671 | s_vCaculateOFDMRParameter(RATE_12M, | |
2672 | ePHYType, | |
2673 | &byTxRate, | |
2674 | &byRsvTime); | |
2675 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_12, MAKEWORD(byTxRate,byRsvTime)); | |
2676 | //RSPINF_a_18 | |
2677 | s_vCaculateOFDMRParameter(RATE_18M, | |
2678 | ePHYType, | |
2679 | &byTxRate, | |
2680 | &byRsvTime); | |
2681 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_18, MAKEWORD(byTxRate,byRsvTime)); | |
2682 | //RSPINF_a_24 | |
2683 | s_vCaculateOFDMRParameter(RATE_24M, | |
2684 | ePHYType, | |
2685 | &byTxRate, | |
2686 | &byRsvTime); | |
2687 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_24, MAKEWORD(byTxRate,byRsvTime)); | |
2688 | //RSPINF_a_36 | |
2689 | s_vCaculateOFDMRParameter(CARDwGetOFDMControlRate((PVOID)pDevice, RATE_36M), | |
2690 | ePHYType, | |
2691 | &byTxRate, | |
2692 | &byRsvTime); | |
2693 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_36, MAKEWORD(byTxRate,byRsvTime)); | |
2694 | //RSPINF_a_48 | |
2695 | s_vCaculateOFDMRParameter(CARDwGetOFDMControlRate((PVOID)pDevice, RATE_48M), | |
2696 | ePHYType, | |
2697 | &byTxRate, | |
2698 | &byRsvTime); | |
2699 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_48, MAKEWORD(byTxRate,byRsvTime)); | |
2700 | //RSPINF_a_54 | |
2701 | s_vCaculateOFDMRParameter(CARDwGetOFDMControlRate((PVOID)pDevice, RATE_54M), | |
2702 | ePHYType, | |
2703 | &byTxRate, | |
2704 | &byRsvTime); | |
2705 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_54, MAKEWORD(byTxRate,byRsvTime)); | |
2706 | ||
2707 | //RSPINF_a_72 | |
2708 | s_vCaculateOFDMRParameter(CARDwGetOFDMControlRate((PVOID)pDevice, RATE_54M), | |
2709 | ePHYType, | |
2710 | &byTxRate, | |
2711 | &byRsvTime); | |
2712 | VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_72, MAKEWORD(byTxRate,byRsvTime)); | |
2713 | //Set to Page0 | |
2714 | MACvSelectPage0(pDevice->PortOffset); | |
2715 | } | |
2716 | ||
2717 | /* | |
2718 | * Description: Update IFS | |
2719 | * | |
2720 | * Parameters: | |
2721 | * In: | |
2722 | * pDevice - The adapter to be set | |
2723 | * Out: | |
2724 | * none | |
2725 | * | |
2726 | * Return Value: None. | |
2727 | * | |
2728 | */ | |
2729 | void vUpdateIFS (PVOID pDeviceHandler) | |
2730 | { | |
2731 | //Set SIFS, DIFS, EIFS, SlotTime, CwMin | |
2732 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2733 | ||
2734 | BYTE byMaxMin = 0; | |
2735 | if (pDevice->byPacketType==PK_TYPE_11A) {//0000 0000 0000 0000,11a | |
2736 | pDevice->uSlot = C_SLOT_SHORT; | |
2737 | pDevice->uSIFS = C_SIFS_A; | |
2738 | pDevice->uDIFS = C_SIFS_A + 2*C_SLOT_SHORT; | |
2739 | pDevice->uCwMin = C_CWMIN_A; | |
2740 | byMaxMin = 4; | |
2741 | } | |
2742 | else if (pDevice->byPacketType==PK_TYPE_11B) {//0000 0001 0000 0000,11b | |
2743 | pDevice->uSlot = C_SLOT_LONG; | |
2744 | pDevice->uSIFS = C_SIFS_BG; | |
2745 | pDevice->uDIFS = C_SIFS_BG + 2*C_SLOT_LONG; | |
2746 | pDevice->uCwMin = C_CWMIN_B; | |
2747 | byMaxMin = 5; | |
2748 | } | |
2749 | else { // PK_TYPE_11GA & PK_TYPE_11GB | |
2750 | pDevice->uSIFS = C_SIFS_BG; | |
2751 | if (pDevice->bShortSlotTime) { | |
2752 | pDevice->uSlot = C_SLOT_SHORT; | |
2753 | } else { | |
2754 | pDevice->uSlot = C_SLOT_LONG; | |
2755 | } | |
2756 | pDevice->uDIFS = C_SIFS_BG + 2*pDevice->uSlot; | |
2757 | if (pDevice->wBasicRate & 0x0150) { //0000 0001 0101 0000,24M,12M,6M | |
2758 | pDevice->uCwMin = C_CWMIN_A; | |
2759 | byMaxMin = 4; | |
2760 | } | |
2761 | else { | |
2762 | pDevice->uCwMin = C_CWMIN_B; | |
2763 | byMaxMin = 5; | |
2764 | } | |
2765 | } | |
2766 | ||
2767 | pDevice->uCwMax = C_CWMAX; | |
2768 | pDevice->uEIFS = C_EIFS; | |
2769 | if (pDevice->byRFType == RF_RFMD2959) { | |
2770 | // bcs TX_PE will reserve 3 us | |
2771 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_SIFS, (BYTE)(pDevice->uSIFS - 3)); | |
2772 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_DIFS, (BYTE)(pDevice->uDIFS - 3)); | |
2773 | } else { | |
2774 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_SIFS, (BYTE)pDevice->uSIFS); | |
2775 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_DIFS, (BYTE)pDevice->uDIFS); | |
2776 | } | |
2777 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_EIFS, (BYTE)pDevice->uEIFS); | |
2778 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_SLOT, (BYTE)pDevice->uSlot); | |
2779 | byMaxMin |= 0xA0;//1010 1111,C_CWMAX = 1023 | |
2780 | VNSvOutPortB(pDevice->PortOffset + MAC_REG_CWMAXMIN0, (BYTE)byMaxMin); | |
2781 | } | |
2782 | ||
2783 | void CARDvUpdateBasicTopRate (PVOID pDeviceHandler) | |
2784 | { | |
2785 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2786 | BYTE byTopOFDM = RATE_24M, byTopCCK = RATE_1M; | |
2787 | BYTE ii; | |
2788 | ||
2789 | //Determines the highest basic rate. | |
2790 | for (ii = RATE_54M; ii >= RATE_6M; ii --) { | |
cd9d25ba | 2791 | if ( (pDevice->wBasicRate) & ((WORD)(1<<ii)) ) { |
5449c685 FB |
2792 | byTopOFDM = ii; |
2793 | break; | |
cd9d25ba | 2794 | } |
5449c685 FB |
2795 | } |
2796 | pDevice->byTopOFDMBasicRate = byTopOFDM; | |
2797 | ||
2798 | for (ii = RATE_11M;; ii --) { | |
cd9d25ba | 2799 | if ( (pDevice->wBasicRate) & ((WORD)(1<<ii)) ) { |
5449c685 FB |
2800 | byTopCCK = ii; |
2801 | break; | |
cd9d25ba | 2802 | } |
5449c685 FB |
2803 | if (ii == RATE_1M) |
2804 | break; | |
2805 | } | |
2806 | pDevice->byTopCCKBasicRate = byTopCCK; | |
2807 | } | |
2808 | ||
2809 | ||
2810 | /* | |
2811 | * Description: Set NIC Tx Basic Rate | |
2812 | * | |
2813 | * Parameters: | |
2814 | * In: | |
2815 | * pDevice - The adapter to be set | |
2816 | * wBasicRate - Basic Rate to be set | |
2817 | * Out: | |
2818 | * none | |
2819 | * | |
2820 | * Return Value: TRUE if succeeded; FALSE if failed. | |
2821 | * | |
2822 | */ | |
2823 | BOOL CARDbAddBasicRate (PVOID pDeviceHandler, WORD wRateIdx) | |
2824 | { | |
2825 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2826 | WORD wRate = (WORD)(1<<wRateIdx); | |
2827 | ||
2828 | pDevice->wBasicRate |= wRate; | |
2829 | ||
2830 | //Determines the highest basic rate. | |
2831 | CARDvUpdateBasicTopRate((PVOID)pDevice); | |
2832 | ||
2833 | return(TRUE); | |
2834 | } | |
2835 | ||
2836 | BOOL CARDbIsOFDMinBasicRate (PVOID pDeviceHandler) | |
2837 | { | |
2838 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2839 | int ii; | |
2840 | ||
2841 | for (ii = RATE_54M; ii >= RATE_6M; ii --) { | |
2842 | if ((pDevice->wBasicRate) & ((WORD)(1<<ii))) | |
2843 | return TRUE; | |
2844 | } | |
2845 | return FALSE; | |
2846 | } | |
2847 | ||
2848 | BYTE CARDbyGetPktType (PVOID pDeviceHandler) | |
2849 | { | |
2850 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2851 | ||
2852 | if (pDevice->byBBType == BB_TYPE_11A || pDevice->byBBType == BB_TYPE_11B) { | |
2853 | return (BYTE)pDevice->byBBType; | |
2854 | } | |
2855 | else if (CARDbIsOFDMinBasicRate((PVOID)pDevice)) { | |
2856 | return PK_TYPE_11GA; | |
2857 | } | |
2858 | else { | |
2859 | return PK_TYPE_11GB; | |
2860 | } | |
2861 | } | |
2862 | ||
2863 | /* | |
2864 | * Description: Set NIC Loopback mode | |
2865 | * | |
2866 | * Parameters: | |
2867 | * In: | |
2868 | * pDevice - The adapter to be set | |
2869 | * wLoopbackMode - Loopback mode to be set | |
2870 | * Out: | |
2871 | * none | |
2872 | * | |
2873 | * Return Value: none | |
2874 | * | |
2875 | */ | |
2876 | void CARDvSetLoopbackMode (DWORD_PTR dwIoBase, WORD wLoopbackMode) | |
2877 | { | |
2878 | switch(wLoopbackMode) { | |
2879 | case CARD_LB_NONE: | |
2880 | case CARD_LB_MAC: | |
2881 | case CARD_LB_PHY: | |
2882 | break; | |
2883 | default: | |
2884 | ASSERT(FALSE); | |
2885 | break; | |
2886 | } | |
2887 | // set MAC loopback | |
2888 | MACvSetLoopbackMode(dwIoBase, LOBYTE(wLoopbackMode)); | |
2889 | // set Baseband loopback | |
2890 | } | |
2891 | ||
2892 | ||
2893 | /* | |
2894 | * Description: Software Reset NIC | |
2895 | * | |
2896 | * Parameters: | |
2897 | * In: | |
2898 | * pDevice - The adapter to be reset | |
2899 | * Out: | |
2900 | * none | |
2901 | * | |
2902 | * Return Value: none | |
2903 | * | |
2904 | */ | |
2905 | BOOL CARDbSoftwareReset (PVOID pDeviceHandler) | |
2906 | { | |
2907 | PSDevice pDevice = (PSDevice) pDeviceHandler; | |
2908 | ||
2909 | // reset MAC | |
2910 | if (!MACbSafeSoftwareReset(pDevice->PortOffset)) | |
2911 | return FALSE; | |
2912 | ||
2913 | return TRUE; | |
2914 | } | |
2915 | ||
2916 | ||
2917 | /* | |
2918 | * Description: Caculate TSF offset of two TSF input | |
2919 | * Get TSF Offset from RxBCN's TSF and local TSF | |
2920 | * | |
2921 | * Parameters: | |
2922 | * In: | |
2923 | * pDevice - The adapter to be sync. | |
2924 | * qwTSF1 - Rx BCN's TSF | |
2925 | * qwTSF2 - Local TSF | |
2926 | * Out: | |
2927 | * none | |
2928 | * | |
2929 | * Return Value: TSF Offset value | |
2930 | * | |
2931 | */ | |
2932 | QWORD CARDqGetTSFOffset (BYTE byRxRate, QWORD qwTSF1, QWORD qwTSF2) | |
2933 | { | |
2934 | QWORD qwTSFOffset; | |
2935 | WORD wRxBcnTSFOffst= 0;; | |
2936 | ||
2937 | HIDWORD(qwTSFOffset) = 0; | |
2938 | LODWORD(qwTSFOffset) = 0; | |
2939 | wRxBcnTSFOffst = cwRXBCNTSFOff[byRxRate%MAX_RATE]; | |
2940 | (qwTSF2).u.dwLowDword += (DWORD)(wRxBcnTSFOffst); | |
2941 | if ((qwTSF2).u.dwLowDword < (DWORD)(wRxBcnTSFOffst)) { | |
2942 | (qwTSF2).u.dwHighDword++; | |
2943 | } | |
2944 | LODWORD(qwTSFOffset) = LODWORD(qwTSF1) - LODWORD(qwTSF2); | |
2945 | if (LODWORD(qwTSF1) < LODWORD(qwTSF2)) { | |
2946 | // if borrow needed | |
2947 | HIDWORD(qwTSFOffset) = HIDWORD(qwTSF1) - HIDWORD(qwTSF2) - 1 ; | |
2948 | } | |
2949 | else { | |
2950 | HIDWORD(qwTSFOffset) = HIDWORD(qwTSF1) - HIDWORD(qwTSF2); | |
2951 | }; | |
2952 | return (qwTSFOffset); | |
2953 | } | |
2954 | ||
2955 | ||
2956 | /* | |
2957 | * Description: Read NIC TSF counter | |
2958 | * Get local TSF counter | |
2959 | * | |
2960 | * Parameters: | |
2961 | * In: | |
2962 | * pDevice - The adapter to be read | |
2963 | * Out: | |
2964 | * qwCurrTSF - Current TSF counter | |
2965 | * | |
2966 | * Return Value: TRUE if success; otherwise FALSE | |
2967 | * | |
2968 | */ | |
2969 | BOOL CARDbGetCurrentTSF (DWORD_PTR dwIoBase, PQWORD pqwCurrTSF) | |
2970 | { | |
2971 | WORD ww; | |
2972 | BYTE byData; | |
2973 | ||
2974 | MACvRegBitsOn(dwIoBase, MAC_REG_TFTCTL, TFTCTL_TSFCNTRRD); | |
2975 | for (ww = 0; ww < W_MAX_TIMEOUT; ww++) { | |
2976 | VNSvInPortB(dwIoBase + MAC_REG_TFTCTL, &byData); | |
256a816b | 2977 | if ( !(byData & TFTCTL_TSFCNTRRD)) |
5449c685 FB |
2978 | break; |
2979 | } | |
2980 | if (ww == W_MAX_TIMEOUT) | |
2981 | return(FALSE); | |
2982 | VNSvInPortD(dwIoBase + MAC_REG_TSFCNTR, &LODWORD(*pqwCurrTSF)); | |
2983 | VNSvInPortD(dwIoBase + MAC_REG_TSFCNTR + 4, &HIDWORD(*pqwCurrTSF)); | |
2984 | ||
2985 | return(TRUE); | |
2986 | } | |
2987 | ||
2988 | ||
2989 | /* | |
2990 | * Description: Read NIC TSF counter | |
2991 | * Get NEXTTBTT from adjusted TSF and Beacon Interval | |
2992 | * | |
2993 | * Parameters: | |
2994 | * In: | |
2995 | * qwTSF - Current TSF counter | |
2996 | * wbeaconInterval - Beacon Interval | |
2997 | * Out: | |
2998 | * qwCurrTSF - Current TSF counter | |
2999 | * | |
3000 | * Return Value: TSF value of next Beacon | |
3001 | * | |
3002 | */ | |
3003 | QWORD CARDqGetNextTBTT (QWORD qwTSF, WORD wBeaconInterval) | |
3004 | { | |
3005 | ||
3006 | UINT uLowNextTBTT; | |
3007 | UINT uHighRemain, uLowRemain; | |
3008 | UINT uBeaconInterval; | |
3009 | ||
3010 | uBeaconInterval = wBeaconInterval * 1024; | |
3011 | // Next TBTT = ((local_current_TSF / beacon_interval) + 1 ) * beacon_interval | |
3012 | uLowNextTBTT = (LODWORD(qwTSF) >> 10) << 10; | |
3013 | // low dword (mod) bcn | |
3014 | uLowRemain = (uLowNextTBTT) % uBeaconInterval; | |
3015 | // uHighRemain = ((0x80000000 % uBeaconInterval)* 2 * HIDWORD(qwTSF)) | |
3016 | // % uBeaconInterval; | |
3017 | // high dword (mod) bcn | |
3018 | uHighRemain = (((0xffffffff % uBeaconInterval) + 1) * HIDWORD(qwTSF)) | |
3019 | % uBeaconInterval; | |
3020 | uLowRemain = (uHighRemain + uLowRemain) % uBeaconInterval; | |
3021 | uLowRemain = uBeaconInterval - uLowRemain; | |
3022 | ||
3023 | // check if carry when add one beacon interval | |
3024 | if ((~uLowNextTBTT) < uLowRemain) | |
3025 | HIDWORD(qwTSF) ++ ; | |
3026 | ||
3027 | LODWORD(qwTSF) = uLowNextTBTT + uLowRemain; | |
3028 | ||
3029 | return (qwTSF); | |
3030 | } | |
3031 | ||
3032 | ||
3033 | /* | |
3034 | * Description: Set NIC TSF counter for first Beacon time | |
3035 | * Get NEXTTBTT from adjusted TSF and Beacon Interval | |
3036 | * | |
3037 | * Parameters: | |
3038 | * In: | |
3039 | * dwIoBase - IO Base | |
3040 | * wBeaconInterval - Beacon Interval | |
3041 | * Out: | |
3042 | * none | |
3043 | * | |
3044 | * Return Value: none | |
3045 | * | |
3046 | */ | |
3047 | void CARDvSetFirstNextTBTT (DWORD_PTR dwIoBase, WORD wBeaconInterval) | |
3048 | { | |
3049 | ||
3050 | QWORD qwNextTBTT; | |
3051 | ||
3052 | HIDWORD(qwNextTBTT) = 0; | |
3053 | LODWORD(qwNextTBTT) = 0; | |
3054 | CARDbGetCurrentTSF(dwIoBase, &qwNextTBTT); //Get Local TSF counter | |
3055 | qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval); | |
3056 | // Set NextTBTT | |
3057 | VNSvOutPortD(dwIoBase + MAC_REG_NEXTTBTT, LODWORD(qwNextTBTT)); | |
3058 | VNSvOutPortD(dwIoBase + MAC_REG_NEXTTBTT + 4, HIDWORD(qwNextTBTT)); | |
3059 | MACvRegBitsOn(dwIoBase, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN); | |
7e809a9b | 3060 | //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Card:First Next TBTT[%8xh:%8xh] \n", HIDWORD(qwNextTBTT), LODWORD(qwNextTBTT)); |
5449c685 FB |
3061 | return; |
3062 | } | |
3063 | ||
3064 | ||
3065 | /* | |
3066 | * Description: Sync NIC TSF counter for Beacon time | |
3067 | * Get NEXTTBTT and write to HW | |
3068 | * | |
3069 | * Parameters: | |
3070 | * In: | |
3071 | * pDevice - The adapter to be set | |
3072 | * qwTSF - Current TSF counter | |
3073 | * wBeaconInterval - Beacon Interval | |
3074 | * Out: | |
3075 | * none | |
3076 | * | |
3077 | * Return Value: none | |
3078 | * | |
3079 | */ | |
3080 | void CARDvUpdateNextTBTT (DWORD_PTR dwIoBase, QWORD qwTSF, WORD wBeaconInterval) | |
3081 | { | |
3082 | ||
3083 | qwTSF = CARDqGetNextTBTT(qwTSF, wBeaconInterval); | |
3084 | // Set NextTBTT | |
3085 | VNSvOutPortD(dwIoBase + MAC_REG_NEXTTBTT, LODWORD(qwTSF)); | |
3086 | VNSvOutPortD(dwIoBase + MAC_REG_NEXTTBTT + 4, HIDWORD(qwTSF)); | |
3087 | MACvRegBitsOn(dwIoBase, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN); | |
7e809a9b | 3088 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Card:Update Next TBTT[%8xh:%8xh] \n",(UINT)HIDWORD(qwTSF), (UINT)LODWORD(qwTSF)); |
5449c685 FB |
3089 | |
3090 | return; | |
3091 | } | |
3092 | ||
3093 | ||
3094 | ||
3095 | ||
3096 | ||
3097 | ||
3098 |