/*
 * 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_main.c
 *
 * Purpose: driver entry for initial, open, close, tx and rx.
 *
 * Author: Lyndon Chen
 *
 * Date: Jan 8, 2003
 *
 * Functions:
 *
 *   device_found1 - module initial (insmod) driver entry
 *   device_remove1 - module remove entry
 *   device_init_info - device structure resource allocation function
 *   device_free_info - device structure resource free function
 *   device_get_pci_info - get allocated pci io/mem resource
 *   device_print_info - print out resource
 *   device_open - allocate dma/descripter resource & initial mac/bbp function
 *   device_xmit - asynchrous data tx function
 *   device_intr - interrupt handle function
 *   device_set_multi - set mac filter
 *   device_ioctl - ioctl entry
 *   device_close - shutdown mac/bbp & free dma/descripter resource
 *   device_rx_srv - rx service function
 *   device_receive_frame - rx data function
 *   device_alloc_rx_buf - rx buffer pre-allocated function
 *   device_alloc_frag_buf - rx fragement pre-allocated function
 *   device_free_tx_buf - free tx buffer function
 *   device_free_frag_buf- free de-fragement buffer
 *   device_dma0_tx_80211- tx 802.11 frame via dma0
 *   device_dma0_xmit- tx PS bufferred frame via dma0
 *   device_init_rd0_ring- initial rd dma0 ring
 *   device_init_rd1_ring- initial rd dma1 ring
 *   device_init_td0_ring- initial tx dma0 ring buffer
 *   device_init_td1_ring- initial tx dma1 ring buffer
 *   device_init_registers- initial MAC & BBP & RF internal registers.
 *   device_init_rings- initial tx/rx ring buffer
 *   device_init_defrag_cb- initial & allocate de-fragement buffer.
 *   device_free_rings- free all allocated ring buffer
 *   device_tx_srv- tx interrupt service function
 *
 * Revision History:
 */
#undef __NO_VERSION__

#if !defined(__DEVICE_H__)
#include "device.h"
#endif
#if !defined(__CARD_H__)
#include "card.h"
#endif
#if !defined(__TBIT_H__)
#include "tbit.h"
#endif
#if !defined(__BASEBAND_H__)
#include "baseband.h"
#endif
#if !defined(__MAC_H__)
#include "mac.h"
#endif
#if !defined(__TETHER_H__)
#include "tether.h"
#endif
#if !defined(__WMGR_H__)
#include "wmgr.h"
#endif
#if !defined(__WCTL_H__)
#include "wctl.h"
#endif
#if !defined(__POWER_H__)
#include "power.h"
#endif
#if !defined(__WCMD_H__)
#include "wcmd.h"
#endif
#if !defined(__IOCMD_H__)
#include "iocmd.h"
#endif
#if !defined(__TCRC_H__)
#include "tcrc.h"
#endif
#if !defined(__RXTX_H__)
#include "rxtx.h"
#endif
#if !defined(__WROUTE_H__)
#include "wroute.h"
#endif
#if !defined(__BSSDB_H__)
#include "bssdb.h"
#endif
#if !defined(__HOSTAP_H__)
#include "hostap.h"
#endif
#if !defined(__WPACTL_H__)
#include "wpactl.h"
#endif
#if !defined(__IOCTL_H__)
#include "ioctl.h"
#endif
#if !defined(__IWCTL_H__)
#include "iwctl.h"
#endif
#if !defined(__DPC_H__)
#include "dpc.h"
#endif
#if !defined(__DATARATE_H__)
#include "datarate.h"
#endif
#if !defined(__RF_H__)
#include "rf.h"
#endif
#if !defined(__IOWPA_H__)
#include "iowpa.h"
#endif

#include <linux/delay.h>
#include <linux/kthread.h>
// #ifdef PRIVATE_OBJ
//#if !defined(__DEVICE_EXP_H)
//#include "device_exp.h"
//#endif
//#if !defined(__DEVICE_MODULE_H)
//#include "device_module.h"
//#endif


// #endif
//#define	DEBUG
/*---------------------  Static Definitions -------------------------*/
//static int          msglevel                =MSG_LEVEL_DEBUG;
static int          msglevel                =   MSG_LEVEL_INFO;

//#define	PLICE_DEBUG
//
// Define module options
//
#ifndef PRIVATE_OBJ
MODULE_AUTHOR("VIA Networking Technologies, Inc., <lyndonchen@vntek.com.tw>");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("VIA Networking Solomon-A/B/G Wireless LAN Adapter Driver");
#endif

//PLICE_DEBUG ->
	static int mlme_kill;
	//static  struct task_struct * mlme_task;
//PLICE_DEBUG <-

#define DEVICE_PARAM(N,D)
/*
        static const int N[MAX_UINTS]=OPTION_DEFAULT;\
        MODULE_PARM(N, "1-" __MODULE_STRING(MAX_UINTS) "i");\
        MODULE_PARM_DESC(N, D);
*/

#define RX_DESC_MIN0     16
#define RX_DESC_MAX0     128
#define RX_DESC_DEF0     32
DEVICE_PARAM(RxDescriptors0,"Number of receive descriptors0");

#define RX_DESC_MIN1     16
#define RX_DESC_MAX1     128
#define RX_DESC_DEF1     32
DEVICE_PARAM(RxDescriptors1,"Number of receive descriptors1");

#define TX_DESC_MIN0     16
#define TX_DESC_MAX0     128
#define TX_DESC_DEF0     32
DEVICE_PARAM(TxDescriptors0,"Number of transmit descriptors0");

#define TX_DESC_MIN1     16
#define TX_DESC_MAX1     128
#define TX_DESC_DEF1     64
DEVICE_PARAM(TxDescriptors1,"Number of transmit descriptors1");


#define IP_ALIG_DEF     0
/* IP_byte_align[] is used for IP header DWORD byte aligned
   0: indicate the IP header won't be DWORD byte aligned.(Default) .
   1: indicate the IP header will be DWORD byte aligned.
      In some enviroment, the IP header should be DWORD byte aligned,
      or the packet will be droped when we receive it. (eg: IPVS)
*/
DEVICE_PARAM(IP_byte_align,"Enable IP header dword aligned");


#define INT_WORKS_DEF   20
#define INT_WORKS_MIN   10
#define INT_WORKS_MAX   64

DEVICE_PARAM(int_works,"Number of packets per interrupt services");

#define CHANNEL_MIN     1
#define CHANNEL_MAX     14
#define CHANNEL_DEF     6

DEVICE_PARAM(Channel, "Channel number");


/* PreambleType[] is the preamble length used for transmit.
   0: indicate allows long preamble type
   1: indicate allows short preamble type
*/

#define PREAMBLE_TYPE_DEF     1

DEVICE_PARAM(PreambleType, "Preamble Type");


#define RTS_THRESH_MIN     512
#define RTS_THRESH_MAX     2347
#define RTS_THRESH_DEF     2347

DEVICE_PARAM(RTSThreshold, "RTS threshold");


#define FRAG_THRESH_MIN     256
#define FRAG_THRESH_MAX     2346
#define FRAG_THRESH_DEF     2346

DEVICE_PARAM(FragThreshold, "Fragmentation threshold");


#define DATA_RATE_MIN     0
#define DATA_RATE_MAX     13
#define DATA_RATE_DEF     13
/* datarate[] index
   0: indicate 1 Mbps   0x02
   1: indicate 2 Mbps   0x04
   2: indicate 5.5 Mbps 0x0B
   3: indicate 11 Mbps  0x16
   4: indicate 6 Mbps   0x0c
   5: indicate 9 Mbps   0x12
   6: indicate 12 Mbps  0x18
   7: indicate 18 Mbps  0x24
   8: indicate 24 Mbps  0x30
   9: indicate 36 Mbps  0x48
  10: indicate 48 Mbps  0x60
  11: indicate 54 Mbps  0x6c
  12: indicate 72 Mbps  0x90
  13: indicate auto rate
*/

DEVICE_PARAM(ConnectionRate, "Connection data rate");

#define OP_MODE_DEF     0

DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode ");

/* OpMode[] is used for transmit.
   0: indicate infrastruct mode used
   1: indicate adhoc mode used
   2: indicate AP mode used
*/


/* PSMode[]
   0: indicate disable power saving mode
   1: indicate enable power saving mode
*/

#define PS_MODE_DEF     0

DEVICE_PARAM(PSMode, "Power saving mode");


#define SHORT_RETRY_MIN     0
#define SHORT_RETRY_MAX     31
#define SHORT_RETRY_DEF     8


DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");

#define LONG_RETRY_MIN     0
#define LONG_RETRY_MAX     15
#define LONG_RETRY_DEF     4


DEVICE_PARAM(LongRetryLimit, "long frame retry limits");


/* BasebandType[] baseband type selected
   0: indicate 802.11a type
   1: indicate 802.11b type
   2: indicate 802.11g type
*/
#define BBP_TYPE_MIN     0
#define BBP_TYPE_MAX     2
#define BBP_TYPE_DEF     2

DEVICE_PARAM(BasebandType, "baseband type");



/* 80211hEnable[]
   0: indicate disable 802.11h
   1: indicate enable 802.11h
*/

#define X80211h_MODE_DEF     0

DEVICE_PARAM(b80211hEnable, "802.11h mode");

/* 80211hEnable[]
   0: indicate disable 802.11h
   1: indicate enable 802.11h
*/

#define DIVERSITY_ANT_DEF     0

DEVICE_PARAM(bDiversityANTEnable, "ANT diversity mode");


//
// Static vars definitions
//


#ifndef PRIVATE_OBJ
static int          device_nics             =0;
static PSDevice     pDevice_Infos           =NULL;
static struct net_device *root_device_dev = NULL;

static CHIP_INFO chip_info_table[]= {
    { VT3253,       "VIA Networking Solomon-A/B/G Wireless LAN Adapter ",
        256, 1,     DEVICE_FLAGS_IP_ALIGN|DEVICE_FLAGS_TX_ALIGN },
    {0,NULL}
};

static struct pci_device_id device_id_table[] __devinitdata = {
{ 0x1106, 0x3253, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (int)&chip_info_table[0]},
{ 0, }
};
#endif

/*---------------------  Static Functions  --------------------------*/

#ifndef PRIVATE_OBJ

static int  device_found1(struct pci_dev *pcid, const struct pci_device_id *ent);
static BOOL device_init_info(struct pci_dev* pcid, PSDevice* ppDevice, PCHIP_INFO);
static void device_free_info(PSDevice pDevice);
static BOOL device_get_pci_info(PSDevice, struct pci_dev* pcid);
static void device_print_info(PSDevice pDevice);
static struct net_device_stats *device_get_stats(struct net_device *dev);
static void device_init_diversity_timer(PSDevice pDevice);
static int  device_open(struct net_device *dev);
static int  device_xmit(struct sk_buff *skb, struct net_device *dev);
static  irqreturn_t  device_intr(int irq,  void*dev_instance);
static void device_set_multi(struct net_device *dev);
static int  device_close(struct net_device *dev);
static int  device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);

#ifdef CONFIG_PM
static int device_notify_reboot(struct notifier_block *, unsigned long event, void *ptr);
static int viawget_suspend(struct pci_dev *pcid, u32 state);
static int viawget_resume(struct pci_dev *pcid);
struct notifier_block device_notifier = {
        notifier_call:  device_notify_reboot,
        next:           NULL,
        priority:       0
};
#endif

#endif // #ifndef PRIVATE_OBJ

static void device_init_rd0_ring(PSDevice pDevice);
static void device_init_rd1_ring(PSDevice pDevice);
static void device_init_defrag_cb(PSDevice pDevice);
static void device_init_td0_ring(PSDevice pDevice);
static void device_init_td1_ring(PSDevice pDevice);

#ifndef PRIVATE_OBJ
static int  device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev);
#endif
//2008-0714<Add>by Mike Liu
static BOOL device_release_WPADEV(PSDevice pDevice);

static int  ethtool_ioctl(struct net_device *dev, void *useraddr);
static int  device_rx_srv(PSDevice pDevice, UINT uIdx);
static int  device_tx_srv(PSDevice pDevice, UINT uIdx);
static BOOL device_alloc_rx_buf(PSDevice pDevice, PSRxDesc pDesc);
static void device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType);
static void device_free_tx_buf(PSDevice pDevice, PSTxDesc pDesc);
static void device_free_td0_ring(PSDevice pDevice);
static void device_free_td1_ring(PSDevice pDevice);
static void device_free_rd0_ring(PSDevice pDevice);
static void device_free_rd1_ring(PSDevice pDevice);
static void device_free_rings(PSDevice pDevice);
static void device_free_frag_buf(PSDevice pDevice);
static int Config_FileGetParameter(UCHAR *string, UCHAR *dest,UCHAR *source);


/*---------------------  Export Variables  --------------------------*/

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


#ifndef PRIVATE_OBJ

static char* get_chip_name(int chip_id) {
    int i;
    for (i=0;chip_info_table[i].name!=NULL;i++)
        if (chip_info_table[i].chip_id==chip_id)
            break;
    return chip_info_table[i].name;
}

static void __devexit device_remove1(struct pci_dev *pcid)
{
    PSDevice pDevice=pci_get_drvdata(pcid);

    if (pDevice==NULL)
        return;
    device_free_info(pDevice);

}

#endif
/*
static void
device_set_int_opt(int *opt, int val, int min, int max, int def,char* name,char* devname) {
    if (val==-1)
        *opt=def;
    else if (val<min || val>max) {
        DEVICE_PRT(MSG_LEVEL_INFO, KERN_NOTICE "%s: the value of parameter %s is invalid, the valid range is (%d-%d)\n" ,
            devname,name, min,max);
        *opt=def;
    } else {
        DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: set value of parameter %s to %d\n",
            devname, name, val);
        *opt=val;
    }
}

static void
device_set_bool_opt(PU32 opt, int val,BOOL def,U32 flag, char* name,char* devname) {
    (*opt)&=(~flag);
    if (val==-1)
        *opt|=(def ? flag : 0);
    else if (val<0 || val>1) {
        DEVICE_PRT(MSG_LEVEL_INFO, KERN_NOTICE
            "%s: the value of parameter %s is invalid, the valid range is (0-1)\n",devname,name);
        *opt|=(def ? flag : 0);
    } else {
        DEVICE_PRT(MSG_LEVEL_INFO, KERN_NOTICE "%s: set parameter %s to %s\n",
            devname,name , val ? "TRUE" : "FALSE");
        *opt|=(val ? flag : 0);
    }
}
*/
static void
device_get_options(PSDevice pDevice, int index, char* devname) {

    POPTIONS pOpts = &(pDevice->sOpts);
  pOpts->nRxDescs0=RX_DESC_DEF0;
  pOpts->nRxDescs1=RX_DESC_DEF1;
  pOpts->nTxDescs[0]=TX_DESC_DEF0;
  pOpts->nTxDescs[1]=TX_DESC_DEF1;
pOpts->flags|=DEVICE_FLAGS_IP_ALIGN;
  pOpts->int_works=INT_WORKS_DEF;
  pOpts->rts_thresh=RTS_THRESH_DEF;
  pOpts->frag_thresh=FRAG_THRESH_DEF;
  pOpts->data_rate=DATA_RATE_DEF;
  pOpts->channel_num=CHANNEL_DEF;

pOpts->flags|=DEVICE_FLAGS_PREAMBLE_TYPE;
pOpts->flags|=DEVICE_FLAGS_OP_MODE;
//pOpts->flags|=DEVICE_FLAGS_PS_MODE;
  pOpts->short_retry=SHORT_RETRY_DEF;
  pOpts->long_retry=LONG_RETRY_DEF;
  pOpts->bbp_type=BBP_TYPE_DEF;
pOpts->flags|=DEVICE_FLAGS_80211h_MODE;
pOpts->flags|=DEVICE_FLAGS_DiversityANT;


}

static void
device_set_options(PSDevice pDevice) {

    BYTE    abyBroadcastAddr[U_ETHER_ADDR_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
    BYTE    abySNAP_RFC1042[U_ETHER_ADDR_LEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
    BYTE    abySNAP_Bridgetunnel[U_ETHER_ADDR_LEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};


    memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, U_ETHER_ADDR_LEN);
    memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, U_ETHER_ADDR_LEN);
    memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, U_ETHER_ADDR_LEN);

    pDevice->uChannel = pDevice->sOpts.channel_num;
    pDevice->wRTSThreshold = pDevice->sOpts.rts_thresh;
    pDevice->wFragmentationThreshold = pDevice->sOpts.frag_thresh;
    pDevice->byShortRetryLimit = pDevice->sOpts.short_retry;
    pDevice->byLongRetryLimit = pDevice->sOpts.long_retry;
    pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME;
    pDevice->byShortPreamble = (pDevice->sOpts.flags & DEVICE_FLAGS_PREAMBLE_TYPE) ? 1 : 0;
    pDevice->byOpMode = (pDevice->sOpts.flags & DEVICE_FLAGS_OP_MODE) ? 1 : 0;
    pDevice->ePSMode = (pDevice->sOpts.flags & DEVICE_FLAGS_PS_MODE) ? 1 : 0;
    pDevice->b11hEnable = (pDevice->sOpts.flags & DEVICE_FLAGS_80211h_MODE) ? 1 : 0;
    pDevice->bDiversityRegCtlON = (pDevice->sOpts.flags & DEVICE_FLAGS_DiversityANT) ? 1 : 0;
    pDevice->uConnectionRate = pDevice->sOpts.data_rate;
    if (pDevice->uConnectionRate < RATE_AUTO) pDevice->bFixRate = TRUE;
    pDevice->byBBType = pDevice->sOpts.bbp_type;
    pDevice->byPacketType = pDevice->byBBType;

