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