/*
 * 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: device.h
 *
 * Purpose: MAC Data structure
 *
 * Author: Tevin Chen
 *
 * Date: Mar 17, 1997
 *
 */

#ifndef __DEVICE_H__
#define __DEVICE_H__

#include <linux/module.h>
#include <linux/types.h>
#include <linux/mm.h>
#include <linux/errno.h>
#include <linux/ioport.h>
#include <linux/pci.h>
#include <linux/kernel.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/delay.h>
#include <linux/timer.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/string.h>
#include <linux/wait.h>
#include <linux/if_arp.h>
#include <linux/sched.h>
#include <linux/io.h>
#include <linux/if.h>
#include <linux/crc32.h>
#include <linux/uaccess.h>
#include <linux/proc_fs.h>
#include <linux/inetdevice.h>
#include <linux/reboot.h>
#include <linux/ethtool.h>
/* Include Wireless Extension definition and check version - Jean II */
#include <net/mac80211.h>
#include <linux/wireless.h>
#include <net/iw_handler.h>	/* New driver API */

#ifndef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
#define WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
#endif

/* device specific */

#include "device_cfg.h"
#include "ttype.h"
#include "80211hdr.h"
#include "tether.h"
#include "wmgr.h"
#include "wcmd.h"
#include "mib.h"
#include "srom.h"
#include "rc4.h"
#include "desc.h"
#include "key.h"
#include "mac.h"

/*---------------------  Export Definitions -------------------------*/

#define MAC_MAX_CONTEXT_REG     (256+128)

#define MAX_MULTICAST_ADDRESS_NUM       32
#define MULTICAST_ADDRESS_LIST_SIZE     (MAX_MULTICAST_ADDRESS_NUM * ETH_ALEN)

#define DUPLICATE_RX_CACHE_LENGTH       5

#define NUM_KEY_ENTRY                   11

#define TX_WEP_NONE                     0
#define TX_WEP_OTF                      1
#define TX_WEP_SW                       2
#define TX_WEP_SWOTP                    3
#define TX_WEP_OTPSW                    4
#define TX_WEP_SW232                    5

#define KEYSEL_WEP40                    0
#define KEYSEL_WEP104                   1
#define KEYSEL_TKIP                     2
#define KEYSEL_CCMP                     3

#define AUTO_FB_NONE            0
#define AUTO_FB_0               1
#define AUTO_FB_1               2

#define FB_RATE0                0
#define FB_RATE1                1

/* Antenna Mode */
#define ANT_A                   0
#define ANT_B                   1
#define ANT_DIVERSITY           2
#define ANT_RXD_TXA             3
#define ANT_RXD_TXB             4
#define ANT_UNKNOWN             0xFF

#define MAXCHECKHANGCNT         4

#define BB_VGA_LEVEL            4
#define BB_VGA_CHANGE_THRESHOLD 16

#ifndef RUN_AT
#define RUN_AT(x)                       (jiffies+(x))
#endif

/* DMA related */
#define RESERV_AC0DMA                   4

/* BUILD OBJ mode */

#define	AVAIL_TD(p, q)	((p)->sOpts.nTxDescs[(q)] - ((p)->iTDUsed[(q)]))

#define	NUM				64

#define PRIVATE_Message                 0

/*---------------------  Export Types  ------------------------------*/

