card.c revision ec28c7fab4c5e5e5c168f0b48bc10bfc7f9896d5
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;
63static 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
83typedef 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
91static BYTE abyDefaultSuppRatesG[] = {WLAN_EID_SUPP_RATES, 8, 0x02, 0x04, 0x0B, 0x16, 0x24, 0x30, 0x48, 0x6C};
92                                                                    //6M,   9M,  12M,  48M
93static BYTE abyDefaultExtSuppRatesG[] = {WLAN_EID_EXTSUPP_RATES, 4, 0x0C, 0x12, 0x18, 0x60};
94                                                              //6M,   9M,  12M,  18M,  24M,  36M,  48M,  54M
95static BYTE abyDefaultSuppRatesA[] = {WLAN_EID_SUPP_RATES, 8, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C};
96                                                              //1M,   2M,   5M,  11M,
97static BYTE abyDefaultSuppRatesB[] = {WLAN_EID_SUPP_RATES, 4, 0x02, 0x04, 0x0B, 0x16};
98
99
100
101/*---------------------  Static Classes  ----------------------------*/
102
103/*---------------------  Static Variables  --------------------------*/
104
105
106const WORD cwRXBCNTSFOff[MAX_RATE] =
107{17, 17, 17, 17, 34, 23, 17, 11, 8, 5, 4, 3};
108
109static 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 ************************************************************************/
174SCountryTable 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
425static
426void
427s_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
459BOOL
460ChannelValid(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
477exit:
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 */
497static
498void
499s_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 */
612static
613void
614s_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  --------------------------*/
730BYTE 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
748BYTE 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 */
767BOOL 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/*
855BOOL 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 */
883BOOL 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 */
904BOOL 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 */
923BOOL 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 */
1110BOOL 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 */
1145BOOL 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 */
1199BOOL 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 */
1257BOOL 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 */
1299BOOL 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 */
1368BOOL 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-*/
1393BOOL
1394CARDbPowerDown(
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 */
1432BOOL 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
1463printk("chester power off\n");
1464MACvRegBitsOn(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 */
1481BOOL CARDbRadioPowerOn (void *pDeviceHandler)
1482{
1483    PSDevice    pDevice = (PSDevice) pDeviceHandler;
1484    BOOL        bResult = TRUE;
1485printk("chester power on\n");
1486    if (pDevice->bRadioControlOff == TRUE){
1487if (pDevice->bHWRadioOff == TRUE) printk("chester bHWRadioOff\n");
1488if (pDevice->bRadioControlOff == TRUE) printk("chester bRadioControlOff\n");
1489        return FALSE;}
1490
1491    if (pDevice->bRadioOff == FALSE)
1492       {
1493printk("chester pbRadioOff\n");
1494return 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
1518printk("chester power on\n");
1519MACvRegBitsOff(pDevice->PortOffset, MAC_REG_GPIOCTL0, LED_ACTSET); //LED issue
1520    return bResult;
1521}
1522
1523
1524
1525BOOL 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-*/
1550BOOL
1551CARDbAdd_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
1601void *
1602CARDpGetCurrentAddress (
1603    void *pDeviceHandler
1604    )
1605{
1606    PSDevice            pDevice = (PSDevice) pDeviceHandler;
1607
1608    return (pDevice->abyCurrentNetAddr);
1609}
1610
1611
1612
1613void 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-*/
1708BOOL
1709CARDbStartMeasure (
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-*/
1835BOOL
1836CARDbChannelSwitch (
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-*/
1878BOOL
1879CARDbSetQuiet (
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-*/
1934BOOL
1935CARDbStartQuiet (
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-*/
2035void
2036CARDvSetCountryInfo (
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-*/
2094void
2095CARDvSetPowerConstraint (
2096    void *pDeviceHandler,
2097    BYTE             byChannel,
2098    char 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-*/
2129void
2130CARDvGetPowerCapability (
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-*/
2165BYTE
2166CARDbySetSupportChannels (
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-*/
2256char
2257CARDbyGetTransmitPower (
2258    void *pDeviceHandler
2259    )
2260{
2261    PSDevice    pDevice = (PSDevice) pDeviceHandler;
2262
2263    return (pDevice->byCurPwrdBm);
2264}
2265
2266
2267BOOL
2268CARDbChannelGetList (
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
2281void
2282CARDvSetCountryIE(
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
2307BOOL
2308CARDbGetChannelMapInfo(
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
2326void
2327CARDvSetChannelMapInfo(
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
2342void
2343CARDvClearChannelMapInfo(
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
2356BYTE
2357CARDbyAutoChannelSelect(
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
2422void
2423CARDvSafeResetTx (
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-*/
2478void
2479CARDvSafeResetRx (
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 */
2539WORD 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 */
2566WORD 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 */
2603void 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 */
2728void 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
2782void 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 */
2822BOOL 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
2835BOOL 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
2847BYTE 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 */
2875void 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 */
2904BOOL 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 */
2931QWORD 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 */
2968BOOL 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 */
3002QWORD 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 */
3046void 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 */
3079void 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
3098