/*
 * 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)
{
	//printk("Enter EnQueue:tail is %d\n",pDevice->rxManeQueue.tail);
	if ((pDevice->rxManeQueue.tail+1) % NUM == pDevice->rxManeQueue.head)
	{
		//printk("Queue is Full,tail is %d\n",pDevice->rxManeQueue.tail);
		return ;
	}
	else
	{
		pDevice->rxManeQueue.tail = (pDevice->rxManeQueue.tail+1)% NUM;
		pDevice->rxManeQueue.Q[pDevice->rxManeQueue.tail] = pRxMgmtPacket;
		pDevice->rxManeQueue.packet_num++;
		//printk("packet num is %d\n",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;
		//printk("Enter DeQueue:head is %d\n",x);
		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) {
    PDEVICE_RD_INFO  ptr;
    ptr = (PDEVICE_RD_INFO)kmalloc((int)sizeof(DEVICE_RD_INFO), (int)GFP_ATOMIC);
    if (ptr == NULL)
        return NULL;
    else {
        memset(ptr,0,sizeof(DEVICE_RD_INFO));
        return ptr;
    }
}

static inline PDEVICE_TD_INFO alloc_td_info(void) {
    PDEVICE_TD_INFO  ptr;
    ptr = (PDEVICE_TD_INFO)kmalloc((int)sizeof(DEVICE_TD_INFO), (int)GFP_ATOMIC);
    if (ptr == NULL)
        return NULL;
    else {
        memset(ptr,0,sizeof(DEVICE_TD_INFO));
        return ptr;
    }
}

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


