/*
 * 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/init.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/config.h>
#include <linux/uaccess.h>
#include <linux/proc_fs.h>
#include <linux/inetdevice.h>
#include <linux/reboot.h>
#ifdef SIOCETHTOOL
#define DEVICE_ETHTOOL_IOCTL_SUPPORT
#include <linux/ethtool.h>
#else
#undef DEVICE_ETHTOOL_IOCTL_SUPPORT
#endif
/* Include Wireless Extension definition and check version - Jean II */
#include <linux/wireless.h>
#include <net/iw_handler.h>	// New driver API

//2008-0409-07, <Add> by Einsn Liu
#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)]))

//PLICE_DEBUG ->
#define	NUM				64
//PLICE_DEUBG <-

#define PRIVATE_Message                 0

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

#define DBG_PRT(l, p, args...) { if (l <= msglevel) printk(p, ##args); }
#define PRINT_K(p, args...) { if (PRIVATE_Message) printk(p, ##args); }

//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;

typedef enum __device_init_type {
	DEVICE_INIT_COLD = 0,         // cold init
	DEVICE_INIT_RESET,          // reset init or Dx to D0 power remain init
	DEVICE_INIT_DXPL            // Dx to D0 power lost init
} DEVICE_INIT_TYPE, *PDEVICE_INIT_TYPE;

//++ 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    // not a real type, defined as an upper bound
} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE;

//Added new types for PMKID Candidate lists.
typedef struct _PMKID_CANDIDATE {
	NDIS_802_11_MAC_ADDRESS BSSID;
	unsigned long Flags;
} PMKID_CANDIDATE, *PPMKID_CANDIDATE;

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
	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

//PLICE_DEBUG->

typedef	struct _RxManagementQueue
{
	int	packet_num;
	int	head, tail;
	PSRxMgmtPacket	Q[NUM];
} RxManagementQueue, *PSRxManagementQueue;

//PLICE_DEBUG<-

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;

typedef struct __device_info {
	struct __device_info *next;
	struct __device_info *prev;

	struct pci_dev *pcid;

#ifdef CONFIG_PM
	u32                         pci_state[16];
#endif

// netdev
	struct net_device *dev;
	struct net_device *next_module;
	struct net_device_stats     stats;

//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;

	unsigned long               PortOffset;
	unsigned long dwIsr;
	u32                         memaddr;
	u32                         ioaddr;
	u32                         io_size;

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

	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;
	int                         multicast_limit;
	unsigned char byRxMode;

	spinlock_t                  lock;
//PLICE_DEBUG->
	struct	tasklet_struct	RxMngWorkItem;
	RxManagementQueue	rxManeQueue;
//PLICE_DEBUG<-
//PLICE_DEBUG ->
	pid_t			MLMEThr_pid;
	struct completion	notify;
	struct semaphore	mlme_semaphore;
//PLICE_DEBUG <-

	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];
	bool bLinkPass;          // link status: OK or fail
	unsigned char abyCurrentNetAddr[ETH_ALEN];

	// 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;
	CARD_OP_MODE                eOPMode;
	unsigned char byOpMode;
	bool bBSSIDFilter;
	unsigned short wMaxTransmitMSDULifetime;
	unsigned char abyBSSID[ETH_ALEN];
	unsigned char abyDesireBSSID[ETH_ALEN];
	unsigned short wCTSDuration;       // update while speed change
	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 bCCK;
	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;
	//WOW
	unsigned char abyIPAddr[4];

	unsigned long ulTxPower;
	NDIS_802_11_WEP_STATUS  eEncryptionStatus;
	bool bTransmitKey;
//2007-0925-01<Add>by MikeLiu
//mike add :save old Encryption
	NDIS_802_11_WEP_STATUS  eOldEncryptionStatus;

	SKeyManagement          sKey;
	unsigned long dwIVCounter;

	QWORD                   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;
#ifdef TxInSleep
	struct timer_list       sTimerTxData;
	unsigned long nTxDataTimeCout;
	bool fTxDataInSleep;
	bool IsTxDataTrigger;
#endif

#ifdef WPA_SM_Transtatus
	bool fWPA_Authened;           //is WPA/WPA-PSK or WPA2/WPA2-PSK authen??
#endif
	unsigned char byReAssocCount;   //mike add:re-association retry times!
	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
/*
  bool bwextstep0;
  bool bwextstep1;
  bool bwextstep2;
  bool bwextstep3;
*/
	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;
} DEVICE_INFO, *PSDevice;

//PLICE_DEBUG->

inline  static	void   EnQueue(PSDevice pDevice, PSRxMgmtPacket  pRxMgmtPacket)
{
	if ((pDevice->rxManeQueue.tail+1) % NUM == pDevice->rxManeQueue.head) {
		return;
	} else {
		pDevice->rxManeQueue.tail = (pDevice->rxManeQueue.tail + 1) % NUM;
		pDevice->rxManeQueue.Q[pDevice->rxManeQueue.tail] = pRxMgmtPacket;
		pDevice->rxManeQueue.packet_num++;
	}
}

inline  static  PSRxMgmtPacket DeQueue(PSDevice pDevice)
{
	PSRxMgmtPacket  pRxMgmtPacket;
	if (pDevice->rxManeQueue.tail == pDevice->rxManeQueue.head) {
		printk("Queue is Empty\n");
		return NULL;
	} else {
		int	x;
		//x=pDevice->rxManeQueue.head = (pDevice->rxManeQueue.head+1)%NUM;
		pDevice->rxManeQueue.head = (pDevice->rxManeQueue.head+1)%NUM;
		x = pDevice->rxManeQueue.head;
		pRxMgmtPacket = pDevice->rxManeQueue.Q[x];
		pDevice->rxManeQueue.packet_num--;
		return pRxMgmtPacket;
	}
}

void	InitRxManagementQueue(PSDevice   pDevice);

//PLICE_DEBUG<-

inline static bool device_get_ip(PSDevice 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(PSDevice pDevice, struct sk_buff *skb, unsigned int uNodeIndex);
bool device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF);
int Config_FileOperation(PSDevice pDevice, bool fwrite, unsigned char *Parameter);
#endif