//PLICE_DEBUG->
	pDevice->byAutoFBCtrl = AUTO_FB_0;
	//pDevice->byAutoFBCtrl = AUTO_FB_1;
//PLICE_DEBUG<-
pDevice->bUpdateBBVGA = TRUE;
    pDevice->byFOETuning = 0;
    pDevice->wCTSDuration = 0;
    pDevice->byPreambleType = 0;


    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" uChannel= %d\n",(INT)pDevice->uChannel);
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byOpMode= %d\n",(INT)pDevice->byOpMode);
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" ePSMode= %d\n",(INT)pDevice->ePSMode);
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" wRTSThreshold= %d\n",(INT)pDevice->wRTSThreshold);
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byShortRetryLimit= %d\n",(INT)pDevice->byShortRetryLimit);
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byLongRetryLimit= %d\n",(INT)pDevice->byLongRetryLimit);
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byPreambleType= %d\n",(INT)pDevice->byPreambleType);
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byShortPreamble= %d\n",(INT)pDevice->byShortPreamble);
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" uConnectionRate= %d\n",(INT)pDevice->uConnectionRate);
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byBBType= %d\n",(INT)pDevice->byBBType);
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" pDevice->b11hEnable= %d\n",(INT)pDevice->b11hEnable);
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" pDevice->bDiversityRegCtlON= %d\n",(INT)pDevice->bDiversityRegCtlON);
}

static VOID s_vCompleteCurrentMeasure (IN PSDevice pDevice, IN BYTE byResult)
{
    UINT    ii;
    DWORD   dwDuration = 0;
    BYTE    byRPI0 = 0;

    for(ii=1;ii<8;ii++) {
        pDevice->dwRPIs[ii] *= 255;
        dwDuration |= *((PWORD) (pDevice->pCurrMeasureEID->sReq.abyDuration));
        dwDuration <<= 10;
        pDevice->dwRPIs[ii] /= dwDuration;
        pDevice->abyRPIs[ii] = (BYTE) pDevice->dwRPIs[ii];
        byRPI0 += pDevice->abyRPIs[ii];
    }
    pDevice->abyRPIs[0] = (0xFF - byRPI0);

     if (pDevice->uNumOfMeasureEIDs == 0) {
        VNTWIFIbMeasureReport(  pDevice->pMgmt,
                                TRUE,
                                pDevice->pCurrMeasureEID,
                                byResult,
                                pDevice->byBasicMap,
                                pDevice->byCCAFraction,
                                pDevice->abyRPIs
                                );
    } else {
        VNTWIFIbMeasureReport(  pDevice->pMgmt,
                                FALSE,
                                pDevice->pCurrMeasureEID,
                                byResult,
                                pDevice->byBasicMap,
                                pDevice->byCCAFraction,
                                pDevice->abyRPIs
                                );
        CARDbStartMeasure (pDevice, pDevice->pCurrMeasureEID++, pDevice->uNumOfMeasureEIDs);
    }

}



//
// Initialiation of MAC & BBP registers
//

static void device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType)
{
    UINT    ii;
    BYTE    byValue;
	BYTE    byValue1;
    BYTE    byCCKPwrdBm = 0;
    BYTE    byOFDMPwrdBm = 0;
    INT zonetype=0;
     PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);
    MACbShutdown(pDevice->PortOffset);
    BBvSoftwareReset(pDevice->PortOffset);

    if ((InitType == DEVICE_INIT_COLD) ||
        (InitType == DEVICE_INIT_DXPL)) {
        // Do MACbSoftwareReset in MACvInitialize
        MACbSoftwareReset(pDevice->PortOffset);
        // force CCK
        pDevice->bCCK = TRUE;
        pDevice->bAES = FALSE;
        pDevice->bProtectMode = FALSE;      //Only used in 11g type, sync with ERP IE
        pDevice->bNonERPPresent = FALSE;
        pDevice->bBarkerPreambleMd = FALSE;
        pDevice->wCurrentRate = RATE_1M;
        pDevice->byTopOFDMBasicRate = RATE_24M;
        pDevice->byTopCCKBasicRate = RATE_1M;

        pDevice->byRevId = 0;                   //Target to IF pin while programming to RF chip.

        // init MAC
        MACvInitialize(pDevice->PortOffset);

        // Get Local ID
        VNSvInPortB(pDevice->PortOffset + MAC_REG_LOCALID, &(pDevice->byLocalID));

           spin_lock_irq(&pDevice->lock);
	 SROMvReadAllContents(pDevice->PortOffset,pDevice->abyEEPROM);

           spin_unlock_irq(&pDevice->lock);

        // Get Channel range

        pDevice->byMinChannel = 1;
        pDevice->byMaxChannel = CB_MAX_CHANNEL;

        // Get Antena
        byValue = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ANTENNA);
        if (byValue & EEP_ANTINV)
            pDevice->bTxRxAntInv = TRUE;
        else
            pDevice->bTxRxAntInv = FALSE;
#ifdef	PLICE_DEBUG
	//printk("init_register:TxRxAntInv is %d,byValue is %d\n",pDevice->bTxRxAntInv,byValue);
#endif

        byValue &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
        if (byValue == 0) // if not set default is All
            byValue = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
#ifdef	PLICE_DEBUG
	//printk("init_register:byValue is %d\n",byValue);
#endif
        pDevice->ulDiversityNValue = 100*260;//100*SROMbyReadEmbedded(pDevice->PortOffset, 0x51);
        pDevice->ulDiversityMValue = 100*16;//SROMbyReadEmbedded(pDevice->PortOffset, 0x52);
        pDevice->byTMax = 1;//SROMbyReadEmbedded(pDevice->PortOffset, 0x53);
        pDevice->byTMax2 = 4;//SROMbyReadEmbedded(pDevice->PortOffset, 0x54);
        pDevice->ulSQ3TH = 0;//(ULONG) SROMbyReadEmbedded(pDevice->PortOffset, 0x55);
        pDevice->byTMax3 = 64;//SROMbyReadEmbedded(pDevice->PortOffset, 0x56);

        if (byValue == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
            pDevice->byAntennaCount = 2;
            pDevice->byTxAntennaMode = ANT_B;
            pDevice->dwTxAntennaSel = 1;
            pDevice->dwRxAntennaSel = 1;
            if (pDevice->bTxRxAntInv == TRUE)
                pDevice->byRxAntennaMode = ANT_A;
            else
                pDevice->byRxAntennaMode = ANT_B;
                // chester for antenna
byValue1 = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ANTENNA);
          //  if (pDevice->bDiversityRegCtlON)
          if((byValue1&0x08)==0)
                pDevice->bDiversityEnable = FALSE;//SROMbyReadEmbedded(pDevice->PortOffset, 0x50);
            else
                pDevice->bDiversityEnable = TRUE;
#ifdef	PLICE_DEBUG
		//printk("aux |main antenna: RxAntennaMode is %d\n",pDevice->byRxAntennaMode);
#endif
	} else  {
            pDevice->bDiversityEnable = FALSE;
            pDevice->byAntennaCount = 1;
            pDevice->dwTxAntennaSel = 0;
            pDevice->dwRxAntennaSel = 0;
            if (byValue & EEP_ANTENNA_AUX) {
                pDevice->byTxAntennaMode = ANT_A;
                if (pDevice->bTxRxAntInv == TRUE)
                    pDevice->byRxAntennaMode = ANT_B;
                else
                    pDevice->byRxAntennaMode = ANT_A;
            } else {
                pDevice->byTxAntennaMode = ANT_B;
                if (pDevice->bTxRxAntInv == TRUE)
                    pDevice->byRxAntennaMode = ANT_A;
                else
                    pDevice->byRxAntennaMode = ANT_B;
            }
        }
#ifdef	PLICE_DEBUG
	//printk("init registers: TxAntennaMode is %d\n",pDevice->byTxAntennaMode);
#endif
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "bDiversityEnable=[%d],NValue=[%d],MValue=[%d],TMax=[%d],TMax2=[%d]\n",
            pDevice->bDiversityEnable,(int)pDevice->ulDiversityNValue,(int)pDevice->ulDiversityMValue,pDevice->byTMax,pDevice->byTMax2);

//#ifdef ZoneType_DefaultSetting
//2008-8-4 <add> by chester
//zonetype initial
 pDevice->byOriginalZonetype = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
 if((zonetype=Config_FileOperation(pDevice,FALSE,NULL)) >= 0) {         //read zonetype file ok!
  if ((zonetype == 0)&&
        (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] !=0x00)){          //for USA
    pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0;
    pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0B;
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Init Zone Type :USA\n");
  }
 else if((zonetype == 1)&&
 	     (pDevice->abyEEPROM[EEP_OFS_ZONETYPE]!=0x01)){   //for Japan
    pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0x01;
    pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
  }
 else if((zonetype == 2)&&
 	     (pDevice->abyEEPROM[EEP_OFS_ZONETYPE]!=0x02)){   //for Europe
    pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0x02;
    pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Init Zone Type :Europe\n");
  }

else
{
   if(zonetype!=pDevice->abyEEPROM[EEP_OFS_ZONETYPE])
      printk("zonetype in file[%02x] mismatch with in EEPROM[%02x]\n",zonetype,pDevice->abyEEPROM[EEP_OFS_ZONETYPE]);
   else
      printk("Read Zonetype file sucess,use default zonetype setting[%02x]\n",zonetype);
 }
 	}
  else
    printk("Read Zonetype file fail,use default zonetype setting[%02x]\n",SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ZONETYPE));

        // Get RFType
        pDevice->byRFType = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RFTYPE);

        if ((pDevice->byRFType & RF_EMU) != 0) {
            // force change RevID for VT3253 emu
            pDevice->byRevId = 0x80;
        }

        pDevice->byRFType &= RF_MASK;
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRFType = %x\n", pDevice->byRFType);

        if (pDevice->bZoneRegExist == FALSE) {
            pDevice->byZoneType = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
        }
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byZoneType = %x\n", pDevice->byZoneType);

        //Init RF module
        RFbInit(pDevice);

        //Get Desire Power Value
        pDevice->byCurPwr = 0xFF;
        pDevice->byCCKPwr = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_PWR_CCK);
        pDevice->byOFDMPwrG = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_PWR_OFDMG);
        //byCCKPwrdBm = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_CCK_PWR_dBm);

	//byOFDMPwrdBm = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_OFDM_PWR_dBm);
//printk("CCKPwrdBm is 0x%x,byOFDMPwrdBm is 0x%x\n",byCCKPwrdBm,byOFDMPwrdBm);
		// Load power Table


        for (ii=0;ii<CB_MAX_CHANNEL_24G;ii++) {
            pDevice->abyCCKPwrTbl[ii+1] = SROMbyReadEmbedded(pDevice->PortOffset, (BYTE)(ii + EEP_OFS_CCK_PWR_TBL));
            if (pDevice->abyCCKPwrTbl[ii+1] == 0) {
                pDevice->abyCCKPwrTbl[ii+1] = pDevice->byCCKPwr;
            }
            pDevice->abyOFDMPwrTbl[ii+1] = SROMbyReadEmbedded(pDevice->PortOffset, (BYTE)(ii + EEP_OFS_OFDM_PWR_TBL));
            if (pDevice->abyOFDMPwrTbl[ii+1] == 0) {
                pDevice->abyOFDMPwrTbl[ii+1] = pDevice->byOFDMPwrG;
            }
            pDevice->abyCCKDefaultPwr[ii+1] = byCCKPwrdBm;
            pDevice->abyOFDMDefaultPwr[ii+1] = byOFDMPwrdBm;
        }
		//2008-8-4 <add> by chester
	  //recover 12,13 ,14channel for EUROPE by 11 channel
          if(((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) ||
	        (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe))&&
	     (pDevice->byOriginalZonetype == ZoneType_USA)) {
	    for(ii=11;ii<14;ii++) {
                pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
	       pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];

	    }
	  }


        // Load OFDM A Power Table
        for (ii=0;ii<CB_MAX_CHANNEL_5G;ii++) { //RobertYu:20041224, bug using CB_MAX_CHANNEL
            pDevice->abyOFDMPwrTbl[ii+CB_MAX_CHANNEL_24G+1] = SROMbyReadEmbedded(pDevice->PortOffset, (BYTE)(ii + EEP_OFS_OFDMA_PWR_TBL));
            pDevice->abyOFDMDefaultPwr[ii+CB_MAX_CHANNEL_24G+1] = SROMbyReadEmbedded(pDevice->PortOffset, (BYTE)(ii + EEP_OFS_OFDMA_PWR_dBm));
        }
        CARDvInitChannelTable((PVOID)pDevice);


        if (pDevice->byLocalID > REV_ID_VT3253_B1) {
            MACvSelectPage1(pDevice->PortOffset);
            VNSvOutPortB(pDevice->PortOffset + MAC_REG_MSRCTL + 1, (MSRCTL1_TXPWR | MSRCTL1_CSAPAREN));
            MACvSelectPage0(pDevice->PortOffset);
        }


         // use relative tx timeout and 802.11i D4
        MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_CFG, (CFG_TKIPOPT | CFG_NOTXTIMEOUT));

        // set performance parameter by registry
        MACvSetShortRetryLimit(pDevice->PortOffset, pDevice->byShortRetryLimit);
        MACvSetLongRetryLimit(pDevice->PortOffset, pDevice->byLongRetryLimit);

        // reset TSF counter
        VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
        // enable TSF counter
        VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);

        // initialize BBP registers
        BBbVT3253Init(pDevice);

        if (pDevice->bUpdateBBVGA) {
            pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
            pDevice->byBBVGANew = pDevice->byBBVGACurrent;
            BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
        }
#ifdef	PLICE_DEBUG
	//printk("init registers:RxAntennaMode is %x,TxAntennaMode is %x\n",pDevice->byRxAntennaMode,pDevice->byTxAntennaMode);
#endif
        BBvSetRxAntennaMode(pDevice->PortOffset, pDevice->byRxAntennaMode);
        BBvSetTxAntennaMode(pDevice->PortOffset, pDevice->byTxAntennaMode);

        pDevice->byCurrentCh = 0;

        //pDevice->NetworkType = Ndis802_11Automode;
        // Set BB and packet type at the same time.
        // Set Short Slot Time, xIFS, and RSPINF.
        if (pDevice->uConnectionRate == RATE_AUTO) {
            pDevice->wCurrentRate = RATE_54M;
        } else {
            pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
        }

        // default G Mode
        VNTWIFIbConfigPhyMode(pDevice->pMgmt, PHY_TYPE_11G);
        VNTWIFIbConfigPhyMode(pDevice->pMgmt, PHY_TYPE_AUTO);

        pDevice->bRadioOff = FALSE;

        pDevice->byRadioCtl = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RADIOCTL);
        pDevice->bHWRadioOff = FALSE;

        if (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) {
            // Get GPIO
            MACvGPIOIn(pDevice->PortOffset, &pDevice->byGPIO);
//2008-4-14 <add> by chester for led issue
 #ifdef FOR_LED_ON_NOTEBOOK
if (BITbIsBitOn(pDevice->byGPIO,GPIO0_DATA)){pDevice->bHWRadioOff = TRUE;}
if (BITbIsBitOff(pDevice->byGPIO,GPIO0_DATA)){pDevice->bHWRadioOff = FALSE;}

            }
        if ( (pDevice->bRadioControlOff == TRUE)) {
            CARDbRadioPowerOff(pDevice);
        }
else  CARDbRadioPowerOn(pDevice);
#else
            if ((BITbIsBitOn(pDevice->byGPIO,GPIO0_DATA) && BITbIsBitOff(pDevice->byRadioCtl, EEP_RADIOCTL_INV)) ||
                (BITbIsBitOff(pDevice->byGPIO,GPIO0_DATA) && BITbIsBitOn(pDevice->byRadioCtl, EEP_RADIOCTL_INV))) {
                pDevice->bHWRadioOff = TRUE;
            }
        }
        if ((pDevice->bHWRadioOff == TRUE) || (pDevice->bRadioControlOff == TRUE)) {
            CARDbRadioPowerOff(pDevice);
        }

