/*
 * 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
//2008-4-14<add> by chester for led issue
//#define FOR_LED_ON_NOTEBOOK
//


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

//PLICE_DEBUG->
//#define		THREAD

//#define	TASK_LET
//PLICE_DEBUG<-


/*---------------------  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 OP_MODE_INFRASTRUCTURE  0
//#define OP_MODE_ADHOC           1
//#define OP_MODE_AP              2

#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 capbilities
#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 releated
    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