#define PRINT_K(p, args...)		\
do {					\
	if (PRIVATE_Message)		\
		printk(p, ##args);	\
} while (0)

/* 0:11A 1:11B 2:11G */
typedef enum _VIA_BB_TYPE
{
	BB_TYPE_11A = 0,
	BB_TYPE_11B,
	BB_TYPE_11G
} VIA_BB_TYPE, *PVIA_BB_TYPE;

/* 0:11a,1:11b,2:11gb(only CCK in BasicRate),3:11ga(OFDM in Basic Rate) */
typedef enum _VIA_PKT_TYPE
{
	PK_TYPE_11A = 0,
	PK_TYPE_11B,
	PK_TYPE_11GB,
	PK_TYPE_11GA
} VIA_PKT_TYPE, *PVIA_PKT_TYPE;

typedef enum __device_msg_level {
	MSG_LEVEL_ERR = 0,	/* Errors that will cause abnormal operation. */
	MSG_LEVEL_NOTICE = 1,	/* Some errors need users to be notified. */
	MSG_LEVEL_INFO = 2,	/* Normal message. */
	MSG_LEVEL_VERBOSE = 3,	/* Will report all trival errors. */
	MSG_LEVEL_DEBUG = 4	/* Only for debug purpose. */
} DEVICE_MSG_LEVEL, *PDEVICE_MSG_LEVEL;

/* NDIS related */
#define MAX_BSSIDINFO_4_PMKID   16
#define MAX_PMKIDLIST           5
/* Flags for PMKID Candidate list structure */
#define NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED	0x01

/* PMKID Structures */
typedef unsigned char NDIS_802_11_PMKID_VALUE[16];

typedef enum _NDIS_802_11_WEP_STATUS {
	Ndis802_11WEPEnabled,
	Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
	Ndis802_11WEPDisabled,
	Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,
	Ndis802_11WEPKeyAbsent,
	Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,
	Ndis802_11WEPNotSupported,
	Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,
	Ndis802_11Encryption2Enabled,
	Ndis802_11Encryption2KeyAbsent,
	Ndis802_11Encryption3Enabled,
	Ndis802_11Encryption3KeyAbsent
} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS,
	NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS;

typedef enum _NDIS_802_11_STATUS_TYPE {
	Ndis802_11StatusType_Authentication,
	Ndis802_11StatusType_MediaStreamMode,
	Ndis802_11StatusType_PMKID_CandidateList,
	Ndis802_11StatusTypeMax    /* defined as an upper bound */
} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE;

/* Added new types for PMKID Candidate lists. */
struct pmkid_candidate {
	NDIS_802_11_MAC_ADDRESS BSSID;
	unsigned long Flags;
};

typedef struct _BSSID_INFO {
	NDIS_802_11_MAC_ADDRESS BSSID;
	NDIS_802_11_PMKID_VALUE PMKID;
} BSSID_INFO, *PBSSID_INFO;

typedef struct tagSPMKID {
	unsigned long Length;
	unsigned long BSSIDInfoCount;
	BSSID_INFO BSSIDInfo[MAX_BSSIDINFO_4_PMKID];
} SPMKID, *PSPMKID;

typedef struct tagSPMKIDCandidateEvent {
	NDIS_802_11_STATUS_TYPE     StatusType;
	unsigned long Version;       /* Version of the structure */
	unsigned long NumCandidates; /* No. of pmkid candidates */
	struct pmkid_candidate CandidateList[MAX_PMKIDLIST];
} SPMKIDCandidateEvent, *PSPMKIDCandidateEvent;

/* 802.11h related */
#define MAX_QUIET_COUNT     8

typedef struct tagSQuietControl {
	bool bEnable;
	unsigned long dwStartTime;
	unsigned char byPeriod;
	unsigned short wDuration;
} SQuietControl, *PSQuietControl;

typedef struct __chip_info_tbl {
	CHIP_TYPE   chip_id;
	char *name;
	int         io_size;
	int         nTxQueue;
	u32         flags;
} CHIP_INFO, *PCHIP_INFO;

typedef enum {
	OWNED_BY_HOST = 0,
	OWNED_BY_NIC = 1
} DEVICE_OWNER_TYPE, *PDEVICE_OWNER_TYPE;

/* The receive duplicate detection cache entry */
typedef struct tagSCacheEntry {
	unsigned short wFmSequence;
	unsigned char abyAddr2[ETH_ALEN];
} SCacheEntry, *PSCacheEntry;

typedef struct tagSCache {
/* The receive cache is updated circularly. The next entry to be written is
 * indexed by the "InPtr".
 */
	unsigned int uInPtr;         /* Place to use next */
	SCacheEntry     asCacheEntry[DUPLICATE_RX_CACHE_LENGTH];
} SCache, *PSCache;

#define CB_MAX_RX_FRAG                 64
/* DeFragment Control Block, used for collecting fragments prior to reassembly */
typedef struct tagSDeFragControlBlock {
	unsigned short wSequence;
	unsigned short wFragNum;
	unsigned char abyAddr2[ETH_ALEN];
	unsigned int uLifetime;
	struct sk_buff *skb;
	unsigned char *pbyRxBuffer;
	unsigned int cbFrameLength;
	bool bInUse;
} SDeFragControlBlock, *PSDeFragControlBlock;

/* flags for options */
#define     DEVICE_FLAGS_IP_ALIGN        0x00000001UL
#define     DEVICE_FLAGS_PREAMBLE_TYPE   0x00000002UL
#define     DEVICE_FLAGS_OP_MODE         0x00000004UL
#define     DEVICE_FLAGS_PS_MODE         0x00000008UL
#define		DEVICE_FLAGS_80211h_MODE	 0x00000010UL
#define		DEVICE_FLAGS_DiversityANT	 0x00000020UL

/* flags for driver status */
#define     DEVICE_FLAGS_OPENED          0x00010000UL
#define     DEVICE_FLAGS_WOL_ENABLED     0x00080000UL
/* flags for capabilities */
#define     DEVICE_FLAGS_TX_ALIGN        0x01000000UL
#define     DEVICE_FLAGS_HAVE_CAM        0x02000000UL
#define     DEVICE_FLAGS_FLOW_CTRL       0x04000000UL

/* flags for MII status */
#define     DEVICE_LINK_FAIL             0x00000001UL
#define     DEVICE_SPEED_10              0x00000002UL
#define     DEVICE_SPEED_100             0x00000004UL
#define     DEVICE_SPEED_1000            0x00000008UL
#define     DEVICE_DUPLEX_FULL           0x00000010UL
#define     DEVICE_AUTONEG_ENABLE        0x00000020UL
#define     DEVICE_FORCED_BY_EEPROM      0x00000040UL
/* for device_set_media_duplex */
#define     DEVICE_LINK_CHANGE           0x00000001UL

typedef struct __device_opt {
	int         nRxDescs0;		/* Number of RX descriptors0 */
	int         nRxDescs1;		/* Number of RX descriptors1 */
	int         nTxDescs[2];	/* Number of TX descriptors 0, 1 */
	int         int_works;		/* interrupt limits */
	int         rts_thresh;		/* rts threshold */
	int         frag_thresh;
	int         data_rate;
	int         channel_num;
	int         short_retry;
	int         long_retry;
	int         bbp_type;
	u32         flags;
} OPTIONS, *POPTIONS;

struct vnt_private {
	struct pci_dev *pcid;
	/* mac80211 */
	struct ieee80211_hw *hw;
	struct ieee80211_vif *vif;
	unsigned long key_entry_inuse;
	u32 basic_rates;
	u16 current_aid;
	int mc_list_count;
	u8 mac_hw;
/* netdev */
	struct net_device *dev;

/* dma addr, rx/tx pool */
	dma_addr_t                  pool_dma;
	dma_addr_t                  rd0_pool_dma;
	dma_addr_t                  rd1_pool_dma;

	dma_addr_t                  td0_pool_dma;
	dma_addr_t                  td1_pool_dma;

	dma_addr_t                  tx_bufs_dma0;
	dma_addr_t                  tx_bufs_dma1;
	dma_addr_t                  tx_beacon_dma;

	unsigned char *tx0_bufs;
	unsigned char *tx1_bufs;
	unsigned char *tx_beacon_bufs;

	CHIP_TYPE                   chip_id;

	void __iomem                *PortOffset;
	unsigned long dwIsr;
	u32                         memaddr;
	u32                         ioaddr;
	u32                         io_size;

	unsigned char byRevId;
	unsigned char byRxMode;
	unsigned short SubSystemID;
	unsigned short SubVendorID;

	spinlock_t                  lock;

	int                         nTxQueues;
	volatile int                iTDUsed[TYPE_MAXTD];

	volatile PSTxDesc           apCurrTD[TYPE_MAXTD];
	volatile PSTxDesc           apTailTD[TYPE_MAXTD];

	volatile PSTxDesc           apTD0Rings;
	volatile PSTxDesc           apTD1Rings;

	volatile PSRxDesc           aRD0Ring;
	volatile PSRxDesc           aRD1Ring;
	volatile PSRxDesc           pCurrRD[TYPE_MAXRD];
	SCache                      sDupRxCache;

	SDeFragControlBlock         sRxDFCB[CB_MAX_RX_FRAG];
	unsigned int	cbDFCB;
	unsigned int	cbFreeDFCB;
	unsigned int	uCurrentDFCBIdx;

	OPTIONS                     sOpts;

	u32                         flags;

	u32                         rx_buf_sz;
	u8 rx_rate;
	int                         multicast_limit;

	pid_t			MLMEThr_pid;
	struct completion	notify;
	struct semaphore	mlme_semaphore;

	u32                         rx_bytes;

	/* Version control */
	unsigned char byLocalID;
	unsigned char byRFType;

	unsigned char byMaxPwrLevel;
	unsigned char byZoneType;
	bool bZoneRegExist;
	unsigned char byOriginalZonetype;
	unsigned char abyMacContext[MAC_MAX_CONTEXT_REG];
	unsigned char abyCurrentNetAddr[ETH_ALEN];
	bool bLinkPass;          /* link status: OK or fail */

	/* Adapter statistics */
	SStatCounter                scStatistic;
	/* 802.11 counter */
	SDot11Counters              s802_11Counter;

	/* 802.11 management */
	PSMgmtObject                pMgmt;
	SMgmtObject                 sMgmtObj;

	/* 802.11 MAC specific */
	unsigned int	uCurrRSSI;
	unsigned char byCurrSQ;

	unsigned long dwTxAntennaSel;
	unsigned long dwRxAntennaSel;
	unsigned char byAntennaCount;
	unsigned char byRxAntennaMode;
	unsigned char byTxAntennaMode;
	bool bTxRxAntInv;

	unsigned char *pbyTmpBuff;
	unsigned int	uSIFS;    /* Current SIFS */
	unsigned int	uDIFS;    /* Current DIFS */
	unsigned int	uEIFS;    /* Current EIFS */
	unsigned int	uSlot;    /* Current SlotTime */
	unsigned int	uCwMin;   /* Current CwMin */
	unsigned int	uCwMax;   /* CwMax is fixed on 1023. */
	/* PHY parameter */
	unsigned char bySIFS;
	unsigned char byDIFS;
	unsigned char byEIFS;
	unsigned char bySlot;
	unsigned char byCWMaxMin;
	CARD_PHY_TYPE		eCurrentPHYType;

	VIA_BB_TYPE		byBBType; /* 0:11A, 1:11B, 2:11G */
	VIA_PKT_TYPE            byPacketType; /*
					       * 0:11a,1:11b,2:11gb (only CCK
					       * in BasicRate), 3:11ga (OFDM in
					       * Basic Rate)
					       */
	unsigned short wBasicRate;
	unsigned char byACKRate;
	unsigned char byTopOFDMBasicRate;
	unsigned char byTopCCKBasicRate;

	unsigned char byMinChannel;
	unsigned char byMaxChannel;
	unsigned int	uConnectionRate;

	unsigned char byPreambleType;
	unsigned char byShortPreamble;

	unsigned short wCurrentRate;
	unsigned short wRTSThreshold;
	unsigned short wFragmentationThreshold;
	unsigned char byShortRetryLimit;
	unsigned char byLongRetryLimit;
	enum nl80211_iftype op_mode;
	unsigned char byOpMode;
	bool bBSSIDFilter;
	unsigned short wMaxTransmitMSDULifetime;
	unsigned char abyBSSID[ETH_ALEN];
	unsigned char abyDesireBSSID[ETH_ALEN];
	unsigned short wACKDuration;		/* update while speed change */
	unsigned short wRTSTransmitLen;		/* update while speed change */
	unsigned char byRTSServiceField;	/* update while speed change */
	unsigned char byRTSSignalField;		/* update while speed change */

	unsigned long dwMaxReceiveLifetime;	/* dot11MaxReceiveLifetime */

	bool bEncryptionEnable;
	bool bLongHeader;
	bool bShortSlotTime;
	bool bProtectMode;
	bool bNonERPPresent;
	bool bBarkerPreambleMd;

	unsigned char byERPFlag;
	unsigned short wUseProtectCntDown;

	bool bRadioControlOff;
	bool bRadioOff;
	bool bEnablePSMode;
	unsigned short wListenInterval;
	bool bPWBitOn;
	WMAC_POWER_MODE         ePSMode;

	/* GPIO Radio Control */
	unsigned char byRadioCtl;
	unsigned char byGPIO;
	bool bHWRadioOff;
	bool bPrvActive4RadioOFF;
	bool bGPIOBlockRead;

	/* Beacon related */
	unsigned short wSeqCounter;
	unsigned short wBCNBufLen;
	bool bBeaconBufReady;
	bool bBeaconSent;
	bool bIsBeaconBufReadySet;
	unsigned int	cbBeaconBufReadySetCnt;
	bool bFixRate;
	unsigned char byCurrentCh;
	unsigned int	uScanTime;

	CMD_STATE               eCommandState;

	CMD_CODE                eCommand;
	bool bBeaconTx;

	bool bStopBeacon;
	bool bStopDataPkt;
	bool bStopTx0Pkt;
	unsigned int	uAutoReConnectTime;

	/* 802.11 counter */

	CMD_ITEM                eCmdQueue[CMD_Q_SIZE];
	unsigned int	uCmdDequeueIdx;
	unsigned int	uCmdEnqueueIdx;
	unsigned int	cbFreeCmdQueue;
	bool bCmdRunning;
	bool bCmdClear;

	bool bRoaming;
	unsigned char abyIPAddr[4];

	unsigned long ulTxPower;
	NDIS_802_11_WEP_STATUS  eEncryptionStatus;
	bool bTransmitKey;
	NDIS_802_11_WEP_STATUS  eOldEncryptionStatus;

	SKeyManagement          sKey;
	unsigned long dwIVCounter;

	u64 qwPacketNumber; /* For CCMP and TKIP as TSC(6 bytes) */
	unsigned int	uCurrentWEPMode;

	RC4Ext                  SBox;
	unsigned char abyPRNG[WLAN_WEPMAX_KEYLEN+3];
	unsigned char byKeyIndex;
	unsigned int	uKeyLength;
	unsigned char abyKey[WLAN_WEP232_KEYLEN];

	bool bAES;
	unsigned char byCntMeasure;

	/* for AP mode */
	unsigned int	uAssocCount;
	bool bMoreData;

	/* QoS */
	bool bGrpAckPolicy;

	/* for OID_802_11_ASSOCIATION_INFORMATION */
	bool bAssocInfoSet;

	unsigned char byAutoFBCtrl;

	bool bTxMICFail;
	bool bRxMICFail;

	unsigned int	uRATEIdx;

	/* For Update BaseBand VGA Gain Offset */
	bool bUpdateBBVGA;
	unsigned int	uBBVGADiffCount;
	unsigned char byBBVGANew;
	unsigned char byBBVGACurrent;
	unsigned char abyBBVGA[BB_VGA_LEVEL];
	long                    ldBmThreshold[BB_VGA_LEVEL];

	unsigned char byBBPreEDRSSI;
	unsigned char byBBPreEDIndex;

	bool bRadioCmd;
	unsigned long dwDiagRefCount;

	/* For FOE Tuning */
	unsigned char byFOETuning;

	/* For Auto Power Tunning */
	unsigned char byAutoPwrTunning;
	short                   sPSetPointCCK;
	short                   sPSetPointOFDMG;
	short                   sPSetPointOFDMA;
	long                    lPFormulaOffset;
	short                   sPThreshold;
	char                    cAdjustStep;
	char                    cMinTxAGC;

	/* For RF Power table */
	unsigned char byCCKPwr;
	unsigned char byOFDMPwrG;
	unsigned char byCurPwr;
	char	 byCurPwrdBm;
	unsigned char abyCCKPwrTbl[CB_MAX_CHANNEL_24G+1];
	unsigned char abyOFDMPwrTbl[CB_MAX_CHANNEL+1];
	char	abyCCKDefaultPwr[CB_MAX_CHANNEL_24G+1];
	char	abyOFDMDefaultPwr[CB_MAX_CHANNEL+1];
	char	abyRegPwr[CB_MAX_CHANNEL+1];
	char	abyLocalPwr[CB_MAX_CHANNEL+1];

	/* BaseBand Loopback Use */
	unsigned char byBBCR4d;
	unsigned char byBBCRc9;
	unsigned char byBBCR88;
	unsigned char byBBCR09;

	/* command timer */
	struct timer_list       sTimerCommand;
	struct timer_list       sTimerTxData;
	unsigned long nTxDataTimeCout;
	bool fTxDataInSleep;
	bool IsTxDataTrigger;

#ifdef WPA_SM_Transtatus
	bool fWPA_Authened;     /* is WPA/WPA-PSK or WPA2/WPA2-PSK authen?? */
#endif
	unsigned char byReAssocCount;
	unsigned char byLinkWaitCount;

	unsigned char abyNodeName[17];

	bool bDiversityRegCtlON;
	bool bDiversityEnable;
	unsigned long ulDiversityNValue;
	unsigned long ulDiversityMValue;
	unsigned char byTMax;
	unsigned char byTMax2;
	unsigned char byTMax3;
	unsigned long ulSQ3TH;

	/* ANT diversity */
	unsigned long uDiversityCnt;
	unsigned char byAntennaState;
	unsigned long ulRatio_State0;
	unsigned long ulRatio_State1;

	/* SQ3 functions for antenna diversity */
	struct timer_list           TimerSQ3Tmax1;
	struct timer_list           TimerSQ3Tmax2;
	struct timer_list           TimerSQ3Tmax3;

	unsigned long uNumSQ3[MAX_RATE];
	unsigned short wAntDiversityMaxRate;

	SEthernetHeader         sTxEthHeader;
	SEthernetHeader         sRxEthHeader;
	unsigned char abyBroadcastAddr[ETH_ALEN];
	unsigned char abySNAP_RFC1042[ETH_ALEN];
	unsigned char abySNAP_Bridgetunnel[ETH_ALEN];
	unsigned char abyEEPROM[EEP_MAX_CONTEXT_SIZE]; /* unsigned long alignment */
	/* Pre-Authentication & PMK cache */
	SPMKID                  gsPMKID;
	SPMKIDCandidateEvent    gsPMKIDCandidate;

	/* for 802.11h */
	bool b11hEnable;
	unsigned char abyCountryCode[3];
	/* for 802.11h DFS */
	unsigned int	uNumOfMeasureEIDs;
	PWLAN_IE_MEASURE_REQ    pCurrMeasureEID;
	bool bMeasureInProgress;
	unsigned char byOrgChannel;
	unsigned char byOrgRCR;
	unsigned long dwOrgMAR0;
	unsigned long dwOrgMAR4;
	unsigned char byBasicMap;
	unsigned char byCCAFraction;
	unsigned char abyRPIs[8];
	unsigned long dwRPIs[8];
	bool bChannelSwitch;
	unsigned char byNewChannel;
	unsigned char byChannelSwitchCount;
	bool bQuietEnable;
	bool bEnableFirstQuiet;
	unsigned char byQuietStartCount;
	unsigned int	uQuietEnqueue;
	unsigned long dwCurrentQuietEndTime;
	SQuietControl           sQuiet[MAX_QUIET_COUNT];
	/* for 802.11h TPC */
	bool bCountryInfo5G;
	bool bCountryInfo24G;

	unsigned short wBeaconInterval;

	/* WPA supplicant deamon */
	struct net_device       *wpadev;
	bool bWPADEVUp;
	struct sk_buff          *skb;
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
	unsigned int	bwextcount;
	bool bWPASuppWextEnabled;
#endif

#ifdef HOSTAP
	/* user space daemon: hostapd, is used for HOSTAP */
	bool bEnableHostapd;
	bool bEnable8021x;
	bool bEnableHostWEP;
	struct net_device       *apdev;
	int (*tx_80211)(struct sk_buff *skb, struct net_device *dev);
#endif
	unsigned int	uChannel;
	bool bMACSuspend;

	struct iw_statistics	wstats;		/* wireless stats */
	bool bCommit;
};

static inline bool device_get_ip(struct vnt_private *pInfo)
{
	struct in_device *in_dev = (struct in_device *)pInfo->dev->ip_ptr;
	struct in_ifaddr *ifa;

	if (in_dev != NULL) {
		ifa = (struct in_ifaddr *)in_dev->ifa_list;
		if (ifa != NULL) {
			memcpy(pInfo->abyIPAddr, &ifa->ifa_address, 4);
			return true;
		}
	}
	return false;
}

static inline PDEVICE_RD_INFO alloc_rd_info(void)
{
	return kzalloc(sizeof(DEVICE_RD_INFO), GFP_ATOMIC);
}

static inline PDEVICE_TD_INFO alloc_td_info(void)
{
	return kzalloc(sizeof(DEVICE_TD_INFO), GFP_ATOMIC);
}

/*---------------------  Export Functions  --------------------------*/

bool device_dma0_xmit(struct vnt_private *pDevice,
		      struct sk_buff *skb, unsigned int uNodeIndex);
bool device_alloc_frag_buf(struct vnt_private *pDevice,
			   PSDeFragControlBlock pDeF);
int Config_FileOperation(struct vnt_private *pDevice,
			 bool fwrite, unsigned char *Parameter);
#endif