#endif
    }
            pMgmt->eScanType = WMAC_SCAN_PASSIVE;
    // get Permanent network address
    SROMvReadEtherAddress(pDevice->PortOffset, pDevice->abyCurrentNetAddr);
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Network address = %02x-%02x-%02x=%02x-%02x-%02x\n",
        pDevice->abyCurrentNetAddr[0],
        pDevice->abyCurrentNetAddr[1],
        pDevice->abyCurrentNetAddr[2],
        pDevice->abyCurrentNetAddr[3],
        pDevice->abyCurrentNetAddr[4],
        pDevice->abyCurrentNetAddr[5]);


    // reset Tx pointer
    CARDvSafeResetRx(pDevice);
    // reset Rx pointer
    CARDvSafeResetTx(pDevice);

    if (pDevice->byLocalID <= REV_ID_VT3253_A1) {
        MACvRegBitsOn(pDevice->PortOffset, MAC_REG_RCR, RCR_WPAERR);
    }

    pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;

    // Turn On Rx DMA
    MACvReceive0(pDevice->PortOffset);
    MACvReceive1(pDevice->PortOffset);

    // start the adapter
    MACvStart(pDevice->PortOffset);

    netif_stop_queue(pDevice->dev);


}



static VOID device_init_diversity_timer(PSDevice pDevice) {

    init_timer(&pDevice->TimerSQ3Tmax1);
    pDevice->TimerSQ3Tmax1.data = (ULONG)pDevice;
    pDevice->TimerSQ3Tmax1.function = (TimerFunction)TimerSQ3CallBack;
    pDevice->TimerSQ3Tmax1.expires = RUN_AT(HZ);

    init_timer(&pDevice->TimerSQ3Tmax2);
    pDevice->TimerSQ3Tmax2.data = (ULONG)pDevice;
    pDevice->TimerSQ3Tmax2.function = (TimerFunction)TimerSQ3CallBack;
    pDevice->TimerSQ3Tmax2.expires = RUN_AT(HZ);

    init_timer(&pDevice->TimerSQ3Tmax3);
    pDevice->TimerSQ3Tmax3.data = (ULONG)pDevice;
    pDevice->TimerSQ3Tmax3.function = (TimerFunction)TimerState1CallBack;
    pDevice->TimerSQ3Tmax3.expires = RUN_AT(HZ);

    return;
}


static BOOL device_release_WPADEV(PSDevice pDevice)
{
  viawget_wpa_header *wpahdr;
  int ii=0;
 // wait_queue_head_t	Set_wait;
  //send device close to wpa_supplicnat layer
    if (pDevice->bWPADEVUp==TRUE) {
                 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
                 wpahdr->type = VIAWGET_DEVICECLOSE_MSG;
                 wpahdr->resp_ie_len = 0;
                 wpahdr->req_ie_len = 0;
                 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
                 pDevice->skb->dev = pDevice->wpadev;
                 pDevice->skb->mac_header = pDevice->skb->data;
                 pDevice->skb->pkt_type = PACKET_HOST;
                 pDevice->skb->protocol = htons(ETH_P_802_2);
                 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
                 netif_rx(pDevice->skb);
                 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);

 //wait release WPADEV
              //    init_waitqueue_head(&Set_wait);
              //    wait_event_timeout(Set_wait, ((pDevice->wpadev==NULL)&&(pDevice->skb == NULL)),5*HZ);    //1s wait
              while((pDevice->bWPADEVUp==TRUE)) {
	        set_current_state(TASK_UNINTERRUPTIBLE);
                 schedule_timeout (HZ/20);          //wait 50ms
                 ii++;
	        if(ii>20)
		  break;
              }
           };
    return TRUE;
}


static const struct net_device_ops device_netdev_ops = {
    .ndo_open               = device_open,
    .ndo_stop               = device_close,
    .ndo_do_ioctl           = device_ioctl,
    .ndo_get_stats          = device_get_stats,
    .ndo_start_xmit         = device_xmit,
    .ndo_set_multicast_list = device_set_multi,
};


#ifndef PRIVATE_OBJ

static int
device_found1(struct pci_dev *pcid, const struct pci_device_id *ent)
{
    static BOOL bFirst = TRUE;
    struct net_device*  dev = NULL;
    PCHIP_INFO  pChip_info = (PCHIP_INFO)ent->driver_data;
    PSDevice    pDevice;
    int         rc;
    if (device_nics ++>= MAX_UINTS) {
        printk(KERN_NOTICE DEVICE_NAME ": already found %d NICs\n", device_nics);
        return -ENODEV;
    }


    dev = alloc_etherdev(sizeof(DEVICE_INFO));

    pDevice = (PSDevice) netdev_priv(dev);

    if (dev == NULL) {
        printk(KERN_ERR DEVICE_NAME ": allocate net device failed \n");
        return -ENODEV;
    }

    // Chain it all together
   // SET_MODULE_OWNER(dev);
    SET_NETDEV_DEV(dev, &pcid->dev);

    if (bFirst) {
        printk(KERN_NOTICE "%s Ver. %s\n",DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
        printk(KERN_NOTICE "Copyright (c) 2003 VIA Networking Technologies, Inc.\n");
        bFirst=FALSE;
    }

    if (!device_init_info(pcid, &pDevice, pChip_info)) {
        return -ENOMEM;
    }
    pDevice->dev = dev;
    pDevice->next_module = root_device_dev;
    root_device_dev = dev;
    dev->irq = pcid->irq;

    if (pci_enable_device(pcid)) {
        device_free_info(pDevice);
        return -ENODEV;
    }
#ifdef	DEBUG
	printk("Before get pci_info memaddr is %x\n",pDevice->memaddr);
#endif
    if (device_get_pci_info(pDevice,pcid) == FALSE) {
        printk(KERN_ERR DEVICE_NAME ": Failed to find PCI device.\n");
        device_free_info(pDevice);
        return -ENODEV;
    }

#if 1

#ifdef	DEBUG

	//pci_read_config_byte(pcid, PCI_BASE_ADDRESS_0, &pDevice->byRevId);
	printk("after get pci_info memaddr is %x, io addr is %x,io_size is %d\n",pDevice->memaddr,pDevice->ioaddr,pDevice->io_size);
	{
		int i;
		U32			bar,len;
		u32 address[] = {
		PCI_BASE_ADDRESS_0,
		PCI_BASE_ADDRESS_1,
		PCI_BASE_ADDRESS_2,
		PCI_BASE_ADDRESS_3,
		PCI_BASE_ADDRESS_4,
		PCI_BASE_ADDRESS_5,
		0};
		for (i=0;address[i];i++)
		{
			//pci_write_config_dword(pcid,address[i], 0xFFFFFFFF);
			pci_read_config_dword(pcid, address[i], &bar);
			printk("bar %d is %x\n",i,bar);
			if (!bar)
			{
				printk("bar %d not implemented\n",i);
				continue;
			}
			if (bar & PCI_BASE_ADDRESS_SPACE_IO) {
			/* This is IO */

			len = bar & (PCI_BASE_ADDRESS_IO_MASK & 0xFFFF);
			len = len & ~(len - 1);

			printk("IO space:  len in IO %x, BAR %d\n", len, i);
			}
			else
			{
				len = bar & 0xFFFFFFF0;
				len = ~len + 1;

				printk("len in MEM %x, BAR %d\n", len, i);
			}
		}
	}
#endif


#endif

#ifdef	DEBUG
	//return  0  ;
#endif
    pDevice->PortOffset = (DWORD)ioremap(pDevice->memaddr & PCI_BASE_ADDRESS_MEM_MASK, pDevice->io_size);
	//pDevice->PortOffset = (DWORD)ioremap(pDevice->ioaddr & PCI_BASE_ADDRESS_IO_MASK, pDevice->io_size);

	if(pDevice->PortOffset == 0) {
       printk(KERN_ERR DEVICE_NAME ": Failed to IO remapping ..\n");
       device_free_info(pDevice);
        return -ENODEV;
    }




    rc = pci_request_regions(pcid, DEVICE_NAME);
    if (rc) {
        printk(KERN_ERR DEVICE_NAME ": Failed to find PCI device\n");
        device_free_info(pDevice);
        return -ENODEV;
    }

    dev->base_addr = pDevice->ioaddr;
#ifdef	PLICE_DEBUG
	BYTE	value;

	VNSvInPortB(pDevice->PortOffset+0x4F, &value);
	printk("Before write: value is %x\n",value);
	//VNSvInPortB(pDevice->PortOffset+0x3F, 0x00);
	VNSvOutPortB(pDevice->PortOffset,value);
	VNSvInPortB(pDevice->PortOffset+0x4F, &value);
	printk("After write: value is %x\n",value);
#endif



#ifdef IO_MAP
    pDevice->PortOffset = pDevice->ioaddr;
#endif
    // do reset
    if (!MACbSoftwareReset(pDevice->PortOffset)) {
        printk(KERN_ERR DEVICE_NAME ": Failed to access MAC hardware..\n");
        device_free_info(pDevice);
        return -ENODEV;
    }
    // initial to reload eeprom
    MACvInitialize(pDevice->PortOffset);
    MACvReadEtherAddress(pDevice->PortOffset, dev->dev_addr);

    device_get_options(pDevice, device_nics-1, dev->name);
    device_set_options(pDevice);
    //Mask out the options cannot be set to the chip
    pDevice->sOpts.flags &= pChip_info->flags;

    //Enable the chip specified capbilities
    pDevice->flags = pDevice->sOpts.flags | (pChip_info->flags & 0xFF000000UL);
    pDevice->tx_80211 = device_dma0_tx_80211;
    pDevice->sMgmtObj.pAdapter = (PVOID)pDevice;
    pDevice->pMgmt = &(pDevice->sMgmtObj);

    dev->irq                = pcid->irq;
    dev->netdev_ops         = &device_netdev_ops;

#ifdef WIRELESS_EXT
//Einsn Modify for ubuntu-7.04
//	dev->wireless_handlers->get_wireless_stats = iwctl_get_wireless_stats;
#if WIRELESS_EXT > 12
	dev->wireless_handlers = (struct iw_handler_def *)&iwctl_handler_def;
//	netdev->wireless_handlers = NULL;
#endif /* WIRELESS_EXT > 12 */
#endif /* WIRELESS_EXT */

    rc = register_netdev(dev);
    if (rc)
    {
        printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
        device_free_info(pDevice);
        return -ENODEV;
    }
//2008-07-21-01<Add>by MikeLiu
//register wpadev
   if(wpa_set_wpadev(pDevice, 1)!=0) {
     printk("Fail to Register WPADEV?\n");
        unregister_netdev(pDevice->dev);
        free_netdev(dev);
   }
    device_print_info(pDevice);
    pci_set_drvdata(pcid, pDevice);
    return 0;

}

static void device_print_info(PSDevice pDevice)
{
    struct net_device* dev=pDevice->dev;

    DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: %s\n",dev->name, get_chip_name(pDevice->chip_id));
    DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: MAC=%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
        dev->name,
        dev->dev_addr[0],dev->dev_addr[1],dev->dev_addr[2],
        dev->dev_addr[3],dev->dev_addr[4],dev->dev_addr[5]);
#ifdef IO_MAP
    DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO" IO=0x%lx  ",(ULONG) pDevice->ioaddr);
    DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO" IRQ=%d \n", pDevice->dev->irq);
#else
    DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO" IO=0x%lx Mem=0x%lx ",(ULONG) pDevice->ioaddr,(ULONG) pDevice->PortOffset);
    DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO" IRQ=%d \n", pDevice->dev->irq);
#endif

}

static BOOL device_init_info(struct pci_dev* pcid, PSDevice* ppDevice,
    PCHIP_INFO pChip_info) {

    PSDevice p;

    memset(*ppDevice,0,sizeof(DEVICE_INFO));

    if (pDevice_Infos == NULL) {
        pDevice_Infos =*ppDevice;
    }
    else {
        for (p=pDevice_Infos;p->next!=NULL;p=p->next)
            do {} while (0);
        p->next = *ppDevice;
        (*ppDevice)->prev = p;
    }

    (*ppDevice)->pcid = pcid;
    (*ppDevice)->chip_id = pChip_info->chip_id;
    (*ppDevice)->io_size = pChip_info->io_size;
    (*ppDevice)->nTxQueues = pChip_info->nTxQueue;
    (*ppDevice)->multicast_limit =32;

    spin_lock_init(&((*ppDevice)->lock));

    return TRUE;
}

static BOOL device_get_pci_info(PSDevice pDevice, struct pci_dev* pcid) {

    U16 pci_cmd;
    U8  b;
    UINT cis_addr;
#ifdef	PLICE_DEBUG
	BYTE       pci_config[256];
	BYTE	value =0x00;
	int		ii,j;
	U16	max_lat=0x0000;
	memset(pci_config,0x00,256);
#endif

    pci_read_config_byte(pcid, PCI_REVISION_ID, &pDevice->byRevId);
    pci_read_config_word(pcid, PCI_SUBSYSTEM_ID,&pDevice->SubSystemID);
    pci_read_config_word(pcid, PCI_SUBSYSTEM_VENDOR_ID, &pDevice->SubVendorID);
    pci_read_config_word(pcid, PCI_COMMAND, (u16 *) & (pci_cmd));

    pci_set_master(pcid);

    pDevice->memaddr = pci_resource_start(pcid,0);
    pDevice->ioaddr = pci_resource_start(pcid,1);

#ifdef	DEBUG
//	pDevice->ioaddr = pci_resource_start(pcid, 0);
//	pDevice->memaddr = pci_resource_start(pcid,1);
#endif

    cis_addr = pci_resource_start(pcid,2);

    pDevice->pcid = pcid;

    pci_read_config_byte(pcid, PCI_REG_COMMAND, &b);
    pci_write_config_byte(pcid, PCI_REG_COMMAND, (b|COMMAND_BUSM));

#ifdef	PLICE_DEBUG
   	//pci_read_config_word(pcid,PCI_REG_MAX_LAT,&max_lat);
	//printk("max lat is %x,SubSystemID is %x\n",max_lat,pDevice->SubSystemID);
	//for (ii=0;ii<0xFF;ii++)
	//pci_read_config_word(pcid,PCI_REG_MAX_LAT,&max_lat);
	//max_lat  = 0x20;
	//pci_write_config_word(pcid,PCI_REG_MAX_LAT,max_lat);
	//pci_read_config_word(pcid,PCI_REG_MAX_LAT,&max_lat);
	//printk("max lat is %x\n",max_lat);

	for (ii=0;ii<0xFF;ii++)
	{
		pci_read_config_byte(pcid,ii,&value);
		pci_config[ii] = value;
	}
	for (ii=0,j=1;ii<0x100;ii++,j++)
	{
		if (j %16 == 0)
		{
			printk("%x:",pci_config[ii]);
			printk("\n");
		}
		else
		{
			printk("%x:",pci_config[ii]);
		}
	}
#endif
    return TRUE;
}

static void device_free_info(PSDevice pDevice) {
    PSDevice         ptr;
    struct net_device*  dev=pDevice->dev;

    ASSERT(pDevice);
//2008-0714-01<Add>by chester
device_release_WPADEV(pDevice);

//2008-07-21-01<Add>by MikeLiu
//unregister wpadev
   if(wpa_set_wpadev(pDevice, 0)!=0)
     printk("unregister wpadev fail?\n");

    if (pDevice_Infos==NULL)
        return;

    for (ptr=pDevice_Infos;ptr && (ptr!=pDevice);ptr=ptr->next)
            do {} while (0);

    if (ptr==pDevice) {
        if (ptr==pDevice_Infos)
            pDevice_Infos=ptr->next;
        else
            ptr->prev->next=ptr->next;
    }
    else {
        DEVICE_PRT(MSG_LEVEL_ERR, KERN_ERR "info struct not found\n");
        return;
    }
#ifdef HOSTAP
    if (dev)
        hostap_set_hostapd(pDevice, 0, 0);
#endif
    if (dev)
        unregister_netdev(dev);

    if (pDevice->PortOffset)
        iounmap((PVOID)pDevice->PortOffset);

    if (pDevice->pcid)
        pci_release_regions(pDevice->pcid);
    if (dev)
        free_netdev(dev);

    if (pDevice->pcid) {
        pci_set_drvdata(pDevice->pcid,NULL);
    }
}
#endif// ifndef PRIVATE_OBJ

