![Charles Clément](/assets/img/avatar_default.png)
Replaced custom ethernet address length definition U_ETHER_ADDR_LEN by ETH_ALEN from <linux/if_ether.h>. Signed-off-by: Charles Clément <caratorn@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
3099 lines
148 KiB
C
3099 lines
148 KiB
C
/*
|
|
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* File: card.c
|
|
* Purpose: Provide functions to setup NIC operation mode
|
|
* Functions:
|
|
* s_vSafeResetTx - Rest Tx
|
|
* CARDvSetRSPINF - Set RSPINF
|
|
* vUpdateIFS - Update slotTime,SIFS,DIFS, and EIFS
|
|
* CARDvUpdateBasicTopRate - Update BasicTopRate
|
|
* CARDbAddBasicRate - Add to BasicRateSet
|
|
* CARDbSetBasicRate - Set Basic Tx Rate
|
|
* CARDbIsOFDMinBasicRate - Check if any OFDM rate is in BasicRateSet
|
|
* CARDvSetLoopbackMode - Set Loopback mode
|
|
* CARDbSoftwareReset - Sortware reset NIC
|
|
* CARDqGetTSFOffset - Caculate TSFOffset
|
|
* CARDbGetCurrentTSF - Read Current NIC TSF counter
|
|
* CARDqGetNextTBTT - Caculate Next Beacon TSF counter
|
|
* CARDvSetFirstNextTBTT - Set NIC Beacon time
|
|
* CARDvUpdateNextTBTT - Sync. NIC Beacon time
|
|
* CARDbRadioPowerOff - Turn Off NIC Radio Power
|
|
* CARDbRadioPowerOn - Turn On NIC Radio Power
|
|
* CARDbSetWEPMode - Set NIC Wep mode
|
|
* CARDbSetTxPower - Set NIC tx power
|
|
*
|
|
* Revision History:
|
|
* 06-10-2003 Bryan YC Fan: Re-write codes to support VT3253 spec.
|
|
* 08-26-2003 Kyle Hsu: Modify the defination type of dwIoBase.
|
|
* 09-01-2003 Bryan YC Fan: Add vUpdateIFS().
|
|
*
|
|
*/
|
|
|
|
#include "tmacro.h"
|
|
#include "card.h"
|
|
#include "baseband.h"
|
|
#include "mac.h"
|
|
#include "desc.h"
|
|
#include "rf.h"
|
|
#include "vntwifi.h"
|
|
#include "power.h"
|
|
#include "key.h"
|
|
#include "rc4.h"
|
|
#include "country.h"
|
|
|
|
/*--------------------- Static Definitions -------------------------*/
|
|
|
|
//static int msglevel =MSG_LEVEL_DEBUG;
|
|
static int msglevel =MSG_LEVEL_INFO;
|
|
|
|
#define C_SIFS_A 16 // micro sec.
|
|
#define C_SIFS_BG 10
|
|
|
|
#define C_EIFS 80 // micro sec.
|
|
|
|
|
|
#define C_SLOT_SHORT 9 // micro sec.
|
|
#define C_SLOT_LONG 20
|
|
|
|
#define C_CWMIN_A 15 // slot time
|
|
#define C_CWMIN_B 31
|
|
|
|
#define C_CWMAX 1023 // slot time
|
|
|
|
#define CARD_MAX_CHANNEL_TBL 56
|
|
|
|
#define WAIT_BEACON_TX_DOWN_TMO 3 // Times
|
|
|
|
typedef struct tagSChannelTblElement {
|
|
BYTE byChannelNumber;
|
|
UINT uFrequency;
|
|
BOOL bValid;
|
|
BYTE byMAP;
|
|
}SChannelTblElement, *PSChannelTblElement;
|
|
|
|
//1M, 2M, 5M, 11M, 18M, 24M, 36M, 54M
|
|
static BYTE abyDefaultSuppRatesG[] = {WLAN_EID_SUPP_RATES, 8, 0x02, 0x04, 0x0B, 0x16, 0x24, 0x30, 0x48, 0x6C};
|
|
//6M, 9M, 12M, 48M
|
|
static BYTE abyDefaultExtSuppRatesG[] = {WLAN_EID_EXTSUPP_RATES, 4, 0x0C, 0x12, 0x18, 0x60};
|
|
//6M, 9M, 12M, 18M, 24M, 36M, 48M, 54M
|
|
static BYTE abyDefaultSuppRatesA[] = {WLAN_EID_SUPP_RATES, 8, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C};
|
|
//1M, 2M, 5M, 11M,
|
|
static BYTE abyDefaultSuppRatesB[] = {WLAN_EID_SUPP_RATES, 4, 0x02, 0x04, 0x0B, 0x16};
|
|
|
|
|
|
|
|
/*--------------------- Static Classes ----------------------------*/
|
|
|
|
/*--------------------- Static Variables --------------------------*/
|
|
|
|
|
|
const WORD cwRXBCNTSFOff[MAX_RATE] =
|
|
{17, 17, 17, 17, 34, 23, 17, 11, 8, 5, 4, 3};
|
|
|
|
static SChannelTblElement sChannelTbl[CARD_MAX_CHANNEL_TBL+1] =
|
|
{
|
|
{0, 0, FALSE, 0},
|
|
{1, 2412, TRUE, 0},
|
|
{2, 2417, TRUE, 0},
|
|
{3, 2422, TRUE, 0},
|
|
{4, 2427, TRUE, 0},
|
|
{5, 2432, TRUE, 0},
|
|
{6, 2437, TRUE, 0},
|
|
{7, 2442, TRUE, 0},
|
|
{8, 2447, TRUE, 0},
|
|
{9, 2452, TRUE, 0},
|
|
{10, 2457, TRUE, 0},
|
|
{11, 2462, TRUE, 0},
|
|
{12, 2467, TRUE, 0},
|
|
{13, 2472, TRUE, 0},
|
|
{14, 2484, TRUE, 0},
|
|
{183, 4915, TRUE, 0},
|
|
{184, 4920, TRUE, 0},
|
|
{185, 4925, TRUE, 0},
|
|
{187, 4935, TRUE, 0},
|
|
{188, 4940, TRUE, 0},
|
|
{189, 4945, TRUE, 0},
|
|
{192, 4960, TRUE, 0},
|
|
{196, 4980, TRUE, 0},
|
|
{7, 5035, TRUE, 0},
|
|
{8, 5040, TRUE, 0},
|
|
{9, 5045, TRUE, 0},
|
|
{11, 5055, TRUE, 0},
|
|
{12, 5060, TRUE, 0},
|
|
{16, 5080, TRUE, 0},
|
|
{34, 5170, TRUE, 0},
|
|
{36, 5180, TRUE, 0},
|
|
{38, 5190, TRUE, 0},
|
|
{40, 5200, TRUE, 0},
|
|
{42, 5210, TRUE, 0},
|
|
{44, 5220, TRUE, 0},
|
|
{46, 5230, TRUE, 0},
|
|
{48, 5240, TRUE, 0},
|
|
{52, 5260, TRUE, 0},
|
|
{56, 5280, TRUE, 0},
|
|
{60, 5300, TRUE, 0},
|
|
{64, 5320, TRUE, 0},
|
|
{100, 5500, TRUE, 0},
|
|
{104, 5520, TRUE, 0},
|
|
{108, 5540, TRUE, 0},
|
|
{112, 5560, TRUE, 0},
|
|
{116, 5580, TRUE, 0},
|
|
{120, 5600, TRUE, 0},
|
|
{124, 5620, TRUE, 0},
|
|
{128, 5640, TRUE, 0},
|
|
{132, 5660, TRUE, 0},
|
|
{136, 5680, TRUE, 0},
|
|
{140, 5700, TRUE, 0},
|
|
{149, 5745, TRUE, 0},
|
|
{153, 5765, TRUE, 0},
|
|
{157, 5785, TRUE, 0},
|
|
{161, 5805, TRUE, 0},
|
|
{165, 5825, TRUE, 0}
|
|
};
|
|
|
|
|
|
/************************************************************************
|
|
* The Radar regulation rules for each country
|
|
************************************************************************/
|
|
SCountryTable ChannelRuleTab[CCODE_MAX+1] =
|
|
{
|
|
/************************************************************************
|
|
* This table is based on Athero driver rules
|
|
************************************************************************/
|
|
/* Country Available channels, ended with 0 */
|
|
/* 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 */
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 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} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
|
{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}
|
|
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 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 */
|
|
};
|
|
|
|
|
|
/*--------------------- Static Functions --------------------------*/
|
|
|
|
static
|
|
void
|
|
s_vCaculateOFDMRParameter(
|
|
BYTE byRate,
|
|
CARD_PHY_TYPE ePHYType,
|
|
PBYTE pbyTxRate,
|
|
PBYTE pbyRsvTime
|
|
);
|
|
|
|
|
|
/*--------------------- Export Variables --------------------------*/
|
|
|
|
/*--------------------- Export Functions --------------------------*/
|
|
|
|
|
|
/*--------------------- Export function -------------------------*/
|
|
/************************************************************************
|
|
* Country Channel Valid
|
|
* Input: CountryCode, ChannelNum
|
|
* ChanneIndex is defined as VT3253 MAC channel:
|
|
* 1 = 2.4G channel 1
|
|
* 2 = 2.4G channel 2
|
|
* ...
|
|
* 14 = 2.4G channel 14
|
|
* 15 = 4.9G channel 183
|
|
* 16 = 4.9G channel 184
|
|
* .....
|
|
* Output: TRUE if the specified 5GHz band is allowed to be used.
|
|
False otherwise.
|
|
// 4.9G => Ch 183, 184, 185, 187, 188, 189, 192, 196 (Value:15 ~ 22)
|
|
|
|
// 5G => Ch 7, 8, 9, 11, 12, 16, 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64,
|
|
// 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 (Value 23 ~ 56)
|
|
************************************************************************/
|
|
//2008-8-4 <add> by chester
|
|
BOOL
|
|
ChannelValid(UINT CountryCode, UINT ChannelIndex)
|
|
{
|
|
BOOL bValid;
|
|
|
|
bValid = FALSE;
|
|
/*
|
|
* If Channel Index is invalid, return invalid
|
|
*/
|
|
if ((ChannelIndex > CB_MAX_CHANNEL) ||
|
|
(ChannelIndex == 0))
|
|
{
|
|
bValid = FALSE;
|
|
goto exit;
|
|
}
|
|
|
|
bValid = sChannelTbl[ChannelIndex].bValid;
|
|
|
|
exit:
|
|
return (bValid);
|
|
|
|
} /* end ChannelValid */
|
|
|
|
|
|
/*
|
|
* Description: Caculate TxRate and RsvTime fields for RSPINF in OFDM mode.
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* wRate - Tx Rate
|
|
* byPktType - Tx Packet type
|
|
* Out:
|
|
* pbyTxRate - pointer to RSPINF TxRate field
|
|
* pbyRsvTime - pointer to RSPINF RsvTime field
|
|
*
|
|
* Return Value: none
|
|
*
|
|
*/
|
|
static
|
|
void
|
|
s_vCaculateOFDMRParameter (
|
|
BYTE byRate,
|
|
CARD_PHY_TYPE ePHYType,
|
|
PBYTE pbyTxRate,
|
|
PBYTE pbyRsvTime
|
|
)
|
|
{
|
|
switch (byRate) {
|
|
case RATE_6M :
|
|
if (ePHYType == PHY_TYPE_11A) {//5GHZ
|
|
*pbyTxRate = 0x9B;
|
|
*pbyRsvTime = 44;
|
|
}
|
|
else {
|
|
*pbyTxRate = 0x8B;
|
|
*pbyRsvTime = 50;
|
|
}
|
|
break;
|
|
|
|
case RATE_9M :
|
|
if (ePHYType == PHY_TYPE_11A) {//5GHZ
|
|
*pbyTxRate = 0x9F;
|
|
*pbyRsvTime = 36;
|
|
}
|
|
else {
|
|
*pbyTxRate = 0x8F;
|
|
*pbyRsvTime = 42;
|
|
}
|
|
break;
|
|
|
|
case RATE_12M :
|
|
if (ePHYType == PHY_TYPE_11A) {//5GHZ
|
|
*pbyTxRate = 0x9A;
|
|
*pbyRsvTime = 32;
|
|
}
|
|
else {
|
|
*pbyTxRate = 0x8A;
|
|
*pbyRsvTime = 38;
|
|
}
|
|
break;
|
|
|
|
case RATE_18M :
|
|
if (ePHYType == PHY_TYPE_11A) {//5GHZ
|
|
*pbyTxRate = 0x9E;
|
|
*pbyRsvTime = 28;
|
|
}
|
|
else {
|
|
*pbyTxRate = 0x8E;
|
|
*pbyRsvTime = 34;
|
|
}
|
|
break;
|
|
|
|
case RATE_36M :
|
|
if (ePHYType == PHY_TYPE_11A) {//5GHZ
|
|
*pbyTxRate = 0x9D;
|
|
*pbyRsvTime = 24;
|
|
}
|
|
else {
|
|
*pbyTxRate = 0x8D;
|
|
*pbyRsvTime = 30;
|
|
}
|
|
break;
|
|
|
|
case RATE_48M :
|
|
if (ePHYType == PHY_TYPE_11A) {//5GHZ
|
|
*pbyTxRate = 0x98;
|
|
*pbyRsvTime = 24;
|
|
}
|
|
else {
|
|
*pbyTxRate = 0x88;
|
|
*pbyRsvTime = 30;
|
|
}
|
|
break;
|
|
|
|
case RATE_54M :
|
|
if (ePHYType == PHY_TYPE_11A) {//5GHZ
|
|
*pbyTxRate = 0x9C;
|
|
*pbyRsvTime = 24;
|
|
}
|
|
else {
|
|
*pbyTxRate = 0x8C;
|
|
*pbyRsvTime = 30;
|
|
}
|
|
break;
|
|
|
|
case RATE_24M :
|
|
default :
|
|
if (ePHYType == PHY_TYPE_11A) {//5GHZ
|
|
*pbyTxRate = 0x99;
|
|
*pbyRsvTime = 28;
|
|
}
|
|
else {
|
|
*pbyTxRate = 0x89;
|
|
*pbyRsvTime = 34;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Description: Set RSPINF
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be set
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: None.
|
|
*
|
|
*/
|
|
static
|
|
void
|
|
s_vSetRSPINF (PSDevice pDevice, CARD_PHY_TYPE ePHYType, void *pvSupportRateIEs, void *pvExtSupportRateIEs)
|
|
{
|
|
BYTE byServ = 0, bySignal = 0; // For CCK
|
|
WORD wLen = 0;
|
|
BYTE byTxRate = 0, byRsvTime = 0; // For OFDM
|
|
|
|
//Set to Page1
|
|
MACvSelectPage1(pDevice->PortOffset);
|
|
|
|
//RSPINF_b_1
|
|
BBvCaculateParameter(pDevice,
|
|
14,
|
|
VNTWIFIbyGetACKTxRate(RATE_1M, pvSupportRateIEs, pvExtSupportRateIEs),
|
|
PK_TYPE_11B,
|
|
&wLen,
|
|
&byServ,
|
|
&bySignal
|
|
);
|
|
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_1, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ)));
|
|
///RSPINF_b_2
|
|
BBvCaculateParameter(pDevice,
|
|
14,
|
|
VNTWIFIbyGetACKTxRate(RATE_2M, pvSupportRateIEs, pvExtSupportRateIEs),
|
|
PK_TYPE_11B,
|
|
&wLen,
|
|
&byServ,
|
|
&bySignal
|
|
);
|
|
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_2, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ)));
|
|
//RSPINF_b_5
|
|
BBvCaculateParameter(pDevice,
|
|
14,
|
|
VNTWIFIbyGetACKTxRate(RATE_5M, pvSupportRateIEs, pvExtSupportRateIEs),
|
|
PK_TYPE_11B,
|
|
&wLen,
|
|
&byServ,
|
|
&bySignal
|
|
);
|
|
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_5, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ)));
|
|
//RSPINF_b_11
|
|
BBvCaculateParameter(pDevice,
|
|
14,
|
|
VNTWIFIbyGetACKTxRate(RATE_11M, pvSupportRateIEs, pvExtSupportRateIEs),
|
|
PK_TYPE_11B,
|
|
&wLen,
|
|
&byServ,
|
|
&bySignal
|
|
);
|
|
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_11, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ)));
|
|
//RSPINF_a_6
|
|
s_vCaculateOFDMRParameter(RATE_6M,
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_6, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_9
|
|
s_vCaculateOFDMRParameter(RATE_9M,
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_9, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_12
|
|
s_vCaculateOFDMRParameter(RATE_12M,
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_12, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_18
|
|
s_vCaculateOFDMRParameter(RATE_18M,
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_18, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_24
|
|
s_vCaculateOFDMRParameter(RATE_24M,
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_24, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_36
|
|
s_vCaculateOFDMRParameter(
|
|
VNTWIFIbyGetACKTxRate(RATE_36M, pvSupportRateIEs, pvExtSupportRateIEs),
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_36, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_48
|
|
s_vCaculateOFDMRParameter(
|
|
VNTWIFIbyGetACKTxRate(RATE_48M, pvSupportRateIEs, pvExtSupportRateIEs),
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_48, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_54
|
|
s_vCaculateOFDMRParameter(
|
|
VNTWIFIbyGetACKTxRate(RATE_54M, pvSupportRateIEs, pvExtSupportRateIEs),
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_54, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_72
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_72, MAKEWORD(byTxRate,byRsvTime));
|
|
//Set to Page0
|
|
MACvSelectPage0(pDevice->PortOffset);
|
|
}
|
|
|
|
|
|
|
|
|
|
/*--------------------- Export Variables --------------------------*/
|
|
|
|
/*--------------------- Export Functions --------------------------*/
|
|
BYTE CARDbyGetChannelMapping (void *pDeviceHandler, BYTE byChannelNumber, CARD_PHY_TYPE ePhyType)
|
|
{
|
|
UINT ii;
|
|
|
|
if ((ePhyType == PHY_TYPE_11B) || (ePhyType == PHY_TYPE_11G)) {
|
|
return (byChannelNumber);
|
|
}
|
|
|
|
for(ii = (CB_MAX_CHANNEL_24G + 1); ii <= CB_MAX_CHANNEL; ) {
|
|
if (sChannelTbl[ii].byChannelNumber == byChannelNumber) {
|
|
return ((BYTE) ii);
|
|
}
|
|
ii++;
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
|
|
BYTE CARDbyGetChannelNumber (void *pDeviceHandler, BYTE byChannelIndex)
|
|
{
|
|
// PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
return(sChannelTbl[byChannelIndex].byChannelNumber);
|
|
}
|
|
|
|
/*
|
|
* Description: Set NIC media channel
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDeviceHandler - The adapter to be set
|
|
* uConnectionChannel - Channel to be set
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TRUE if succeeded; FALSE if failed.
|
|
*
|
|
*/
|
|
BOOL CARDbSetChannel (void *pDeviceHandler, UINT uConnectionChannel)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
BOOL bResult = TRUE;
|
|
|
|
|
|
if (pDevice->byCurrentCh == uConnectionChannel) {
|
|
return bResult;
|
|
}
|
|
|
|
if (sChannelTbl[uConnectionChannel].bValid == FALSE) {
|
|
return (FALSE);
|
|
}
|
|
|
|
if ((uConnectionChannel > CB_MAX_CHANNEL_24G) &&
|
|
(pDevice->eCurrentPHYType != PHY_TYPE_11A)) {
|
|
CARDbSetPhyParameter(pDevice, PHY_TYPE_11A, 0, 0, NULL, NULL);
|
|
} else if ((uConnectionChannel <= CB_MAX_CHANNEL_24G) &&
|
|
(pDevice->eCurrentPHYType == PHY_TYPE_11A)) {
|
|
CARDbSetPhyParameter(pDevice, PHY_TYPE_11G, 0, 0, NULL, NULL);
|
|
}
|
|
// clear NAV
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MACCR, MACCR_CLRNAV);
|
|
|
|
//{{ RobertYu: 20041202
|
|
//// TX_PE will reserve 3 us for MAX2829 A mode only, it is for better TX throughput
|
|
|
|
if ( pDevice->byRFType == RF_AIROHA7230 )
|
|
{
|
|
RFbAL7230SelectChannelPostProcess(pDevice->PortOffset, pDevice->byCurrentCh, (BYTE)uConnectionChannel);
|
|
}
|
|
//}} RobertYu
|
|
|
|
|
|
pDevice->byCurrentCh = (BYTE)uConnectionChannel;
|
|
bResult &= RFbSelectChannel(pDevice->PortOffset, pDevice->byRFType, (BYTE)uConnectionChannel);
|
|
|
|
// Init Synthesizer Table
|
|
if (pDevice->bEnablePSMode == TRUE)
|
|
RFvWriteWakeProgSyn(pDevice->PortOffset, pDevice->byRFType, uConnectionChannel);
|
|
|
|
|
|
//DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"CARDbSetMediaChannel: %d\n", (BYTE)uConnectionChannel);
|
|
BBvSoftwareReset(pDevice->PortOffset);
|
|
|
|
if (pDevice->byLocalID > REV_ID_VT3253_B1) {
|
|
// set HW default power register
|
|
MACvSelectPage1(pDevice->PortOffset);
|
|
RFbSetPower(pDevice, RATE_1M, pDevice->byCurrentCh);
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_PWRCCK, pDevice->byCurPwr);
|
|
RFbSetPower(pDevice, RATE_6M, pDevice->byCurrentCh);
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_PWROFDM, pDevice->byCurPwr);
|
|
MACvSelectPage0(pDevice->PortOffset);
|
|
}
|
|
|
|
if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
|
|
#ifdef PLICE_DEBUG
|
|
//printk("Func:CARDbSetChannel:call RFbSetPower:11B\n");
|
|
#endif
|
|
RFbSetPower(pDevice, RATE_1M, pDevice->byCurrentCh);
|
|
} else {
|
|
#ifdef PLICE_DEBUG
|
|
//printk("Func:CARDbSetChannel:call RFbSetPower\n");
|
|
#endif
|
|
RFbSetPower(pDevice, RATE_6M, pDevice->byCurrentCh);
|
|
}
|
|
|
|
return(bResult);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Description: Card Send packet function
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDeviceHandler - The adapter to be set
|
|
* pPacket - Packet buffer pointer
|
|
* ePktType - Packet type
|
|
* uLength - Packet length
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TRUE if succeeded; FALSE if failed.
|
|
*
|
|
*/
|
|
/*
|
|
BOOL CARDbSendPacket (void *pDeviceHandler, void *pPacket, CARD_PKT_TYPE ePktType, UINT uLength)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
if (ePktType == PKT_TYPE_802_11_MNG) {
|
|
return TXbTD0Send(pDevice, pPacket, uLength);
|
|
} else if (ePktType == PKT_TYPE_802_11_BCN) {
|
|
return TXbBeaconSend(pDevice, pPacket, uLength);
|
|
} if (ePktType == PKT_TYPE_802_11_DATA) {
|
|
return TXbTD1Send(pDevice, pPacket, uLength);
|
|
}
|
|
|
|
return (TRUE);
|
|
}
|
|
*/
|
|
|
|
|
|
/*
|
|
* Description: Get Card short preamble option value
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be set
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TRUE if short preamble; otherwise FALSE
|
|
*
|
|
*/
|
|
BOOL CARDbIsShortPreamble (void *pDeviceHandler)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
if (pDevice->byPreambleType == 0) {
|
|
return(FALSE);
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
/*
|
|
* Description: Get Card short slot time option value
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be set
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TRUE if short slot time; otherwise FALSE
|
|
*
|
|
*/
|
|
BOOL CARDbIsShorSlotTime (void *pDeviceHandler)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
return(pDevice->bShortSlotTime);
|
|
}
|
|
|
|
|
|
/*
|
|
* Description: Update IFS
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be set
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: None.
|
|
*
|
|
*/
|
|
BOOL CARDbSetPhyParameter (void *pDeviceHandler, CARD_PHY_TYPE ePHYType, WORD wCapInfo, BYTE byERPField, void *pvSupportRateIEs, void *pvExtSupportRateIEs)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
BYTE byCWMaxMin = 0;
|
|
BYTE bySlot = 0;
|
|
BYTE bySIFS = 0;
|
|
BYTE byDIFS = 0;
|
|
BYTE byData;
|
|
// PWLAN_IE_SUPP_RATES pRates = NULL;
|
|
PWLAN_IE_SUPP_RATES pSupportRates = (PWLAN_IE_SUPP_RATES) pvSupportRateIEs;
|
|
PWLAN_IE_SUPP_RATES pExtSupportRates = (PWLAN_IE_SUPP_RATES) pvExtSupportRateIEs;
|
|
|
|
|
|
//Set SIFS, DIFS, EIFS, SlotTime, CwMin
|
|
if (ePHYType == PHY_TYPE_11A) {
|
|
if (pSupportRates == NULL) {
|
|
pSupportRates = (PWLAN_IE_SUPP_RATES) abyDefaultSuppRatesA;
|
|
}
|
|
if (pDevice->byRFType == RF_AIROHA7230) {
|
|
// AL7230 use single PAPE and connect to PAPE_2.4G
|
|
MACvSetBBType(pDevice->PortOffset, BB_TYPE_11G);
|
|
pDevice->abyBBVGA[0] = 0x20;
|
|
pDevice->abyBBVGA[2] = 0x10;
|
|
pDevice->abyBBVGA[3] = 0x10;
|
|
BBbReadEmbeded(pDevice->PortOffset, 0xE7, &byData);
|
|
if (byData == 0x1C) {
|
|
BBbWriteEmbeded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]);
|
|
}
|
|
} else if (pDevice->byRFType == RF_UW2452) {
|
|
MACvSetBBType(pDevice->PortOffset, BB_TYPE_11A);
|
|
pDevice->abyBBVGA[0] = 0x18;
|
|
BBbReadEmbeded(pDevice->PortOffset, 0xE7, &byData);
|
|
if (byData == 0x14) {
|
|
BBbWriteEmbeded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]);
|
|
BBbWriteEmbeded(pDevice->PortOffset, 0xE1, 0x57);
|
|
}
|
|
} else {
|
|
MACvSetBBType(pDevice->PortOffset, BB_TYPE_11A);
|
|
}
|
|
BBbWriteEmbeded(pDevice->PortOffset, 0x88, 0x03);
|
|
bySlot = C_SLOT_SHORT;
|
|
bySIFS = C_SIFS_A;
|
|
byDIFS = C_SIFS_A + 2*C_SLOT_SHORT;
|
|
byCWMaxMin = 0xA4;
|
|
} else if (ePHYType == PHY_TYPE_11B) {
|
|
if (pSupportRates == NULL) {
|
|
pSupportRates = (PWLAN_IE_SUPP_RATES) abyDefaultSuppRatesB;
|
|
}
|
|
MACvSetBBType(pDevice->PortOffset, BB_TYPE_11B);
|
|
if (pDevice->byRFType == RF_AIROHA7230) {
|
|
pDevice->abyBBVGA[0] = 0x1C;
|
|
pDevice->abyBBVGA[2] = 0x00;
|
|
pDevice->abyBBVGA[3] = 0x00;
|
|
BBbReadEmbeded(pDevice->PortOffset, 0xE7, &byData);
|
|
if (byData == 0x20) {
|
|
BBbWriteEmbeded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]);
|
|
}
|
|
} else if (pDevice->byRFType == RF_UW2452) {
|
|
pDevice->abyBBVGA[0] = 0x14;
|
|
BBbReadEmbeded(pDevice->PortOffset, 0xE7, &byData);
|
|
if (byData == 0x18) {
|
|
BBbWriteEmbeded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]);
|
|
BBbWriteEmbeded(pDevice->PortOffset, 0xE1, 0xD3);
|
|
}
|
|
}
|
|
BBbWriteEmbeded(pDevice->PortOffset, 0x88, 0x02);
|
|
bySlot = C_SLOT_LONG;
|
|
bySIFS = C_SIFS_BG;
|
|
byDIFS = C_SIFS_BG + 2*C_SLOT_LONG;
|
|
byCWMaxMin = 0xA5;
|
|
} else {// PK_TYPE_11GA & PK_TYPE_11GB
|
|
if (pSupportRates == NULL) {
|
|
pSupportRates = (PWLAN_IE_SUPP_RATES) abyDefaultSuppRatesG;
|
|
pExtSupportRates = (PWLAN_IE_SUPP_RATES) abyDefaultExtSuppRatesG;
|
|
}
|
|
MACvSetBBType(pDevice->PortOffset, BB_TYPE_11G);
|
|
if (pDevice->byRFType == RF_AIROHA7230) {
|
|
pDevice->abyBBVGA[0] = 0x1C;
|
|
pDevice->abyBBVGA[2] = 0x00;
|
|
pDevice->abyBBVGA[3] = 0x00;
|
|
BBbReadEmbeded(pDevice->PortOffset, 0xE7, &byData);
|
|
if (byData == 0x20) {
|
|
BBbWriteEmbeded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]);
|
|
}
|
|
} else if (pDevice->byRFType == RF_UW2452) {
|
|
pDevice->abyBBVGA[0] = 0x14;
|
|
BBbReadEmbeded(pDevice->PortOffset, 0xE7, &byData);
|
|
if (byData == 0x18) {
|
|
BBbWriteEmbeded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]);
|
|
BBbWriteEmbeded(pDevice->PortOffset, 0xE1, 0xD3);
|
|
}
|
|
}
|
|
BBbWriteEmbeded(pDevice->PortOffset, 0x88, 0x08);
|
|
bySIFS = C_SIFS_BG;
|
|
if(VNTWIFIbIsShortSlotTime(wCapInfo)) {
|
|
bySlot = C_SLOT_SHORT;
|
|
byDIFS = C_SIFS_BG + 2*C_SLOT_SHORT;
|
|
} else {
|
|
bySlot = C_SLOT_LONG;
|
|
byDIFS = C_SIFS_BG + 2*C_SLOT_LONG;
|
|
}
|
|
if (VNTWIFIbyGetMaxSupportRate(pSupportRates, pExtSupportRates) > RATE_11M) {
|
|
byCWMaxMin = 0xA4;
|
|
} else {
|
|
byCWMaxMin = 0xA5;
|
|
}
|
|
if (pDevice->bProtectMode != VNTWIFIbIsProtectMode(byERPField)) {
|
|
pDevice->bProtectMode = VNTWIFIbIsProtectMode(byERPField);
|
|
if (pDevice->bProtectMode) {
|
|
MACvEnableProtectMD(pDevice->PortOffset);
|
|
} else {
|
|
MACvDisableProtectMD(pDevice->PortOffset);
|
|
}
|
|
}
|
|
if (pDevice->bBarkerPreambleMd != VNTWIFIbIsBarkerMode(byERPField)) {
|
|
pDevice->bBarkerPreambleMd = VNTWIFIbIsBarkerMode(byERPField);
|
|
if (pDevice->bBarkerPreambleMd) {
|
|
MACvEnableBarkerPreambleMd(pDevice->PortOffset);
|
|
} else {
|
|
MACvDisableBarkerPreambleMd(pDevice->PortOffset);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pDevice->byRFType == RF_RFMD2959) {
|
|
// bcs TX_PE will reserve 3 us
|
|
// hardware's processing time here is 2 us.
|
|
bySIFS -= 3;
|
|
byDIFS -= 3;
|
|
//{{ RobertYu: 20041202
|
|
//// TX_PE will reserve 3 us for MAX2829 A mode only, it is for better TX throughput
|
|
//// MAC will need 2 us to process, so the SIFS, DIFS can be shorter by 2 us.
|
|
}
|
|
|
|
if (pDevice->bySIFS != bySIFS) {
|
|
pDevice->bySIFS = bySIFS;
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_SIFS, pDevice->bySIFS);
|
|
}
|
|
if (pDevice->byDIFS != byDIFS) {
|
|
pDevice->byDIFS = byDIFS;
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_DIFS, pDevice->byDIFS);
|
|
}
|
|
if (pDevice->byEIFS != C_EIFS) {
|
|
pDevice->byEIFS = C_EIFS;
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_EIFS, pDevice->byEIFS);
|
|
}
|
|
if (pDevice->bySlot != bySlot) {
|
|
pDevice->bySlot = bySlot;
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_SLOT, pDevice->bySlot);
|
|
if (pDevice->bySlot == C_SLOT_SHORT) {
|
|
pDevice->bShortSlotTime = TRUE;
|
|
} else {
|
|
pDevice->bShortSlotTime = FALSE;
|
|
}
|
|
BBvSetShortSlotTime(pDevice);
|
|
}
|
|
if (pDevice->byCWMaxMin != byCWMaxMin) {
|
|
pDevice->byCWMaxMin = byCWMaxMin;
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_CWMAXMIN0, pDevice->byCWMaxMin);
|
|
}
|
|
if (VNTWIFIbIsShortPreamble(wCapInfo)) {
|
|
pDevice->byPreambleType = pDevice->byShortPreamble;
|
|
} else {
|
|
pDevice->byPreambleType = 0;
|
|
}
|
|
s_vSetRSPINF(pDevice, ePHYType, pSupportRates, pExtSupportRates);
|
|
pDevice->eCurrentPHYType = ePHYType;
|
|
// set for NDIS OID_802_11SUPPORTED_RATES
|
|
return (TRUE);
|
|
}
|
|
|
|
/*
|
|
* Description: Sync. TSF counter to BSS
|
|
* Get TSF offset and write to HW
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be sync.
|
|
* byRxRate - data rate of receive beacon
|
|
* qwBSSTimestamp - Rx BCN's TSF
|
|
* qwLocalTSF - Local TSF
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none
|
|
*
|
|
*/
|
|
BOOL CARDbUpdateTSF (void *pDeviceHandler, BYTE byRxRate, QWORD qwBSSTimestamp, QWORD qwLocalTSF)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
QWORD qwTSFOffset;
|
|
|
|
HIDWORD(qwTSFOffset) = 0;
|
|
LODWORD(qwTSFOffset) = 0;
|
|
|
|
if ((HIDWORD(qwBSSTimestamp) != HIDWORD(qwLocalTSF)) ||
|
|
(LODWORD(qwBSSTimestamp) != LODWORD(qwLocalTSF))) {
|
|
qwTSFOffset = CARDqGetTSFOffset(byRxRate, qwBSSTimestamp, qwLocalTSF);
|
|
// adjust TSF
|
|
// HW's TSF add TSF Offset reg
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_TSFOFST, LODWORD(qwTSFOffset));
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_TSFOFST + 4, HIDWORD(qwTSFOffset));
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TFTCTL, TFTCTL_TSFSYNCEN);
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
/*
|
|
* Description: Set NIC TSF counter for first Beacon time
|
|
* Get NEXTTBTT from adjusted TSF and Beacon Interval
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be set.
|
|
* wBeaconInterval - Beacon Interval
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TRUE if succeed; otherwise FALSE
|
|
*
|
|
*/
|
|
BOOL CARDbSetBeaconPeriod (void *pDeviceHandler, WORD wBeaconInterval)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
UINT uBeaconInterval = 0;
|
|
UINT uLowNextTBTT = 0;
|
|
UINT uHighRemain = 0;
|
|
UINT uLowRemain = 0;
|
|
QWORD qwNextTBTT;
|
|
|
|
HIDWORD(qwNextTBTT) = 0;
|
|
LODWORD(qwNextTBTT) = 0;
|
|
CARDbGetCurrentTSF(pDevice->PortOffset, &qwNextTBTT); //Get Local TSF counter
|
|
uBeaconInterval = wBeaconInterval * 1024;
|
|
// Next TBTT = ((local_current_TSF / beacon_interval) + 1 ) * beacon_interval
|
|
uLowNextTBTT = (LODWORD(qwNextTBTT) >> 10) << 10;
|
|
uLowRemain = (uLowNextTBTT) % uBeaconInterval;
|
|
// high dword (mod) bcn
|
|
uHighRemain = (((0xffffffff % uBeaconInterval) + 1) * HIDWORD(qwNextTBTT))
|
|
% uBeaconInterval;
|
|
uLowRemain = (uHighRemain + uLowRemain) % uBeaconInterval;
|
|
uLowRemain = uBeaconInterval - uLowRemain;
|
|
|
|
// check if carry when add one beacon interval
|
|
if ((~uLowNextTBTT) < uLowRemain) {
|
|
HIDWORD(qwNextTBTT) ++ ;
|
|
}
|
|
LODWORD(qwNextTBTT) = uLowNextTBTT + uLowRemain;
|
|
|
|
// set HW beacon interval
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_BI, wBeaconInterval);
|
|
pDevice->wBeaconInterval = wBeaconInterval;
|
|
// Set NextTBTT
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_NEXTTBTT, LODWORD(qwNextTBTT));
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_NEXTTBTT + 4, HIDWORD(qwNextTBTT));
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN);
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Description: Card Stop Hardware Tx
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDeviceHandler - The adapter to be set
|
|
* ePktType - Packet type to stop
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TRUE if all data packet complete; otherwise FALSE.
|
|
*
|
|
*/
|
|
BOOL CARDbStopTxPacket (void *pDeviceHandler, CARD_PKT_TYPE ePktType)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
|
|
|
|
if (ePktType == PKT_TYPE_802_11_ALL) {
|
|
pDevice->bStopBeacon = TRUE;
|
|
pDevice->bStopTx0Pkt = TRUE;
|
|
pDevice->bStopDataPkt = TRUE;
|
|
} else if (ePktType == PKT_TYPE_802_11_BCN) {
|
|
pDevice->bStopBeacon = TRUE;
|
|
} else if (ePktType == PKT_TYPE_802_11_MNG) {
|
|
pDevice->bStopTx0Pkt = TRUE;
|
|
} else if (ePktType == PKT_TYPE_802_11_DATA) {
|
|
pDevice->bStopDataPkt = TRUE;
|
|
}
|
|
|
|
if (pDevice->bStopBeacon == TRUE) {
|
|
if (pDevice->bIsBeaconBufReadySet == TRUE) {
|
|
if (pDevice->cbBeaconBufReadySetCnt < WAIT_BEACON_TX_DOWN_TMO) {
|
|
pDevice->cbBeaconBufReadySetCnt ++;
|
|
return(FALSE);
|
|
}
|
|
}
|
|
pDevice->bIsBeaconBufReadySet = FALSE;
|
|
pDevice->cbBeaconBufReadySetCnt = 0;
|
|
MACvRegBitsOff(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
|
|
}
|
|
// wait all TD0 complete
|
|
if (pDevice->bStopTx0Pkt == TRUE) {
|
|
if (pDevice->iTDUsed[TYPE_TXDMA0] != 0){
|
|
return(FALSE);
|
|
}
|
|
}
|
|
// wait all Data TD complete
|
|
if (pDevice->bStopDataPkt == TRUE) {
|
|
if (pDevice->iTDUsed[TYPE_AC0DMA] != 0){
|
|
return(FALSE);
|
|
}
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
/*
|
|
* Description: Card Start Hardware Tx
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDeviceHandler - The adapter to be set
|
|
* ePktType - Packet type to start
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TRUE if success; FALSE if failed.
|
|
*
|
|
*/
|
|
BOOL CARDbStartTxPacket (void *pDeviceHandler, CARD_PKT_TYPE ePktType)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
|
|
|
|
if (ePktType == PKT_TYPE_802_11_ALL) {
|
|
pDevice->bStopBeacon = FALSE;
|
|
pDevice->bStopTx0Pkt = FALSE;
|
|
pDevice->bStopDataPkt = FALSE;
|
|
} else if (ePktType == PKT_TYPE_802_11_BCN) {
|
|
pDevice->bStopBeacon = FALSE;
|
|
} else if (ePktType == PKT_TYPE_802_11_MNG) {
|
|
pDevice->bStopTx0Pkt = FALSE;
|
|
} else if (ePktType == PKT_TYPE_802_11_DATA) {
|
|
pDevice->bStopDataPkt = FALSE;
|
|
}
|
|
|
|
if ((pDevice->bStopBeacon == FALSE) &&
|
|
(pDevice->bBeaconBufReady == TRUE) &&
|
|
(pDevice->eOPMode == OP_MODE_ADHOC)) {
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Description: Card Set BSSID value
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDeviceHandler - The adapter to be set
|
|
* pbyBSSID - pointer to BSSID field
|
|
* bAdhoc - flag to indicate IBSS
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TRUE if success; FALSE if failed.
|
|
*
|
|
*/
|
|
BOOL CARDbSetBSSID(void *pDeviceHandler, PBYTE pbyBSSID, CARD_OP_MODE eOPMode)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
|
|
MACvWriteBSSIDAddress(pDevice->PortOffset, pbyBSSID);
|
|
memcpy(pDevice->abyBSSID, pbyBSSID, WLAN_BSSID_LEN);
|
|
if (eOPMode == OP_MODE_ADHOC) {
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_ADHOC);
|
|
} else {
|
|
MACvRegBitsOff(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_ADHOC);
|
|
}
|
|
if (eOPMode == OP_MODE_AP) {
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_AP);
|
|
} else {
|
|
MACvRegBitsOff(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_AP);
|
|
}
|
|
if (eOPMode == OP_MODE_UNKNOWN) {
|
|
MACvRegBitsOff(pDevice->PortOffset, MAC_REG_RCR, RCR_BSSID);
|
|
pDevice->bBSSIDFilter = FALSE;
|
|
pDevice->byRxMode &= ~RCR_BSSID;
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wcmd: rx_mode = %x\n", pDevice->byRxMode );
|
|
} else {
|
|
if (IS_NULL_ADDRESS(pDevice->abyBSSID) == FALSE) {
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_RCR, RCR_BSSID);
|
|
pDevice->bBSSIDFilter = TRUE;
|
|
pDevice->byRxMode |= RCR_BSSID;
|
|
}
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: rx_mode = %x\n", pDevice->byRxMode );
|
|
}
|
|
// Adopt BSS state in Adapter Device Object
|
|
pDevice->eOPMode = eOPMode;
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
/*
|
|
* Description: Card indicate status
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDeviceHandler - The adapter to be set
|
|
* eStatus - Status
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TRUE if success; FALSE if failed.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*
|
|
* Description: Save Assoc info. contain in assoc. response frame
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be set
|
|
* wCapabilityInfo - Capability information
|
|
* wStatus - Status code
|
|
* wAID - Assoc. ID
|
|
* uLen - Length of IEs
|
|
* pbyIEs - pointer to IEs
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TRUE if succeed; otherwise FALSE
|
|
*
|
|
*/
|
|
BOOL CARDbSetTxDataRate(
|
|
void *pDeviceHandler,
|
|
WORD wDataRate
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
|
|
pDevice->wCurrentRate = wDataRate;
|
|
return(TRUE);
|
|
}
|
|
|
|
/*+
|
|
*
|
|
* Routine Description:
|
|
* Consider to power down when no more packets to tx or rx.
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be set
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TRUE if power down success; otherwise FALSE
|
|
*
|
|
-*/
|
|
BOOL
|
|
CARDbPowerDown(
|
|
void *pDeviceHandler
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice)pDeviceHandler;
|
|
UINT uIdx;
|
|
|
|
// check if already in Doze mode
|
|
if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS))
|
|
return TRUE;
|
|
|
|
// Froce PSEN on
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PSEN);
|
|
|
|
// check if all TD are empty,
|
|
|
|
for (uIdx = 0; uIdx < TYPE_MAXTD; uIdx ++) {
|
|
if (pDevice->iTDUsed[uIdx] != 0)
|
|
return FALSE;
|
|
}
|
|
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_GO2DOZE);
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Go to Doze ZZZZZZZZZZZZZZZ\n");
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
* Description: Turn off Radio power
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be turned off
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TRUE if success; otherwise FALSE
|
|
*
|
|
*/
|
|
BOOL CARDbRadioPowerOff (void *pDeviceHandler)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
BOOL bResult = TRUE;
|
|
|
|
if (pDevice->bRadioOff == TRUE)
|
|
return TRUE;
|
|
|
|
|
|
switch (pDevice->byRFType) {
|
|
|
|
case RF_RFMD2959:
|
|
MACvWordRegBitsOff(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_TXPEINV);
|
|
MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE1);
|
|
break;
|
|
|
|
case RF_AIROHA:
|
|
case RF_AL2230S:
|
|
case RF_AIROHA7230: //RobertYu:20050104
|
|
MACvWordRegBitsOff(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE2);
|
|
MACvWordRegBitsOff(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE3);
|
|
break;
|
|
|
|
}
|
|
|
|
MACvRegBitsOff(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_RXON);
|
|
|
|
BBvSetDeepSleep(pDevice->PortOffset, pDevice->byLocalID);
|
|
|
|
pDevice->bRadioOff = TRUE;
|
|
//2007-0409-03,<Add> by chester
|
|
printk("chester power off\n");
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_GPIOCTL0, LED_ACTSET); //LED issue
|
|
return bResult;
|
|
}
|
|
|
|
|
|
/*
|
|
* Description: Turn on Radio power
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be turned on
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TRUE if success; otherwise FALSE
|
|
*
|
|
*/
|
|
BOOL CARDbRadioPowerOn (void *pDeviceHandler)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
BOOL bResult = TRUE;
|
|
printk("chester power on\n");
|
|
if (pDevice->bRadioControlOff == TRUE){
|
|
if (pDevice->bHWRadioOff == TRUE) printk("chester bHWRadioOff\n");
|
|
if (pDevice->bRadioControlOff == TRUE) printk("chester bRadioControlOff\n");
|
|
return FALSE;}
|
|
|
|
if (pDevice->bRadioOff == FALSE)
|
|
{
|
|
printk("chester pbRadioOff\n");
|
|
return TRUE;}
|
|
|
|
BBvExitDeepSleep(pDevice->PortOffset, pDevice->byLocalID);
|
|
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_RXON);
|
|
|
|
switch (pDevice->byRFType) {
|
|
|
|
case RF_RFMD2959:
|
|
MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_TXPEINV);
|
|
MACvWordRegBitsOff(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE1);
|
|
break;
|
|
|
|
case RF_AIROHA:
|
|
case RF_AL2230S:
|
|
case RF_AIROHA7230: //RobertYu:20050104
|
|
MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPE2 |
|
|
SOFTPWRCTL_SWPE3));
|
|
break;
|
|
|
|
}
|
|
|
|
pDevice->bRadioOff = FALSE;
|
|
// 2007-0409-03,<Add> by chester
|
|
printk("chester power on\n");
|
|
MACvRegBitsOff(pDevice->PortOffset, MAC_REG_GPIOCTL0, LED_ACTSET); //LED issue
|
|
return bResult;
|
|
}
|
|
|
|
|
|
|
|
BOOL CARDbRemoveKey (void *pDeviceHandler, PBYTE pbyBSSID)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
|
|
KeybRemoveAllKey(&(pDevice->sKey), pbyBSSID, pDevice->PortOffset);
|
|
return (TRUE);
|
|
}
|
|
|
|
|
|
/*
|
|
*
|
|
* Description:
|
|
* Add BSSID in PMKID Candidate list.
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* hDeviceContext - device structure point
|
|
* pbyBSSID - BSSID address for adding
|
|
* wRSNCap - BSS's RSN capability
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none.
|
|
*
|
|
-*/
|
|
BOOL
|
|
CARDbAdd_PMKID_Candidate (
|
|
void *pDeviceHandler,
|
|
PBYTE pbyBSSID,
|
|
BOOL bRSNCapExist,
|
|
WORD wRSNCap
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
PPMKID_CANDIDATE pCandidateList;
|
|
UINT ii = 0;
|
|
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"bAdd_PMKID_Candidate START: (%d)\n", (int)pDevice->gsPMKIDCandidate.NumCandidates);
|
|
|
|
if (pDevice->gsPMKIDCandidate.NumCandidates >= MAX_PMKIDLIST) {
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFlush_PMKID_Candidate: 3\n");
|
|
memset(&pDevice->gsPMKIDCandidate, 0, sizeof(SPMKIDCandidateEvent));
|
|
}
|
|
|
|
for (ii = 0; ii < 6; ii++) {
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02X ", *(pbyBSSID + ii));
|
|
}
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");
|
|
|
|
|
|
// Update Old Candidate
|
|
for (ii = 0; ii < pDevice->gsPMKIDCandidate.NumCandidates; ii++) {
|
|
pCandidateList = &pDevice->gsPMKIDCandidate.CandidateList[ii];
|
|
if ( !memcmp(pCandidateList->BSSID, pbyBSSID, ETH_ALEN)) {
|
|
if ((bRSNCapExist == TRUE) && (wRSNCap & BIT0)) {
|
|
pCandidateList->Flags |= NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED;
|
|
} else {
|
|
pCandidateList->Flags &= ~(NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED);
|
|
}
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
// New Candidate
|
|
pCandidateList = &pDevice->gsPMKIDCandidate.CandidateList[pDevice->gsPMKIDCandidate.NumCandidates];
|
|
if ((bRSNCapExist == TRUE) && (wRSNCap & BIT0)) {
|
|
pCandidateList->Flags |= NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED;
|
|
} else {
|
|
pCandidateList->Flags &= ~(NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED);
|
|
}
|
|
memcpy(pCandidateList->BSSID, pbyBSSID, ETH_ALEN);
|
|
pDevice->gsPMKIDCandidate.NumCandidates++;
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"NumCandidates:%d\n", (int)pDevice->gsPMKIDCandidate.NumCandidates);
|
|
return TRUE;
|
|
}
|
|
|
|
void *
|
|
CARDpGetCurrentAddress (
|
|
void *pDeviceHandler
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
|
|
return (pDevice->abyCurrentNetAddr);
|
|
}
|
|
|
|
|
|
|
|
void CARDvInitChannelTable (void *pDeviceHandler)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
BOOL bMultiBand = FALSE;
|
|
UINT ii;
|
|
|
|
for(ii=1;ii<=CARD_MAX_CHANNEL_TBL;ii++) {
|
|
sChannelTbl[ii].bValid = FALSE;
|
|
}
|
|
|
|
switch (pDevice->byRFType) {
|
|
case RF_RFMD2959 :
|
|
case RF_AIROHA :
|
|
case RF_AL2230S:
|
|
case RF_UW2451 :
|
|
case RF_VT3226 :
|
|
// printk("chester-false\n");
|
|
bMultiBand = FALSE;
|
|
break;
|
|
case RF_AIROHA7230 :
|
|
case RF_UW2452 :
|
|
case RF_NOTHING :
|
|
default :
|
|
bMultiBand = TRUE;
|
|
break;
|
|
}
|
|
|
|
if ((pDevice->dwDiagRefCount != 0) ||
|
|
(pDevice->b11hEnable == TRUE)) {
|
|
if (bMultiBand == TRUE) {
|
|
for(ii=0;ii<CARD_MAX_CHANNEL_TBL;ii++) {
|
|
sChannelTbl[ii+1].bValid = TRUE;
|
|
pDevice->abyRegPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1];
|
|
pDevice->abyLocalPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1];
|
|
}
|
|
for(ii=0;ii<CHANNEL_MAX_24G;ii++) {
|
|
pDevice->abyRegPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1];
|
|
pDevice->abyLocalPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1];
|
|
}
|
|
} else {
|
|
for(ii=0;ii<CHANNEL_MAX_24G;ii++) {
|
|
//2008-8-4 <add> by chester
|
|
if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] != 0) {
|
|
sChannelTbl[ii+1].bValid = TRUE;
|
|
pDevice->abyRegPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1];
|
|
pDevice->abyLocalPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1];
|
|
}
|
|
}
|
|
}
|
|
} else if (pDevice->byZoneType <= CCODE_MAX) {
|
|
if (bMultiBand == TRUE) {
|
|
for(ii=0;ii<CARD_MAX_CHANNEL_TBL;ii++) {
|
|
if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] != 0) {
|
|
sChannelTbl[ii+1].bValid = TRUE;
|
|
pDevice->abyRegPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii];
|
|
pDevice->abyLocalPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii];
|
|
}
|
|
}
|
|
} else {
|
|
for(ii=0;ii<CHANNEL_MAX_24G;ii++) {
|
|
if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] != 0) {
|
|
sChannelTbl[ii+1].bValid = TRUE;
|
|
pDevice->abyRegPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii];
|
|
pDevice->abyLocalPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO"Zone=[%d][%c][%c]!!\n",pDevice->byZoneType,ChannelRuleTab[pDevice->byZoneType].chCountryCode[0],ChannelRuleTab[pDevice->byZoneType].chCountryCode[1]);
|
|
for(ii=0;ii<CARD_MAX_CHANNEL_TBL;ii++) {
|
|
if (pDevice->abyRegPwr[ii+1] == 0) {
|
|
pDevice->abyRegPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1];
|
|
}
|
|
if (pDevice->abyLocalPwr[ii+1] == 0) {
|
|
pDevice->abyLocalPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1];
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
*
|
|
* Description:
|
|
* Start Spectrum Measure defined in 802.11h
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* hDeviceContext - device structure point
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none.
|
|
*
|
|
-*/
|
|
BOOL
|
|
CARDbStartMeasure (
|
|
void *pDeviceHandler,
|
|
void *pvMeasureEIDs,
|
|
UINT uNumOfMeasureEIDs
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
PWLAN_IE_MEASURE_REQ pEID = (PWLAN_IE_MEASURE_REQ) pvMeasureEIDs;
|
|
QWORD qwCurrTSF;
|
|
QWORD qwStartTSF;
|
|
BOOL bExpired = TRUE;
|
|
WORD wDuration = 0;
|
|
|
|
if ((pEID == NULL) ||
|
|
(uNumOfMeasureEIDs == 0)) {
|
|
return (TRUE);
|
|
}
|
|
CARDbGetCurrentTSF(pDevice->PortOffset, &qwCurrTSF);
|
|
if (pDevice->bMeasureInProgress == TRUE) {
|
|
pDevice->bMeasureInProgress = FALSE;
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byOrgRCR);
|
|
MACvSelectPage1(pDevice->PortOffset);
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, pDevice->dwOrgMAR0);
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR4, pDevice->dwOrgMAR4);
|
|
// clear measure control
|
|
MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
|
|
MACvSelectPage0(pDevice->PortOffset);
|
|
CARDbSetChannel(pDevice, pDevice->byOrgChannel);
|
|
MACvSelectPage1(pDevice->PortOffset);
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
|
|
MACvSelectPage0(pDevice->PortOffset);
|
|
}
|
|
pDevice->uNumOfMeasureEIDs = uNumOfMeasureEIDs;
|
|
|
|
do {
|
|
pDevice->pCurrMeasureEID = pEID;
|
|
pEID++;
|
|
pDevice->uNumOfMeasureEIDs--;
|
|
|
|
if (pDevice->byLocalID > REV_ID_VT3253_B1) {
|
|
HIDWORD(qwStartTSF) = HIDWORD(*((PQWORD) (pDevice->pCurrMeasureEID->sReq.abyStartTime)));
|
|
LODWORD(qwStartTSF) = LODWORD(*((PQWORD) (pDevice->pCurrMeasureEID->sReq.abyStartTime)));
|
|
wDuration = *((PWORD) (pDevice->pCurrMeasureEID->sReq.abyDuration));
|
|
wDuration += 1; // 1 TU for channel switching
|
|
|
|
if ((LODWORD(qwStartTSF) == 0) && (HIDWORD(qwStartTSF) == 0)) {
|
|
// start imediately by setting start TSF == current TSF + 2 TU
|
|
LODWORD(qwStartTSF) = LODWORD(qwCurrTSF) + 2048;
|
|
HIDWORD(qwStartTSF) = HIDWORD(qwCurrTSF);
|
|
if (LODWORD(qwCurrTSF) > LODWORD(qwStartTSF)) {
|
|
HIDWORD(qwStartTSF)++;
|
|
}
|
|
bExpired = FALSE;
|
|
break;
|
|
} else {
|
|
// start at setting start TSF - 1TU(for channel switching)
|
|
if (LODWORD(qwStartTSF) < 1024) {
|
|
HIDWORD(qwStartTSF)--;
|
|
}
|
|
LODWORD(qwStartTSF) -= 1024;
|
|
}
|
|
|
|
if ((HIDWORD(qwCurrTSF) < HIDWORD(qwStartTSF)) ||
|
|
((HIDWORD(qwCurrTSF) == HIDWORD(qwStartTSF)) &&
|
|
(LODWORD(qwCurrTSF) < LODWORD(qwStartTSF)))
|
|
) {
|
|
bExpired = FALSE;
|
|
break;
|
|
}
|
|
VNTWIFIbMeasureReport( pDevice->pMgmt,
|
|
FALSE,
|
|
pDevice->pCurrMeasureEID,
|
|
MEASURE_MODE_LATE,
|
|
pDevice->byBasicMap,
|
|
pDevice->byCCAFraction,
|
|
pDevice->abyRPIs
|
|
);
|
|
} else {
|
|
// hardware do not support measure
|
|
VNTWIFIbMeasureReport( pDevice->pMgmt,
|
|
FALSE,
|
|
pDevice->pCurrMeasureEID,
|
|
MEASURE_MODE_INCAPABLE,
|
|
pDevice->byBasicMap,
|
|
pDevice->byCCAFraction,
|
|
pDevice->abyRPIs
|
|
);
|
|
}
|
|
} while (pDevice->uNumOfMeasureEIDs != 0);
|
|
|
|
if (bExpired == FALSE) {
|
|
MACvSelectPage1(pDevice->PortOffset);
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_MSRSTART, LODWORD(qwStartTSF));
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_MSRSTART + 4, HIDWORD(qwStartTSF));
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_MSRDURATION, wDuration);
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
|
|
MACvSelectPage0(pDevice->PortOffset);
|
|
} else {
|
|
// all measure start time expired we should complete action
|
|
VNTWIFIbMeasureReport( pDevice->pMgmt,
|
|
TRUE,
|
|
NULL,
|
|
0,
|
|
pDevice->byBasicMap,
|
|
pDevice->byCCAFraction,
|
|
pDevice->abyRPIs
|
|
);
|
|
}
|
|
return (TRUE);
|
|
}
|
|
|
|
|
|
/*
|
|
*
|
|
* Description:
|
|
* Do Channel Switch defined in 802.11h
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* hDeviceContext - device structure point
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none.
|
|
*
|
|
-*/
|
|
BOOL
|
|
CARDbChannelSwitch (
|
|
void *pDeviceHandler,
|
|
BYTE byMode,
|
|
BYTE byNewChannel,
|
|
BYTE byCount
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
BOOL bResult = TRUE;
|
|
|
|
if (byCount == 0) {
|
|
bResult = CARDbSetChannel(pDevice, byNewChannel);
|
|
VNTWIFIbChannelSwitch(pDevice->pMgmt, byNewChannel);
|
|
MACvSelectPage1(pDevice->PortOffset);
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
|
|
MACvSelectPage0(pDevice->PortOffset);
|
|
return(bResult);
|
|
}
|
|
pDevice->byChannelSwitchCount = byCount;
|
|
pDevice->byNewChannel = byNewChannel;
|
|
pDevice->bChannelSwitch = TRUE;
|
|
if (byMode == 1) {
|
|
bResult=CARDbStopTxPacket(pDevice, PKT_TYPE_802_11_ALL);
|
|
}
|
|
return (bResult);
|
|
}
|
|
|
|
|
|
/*
|
|
*
|
|
* Description:
|
|
* Handle Quiet EID defined in 802.11h
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* hDeviceContext - device structure point
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none.
|
|
*
|
|
-*/
|
|
BOOL
|
|
CARDbSetQuiet (
|
|
void *pDeviceHandler,
|
|
BOOL bResetQuiet,
|
|
BYTE byQuietCount,
|
|
BYTE byQuietPeriod,
|
|
WORD wQuietDuration,
|
|
WORD wQuietOffset
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
UINT ii = 0;
|
|
|
|
if (bResetQuiet == TRUE) {
|
|
MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN));
|
|
for(ii=0;ii<MAX_QUIET_COUNT;ii++) {
|
|
pDevice->sQuiet[ii].bEnable = FALSE;
|
|
}
|
|
pDevice->uQuietEnqueue = 0;
|
|
pDevice->bEnableFirstQuiet = FALSE;
|
|
pDevice->bQuietEnable = FALSE;
|
|
pDevice->byQuietStartCount = byQuietCount;
|
|
}
|
|
if (pDevice->sQuiet[pDevice->uQuietEnqueue].bEnable == FALSE) {
|
|
pDevice->sQuiet[pDevice->uQuietEnqueue].bEnable = TRUE;
|
|
pDevice->sQuiet[pDevice->uQuietEnqueue].byPeriod = byQuietPeriod;
|
|
pDevice->sQuiet[pDevice->uQuietEnqueue].wDuration = wQuietDuration;
|
|
pDevice->sQuiet[pDevice->uQuietEnqueue].dwStartTime = (DWORD) byQuietCount;
|
|
pDevice->sQuiet[pDevice->uQuietEnqueue].dwStartTime *= pDevice->wBeaconInterval;
|
|
pDevice->sQuiet[pDevice->uQuietEnqueue].dwStartTime += wQuietOffset;
|
|
pDevice->uQuietEnqueue++;
|
|
pDevice->uQuietEnqueue %= MAX_QUIET_COUNT;
|
|
if (pDevice->byQuietStartCount < byQuietCount) {
|
|
pDevice->byQuietStartCount = byQuietCount;
|
|
}
|
|
} else {
|
|
// we can not handle Quiet EID more
|
|
}
|
|
return (TRUE);
|
|
}
|
|
|
|
|
|
/*
|
|
*
|
|
* Description:
|
|
* Do Quiet, It will called by either ISR (after start) or VNTWIFI (before start) so do not need SPINLOCK
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* hDeviceContext - device structure point
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none.
|
|
*
|
|
-*/
|
|
BOOL
|
|
CARDbStartQuiet (
|
|
void *pDeviceHandler
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
UINT ii = 0;
|
|
DWORD dwStartTime = 0xFFFFFFFF;
|
|
UINT uCurrentQuietIndex = 0;
|
|
DWORD dwNextTime = 0;
|
|
DWORD dwGap = 0;
|
|
DWORD dwDuration = 0;
|
|
|
|
for(ii=0;ii<MAX_QUIET_COUNT;ii++) {
|
|
if ((pDevice->sQuiet[ii].bEnable == TRUE) &&
|
|
(dwStartTime > pDevice->sQuiet[ii].dwStartTime)) {
|
|
dwStartTime = pDevice->sQuiet[ii].dwStartTime;
|
|
uCurrentQuietIndex = ii;
|
|
}
|
|
}
|
|
if (dwStartTime == 0xFFFFFFFF) {
|
|
// no more quiet
|
|
pDevice->bQuietEnable = FALSE;
|
|
MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN));
|
|
} else {
|
|
if (pDevice->bQuietEnable == FALSE) {
|
|
// first quiet
|
|
pDevice->byQuietStartCount--;
|
|
dwNextTime = pDevice->sQuiet[uCurrentQuietIndex].dwStartTime;
|
|
dwNextTime %= pDevice->wBeaconInterval;
|
|
MACvSelectPage1(pDevice->PortOffset);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_QUIETINIT, (WORD) dwNextTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_QUIETDUR, (WORD) pDevice->sQuiet[uCurrentQuietIndex].wDuration);
|
|
if (pDevice->byQuietStartCount == 0) {
|
|
pDevice->bEnableFirstQuiet = FALSE;
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN));
|
|
} else {
|
|
pDevice->bEnableFirstQuiet = TRUE;
|
|
}
|
|
MACvSelectPage0(pDevice->PortOffset);
|
|
} else {
|
|
if (pDevice->dwCurrentQuietEndTime > pDevice->sQuiet[uCurrentQuietIndex].dwStartTime) {
|
|
// overlap with previous Quiet
|
|
dwGap = pDevice->dwCurrentQuietEndTime - pDevice->sQuiet[uCurrentQuietIndex].dwStartTime;
|
|
if (dwGap >= pDevice->sQuiet[uCurrentQuietIndex].wDuration) {
|
|
// return FALSE to indicate next quiet expired, should call this function again
|
|
return (FALSE);
|
|
}
|
|
dwDuration = pDevice->sQuiet[uCurrentQuietIndex].wDuration - dwGap;
|
|
dwGap = 0;
|
|
} else {
|
|
dwGap = pDevice->sQuiet[uCurrentQuietIndex].dwStartTime - pDevice->dwCurrentQuietEndTime;
|
|
dwDuration = pDevice->sQuiet[uCurrentQuietIndex].wDuration;
|
|
}
|
|
// set GAP and Next duration
|
|
MACvSelectPage1(pDevice->PortOffset);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_QUIETGAP, (WORD) dwGap);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_QUIETDUR, (WORD) dwDuration);
|
|
MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_QUIETRPT);
|
|
MACvSelectPage0(pDevice->PortOffset);
|
|
}
|
|
pDevice->bQuietEnable = TRUE;
|
|
pDevice->dwCurrentQuietEndTime = pDevice->sQuiet[uCurrentQuietIndex].dwStartTime;
|
|
pDevice->dwCurrentQuietEndTime += pDevice->sQuiet[uCurrentQuietIndex].wDuration;
|
|
if (pDevice->sQuiet[uCurrentQuietIndex].byPeriod == 0) {
|
|
// not period disable current quiet element
|
|
pDevice->sQuiet[uCurrentQuietIndex].bEnable = FALSE;
|
|
} else {
|
|
// set next period start time
|
|
dwNextTime = (DWORD) pDevice->sQuiet[uCurrentQuietIndex].byPeriod;
|
|
dwNextTime *= pDevice->wBeaconInterval;
|
|
pDevice->sQuiet[uCurrentQuietIndex].dwStartTime = dwNextTime;
|
|
}
|
|
if (pDevice->dwCurrentQuietEndTime > 0x80010000) {
|
|
// decreament all time to avoid wrap around
|
|
for(ii=0;ii<MAX_QUIET_COUNT;ii++) {
|
|
if (pDevice->sQuiet[ii].bEnable == TRUE) {
|
|
pDevice->sQuiet[ii].dwStartTime -= 0x80000000;
|
|
}
|
|
}
|
|
pDevice->dwCurrentQuietEndTime -= 0x80000000;
|
|
}
|
|
}
|
|
return (TRUE);
|
|
}
|
|
|
|
|
|
/*
|
|
*
|
|
* Description:
|
|
* Set Channel Info of Country
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* hDeviceContext - device structure point
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none.
|
|
*
|
|
-*/
|
|
void
|
|
CARDvSetCountryInfo (
|
|
void *pDeviceHandler,
|
|
CARD_PHY_TYPE ePHYType,
|
|
void *pIE
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
UINT ii = 0;
|
|
UINT uu = 0;
|
|
UINT step = 0;
|
|
UINT uNumOfCountryInfo = 0;
|
|
BYTE byCh = 0;
|
|
PWLAN_IE_COUNTRY pIE_Country = (PWLAN_IE_COUNTRY) pIE;
|
|
|
|
|
|
uNumOfCountryInfo = (pIE_Country->len - 3);
|
|
uNumOfCountryInfo /= 3;
|
|
|
|
if (ePHYType == PHY_TYPE_11A) {
|
|
pDevice->bCountryInfo5G = TRUE;
|
|
for(ii=CB_MAX_CHANNEL_24G+1;ii<=CARD_MAX_CHANNEL_TBL;ii++) {
|
|
sChannelTbl[ii].bValid = FALSE;
|
|
}
|
|
step = 4;
|
|
} else {
|
|
pDevice->bCountryInfo24G = TRUE;
|
|
for(ii=1;ii<=CB_MAX_CHANNEL_24G;ii++) {
|
|
sChannelTbl[ii].bValid = FALSE;
|
|
}
|
|
step = 1;
|
|
}
|
|
pDevice->abyCountryCode[0] = pIE_Country->abyCountryString[0];
|
|
pDevice->abyCountryCode[1] = pIE_Country->abyCountryString[1];
|
|
pDevice->abyCountryCode[2] = pIE_Country->abyCountryString[2];
|
|
|
|
for(ii=0;ii<uNumOfCountryInfo;ii++) {
|
|
for(uu=0;uu<pIE_Country->abyCountryInfo[ii*3+1];uu++) {
|
|
byCh = CARDbyGetChannelMapping(pDevice, (BYTE)(pIE_Country->abyCountryInfo[ii*3]+step*uu), ePHYType);
|
|
sChannelTbl[byCh].bValid = TRUE;
|
|
pDevice->abyRegPwr[byCh] = pIE_Country->abyCountryInfo[ii*3+2];
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
*
|
|
* Description:
|
|
* Set Local Power Constraint
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* hDeviceContext - device structure point
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none.
|
|
*
|
|
-*/
|
|
void
|
|
CARDvSetPowerConstraint (
|
|
void *pDeviceHandler,
|
|
BYTE byChannel,
|
|
I8 byPower
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
|
|
if (byChannel > CB_MAX_CHANNEL_24G) {
|
|
if (pDevice->bCountryInfo5G == TRUE) {
|
|
pDevice->abyLocalPwr[byChannel] = pDevice->abyRegPwr[byChannel] - byPower;
|
|
}
|
|
} else {
|
|
if (pDevice->bCountryInfo24G == TRUE) {
|
|
pDevice->abyLocalPwr[byChannel] = pDevice->abyRegPwr[byChannel] - byPower;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
*
|
|
* Description:
|
|
* Set Local Power Constraint
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* hDeviceContext - device structure point
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none.
|
|
*
|
|
-*/
|
|
void
|
|
CARDvGetPowerCapability (
|
|
void *pDeviceHandler,
|
|
PBYTE pbyMinPower,
|
|
PBYTE pbyMaxPower
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
BYTE byDec = 0;
|
|
|
|
*pbyMaxPower = pDevice->abyOFDMDefaultPwr[pDevice->byCurrentCh];
|
|
byDec = pDevice->abyOFDMPwrTbl[pDevice->byCurrentCh];
|
|
if (pDevice->byRFType == RF_UW2452) {
|
|
byDec *= 3;
|
|
byDec >>= 1;
|
|
} else {
|
|
byDec <<= 1;
|
|
}
|
|
*pbyMinPower = pDevice->abyOFDMDefaultPwr[pDevice->byCurrentCh] - byDec;
|
|
}
|
|
|
|
|
|
/*
|
|
*
|
|
* Description:
|
|
* Set Support Channels IE defined in 802.11h
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* hDeviceContext - device structure point
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none.
|
|
*
|
|
-*/
|
|
BYTE
|
|
CARDbySetSupportChannels (
|
|
void *pDeviceHandler,
|
|
PBYTE pbyIEs
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
UINT ii;
|
|
BYTE byCount;
|
|
PWLAN_IE_SUPP_CH pIE = (PWLAN_IE_SUPP_CH) pbyIEs;
|
|
PBYTE pbyChTupple;
|
|
BYTE byLen = 0;
|
|
|
|
|
|
pIE->byElementID = WLAN_EID_SUPP_CH;
|
|
pIE->len = 0;
|
|
pbyChTupple = pIE->abyChannelTuple;
|
|
byLen = 2;
|
|
// lower band
|
|
byCount = 0;
|
|
if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[28] == TRUE) {
|
|
for (ii=28;ii<36;ii+=2) {
|
|
if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] == TRUE) {
|
|
byCount++;
|
|
}
|
|
}
|
|
*pbyChTupple++ = 34;
|
|
*pbyChTupple++ = byCount;
|
|
byLen += 2;
|
|
} else if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[29] == TRUE) {
|
|
for (ii=29;ii<36;ii+=2) {
|
|
if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] == TRUE) {
|
|
byCount++;
|
|
}
|
|
}
|
|
*pbyChTupple++ = 36;
|
|
*pbyChTupple++ = byCount;
|
|
byLen += 2;
|
|
}
|
|
// middle band
|
|
byCount = 0;
|
|
if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[36] == TRUE) {
|
|
for (ii=36;ii<40;ii++) {
|
|
if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] == TRUE) {
|
|
byCount++;
|
|
}
|
|
}
|
|
*pbyChTupple++ = 52;
|
|
*pbyChTupple++ = byCount;
|
|
byLen += 2;
|
|
}
|
|
// higher band
|
|
byCount = 0;
|
|
if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[40] == TRUE) {
|
|
for (ii=40;ii<51;ii++) {
|
|
if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] == TRUE) {
|
|
byCount++;
|
|
}
|
|
}
|
|
*pbyChTupple++ = 100;
|
|
*pbyChTupple++ = byCount;
|
|
byLen += 2;
|
|
} else if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[51] == TRUE) {
|
|
for (ii=51;ii<56;ii++) {
|
|
if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] == TRUE) {
|
|
byCount++;
|
|
}
|
|
}
|
|
*pbyChTupple++ = 149;
|
|
*pbyChTupple++ = byCount;
|
|
byLen += 2;
|
|
}
|
|
pIE->len += (byLen - 2);
|
|
return (byLen);
|
|
}
|
|
|
|
|
|
/*
|
|
*
|
|
* Description:
|
|
* Get Current Tx Power
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* hDeviceContext - device structure point
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none.
|
|
*
|
|
-*/
|
|
I8
|
|
CARDbyGetTransmitPower (
|
|
void *pDeviceHandler
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
|
|
return (pDevice->byCurPwrdBm);
|
|
}
|
|
|
|
|
|
BOOL
|
|
CARDbChannelGetList (
|
|
UINT uCountryCodeIdx,
|
|
PBYTE pbyChannelTable
|
|
)
|
|
{
|
|
if (uCountryCodeIdx >= CCODE_MAX) {
|
|
return (FALSE);
|
|
}
|
|
memcpy(pbyChannelTable, ChannelRuleTab[uCountryCodeIdx].bChannelIdxList, CB_MAX_CHANNEL);
|
|
return (TRUE);
|
|
}
|
|
|
|
|
|
void
|
|
CARDvSetCountryIE(
|
|
void *pDeviceHandler,
|
|
void *pIE
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
UINT ii;
|
|
PWLAN_IE_COUNTRY pIECountry = (PWLAN_IE_COUNTRY) pIE;
|
|
|
|
pIECountry->byElementID = WLAN_EID_COUNTRY;
|
|
pIECountry->len = 0;
|
|
pIECountry->abyCountryString[0] = ChannelRuleTab[pDevice->byZoneType].chCountryCode[0];
|
|
pIECountry->abyCountryString[1] = ChannelRuleTab[pDevice->byZoneType].chCountryCode[1];
|
|
pIECountry->abyCountryString[2] = ' ';
|
|
for (ii = CB_MAX_CHANNEL_24G; ii < CB_MAX_CHANNEL; ii++ ) {
|
|
if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] != 0) {
|
|
pIECountry->abyCountryInfo[pIECountry->len++] = sChannelTbl[ii+1].byChannelNumber;
|
|
pIECountry->abyCountryInfo[pIECountry->len++] = 1;
|
|
pIECountry->abyCountryInfo[pIECountry->len++] = ChannelRuleTab[pDevice->byZoneType].byPower[ii];
|
|
}
|
|
}
|
|
pIECountry->len += 3;
|
|
}
|
|
|
|
|
|
BOOL
|
|
CARDbGetChannelMapInfo(
|
|
void *pDeviceHandler,
|
|
UINT uChannelIndex,
|
|
PBYTE pbyChannelNumber,
|
|
PBYTE pbyMap
|
|
)
|
|
{
|
|
// PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
|
|
if (uChannelIndex > CB_MAX_CHANNEL) {
|
|
return FALSE;
|
|
}
|
|
*pbyChannelNumber = sChannelTbl[uChannelIndex].byChannelNumber;
|
|
*pbyMap = sChannelTbl[uChannelIndex].byMAP;
|
|
return sChannelTbl[uChannelIndex].bValid;
|
|
}
|
|
|
|
|
|
void
|
|
CARDvSetChannelMapInfo(
|
|
void *pDeviceHandler,
|
|
UINT uChannelIndex,
|
|
BYTE byMap
|
|
)
|
|
{
|
|
// PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
|
|
if (uChannelIndex > CB_MAX_CHANNEL) {
|
|
return;
|
|
}
|
|
sChannelTbl[uChannelIndex].byMAP |= byMap;
|
|
}
|
|
|
|
|
|
void
|
|
CARDvClearChannelMapInfo(
|
|
void *pDeviceHandler
|
|
)
|
|
{
|
|
// PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
UINT ii = 0;
|
|
|
|
for (ii = 1; ii <= CB_MAX_CHANNEL; ii++) {
|
|
sChannelTbl[ii].byMAP = 0;
|
|
}
|
|
}
|
|
|
|
|
|
BYTE
|
|
CARDbyAutoChannelSelect(
|
|
void *pDeviceHandler,
|
|
CARD_PHY_TYPE ePHYType
|
|
)
|
|
{
|
|
// PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
UINT ii = 0;
|
|
BYTE byOptionChannel = 0;
|
|
INT aiWeight[CB_MAX_CHANNEL_24G+1] = {-1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
|
|
|
if (ePHYType == PHY_TYPE_11A) {
|
|
for(ii=CB_MAX_CHANNEL_24G+1;ii<=CB_MAX_CHANNEL;ii++) {
|
|
if (sChannelTbl[ii].bValid == TRUE) {
|
|
if (byOptionChannel == 0) {
|
|
byOptionChannel = (BYTE) ii;
|
|
}
|
|
if (sChannelTbl[ii].byMAP == 0) {
|
|
return ((BYTE) ii);
|
|
} else if ( !(sChannelTbl[ii].byMAP & 0x08)) {
|
|
byOptionChannel = (BYTE) ii;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
byOptionChannel = 0;
|
|
for(ii=1;ii<=CB_MAX_CHANNEL_24G;ii++) {
|
|
if (sChannelTbl[ii].bValid == TRUE) {
|
|
if (sChannelTbl[ii].byMAP == 0) {
|
|
aiWeight[ii] += 100;
|
|
} else if (sChannelTbl[ii].byMAP & 0x01) {
|
|
if (ii > 3) {
|
|
aiWeight[ii-3] -= 10;
|
|
}
|
|
if (ii > 2) {
|
|
aiWeight[ii-2] -= 20;
|
|
}
|
|
if (ii > 1) {
|
|
aiWeight[ii-1] -= 40;
|
|
}
|
|
aiWeight[ii] -= 80;
|
|
if (ii < CB_MAX_CHANNEL_24G) {
|
|
aiWeight[ii+1] -= 40;
|
|
}
|
|
if (ii < (CB_MAX_CHANNEL_24G - 1)) {
|
|
aiWeight[ii+2] -= 20;
|
|
}
|
|
if (ii < (CB_MAX_CHANNEL_24G - 2)) {
|
|
aiWeight[ii+3] -= 10;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(ii=1;ii<=CB_MAX_CHANNEL_24G;ii++) {
|
|
if ((sChannelTbl[ii].bValid == TRUE) &&
|
|
(aiWeight[ii] > aiWeight[byOptionChannel])) {
|
|
byOptionChannel = (BYTE) ii;
|
|
}
|
|
}
|
|
}
|
|
return (byOptionChannel);
|
|
}
|
|
|
|
|
|
|
|
//xxx
|
|
void
|
|
CARDvSafeResetTx (
|
|
void *pDeviceHandler
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
UINT uu;
|
|
PSTxDesc pCurrTD;
|
|
|
|
// initialize TD index
|
|
pDevice->apTailTD[0] = pDevice->apCurrTD[0] = &(pDevice->apTD0Rings[0]);
|
|
pDevice->apTailTD[1] = pDevice->apCurrTD[1] = &(pDevice->apTD1Rings[0]);
|
|
|
|
for (uu = 0; uu < TYPE_MAXTD; uu ++)
|
|
pDevice->iTDUsed[uu] = 0;
|
|
|
|
for (uu = 0; uu < pDevice->sOpts.nTxDescs[0]; uu++) {
|
|
pCurrTD = &(pDevice->apTD0Rings[uu]);
|
|
pCurrTD->m_td0TD0.f1Owner = OWNED_BY_HOST;
|
|
// init all Tx Packet pointer to NULL
|
|
}
|
|
for (uu = 0; uu < pDevice->sOpts.nTxDescs[1]; uu++) {
|
|
pCurrTD = &(pDevice->apTD1Rings[uu]);
|
|
pCurrTD->m_td0TD0.f1Owner = OWNED_BY_HOST;
|
|
// init all Tx Packet pointer to NULL
|
|
}
|
|
|
|
// set MAC TD pointer
|
|
MACvSetCurrTXDescAddr(TYPE_TXDMA0, pDevice->PortOffset,
|
|
(pDevice->td0_pool_dma));
|
|
|
|
MACvSetCurrTXDescAddr(TYPE_AC0DMA, pDevice->PortOffset,
|
|
(pDevice->td1_pool_dma));
|
|
|
|
// set MAC Beacon TX pointer
|
|
MACvSetCurrBCNTxDescAddr(pDevice->PortOffset,
|
|
(pDevice->tx_beacon_dma));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*+
|
|
*
|
|
* Description:
|
|
* Reset Rx
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - Pointer to the adapter
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none
|
|
*
|
|
-*/
|
|
void
|
|
CARDvSafeResetRx (
|
|
void *pDeviceHandler
|
|
)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
UINT uu;
|
|
PSRxDesc pDesc;
|
|
|
|
|
|
|
|
// initialize RD index
|
|
pDevice->pCurrRD[0]=&(pDevice->aRD0Ring[0]);
|
|
pDevice->pCurrRD[1]=&(pDevice->aRD1Ring[0]);
|
|
|
|
// init state, all RD is chip's
|
|
for (uu = 0; uu < pDevice->sOpts.nRxDescs0; uu++) {
|
|
pDesc =&(pDevice->aRD0Ring[uu]);
|
|
pDesc->m_rd0RD0.wResCount = (WORD)(pDevice->rx_buf_sz);
|
|
pDesc->m_rd0RD0.f1Owner=OWNED_BY_NIC;
|
|
pDesc->m_rd1RD1.wReqCount = (WORD)(pDevice->rx_buf_sz);
|
|
}
|
|
|
|
// init state, all RD is chip's
|
|
for (uu = 0; uu < pDevice->sOpts.nRxDescs1; uu++) {
|
|
pDesc =&(pDevice->aRD1Ring[uu]);
|
|
pDesc->m_rd0RD0.wResCount = (WORD)(pDevice->rx_buf_sz);
|
|
pDesc->m_rd0RD0.f1Owner=OWNED_BY_NIC;
|
|
pDesc->m_rd1RD1.wReqCount = (WORD)(pDevice->rx_buf_sz);
|
|
}
|
|
|
|
pDevice->cbDFCB = CB_MAX_RX_FRAG;
|
|
pDevice->cbFreeDFCB = pDevice->cbDFCB;
|
|
|
|
// set perPkt mode
|
|
MACvRx0PerPktMode(pDevice->PortOffset);
|
|
MACvRx1PerPktMode(pDevice->PortOffset);
|
|
// set MAC RD pointer
|
|
MACvSetCurrRx0DescAddr(pDevice->PortOffset,
|
|
pDevice->rd0_pool_dma);
|
|
|
|
MACvSetCurrRx1DescAddr(pDevice->PortOffset,
|
|
pDevice->rd1_pool_dma);
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
* Description: Get response Control frame rate in CCK mode
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be set
|
|
* wRateIdx - Receiving data rate
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: response Control frame rate
|
|
*
|
|
*/
|
|
WORD CARDwGetCCKControlRate(void *pDeviceHandler, WORD wRateIdx)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
UINT ui = (UINT)wRateIdx;
|
|
|
|
while (ui > RATE_1M) {
|
|
if (pDevice->wBasicRate & ((WORD)1 << ui)) {
|
|
return (WORD)ui;
|
|
}
|
|
ui --;
|
|
}
|
|
return (WORD)RATE_1M;
|
|
}
|
|
|
|
/*
|
|
* Description: Get response Control frame rate in OFDM mode
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be set
|
|
* wRateIdx - Receiving data rate
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: response Control frame rate
|
|
*
|
|
*/
|
|
WORD CARDwGetOFDMControlRate (void *pDeviceHandler, WORD wRateIdx)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
UINT ui = (UINT)wRateIdx;
|
|
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BASIC RATE: %X\n", pDevice->wBasicRate);
|
|
|
|
if (!CARDbIsOFDMinBasicRate((void *)pDevice)) {
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"CARDwGetOFDMControlRate:(NO OFDM) %d\n", wRateIdx);
|
|
if (wRateIdx > RATE_24M)
|
|
wRateIdx = RATE_24M;
|
|
return wRateIdx;
|
|
}
|
|
while (ui > RATE_11M) {
|
|
if (pDevice->wBasicRate & ((WORD)1 << ui)) {
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"CARDwGetOFDMControlRate : %d\n", ui);
|
|
return (WORD)ui;
|
|
}
|
|
ui --;
|
|
}
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"CARDwGetOFDMControlRate: 6M\n");
|
|
return (WORD)RATE_24M;
|
|
}
|
|
|
|
|
|
/*
|
|
* Description: Set RSPINF
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be set
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: None.
|
|
*
|
|
*/
|
|
void CARDvSetRSPINF (void *pDeviceHandler, CARD_PHY_TYPE ePHYType)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
BYTE byServ = 0x00, bySignal = 0x00; //For CCK
|
|
WORD wLen = 0x0000;
|
|
BYTE byTxRate, byRsvTime; //For OFDM
|
|
|
|
//Set to Page1
|
|
MACvSelectPage1(pDevice->PortOffset);
|
|
|
|
//RSPINF_b_1
|
|
BBvCaculateParameter(pDevice,
|
|
14,
|
|
CARDwGetCCKControlRate((void *)pDevice, RATE_1M),
|
|
PK_TYPE_11B,
|
|
&wLen,
|
|
&byServ,
|
|
&bySignal
|
|
);
|
|
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_1, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ)));
|
|
///RSPINF_b_2
|
|
BBvCaculateParameter(pDevice,
|
|
14,
|
|
CARDwGetCCKControlRate((void *)pDevice, RATE_2M),
|
|
PK_TYPE_11B,
|
|
&wLen,
|
|
&byServ,
|
|
&bySignal
|
|
);
|
|
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_2, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ)));
|
|
//RSPINF_b_5
|
|
BBvCaculateParameter(pDevice,
|
|
14,
|
|
CARDwGetCCKControlRate((void *)pDevice, RATE_5M),
|
|
PK_TYPE_11B,
|
|
&wLen,
|
|
&byServ,
|
|
&bySignal
|
|
);
|
|
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_5, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ)));
|
|
//RSPINF_b_11
|
|
BBvCaculateParameter(pDevice,
|
|
14,
|
|
CARDwGetCCKControlRate((void *)pDevice, RATE_11M),
|
|
PK_TYPE_11B,
|
|
&wLen,
|
|
&byServ,
|
|
&bySignal
|
|
);
|
|
|
|
VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_11, MAKEDWORD(wLen,MAKEWORD(bySignal,byServ)));
|
|
//RSPINF_a_6
|
|
s_vCaculateOFDMRParameter(RATE_6M,
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_6, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_9
|
|
s_vCaculateOFDMRParameter(RATE_9M,
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_9, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_12
|
|
s_vCaculateOFDMRParameter(RATE_12M,
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_12, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_18
|
|
s_vCaculateOFDMRParameter(RATE_18M,
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_18, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_24
|
|
s_vCaculateOFDMRParameter(RATE_24M,
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_24, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_36
|
|
s_vCaculateOFDMRParameter(CARDwGetOFDMControlRate((void *)pDevice, RATE_36M),
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_36, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_48
|
|
s_vCaculateOFDMRParameter(CARDwGetOFDMControlRate((void *)pDevice, RATE_48M),
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_48, MAKEWORD(byTxRate,byRsvTime));
|
|
//RSPINF_a_54
|
|
s_vCaculateOFDMRParameter(CARDwGetOFDMControlRate((void *)pDevice, RATE_54M),
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_54, MAKEWORD(byTxRate,byRsvTime));
|
|
|
|
//RSPINF_a_72
|
|
s_vCaculateOFDMRParameter(CARDwGetOFDMControlRate((void *)pDevice, RATE_54M),
|
|
ePHYType,
|
|
&byTxRate,
|
|
&byRsvTime);
|
|
VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_72, MAKEWORD(byTxRate,byRsvTime));
|
|
//Set to Page0
|
|
MACvSelectPage0(pDevice->PortOffset);
|
|
}
|
|
|
|
/*
|
|
* Description: Update IFS
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be set
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: None.
|
|
*
|
|
*/
|
|
void vUpdateIFS (void *pDeviceHandler)
|
|
{
|
|
//Set SIFS, DIFS, EIFS, SlotTime, CwMin
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
|
|
BYTE byMaxMin = 0;
|
|
if (pDevice->byPacketType==PK_TYPE_11A) {//0000 0000 0000 0000,11a
|
|
pDevice->uSlot = C_SLOT_SHORT;
|
|
pDevice->uSIFS = C_SIFS_A;
|
|
pDevice->uDIFS = C_SIFS_A + 2*C_SLOT_SHORT;
|
|
pDevice->uCwMin = C_CWMIN_A;
|
|
byMaxMin = 4;
|
|
}
|
|
else if (pDevice->byPacketType==PK_TYPE_11B) {//0000 0001 0000 0000,11b
|
|
pDevice->uSlot = C_SLOT_LONG;
|
|
pDevice->uSIFS = C_SIFS_BG;
|
|
pDevice->uDIFS = C_SIFS_BG + 2*C_SLOT_LONG;
|
|
pDevice->uCwMin = C_CWMIN_B;
|
|
byMaxMin = 5;
|
|
}
|
|
else { // PK_TYPE_11GA & PK_TYPE_11GB
|
|
pDevice->uSIFS = C_SIFS_BG;
|
|
if (pDevice->bShortSlotTime) {
|
|
pDevice->uSlot = C_SLOT_SHORT;
|
|
} else {
|
|
pDevice->uSlot = C_SLOT_LONG;
|
|
}
|
|
pDevice->uDIFS = C_SIFS_BG + 2*pDevice->uSlot;
|
|
if (pDevice->wBasicRate & 0x0150) { //0000 0001 0101 0000,24M,12M,6M
|
|
pDevice->uCwMin = C_CWMIN_A;
|
|
byMaxMin = 4;
|
|
}
|
|
else {
|
|
pDevice->uCwMin = C_CWMIN_B;
|
|
byMaxMin = 5;
|
|
}
|
|
}
|
|
|
|
pDevice->uCwMax = C_CWMAX;
|
|
pDevice->uEIFS = C_EIFS;
|
|
if (pDevice->byRFType == RF_RFMD2959) {
|
|
// bcs TX_PE will reserve 3 us
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_SIFS, (BYTE)(pDevice->uSIFS - 3));
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_DIFS, (BYTE)(pDevice->uDIFS - 3));
|
|
} else {
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_SIFS, (BYTE)pDevice->uSIFS);
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_DIFS, (BYTE)pDevice->uDIFS);
|
|
}
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_EIFS, (BYTE)pDevice->uEIFS);
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_SLOT, (BYTE)pDevice->uSlot);
|
|
byMaxMin |= 0xA0;//1010 1111,C_CWMAX = 1023
|
|
VNSvOutPortB(pDevice->PortOffset + MAC_REG_CWMAXMIN0, (BYTE)byMaxMin);
|
|
}
|
|
|
|
void CARDvUpdateBasicTopRate (void *pDeviceHandler)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
BYTE byTopOFDM = RATE_24M, byTopCCK = RATE_1M;
|
|
BYTE ii;
|
|
|
|
//Determines the highest basic rate.
|
|
for (ii = RATE_54M; ii >= RATE_6M; ii --) {
|
|
if ( (pDevice->wBasicRate) & ((WORD)(1<<ii)) ) {
|
|
byTopOFDM = ii;
|
|
break;
|
|
}
|
|
}
|
|
pDevice->byTopOFDMBasicRate = byTopOFDM;
|
|
|
|
for (ii = RATE_11M;; ii --) {
|
|
if ( (pDevice->wBasicRate) & ((WORD)(1<<ii)) ) {
|
|
byTopCCK = ii;
|
|
break;
|
|
}
|
|
if (ii == RATE_1M)
|
|
break;
|
|
}
|
|
pDevice->byTopCCKBasicRate = byTopCCK;
|
|
}
|
|
|
|
|
|
/*
|
|
* Description: Set NIC Tx Basic Rate
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be set
|
|
* wBasicRate - Basic Rate to be set
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TRUE if succeeded; FALSE if failed.
|
|
*
|
|
*/
|
|
BOOL CARDbAddBasicRate (void *pDeviceHandler, WORD wRateIdx)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
WORD wRate = (WORD)(1<<wRateIdx);
|
|
|
|
pDevice->wBasicRate |= wRate;
|
|
|
|
//Determines the highest basic rate.
|
|
CARDvUpdateBasicTopRate((void *)pDevice);
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
BOOL CARDbIsOFDMinBasicRate (void *pDeviceHandler)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
int ii;
|
|
|
|
for (ii = RATE_54M; ii >= RATE_6M; ii --) {
|
|
if ((pDevice->wBasicRate) & ((WORD)(1<<ii)))
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BYTE CARDbyGetPktType (void *pDeviceHandler)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
|
|
if (pDevice->byBBType == BB_TYPE_11A || pDevice->byBBType == BB_TYPE_11B) {
|
|
return (BYTE)pDevice->byBBType;
|
|
}
|
|
else if (CARDbIsOFDMinBasicRate((void *)pDevice)) {
|
|
return PK_TYPE_11GA;
|
|
}
|
|
else {
|
|
return PK_TYPE_11GB;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Description: Set NIC Loopback mode
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be set
|
|
* wLoopbackMode - Loopback mode to be set
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none
|
|
*
|
|
*/
|
|
void CARDvSetLoopbackMode (DWORD_PTR dwIoBase, WORD wLoopbackMode)
|
|
{
|
|
switch(wLoopbackMode) {
|
|
case CARD_LB_NONE:
|
|
case CARD_LB_MAC:
|
|
case CARD_LB_PHY:
|
|
break;
|
|
default:
|
|
ASSERT(FALSE);
|
|
break;
|
|
}
|
|
// set MAC loopback
|
|
MACvSetLoopbackMode(dwIoBase, LOBYTE(wLoopbackMode));
|
|
// set Baseband loopback
|
|
}
|
|
|
|
|
|
/*
|
|
* Description: Software Reset NIC
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be reset
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none
|
|
*
|
|
*/
|
|
BOOL CARDbSoftwareReset (void *pDeviceHandler)
|
|
{
|
|
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
|
|
|
// reset MAC
|
|
if (!MACbSafeSoftwareReset(pDevice->PortOffset))
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
* Description: Caculate TSF offset of two TSF input
|
|
* Get TSF Offset from RxBCN's TSF and local TSF
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be sync.
|
|
* qwTSF1 - Rx BCN's TSF
|
|
* qwTSF2 - Local TSF
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: TSF Offset value
|
|
*
|
|
*/
|
|
QWORD CARDqGetTSFOffset (BYTE byRxRate, QWORD qwTSF1, QWORD qwTSF2)
|
|
{
|
|
QWORD qwTSFOffset;
|
|
WORD wRxBcnTSFOffst= 0;;
|
|
|
|
HIDWORD(qwTSFOffset) = 0;
|
|
LODWORD(qwTSFOffset) = 0;
|
|
wRxBcnTSFOffst = cwRXBCNTSFOff[byRxRate%MAX_RATE];
|
|
(qwTSF2).u.dwLowDword += (DWORD)(wRxBcnTSFOffst);
|
|
if ((qwTSF2).u.dwLowDword < (DWORD)(wRxBcnTSFOffst)) {
|
|
(qwTSF2).u.dwHighDword++;
|
|
}
|
|
LODWORD(qwTSFOffset) = LODWORD(qwTSF1) - LODWORD(qwTSF2);
|
|
if (LODWORD(qwTSF1) < LODWORD(qwTSF2)) {
|
|
// if borrow needed
|
|
HIDWORD(qwTSFOffset) = HIDWORD(qwTSF1) - HIDWORD(qwTSF2) - 1 ;
|
|
}
|
|
else {
|
|
HIDWORD(qwTSFOffset) = HIDWORD(qwTSF1) - HIDWORD(qwTSF2);
|
|
};
|
|
return (qwTSFOffset);
|
|
}
|
|
|
|
|
|
/*
|
|
* Description: Read NIC TSF counter
|
|
* Get local TSF counter
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be read
|
|
* Out:
|
|
* qwCurrTSF - Current TSF counter
|
|
*
|
|
* Return Value: TRUE if success; otherwise FALSE
|
|
*
|
|
*/
|
|
BOOL CARDbGetCurrentTSF (DWORD_PTR dwIoBase, PQWORD pqwCurrTSF)
|
|
{
|
|
WORD ww;
|
|
BYTE byData;
|
|
|
|
MACvRegBitsOn(dwIoBase, MAC_REG_TFTCTL, TFTCTL_TSFCNTRRD);
|
|
for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
|
|
VNSvInPortB(dwIoBase + MAC_REG_TFTCTL, &byData);
|
|
if ( !(byData & TFTCTL_TSFCNTRRD))
|
|
break;
|
|
}
|
|
if (ww == W_MAX_TIMEOUT)
|
|
return(FALSE);
|
|
VNSvInPortD(dwIoBase + MAC_REG_TSFCNTR, &LODWORD(*pqwCurrTSF));
|
|
VNSvInPortD(dwIoBase + MAC_REG_TSFCNTR + 4, &HIDWORD(*pqwCurrTSF));
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
/*
|
|
* Description: Read NIC TSF counter
|
|
* Get NEXTTBTT from adjusted TSF and Beacon Interval
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* qwTSF - Current TSF counter
|
|
* wbeaconInterval - Beacon Interval
|
|
* Out:
|
|
* qwCurrTSF - Current TSF counter
|
|
*
|
|
* Return Value: TSF value of next Beacon
|
|
*
|
|
*/
|
|
QWORD CARDqGetNextTBTT (QWORD qwTSF, WORD wBeaconInterval)
|
|
{
|
|
|
|
UINT uLowNextTBTT;
|
|
UINT uHighRemain, uLowRemain;
|
|
UINT uBeaconInterval;
|
|
|
|
uBeaconInterval = wBeaconInterval * 1024;
|
|
// Next TBTT = ((local_current_TSF / beacon_interval) + 1 ) * beacon_interval
|
|
uLowNextTBTT = (LODWORD(qwTSF) >> 10) << 10;
|
|
// low dword (mod) bcn
|
|
uLowRemain = (uLowNextTBTT) % uBeaconInterval;
|
|
// uHighRemain = ((0x80000000 % uBeaconInterval)* 2 * HIDWORD(qwTSF))
|
|
// % uBeaconInterval;
|
|
// high dword (mod) bcn
|
|
uHighRemain = (((0xffffffff % uBeaconInterval) + 1) * HIDWORD(qwTSF))
|
|
% uBeaconInterval;
|
|
uLowRemain = (uHighRemain + uLowRemain) % uBeaconInterval;
|
|
uLowRemain = uBeaconInterval - uLowRemain;
|
|
|
|
// check if carry when add one beacon interval
|
|
if ((~uLowNextTBTT) < uLowRemain)
|
|
HIDWORD(qwTSF) ++ ;
|
|
|
|
LODWORD(qwTSF) = uLowNextTBTT + uLowRemain;
|
|
|
|
return (qwTSF);
|
|
}
|
|
|
|
|
|
/*
|
|
* Description: Set NIC TSF counter for first Beacon time
|
|
* Get NEXTTBTT from adjusted TSF and Beacon Interval
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* dwIoBase - IO Base
|
|
* wBeaconInterval - Beacon Interval
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none
|
|
*
|
|
*/
|
|
void CARDvSetFirstNextTBTT (DWORD_PTR dwIoBase, WORD wBeaconInterval)
|
|
{
|
|
|
|
QWORD qwNextTBTT;
|
|
|
|
HIDWORD(qwNextTBTT) = 0;
|
|
LODWORD(qwNextTBTT) = 0;
|
|
CARDbGetCurrentTSF(dwIoBase, &qwNextTBTT); //Get Local TSF counter
|
|
qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval);
|
|
// Set NextTBTT
|
|
VNSvOutPortD(dwIoBase + MAC_REG_NEXTTBTT, LODWORD(qwNextTBTT));
|
|
VNSvOutPortD(dwIoBase + MAC_REG_NEXTTBTT + 4, HIDWORD(qwNextTBTT));
|
|
MACvRegBitsOn(dwIoBase, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN);
|
|
//DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Card:First Next TBTT[%8xh:%8xh] \n", HIDWORD(qwNextTBTT), LODWORD(qwNextTBTT));
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
* Description: Sync NIC TSF counter for Beacon time
|
|
* Get NEXTTBTT and write to HW
|
|
*
|
|
* Parameters:
|
|
* In:
|
|
* pDevice - The adapter to be set
|
|
* qwTSF - Current TSF counter
|
|
* wBeaconInterval - Beacon Interval
|
|
* Out:
|
|
* none
|
|
*
|
|
* Return Value: none
|
|
*
|
|
*/
|
|
void CARDvUpdateNextTBTT (DWORD_PTR dwIoBase, QWORD qwTSF, WORD wBeaconInterval)
|
|
{
|
|
|
|
qwTSF = CARDqGetNextTBTT(qwTSF, wBeaconInterval);
|
|
// Set NextTBTT
|
|
VNSvOutPortD(dwIoBase + MAC_REG_NEXTTBTT, LODWORD(qwTSF));
|
|
VNSvOutPortD(dwIoBase + MAC_REG_NEXTTBTT + 4, HIDWORD(qwTSF));
|
|
MACvRegBitsOn(dwIoBase, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN);
|
|
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Card:Update Next TBTT[%8xh:%8xh] \n",(UINT)HIDWORD(qwTSF), (UINT)LODWORD(qwTSF));
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|