static BOOL device_init_rings(PSDevice pDevice) {
    void*   vir_pool;


    /*allocate all RD/TD rings a single pool*/
    vir_pool = pci_alloc_consistent(pDevice->pcid,
                    pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
                    pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
                    pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
                    pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
                    &pDevice->pool_dma);

    if (vir_pool == NULL) {
        DEVICE_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate desc dma memory failed\n", pDevice->dev->name);
        return FALSE;
    }

    memset(vir_pool, 0,
            pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
            pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
            pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
            pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc)
          );

    pDevice->aRD0Ring = vir_pool;
    pDevice->aRD1Ring = vir_pool +
                        pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);


    pDevice->rd0_pool_dma = pDevice->pool_dma;
    pDevice->rd1_pool_dma = pDevice->rd0_pool_dma +
                            pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);

    pDevice->tx0_bufs = pci_alloc_consistent(pDevice->pcid,
                    pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
                    pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
                    CB_BEACON_BUF_SIZE +
                    CB_MAX_BUF_SIZE,
                    &pDevice->tx_bufs_dma0);

    if (pDevice->tx0_bufs == NULL) {
        DEVICE_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: allocate buf dma memory failed\n", pDevice->dev->name);
        pci_free_consistent(pDevice->pcid,
            pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
            pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
            pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
            pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
            vir_pool, pDevice->pool_dma
            );
        return FALSE;
    }

    memset(pDevice->tx0_bufs, 0,
           pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
           pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
           CB_BEACON_BUF_SIZE +
           CB_MAX_BUF_SIZE
          );

    pDevice->td0_pool_dma = pDevice->rd1_pool_dma +
            pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);

    pDevice->td1_pool_dma = pDevice->td0_pool_dma +
            pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);


    // vir_pool: pvoid type
    pDevice->apTD0Rings = vir_pool
                          + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
                          + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);

    pDevice->apTD1Rings = vir_pool
            + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
            + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc)
            + pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);


    pDevice->tx1_bufs = pDevice->tx0_bufs +
            pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;


    pDevice->tx_beacon_bufs = pDevice->tx1_bufs +
            pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;

    pDevice->pbyTmpBuff = pDevice->tx_beacon_bufs +
            CB_BEACON_BUF_SIZE;

    pDevice->tx_bufs_dma1 = pDevice->tx_bufs_dma0 +
            pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;


    pDevice->tx_beacon_dma = pDevice->tx_bufs_dma1 +
            pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;


    return TRUE;
}

static void device_free_rings(PSDevice pDevice) {

    pci_free_consistent(pDevice->pcid,
            pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
            pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
            pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
            pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc)
            ,
            pDevice->aRD0Ring, pDevice->pool_dma
        );

    if (pDevice->tx0_bufs)
        pci_free_consistent(pDevice->pcid,
           pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
           pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
           CB_BEACON_BUF_SIZE +
           CB_MAX_BUF_SIZE,
           pDevice->tx0_bufs, pDevice->tx_bufs_dma0
        );
}

static void device_init_rd0_ring(PSDevice pDevice) {
    int i;
    dma_addr_t      curr = pDevice->rd0_pool_dma;
    PSRxDesc        pDesc;

    /* Init the RD0 ring entries */
    for (i = 0; i < pDevice->sOpts.nRxDescs0; i ++, curr += sizeof(SRxDesc)) {
        pDesc = &(pDevice->aRD0Ring[i]);
        pDesc->pRDInfo = alloc_rd_info();
        ASSERT(pDesc->pRDInfo);
        if (!device_alloc_rx_buf(pDevice, pDesc)) {
            DEVICE_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc rx bufs\n",
            pDevice->dev->name);
        }
        pDesc->next = &(pDevice->aRD0Ring[(i+1) % pDevice->sOpts.nRxDescs0]);
        pDesc->pRDInfo->curr_desc = cpu_to_le32(curr);
        pDesc->next_desc = cpu_to_le32(curr + sizeof(SRxDesc));
    }

    pDevice->aRD0Ring[i-1].next_desc = cpu_to_le32(pDevice->rd0_pool_dma);
    pDevice->pCurrRD[0] = &(pDevice->aRD0Ring[0]);
}


static void device_init_rd1_ring(PSDevice pDevice) {
    int i;
    dma_addr_t      curr = pDevice->rd1_pool_dma;
    PSRxDesc        pDesc;

    /* Init the RD1 ring entries */
    for (i = 0; i < pDevice->sOpts.nRxDescs1; i ++, curr += sizeof(SRxDesc)) {
        pDesc = &(pDevice->aRD1Ring[i]);
        pDesc->pRDInfo = alloc_rd_info();
        ASSERT(pDesc->pRDInfo);
        if (!device_alloc_rx_buf(pDevice, pDesc)) {
            DEVICE_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc rx bufs\n",
            pDevice->dev->name);
        }
        pDesc->next = &(pDevice->aRD1Ring[(i+1) % pDevice->sOpts.nRxDescs1]);
        pDesc->pRDInfo->curr_desc = cpu_to_le32(curr);
        pDesc->next_desc = cpu_to_le32(curr + sizeof(SRxDesc));
    }

    pDevice->aRD1Ring[i-1].next_desc = cpu_to_le32(pDevice->rd1_pool_dma);
    pDevice->pCurrRD[1] = &(pDevice->aRD1Ring[0]);
}


static void device_init_defrag_cb(PSDevice pDevice) {
    int i;
    PSDeFragControlBlock pDeF;

    /* Init the fragment ctl entries */
    for (i = 0; i < CB_MAX_RX_FRAG; i++) {
        pDeF = &(pDevice->sRxDFCB[i]);
        if (!device_alloc_frag_buf(pDevice, pDeF)) {
            DEVICE_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
                pDevice->dev->name);
        };
    }
    pDevice->cbDFCB = CB_MAX_RX_FRAG;
    pDevice->cbFreeDFCB = pDevice->cbDFCB;
}




static void device_free_rd0_ring(PSDevice pDevice) {
    int i;

    for (i = 0; i < pDevice->sOpts.nRxDescs0; i++) {
        PSRxDesc        pDesc =&(pDevice->aRD0Ring[i]);
        PDEVICE_RD_INFO  pRDInfo =pDesc->pRDInfo;

        pci_unmap_single(pDevice->pcid,pRDInfo->skb_dma,
           pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);

        dev_kfree_skb(pRDInfo->skb);

        kfree((PVOID)pDesc->pRDInfo);
    }

}

static void device_free_rd1_ring(PSDevice pDevice) {
    int i;


    for (i = 0; i < pDevice->sOpts.nRxDescs1; i++) {
        PSRxDesc        pDesc=&(pDevice->aRD1Ring[i]);
        PDEVICE_RD_INFO  pRDInfo=pDesc->pRDInfo;

        pci_unmap_single(pDevice->pcid,pRDInfo->skb_dma,
           pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);

        dev_kfree_skb(pRDInfo->skb);

        kfree((PVOID)pDesc->pRDInfo);
    }

}

static void device_free_frag_buf(PSDevice pDevice) {
    PSDeFragControlBlock pDeF;
    int i;

    for (i = 0; i < CB_MAX_RX_FRAG; i++) {

        pDeF = &(pDevice->sRxDFCB[i]);

        if (pDeF->skb)
            dev_kfree_skb(pDeF->skb);

    }

}

static void device_init_td0_ring(PSDevice pDevice) {
    int i;
    dma_addr_t  curr;
    PSTxDesc        pDesc;

    curr = pDevice->td0_pool_dma;
    for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++, curr += sizeof(STxDesc)) {
        pDesc = &(pDevice->apTD0Rings[i]);
        pDesc->pTDInfo = alloc_td_info();
        ASSERT(pDesc->pTDInfo);
        if (pDevice->flags & DEVICE_FLAGS_TX_ALIGN) {
            pDesc->pTDInfo->buf = pDevice->tx0_bufs + (i)*PKT_BUF_SZ;
            pDesc->pTDInfo->buf_dma = pDevice->tx_bufs_dma0 + (i)*PKT_BUF_SZ;
        }
        pDesc->next =&(pDevice->apTD0Rings[(i+1) % pDevice->sOpts.nTxDescs[0]]);
        pDesc->pTDInfo->curr_desc = cpu_to_le32(curr);
        pDesc->next_desc = cpu_to_le32(curr+sizeof(STxDesc));
    }

    pDevice->apTD0Rings[i-1].next_desc = cpu_to_le32(pDevice->td0_pool_dma);
    pDevice->apTailTD[0] = pDevice->apCurrTD[0] =&(pDevice->apTD0Rings[0]);

}

static void device_init_td1_ring(PSDevice pDevice) {
    int i;
    dma_addr_t  curr;
    PSTxDesc    pDesc;

    /* Init the TD ring entries */
    curr=pDevice->td1_pool_dma;
    for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++, curr+=sizeof(STxDesc)) {
        pDesc=&(pDevice->apTD1Rings[i]);
        pDesc->pTDInfo = alloc_td_info();
        ASSERT(pDesc->pTDInfo);
        if (pDevice->flags & DEVICE_FLAGS_TX_ALIGN) {
            pDesc->pTDInfo->buf=pDevice->tx1_bufs+(i)*PKT_BUF_SZ;
            pDesc->pTDInfo->buf_dma=pDevice->tx_bufs_dma1+(i)*PKT_BUF_SZ;
        }
        pDesc->next=&(pDevice->apTD1Rings[(i+1) % pDevice->sOpts.nTxDescs[1]]);
        pDesc->pTDInfo->curr_desc = cpu_to_le32(curr);
        pDesc->next_desc = cpu_to_le32(curr+sizeof(STxDesc));
    }

    pDevice->apTD1Rings[i-1].next_desc = cpu_to_le32(pDevice->td1_pool_dma);
    pDevice->apTailTD[1] = pDevice->apCurrTD[1] = &(pDevice->apTD1Rings[0]);
}



static void device_free_td0_ring(PSDevice pDevice) {
    int i;
    for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++) {
        PSTxDesc        pDesc=&(pDevice->apTD0Rings[i]);
        PDEVICE_TD_INFO  pTDInfo=pDesc->pTDInfo;

        if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma))
            pci_unmap_single(pDevice->pcid,pTDInfo->skb_dma,
               pTDInfo->skb->len, PCI_DMA_TODEVICE);

        if (pTDInfo->skb)
            dev_kfree_skb(pTDInfo->skb);

        kfree((PVOID)pDesc->pTDInfo);
    }
}

static void device_free_td1_ring(PSDevice pDevice) {
    int i;

    for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++) {
        PSTxDesc        pDesc=&(pDevice->apTD1Rings[i]);
        PDEVICE_TD_INFO  pTDInfo=pDesc->pTDInfo;

        if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma))
            pci_unmap_single(pDevice->pcid, pTDInfo->skb_dma,
               pTDInfo->skb->len, PCI_DMA_TODEVICE);

        if (pTDInfo->skb)
            dev_kfree_skb(pTDInfo->skb);

        kfree((PVOID)pDesc->pTDInfo);
    }

}



/*-----------------------------------------------------------------*/

static int device_rx_srv(PSDevice pDevice, UINT uIdx) {
    PSRxDesc    pRD;
    int works = 0;


    for (pRD = pDevice->pCurrRD[uIdx];
         pRD->m_rd0RD0.f1Owner == OWNED_BY_HOST;
         pRD = pRD->next) {
//        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->pCurrRD = %x, works = %d\n", pRD, works);
        if (works++>15)
            break;
        if (device_receive_frame(pDevice, pRD)) {
            if (!device_alloc_rx_buf(pDevice,pRD)) {
                    DEVICE_PRT(MSG_LEVEL_ERR, KERN_ERR
                    "%s: can not allocate rx buf\n", pDevice->dev->name);
                    break;
            }
        }
        pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
#ifdef PRIVATE_OBJ
        ref_set_rx_jiffies(pDevice->dev);
#else
        pDevice->dev->last_rx = jiffies;
#endif
    }

    pDevice->pCurrRD[uIdx]=pRD;

    return works;
}


static BOOL device_alloc_rx_buf(PSDevice pDevice, PSRxDesc pRD) {

    PDEVICE_RD_INFO pRDInfo=pRD->pRDInfo;

#ifdef PRIVATE_OBJ

    pRDInfo->skb=dev_alloc_skb(pDevice->rx_buf_sz);
    if (pRDInfo->skb==NULL)
        return FALSE;
    ref_skb_remap(pDevice->dev, &(pRDInfo->ref_skb), pRDInfo->skb);
    pRDInfo->skb_dma = pci_map_single(pDevice->pcid, pRDInfo->ref_skb.tail, pDevice->rx_buf_sz,
                        PCI_DMA_FROMDEVICE);
#else

    pRDInfo->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
#ifdef	PLICE_DEBUG
	//printk("device_alloc_rx_buf:skb is %x\n",pRDInfo->skb);
#endif
    if (pRDInfo->skb==NULL)
        return FALSE;
    ASSERT(pRDInfo->skb);
    pRDInfo->skb->dev = pDevice->dev;
    pRDInfo->skb_dma = pci_map_single(pDevice->pcid, pRDInfo->skb->tail, pDevice->rx_buf_sz,
                        PCI_DMA_FROMDEVICE);
#endif
    *((PU32) &(pRD->m_rd0RD0)) = 0;

    pRD->m_rd0RD0.wResCount = cpu_to_le16(pDevice->rx_buf_sz);
    pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
    pRD->m_rd1RD1.wReqCount = cpu_to_le16(pDevice->rx_buf_sz);
    pRD->buff_addr = cpu_to_le32(pRDInfo->skb_dma);

    return TRUE;
}



BOOL device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {

#ifdef PRIVATE_OBJ

    pDeF->skb=dev_alloc_skb(pDevice->rx_buf_sz);
    if (pDeF->skb==NULL)
        return FALSE;
    ref_skb_remap(pDevice->dev, &(pDeF->ref_skb), pDeF->skb);

#else
    pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
    if (pDeF->skb == NULL)
        return FALSE;
    ASSERT(pDeF->skb);
    pDeF->skb->dev = pDevice->dev;
#endif

    return TRUE;
}



static int device_tx_srv(PSDevice pDevice, UINT uIdx) {
    PSTxDesc                 pTD;
    BOOL                     bFull=FALSE;
    int                      works = 0;
    BYTE                     byTsr0;
    BYTE                     byTsr1;
    UINT                     uFrameSize, uFIFOHeaderSize;
    PSTxBufHead              pTxBufHead;
    struct net_device_stats* pStats = &pDevice->stats;
    struct sk_buff*          skb;
    UINT                     uNodeIndex;
    PSMgmtObject             pMgmt = pDevice->pMgmt;
#ifdef PRIVATE_OBJ
    ref_sk_buff              ref_skb;
#endif


    for (pTD = pDevice->apTailTD[uIdx]; pDevice->iTDUsed[uIdx] >0; pTD = pTD->next) {

        if (pTD->m_td0TD0.f1Owner == OWNED_BY_NIC)
            break;
        if (works++>15)
            break;

        byTsr0 = pTD->m_td0TD0.byTSR0;
        byTsr1 = pTD->m_td0TD0.byTSR1;

        //Only the status of first TD in the chain is correct
        if (pTD->m_td1TD1.byTCR & TCR_STP) {

            if ((pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0) {
                uFIFOHeaderSize = pTD->pTDInfo->dwHeaderLength;
                uFrameSize = pTD->pTDInfo->dwReqCount - uFIFOHeaderSize;
                pTxBufHead = (PSTxBufHead) (pTD->pTDInfo->buf);
#ifdef PRIVATE_OBJ
                ref_skb_remap(pDevice->dev, &ref_skb, pTD->pTDInfo->skb);
#endif
                // Update the statistics based on the Transmit status
                // now, we DO'NT check TSR0_CDH

                STAvUpdateTDStatCounter(&pDevice->scStatistic,
                        byTsr0, byTsr1,
                        (PBYTE)(pTD->pTDInfo->buf + uFIFOHeaderSize),
                        uFrameSize, uIdx);


                BSSvUpdateNodeTxCounter(pDevice,
                         byTsr0, byTsr1,
                         (PBYTE)(pTD->pTDInfo->buf),
                         uFIFOHeaderSize
                         );

                if (BITbIsBitOff(byTsr1, TSR1_TERR)) {
                    if (byTsr0 != 0) {
                        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X].\n",
                           (INT)uIdx, byTsr1, byTsr0);
                    }
                    if ((pTxBufHead->wFragCtl & FRAGCTL_ENDFRAG) != FRAGCTL_NONFRAG) {
                        pDevice->s802_11Counter.TransmittedFragmentCount ++;
                    }
                    pStats->tx_packets++;
#ifdef PRIVATE_OBJ
                    pStats->tx_bytes += *(ref_skb.len);
#else
                    pStats->tx_bytes += pTD->pTDInfo->skb->len;
#endif
                }
                else {
                     DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] dropped & tsr1[%02X] tsr0[%02X].\n",
                           (INT)uIdx, byTsr1, byTsr0);
                    pStats->tx_errors++;
                    pStats->tx_dropped++;
                }
            }

            if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
                if (pDevice->bEnableHostapd) {
                    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "tx call back netif.. \n");
#ifdef PRIVATE_OBJ
                    ref_skb_remap(pDevice->apdev, &(ref_skb), pTD->pTDInfo->skb);
	                ref_skb.mac.raw = ref_skb.data;
	                *(ref_skb.pkt_type) = PACKET_OTHERHOST;
    	            //*(ref_skb.protocol) = htons(ETH_P_802_2);
	                memset(ref_skb.cb, 0, sizeof(ref_skb.cb));
	                netif_rx(ref_skb.skb);
#else
                    skb = pTD->pTDInfo->skb;
	                skb->dev = pDevice->apdev;
			        skb->mac_header = skb->data;
	                skb->pkt_type = PACKET_OTHERHOST;
    	            //skb->protocol = htons(ETH_P_802_2);
	                memset(skb->cb, 0, sizeof(skb->cb));
	                netif_rx(skb);
#endif
	            }
            }

            if (BITbIsBitOn(byTsr1, TSR1_TERR)) {
            if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
                DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X].\n",
                          (INT)uIdx, byTsr1, byTsr0);
            }

//                DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X].\n",
//                          (INT)uIdx, byTsr1, byTsr0);

                if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
                    (pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB)) {
                    WORD    wAID;
                    BYTE    byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};

                    skb = pTD->pTDInfo->skb;
                    if (BSSDBbIsSTAInNodeDB(pMgmt, (PBYTE)(skb->data), &uNodeIndex)) {
                        if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
                            skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
                            pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
                            // set tx map
                            wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
                            pMgmt->abyPSTxMap[wAID >> 3] |=  byMask[wAID & 7];
                            pTD->pTDInfo->byFlags &= ~(TD_FLAGS_NETIF_SKB);
                            DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "tx_srv:tx fail re-queue sta index= %d, QueCnt= %d\n"
                                    ,(INT)uNodeIndex, pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt);
                            pStats->tx_errors--;
                            pStats->tx_dropped--;
                        }
                    }
                }
            }
            device_free_tx_buf(pDevice,pTD);
            pDevice->iTDUsed[uIdx]--;
        }
    }


    if (uIdx == TYPE_AC0DMA) {
        // RESERV_AC0DMA reserved for relay

        if (AVAIL_TD(pDevice, uIdx) < RESERV_AC0DMA) {
            bFull = TRUE;
            DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " AC0DMA is Full = %d\n", pDevice->iTDUsed[uIdx]);
        }
        if (netif_queue_stopped(pDevice->dev) && (bFull==FALSE)){
            netif_wake_queue(pDevice->dev);
        }
    }


    pDevice->apTailTD[uIdx] = pTD;

    return works;
}


static void device_error(PSDevice pDevice, WORD status) {

    if (status & ISR_FETALERR) {
        DEVICE_PRT(MSG_LEVEL_ERR, KERN_ERR
            "%s: Hardware fatal error.\n",
            pDevice->dev->name);
        netif_stop_queue(pDevice->dev);
        del_timer(&pDevice->sTimerCommand);
        del_timer(&(pDevice->pMgmt->sTimerSecondCallback));
        pDevice->bCmdRunning = FALSE;
        MACbShutdown(pDevice->PortOffset);
        return;
    }

}

static void device_free_tx_buf(PSDevice pDevice, PSTxDesc pDesc) {
    PDEVICE_TD_INFO  pTDInfo=pDesc->pTDInfo;
    struct sk_buff* skb=pTDInfo->skb;

    // pre-allocated buf_dma can't be unmapped.
    if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma)) {
        pci_unmap_single(pDevice->pcid,pTDInfo->skb_dma,skb->len,
              PCI_DMA_TODEVICE);
    }

    if ((pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0)
        dev_kfree_skb_irq(skb);

    pTDInfo->skb_dma = 0;
    pTDInfo->skb = 0;
    pTDInfo->byFlags = 0;
}



//PLICE_DEBUG ->
VOID	InitRxManagementQueue(PSDevice  pDevice)
{
	pDevice->rxManeQueue.packet_num = 0;
	pDevice->rxManeQueue.head = pDevice->rxManeQueue.tail = 0;
}
//PLICE_DEBUG<-





//PLICE_DEBUG ->
INT MlmeThread(
     void * Context)
{
	PSDevice	pDevice =  (PSDevice) Context;
	PSRxMgmtPacket			pRxMgmtPacket;
	// int i ;
	//complete(&pDevice->notify);
//printk("Enter MngWorkItem,Queue packet num is %d\n",pDevice->rxManeQueue.packet_num);

	//printk("Enter MlmeThread,packet _num is %d\n",pDevice->rxManeQueue.packet_num);
	//i = 0;
#if 1
	while (1)
	{

	//printk("DDDD\n");
	//down(&pDevice->mlme_semaphore);
        // pRxMgmtPacket =  DeQueue(pDevice);
#if 1
		spin_lock_irq(&pDevice->lock);
		 while(pDevice->rxManeQueue.packet_num != 0)
	 	{
			 pRxMgmtPacket =  DeQueue(pDevice);
        			//pDevice;
        			//DequeueManageObject(pDevice->FirstRecvMngList, pDevice->LastRecvMngList);
			vMgrRxManagePacket(pDevice, pDevice->pMgmt, pRxMgmtPacket);
			//printk("packet_num is %d\n",pDevice->rxManeQueue.packet_num);

		 }
		spin_unlock_irq(&pDevice->lock);
		if (mlme_kill == 0)
		break;
		//udelay(200);
#endif
	//printk("Before schedule thread jiffies is %x\n",jiffies);
	schedule();
	//printk("after schedule thread jiffies is %x\n",jiffies);
	if (mlme_kill == 0)
		break;
	//printk("i is %d\n",i);
	}

#endif
	return 0;

}


#ifdef PRIVATE_OBJ

int __device_open(HANDLE pExDevice) {
    PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
    PSDevice    pDevice = (PSDevice)(pDevice_info->pWDevice);

#else

static int  device_open(struct net_device *dev) {
    PSDevice    pDevice=(PSDevice) netdev_priv(dev);
    int i;
#endif
    pDevice->rx_buf_sz = PKT_BUF_SZ;
    if (!device_init_rings(pDevice)) {
        return -ENOMEM;
    }
//2008-5-13 <add> by chester
#ifndef PRIVATE_OBJ
    i=request_irq(pDevice->pcid->irq, &device_intr, IRQF_SHARED, dev->name, dev);
    if (i)
        return i;
#endif
	//printk("DEBUG1\n");
#ifdef WPA_SM_Transtatus
     extern SWPAResult wpa_Result;
     memset(wpa_Result.ifname,0,sizeof(wpa_Result.ifname));
     wpa_Result.proto = 0;
     wpa_Result.key_mgmt = 0;
     wpa_Result.eap_type = 0;
     wpa_Result.authenticated = FALSE;
     pDevice->fWPA_Authened = FALSE;
#endif
DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call device init rd0 ring\n");
device_init_rd0_ring(pDevice);
    device_init_rd1_ring(pDevice);
    device_init_defrag_cb(pDevice);
    device_init_td0_ring(pDevice);
    device_init_td1_ring(pDevice);
//    VNTWIFIvSet11h(pDevice->pMgmt, pDevice->b11hEnable);


    if (pDevice->bDiversityRegCtlON) {
        device_init_diversity_timer(pDevice);
    }
    vMgrObjectInit(pDevice);
    vMgrTimerInit(pDevice);

//PLICE_DEBUG->
#ifdef	TASK_LET
	tasklet_init (&pDevice->RxMngWorkItem,(void *)MngWorkItem,(unsigned long )pDevice);
#endif
#ifdef	THREAD
	InitRxManagementQueue(pDevice);
	mlme_kill = 0;
	mlme_task = kthread_run(MlmeThread,(void *) pDevice, "MLME");
	if (IS_ERR(mlme_task)) {
		printk("thread create fail\n");
		return -1;
	}

	mlme_kill = 1;
#endif



#if 0
	pDevice->MLMEThr_pid = kernel_thread(MlmeThread, pDevice, CLONE_VM);
	if (pDevice->MLMEThr_pid <0 )
	{
		printk("unable start thread MlmeThread\n");
		return -1;
	}
#endif

	//printk("thread id is %d\n",pDevice->MLMEThr_pid);
	//printk("Create thread time is %x\n",jiffies);
	//wait_for_completion(&pDevice->notify);




  // if (( SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RADIOCTL)&0x06)==0x04)
    //    return -ENOMEM;
DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call device_init_registers\n");
	device_init_registers(pDevice, DEVICE_INIT_COLD);
    MACvReadEtherAddress(pDevice->PortOffset, pDevice->abyCurrentNetAddr);
    memcpy(pDevice->pMgmt->abyMACAddr, pDevice->abyCurrentNetAddr, U_ETHER_ADDR_LEN);
#ifdef PRIVATE_OBJ
    __device_set_multi(pExDevice);
#else
    device_set_multi(pDevice->dev);
#endif

    // Init for Key Management
    KeyvInitTable(&pDevice->sKey, pDevice->PortOffset);
    add_timer(&(pDevice->pMgmt->sTimerSecondCallback));

	#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
	/*
     pDevice->bwextstep0 = FALSE;
     pDevice->bwextstep1 = FALSE;
     pDevice->bwextstep2 = FALSE;
     pDevice->bwextstep3 = FALSE;
     */
       pDevice->bwextcount=0;
     pDevice->bWPASuppWextEnabled = FALSE;
#endif
    pDevice->byReAssocCount = 0;
   pDevice->bWPADEVUp = FALSE;
    // Patch: if WEP key already set by iwconfig but device not yet open
    if ((pDevice->bEncryptionEnable == TRUE) && (pDevice->bTransmitKey == TRUE)) {
        KeybSetDefaultKey(&(pDevice->sKey),
                            (DWORD)(pDevice->byKeyIndex | (1 << 31)),
                            pDevice->uKeyLength,
                            NULL,
                            pDevice->abyKey,
                            KEY_CTL_WEP,
                            pDevice->PortOffset,
                            pDevice->byLocalID
                          );
         pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
    }

//printk("DEBUG2\n");


DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call MACvIntEnable\n");
	MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);

    if (pDevice->pMgmt->eConfigMode == WMAC_CONFIG_AP) {
        bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RUN_AP, NULL);
	}
	else {
        bScheduleCommand((HANDLE)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
        bScheduleCommand((HANDLE)pDevice, WLAN_CMD_SSID, NULL);
    }
    pDevice->flags |=DEVICE_FLAGS_OPENED;

    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
    return 0;
}


#ifdef PRIVATE_OBJ

int  __device_close(HANDLE pExDevice) {
    PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
    struct net_device *dev = pDevice_info->dev;
    PSDevice    pDevice = (PSDevice)(pDevice_info->pWDevice);

#else
static int  device_close(struct net_device *dev) {
    PSDevice  pDevice=(PSDevice) netdev_priv(dev);
#endif
    PSMgmtObject     pMgmt = pDevice->pMgmt;
 //PLICE_DEBUG->
#ifdef	THREAD
	mlme_kill = 0;
#endif
//PLICE_DEBUG<-
//2007-1121-02<Add>by EinsnLiu
    if (pDevice->bLinkPass) {
	bScheduleCommand((HANDLE)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
        mdelay(30);
    }
#ifdef TxInSleep
    del_timer(&pDevice->sTimerTxData);
#endif
    del_timer(&pDevice->sTimerCommand);
    del_timer(&pMgmt->sTimerSecondCallback);
    if (pDevice->bDiversityRegCtlON) {
        del_timer(&pDevice->TimerSQ3Tmax1);
        del_timer(&pDevice->TimerSQ3Tmax2);
        del_timer(&pDevice->TimerSQ3Tmax3);
    }

#ifdef	TASK_LET
	tasklet_kill(&pDevice->RxMngWorkItem);
#endif
     netif_stop_queue(dev);
    pDevice->bCmdRunning = FALSE;
    MACbShutdown(pDevice->PortOffset);
    MACbSoftwareReset(pDevice->PortOffset);
    CARDbRadioPowerOff(pDevice);

    pDevice->bLinkPass = FALSE;
    memset(pMgmt->abyCurrBSSID, 0, 6);
    pMgmt->eCurrState = WMAC_STATE_IDLE;
    device_free_td0_ring(pDevice);
    device_free_td1_ring(pDevice);
    device_free_rd0_ring(pDevice);
    device_free_rd1_ring(pDevice);
    device_free_frag_buf(pDevice);
    device_free_rings(pDevice);
    BSSvClearNodeDBTable(pDevice, 0);
    free_irq(dev->irq, dev);
    pDevice->flags &=(~DEVICE_FLAGS_OPENED);
	//2008-0714-01<Add>by chester
device_release_WPADEV(pDevice);
//PLICE_DEBUG->
	//tasklet_kill(&pDevice->RxMngWorkItem);
//PLICE_DEBUG<-
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close.. \n");
    return 0;
}

#ifdef PRIVATE_OBJ

int  __device_dma0_tx_80211(HANDLE pExDevice, struct sk_buff *skb) {
    PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
    PSDevice    pDevice = (PSDevice)(pDevice_info->pWDevice);
    ref_sk_buff     ref_skb;

#else


static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev) {
    PSDevice        pDevice=netdev_priv(dev);
#endif
    PBYTE           pbMPDU;
    UINT            cbMPDULen = 0;


    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211\n");
    spin_lock_irq(&pDevice->lock);

    if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211, td0 <=0\n");
        dev_kfree_skb_irq(skb);
        spin_unlock_irq(&pDevice->lock);
        return 0;
    }

    if (pDevice->bStopTx0Pkt == TRUE) {
        dev_kfree_skb_irq(skb);
        spin_unlock_irq(&pDevice->lock);
        return 0;
    };

#ifdef PRIVATE_OBJ
    ref_skb_remap(pDevice->dev, &ref_skb, skb);
    cbMPDULen = *(ref_skb.len);
    pbMPDU = ref_skb.data;
#else
    cbMPDULen = skb->len;
    pbMPDU = skb->data;
#endif

    vDMA0_tx_80211(pDevice, skb, pbMPDU, cbMPDULen);

    spin_unlock_irq(&pDevice->lock);

    return 0;

}



BOOL device_dma0_xmit(PSDevice pDevice, struct sk_buff *skb, UINT uNodeIndex) {
    PSMgmtObject    pMgmt = pDevice->pMgmt;
    PSTxDesc        pHeadTD, pLastTD;
    UINT            cbFrameBodySize;
    UINT            uMACfragNum;
    BYTE            byPktTyp;
    BOOL            bNeedEncryption = FALSE;
    PSKeyItem       pTransmitKey = NULL;
    UINT            cbHeaderSize;
    UINT            ii;
    SKeyItem        STempKey;
//    BYTE            byKeyIndex = 0;
#ifdef PRIVATE_OBJ
    ref_sk_buff     ref_skb;
#endif


    if (pDevice->bStopTx0Pkt == TRUE) {
        dev_kfree_skb_irq(skb);
        return FALSE;
    };

    if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
        dev_kfree_skb_irq(skb);
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_xmit, td0 <=0\n");
        return FALSE;
    }

    if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
        if (pDevice->uAssocCount == 0) {
            dev_kfree_skb_irq(skb);
            DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_xmit, assocCount = 0\n");
            return FALSE;
        }
    }

#ifdef PRIVATE_OBJ
    ref_skb_remap(pDevice->dev, &(ref_skb), skb);
#endif
    pHeadTD = pDevice->apCurrTD[TYPE_TXDMA0];

    pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP);

#ifdef PRIVATE_OBJ
    memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)(ref_skb.data), U_HEADER_LEN);
    cbFrameBodySize = *(ref_skb.len) - U_HEADER_LEN;

#else
    memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)(skb->data), U_HEADER_LEN);
    cbFrameBodySize = skb->len - U_HEADER_LEN;
#endif

    // 802.1H
    if (ntohs(pDevice->sTxEthHeader.wType) > MAX_DATA_LEN) {
        cbFrameBodySize += 8;
    }
    uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader);

    if ( uMACfragNum > AVAIL_TD(pDevice, TYPE_TXDMA0)) {
        dev_kfree_skb_irq(skb);
        return FALSE;
    }
    byPktTyp = (BYTE)pDevice->byPacketType;


    if (pDevice->bFixRate) {
        if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
            if (pDevice->uConnectionRate >= RATE_11M) {
                pDevice->wCurrentRate = RATE_11M;
            } else {
                pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
            }
        } else {
            if (pDevice->uConnectionRate >= RATE_54M)
                pDevice->wCurrentRate = RATE_54M;
            else
                pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
        }
    }
    else {
        pDevice->wCurrentRate = pDevice->pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
    }

    //preamble type
    if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
        pDevice->byPreambleType = pDevice->byShortPreamble;
    }
    else {
        pDevice->byPreambleType = PREAMBLE_LONG;
    }

    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dma0: pDevice->wCurrentRate = %d \n", pDevice->wCurrentRate);


    if (pDevice->wCurrentRate <= RATE_11M) {
        byPktTyp = PK_TYPE_11B;
    } else if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
        byPktTyp = PK_TYPE_11A;
    } else {
        if (pDevice->bProtectMode == TRUE) {
            byPktTyp = PK_TYPE_11GB;
        } else {
            byPktTyp = PK_TYPE_11GA;
        }
    }

    if (pDevice->bEncryptionEnable == TRUE)
        bNeedEncryption = TRUE;

    if (pDevice->bEnableHostWEP) {
        pTransmitKey = &STempKey;
        pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
        pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
        pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
        pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
        pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
        memcpy(pTransmitKey->abyKey,
            &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
            pTransmitKey->uKeyLength
            );
    }
    vGenerateFIFOHeader(pDevice, byPktTyp, pDevice->pbyTmpBuff, bNeedEncryption,
                        cbFrameBodySize, TYPE_TXDMA0, pHeadTD,
                        &pDevice->sTxEthHeader, (PBYTE)skb->data, pTransmitKey, uNodeIndex,
                        &uMACfragNum,
                        &cbHeaderSize
                        );

    if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
        // Disable PS
        MACbPSWakeup(pDevice->PortOffset);
    }

    pDevice->bPWBitOn = FALSE;

    pLastTD = pHeadTD;
    for (ii = 0; ii < uMACfragNum; ii++) {
        // Poll Transmit the adapter
        wmb();
        pHeadTD->m_td0TD0.f1Owner=OWNED_BY_NIC;
        wmb();
        if (ii == (uMACfragNum - 1))
            pLastTD = pHeadTD;
        pHeadTD = pHeadTD->next;
    }

    // Save the information needed by the tx interrupt handler
    // to complete the Send request
    pLastTD->pTDInfo->skb = skb;
    pLastTD->pTDInfo->byFlags = 0;
    pLastTD->pTDInfo->byFlags |= TD_FLAGS_NETIF_SKB;

    pDevice->apCurrTD[TYPE_TXDMA0] = pHeadTD;

    MACvTransmit0(pDevice->PortOffset);


    return TRUE;
}

//TYPE_AC0DMA data tx
#ifdef PRIVATE_OBJ

int  __device_xmit(HANDLE pExDevice, struct sk_buff *skb) {
    PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
    PSDevice    pDevice = (PSDevice)(pDevice_info->pWDevice);
    struct net_device *dev = pDevice_info->dev;
    ref_sk_buff     ref_skb;

#else
static int  device_xmit(struct sk_buff *skb, struct net_device *dev) {
    PSDevice pDevice=netdev_priv(dev);

#endif
    PSMgmtObject    pMgmt = pDevice->pMgmt;
    PSTxDesc        pHeadTD, pLastTD;
    UINT            uNodeIndex = 0;
    BYTE            byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
    WORD            wAID;
    UINT            uMACfragNum = 1;
    UINT            cbFrameBodySize;
    BYTE            byPktTyp;
    UINT            cbHeaderSize;
    BOOL            bNeedEncryption = FALSE;
    PSKeyItem       pTransmitKey = NULL;
    SKeyItem        STempKey;
    UINT            ii;
    BOOL            bTKIP_UseGTK = FALSE;
    BOOL            bNeedDeAuth = FALSE;
    PBYTE           pbyBSSID;
    BOOL            bNodeExist = FALSE;



    spin_lock_irq(&pDevice->lock);
    if (pDevice->bLinkPass == FALSE) {
        dev_kfree_skb_irq(skb);
        spin_unlock_irq(&pDevice->lock);
        return 0;
    }

    if (pDevice->bStopDataPkt) {
        dev_kfree_skb_irq(skb);
        spin_unlock_irq(&pDevice->lock);
        return 0;
    }

#ifdef PRIVATE_OBJ
    ref_skb_remap(pDevice->dev, &ref_skb, skb);
#endif

    if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
        if (pDevice->uAssocCount == 0) {
            dev_kfree_skb_irq(skb);
            spin_unlock_irq(&pDevice->lock);
            return 0;
        }
#ifdef PRIVATE_OBJ
        if (IS_MULTICAST_ADDRESS((PBYTE)(ref_skb.data))) {
#else
        if (IS_MULTICAST_ADDRESS((PBYTE)(skb->data))) {
#endif
            uNodeIndex = 0;
            bNodeExist = TRUE;
            if (pMgmt->sNodeDBTable[0].bPSEnable) {
#ifdef PRIVATE_OBJ
                skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), ref_skb.skb);
#else
                skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb);
#endif
                pMgmt->sNodeDBTable[0].wEnQueueCnt++;
                // set tx map
                pMgmt->abyPSTxMap[0] |= byMask[0];
                spin_unlock_irq(&pDevice->lock);
                return 0;
            }
}else {
#ifdef PRIVATE_OBJ
            if (BSSDBbIsSTAInNodeDB(pMgmt, (PBYTE)(ref_skb.data), &uNodeIndex)) {
#else
            if (BSSDBbIsSTAInNodeDB(pMgmt, (PBYTE)(skb->data), &uNodeIndex)) {
#endif
                if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
#ifdef PRIVATE_OBJ
                    skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, ref_skb.skb);
#else
                    skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
#endif
                    pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
                    // set tx map
                    wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
                    pMgmt->abyPSTxMap[wAID >> 3] |=  byMask[wAID & 7];
                    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set:pMgmt->abyPSTxMap[%d]= %d\n",
                             (wAID >> 3), pMgmt->abyPSTxMap[wAID >> 3]);
                    spin_unlock_irq(&pDevice->lock);
                    return 0;
                }

                if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
                    pDevice->byPreambleType = pDevice->byShortPreamble;

                }else {
                    pDevice->byPreambleType = PREAMBLE_LONG;
                }
                bNodeExist = TRUE;

            }
        }

        if (bNodeExist == FALSE) {
            DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Unknown STA not found in node DB \n");
            dev_kfree_skb_irq(skb);
            spin_unlock_irq(&pDevice->lock);
            return 0;
        }
    }

    pHeadTD = pDevice->apCurrTD[TYPE_AC0DMA];

    pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP);


#ifdef PRIVATE_OBJ
    memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)(ref_skb.data), U_HEADER_LEN);
    cbFrameBodySize = *(ref_skb.len) - U_HEADER_LEN;
#else
    memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)(skb->data), U_HEADER_LEN);
    cbFrameBodySize = skb->len - U_HEADER_LEN;
#endif
    // 802.1H
    if (ntohs(pDevice->sTxEthHeader.wType) > MAX_DATA_LEN) {
        cbFrameBodySize += 8;
    }


    if (pDevice->bEncryptionEnable == TRUE) {
        bNeedEncryption = TRUE;
        // get Transmit key
        do {
            if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
                (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
                pbyBSSID = pDevice->abyBSSID;
                // get pairwise key
                if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
                    // get group key
                    if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
                        bTKIP_UseGTK = TRUE;
                        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
                        break;
                    }
                } else {
                    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get PTK.\n");
                    break;
                }
            }else if (pDevice->pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {

                pbyBSSID = pDevice->sTxEthHeader.abyDstAddr;  //TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1
                DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS Serach Key: \n");
                for (ii = 0; ii< 6; ii++)
                    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"%x \n", *(pbyBSSID+ii));
                DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"\n");

                // get pairwise key
                if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == TRUE)
                    break;
            }
            // get group key
            pbyBSSID = pDevice->abyBroadcastAddr;
            if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
                pTransmitKey = NULL;
                if (pDevice->pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
                    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS and KEY is NULL. [%d]\n", pDevice->pMgmt->eCurrMode);
                }
                else
                    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"NOT IBSS and KEY is NULL. [%d]\n", pDevice->pMgmt->eCurrMode);
            } else {
                bTKIP_UseGTK = TRUE;
                DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
            }
        } while(FALSE);
    }

    if (pDevice->bEnableHostWEP) {
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"acdma0: STA index %d\n", uNodeIndex);
        if (pDevice->bEncryptionEnable == TRUE) {
            pTransmitKey = &STempKey;
            pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
            pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
            pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
            pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
            pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
            memcpy(pTransmitKey->abyKey,
                &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
                pTransmitKey->uKeyLength
                );
         }
    }

    uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader);

    if (uMACfragNum > AVAIL_TD(pDevice, TYPE_AC0DMA)) {
        DEVICE_PRT(MSG_LEVEL_ERR, KERN_DEBUG "uMACfragNum > AVAIL_TD(TYPE_AC0DMA) = %d\n", uMACfragNum);
        dev_kfree_skb_irq(skb);
        spin_unlock_irq(&pDevice->lock);
        return 0;
    }

    if (pTransmitKey != NULL) {
        if ((pTransmitKey->byCipherSuite == KEY_CTL_WEP) &&
            (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN)) {
            uMACfragNum = 1; //WEP256 doesn't support fragment
        }
    }

    byPktTyp = (BYTE)pDevice->byPacketType;

    if (pDevice->bFixRate) {
#ifdef	PLICE_DEBUG
	printk("Fix Rate: PhyType is %d,ConnectionRate is %d\n",pDevice->eCurrentPHYType,pDevice->uConnectionRate);
#endif

        if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
            if (pDevice->uConnectionRate >= RATE_11M) {
                pDevice->wCurrentRate = RATE_11M;
            } else {
                pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
            }
        } else {
            if ((pDevice->eCurrentPHYType == PHY_TYPE_11A) &&
                (pDevice->uConnectionRate <= RATE_6M)) {
                pDevice->wCurrentRate = RATE_6M;
            } else {
                if (pDevice->uConnectionRate >= RATE_54M)
                    pDevice->wCurrentRate = RATE_54M;
                else
                    pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;

            }
        }
        pDevice->byACKRate = (BYTE) pDevice->wCurrentRate;
        pDevice->byTopCCKBasicRate = RATE_1M;
        pDevice->byTopOFDMBasicRate = RATE_6M;
    }
    else {
        //auto rate
    if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
            if (pDevice->eCurrentPHYType != PHY_TYPE_11A) {
                pDevice->wCurrentRate = RATE_1M;
                pDevice->byACKRate = RATE_1M;
                pDevice->byTopCCKBasicRate = RATE_1M;
                pDevice->byTopOFDMBasicRate = RATE_6M;
            } else {
                pDevice->wCurrentRate = RATE_6M;
                pDevice->byACKRate = RATE_6M;
                pDevice->byTopCCKBasicRate = RATE_1M;
                pDevice->byTopOFDMBasicRate = RATE_6M;
            }
        }
        else {
		VNTWIFIvGetTxRate(  pDevice->pMgmt,
                                pDevice->sTxEthHeader.abyDstAddr,
                                &(pDevice->wCurrentRate),
                                &(pDevice->byACKRate),
                                &(pDevice->byTopCCKBasicRate),
                                &(pDevice->byTopOFDMBasicRate));

#if 0
printk("auto rate:Rate : %d,AckRate:%d,TopCCKRate:%d,TopOFDMRate:%d\n",
pDevice->wCurrentRate,pDevice->byACKRate,
pDevice->byTopCCKBasicRate,pDevice->byTopOFDMBasicRate);

#endif

#if 0

	pDevice->wCurrentRate = 11;
	pDevice->byACKRate = 8;
	pDevice->byTopCCKBasicRate = 3;
	pDevice->byTopOFDMBasicRate = 8;
#endif


		}
    }

//    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "acdma0: pDevice->wCurrentRate = %d \n", pDevice->wCurrentRate);

    if (pDevice->wCurrentRate <= RATE_11M) {
        byPktTyp = PK_TYPE_11B;
    } else if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
        byPktTyp = PK_TYPE_11A;
    } else {
        if (pDevice->bProtectMode == TRUE) {
            byPktTyp = PK_TYPE_11GB;
        } else {
            byPktTyp = PK_TYPE_11GA;
        }
    }

//#ifdef	PLICE_DEBUG
//	printk("FIX RATE:CurrentRate is %d");
//#endif

    if (bNeedEncryption == TRUE) {
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType));
        if ((pDevice->sTxEthHeader.wType) == TYPE_PKT_802_1x) {
            bNeedEncryption = FALSE;
            DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType));
            if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
                if (pTransmitKey == NULL) {
                    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Don't Find TX KEY\n");
                }
                else {
                    if (bTKIP_UseGTK == TRUE) {
                        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n");
                    }
                    else {
                        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
                        bNeedEncryption = TRUE;
                    }
                }
            }

            if (pDevice->byCntMeasure == 2) {
                bNeedDeAuth = TRUE;
                pDevice->s802_11Counter.TKIPCounterMeasuresInvoked++;
            }

            if (pDevice->bEnableHostWEP) {
                if ((uNodeIndex != 0) &&
                    (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) {
                    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
                    bNeedEncryption = TRUE;
                 }
             }
        }
        else {
            if (pTransmitKey == NULL) {
                DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n");
                dev_kfree_skb_irq(skb);
                spin_unlock_irq(&pDevice->lock);
                return 0;
            }
        }
    }


#ifdef PRIVATE_OBJ
    vGenerateFIFOHeader(pDevice, byPktTyp, pDevice->pbyTmpBuff, bNeedEncryption,
                        cbFrameBodySize, TYPE_AC0DMA, pHeadTD,
                        &pDevice->sTxEthHeader, (PBYTE)ref_skb.data, pTransmitKey, uNodeIndex,
                        &uMACfragNum,
                        &cbHeaderSize
                        );
#else
#ifdef	PLICE_DEBUG
	//if (skb->len == 98)
	//{
	//	printk("ping:len is %d\n");
	//}
#endif
    vGenerateFIFOHeader(pDevice, byPktTyp, pDevice->pbyTmpBuff, bNeedEncryption,
                        cbFrameBodySize, TYPE_AC0DMA, pHeadTD,
                        &pDevice->sTxEthHeader, (PBYTE)skb->data, pTransmitKey, uNodeIndex,
                        &uMACfragNum,
                        &cbHeaderSize
                        );
#endif

    if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
        // Disable PS
        MACbPSWakeup(pDevice->PortOffset);
    }
    pDevice->bPWBitOn = FALSE;

    pLastTD = pHeadTD;
    for (ii = 0; ii < uMACfragNum; ii++) {
        // Poll Transmit the adapter
        wmb();
        pHeadTD->m_td0TD0.f1Owner=OWNED_BY_NIC;
        wmb();
        if (ii == uMACfragNum - 1)
            pLastTD = pHeadTD;
        pHeadTD = pHeadTD->next;
    }

    // Save the information needed by the tx interrupt handler
    // to complete the Send request
#ifdef PRIVATE_OBJ
    pLastTD->pTDInfo->skb = ref_skb.skb;
#else
    pLastTD->pTDInfo->skb = skb;
#endif
    pLastTD->pTDInfo->byFlags = 0;
    pLastTD->pTDInfo->byFlags |= TD_FLAGS_NETIF_SKB;
#ifdef TxInSleep
  pDevice->nTxDataTimeCout=0; //2008-8-21 chester <add> for send null packet
  #endif
    if (AVAIL_TD(pDevice, TYPE_AC0DMA) <= 1) {
        netif_stop_queue(dev);
    }

    pDevice->apCurrTD[TYPE_AC0DMA] = pHeadTD;
//#ifdef	PLICE_DEBUG
	if (pDevice->bFixRate)
	{
		printk("FixRate:Rate is %d,TxPower is %d\n",pDevice->wCurrentRate,pDevice->byCurPwr);
	}
	else
	{
		//printk("Auto Rate:Rate is %d,TxPower is %d\n",pDevice->wCurrentRate,pDevice->byCurPwr);
	}
//#endif

{
    BYTE  Protocol_Version;    //802.1x Authentication
    BYTE  Packet_Type;           //802.1x Authentication
    BYTE  Descriptor_type;
    WORD Key_info;
BOOL            bTxeapol_key = FALSE;
    Protocol_Version = skb->data[U_HEADER_LEN];
    Packet_Type = skb->data[U_HEADER_LEN+1];
    Descriptor_type = skb->data[U_HEADER_LEN+1+1+2];
    Key_info = (skb->data[U_HEADER_LEN+1+1+2+1] << 8)|(skb->data[U_HEADER_LEN+1+1+2+2]);
   if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
           if(((Protocol_Version==1) ||(Protocol_Version==2)) &&
	        (Packet_Type==3)) {  //802.1x OR eapol-key challenge frame transfer
                        bTxeapol_key = TRUE;
		if((Descriptor_type==254)||(Descriptor_type==2)) {       //WPA or RSN
                       if(!(Key_info & BIT3) &&   //group-key challenge
			   (Key_info & BIT8) && (Key_info & BIT9)) {    //send 2/2 key
			  pDevice->fWPA_Authened = TRUE;
			  if(Descriptor_type==254)
			      printk("WPA ");
			  else
			      printk("WPA2 ");
			  printk("Authentication completed!!\n");
                        }
		 }
             }
   }
}

    MACvTransmitAC0(pDevice->PortOffset);
//    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "acdma0:pDevice->apCurrTD= %p\n", pHeadTD);

#ifdef PRIVATE_OBJ
    ref_set_tx_jiffies(pDevice->dev);
#else
    dev->trans_start = jiffies;
#endif

    spin_unlock_irq(&pDevice->lock);
    return 0;

}

#ifdef PRIVATE_OBJ

int __device_intr(int irq, HANDLE pExDevice, struct pt_regs *regs) {
    PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
    PSDevice    pDevice = (PSDevice)(pDevice_info->pWDevice);


#else
static  irqreturn_t  device_intr(int irq,  void *dev_instance) {
    struct net_device* dev=dev_instance;
    PSDevice     pDevice=(PSDevice) netdev_priv(dev);
#endif

    int             max_count=0;
    DWORD           dwMIBCounter=0;
    PSMgmtObject    pMgmt = pDevice->pMgmt;
    BYTE            byOrgPageSel=0;
    int             handled = 0;
    BYTE            byData = 0;
    int             ii= 0;
//    BYTE            byRSSI;


    MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);

    if (pDevice->dwIsr == 0)
        return IRQ_RETVAL(handled);

    if (pDevice->dwIsr == 0xffffffff) {
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dwIsr = 0xffff\n");
        return IRQ_RETVAL(handled);
    }
    /*
      // 2008-05-21 <mark> by Richardtai, we can't read RSSI here, because no packet bound with RSSI

    	if ((BITbIsBitOn(pDevice->dwIsr, ISR_RXDMA0)) &&
        (pDevice->byLocalID != REV_ID_VT3253_B0) &&
        (pDevice->bBSSIDFilter == TRUE)) {
        // update RSSI
        //BBbReadEmbeded(pDevice->PortOffset, 0x3E, &byRSSI);
        //pDevice->uCurrRSSI = byRSSI;
    }
    */

    handled = 1;
    MACvIntDisable(pDevice->PortOffset);
    spin_lock_irq(&pDevice->lock);

    //Make sure current page is 0
    VNSvInPortB(pDevice->PortOffset + MAC_REG_PAGE1SEL, &byOrgPageSel);
    if (byOrgPageSel == 1) {
        MACvSelectPage0(pDevice->PortOffset);
    }
    else
        byOrgPageSel = 0;

    MACvReadMIBCounter(pDevice->PortOffset, &dwMIBCounter);
    // TBD....
    // Must do this after doing rx/tx, cause ISR bit is slow
    // than RD/TD write back
    // update ISR counter
    STAvUpdate802_11Counter(&pDevice->s802_11Counter, &pDevice->scStatistic , dwMIBCounter);
    while (pDevice->dwIsr != 0) {

        STAvUpdateIsrStatCounter(&pDevice->scStatistic, pDevice->dwIsr);
        MACvWriteISR(pDevice->PortOffset, pDevice->dwIsr);

        if (pDevice->dwIsr & ISR_FETALERR){
            DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " ISR_FETALERR \n");
            VNSvOutPortB(pDevice->PortOffset + MAC_REG_SOFTPWRCTL, 0);
            VNSvOutPortW(pDevice->PortOffset + MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPECTI);
            device_error(pDevice, pDevice->dwIsr);
        }

        if (pDevice->byLocalID > REV_ID_VT3253_B1) {

            if (BITbIsBitOn(pDevice->dwIsr, ISR_MEASURESTART)) {
                // 802.11h measure start
                pDevice->byOrgChannel = pDevice->byCurrentCh;
                VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byOrgRCR));
                VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, (RCR_RXALLTYPE | RCR_UNICAST | RCR_BROADCAST | RCR_MULTICAST | RCR_WPAERR));
                MACvSelectPage1(pDevice->PortOffset);
                VNSvInPortD(pDevice->PortOffset + MAC_REG_MAR0, &(pDevice->dwOrgMAR0));
                VNSvInPortD(pDevice->PortOffset + MAC_REG_MAR4, &(pDevice->dwOrgMAR4));
                MACvSelectPage0(pDevice->PortOffset);
               //xxxx
               // WCMDbFlushCommandQueue(pDevice->pMgmt, TRUE);
                if (CARDbSetChannel(pDevice, pDevice->pCurrMeasureEID->sReq.byChannel) == TRUE) {
                    pDevice->bMeasureInProgress = TRUE;
                    MACvSelectPage1(pDevice->PortOffset);
                    MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_READY);
                    MACvSelectPage0(pDevice->PortOffset);
                    pDevice->byBasicMap = 0;
                    pDevice->byCCAFraction = 0;
                    for(ii=0;ii<8;ii++) {
                        pDevice->dwRPIs[ii] = 0;
                    }
                } else {
                    // can not measure because set channel fail
                   // WCMDbResetCommandQueue(pDevice->pMgmt);
                    // clear measure control
                    MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
                    s_vCompleteCurrentMeasure(pDevice, MEASURE_MODE_INCAPABLE);
                    MACvSelectPage1(pDevice->PortOffset);
                    MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
                    MACvSelectPage0(pDevice->PortOffset);
                }
            }
            if (BITbIsBitOn(pDevice->dwIsr, ISR_MEASUREEND)) {
                // 802.11h measure end
                pDevice->bMeasureInProgress = FALSE;
                VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byOrgRCR);
                MACvSelectPage1(pDevice->PortOffset);
                VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, pDevice->dwOrgMAR0);
                VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR4, pDevice->dwOrgMAR4);
                VNSvInPortB(pDevice->PortOffset + MAC_REG_MSRBBSTS, &byData);
                pDevice->byBasicMap |= (byData >> 4);
                VNSvInPortB(pDevice->PortOffset + MAC_REG_CCAFRACTION, &pDevice->byCCAFraction);
                VNSvInPortB(pDevice->PortOffset + MAC_REG_MSRCTL, &byData);
                // clear measure control
                MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
                MACvSelectPage0(pDevice->PortOffset);
                CARDbSetChannel(pDevice, pDevice->byOrgChannel);
                // WCMDbResetCommandQueue(pDevice->pMgmt);
                MACvSelectPage1(pDevice->PortOffset);
                MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
                MACvSelectPage0(pDevice->PortOffset);
                if (BITbIsBitOn(byData, MSRCTL_FINISH)) {
                    // measure success
                    s_vCompleteCurrentMeasure(pDevice, 0);
                } else {
                    // can not measure because not ready before end of measure time
                    s_vCompleteCurrentMeasure(pDevice, MEASURE_MODE_LATE);
                }
            }
            if (BITbIsBitOn(pDevice->dwIsr, ISR_QUIETSTART)) {
                do {
                    ;
                } while (CARDbStartQuiet(pDevice) == FALSE);
            }
        }

        if (pDevice->dwIsr & ISR_TBTT) {
            if (pDevice->bEnableFirstQuiet == TRUE) {
                pDevice->byQuietStartCount--;
                if (pDevice->byQuietStartCount == 0) {
                    pDevice->bEnableFirstQuiet = FALSE;
                    MACvSelectPage1(pDevice->PortOffset);
                    MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN));
                    MACvSelectPage0(pDevice->PortOffset);
                }
            }
            if ((pDevice->bChannelSwitch == TRUE) &&
                (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE)) {
                pDevice->byChannelSwitchCount--;
                if (pDevice->byChannelSwitchCount == 0) {
                    pDevice->bChannelSwitch = FALSE;
                    CARDbSetChannel(pDevice, pDevice->byNewChannel);
                    VNTWIFIbChannelSwitch(pDevice->pMgmt, pDevice->byNewChannel);
                    MACvSelectPage1(pDevice->PortOffset);
                    MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
                    MACvSelectPage0(pDevice->PortOffset);
                    CARDbStartTxPacket(pDevice, PKT_TYPE_802_11_ALL);

                }
            }
            if (pDevice->eOPMode == OP_MODE_ADHOC) {
                //pDevice->bBeaconSent = FALSE;
            } else {
                if ((pDevice->bUpdateBBVGA) && (pDevice->bLinkPass == TRUE) && (pDevice->uCurrRSSI != 0)) {
                    LONG            ldBm;

                    RFvRSSITodBm(pDevice, (BYTE) pDevice->uCurrRSSI, &ldBm);
                    for (ii=0;ii<BB_VGA_LEVEL;ii++) {
                        if (ldBm < pDevice->ldBmThreshold[ii]) {
                            pDevice->byBBVGANew = pDevice->abyBBVGA[ii];
                            break;
                        }
                    }
                    if (pDevice->byBBVGANew != pDevice->byBBVGACurrent) {
                        pDevice->uBBVGADiffCount++;
                        if (pDevice->uBBVGADiffCount == 1) {
                            // first VGA diff gain
                            BBvSetVGAGainOffset(pDevice, pDevice->byBBVGANew);
                            DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"First RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
                                            (int)ldBm, pDevice->byBBVGANew, pDevice->byBBVGACurrent, (int)pDevice->uBBVGADiffCount);
                        }
                        if (pDevice->uBBVGADiffCount >= BB_VGA_CHANGE_THRESHOLD) {
                            DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
                                            (int)ldBm, pDevice->byBBVGANew, pDevice->byBBVGACurrent, (int)pDevice->uBBVGADiffCount);
                            BBvSetVGAGainOffset(pDevice, pDevice->byBBVGANew);
                        }
                    } else {
                        pDevice->uBBVGADiffCount = 1;
                    }
                }
            }

            pDevice->bBeaconSent = FALSE;
            if (pDevice->bEnablePSMode) {
                PSbIsNextTBTTWakeUp((HANDLE)pDevice);
            };

            if ((pDevice->eOPMode == OP_MODE_AP) ||
                (pDevice->eOPMode == OP_MODE_ADHOC)) {

                MACvOneShotTimer1MicroSec(pDevice->PortOffset,
                        (pMgmt->wIBSSBeaconPeriod - MAKE_BEACON_RESERVED) << 10);
            }

            if (pDevice->eOPMode == OP_MODE_ADHOC && pDevice->pMgmt->wCurrATIMWindow > 0) {
                // todo adhoc PS mode
            };

        }

        if (pDevice->dwIsr & ISR_BNTX) {

            if (pDevice->eOPMode == OP_MODE_ADHOC) {
                pDevice->bIsBeaconBufReadySet = FALSE;
                pDevice->cbBeaconBufReadySetCnt = 0;
            };

            if (pDevice->eOPMode == OP_MODE_AP) {
                if(pMgmt->byDTIMCount > 0) {
                   pMgmt->byDTIMCount --;
                   pMgmt->sNodeDBTable[0].bRxPSPoll = FALSE;
                }
                else {
                    if(pMgmt->byDTIMCount == 0) {
                        // check if mutltcast tx bufferring
                        pMgmt->byDTIMCount = pMgmt->byDTIMPeriod - 1;
                        pMgmt->sNodeDBTable[0].bRxPSPoll = TRUE;
                        bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RX_PSPOLL, NULL);
                    }
                }
            }
            pDevice->bBeaconSent = TRUE;

            if (pDevice->bChannelSwitch == TRUE) {
                pDevice->byChannelSwitchCount--;
                if (pDevice->byChannelSwitchCount == 0) {
                    pDevice->bChannelSwitch = FALSE;
                    CARDbSetChannel(pDevice, pDevice->byNewChannel);
                    VNTWIFIbChannelSwitch(pDevice->pMgmt, pDevice->byNewChannel);
                    MACvSelectPage1(pDevice->PortOffset);
                    MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
                    MACvSelectPage0(pDevice->PortOffset);
                    //VNTWIFIbSendBeacon(pDevice->pMgmt);
                    CARDbStartTxPacket(pDevice, PKT_TYPE_802_11_ALL);
                }
            }

        }

        if (pDevice->dwIsr & ISR_RXDMA0) {
            max_count += device_rx_srv(pDevice, TYPE_RXDMA0);
        }
        if (pDevice->dwIsr & ISR_RXDMA1) {
            max_count += device_rx_srv(pDevice, TYPE_RXDMA1);
        }
        if (pDevice->dwIsr & ISR_TXDMA0){
            max_count += device_tx_srv(pDevice, TYPE_TXDMA0);
        }
        if (pDevice->dwIsr & ISR_AC0DMA){
            max_count += device_tx_srv(pDevice, TYPE_AC0DMA);
        }
        if (pDevice->dwIsr & ISR_SOFTTIMER) {

        }
        if (pDevice->dwIsr & ISR_SOFTTIMER1) {
            if (pDevice->eOPMode == OP_MODE_AP) {
               if (pDevice->bShortSlotTime)
                   pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTSLOTTIME(1);
               else
                   pMgmt->wCurrCapInfo &= ~(WLAN_SET_CAP_INFO_SHORTSLOTTIME(1));
            }
            bMgrPrepareBeaconToSend(pDevice, pMgmt);
            pDevice->byCntMeasure = 0;
        }

        MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);

        MACvReceive0(pDevice->PortOffset);
        MACvReceive1(pDevice->PortOffset);

        if (max_count>pDevice->sOpts.int_works)
            break;
    }

    if (byOrgPageSel == 1) {
        MACvSelectPage1(pDevice->PortOffset);
    }

    spin_unlock_irq(&pDevice->lock);
    MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);

    return IRQ_RETVAL(handled);
}


static unsigned const ethernet_polynomial = 0x04c11db7U;
static inline u32 ether_crc(int length, unsigned char *data)
{
    int crc = -1;

    while(--length >= 0) {
        unsigned char current_octet = *data++;
        int bit;
        for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
            crc = (crc << 1) ^
                ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
        }
    }
    return crc;
}

//2008-8-4 <add> by chester
static int Config_FileGetParameter(UCHAR *string, UCHAR *dest,UCHAR *source)
{
  UCHAR buf1[100];
  int source_len = strlen(source);

    memset(buf1,0,100);
    strcat(buf1, string);
    strcat(buf1, "=");
    source+=strlen(buf1);

   memcpy(dest,source,source_len-strlen(buf1));
 return TRUE;
}

int Config_FileOperation(PSDevice pDevice,BOOL fwrite,unsigned char *Parameter) {
    UCHAR    *config_path=CONFIG_PATH;
    UCHAR    *buffer=NULL;
    UCHAR      tmpbuffer[20];
    struct file   *filp=NULL;
    mm_segment_t old_fs = get_fs();
    //int oldfsuid=0,oldfsgid=0;
    int result=0;

    set_fs (KERNEL_DS);

    /* Can't do this anymore, so we rely on correct filesystem permissions:
    //Make sure a caller can read or write power as root
    oldfsuid=current->cred->fsuid;
    oldfsgid=current->cred->fsgid;
    current->cred->fsuid = 0;
    current->cred->fsgid = 0;
    */

    //open file
      filp = filp_open(config_path, O_RDWR, 0);
        if (IS_ERR(filp)) {
	     printk("Config_FileOperation:open file fail?\n");
	     result=-1;
             goto error2;
	  }

     if(!(filp->f_op) || !(filp->f_op->read) ||!(filp->f_op->write)) {
           printk("file %s cann't readable or writable?\n",config_path);
	  result = -1;
	  goto error1;
     	}

buffer = (UCHAR *)kmalloc(1024, GFP_KERNEL);
if(buffer==NULL) {
  printk("alllocate mem for file fail?\n");
  result = -1;
  goto error1;
}

if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
 printk("read file error?\n");
 result = -1;
 goto error1;
}

if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer)!=TRUE) {
  printk("get parameter error?\n");
  result = -1;
  goto error1;
}

if(memcmp(tmpbuffer,"USA",3)==0) {
  result=ZoneType_USA;
}
else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
  result=ZoneType_Japan;
}
else if(memcmp(tmpbuffer,"EUROPE",5)==0) {
 result=ZoneType_Europe;
}
else {
  result = -1;
  printk("Unknown Zonetype[%s]?\n",tmpbuffer);
}

error1:
  if(buffer)
  	 kfree(buffer);

  if(filp_close(filp,NULL))
       printk("Config_FileOperation:close file fail\n");

error2:
  set_fs (old_fs);

  /*
  current->cred->fsuid=oldfsuid;
  current->cred->fsgid=oldfsgid;
  */

  return result;
}


#ifdef PRIVATE_OBJ

void __device_set_multi(HANDLE pExDevice) {
    PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
    ref_net_device  *dev = &(pDevice_info->ref_dev);
    PSDevice    pDevice = (PSDevice)(pDevice_info->pWDevice);

#else

static void device_set_multi(struct net_device *dev) {
    PSDevice         pDevice = (PSDevice) netdev_priv(dev);
#endif

    PSMgmtObject     pMgmt = pDevice->pMgmt;
    u32              mc_filter[2];
    int              i;
    struct dev_mc_list  *mclist;


    VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byRxMode));

#ifdef PRIVATE_OBJ
    if (*(dev->flags) & IFF_PROMISC) {         /* Set promiscuous. */
        DEVICE_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: Promiscuous mode enabled.\n", pDevice->dev->name);

#else
    if (dev->flags & IFF_PROMISC) {         /* Set promiscuous. */
        DEVICE_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
#endif
        /* Unconditionally log net taps. */
        pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
    }
#ifdef PRIVATE_OBJ
    else if ((*(dev->mc_count) > pDevice->multicast_limit)
        ||  (*(dev->flags) & IFF_ALLMULTI)) {
#else
    else if ((dev->mc_count > pDevice->multicast_limit)
        ||  (dev->flags & IFF_ALLMULTI)) {
#endif
        MACvSelectPage1(pDevice->PortOffset);
        VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, 0xffffffff);
        VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0 + 4, 0xffffffff);
        MACvSelectPage0(pDevice->PortOffset);
        pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
    }
    else {
        memset(mc_filter, 0, sizeof(mc_filter));
#ifdef PRIVATE_OBJ
        for (i = 0, mclist = dev->mc_list; mclist && i < *(dev->mc_count);
             i++, mclist = mclist->next) {
#else
        for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
             i++, mclist = mclist->next) {
#endif
            int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
            mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
        }
        MACvSelectPage1(pDevice->PortOffset);
        VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, mc_filter[0]);
        VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0 + 4, mc_filter[1]);
        MACvSelectPage0(pDevice->PortOffset);
        pDevice->byRxMode &= ~(RCR_UNICAST);
        pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
    }

    if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
        // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
        pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
        pDevice->byRxMode &= ~(RCR_UNICAST);
    }

    VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byRxMode);
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode = %x\n", pDevice->byRxMode );
}


#ifdef PRIVATE_OBJ

struct net_device_stats *__device_get_stats(HANDLE pExDevice) {
    PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
    PSDevice    pDevice = (PSDevice)(pDevice_info->pWDevice);

#else
static struct net_device_stats *device_get_stats(struct net_device *dev) {
    PSDevice pDevice=(PSDevice) netdev_priv(dev);
#endif

    return &pDevice->stats;
}


#ifdef PRIVATE_OBJ

int __device_ioctl(HANDLE pExDevice, struct ifreq *rq, int cmd) {
    PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
    struct net_device *dev = pDevice_info->dev;
    PSDevice    pDevice = (PSDevice)(pDevice_info->pWDevice);

#else

static int  device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
	PSDevice	        pDevice = (PSDevice)netdev_priv(dev);
#endif

#ifdef WIRELESS_EXT
	struct iwreq *wrq = (struct iwreq *) rq;
	int                 rc =0;
#endif
    PSMgmtObject        pMgmt = pDevice->pMgmt;
    PSCmdRequest        pReq;


    if (pMgmt == NULL) {
        rc = -EFAULT;
        return rc;
    }

    switch(cmd) {

#ifdef WIRELESS_EXT
//#if WIRELESS_EXT < 13

	case SIOCGIWNAME:
		rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
		break;

	case SIOCGIWNWID:     //0x8b03  support
	#ifdef  WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
          rc = iwctl_giwnwid(dev, NULL, &(wrq->u.nwid), NULL);
	#else
        rc = -EOPNOTSUPP;
	#endif
		break;

		// Set frequency/channel
	case SIOCSIWFREQ:
	    rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
		break;

		// Get frequency/channel
	case SIOCGIWFREQ:
		rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
		break;

		// Set desired network name (ESSID)
	case SIOCSIWESSID:

		{
			char essid[IW_ESSID_MAX_SIZE+1];
			if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
				rc = -E2BIG;
				break;
			}
			if (copy_from_user(essid, wrq->u.essid.pointer,
					   wrq->u.essid.length)) {
				rc = -EFAULT;
				break;
			}
			rc = iwctl_siwessid(dev, NULL,
					    &(wrq->u.essid), essid);
		}
		break;


		// Get current network name (ESSID)
	case SIOCGIWESSID:

		{
			char essid[IW_ESSID_MAX_SIZE+1];
			if (wrq->u.essid.pointer)
				rc = iwctl_giwessid(dev, NULL,
						    &(wrq->u.essid), essid);
				if (copy_to_user(wrq->u.essid.pointer,
						         essid,
						         wrq->u.essid.length) )
					rc = -EFAULT;
		}
		break;

	case SIOCSIWAP:

		rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
		break;


		// Get current Access Point (BSSID)
	case SIOCGIWAP:
		rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
		break;


		// Set desired station name
	case SIOCSIWNICKN:
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
        rc = -EOPNOTSUPP;
		break;

		// Get current station name
	case SIOCGIWNICKN:
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
        rc = -EOPNOTSUPP;
		break;

		// Set the desired bit-rate
	case SIOCSIWRATE:
		rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
		break;

	// Get the current bit-rate
	case SIOCGIWRATE:

		rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
		break;

	// Set the desired RTS threshold
	case SIOCSIWRTS:

		rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
		break;

	// Get the current RTS threshold
	case SIOCGIWRTS:

		rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
		break;

		// Set the desired fragmentation threshold
	case SIOCSIWFRAG:

		rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
	    break;

	// Get the current fragmentation threshold
	case SIOCGIWFRAG:

		rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
		break;

		// Set mode of operation
	case SIOCSIWMODE:
    	rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
		break;

		// Get mode of operation
	case SIOCGIWMODE:
		rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
		break;

		// Set WEP keys and mode
	case SIOCSIWENCODE:
		{
            char abyKey[WLAN_WEP232_KEYLEN];

			if (wrq->u.encoding.pointer) {


				if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
					rc = -E2BIG;
					break;
				}
				memset(abyKey, 0, WLAN_WEP232_KEYLEN);
				if (copy_from_user(abyKey,
				                  wrq->u.encoding.pointer,
				                  wrq->u.encoding.length)) {
					rc = -EFAULT;
					break;
				}
			} else if (wrq->u.encoding.length != 0) {
				rc = -EINVAL;
				break;
			}
			rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
		}
		break;

		// Get the WEP keys and mode
	case SIOCGIWENCODE:

		if (!capable(CAP_NET_ADMIN)) {
			rc = -EPERM;
			break;
		}
		{
		    char abyKey[WLAN_WEP232_KEYLEN];

		    rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
		    if (rc != 0) break;
			if (wrq->u.encoding.pointer) {
				if (copy_to_user(wrq->u.encoding.pointer,
						        abyKey,
						        wrq->u.encoding.length))
					rc = -EFAULT;
			}
		}
		break;

#if WIRELESS_EXT > 9
		// Get the current Tx-Power
	case SIOCGIWTXPOW:
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
        rc = -EOPNOTSUPP;
		break;

	case SIOCSIWTXPOW:
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
        rc = -EOPNOTSUPP;
		break;

#endif // WIRELESS_EXT > 9

#if WIRELESS_EXT > 10
	case SIOCSIWRETRY:

		rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
		break;

	case SIOCGIWRETRY:

		rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
		break;

#endif // WIRELESS_EXT > 10

		// Get range of parameters
	case SIOCGIWRANGE:

		{
			struct iw_range range;

			rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *) &range);
			if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
				rc = -EFAULT;
		}

		break;

	case SIOCGIWPOWER:

		rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
		break;


	case SIOCSIWPOWER:

		rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
		break;


	case SIOCGIWSENS:

	    rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
		break;

	case SIOCSIWSENS:
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
		rc = -EOPNOTSUPP;
		break;

	case SIOCGIWAPLIST:
	    {
            char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];

		    if (wrq->u.data.pointer) {
		        rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
		        if (rc == 0) {
                    if (copy_to_user(wrq->u.data.pointer,
					                buffer,
					               (wrq->u.data.length * (sizeof(struct sockaddr) +  sizeof(struct iw_quality)))
				        ))
				    rc = -EFAULT;
		        }
            }
        }
		break;


#ifdef WIRELESS_SPY
		// Set the spy list
	case SIOCSIWSPY:

        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
		rc = -EOPNOTSUPP;
		break;

		// Get the spy list
	case SIOCGIWSPY:

        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
		rc = -EOPNOTSUPP;
		break;

#endif // WIRELESS_SPY

	case SIOCGIWPRIV:
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
		rc = -EOPNOTSUPP;
/*
		if(wrq->u.data.pointer) {
			wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);

			if(copy_to_user(wrq->u.data.pointer,
					(u_char *) iwctl_private_args,
					sizeof(iwctl_private_args)))
				rc = -EFAULT;
		}
*/
		break;


//#endif // WIRELESS_EXT < 13
//2008-0409-07, <Add> by Einsn Liu
#ifdef  WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
	case SIOCSIWAUTH:
		DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH \n");
		rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
		break;

	case SIOCGIWAUTH:
		DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
		rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
		break;

	case SIOCSIWGENIE:
		DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
		rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
		break;

	case SIOCGIWGENIE:
		DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
		rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
		break;

	case SIOCSIWENCODEEXT:
		{
			char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
			DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
			if(wrq->u.encoding.pointer){
				memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1);
				if(wrq->u.encoding.length > (sizeof(struct iw_encode_ext)+ MAX_KEY_LEN)){
					rc = -E2BIG;
					break;
				}
				if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
					rc = -EFAULT;
					break;
				}
			}else if(wrq->u.encoding.length != 0){
				rc = -EINVAL;
				break;
			}
			rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
		}
		break;

	case SIOCGIWENCODEEXT:
		DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
		rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
		break;

	case SIOCSIWMLME:
		DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
		rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
		break;

#endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
//End Add -- //2008-0409-07, <Add> by Einsn Liu

#endif // WIRELESS_EXT

    case IOCTL_CMD_TEST:

		if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
		    rc = -EFAULT;
		    break;
		} else {
		    rc = 0;
		}
        pReq = (PSCmdRequest)rq;
        pReq->wResult = MAGIC_CODE;
        break;

    case IOCTL_CMD_SET:

               #ifdef SndEvt_ToAPI
                  if((((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_EVT) &&
		       !(pDevice->flags & DEVICE_FLAGS_OPENED))
	      #else
		if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
		       (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
	      #endif
		{
		    rc = -EFAULT;
		    break;
		} else {
		    rc = 0;
		}

	    if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
		    return -EBUSY;
	    }
        rc = private_ioctl(pDevice, rq);
        clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
        break;

    case IOCTL_CMD_HOSTAPD:


#if WIRELESS_EXT > 8
		rc = hostap_ioctl(pDevice, &wrq->u.data);
#else // WIRELESS_EXT > 8
		rc = hostap_ioctl(pDevice, (struct iw_point *) &wrq->u.data);
#endif // WIRELESS_EXT > 8
        break;

    case IOCTL_CMD_WPA:

#if WIRELESS_EXT > 8
		rc = wpa_ioctl(pDevice, &wrq->u.data);
#else // WIRELESS_EXT > 8
		rc = wpa_ioctl(pDevice, (struct iw_point *) &wrq->u.data);
#endif // WIRELESS_EXT > 8
        break;

	case SIOCETHTOOL:
        return ethtool_ioctl(dev, (void *) rq->ifr_data);
	// All other calls are currently unsupported

	default:
		rc = -EOPNOTSUPP;
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);


    }

    if (pDevice->bCommit) {
       if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
           netif_stop_queue(pDevice->dev);
           spin_lock_irq(&pDevice->lock);
           bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RUN_AP, NULL);
           spin_unlock_irq(&pDevice->lock);
       }
       else {
           DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
           spin_lock_irq(&pDevice->lock);
           pDevice->bLinkPass = FALSE;
           memset(pMgmt->abyCurrBSSID, 0, 6);
           pMgmt->eCurrState = WMAC_STATE_IDLE;
           netif_stop_queue(pDevice->dev);
	#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
	      pMgmt->eScanType = WMAC_SCAN_ACTIVE;
	 if(pDevice->bWPASuppWextEnabled !=TRUE)
	 #endif
           bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
           bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, NULL);
           spin_unlock_irq(&pDevice->lock);
      }
      pDevice->bCommit = FALSE;
    }

    return rc;
}


static int ethtool_ioctl(struct net_device *dev, void *useraddr)
{
	u32 ethcmd;

	if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
		return -EFAULT;

        switch (ethcmd) {
	case ETHTOOL_GDRVINFO: {
		struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
		strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
		strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
		if (copy_to_user(useraddr, &info, sizeof(info)))
			return -EFAULT;
		return 0;
	}

        }

	return -EOPNOTSUPP;
}

/*------------------------------------------------------------------*/
#ifndef PRIVATE_OBJ

MODULE_DEVICE_TABLE(pci, device_id_table);

static struct pci_driver device_driver = {
        name:       DEVICE_NAME,
        id_table:   device_id_table,
        probe:      device_found1,
        remove:     device_remove1,
#ifdef CONFIG_PM
        suspend:    viawget_suspend,
        resume:     viawget_resume,
#endif
};

static int __init device_init_module(void)
{
    int ret;


//    ret=pci_module_init(&device_driver);
	//ret = pcie_port_service_register(&device_driver);
	ret = pci_register_driver(&device_driver);
#ifdef CONFIG_PM
    if(ret >= 0)
        register_reboot_notifier(&device_notifier);
#endif

    return ret;
}

static void __exit device_cleanup_module(void)
{


#ifdef CONFIG_PM
    unregister_reboot_notifier(&device_notifier);
#endif
    pci_unregister_driver(&device_driver);

}

module_init(device_init_module);
module_exit(device_cleanup_module);


#ifdef CONFIG_PM
static int
device_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
{
    struct pci_dev *pdev = NULL;
    switch(event) {
    case SYS_DOWN:
    case SYS_HALT:
    case SYS_POWER_OFF:
        while ((pdev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pdev)) != NULL) {
            if(pci_dev_driver(pdev) == &device_driver) {
                if (pci_get_drvdata(pdev))
                    viawget_suspend(pdev, 3);
            }
        }
    }
    return NOTIFY_DONE;
}

static int
viawget_suspend(struct pci_dev *pcid, u32 state)
{
    int power_status;   // to silence the compiler

    PSDevice pDevice=pci_get_drvdata(pcid);
    PSMgmtObject  pMgmt = pDevice->pMgmt;

    netif_stop_queue(pDevice->dev);
    spin_lock_irq(&pDevice->lock);
    pci_save_state(pcid);
    del_timer(&pDevice->sTimerCommand);
    del_timer(&pMgmt->sTimerSecondCallback);
    pDevice->cbFreeCmdQueue = CMD_Q_SIZE;
    pDevice->uCmdDequeueIdx = 0;
    pDevice->uCmdEnqueueIdx = 0;
    pDevice->bCmdRunning = FALSE;
    MACbShutdown(pDevice->PortOffset);
    MACvSaveContext(pDevice->PortOffset, pDevice->abyMacContext);
    pDevice->bLinkPass = FALSE;
    memset(pMgmt->abyCurrBSSID, 0, 6);
    pMgmt->eCurrState = WMAC_STATE_IDLE;
    pci_disable_device(pcid);
    power_status = pci_set_power_state(pcid, state);
    spin_unlock_irq(&pDevice->lock);
    return 0;
}

static int
viawget_resume(struct pci_dev *pcid)
{
    PSDevice  pDevice=pci_get_drvdata(pcid);
    PSMgmtObject  pMgmt = pDevice->pMgmt;
    int power_status;   // to silence the compiler


    power_status = pci_set_power_state(pcid, 0);
    power_status = pci_enable_wake(pcid, 0, 0);
    pci_restore_state(pcid);
    if (netif_running(pDevice->dev)) {
        spin_lock_irq(&pDevice->lock);
        MACvRestoreContext(pDevice->PortOffset, pDevice->abyMacContext);
        device_init_registers(pDevice, DEVICE_INIT_DXPL);
        if (pMgmt->sNodeDBTable[0].bActive == TRUE) { // Assoc with BSS
            pMgmt->sNodeDBTable[0].bActive = FALSE;
            pDevice->bLinkPass = FALSE;
            if(pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
                // In Adhoc, BSS state set back to started.
                pMgmt->eCurrState = WMAC_STATE_STARTED;
           }
            else {
                pMgmt->eCurrMode = WMAC_MODE_STANDBY;
                pMgmt->eCurrState = WMAC_STATE_IDLE;
            }
        }
        init_timer(&pMgmt->sTimerSecondCallback);
        init_timer(&pDevice->sTimerCommand);
        MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
        BSSvClearBSSList((HANDLE)pDevice, pDevice->bLinkPass);
        bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
        bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, NULL);
        spin_unlock_irq(&pDevice->lock);
    }
    return 0;
}

#endif

#endif //#ifndef PRIVATE_OBJ

#ifdef PRIVATE_OBJ


int __device_hw_reset(HANDLE pExDevice){
     PSDevice_info pDevice_info = (PSDevice_info)pExDevice;

     return MACbSoftwareReset(pDevice_info->port_offset);
}


int __device_hw_init(HANDLE pExDevice){
    PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
    PSDevice    pDevice;

    pDevice = (PSDevice)kmalloc(sizeof(DEVICE_INFO), (int)GFP_ATOMIC);
    if (pDevice == NULL)
        return FALSE;

    memset(pDevice, 0, sizeof(DEVICE_INFO));
    pDevice_info->pWDevice = pDevice;
    pDevice->PortOffset = pDevice_info->port_offset;
    pDevice->dev = pDevice_info->dev;
    pDevice->pcid = pDevice_info->pcid;
    pDevice->chip_id = pDevice_info->chip_id;
    pDevice->memaddr = pDevice_info->mem_addr;
    pDevice->ioaddr = pDevice_info->io_addr;
    pDevice->io_size = pDevice_info->io_size;
    pDevice->nTxQueues = pDevice_info->nTxQueues;
    pDevice->multicast_limit = pDevice_info->multicast_limit;
    pDevice->sMgmtObj.pAdapter = (PVOID)pDevice;
    pDevice->pMgmt = &(pDevice->sMgmtObj);
    MACvInitialize(pDevice->PortOffset);
    device_get_options(pDevice, 0 , pDevice_info->dev->name);
    device_set_options(pDevice);
    pDevice->sOpts.flags &= pDevice_info->flags;
    pDevice->flags = pDevice->sOpts.flags | (pDevice_info->flags & 0xFF000000UL);
    spin_lock_init(&(pDevice->lock));

    return TRUE;
}


void __device_read_mac(HANDLE pExDevice, PBYTE dev_addr){
    PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
    PSDevice    pDevice = (PSDevice)(pDevice_info->pWDevice);

    MACvReadEtherAddress(pDevice->PortOffset, dev_addr);
    return;
}


#endif


