device_main.c revision afc4b13df143122f99a0eb10bfefb216c2806de0
1/*
2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3 * All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * File: device_main.c
20 *
21 * Purpose: driver entry for initial, open, close, tx and rx.
22 *
23 * Author: Lyndon Chen
24 *
25 * Date: Jan 8, 2003
26 *
27 * Functions:
28 *
29 *   vt6655_probe - module initial (insmod) driver entry
30 *   vt6655_remove - module remove entry
31 *   vt6655_init_info - device structure resource allocation function
32 *   device_free_info - device structure resource free function
33 *   device_get_pci_info - get allocated pci io/mem resource
34 *   device_print_info - print out resource
35 *   device_open - allocate dma/descripter resource & initial mac/bbp function
36 *   device_xmit - asynchrous data tx function
37 *   device_intr - interrupt handle function
38 *   device_set_multi - set mac filter
39 *   device_ioctl - ioctl entry
40 *   device_close - shutdown mac/bbp & free dma/descripter resource
41 *   device_rx_srv - rx service function
42 *   device_receive_frame - rx data function
43 *   device_alloc_rx_buf - rx buffer pre-allocated function
44 *   device_alloc_frag_buf - rx fragement pre-allocated function
45 *   device_free_tx_buf - free tx buffer function
46 *   device_free_frag_buf- free de-fragement buffer
47 *   device_dma0_tx_80211- tx 802.11 frame via dma0
48 *   device_dma0_xmit- tx PS bufferred frame via dma0
49 *   device_init_rd0_ring- initial rd dma0 ring
50 *   device_init_rd1_ring- initial rd dma1 ring
51 *   device_init_td0_ring- initial tx dma0 ring buffer
52 *   device_init_td1_ring- initial tx dma1 ring buffer
53 *   device_init_registers- initial MAC & BBP & RF internal registers.
54 *   device_init_rings- initial tx/rx ring buffer
55 *   device_init_defrag_cb- initial & allocate de-fragement buffer.
56 *   device_free_rings- free all allocated ring buffer
57 *   device_tx_srv- tx interrupt service function
58 *
59 * Revision History:
60 */
61#undef __NO_VERSION__
62
63#include "device.h"
64#include "card.h"
65#include "channel.h"
66#include "baseband.h"
67#include "mac.h"
68#include "tether.h"
69#include "wmgr.h"
70#include "wctl.h"
71#include "power.h"
72#include "wcmd.h"
73#include "iocmd.h"
74#include "tcrc.h"
75#include "rxtx.h"
76#include "wroute.h"
77#include "bssdb.h"
78#include "hostap.h"
79#include "wpactl.h"
80#include "ioctl.h"
81#include "iwctl.h"
82#include "dpc.h"
83#include "datarate.h"
84#include "rf.h"
85#include "iowpa.h"
86#include <linux/delay.h>
87#include <linux/kthread.h>
88#include <linux/slab.h>
89
90//#define	DEBUG
91/*---------------------  Static Definitions -------------------------*/
92//static int          msglevel                =MSG_LEVEL_DEBUG;
93static int          msglevel                =   MSG_LEVEL_INFO;
94
95//#define	PLICE_DEBUG
96//
97// Define module options
98//
99MODULE_AUTHOR("VIA Networking Technologies, Inc., <lyndonchen@vntek.com.tw>");
100MODULE_LICENSE("GPL");
101MODULE_DESCRIPTION("VIA Networking Solomon-A/B/G Wireless LAN Adapter Driver");
102
103//PLICE_DEBUG ->
104	static int mlme_kill;
105	//static  struct task_struct * mlme_task;
106//PLICE_DEBUG <-
107
108#define DEVICE_PARAM(N,D)
109/*
110        static const int N[MAX_UINTS]=OPTION_DEFAULT;\
111        MODULE_PARM(N, "1-" __MODULE_STRING(MAX_UINTS) "i");\
112        MODULE_PARM_DESC(N, D);
113*/
114
115#define RX_DESC_MIN0     16
116#define RX_DESC_MAX0     128
117#define RX_DESC_DEF0     32
118DEVICE_PARAM(RxDescriptors0,"Number of receive descriptors0");
119
120#define RX_DESC_MIN1     16
121#define RX_DESC_MAX1     128
122#define RX_DESC_DEF1     32
123DEVICE_PARAM(RxDescriptors1,"Number of receive descriptors1");
124
125#define TX_DESC_MIN0     16
126#define TX_DESC_MAX0     128
127#define TX_DESC_DEF0     32
128DEVICE_PARAM(TxDescriptors0,"Number of transmit descriptors0");
129
130#define TX_DESC_MIN1     16
131#define TX_DESC_MAX1     128
132#define TX_DESC_DEF1     64
133DEVICE_PARAM(TxDescriptors1,"Number of transmit descriptors1");
134
135
136#define IP_ALIG_DEF     0
137/* IP_byte_align[] is used for IP header unsigned long byte aligned
138   0: indicate the IP header won't be unsigned long byte aligned.(Default) .
139   1: indicate the IP header will be unsigned long byte aligned.
140      In some environment, the IP header should be unsigned long byte aligned,
141      or the packet will be droped when we receive it. (eg: IPVS)
142*/
143DEVICE_PARAM(IP_byte_align,"Enable IP header dword aligned");
144
145
146#define INT_WORKS_DEF   20
147#define INT_WORKS_MIN   10
148#define INT_WORKS_MAX   64
149
150DEVICE_PARAM(int_works,"Number of packets per interrupt services");
151
152#define CHANNEL_MIN     1
153#define CHANNEL_MAX     14
154#define CHANNEL_DEF     6
155
156DEVICE_PARAM(Channel, "Channel number");
157
158
159/* PreambleType[] is the preamble length used for transmit.
160   0: indicate allows long preamble type
161   1: indicate allows short preamble type
162*/
163
164#define PREAMBLE_TYPE_DEF     1
165
166DEVICE_PARAM(PreambleType, "Preamble Type");
167
168
169#define RTS_THRESH_MIN     512
170#define RTS_THRESH_MAX     2347
171#define RTS_THRESH_DEF     2347
172
173DEVICE_PARAM(RTSThreshold, "RTS threshold");
174
175
176#define FRAG_THRESH_MIN     256
177#define FRAG_THRESH_MAX     2346
178#define FRAG_THRESH_DEF     2346
179
180DEVICE_PARAM(FragThreshold, "Fragmentation threshold");
181
182
183#define DATA_RATE_MIN     0
184#define DATA_RATE_MAX     13
185#define DATA_RATE_DEF     13
186/* datarate[] index
187   0: indicate 1 Mbps   0x02
188   1: indicate 2 Mbps   0x04
189   2: indicate 5.5 Mbps 0x0B
190   3: indicate 11 Mbps  0x16
191   4: indicate 6 Mbps   0x0c
192   5: indicate 9 Mbps   0x12
193   6: indicate 12 Mbps  0x18
194   7: indicate 18 Mbps  0x24
195   8: indicate 24 Mbps  0x30
196   9: indicate 36 Mbps  0x48
197  10: indicate 48 Mbps  0x60
198  11: indicate 54 Mbps  0x6c
199  12: indicate 72 Mbps  0x90
200  13: indicate auto rate
201*/
202
203DEVICE_PARAM(ConnectionRate, "Connection data rate");
204
205#define OP_MODE_DEF     0
206
207DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode ");
208
209/* OpMode[] is used for transmit.
210   0: indicate infrastruct mode used
211   1: indicate adhoc mode used
212   2: indicate AP mode used
213*/
214
215
216/* PSMode[]
217   0: indicate disable power saving mode
218   1: indicate enable power saving mode
219*/
220
221#define PS_MODE_DEF     0
222
223DEVICE_PARAM(PSMode, "Power saving mode");
224
225
226#define SHORT_RETRY_MIN     0
227#define SHORT_RETRY_MAX     31
228#define SHORT_RETRY_DEF     8
229
230
231DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");
232
233#define LONG_RETRY_MIN     0
234#define LONG_RETRY_MAX     15
235#define LONG_RETRY_DEF     4
236
237
238DEVICE_PARAM(LongRetryLimit, "long frame retry limits");
239
240
241/* BasebandType[] baseband type selected
242   0: indicate 802.11a type
243   1: indicate 802.11b type
244   2: indicate 802.11g type
245*/
246#define BBP_TYPE_MIN     0
247#define BBP_TYPE_MAX     2
248#define BBP_TYPE_DEF     2
249
250DEVICE_PARAM(BasebandType, "baseband type");
251
252
253
254/* 80211hEnable[]
255   0: indicate disable 802.11h
256   1: indicate enable 802.11h
257*/
258
259#define X80211h_MODE_DEF     0
260
261DEVICE_PARAM(b80211hEnable, "802.11h mode");
262
263/* 80211hEnable[]
264   0: indicate disable 802.11h
265   1: indicate enable 802.11h
266*/
267
268#define DIVERSITY_ANT_DEF     0
269
270DEVICE_PARAM(bDiversityANTEnable, "ANT diversity mode");
271
272
273//
274// Static vars definitions
275//
276
277
278static int          device_nics             =0;
279static PSDevice     pDevice_Infos           =NULL;
280static struct net_device *root_device_dev = NULL;
281
282static CHIP_INFO chip_info_table[]= {
283    { VT3253,       "VIA Networking Solomon-A/B/G Wireless LAN Adapter ",
284        256, 1,     DEVICE_FLAGS_IP_ALIGN|DEVICE_FLAGS_TX_ALIGN },
285    {0,NULL}
286};
287
288DEFINE_PCI_DEVICE_TABLE(vt6655_pci_id_table) = {
289	{ PCI_VDEVICE(VIA, 0x3253), (kernel_ulong_t)chip_info_table},
290	{ 0, }
291};
292
293/*---------------------  Static Functions  --------------------------*/
294
295
296static int  vt6655_probe(struct pci_dev *pcid, const struct pci_device_id *ent);
297static bool vt6655_init_info(struct pci_dev* pcid, PSDevice* ppDevice, PCHIP_INFO);
298static void device_free_info(PSDevice pDevice);
299static bool device_get_pci_info(PSDevice, struct pci_dev* pcid);
300static void device_print_info(PSDevice pDevice);
301static struct net_device_stats *device_get_stats(struct net_device *dev);
302static void device_init_diversity_timer(PSDevice pDevice);
303static int  device_open(struct net_device *dev);
304static int  device_xmit(struct sk_buff *skb, struct net_device *dev);
305static  irqreturn_t  device_intr(int irq,  void*dev_instance);
306static void device_set_multi(struct net_device *dev);
307static int  device_close(struct net_device *dev);
308static int  device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
309
310#ifdef CONFIG_PM
311static int device_notify_reboot(struct notifier_block *, unsigned long event, void *ptr);
312static int viawget_suspend(struct pci_dev *pcid, pm_message_t state);
313static int viawget_resume(struct pci_dev *pcid);
314struct notifier_block device_notifier = {
315	.notifier_call = device_notify_reboot,
316	.next = NULL,
317	.priority = 0,
318};
319#endif
320
321
322static void device_init_rd0_ring(PSDevice pDevice);
323static void device_init_rd1_ring(PSDevice pDevice);
324static void device_init_defrag_cb(PSDevice pDevice);
325static void device_init_td0_ring(PSDevice pDevice);
326static void device_init_td1_ring(PSDevice pDevice);
327
328static int  device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev);
329//2008-0714<Add>by Mike Liu
330static bool device_release_WPADEV(PSDevice pDevice);
331
332static int  ethtool_ioctl(struct net_device *dev, void *useraddr);
333static int  device_rx_srv(PSDevice pDevice, unsigned int uIdx);
334static int  device_tx_srv(PSDevice pDevice, unsigned int uIdx);
335static bool device_alloc_rx_buf(PSDevice pDevice, PSRxDesc pDesc);
336static void device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType);
337static void device_free_tx_buf(PSDevice pDevice, PSTxDesc pDesc);
338static void device_free_td0_ring(PSDevice pDevice);
339static void device_free_td1_ring(PSDevice pDevice);
340static void device_free_rd0_ring(PSDevice pDevice);
341static void device_free_rd1_ring(PSDevice pDevice);
342static void device_free_rings(PSDevice pDevice);
343static void device_free_frag_buf(PSDevice pDevice);
344static int Config_FileGetParameter(unsigned char *string,
345		unsigned char *dest, unsigned char *source);
346
347
348/*---------------------  Export Variables  --------------------------*/
349
350/*---------------------  Export Functions  --------------------------*/
351
352
353
354static char* get_chip_name(int chip_id) {
355    int i;
356    for (i=0;chip_info_table[i].name!=NULL;i++)
357        if (chip_info_table[i].chip_id==chip_id)
358            break;
359    return chip_info_table[i].name;
360}
361
362static void __devexit vt6655_remove(struct pci_dev *pcid)
363{
364    PSDevice pDevice=pci_get_drvdata(pcid);
365
366    if (pDevice==NULL)
367        return;
368    device_free_info(pDevice);
369
370}
371
372/*
373static void
374device_set_int_opt(int *opt, int val, int min, int max, int def,char* name,char* devname) {
375    if (val==-1)
376        *opt=def;
377    else if (val<min || val>max) {
378        DBG_PRT(MSG_LEVEL_INFO, KERN_NOTICE "%s: the value of parameter %s is invalid, the valid range is (%d-%d)\n" ,
379            devname,name, min,max);
380        *opt=def;
381    } else {
382        DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: set value of parameter %s to %d\n",
383            devname, name, val);
384        *opt=val;
385    }
386}
387
388static void
389device_set_bool_opt(unsigned int *opt, int val,bool def,u32 flag, char* name,char* devname) {
390    (*opt)&=(~flag);
391    if (val==-1)
392        *opt|=(def ? flag : 0);
393    else if (val<0 || val>1) {
394        DBG_PRT(MSG_LEVEL_INFO, KERN_NOTICE
395            "%s: the value of parameter %s is invalid, the valid range is (0-1)\n",devname,name);
396        *opt|=(def ? flag : 0);
397    } else {
398        DBG_PRT(MSG_LEVEL_INFO, KERN_NOTICE "%s: set parameter %s to %s\n",
399            devname,name , val ? "true" : "false");
400        *opt|=(val ? flag : 0);
401    }
402}
403*/
404static void
405device_get_options(PSDevice pDevice, int index, char* devname) {
406
407    POPTIONS pOpts = &(pDevice->sOpts);
408  pOpts->nRxDescs0=RX_DESC_DEF0;
409  pOpts->nRxDescs1=RX_DESC_DEF1;
410  pOpts->nTxDescs[0]=TX_DESC_DEF0;
411  pOpts->nTxDescs[1]=TX_DESC_DEF1;
412pOpts->flags|=DEVICE_FLAGS_IP_ALIGN;
413  pOpts->int_works=INT_WORKS_DEF;
414  pOpts->rts_thresh=RTS_THRESH_DEF;
415  pOpts->frag_thresh=FRAG_THRESH_DEF;
416  pOpts->data_rate=DATA_RATE_DEF;
417  pOpts->channel_num=CHANNEL_DEF;
418
419pOpts->flags|=DEVICE_FLAGS_PREAMBLE_TYPE;
420pOpts->flags|=DEVICE_FLAGS_OP_MODE;
421//pOpts->flags|=DEVICE_FLAGS_PS_MODE;
422  pOpts->short_retry=SHORT_RETRY_DEF;
423  pOpts->long_retry=LONG_RETRY_DEF;
424  pOpts->bbp_type=BBP_TYPE_DEF;
425pOpts->flags|=DEVICE_FLAGS_80211h_MODE;
426pOpts->flags|=DEVICE_FLAGS_DiversityANT;
427
428
429}
430
431static void
432device_set_options(PSDevice pDevice) {
433
434    unsigned char abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
435    unsigned char abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
436    unsigned char abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
437
438
439    memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
440    memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
441    memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, ETH_ALEN);
442
443    pDevice->uChannel = pDevice->sOpts.channel_num;
444    pDevice->wRTSThreshold = pDevice->sOpts.rts_thresh;
445    pDevice->wFragmentationThreshold = pDevice->sOpts.frag_thresh;
446    pDevice->byShortRetryLimit = pDevice->sOpts.short_retry;
447    pDevice->byLongRetryLimit = pDevice->sOpts.long_retry;
448    pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME;
449    pDevice->byShortPreamble = (pDevice->sOpts.flags & DEVICE_FLAGS_PREAMBLE_TYPE) ? 1 : 0;
450    pDevice->byOpMode = (pDevice->sOpts.flags & DEVICE_FLAGS_OP_MODE) ? 1 : 0;
451    pDevice->ePSMode = (pDevice->sOpts.flags & DEVICE_FLAGS_PS_MODE) ? 1 : 0;
452    pDevice->b11hEnable = (pDevice->sOpts.flags & DEVICE_FLAGS_80211h_MODE) ? 1 : 0;
453    pDevice->bDiversityRegCtlON = (pDevice->sOpts.flags & DEVICE_FLAGS_DiversityANT) ? 1 : 0;
454    pDevice->uConnectionRate = pDevice->sOpts.data_rate;
455    if (pDevice->uConnectionRate < RATE_AUTO) pDevice->bFixRate = true;
456    pDevice->byBBType = pDevice->sOpts.bbp_type;
457    pDevice->byPacketType = pDevice->byBBType;
458
459//PLICE_DEBUG->
460	pDevice->byAutoFBCtrl = AUTO_FB_0;
461	//pDevice->byAutoFBCtrl = AUTO_FB_1;
462//PLICE_DEBUG<-
463pDevice->bUpdateBBVGA = true;
464    pDevice->byFOETuning = 0;
465    pDevice->wCTSDuration = 0;
466    pDevice->byPreambleType = 0;
467
468
469    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" uChannel= %d\n",(int)pDevice->uChannel);
470    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byOpMode= %d\n",(int)pDevice->byOpMode);
471    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" ePSMode= %d\n",(int)pDevice->ePSMode);
472    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" wRTSThreshold= %d\n",(int)pDevice->wRTSThreshold);
473    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byShortRetryLimit= %d\n",(int)pDevice->byShortRetryLimit);
474    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byLongRetryLimit= %d\n",(int)pDevice->byLongRetryLimit);
475    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byPreambleType= %d\n",(int)pDevice->byPreambleType);
476    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byShortPreamble= %d\n",(int)pDevice->byShortPreamble);
477    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" uConnectionRate= %d\n",(int)pDevice->uConnectionRate);
478    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byBBType= %d\n",(int)pDevice->byBBType);
479    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" pDevice->b11hEnable= %d\n",(int)pDevice->b11hEnable);
480    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" pDevice->bDiversityRegCtlON= %d\n",(int)pDevice->bDiversityRegCtlON);
481}
482
483static void s_vCompleteCurrentMeasure (PSDevice pDevice, unsigned char byResult)
484{
485    unsigned int ii;
486    unsigned long dwDuration = 0;
487    unsigned char byRPI0 = 0;
488
489    for(ii=1;ii<8;ii++) {
490        pDevice->dwRPIs[ii] *= 255;
491        dwDuration |= *((unsigned short *) (pDevice->pCurrMeasureEID->sReq.abyDuration));
492        dwDuration <<= 10;
493        pDevice->dwRPIs[ii] /= dwDuration;
494        pDevice->abyRPIs[ii] = (unsigned char) pDevice->dwRPIs[ii];
495        byRPI0 += pDevice->abyRPIs[ii];
496    }
497    pDevice->abyRPIs[0] = (0xFF - byRPI0);
498
499     if (pDevice->uNumOfMeasureEIDs == 0) {
500        VNTWIFIbMeasureReport(  pDevice->pMgmt,
501                                true,
502                                pDevice->pCurrMeasureEID,
503                                byResult,
504                                pDevice->byBasicMap,
505                                pDevice->byCCAFraction,
506                                pDevice->abyRPIs
507                                );
508    } else {
509        VNTWIFIbMeasureReport(  pDevice->pMgmt,
510                                false,
511                                pDevice->pCurrMeasureEID,
512                                byResult,
513                                pDevice->byBasicMap,
514                                pDevice->byCCAFraction,
515                                pDevice->abyRPIs
516                                );
517        CARDbStartMeasure (pDevice, pDevice->pCurrMeasureEID++, pDevice->uNumOfMeasureEIDs);
518    }
519
520}
521
522
523
524//
525// Initialiation of MAC & BBP registers
526//
527
528static void device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType)
529{
530    unsigned int ii;
531    unsigned char byValue;
532    unsigned char byValue1;
533    unsigned char byCCKPwrdBm = 0;
534    unsigned char byOFDMPwrdBm = 0;
535    int zonetype=0;
536     PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);
537    MACbShutdown(pDevice->PortOffset);
538    BBvSoftwareReset(pDevice->PortOffset);
539
540    if ((InitType == DEVICE_INIT_COLD) ||
541        (InitType == DEVICE_INIT_DXPL)) {
542        // Do MACbSoftwareReset in MACvInitialize
543        MACbSoftwareReset(pDevice->PortOffset);
544        // force CCK
545        pDevice->bCCK = true;
546        pDevice->bAES = false;
547        pDevice->bProtectMode = false;      //Only used in 11g type, sync with ERP IE
548        pDevice->bNonERPPresent = false;
549        pDevice->bBarkerPreambleMd = false;
550        pDevice->wCurrentRate = RATE_1M;
551        pDevice->byTopOFDMBasicRate = RATE_24M;
552        pDevice->byTopCCKBasicRate = RATE_1M;
553
554        pDevice->byRevId = 0;                   //Target to IF pin while programming to RF chip.
555
556        // init MAC
557        MACvInitialize(pDevice->PortOffset);
558
559        // Get Local ID
560        VNSvInPortB(pDevice->PortOffset + MAC_REG_LOCALID, &(pDevice->byLocalID));
561
562           spin_lock_irq(&pDevice->lock);
563	 SROMvReadAllContents(pDevice->PortOffset,pDevice->abyEEPROM);
564
565           spin_unlock_irq(&pDevice->lock);
566
567        // Get Channel range
568
569        pDevice->byMinChannel = 1;
570        pDevice->byMaxChannel = CB_MAX_CHANNEL;
571
572        // Get Antena
573        byValue = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ANTENNA);
574        if (byValue & EEP_ANTINV)
575            pDevice->bTxRxAntInv = true;
576        else
577            pDevice->bTxRxAntInv = false;
578#ifdef	PLICE_DEBUG
579	//printk("init_register:TxRxAntInv is %d,byValue is %d\n",pDevice->bTxRxAntInv,byValue);
580#endif
581
582        byValue &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
583        if (byValue == 0) // if not set default is All
584            byValue = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
585#ifdef	PLICE_DEBUG
586	//printk("init_register:byValue is %d\n",byValue);
587#endif
588        pDevice->ulDiversityNValue = 100*260;//100*SROMbyReadEmbedded(pDevice->PortOffset, 0x51);
589        pDevice->ulDiversityMValue = 100*16;//SROMbyReadEmbedded(pDevice->PortOffset, 0x52);
590        pDevice->byTMax = 1;//SROMbyReadEmbedded(pDevice->PortOffset, 0x53);
591        pDevice->byTMax2 = 4;//SROMbyReadEmbedded(pDevice->PortOffset, 0x54);
592        pDevice->ulSQ3TH = 0;//(unsigned long) SROMbyReadEmbedded(pDevice->PortOffset, 0x55);
593        pDevice->byTMax3 = 64;//SROMbyReadEmbedded(pDevice->PortOffset, 0x56);
594
595        if (byValue == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
596            pDevice->byAntennaCount = 2;
597            pDevice->byTxAntennaMode = ANT_B;
598            pDevice->dwTxAntennaSel = 1;
599            pDevice->dwRxAntennaSel = 1;
600            if (pDevice->bTxRxAntInv == true)
601                pDevice->byRxAntennaMode = ANT_A;
602            else
603                pDevice->byRxAntennaMode = ANT_B;
604                // chester for antenna
605byValue1 = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ANTENNA);
606          //  if (pDevice->bDiversityRegCtlON)
607          if((byValue1&0x08)==0)
608                pDevice->bDiversityEnable = false;//SROMbyReadEmbedded(pDevice->PortOffset, 0x50);
609            else
610                pDevice->bDiversityEnable = true;
611#ifdef	PLICE_DEBUG
612		//printk("aux |main antenna: RxAntennaMode is %d\n",pDevice->byRxAntennaMode);
613#endif
614	} else  {
615            pDevice->bDiversityEnable = false;
616            pDevice->byAntennaCount = 1;
617            pDevice->dwTxAntennaSel = 0;
618            pDevice->dwRxAntennaSel = 0;
619            if (byValue & EEP_ANTENNA_AUX) {
620                pDevice->byTxAntennaMode = ANT_A;
621                if (pDevice->bTxRxAntInv == true)
622                    pDevice->byRxAntennaMode = ANT_B;
623                else
624                    pDevice->byRxAntennaMode = ANT_A;
625            } else {
626                pDevice->byTxAntennaMode = ANT_B;
627                if (pDevice->bTxRxAntInv == true)
628                    pDevice->byRxAntennaMode = ANT_A;
629                else
630                    pDevice->byRxAntennaMode = ANT_B;
631            }
632        }
633#ifdef	PLICE_DEBUG
634	//printk("init registers: TxAntennaMode is %d\n",pDevice->byTxAntennaMode);
635#endif
636        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "bDiversityEnable=[%d],NValue=[%d],MValue=[%d],TMax=[%d],TMax2=[%d]\n",
637            pDevice->bDiversityEnable,(int)pDevice->ulDiversityNValue,(int)pDevice->ulDiversityMValue,pDevice->byTMax,pDevice->byTMax2);
638
639//#ifdef ZoneType_DefaultSetting
640//2008-8-4 <add> by chester
641//zonetype initial
642 pDevice->byOriginalZonetype = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
643 zonetype = Config_FileOperation(pDevice,false,NULL);
644 if (zonetype >= 0) {         //read zonetype file ok!
645  if ((zonetype == 0)&&
646        (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] !=0x00)){          //for USA
647    pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0;
648    pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0B;
649    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Init Zone Type :USA\n");
650  }
651 else if((zonetype == 1)&&
652 	     (pDevice->abyEEPROM[EEP_OFS_ZONETYPE]!=0x01)){   //for Japan
653    pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0x01;
654    pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
655  }
656 else if((zonetype == 2)&&
657 	     (pDevice->abyEEPROM[EEP_OFS_ZONETYPE]!=0x02)){   //for Europe
658    pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0x02;
659    pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
660    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Init Zone Type :Europe\n");
661  }
662
663else
664{
665   if(zonetype!=pDevice->abyEEPROM[EEP_OFS_ZONETYPE])
666      printk("zonetype in file[%02x] mismatch with in EEPROM[%02x]\n",zonetype,pDevice->abyEEPROM[EEP_OFS_ZONETYPE]);
667   else
668      printk("Read Zonetype file success,use default zonetype setting[%02x]\n",zonetype);
669 }
670 	}
671  else
672    printk("Read Zonetype file fail,use default zonetype setting[%02x]\n",SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ZONETYPE));
673
674        // Get RFType
675        pDevice->byRFType = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RFTYPE);
676
677        if ((pDevice->byRFType & RF_EMU) != 0) {
678            // force change RevID for VT3253 emu
679            pDevice->byRevId = 0x80;
680        }
681
682        pDevice->byRFType &= RF_MASK;
683        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRFType = %x\n", pDevice->byRFType);
684
685        if (pDevice->bZoneRegExist == false) {
686            pDevice->byZoneType = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
687        }
688        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byZoneType = %x\n", pDevice->byZoneType);
689
690        //Init RF module
691        RFbInit(pDevice);
692
693        //Get Desire Power Value
694        pDevice->byCurPwr = 0xFF;
695        pDevice->byCCKPwr = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_PWR_CCK);
696        pDevice->byOFDMPwrG = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_PWR_OFDMG);
697        //byCCKPwrdBm = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_CCK_PWR_dBm);
698
699	//byOFDMPwrdBm = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_OFDM_PWR_dBm);
700//printk("CCKPwrdBm is 0x%x,byOFDMPwrdBm is 0x%x\n",byCCKPwrdBm,byOFDMPwrdBm);
701		// Load power Table
702
703
704        for (ii=0;ii<CB_MAX_CHANNEL_24G;ii++) {
705            pDevice->abyCCKPwrTbl[ii+1] = SROMbyReadEmbedded(pDevice->PortOffset, (unsigned char)(ii + EEP_OFS_CCK_PWR_TBL));
706            if (pDevice->abyCCKPwrTbl[ii+1] == 0) {
707                pDevice->abyCCKPwrTbl[ii+1] = pDevice->byCCKPwr;
708            }
709            pDevice->abyOFDMPwrTbl[ii+1] = SROMbyReadEmbedded(pDevice->PortOffset, (unsigned char)(ii + EEP_OFS_OFDM_PWR_TBL));
710            if (pDevice->abyOFDMPwrTbl[ii+1] == 0) {
711                pDevice->abyOFDMPwrTbl[ii+1] = pDevice->byOFDMPwrG;
712            }
713            pDevice->abyCCKDefaultPwr[ii+1] = byCCKPwrdBm;
714            pDevice->abyOFDMDefaultPwr[ii+1] = byOFDMPwrdBm;
715        }
716		//2008-8-4 <add> by chester
717	  //recover 12,13 ,14channel for EUROPE by 11 channel
718          if(((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) ||
719	        (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe))&&
720	     (pDevice->byOriginalZonetype == ZoneType_USA)) {
721	    for(ii=11;ii<14;ii++) {
722                pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
723	       pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];
724
725	    }
726	  }
727
728
729        // Load OFDM A Power Table
730        for (ii=0;ii<CB_MAX_CHANNEL_5G;ii++) { //RobertYu:20041224, bug using CB_MAX_CHANNEL
731            pDevice->abyOFDMPwrTbl[ii+CB_MAX_CHANNEL_24G+1] = SROMbyReadEmbedded(pDevice->PortOffset, (unsigned char)(ii + EEP_OFS_OFDMA_PWR_TBL));
732            pDevice->abyOFDMDefaultPwr[ii+CB_MAX_CHANNEL_24G+1] = SROMbyReadEmbedded(pDevice->PortOffset, (unsigned char)(ii + EEP_OFS_OFDMA_PWR_dBm));
733        }
734        init_channel_table((void *)pDevice);
735
736
737        if (pDevice->byLocalID > REV_ID_VT3253_B1) {
738            MACvSelectPage1(pDevice->PortOffset);
739            VNSvOutPortB(pDevice->PortOffset + MAC_REG_MSRCTL + 1, (MSRCTL1_TXPWR | MSRCTL1_CSAPAREN));
740            MACvSelectPage0(pDevice->PortOffset);
741        }
742
743
744         // use relative tx timeout and 802.11i D4
745        MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_CFG, (CFG_TKIPOPT | CFG_NOTXTIMEOUT));
746
747        // set performance parameter by registry
748        MACvSetShortRetryLimit(pDevice->PortOffset, pDevice->byShortRetryLimit);
749        MACvSetLongRetryLimit(pDevice->PortOffset, pDevice->byLongRetryLimit);
750
751        // reset TSF counter
752        VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
753        // enable TSF counter
754        VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
755
756        // initialize BBP registers
757        BBbVT3253Init(pDevice);
758
759        if (pDevice->bUpdateBBVGA) {
760            pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
761            pDevice->byBBVGANew = pDevice->byBBVGACurrent;
762            BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
763        }
764#ifdef	PLICE_DEBUG
765	//printk("init registers:RxAntennaMode is %x,TxAntennaMode is %x\n",pDevice->byRxAntennaMode,pDevice->byTxAntennaMode);
766#endif
767        BBvSetRxAntennaMode(pDevice->PortOffset, pDevice->byRxAntennaMode);
768        BBvSetTxAntennaMode(pDevice->PortOffset, pDevice->byTxAntennaMode);
769
770        pDevice->byCurrentCh = 0;
771
772        //pDevice->NetworkType = Ndis802_11Automode;
773        // Set BB and packet type at the same time.
774        // Set Short Slot Time, xIFS, and RSPINF.
775        if (pDevice->uConnectionRate == RATE_AUTO) {
776            pDevice->wCurrentRate = RATE_54M;
777        } else {
778            pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
779        }
780
781        // default G Mode
782        VNTWIFIbConfigPhyMode(pDevice->pMgmt, PHY_TYPE_11G);
783        VNTWIFIbConfigPhyMode(pDevice->pMgmt, PHY_TYPE_AUTO);
784
785        pDevice->bRadioOff = false;
786
787        pDevice->byRadioCtl = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RADIOCTL);
788        pDevice->bHWRadioOff = false;
789
790        if (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) {
791            // Get GPIO
792            MACvGPIOIn(pDevice->PortOffset, &pDevice->byGPIO);
793//2008-4-14 <add> by chester for led issue
794 #ifdef FOR_LED_ON_NOTEBOOK
795if (pDevice->byGPIO & GPIO0_DATA){pDevice->bHWRadioOff = true;}
796if ( !(pDevice->byGPIO & GPIO0_DATA)){pDevice->bHWRadioOff = false;}
797
798            }
799        if ( (pDevice->bRadioControlOff == true)) {
800            CARDbRadioPowerOff(pDevice);
801        }
802else  CARDbRadioPowerOn(pDevice);
803#else
804            if (((pDevice->byGPIO & GPIO0_DATA) && !(pDevice->byRadioCtl & EEP_RADIOCTL_INV)) ||
805                ( !(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV))) {
806                pDevice->bHWRadioOff = true;
807            }
808        }
809        if ((pDevice->bHWRadioOff == true) || (pDevice->bRadioControlOff == true)) {
810            CARDbRadioPowerOff(pDevice);
811        }
812
813#endif
814    }
815            pMgmt->eScanType = WMAC_SCAN_PASSIVE;
816    // get Permanent network address
817    SROMvReadEtherAddress(pDevice->PortOffset, pDevice->abyCurrentNetAddr);
818    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Network address = %02x-%02x-%02x=%02x-%02x-%02x\n",
819        pDevice->abyCurrentNetAddr[0],
820        pDevice->abyCurrentNetAddr[1],
821        pDevice->abyCurrentNetAddr[2],
822        pDevice->abyCurrentNetAddr[3],
823        pDevice->abyCurrentNetAddr[4],
824        pDevice->abyCurrentNetAddr[5]);
825
826
827    // reset Tx pointer
828    CARDvSafeResetRx(pDevice);
829    // reset Rx pointer
830    CARDvSafeResetTx(pDevice);
831
832    if (pDevice->byLocalID <= REV_ID_VT3253_A1) {
833        MACvRegBitsOn(pDevice->PortOffset, MAC_REG_RCR, RCR_WPAERR);
834    }
835
836    pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
837
838    // Turn On Rx DMA
839    MACvReceive0(pDevice->PortOffset);
840    MACvReceive1(pDevice->PortOffset);
841
842    // start the adapter
843    MACvStart(pDevice->PortOffset);
844
845    netif_stop_queue(pDevice->dev);
846
847
848}
849
850
851
852static void device_init_diversity_timer(PSDevice pDevice) {
853
854    init_timer(&pDevice->TimerSQ3Tmax1);
855    pDevice->TimerSQ3Tmax1.data = (unsigned long) pDevice;
856    pDevice->TimerSQ3Tmax1.function = (TimerFunction)TimerSQ3CallBack;
857    pDevice->TimerSQ3Tmax1.expires = RUN_AT(HZ);
858
859    init_timer(&pDevice->TimerSQ3Tmax2);
860    pDevice->TimerSQ3Tmax2.data = (unsigned long) pDevice;
861    pDevice->TimerSQ3Tmax2.function = (TimerFunction)TimerSQ3CallBack;
862    pDevice->TimerSQ3Tmax2.expires = RUN_AT(HZ);
863
864    init_timer(&pDevice->TimerSQ3Tmax3);
865    pDevice->TimerSQ3Tmax3.data = (unsigned long) pDevice;
866    pDevice->TimerSQ3Tmax3.function = (TimerFunction)TimerState1CallBack;
867    pDevice->TimerSQ3Tmax3.expires = RUN_AT(HZ);
868
869    return;
870}
871
872
873static bool device_release_WPADEV(PSDevice pDevice)
874{
875  viawget_wpa_header *wpahdr;
876  int ii=0;
877 // wait_queue_head_t	Set_wait;
878  //send device close to wpa_supplicnat layer
879    if (pDevice->bWPADEVUp==true) {
880                 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
881                 wpahdr->type = VIAWGET_DEVICECLOSE_MSG;
882                 wpahdr->resp_ie_len = 0;
883                 wpahdr->req_ie_len = 0;
884                 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
885                 pDevice->skb->dev = pDevice->wpadev;
886		 skb_reset_mac_header(pDevice->skb);
887                 pDevice->skb->pkt_type = PACKET_HOST;
888                 pDevice->skb->protocol = htons(ETH_P_802_2);
889                 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
890                 netif_rx(pDevice->skb);
891                 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
892
893 //wait release WPADEV
894              //    init_waitqueue_head(&Set_wait);
895              //    wait_event_timeout(Set_wait, ((pDevice->wpadev==NULL)&&(pDevice->skb == NULL)),5*HZ);    //1s wait
896              while((pDevice->bWPADEVUp==true)) {
897	        set_current_state(TASK_UNINTERRUPTIBLE);
898                 schedule_timeout (HZ/20);          //wait 50ms
899                 ii++;
900	        if(ii>20)
901		  break;
902              }
903           }
904    return true;
905}
906
907
908static const struct net_device_ops device_netdev_ops = {
909    .ndo_open               = device_open,
910    .ndo_stop               = device_close,
911    .ndo_do_ioctl           = device_ioctl,
912    .ndo_get_stats          = device_get_stats,
913    .ndo_start_xmit         = device_xmit,
914    .ndo_set_rx_mode	    = device_set_multi,
915};
916
917
918
919static int __devinit
920vt6655_probe(struct pci_dev *pcid, const struct pci_device_id *ent)
921{
922    static bool bFirst = true;
923    struct net_device*  dev = NULL;
924    PCHIP_INFO  pChip_info = (PCHIP_INFO)ent->driver_data;
925    PSDevice    pDevice;
926    int         rc;
927    if (device_nics ++>= MAX_UINTS) {
928        printk(KERN_NOTICE DEVICE_NAME ": already found %d NICs\n", device_nics);
929        return -ENODEV;
930    }
931
932
933    dev = alloc_etherdev(sizeof(DEVICE_INFO));
934
935    pDevice = (PSDevice) netdev_priv(dev);
936
937    if (dev == NULL) {
938        printk(KERN_ERR DEVICE_NAME ": allocate net device failed \n");
939        return -ENODEV;
940    }
941
942    // Chain it all together
943   // SET_MODULE_OWNER(dev);
944    SET_NETDEV_DEV(dev, &pcid->dev);
945
946    if (bFirst) {
947        printk(KERN_NOTICE "%s Ver. %s\n",DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
948        printk(KERN_NOTICE "Copyright (c) 2003 VIA Networking Technologies, Inc.\n");
949        bFirst=false;
950    }
951
952    if (!vt6655_init_info(pcid, &pDevice, pChip_info)) {
953        return -ENOMEM;
954    }
955    pDevice->dev = dev;
956    pDevice->next_module = root_device_dev;
957    root_device_dev = dev;
958
959    if (pci_enable_device(pcid)) {
960        device_free_info(pDevice);
961        return -ENODEV;
962    }
963    dev->irq = pcid->irq;
964
965#ifdef	DEBUG
966	printk("Before get pci_info memaddr is %x\n",pDevice->memaddr);
967#endif
968    if (device_get_pci_info(pDevice,pcid) == false) {
969        printk(KERN_ERR DEVICE_NAME ": Failed to find PCI device.\n");
970        device_free_info(pDevice);
971        return -ENODEV;
972    }
973
974#if 1
975
976#ifdef	DEBUG
977
978	//pci_read_config_byte(pcid, PCI_BASE_ADDRESS_0, &pDevice->byRevId);
979	printk("after get pci_info memaddr is %x, io addr is %x,io_size is %d\n",pDevice->memaddr,pDevice->ioaddr,pDevice->io_size);
980	{
981		int i;
982		u32			bar,len;
983		u32 address[] = {
984		PCI_BASE_ADDRESS_0,
985		PCI_BASE_ADDRESS_1,
986		PCI_BASE_ADDRESS_2,
987		PCI_BASE_ADDRESS_3,
988		PCI_BASE_ADDRESS_4,
989		PCI_BASE_ADDRESS_5,
990		0};
991		for (i=0;address[i];i++)
992		{
993			//pci_write_config_dword(pcid,address[i], 0xFFFFFFFF);
994			pci_read_config_dword(pcid, address[i], &bar);
995			printk("bar %d is %x\n",i,bar);
996			if (!bar)
997			{
998				printk("bar %d not implemented\n",i);
999				continue;
1000			}
1001			if (bar & PCI_BASE_ADDRESS_SPACE_IO) {
1002			/* This is IO */
1003
1004			len = bar & (PCI_BASE_ADDRESS_IO_MASK & 0xFFFF);
1005			len = len & ~(len - 1);
1006
1007			printk("IO space:  len in IO %x, BAR %d\n", len, i);
1008			}
1009			else
1010			{
1011				len = bar & 0xFFFFFFF0;
1012				len = ~len + 1;
1013
1014				printk("len in MEM %x, BAR %d\n", len, i);
1015			}
1016		}
1017	}
1018#endif
1019
1020
1021#endif
1022
1023#ifdef	DEBUG
1024	//return  0  ;
1025#endif
1026    pDevice->PortOffset = (unsigned long)ioremap(pDevice->memaddr & PCI_BASE_ADDRESS_MEM_MASK, pDevice->io_size);
1027	//pDevice->PortOffset = (unsigned long)ioremap(pDevice->ioaddr & PCI_BASE_ADDRESS_IO_MASK, pDevice->io_size);
1028
1029	if(pDevice->PortOffset == 0) {
1030       printk(KERN_ERR DEVICE_NAME ": Failed to IO remapping ..\n");
1031       device_free_info(pDevice);
1032        return -ENODEV;
1033    }
1034
1035
1036
1037
1038    rc = pci_request_regions(pcid, DEVICE_NAME);
1039    if (rc) {
1040        printk(KERN_ERR DEVICE_NAME ": Failed to find PCI device\n");
1041        device_free_info(pDevice);
1042        return -ENODEV;
1043    }
1044
1045    dev->base_addr = pDevice->ioaddr;
1046#ifdef	PLICE_DEBUG
1047	unsigned char 	value;
1048
1049	VNSvInPortB(pDevice->PortOffset+0x4F, &value);
1050	printk("Before write: value is %x\n",value);
1051	//VNSvInPortB(pDevice->PortOffset+0x3F, 0x00);
1052	VNSvOutPortB(pDevice->PortOffset,value);
1053	VNSvInPortB(pDevice->PortOffset+0x4F, &value);
1054	printk("After write: value is %x\n",value);
1055#endif
1056
1057
1058
1059#ifdef IO_MAP
1060    pDevice->PortOffset = pDevice->ioaddr;
1061#endif
1062    // do reset
1063    if (!MACbSoftwareReset(pDevice->PortOffset)) {
1064        printk(KERN_ERR DEVICE_NAME ": Failed to access MAC hardware..\n");
1065        device_free_info(pDevice);
1066        return -ENODEV;
1067    }
1068    // initial to reload eeprom
1069    MACvInitialize(pDevice->PortOffset);
1070    MACvReadEtherAddress(pDevice->PortOffset, dev->dev_addr);
1071
1072    device_get_options(pDevice, device_nics-1, dev->name);
1073    device_set_options(pDevice);
1074    //Mask out the options cannot be set to the chip
1075    pDevice->sOpts.flags &= pChip_info->flags;
1076
1077    //Enable the chip specified capbilities
1078    pDevice->flags = pDevice->sOpts.flags | (pChip_info->flags & 0xFF000000UL);
1079    pDevice->tx_80211 = device_dma0_tx_80211;
1080    pDevice->sMgmtObj.pAdapter = (void *)pDevice;
1081    pDevice->pMgmt = &(pDevice->sMgmtObj);
1082
1083    dev->irq                = pcid->irq;
1084    dev->netdev_ops         = &device_netdev_ops;
1085
1086	dev->wireless_handlers = (struct iw_handler_def *)&iwctl_handler_def;
1087
1088    rc = register_netdev(dev);
1089    if (rc)
1090    {
1091        printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
1092        device_free_info(pDevice);
1093        return -ENODEV;
1094    }
1095//2008-07-21-01<Add>by MikeLiu
1096//register wpadev
1097#if 0
1098   if(wpa_set_wpadev(pDevice, 1)!=0) {
1099     printk("Fail to Register WPADEV?\n");
1100        unregister_netdev(pDevice->dev);
1101        free_netdev(dev);
1102   }
1103#endif
1104    device_print_info(pDevice);
1105    pci_set_drvdata(pcid, pDevice);
1106    return 0;
1107
1108}
1109
1110static void device_print_info(PSDevice pDevice)
1111{
1112    struct net_device* dev=pDevice->dev;
1113
1114    DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: %s\n",dev->name, get_chip_name(pDevice->chip_id));
1115    DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: MAC=%pM", dev->name, dev->dev_addr);
1116#ifdef IO_MAP
1117    DBG_PRT(MSG_LEVEL_INFO, KERN_INFO" IO=0x%lx  ",(unsigned long) pDevice->ioaddr);
1118    DBG_PRT(MSG_LEVEL_INFO, KERN_INFO" IRQ=%d \n", pDevice->dev->irq);
1119#else
1120    DBG_PRT(MSG_LEVEL_INFO, KERN_INFO" IO=0x%lx Mem=0x%lx ",
1121		    (unsigned long) pDevice->ioaddr,(unsigned long) pDevice->PortOffset);
1122    DBG_PRT(MSG_LEVEL_INFO, KERN_INFO" IRQ=%d \n", pDevice->dev->irq);
1123#endif
1124
1125}
1126
1127static bool __devinit vt6655_init_info(struct pci_dev* pcid, PSDevice* ppDevice,
1128    PCHIP_INFO pChip_info) {
1129
1130    PSDevice p;
1131
1132    memset(*ppDevice,0,sizeof(DEVICE_INFO));
1133
1134    if (pDevice_Infos == NULL) {
1135        pDevice_Infos =*ppDevice;
1136    }
1137    else {
1138        for (p=pDevice_Infos;p->next!=NULL;p=p->next)
1139            do {} while (0);
1140        p->next = *ppDevice;
1141        (*ppDevice)->prev = p;
1142    }
1143
1144    (*ppDevice)->pcid = pcid;
1145    (*ppDevice)->chip_id = pChip_info->chip_id;
1146    (*ppDevice)->io_size = pChip_info->io_size;
1147    (*ppDevice)->nTxQueues = pChip_info->nTxQueue;
1148    (*ppDevice)->multicast_limit =32;
1149
1150    spin_lock_init(&((*ppDevice)->lock));
1151
1152    return true;
1153}
1154
1155static bool device_get_pci_info(PSDevice pDevice, struct pci_dev* pcid) {
1156
1157    u16 pci_cmd;
1158    u8  b;
1159    unsigned int cis_addr;
1160#ifdef	PLICE_DEBUG
1161	unsigned char pci_config[256];
1162	unsigned char 	value =0x00;
1163	int		ii,j;
1164	u16	max_lat=0x0000;
1165	memset(pci_config,0x00,256);
1166#endif
1167
1168    pci_read_config_byte(pcid, PCI_REVISION_ID, &pDevice->byRevId);
1169    pci_read_config_word(pcid, PCI_SUBSYSTEM_ID,&pDevice->SubSystemID);
1170    pci_read_config_word(pcid, PCI_SUBSYSTEM_VENDOR_ID, &pDevice->SubVendorID);
1171    pci_read_config_word(pcid, PCI_COMMAND, (u16 *) & (pci_cmd));
1172
1173    pci_set_master(pcid);
1174
1175    pDevice->memaddr = pci_resource_start(pcid,0);
1176    pDevice->ioaddr = pci_resource_start(pcid,1);
1177
1178#ifdef	DEBUG
1179//	pDevice->ioaddr = pci_resource_start(pcid, 0);
1180//	pDevice->memaddr = pci_resource_start(pcid,1);
1181#endif
1182
1183    cis_addr = pci_resource_start(pcid,2);
1184
1185    pDevice->pcid = pcid;
1186
1187    pci_read_config_byte(pcid, PCI_COMMAND, &b);
1188    pci_write_config_byte(pcid, PCI_COMMAND, (b|PCI_COMMAND_MASTER));
1189
1190#ifdef	PLICE_DEBUG
1191   	//pci_read_config_word(pcid,PCI_MAX_LAT,&max_lat);
1192	//printk("max lat is %x,SubSystemID is %x\n",max_lat,pDevice->SubSystemID);
1193	//for (ii=0;ii<0xFF;ii++)
1194	//pci_read_config_word(pcid,PCI_MAX_LAT,&max_lat);
1195	//max_lat  = 0x20;
1196	//pci_write_config_word(pcid,PCI_MAX_LAT,max_lat);
1197	//pci_read_config_word(pcid,PCI_MAX_LAT,&max_lat);
1198	//printk("max lat is %x\n",max_lat);
1199
1200	for (ii=0;ii<0xFF;ii++)
1201	{
1202		pci_read_config_byte(pcid,ii,&value);
1203		pci_config[ii] = value;
1204	}
1205	for (ii=0,j=1;ii<0x100;ii++,j++)
1206	{
1207		if (j %16 == 0)
1208		{
1209			printk("%x:",pci_config[ii]);
1210			printk("\n");
1211		}
1212		else
1213		{
1214			printk("%x:",pci_config[ii]);
1215		}
1216	}
1217#endif
1218    return true;
1219}
1220
1221static void device_free_info(PSDevice pDevice) {
1222    PSDevice         ptr;
1223    struct net_device*  dev=pDevice->dev;
1224
1225    ASSERT(pDevice);
1226//2008-0714-01<Add>by chester
1227device_release_WPADEV(pDevice);
1228
1229//2008-07-21-01<Add>by MikeLiu
1230//unregister wpadev
1231   if(wpa_set_wpadev(pDevice, 0)!=0)
1232     printk("unregister wpadev fail?\n");
1233
1234    if (pDevice_Infos==NULL)
1235        return;
1236
1237    for (ptr=pDevice_Infos;ptr && (ptr!=pDevice);ptr=ptr->next)
1238            do {} while (0);
1239
1240    if (ptr==pDevice) {
1241        if (ptr==pDevice_Infos)
1242            pDevice_Infos=ptr->next;
1243        else
1244            ptr->prev->next=ptr->next;
1245    }
1246    else {
1247        DBG_PRT(MSG_LEVEL_ERR, KERN_ERR "info struct not found\n");
1248        return;
1249    }
1250#ifdef HOSTAP
1251    if (dev)
1252        vt6655_hostap_set_hostapd(pDevice, 0, 0);
1253#endif
1254    if (dev)
1255        unregister_netdev(dev);
1256
1257    if (pDevice->PortOffset)
1258        iounmap((void *)pDevice->PortOffset);
1259
1260    if (pDevice->pcid)
1261        pci_release_regions(pDevice->pcid);
1262    if (dev)
1263        free_netdev(dev);
1264
1265    if (pDevice->pcid) {
1266        pci_set_drvdata(pDevice->pcid,NULL);
1267    }
1268}
1269
1270static bool device_init_rings(PSDevice pDevice) {
1271    void*   vir_pool;
1272
1273
1274    /*allocate all RD/TD rings a single pool*/
1275    vir_pool = pci_alloc_consistent(pDevice->pcid,
1276                    pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1277                    pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1278                    pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1279                    pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
1280                    &pDevice->pool_dma);
1281
1282    if (vir_pool == NULL) {
1283        DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate desc dma memory failed\n", pDevice->dev->name);
1284        return false;
1285    }
1286
1287    memset(vir_pool, 0,
1288            pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1289            pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1290            pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1291            pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc)
1292          );
1293
1294    pDevice->aRD0Ring = vir_pool;
1295    pDevice->aRD1Ring = vir_pool +
1296                        pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
1297
1298
1299    pDevice->rd0_pool_dma = pDevice->pool_dma;
1300    pDevice->rd1_pool_dma = pDevice->rd0_pool_dma +
1301                            pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
1302
1303    pDevice->tx0_bufs = pci_alloc_consistent(pDevice->pcid,
1304                    pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
1305                    pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
1306                    CB_BEACON_BUF_SIZE +
1307                    CB_MAX_BUF_SIZE,
1308                    &pDevice->tx_bufs_dma0);
1309
1310    if (pDevice->tx0_bufs == NULL) {
1311        DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: allocate buf dma memory failed\n", pDevice->dev->name);
1312        pci_free_consistent(pDevice->pcid,
1313            pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1314            pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1315            pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1316            pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
1317            vir_pool, pDevice->pool_dma
1318            );
1319        return false;
1320    }
1321
1322    memset(pDevice->tx0_bufs, 0,
1323           pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
1324           pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
1325           CB_BEACON_BUF_SIZE +
1326           CB_MAX_BUF_SIZE
1327          );
1328
1329    pDevice->td0_pool_dma = pDevice->rd1_pool_dma +
1330            pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
1331
1332    pDevice->td1_pool_dma = pDevice->td0_pool_dma +
1333            pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
1334
1335
1336    // vir_pool: pvoid type
1337    pDevice->apTD0Rings = vir_pool
1338                          + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
1339                          + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
1340
1341    pDevice->apTD1Rings = vir_pool
1342            + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
1343            + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc)
1344            + pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
1345
1346
1347    pDevice->tx1_bufs = pDevice->tx0_bufs +
1348            pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
1349
1350
1351    pDevice->tx_beacon_bufs = pDevice->tx1_bufs +
1352            pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
1353
1354    pDevice->pbyTmpBuff = pDevice->tx_beacon_bufs +
1355            CB_BEACON_BUF_SIZE;
1356
1357    pDevice->tx_bufs_dma1 = pDevice->tx_bufs_dma0 +
1358            pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
1359
1360
1361    pDevice->tx_beacon_dma = pDevice->tx_bufs_dma1 +
1362            pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
1363
1364
1365    return true;
1366}
1367
1368static void device_free_rings(PSDevice pDevice) {
1369
1370    pci_free_consistent(pDevice->pcid,
1371            pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1372            pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1373            pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1374            pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc)
1375            ,
1376            pDevice->aRD0Ring, pDevice->pool_dma
1377        );
1378
1379    if (pDevice->tx0_bufs)
1380        pci_free_consistent(pDevice->pcid,
1381           pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
1382           pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
1383           CB_BEACON_BUF_SIZE +
1384           CB_MAX_BUF_SIZE,
1385           pDevice->tx0_bufs, pDevice->tx_bufs_dma0
1386        );
1387}
1388
1389static void device_init_rd0_ring(PSDevice pDevice) {
1390    int i;
1391    dma_addr_t      curr = pDevice->rd0_pool_dma;
1392    PSRxDesc        pDesc;
1393
1394    /* Init the RD0 ring entries */
1395    for (i = 0; i < pDevice->sOpts.nRxDescs0; i ++, curr += sizeof(SRxDesc)) {
1396        pDesc = &(pDevice->aRD0Ring[i]);
1397        pDesc->pRDInfo = alloc_rd_info();
1398        ASSERT(pDesc->pRDInfo);
1399        if (!device_alloc_rx_buf(pDevice, pDesc)) {
1400            DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc rx bufs\n",
1401            pDevice->dev->name);
1402        }
1403        pDesc->next = &(pDevice->aRD0Ring[(i+1) % pDevice->sOpts.nRxDescs0]);
1404        pDesc->pRDInfo->curr_desc = cpu_to_le32(curr);
1405        pDesc->next_desc = cpu_to_le32(curr + sizeof(SRxDesc));
1406    }
1407
1408    if (i > 0)
1409        pDevice->aRD0Ring[i-1].next_desc = cpu_to_le32(pDevice->rd0_pool_dma);
1410    pDevice->pCurrRD[0] = &(pDevice->aRD0Ring[0]);
1411}
1412
1413
1414static void device_init_rd1_ring(PSDevice pDevice) {
1415    int i;
1416    dma_addr_t      curr = pDevice->rd1_pool_dma;
1417    PSRxDesc        pDesc;
1418
1419    /* Init the RD1 ring entries */
1420    for (i = 0; i < pDevice->sOpts.nRxDescs1; i ++, curr += sizeof(SRxDesc)) {
1421        pDesc = &(pDevice->aRD1Ring[i]);
1422        pDesc->pRDInfo = alloc_rd_info();
1423        ASSERT(pDesc->pRDInfo);
1424        if (!device_alloc_rx_buf(pDevice, pDesc)) {
1425            DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc rx bufs\n",
1426            pDevice->dev->name);
1427        }
1428        pDesc->next = &(pDevice->aRD1Ring[(i+1) % pDevice->sOpts.nRxDescs1]);
1429        pDesc->pRDInfo->curr_desc = cpu_to_le32(curr);
1430        pDesc->next_desc = cpu_to_le32(curr + sizeof(SRxDesc));
1431    }
1432
1433    if (i > 0)
1434        pDevice->aRD1Ring[i-1].next_desc = cpu_to_le32(pDevice->rd1_pool_dma);
1435    pDevice->pCurrRD[1] = &(pDevice->aRD1Ring[0]);
1436}
1437
1438
1439static void device_init_defrag_cb(PSDevice pDevice) {
1440    int i;
1441    PSDeFragControlBlock pDeF;
1442
1443    /* Init the fragment ctl entries */
1444    for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1445        pDeF = &(pDevice->sRxDFCB[i]);
1446        if (!device_alloc_frag_buf(pDevice, pDeF)) {
1447            DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
1448                pDevice->dev->name);
1449        }
1450    }
1451    pDevice->cbDFCB = CB_MAX_RX_FRAG;
1452    pDevice->cbFreeDFCB = pDevice->cbDFCB;
1453}
1454
1455
1456
1457
1458static void device_free_rd0_ring(PSDevice pDevice) {
1459    int i;
1460
1461    for (i = 0; i < pDevice->sOpts.nRxDescs0; i++) {
1462        PSRxDesc        pDesc =&(pDevice->aRD0Ring[i]);
1463        PDEVICE_RD_INFO  pRDInfo =pDesc->pRDInfo;
1464
1465        pci_unmap_single(pDevice->pcid,pRDInfo->skb_dma,
1466           pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1467
1468        dev_kfree_skb(pRDInfo->skb);
1469
1470        kfree((void *)pDesc->pRDInfo);
1471    }
1472
1473}
1474
1475static void device_free_rd1_ring(PSDevice pDevice) {
1476    int i;
1477
1478
1479    for (i = 0; i < pDevice->sOpts.nRxDescs1; i++) {
1480        PSRxDesc        pDesc=&(pDevice->aRD1Ring[i]);
1481        PDEVICE_RD_INFO  pRDInfo=pDesc->pRDInfo;
1482
1483        pci_unmap_single(pDevice->pcid,pRDInfo->skb_dma,
1484           pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1485
1486        dev_kfree_skb(pRDInfo->skb);
1487
1488        kfree((void *)pDesc->pRDInfo);
1489    }
1490
1491}
1492
1493static void device_free_frag_buf(PSDevice pDevice) {
1494    PSDeFragControlBlock pDeF;
1495    int i;
1496
1497    for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1498
1499        pDeF = &(pDevice->sRxDFCB[i]);
1500
1501        if (pDeF->skb)
1502            dev_kfree_skb(pDeF->skb);
1503
1504    }
1505
1506}
1507
1508static void device_init_td0_ring(PSDevice pDevice) {
1509    int i;
1510    dma_addr_t  curr;
1511    PSTxDesc        pDesc;
1512
1513    curr = pDevice->td0_pool_dma;
1514    for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++, curr += sizeof(STxDesc)) {
1515        pDesc = &(pDevice->apTD0Rings[i]);
1516        pDesc->pTDInfo = alloc_td_info();
1517        ASSERT(pDesc->pTDInfo);
1518        if (pDevice->flags & DEVICE_FLAGS_TX_ALIGN) {
1519            pDesc->pTDInfo->buf = pDevice->tx0_bufs + (i)*PKT_BUF_SZ;
1520            pDesc->pTDInfo->buf_dma = pDevice->tx_bufs_dma0 + (i)*PKT_BUF_SZ;
1521        }
1522        pDesc->next =&(pDevice->apTD0Rings[(i+1) % pDevice->sOpts.nTxDescs[0]]);
1523        pDesc->pTDInfo->curr_desc = cpu_to_le32(curr);
1524        pDesc->next_desc = cpu_to_le32(curr+sizeof(STxDesc));
1525    }
1526
1527    if (i > 0)
1528        pDevice->apTD0Rings[i-1].next_desc = cpu_to_le32(pDevice->td0_pool_dma);
1529    pDevice->apTailTD[0] = pDevice->apCurrTD[0] =&(pDevice->apTD0Rings[0]);
1530
1531}
1532
1533static void device_init_td1_ring(PSDevice pDevice) {
1534    int i;
1535    dma_addr_t  curr;
1536    PSTxDesc    pDesc;
1537
1538    /* Init the TD ring entries */
1539    curr=pDevice->td1_pool_dma;
1540    for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++, curr+=sizeof(STxDesc)) {
1541        pDesc=&(pDevice->apTD1Rings[i]);
1542        pDesc->pTDInfo = alloc_td_info();
1543        ASSERT(pDesc->pTDInfo);
1544        if (pDevice->flags & DEVICE_FLAGS_TX_ALIGN) {
1545            pDesc->pTDInfo->buf=pDevice->tx1_bufs+(i)*PKT_BUF_SZ;
1546            pDesc->pTDInfo->buf_dma=pDevice->tx_bufs_dma1+(i)*PKT_BUF_SZ;
1547        }
1548        pDesc->next=&(pDevice->apTD1Rings[(i+1) % pDevice->sOpts.nTxDescs[1]]);
1549        pDesc->pTDInfo->curr_desc = cpu_to_le32(curr);
1550        pDesc->next_desc = cpu_to_le32(curr+sizeof(STxDesc));
1551    }
1552
1553    if (i > 0)
1554        pDevice->apTD1Rings[i-1].next_desc = cpu_to_le32(pDevice->td1_pool_dma);
1555    pDevice->apTailTD[1] = pDevice->apCurrTD[1] = &(pDevice->apTD1Rings[0]);
1556}
1557
1558
1559
1560static void device_free_td0_ring(PSDevice pDevice) {
1561    int i;
1562    for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++) {
1563        PSTxDesc        pDesc=&(pDevice->apTD0Rings[i]);
1564        PDEVICE_TD_INFO  pTDInfo=pDesc->pTDInfo;
1565
1566        if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma))
1567            pci_unmap_single(pDevice->pcid,pTDInfo->skb_dma,
1568               pTDInfo->skb->len, PCI_DMA_TODEVICE);
1569
1570        if (pTDInfo->skb)
1571            dev_kfree_skb(pTDInfo->skb);
1572
1573        kfree((void *)pDesc->pTDInfo);
1574    }
1575}
1576
1577static void device_free_td1_ring(PSDevice pDevice) {
1578    int i;
1579
1580    for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++) {
1581        PSTxDesc        pDesc=&(pDevice->apTD1Rings[i]);
1582        PDEVICE_TD_INFO  pTDInfo=pDesc->pTDInfo;
1583
1584        if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma))
1585            pci_unmap_single(pDevice->pcid, pTDInfo->skb_dma,
1586               pTDInfo->skb->len, PCI_DMA_TODEVICE);
1587
1588        if (pTDInfo->skb)
1589            dev_kfree_skb(pTDInfo->skb);
1590
1591        kfree((void *)pDesc->pTDInfo);
1592    }
1593
1594}
1595
1596
1597
1598/*-----------------------------------------------------------------*/
1599
1600static int device_rx_srv(PSDevice pDevice, unsigned int uIdx) {
1601    PSRxDesc    pRD;
1602    int works = 0;
1603
1604
1605    for (pRD = pDevice->pCurrRD[uIdx];
1606         pRD->m_rd0RD0.f1Owner == OWNED_BY_HOST;
1607         pRD = pRD->next) {
1608//        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->pCurrRD = %x, works = %d\n", pRD, works);
1609        if (works++>15)
1610            break;
1611        if (device_receive_frame(pDevice, pRD)) {
1612            if (!device_alloc_rx_buf(pDevice,pRD)) {
1613                    DBG_PRT(MSG_LEVEL_ERR, KERN_ERR
1614                    "%s: can not allocate rx buf\n", pDevice->dev->name);
1615                    break;
1616            }
1617        }
1618        pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
1619        pDevice->dev->last_rx = jiffies;
1620    }
1621
1622    pDevice->pCurrRD[uIdx]=pRD;
1623
1624    return works;
1625}
1626
1627
1628static bool device_alloc_rx_buf(PSDevice pDevice, PSRxDesc pRD) {
1629
1630    PDEVICE_RD_INFO pRDInfo=pRD->pRDInfo;
1631
1632
1633    pRDInfo->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1634#ifdef	PLICE_DEBUG
1635	//printk("device_alloc_rx_buf:skb is %x\n",pRDInfo->skb);
1636#endif
1637    if (pRDInfo->skb==NULL)
1638        return false;
1639    ASSERT(pRDInfo->skb);
1640    pRDInfo->skb->dev = pDevice->dev;
1641    pRDInfo->skb_dma = pci_map_single(pDevice->pcid, skb_tail_pointer(pRDInfo->skb),
1642				      pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1643    *((unsigned int *) &(pRD->m_rd0RD0)) = 0; /* FIX cast */
1644
1645    pRD->m_rd0RD0.wResCount = cpu_to_le16(pDevice->rx_buf_sz);
1646    pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
1647    pRD->m_rd1RD1.wReqCount = cpu_to_le16(pDevice->rx_buf_sz);
1648    pRD->buff_addr = cpu_to_le32(pRDInfo->skb_dma);
1649
1650    return true;
1651}
1652
1653
1654
1655bool device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {
1656
1657    pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1658    if (pDeF->skb == NULL)
1659        return false;
1660    ASSERT(pDeF->skb);
1661    pDeF->skb->dev = pDevice->dev;
1662
1663    return true;
1664}
1665
1666
1667
1668static int device_tx_srv(PSDevice pDevice, unsigned int uIdx) {
1669    PSTxDesc                 pTD;
1670    bool bFull=false;
1671    int                      works = 0;
1672    unsigned char byTsr0;
1673    unsigned char byTsr1;
1674    unsigned int	uFrameSize, uFIFOHeaderSize;
1675    PSTxBufHead              pTxBufHead;
1676    struct net_device_stats* pStats = &pDevice->stats;
1677    struct sk_buff*          skb;
1678    unsigned int	uNodeIndex;
1679    PSMgmtObject             pMgmt = pDevice->pMgmt;
1680
1681
1682    for (pTD = pDevice->apTailTD[uIdx]; pDevice->iTDUsed[uIdx] >0; pTD = pTD->next) {
1683
1684        if (pTD->m_td0TD0.f1Owner == OWNED_BY_NIC)
1685            break;
1686        if (works++>15)
1687            break;
1688
1689        byTsr0 = pTD->m_td0TD0.byTSR0;
1690        byTsr1 = pTD->m_td0TD0.byTSR1;
1691
1692        //Only the status of first TD in the chain is correct
1693        if (pTD->m_td1TD1.byTCR & TCR_STP) {
1694
1695            if ((pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0) {
1696                uFIFOHeaderSize = pTD->pTDInfo->dwHeaderLength;
1697                uFrameSize = pTD->pTDInfo->dwReqCount - uFIFOHeaderSize;
1698                pTxBufHead = (PSTxBufHead) (pTD->pTDInfo->buf);
1699                // Update the statistics based on the Transmit status
1700                // now, we DO'NT check TSR0_CDH
1701
1702                STAvUpdateTDStatCounter(&pDevice->scStatistic,
1703                        byTsr0, byTsr1,
1704                        (unsigned char *)(pTD->pTDInfo->buf + uFIFOHeaderSize),
1705                        uFrameSize, uIdx);
1706
1707
1708                BSSvUpdateNodeTxCounter(pDevice,
1709                         byTsr0, byTsr1,
1710                         (unsigned char *)(pTD->pTDInfo->buf),
1711                         uFIFOHeaderSize
1712                         );
1713
1714                if ( !(byTsr1 & TSR1_TERR)) {
1715                    if (byTsr0 != 0) {
1716                        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X].\n",
1717                           (int)uIdx, byTsr1, byTsr0);
1718                    }
1719                    if ((pTxBufHead->wFragCtl & FRAGCTL_ENDFRAG) != FRAGCTL_NONFRAG) {
1720                        pDevice->s802_11Counter.TransmittedFragmentCount ++;
1721                    }
1722                    pStats->tx_packets++;
1723                    pStats->tx_bytes += pTD->pTDInfo->skb->len;
1724                }
1725                else {
1726                     DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] dropped & tsr1[%02X] tsr0[%02X].\n",
1727                           (int)uIdx, byTsr1, byTsr0);
1728                    pStats->tx_errors++;
1729                    pStats->tx_dropped++;
1730                }
1731            }
1732
1733            if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
1734                if (pDevice->bEnableHostapd) {
1735                    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "tx call back netif.. \n");
1736                    skb = pTD->pTDInfo->skb;
1737	                skb->dev = pDevice->apdev;
1738			skb_reset_mac_header(skb);
1739	                skb->pkt_type = PACKET_OTHERHOST;
1740    	            //skb->protocol = htons(ETH_P_802_2);
1741	                memset(skb->cb, 0, sizeof(skb->cb));
1742	                netif_rx(skb);
1743	            }
1744            }
1745
1746            if (byTsr1 & TSR1_TERR) {
1747            if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
1748                DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X].\n",
1749                          (int)uIdx, byTsr1, byTsr0);
1750            }
1751
1752//                DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X].\n",
1753//                          (int)uIdx, byTsr1, byTsr0);
1754
1755                if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
1756                    (pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB)) {
1757                    unsigned short wAID;
1758                    unsigned char byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
1759
1760                    skb = pTD->pTDInfo->skb;
1761                    if (BSSDBbIsSTAInNodeDB(pMgmt, (unsigned char *)(skb->data), &uNodeIndex)) {
1762                        if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
1763                            skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
1764                            pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
1765                            // set tx map
1766                            wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
1767                            pMgmt->abyPSTxMap[wAID >> 3] |=  byMask[wAID & 7];
1768                            pTD->pTDInfo->byFlags &= ~(TD_FLAGS_NETIF_SKB);
1769                            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "tx_srv:tx fail re-queue sta index= %d, QueCnt= %d\n"
1770                                    ,(int)uNodeIndex, pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt);
1771                            pStats->tx_errors--;
1772                            pStats->tx_dropped--;
1773                        }
1774                    }
1775                }
1776            }
1777            device_free_tx_buf(pDevice,pTD);
1778            pDevice->iTDUsed[uIdx]--;
1779        }
1780    }
1781
1782
1783    if (uIdx == TYPE_AC0DMA) {
1784        // RESERV_AC0DMA reserved for relay
1785
1786        if (AVAIL_TD(pDevice, uIdx) < RESERV_AC0DMA) {
1787            bFull = true;
1788            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " AC0DMA is Full = %d\n", pDevice->iTDUsed[uIdx]);
1789        }
1790        if (netif_queue_stopped(pDevice->dev) && (bFull==false)){
1791            netif_wake_queue(pDevice->dev);
1792        }
1793    }
1794
1795
1796    pDevice->apTailTD[uIdx] = pTD;
1797
1798    return works;
1799}
1800
1801
1802static void device_error(PSDevice pDevice, unsigned short status) {
1803
1804    if (status & ISR_FETALERR) {
1805        DBG_PRT(MSG_LEVEL_ERR, KERN_ERR
1806            "%s: Hardware fatal error.\n",
1807            pDevice->dev->name);
1808        netif_stop_queue(pDevice->dev);
1809        del_timer(&pDevice->sTimerCommand);
1810        del_timer(&(pDevice->pMgmt->sTimerSecondCallback));
1811        pDevice->bCmdRunning = false;
1812        MACbShutdown(pDevice->PortOffset);
1813        return;
1814    }
1815
1816}
1817
1818static void device_free_tx_buf(PSDevice pDevice, PSTxDesc pDesc) {
1819    PDEVICE_TD_INFO  pTDInfo=pDesc->pTDInfo;
1820    struct sk_buff* skb=pTDInfo->skb;
1821
1822    // pre-allocated buf_dma can't be unmapped.
1823    if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma)) {
1824        pci_unmap_single(pDevice->pcid,pTDInfo->skb_dma,skb->len,
1825              PCI_DMA_TODEVICE);
1826    }
1827
1828    if ((pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0)
1829        dev_kfree_skb_irq(skb);
1830
1831    pTDInfo->skb_dma = 0;
1832    pTDInfo->skb = 0;
1833    pTDInfo->byFlags = 0;
1834}
1835
1836
1837
1838//PLICE_DEBUG ->
1839void	InitRxManagementQueue(PSDevice  pDevice)
1840{
1841	pDevice->rxManeQueue.packet_num = 0;
1842	pDevice->rxManeQueue.head = pDevice->rxManeQueue.tail = 0;
1843}
1844//PLICE_DEBUG<-
1845
1846
1847
1848
1849
1850//PLICE_DEBUG ->
1851int MlmeThread(
1852     void * Context)
1853{
1854	PSDevice	pDevice =  (PSDevice) Context;
1855	PSRxMgmtPacket			pRxMgmtPacket;
1856	// int i ;
1857	//complete(&pDevice->notify);
1858//printk("Enter MngWorkItem,Queue packet num is %d\n",pDevice->rxManeQueue.packet_num);
1859
1860	//printk("Enter MlmeThread,packet _num is %d\n",pDevice->rxManeQueue.packet_num);
1861	//i = 0;
1862#if 1
1863	while (1)
1864	{
1865
1866	//printk("DDDD\n");
1867	//down(&pDevice->mlme_semaphore);
1868        // pRxMgmtPacket =  DeQueue(pDevice);
1869#if 1
1870		spin_lock_irq(&pDevice->lock);
1871		 while(pDevice->rxManeQueue.packet_num != 0)
1872	 	{
1873			 pRxMgmtPacket =  DeQueue(pDevice);
1874        			//pDevice;
1875        			//DequeueManageObject(pDevice->FirstRecvMngList, pDevice->LastRecvMngList);
1876			vMgrRxManagePacket(pDevice, pDevice->pMgmt, pRxMgmtPacket);
1877			//printk("packet_num is %d\n",pDevice->rxManeQueue.packet_num);
1878
1879		 }
1880		spin_unlock_irq(&pDevice->lock);
1881		if (mlme_kill == 0)
1882		break;
1883		//udelay(200);
1884#endif
1885	//printk("Before schedule thread jiffies is %x\n",jiffies);
1886	schedule();
1887	//printk("after schedule thread jiffies is %x\n",jiffies);
1888	if (mlme_kill == 0)
1889		break;
1890	//printk("i is %d\n",i);
1891	}
1892
1893#endif
1894	return 0;
1895
1896}
1897
1898
1899
1900static int  device_open(struct net_device *dev) {
1901    PSDevice    pDevice=(PSDevice) netdev_priv(dev);
1902    int i;
1903#ifdef WPA_SM_Transtatus
1904    extern SWPAResult wpa_Result;
1905#endif
1906
1907    pDevice->rx_buf_sz = PKT_BUF_SZ;
1908    if (!device_init_rings(pDevice)) {
1909        return -ENOMEM;
1910    }
1911//2008-5-13 <add> by chester
1912    i=request_irq(pDevice->pcid->irq, &device_intr, IRQF_SHARED, dev->name, dev);
1913    if (i)
1914        return i;
1915	//printk("DEBUG1\n");
1916#ifdef WPA_SM_Transtatus
1917     memset(wpa_Result.ifname,0,sizeof(wpa_Result.ifname));
1918     wpa_Result.proto = 0;
1919     wpa_Result.key_mgmt = 0;
1920     wpa_Result.eap_type = 0;
1921     wpa_Result.authenticated = false;
1922     pDevice->fWPA_Authened = false;
1923#endif
1924DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call device init rd0 ring\n");
1925device_init_rd0_ring(pDevice);
1926    device_init_rd1_ring(pDevice);
1927    device_init_defrag_cb(pDevice);
1928    device_init_td0_ring(pDevice);
1929    device_init_td1_ring(pDevice);
1930//    VNTWIFIvSet11h(pDevice->pMgmt, pDevice->b11hEnable);
1931
1932
1933    if (pDevice->bDiversityRegCtlON) {
1934        device_init_diversity_timer(pDevice);
1935    }
1936    vMgrObjectInit(pDevice);
1937    vMgrTimerInit(pDevice);
1938
1939//PLICE_DEBUG->
1940#ifdef	TASK_LET
1941	tasklet_init (&pDevice->RxMngWorkItem,(void *)MngWorkItem,(unsigned long )pDevice);
1942#endif
1943#ifdef	THREAD
1944	InitRxManagementQueue(pDevice);
1945	mlme_kill = 0;
1946	mlme_task = kthread_run(MlmeThread,(void *) pDevice, "MLME");
1947	if (IS_ERR(mlme_task)) {
1948		printk("thread create fail\n");
1949		return -1;
1950	}
1951
1952	mlme_kill = 1;
1953#endif
1954
1955
1956
1957#if 0
1958	pDevice->MLMEThr_pid = kernel_thread(MlmeThread, pDevice, CLONE_VM);
1959	if (pDevice->MLMEThr_pid <0 )
1960	{
1961		printk("unable start thread MlmeThread\n");
1962		return -1;
1963	}
1964#endif
1965
1966	//printk("thread id is %d\n",pDevice->MLMEThr_pid);
1967	//printk("Create thread time is %x\n",jiffies);
1968	//wait_for_completion(&pDevice->notify);
1969
1970
1971
1972
1973  // if (( SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RADIOCTL)&0x06)==0x04)
1974    //    return -ENOMEM;
1975DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call device_init_registers\n");
1976	device_init_registers(pDevice, DEVICE_INIT_COLD);
1977    MACvReadEtherAddress(pDevice->PortOffset, pDevice->abyCurrentNetAddr);
1978    memcpy(pDevice->pMgmt->abyMACAddr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1979    device_set_multi(pDevice->dev);
1980
1981    // Init for Key Management
1982    KeyvInitTable(&pDevice->sKey, pDevice->PortOffset);
1983    add_timer(&(pDevice->pMgmt->sTimerSecondCallback));
1984
1985	#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1986	/*
1987     pDevice->bwextstep0 = false;
1988     pDevice->bwextstep1 = false;
1989     pDevice->bwextstep2 = false;
1990     pDevice->bwextstep3 = false;
1991     */
1992       pDevice->bwextcount=0;
1993     pDevice->bWPASuppWextEnabled = false;
1994#endif
1995    pDevice->byReAssocCount = 0;
1996   pDevice->bWPADEVUp = false;
1997    // Patch: if WEP key already set by iwconfig but device not yet open
1998    if ((pDevice->bEncryptionEnable == true) && (pDevice->bTransmitKey == true)) {
1999        KeybSetDefaultKey(&(pDevice->sKey),
2000                            (unsigned long)(pDevice->byKeyIndex | (1 << 31)),
2001                            pDevice->uKeyLength,
2002                            NULL,
2003                            pDevice->abyKey,
2004                            KEY_CTL_WEP,
2005                            pDevice->PortOffset,
2006                            pDevice->byLocalID
2007                          );
2008         pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
2009    }
2010
2011//printk("DEBUG2\n");
2012
2013
2014DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call MACvIntEnable\n");
2015	MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
2016
2017    if (pDevice->pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2018        bScheduleCommand((void *)pDevice, WLAN_CMD_RUN_AP, NULL);
2019	}
2020	else {
2021        bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
2022        bScheduleCommand((void *)pDevice, WLAN_CMD_SSID, NULL);
2023    }
2024    pDevice->flags |=DEVICE_FLAGS_OPENED;
2025
2026    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
2027    return 0;
2028}
2029
2030
2031static int  device_close(struct net_device *dev) {
2032    PSDevice  pDevice=(PSDevice) netdev_priv(dev);
2033    PSMgmtObject     pMgmt = pDevice->pMgmt;
2034 //PLICE_DEBUG->
2035#ifdef	THREAD
2036	mlme_kill = 0;
2037#endif
2038//PLICE_DEBUG<-
2039//2007-1121-02<Add>by EinsnLiu
2040    if (pDevice->bLinkPass) {
2041	bScheduleCommand((void *)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
2042        mdelay(30);
2043    }
2044#ifdef TxInSleep
2045    del_timer(&pDevice->sTimerTxData);
2046#endif
2047    del_timer(&pDevice->sTimerCommand);
2048    del_timer(&pMgmt->sTimerSecondCallback);
2049    if (pDevice->bDiversityRegCtlON) {
2050        del_timer(&pDevice->TimerSQ3Tmax1);
2051        del_timer(&pDevice->TimerSQ3Tmax2);
2052        del_timer(&pDevice->TimerSQ3Tmax3);
2053    }
2054
2055#ifdef	TASK_LET
2056	tasklet_kill(&pDevice->RxMngWorkItem);
2057#endif
2058     netif_stop_queue(dev);
2059    pDevice->bCmdRunning = false;
2060    MACbShutdown(pDevice->PortOffset);
2061    MACbSoftwareReset(pDevice->PortOffset);
2062    CARDbRadioPowerOff(pDevice);
2063
2064    pDevice->bLinkPass = false;
2065    memset(pMgmt->abyCurrBSSID, 0, 6);
2066    pMgmt->eCurrState = WMAC_STATE_IDLE;
2067    device_free_td0_ring(pDevice);
2068    device_free_td1_ring(pDevice);
2069    device_free_rd0_ring(pDevice);
2070    device_free_rd1_ring(pDevice);
2071    device_free_frag_buf(pDevice);
2072    device_free_rings(pDevice);
2073    BSSvClearNodeDBTable(pDevice, 0);
2074    free_irq(dev->irq, dev);
2075    pDevice->flags &=(~DEVICE_FLAGS_OPENED);
2076	//2008-0714-01<Add>by chester
2077device_release_WPADEV(pDevice);
2078//PLICE_DEBUG->
2079	//tasklet_kill(&pDevice->RxMngWorkItem);
2080//PLICE_DEBUG<-
2081    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close.. \n");
2082    return 0;
2083}
2084
2085
2086
2087static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev) {
2088    PSDevice        pDevice=netdev_priv(dev);
2089    unsigned char *pbMPDU;
2090    unsigned int cbMPDULen = 0;
2091
2092
2093    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211\n");
2094    spin_lock_irq(&pDevice->lock);
2095
2096    if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
2097        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211, td0 <=0\n");
2098        dev_kfree_skb_irq(skb);
2099        spin_unlock_irq(&pDevice->lock);
2100        return 0;
2101    }
2102
2103    if (pDevice->bStopTx0Pkt == true) {
2104        dev_kfree_skb_irq(skb);
2105        spin_unlock_irq(&pDevice->lock);
2106        return 0;
2107    }
2108
2109    cbMPDULen = skb->len;
2110    pbMPDU = skb->data;
2111
2112    vDMA0_tx_80211(pDevice, skb, pbMPDU, cbMPDULen);
2113
2114    spin_unlock_irq(&pDevice->lock);
2115
2116    return 0;
2117
2118}
2119
2120
2121
2122bool device_dma0_xmit(PSDevice pDevice, struct sk_buff *skb, unsigned int uNodeIndex) {
2123    PSMgmtObject    pMgmt = pDevice->pMgmt;
2124    PSTxDesc        pHeadTD, pLastTD;
2125    unsigned int cbFrameBodySize;
2126    unsigned int uMACfragNum;
2127    unsigned char byPktType;
2128    bool bNeedEncryption = false;
2129    PSKeyItem       pTransmitKey = NULL;
2130    unsigned int cbHeaderSize;
2131    unsigned int ii;
2132    SKeyItem        STempKey;
2133//    unsigned char byKeyIndex = 0;
2134
2135
2136    if (pDevice->bStopTx0Pkt == true) {
2137        dev_kfree_skb_irq(skb);
2138        return false;
2139    }
2140
2141    if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
2142        dev_kfree_skb_irq(skb);
2143        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_xmit, td0 <=0\n");
2144        return false;
2145    }
2146
2147    if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2148        if (pDevice->uAssocCount == 0) {
2149            dev_kfree_skb_irq(skb);
2150            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_xmit, assocCount = 0\n");
2151            return false;
2152        }
2153    }
2154
2155    pHeadTD = pDevice->apCurrTD[TYPE_TXDMA0];
2156
2157    pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP);
2158
2159    memcpy(pDevice->sTxEthHeader.abyDstAddr, (unsigned char *)(skb->data), ETH_HLEN);
2160    cbFrameBodySize = skb->len - ETH_HLEN;
2161
2162    // 802.1H
2163    if (ntohs(pDevice->sTxEthHeader.wType) > ETH_DATA_LEN) {
2164        cbFrameBodySize += 8;
2165    }
2166    uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader);
2167
2168    if ( uMACfragNum > AVAIL_TD(pDevice, TYPE_TXDMA0)) {
2169        dev_kfree_skb_irq(skb);
2170        return false;
2171    }
2172    byPktType = (unsigned char)pDevice->byPacketType;
2173
2174
2175    if (pDevice->bFixRate) {
2176        if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
2177            if (pDevice->uConnectionRate >= RATE_11M) {
2178                pDevice->wCurrentRate = RATE_11M;
2179            } else {
2180                pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2181            }
2182        } else {
2183            if (pDevice->uConnectionRate >= RATE_54M)
2184                pDevice->wCurrentRate = RATE_54M;
2185            else
2186                pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2187        }
2188    }
2189    else {
2190        pDevice->wCurrentRate = pDevice->pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2191    }
2192
2193    //preamble type
2194    if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2195        pDevice->byPreambleType = pDevice->byShortPreamble;
2196    }
2197    else {
2198        pDevice->byPreambleType = PREAMBLE_LONG;
2199    }
2200
2201    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dma0: pDevice->wCurrentRate = %d \n", pDevice->wCurrentRate);
2202
2203
2204    if (pDevice->wCurrentRate <= RATE_11M) {
2205        byPktType = PK_TYPE_11B;
2206    } else if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2207        byPktType = PK_TYPE_11A;
2208    } else {
2209        if (pDevice->bProtectMode == true) {
2210            byPktType = PK_TYPE_11GB;
2211        } else {
2212            byPktType = PK_TYPE_11GA;
2213        }
2214    }
2215
2216    if (pDevice->bEncryptionEnable == true)
2217        bNeedEncryption = true;
2218
2219    if (pDevice->bEnableHostWEP) {
2220        pTransmitKey = &STempKey;
2221        pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2222        pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2223        pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2224        pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2225        pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2226        memcpy(pTransmitKey->abyKey,
2227            &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2228            pTransmitKey->uKeyLength
2229            );
2230    }
2231    vGenerateFIFOHeader(pDevice, byPktType, pDevice->pbyTmpBuff, bNeedEncryption,
2232                        cbFrameBodySize, TYPE_TXDMA0, pHeadTD,
2233                        &pDevice->sTxEthHeader, (unsigned char *)skb->data, pTransmitKey, uNodeIndex,
2234                        &uMACfragNum,
2235                        &cbHeaderSize
2236                        );
2237
2238    if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2239        // Disable PS
2240        MACbPSWakeup(pDevice->PortOffset);
2241    }
2242
2243    pDevice->bPWBitOn = false;
2244
2245    pLastTD = pHeadTD;
2246    for (ii = 0; ii < uMACfragNum; ii++) {
2247        // Poll Transmit the adapter
2248        wmb();
2249        pHeadTD->m_td0TD0.f1Owner=OWNED_BY_NIC;
2250        wmb();
2251        if (ii == (uMACfragNum - 1))
2252            pLastTD = pHeadTD;
2253        pHeadTD = pHeadTD->next;
2254    }
2255
2256    // Save the information needed by the tx interrupt handler
2257    // to complete the Send request
2258    pLastTD->pTDInfo->skb = skb;
2259    pLastTD->pTDInfo->byFlags = 0;
2260    pLastTD->pTDInfo->byFlags |= TD_FLAGS_NETIF_SKB;
2261
2262    pDevice->apCurrTD[TYPE_TXDMA0] = pHeadTD;
2263
2264    MACvTransmit0(pDevice->PortOffset);
2265
2266
2267    return true;
2268}
2269
2270//TYPE_AC0DMA data tx
2271static int  device_xmit(struct sk_buff *skb, struct net_device *dev) {
2272    PSDevice pDevice=netdev_priv(dev);
2273
2274    PSMgmtObject    pMgmt = pDevice->pMgmt;
2275    PSTxDesc        pHeadTD, pLastTD;
2276    unsigned int uNodeIndex = 0;
2277    unsigned char byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
2278    unsigned short wAID;
2279    unsigned int uMACfragNum = 1;
2280    unsigned int cbFrameBodySize;
2281    unsigned char byPktType;
2282    unsigned int cbHeaderSize;
2283    bool bNeedEncryption = false;
2284    PSKeyItem       pTransmitKey = NULL;
2285    SKeyItem        STempKey;
2286    unsigned int ii;
2287    bool bTKIP_UseGTK = false;
2288    bool bNeedDeAuth = false;
2289    unsigned char *pbyBSSID;
2290    bool bNodeExist = false;
2291
2292
2293
2294    spin_lock_irq(&pDevice->lock);
2295    if (pDevice->bLinkPass == false) {
2296        dev_kfree_skb_irq(skb);
2297        spin_unlock_irq(&pDevice->lock);
2298        return 0;
2299    }
2300
2301    if (pDevice->bStopDataPkt) {
2302        dev_kfree_skb_irq(skb);
2303        spin_unlock_irq(&pDevice->lock);
2304        return 0;
2305    }
2306
2307
2308    if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2309        if (pDevice->uAssocCount == 0) {
2310            dev_kfree_skb_irq(skb);
2311            spin_unlock_irq(&pDevice->lock);
2312            return 0;
2313        }
2314        if (is_multicast_ether_addr((unsigned char *)(skb->data))) {
2315            uNodeIndex = 0;
2316            bNodeExist = true;
2317            if (pMgmt->sNodeDBTable[0].bPSEnable) {
2318                skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb);
2319                pMgmt->sNodeDBTable[0].wEnQueueCnt++;
2320                // set tx map
2321                pMgmt->abyPSTxMap[0] |= byMask[0];
2322                spin_unlock_irq(&pDevice->lock);
2323                return 0;
2324            }
2325}else {
2326            if (BSSDBbIsSTAInNodeDB(pMgmt, (unsigned char *)(skb->data), &uNodeIndex)) {
2327                if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
2328                    skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
2329                    pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
2330                    // set tx map
2331                    wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
2332                    pMgmt->abyPSTxMap[wAID >> 3] |=  byMask[wAID & 7];
2333                    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set:pMgmt->abyPSTxMap[%d]= %d\n",
2334                             (wAID >> 3), pMgmt->abyPSTxMap[wAID >> 3]);
2335                    spin_unlock_irq(&pDevice->lock);
2336                    return 0;
2337                }
2338
2339                if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2340                    pDevice->byPreambleType = pDevice->byShortPreamble;
2341
2342                }else {
2343                    pDevice->byPreambleType = PREAMBLE_LONG;
2344                }
2345                bNodeExist = true;
2346
2347            }
2348        }
2349
2350        if (bNodeExist == false) {
2351            DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Unknown STA not found in node DB \n");
2352            dev_kfree_skb_irq(skb);
2353            spin_unlock_irq(&pDevice->lock);
2354            return 0;
2355        }
2356    }
2357
2358    pHeadTD = pDevice->apCurrTD[TYPE_AC0DMA];
2359
2360    pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP);
2361
2362
2363    memcpy(pDevice->sTxEthHeader.abyDstAddr, (unsigned char *)(skb->data), ETH_HLEN);
2364    cbFrameBodySize = skb->len - ETH_HLEN;
2365    // 802.1H
2366    if (ntohs(pDevice->sTxEthHeader.wType) > ETH_DATA_LEN) {
2367        cbFrameBodySize += 8;
2368    }
2369
2370
2371    if (pDevice->bEncryptionEnable == true) {
2372        bNeedEncryption = true;
2373        // get Transmit key
2374        do {
2375            if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
2376                (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2377                pbyBSSID = pDevice->abyBSSID;
2378                // get pairwise key
2379                if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
2380                    // get group key
2381                    if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
2382                        bTKIP_UseGTK = true;
2383                        DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2384                        break;
2385                    }
2386                } else {
2387                    DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get PTK.\n");
2388                    break;
2389                }
2390            }else if (pDevice->pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2391
2392                pbyBSSID = pDevice->sTxEthHeader.abyDstAddr;  //TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1
2393                DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS Serach Key: \n");
2394                for (ii = 0; ii< 6; ii++)
2395                    DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"%x \n", *(pbyBSSID+ii));
2396                DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"\n");
2397
2398                // get pairwise key
2399                if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == true)
2400                    break;
2401            }
2402            // get group key
2403            pbyBSSID = pDevice->abyBroadcastAddr;
2404            if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
2405                pTransmitKey = NULL;
2406                if (pDevice->pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2407                    DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS and KEY is NULL. [%d]\n", pDevice->pMgmt->eCurrMode);
2408                }
2409                else
2410                    DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"NOT IBSS and KEY is NULL. [%d]\n", pDevice->pMgmt->eCurrMode);
2411            } else {
2412                bTKIP_UseGTK = true;
2413                DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2414            }
2415        } while(false);
2416    }
2417
2418    if (pDevice->bEnableHostWEP) {
2419        DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"acdma0: STA index %d\n", uNodeIndex);
2420        if (pDevice->bEncryptionEnable == true) {
2421            pTransmitKey = &STempKey;
2422            pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2423            pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2424            pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2425            pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2426            pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2427            memcpy(pTransmitKey->abyKey,
2428                &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2429                pTransmitKey->uKeyLength
2430                );
2431         }
2432    }
2433
2434    uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader);
2435
2436    if (uMACfragNum > AVAIL_TD(pDevice, TYPE_AC0DMA)) {
2437        DBG_PRT(MSG_LEVEL_ERR, KERN_DEBUG "uMACfragNum > AVAIL_TD(TYPE_AC0DMA) = %d\n", uMACfragNum);
2438        dev_kfree_skb_irq(skb);
2439        spin_unlock_irq(&pDevice->lock);
2440        return 0;
2441    }
2442
2443    if (pTransmitKey != NULL) {
2444        if ((pTransmitKey->byCipherSuite == KEY_CTL_WEP) &&
2445            (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN)) {
2446            uMACfragNum = 1; //WEP256 doesn't support fragment
2447        }
2448    }
2449
2450    byPktType = (unsigned char)pDevice->byPacketType;
2451
2452    if (pDevice->bFixRate) {
2453#ifdef	PLICE_DEBUG
2454	printk("Fix Rate: PhyType is %d,ConnectionRate is %d\n",pDevice->eCurrentPHYType,pDevice->uConnectionRate);
2455#endif
2456
2457        if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
2458            if (pDevice->uConnectionRate >= RATE_11M) {
2459                pDevice->wCurrentRate = RATE_11M;
2460            } else {
2461                pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2462            }
2463        } else {
2464            if ((pDevice->eCurrentPHYType == PHY_TYPE_11A) &&
2465                (pDevice->uConnectionRate <= RATE_6M)) {
2466                pDevice->wCurrentRate = RATE_6M;
2467            } else {
2468                if (pDevice->uConnectionRate >= RATE_54M)
2469                    pDevice->wCurrentRate = RATE_54M;
2470                else
2471                    pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2472
2473            }
2474        }
2475        pDevice->byACKRate = (unsigned char) pDevice->wCurrentRate;
2476        pDevice->byTopCCKBasicRate = RATE_1M;
2477        pDevice->byTopOFDMBasicRate = RATE_6M;
2478    }
2479    else {
2480        //auto rate
2481    if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
2482            if (pDevice->eCurrentPHYType != PHY_TYPE_11A) {
2483                pDevice->wCurrentRate = RATE_1M;
2484                pDevice->byACKRate = RATE_1M;
2485                pDevice->byTopCCKBasicRate = RATE_1M;
2486                pDevice->byTopOFDMBasicRate = RATE_6M;
2487            } else {
2488                pDevice->wCurrentRate = RATE_6M;
2489                pDevice->byACKRate = RATE_6M;
2490                pDevice->byTopCCKBasicRate = RATE_1M;
2491                pDevice->byTopOFDMBasicRate = RATE_6M;
2492            }
2493        }
2494        else {
2495		VNTWIFIvGetTxRate(  pDevice->pMgmt,
2496                                pDevice->sTxEthHeader.abyDstAddr,
2497                                &(pDevice->wCurrentRate),
2498                                &(pDevice->byACKRate),
2499                                &(pDevice->byTopCCKBasicRate),
2500                                &(pDevice->byTopOFDMBasicRate));
2501
2502#if 0
2503printk("auto rate:Rate : %d,AckRate:%d,TopCCKRate:%d,TopOFDMRate:%d\n",
2504pDevice->wCurrentRate,pDevice->byACKRate,
2505pDevice->byTopCCKBasicRate,pDevice->byTopOFDMBasicRate);
2506
2507#endif
2508
2509#if 0
2510
2511	pDevice->wCurrentRate = 11;
2512	pDevice->byACKRate = 8;
2513	pDevice->byTopCCKBasicRate = 3;
2514	pDevice->byTopOFDMBasicRate = 8;
2515#endif
2516
2517
2518		}
2519    }
2520
2521//    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "acdma0: pDevice->wCurrentRate = %d \n", pDevice->wCurrentRate);
2522
2523    if (pDevice->wCurrentRate <= RATE_11M) {
2524        byPktType = PK_TYPE_11B;
2525    } else if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2526        byPktType = PK_TYPE_11A;
2527    } else {
2528        if (pDevice->bProtectMode == true) {
2529            byPktType = PK_TYPE_11GB;
2530        } else {
2531            byPktType = PK_TYPE_11GA;
2532        }
2533    }
2534
2535//#ifdef	PLICE_DEBUG
2536//	printk("FIX RATE:CurrentRate is %d");
2537//#endif
2538
2539    if (bNeedEncryption == true) {
2540        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType));
2541        if ((pDevice->sTxEthHeader.wType) == TYPE_PKT_802_1x) {
2542            bNeedEncryption = false;
2543            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType));
2544            if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2545                if (pTransmitKey == NULL) {
2546                    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Don't Find TX KEY\n");
2547                }
2548                else {
2549                    if (bTKIP_UseGTK == true) {
2550                        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n");
2551                    }
2552                    else {
2553                        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
2554                        bNeedEncryption = true;
2555                    }
2556                }
2557            }
2558
2559            if (pDevice->byCntMeasure == 2) {
2560                bNeedDeAuth = true;
2561                pDevice->s802_11Counter.TKIPCounterMeasuresInvoked++;
2562            }
2563
2564            if (pDevice->bEnableHostWEP) {
2565                if ((uNodeIndex != 0) &&
2566                    (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) {
2567                    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
2568                    bNeedEncryption = true;
2569                 }
2570             }
2571        }
2572        else {
2573            if (pTransmitKey == NULL) {
2574                DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n");
2575                dev_kfree_skb_irq(skb);
2576                spin_unlock_irq(&pDevice->lock);
2577                return 0;
2578            }
2579        }
2580    }
2581
2582
2583#ifdef	PLICE_DEBUG
2584	//if (skb->len == 98)
2585	//{
2586	//	printk("ping:len is %d\n");
2587	//}
2588#endif
2589    vGenerateFIFOHeader(pDevice, byPktType, pDevice->pbyTmpBuff, bNeedEncryption,
2590                        cbFrameBodySize, TYPE_AC0DMA, pHeadTD,
2591                        &pDevice->sTxEthHeader, (unsigned char *)skb->data, pTransmitKey, uNodeIndex,
2592                        &uMACfragNum,
2593                        &cbHeaderSize
2594                        );
2595
2596    if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2597        // Disable PS
2598        MACbPSWakeup(pDevice->PortOffset);
2599    }
2600    pDevice->bPWBitOn = false;
2601
2602    pLastTD = pHeadTD;
2603    for (ii = 0; ii < uMACfragNum; ii++) {
2604        // Poll Transmit the adapter
2605        wmb();
2606        pHeadTD->m_td0TD0.f1Owner=OWNED_BY_NIC;
2607        wmb();
2608        if (ii == uMACfragNum - 1)
2609            pLastTD = pHeadTD;
2610        pHeadTD = pHeadTD->next;
2611    }
2612
2613    // Save the information needed by the tx interrupt handler
2614    // to complete the Send request
2615    pLastTD->pTDInfo->skb = skb;
2616    pLastTD->pTDInfo->byFlags = 0;
2617    pLastTD->pTDInfo->byFlags |= TD_FLAGS_NETIF_SKB;
2618#ifdef TxInSleep
2619  pDevice->nTxDataTimeCout=0; //2008-8-21 chester <add> for send null packet
2620  #endif
2621    if (AVAIL_TD(pDevice, TYPE_AC0DMA) <= 1) {
2622        netif_stop_queue(dev);
2623    }
2624
2625    pDevice->apCurrTD[TYPE_AC0DMA] = pHeadTD;
2626//#ifdef	PLICE_DEBUG
2627	if (pDevice->bFixRate)
2628	{
2629		printk("FixRate:Rate is %d,TxPower is %d\n",pDevice->wCurrentRate,pDevice->byCurPwr);
2630	}
2631	else
2632	{
2633		//printk("Auto Rate:Rate is %d,TxPower is %d\n",pDevice->wCurrentRate,pDevice->byCurPwr);
2634	}
2635//#endif
2636
2637{
2638    unsigned char Protocol_Version;    //802.1x Authentication
2639    unsigned char Packet_Type;           //802.1x Authentication
2640    unsigned char Descriptor_type;
2641    unsigned short Key_info;
2642bool bTxeapol_key = false;
2643    Protocol_Version = skb->data[ETH_HLEN];
2644    Packet_Type = skb->data[ETH_HLEN+1];
2645    Descriptor_type = skb->data[ETH_HLEN+1+1+2];
2646    Key_info = (skb->data[ETH_HLEN+1+1+2+1] << 8)|(skb->data[ETH_HLEN+1+1+2+2]);
2647   if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
2648           if(((Protocol_Version==1) ||(Protocol_Version==2)) &&
2649	        (Packet_Type==3)) {  //802.1x OR eapol-key challenge frame transfer
2650                        bTxeapol_key = true;
2651		if((Descriptor_type==254)||(Descriptor_type==2)) {       //WPA or RSN
2652                       if(!(Key_info & BIT3) &&   //group-key challenge
2653			   (Key_info & BIT8) && (Key_info & BIT9)) {    //send 2/2 key
2654			  pDevice->fWPA_Authened = true;
2655			  if(Descriptor_type==254)
2656			      printk("WPA ");
2657			  else
2658			      printk("WPA2 ");
2659			  printk("Authentication completed!!\n");
2660                        }
2661		 }
2662             }
2663   }
2664}
2665
2666    MACvTransmitAC0(pDevice->PortOffset);
2667//    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "acdma0:pDevice->apCurrTD= %p\n", pHeadTD);
2668
2669    dev->trans_start = jiffies;
2670
2671    spin_unlock_irq(&pDevice->lock);
2672    return 0;
2673
2674}
2675
2676static  irqreturn_t  device_intr(int irq,  void *dev_instance) {
2677    struct net_device* dev=dev_instance;
2678    PSDevice     pDevice=(PSDevice) netdev_priv(dev);
2679
2680    int             max_count=0;
2681    unsigned long dwMIBCounter=0;
2682    PSMgmtObject    pMgmt = pDevice->pMgmt;
2683    unsigned char byOrgPageSel=0;
2684    int             handled = 0;
2685    unsigned char byData = 0;
2686    int             ii= 0;
2687//    unsigned char byRSSI;
2688
2689
2690    MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
2691
2692    if (pDevice->dwIsr == 0)
2693        return IRQ_RETVAL(handled);
2694
2695    if (pDevice->dwIsr == 0xffffffff) {
2696        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dwIsr = 0xffff\n");
2697        return IRQ_RETVAL(handled);
2698    }
2699    /*
2700      // 2008-05-21 <mark> by Richardtai, we can't read RSSI here, because no packet bound with RSSI
2701
2702    	if ((pDevice->dwIsr & ISR_RXDMA0) &&
2703        (pDevice->byLocalID != REV_ID_VT3253_B0) &&
2704        (pDevice->bBSSIDFilter == true)) {
2705        // update RSSI
2706        //BBbReadEmbeded(pDevice->PortOffset, 0x3E, &byRSSI);
2707        //pDevice->uCurrRSSI = byRSSI;
2708    }
2709    */
2710
2711    handled = 1;
2712    MACvIntDisable(pDevice->PortOffset);
2713    spin_lock_irq(&pDevice->lock);
2714
2715    //Make sure current page is 0
2716    VNSvInPortB(pDevice->PortOffset + MAC_REG_PAGE1SEL, &byOrgPageSel);
2717    if (byOrgPageSel == 1) {
2718        MACvSelectPage0(pDevice->PortOffset);
2719    }
2720    else
2721        byOrgPageSel = 0;
2722
2723    MACvReadMIBCounter(pDevice->PortOffset, &dwMIBCounter);
2724    // TBD....
2725    // Must do this after doing rx/tx, cause ISR bit is slow
2726    // than RD/TD write back
2727    // update ISR counter
2728    STAvUpdate802_11Counter(&pDevice->s802_11Counter, &pDevice->scStatistic , dwMIBCounter);
2729    while (pDevice->dwIsr != 0) {
2730
2731        STAvUpdateIsrStatCounter(&pDevice->scStatistic, pDevice->dwIsr);
2732        MACvWriteISR(pDevice->PortOffset, pDevice->dwIsr);
2733
2734        if (pDevice->dwIsr & ISR_FETALERR){
2735            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " ISR_FETALERR \n");
2736            VNSvOutPortB(pDevice->PortOffset + MAC_REG_SOFTPWRCTL, 0);
2737            VNSvOutPortW(pDevice->PortOffset + MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPECTI);
2738            device_error(pDevice, pDevice->dwIsr);
2739        }
2740
2741        if (pDevice->byLocalID > REV_ID_VT3253_B1) {
2742
2743            if (pDevice->dwIsr & ISR_MEASURESTART) {
2744                // 802.11h measure start
2745                pDevice->byOrgChannel = pDevice->byCurrentCh;
2746                VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byOrgRCR));
2747                VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, (RCR_RXALLTYPE | RCR_UNICAST | RCR_BROADCAST | RCR_MULTICAST | RCR_WPAERR));
2748                MACvSelectPage1(pDevice->PortOffset);
2749                VNSvInPortD(pDevice->PortOffset + MAC_REG_MAR0, &(pDevice->dwOrgMAR0));
2750                VNSvInPortD(pDevice->PortOffset + MAC_REG_MAR4, &(pDevice->dwOrgMAR4));
2751                MACvSelectPage0(pDevice->PortOffset);
2752               //xxxx
2753               // WCMDbFlushCommandQueue(pDevice->pMgmt, true);
2754                if (set_channel(pDevice, pDevice->pCurrMeasureEID->sReq.byChannel) == true) {
2755                    pDevice->bMeasureInProgress = true;
2756                    MACvSelectPage1(pDevice->PortOffset);
2757                    MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_READY);
2758                    MACvSelectPage0(pDevice->PortOffset);
2759                    pDevice->byBasicMap = 0;
2760                    pDevice->byCCAFraction = 0;
2761                    for(ii=0;ii<8;ii++) {
2762                        pDevice->dwRPIs[ii] = 0;
2763                    }
2764                } else {
2765                    // can not measure because set channel fail
2766                   // WCMDbResetCommandQueue(pDevice->pMgmt);
2767                    // clear measure control
2768                    MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
2769                    s_vCompleteCurrentMeasure(pDevice, MEASURE_MODE_INCAPABLE);
2770                    MACvSelectPage1(pDevice->PortOffset);
2771                    MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2772                    MACvSelectPage0(pDevice->PortOffset);
2773                }
2774            }
2775            if (pDevice->dwIsr & ISR_MEASUREEND) {
2776                // 802.11h measure end
2777                pDevice->bMeasureInProgress = false;
2778                VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byOrgRCR);
2779                MACvSelectPage1(pDevice->PortOffset);
2780                VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, pDevice->dwOrgMAR0);
2781                VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR4, pDevice->dwOrgMAR4);
2782                VNSvInPortB(pDevice->PortOffset + MAC_REG_MSRBBSTS, &byData);
2783                pDevice->byBasicMap |= (byData >> 4);
2784                VNSvInPortB(pDevice->PortOffset + MAC_REG_CCAFRACTION, &pDevice->byCCAFraction);
2785                VNSvInPortB(pDevice->PortOffset + MAC_REG_MSRCTL, &byData);
2786                // clear measure control
2787                MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
2788                MACvSelectPage0(pDevice->PortOffset);
2789                set_channel(pDevice, pDevice->byOrgChannel);
2790                // WCMDbResetCommandQueue(pDevice->pMgmt);
2791                MACvSelectPage1(pDevice->PortOffset);
2792                MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2793                MACvSelectPage0(pDevice->PortOffset);
2794                if (byData & MSRCTL_FINISH) {
2795                    // measure success
2796                    s_vCompleteCurrentMeasure(pDevice, 0);
2797                } else {
2798                    // can not measure because not ready before end of measure time
2799                    s_vCompleteCurrentMeasure(pDevice, MEASURE_MODE_LATE);
2800                }
2801            }
2802            if (pDevice->dwIsr & ISR_QUIETSTART) {
2803                do {
2804                    ;
2805                } while (CARDbStartQuiet(pDevice) == false);
2806            }
2807        }
2808
2809        if (pDevice->dwIsr & ISR_TBTT) {
2810            if (pDevice->bEnableFirstQuiet == true) {
2811                pDevice->byQuietStartCount--;
2812                if (pDevice->byQuietStartCount == 0) {
2813                    pDevice->bEnableFirstQuiet = false;
2814                    MACvSelectPage1(pDevice->PortOffset);
2815                    MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN));
2816                    MACvSelectPage0(pDevice->PortOffset);
2817                }
2818            }
2819            if ((pDevice->bChannelSwitch == true) &&
2820                (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE)) {
2821                pDevice->byChannelSwitchCount--;
2822                if (pDevice->byChannelSwitchCount == 0) {
2823                    pDevice->bChannelSwitch = false;
2824                    set_channel(pDevice, pDevice->byNewChannel);
2825                    VNTWIFIbChannelSwitch(pDevice->pMgmt, pDevice->byNewChannel);
2826                    MACvSelectPage1(pDevice->PortOffset);
2827                    MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2828                    MACvSelectPage0(pDevice->PortOffset);
2829                    CARDbStartTxPacket(pDevice, PKT_TYPE_802_11_ALL);
2830
2831                }
2832            }
2833            if (pDevice->eOPMode == OP_MODE_ADHOC) {
2834                //pDevice->bBeaconSent = false;
2835            } else {
2836                if ((pDevice->bUpdateBBVGA) && (pDevice->bLinkPass == true) && (pDevice->uCurrRSSI != 0)) {
2837                    long            ldBm;
2838
2839                    RFvRSSITodBm(pDevice, (unsigned char) pDevice->uCurrRSSI, &ldBm);
2840                    for (ii=0;ii<BB_VGA_LEVEL;ii++) {
2841                        if (ldBm < pDevice->ldBmThreshold[ii]) {
2842                            pDevice->byBBVGANew = pDevice->abyBBVGA[ii];
2843                            break;
2844                        }
2845                    }
2846                    if (pDevice->byBBVGANew != pDevice->byBBVGACurrent) {
2847                        pDevice->uBBVGADiffCount++;
2848                        if (pDevice->uBBVGADiffCount == 1) {
2849                            // first VGA diff gain
2850                            BBvSetVGAGainOffset(pDevice, pDevice->byBBVGANew);
2851                            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"First RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
2852                                            (int)ldBm, pDevice->byBBVGANew, pDevice->byBBVGACurrent, (int)pDevice->uBBVGADiffCount);
2853                        }
2854                        if (pDevice->uBBVGADiffCount >= BB_VGA_CHANGE_THRESHOLD) {
2855                            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
2856                                            (int)ldBm, pDevice->byBBVGANew, pDevice->byBBVGACurrent, (int)pDevice->uBBVGADiffCount);
2857                            BBvSetVGAGainOffset(pDevice, pDevice->byBBVGANew);
2858                        }
2859                    } else {
2860                        pDevice->uBBVGADiffCount = 1;
2861                    }
2862                }
2863            }
2864
2865            pDevice->bBeaconSent = false;
2866            if (pDevice->bEnablePSMode) {
2867                PSbIsNextTBTTWakeUp((void *)pDevice);
2868            }
2869
2870            if ((pDevice->eOPMode == OP_MODE_AP) ||
2871                (pDevice->eOPMode == OP_MODE_ADHOC)) {
2872
2873                MACvOneShotTimer1MicroSec(pDevice->PortOffset,
2874                        (pMgmt->wIBSSBeaconPeriod - MAKE_BEACON_RESERVED) << 10);
2875            }
2876
2877            if (pDevice->eOPMode == OP_MODE_ADHOC && pDevice->pMgmt->wCurrATIMWindow > 0) {
2878                // todo adhoc PS mode
2879            }
2880
2881        }
2882
2883        if (pDevice->dwIsr & ISR_BNTX) {
2884
2885            if (pDevice->eOPMode == OP_MODE_ADHOC) {
2886                pDevice->bIsBeaconBufReadySet = false;
2887                pDevice->cbBeaconBufReadySetCnt = 0;
2888            }
2889
2890            if (pDevice->eOPMode == OP_MODE_AP) {
2891                if(pMgmt->byDTIMCount > 0) {
2892                   pMgmt->byDTIMCount --;
2893                   pMgmt->sNodeDBTable[0].bRxPSPoll = false;
2894                }
2895                else {
2896                    if(pMgmt->byDTIMCount == 0) {
2897                        // check if mutltcast tx bufferring
2898                        pMgmt->byDTIMCount = pMgmt->byDTIMPeriod - 1;
2899                        pMgmt->sNodeDBTable[0].bRxPSPoll = true;
2900                        bScheduleCommand((void *)pDevice, WLAN_CMD_RX_PSPOLL, NULL);
2901                    }
2902                }
2903            }
2904            pDevice->bBeaconSent = true;
2905
2906            if (pDevice->bChannelSwitch == true) {
2907                pDevice->byChannelSwitchCount--;
2908                if (pDevice->byChannelSwitchCount == 0) {
2909                    pDevice->bChannelSwitch = false;
2910                    set_channel(pDevice, pDevice->byNewChannel);
2911                    VNTWIFIbChannelSwitch(pDevice->pMgmt, pDevice->byNewChannel);
2912                    MACvSelectPage1(pDevice->PortOffset);
2913                    MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2914                    MACvSelectPage0(pDevice->PortOffset);
2915                    //VNTWIFIbSendBeacon(pDevice->pMgmt);
2916                    CARDbStartTxPacket(pDevice, PKT_TYPE_802_11_ALL);
2917                }
2918            }
2919
2920        }
2921
2922        if (pDevice->dwIsr & ISR_RXDMA0) {
2923            max_count += device_rx_srv(pDevice, TYPE_RXDMA0);
2924        }
2925        if (pDevice->dwIsr & ISR_RXDMA1) {
2926            max_count += device_rx_srv(pDevice, TYPE_RXDMA1);
2927        }
2928        if (pDevice->dwIsr & ISR_TXDMA0){
2929            max_count += device_tx_srv(pDevice, TYPE_TXDMA0);
2930        }
2931        if (pDevice->dwIsr & ISR_AC0DMA){
2932            max_count += device_tx_srv(pDevice, TYPE_AC0DMA);
2933        }
2934        if (pDevice->dwIsr & ISR_SOFTTIMER) {
2935
2936        }
2937        if (pDevice->dwIsr & ISR_SOFTTIMER1) {
2938            if (pDevice->eOPMode == OP_MODE_AP) {
2939               if (pDevice->bShortSlotTime)
2940                   pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTSLOTTIME(1);
2941               else
2942                   pMgmt->wCurrCapInfo &= ~(WLAN_SET_CAP_INFO_SHORTSLOTTIME(1));
2943            }
2944            bMgrPrepareBeaconToSend(pDevice, pMgmt);
2945            pDevice->byCntMeasure = 0;
2946        }
2947
2948        MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
2949
2950        MACvReceive0(pDevice->PortOffset);
2951        MACvReceive1(pDevice->PortOffset);
2952
2953        if (max_count>pDevice->sOpts.int_works)
2954            break;
2955    }
2956
2957    if (byOrgPageSel == 1) {
2958        MACvSelectPage1(pDevice->PortOffset);
2959    }
2960
2961    spin_unlock_irq(&pDevice->lock);
2962    MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
2963
2964    return IRQ_RETVAL(handled);
2965}
2966
2967
2968static unsigned const ethernet_polynomial = 0x04c11db7U;
2969static inline u32 ether_crc(int length, unsigned char *data)
2970{
2971    int crc = -1;
2972
2973    while(--length >= 0) {
2974        unsigned char current_octet = *data++;
2975        int bit;
2976        for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
2977            crc = (crc << 1) ^
2978                ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
2979        }
2980    }
2981    return crc;
2982}
2983
2984//2008-8-4 <add> by chester
2985static int Config_FileGetParameter(unsigned char *string,
2986		unsigned char *dest, unsigned char *source)
2987{
2988  unsigned char buf1[100];
2989  int source_len = strlen(source);
2990
2991    memset(buf1,0,100);
2992    strcat(buf1, string);
2993    strcat(buf1, "=");
2994    source+=strlen(buf1);
2995
2996   memcpy(dest,source,source_len-strlen(buf1));
2997 return true;
2998}
2999
3000int Config_FileOperation(PSDevice pDevice,bool fwrite,unsigned char *Parameter) {
3001    unsigned char *config_path = CONFIG_PATH;
3002    unsigned char *buffer = NULL;
3003    unsigned char tmpbuffer[20];
3004    struct file   *filp=NULL;
3005    mm_segment_t old_fs = get_fs();
3006    //int oldfsuid=0,oldfsgid=0;
3007    int result=0;
3008
3009    set_fs (KERNEL_DS);
3010
3011    /* Can't do this anymore, so we rely on correct filesystem permissions:
3012    //Make sure a caller can read or write power as root
3013    oldfsuid=current->cred->fsuid;
3014    oldfsgid=current->cred->fsgid;
3015    current->cred->fsuid = 0;
3016    current->cred->fsgid = 0;
3017    */
3018
3019    //open file
3020      filp = filp_open(config_path, O_RDWR, 0);
3021        if (IS_ERR(filp)) {
3022	     printk("Config_FileOperation:open file fail?\n");
3023	     result=-1;
3024             goto error2;
3025	  }
3026
3027     if(!(filp->f_op) || !(filp->f_op->read) ||!(filp->f_op->write)) {
3028           printk("file %s cann't readable or writable?\n",config_path);
3029	  result = -1;
3030	  goto error1;
3031     	}
3032
3033buffer = kmalloc(1024, GFP_KERNEL);
3034if(buffer==NULL) {
3035  printk("allocate mem for file fail?\n");
3036  result = -1;
3037  goto error1;
3038}
3039
3040if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
3041 printk("read file error?\n");
3042 result = -1;
3043 goto error1;
3044}
3045
3046if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer)!=true) {
3047  printk("get parameter error?\n");
3048  result = -1;
3049  goto error1;
3050}
3051
3052if(memcmp(tmpbuffer,"USA",3)==0) {
3053  result=ZoneType_USA;
3054}
3055else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
3056  result=ZoneType_Japan;
3057}
3058else if(memcmp(tmpbuffer,"EUROPE",5)==0) {
3059 result=ZoneType_Europe;
3060}
3061else {
3062  result = -1;
3063  printk("Unknown Zonetype[%s]?\n",tmpbuffer);
3064}
3065
3066error1:
3067  kfree(buffer);
3068
3069  if(filp_close(filp,NULL))
3070       printk("Config_FileOperation:close file fail\n");
3071
3072error2:
3073  set_fs (old_fs);
3074
3075  /*
3076  current->cred->fsuid=oldfsuid;
3077  current->cred->fsgid=oldfsgid;
3078  */
3079
3080  return result;
3081}
3082
3083
3084
3085static void device_set_multi(struct net_device *dev) {
3086    PSDevice         pDevice = (PSDevice) netdev_priv(dev);
3087
3088    PSMgmtObject     pMgmt = pDevice->pMgmt;
3089    u32              mc_filter[2];
3090    struct netdev_hw_addr *ha;
3091
3092
3093    VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byRxMode));
3094
3095    if (dev->flags & IFF_PROMISC) {         /* Set promiscuous. */
3096        DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
3097        /* Unconditionally log net taps. */
3098        pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
3099    }
3100    else if ((netdev_mc_count(dev) > pDevice->multicast_limit)
3101        ||  (dev->flags & IFF_ALLMULTI)) {
3102        MACvSelectPage1(pDevice->PortOffset);
3103        VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, 0xffffffff);
3104        VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0 + 4, 0xffffffff);
3105        MACvSelectPage0(pDevice->PortOffset);
3106        pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
3107    }
3108    else {
3109        memset(mc_filter, 0, sizeof(mc_filter));
3110	netdev_for_each_mc_addr(ha, dev) {
3111            int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
3112            mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
3113        }
3114        MACvSelectPage1(pDevice->PortOffset);
3115        VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, mc_filter[0]);
3116        VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0 + 4, mc_filter[1]);
3117        MACvSelectPage0(pDevice->PortOffset);
3118        pDevice->byRxMode &= ~(RCR_UNICAST);
3119        pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
3120    }
3121
3122    if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
3123        // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
3124        pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
3125        pDevice->byRxMode &= ~(RCR_UNICAST);
3126    }
3127
3128    VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byRxMode);
3129    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode = %x\n", pDevice->byRxMode );
3130}
3131
3132
3133static struct net_device_stats *device_get_stats(struct net_device *dev) {
3134    PSDevice pDevice=(PSDevice) netdev_priv(dev);
3135
3136    return &pDevice->stats;
3137}
3138
3139
3140
3141static int  device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
3142	PSDevice	        pDevice = (PSDevice)netdev_priv(dev);
3143
3144	struct iwreq *wrq = (struct iwreq *) rq;
3145	int                 rc =0;
3146    PSMgmtObject        pMgmt = pDevice->pMgmt;
3147    PSCmdRequest        pReq;
3148
3149
3150    if (pMgmt == NULL) {
3151        rc = -EFAULT;
3152        return rc;
3153    }
3154
3155    switch(cmd) {
3156
3157	case SIOCGIWNAME:
3158		rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
3159		break;
3160
3161	case SIOCGIWNWID:     //0x8b03  support
3162	#ifdef  WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3163          rc = iwctl_giwnwid(dev, NULL, &(wrq->u.nwid), NULL);
3164	#else
3165        rc = -EOPNOTSUPP;
3166	#endif
3167		break;
3168
3169		// Set frequency/channel
3170	case SIOCSIWFREQ:
3171	    rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
3172		break;
3173
3174		// Get frequency/channel
3175	case SIOCGIWFREQ:
3176		rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
3177		break;
3178
3179		// Set desired network name (ESSID)
3180	case SIOCSIWESSID:
3181
3182		{
3183			char essid[IW_ESSID_MAX_SIZE+1];
3184			if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
3185				rc = -E2BIG;
3186				break;
3187			}
3188			if (copy_from_user(essid, wrq->u.essid.pointer,
3189					   wrq->u.essid.length)) {
3190				rc = -EFAULT;
3191				break;
3192			}
3193			rc = iwctl_siwessid(dev, NULL,
3194					    &(wrq->u.essid), essid);
3195		}
3196		break;
3197
3198
3199		// Get current network name (ESSID)
3200	case SIOCGIWESSID:
3201
3202		{
3203			char essid[IW_ESSID_MAX_SIZE+1];
3204			if (wrq->u.essid.pointer)
3205				rc = iwctl_giwessid(dev, NULL,
3206						    &(wrq->u.essid), essid);
3207				if (copy_to_user(wrq->u.essid.pointer,
3208						         essid,
3209						         wrq->u.essid.length) )
3210					rc = -EFAULT;
3211		}
3212		break;
3213
3214	case SIOCSIWAP:
3215
3216		rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
3217		break;
3218
3219
3220		// Get current Access Point (BSSID)
3221	case SIOCGIWAP:
3222		rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
3223		break;
3224
3225
3226		// Set desired station name
3227	case SIOCSIWNICKN:
3228        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
3229        rc = -EOPNOTSUPP;
3230		break;
3231
3232		// Get current station name
3233	case SIOCGIWNICKN:
3234        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
3235        rc = -EOPNOTSUPP;
3236		break;
3237
3238		// Set the desired bit-rate
3239	case SIOCSIWRATE:
3240		rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
3241		break;
3242
3243	// Get the current bit-rate
3244	case SIOCGIWRATE:
3245
3246		rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
3247		break;
3248
3249	// Set the desired RTS threshold
3250	case SIOCSIWRTS:
3251
3252		rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
3253		break;
3254
3255	// Get the current RTS threshold
3256	case SIOCGIWRTS:
3257
3258		rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
3259		break;
3260
3261		// Set the desired fragmentation threshold
3262	case SIOCSIWFRAG:
3263
3264		rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
3265	    break;
3266
3267	// Get the current fragmentation threshold
3268	case SIOCGIWFRAG:
3269
3270		rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
3271		break;
3272
3273		// Set mode of operation
3274	case SIOCSIWMODE:
3275    	rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
3276		break;
3277
3278		// Get mode of operation
3279	case SIOCGIWMODE:
3280		rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
3281		break;
3282
3283		// Set WEP keys and mode
3284	case SIOCSIWENCODE:
3285		{
3286            char abyKey[WLAN_WEP232_KEYLEN];
3287
3288			if (wrq->u.encoding.pointer) {
3289
3290
3291				if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
3292					rc = -E2BIG;
3293					break;
3294				}
3295				memset(abyKey, 0, WLAN_WEP232_KEYLEN);
3296				if (copy_from_user(abyKey,
3297				                  wrq->u.encoding.pointer,
3298				                  wrq->u.encoding.length)) {
3299					rc = -EFAULT;
3300					break;
3301				}
3302			} else if (wrq->u.encoding.length != 0) {
3303				rc = -EINVAL;
3304				break;
3305			}
3306			rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
3307		}
3308		break;
3309
3310		// Get the WEP keys and mode
3311	case SIOCGIWENCODE:
3312
3313		if (!capable(CAP_NET_ADMIN)) {
3314			rc = -EPERM;
3315			break;
3316		}
3317		{
3318		    char abyKey[WLAN_WEP232_KEYLEN];
3319
3320		    rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
3321		    if (rc != 0) break;
3322			if (wrq->u.encoding.pointer) {
3323				if (copy_to_user(wrq->u.encoding.pointer,
3324						        abyKey,
3325						        wrq->u.encoding.length))
3326					rc = -EFAULT;
3327			}
3328		}
3329		break;
3330
3331		// Get the current Tx-Power
3332	case SIOCGIWTXPOW:
3333        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
3334        rc = -EOPNOTSUPP;
3335		break;
3336
3337	case SIOCSIWTXPOW:
3338        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWTXPOW \n");
3339        rc = -EOPNOTSUPP;
3340		break;
3341
3342	case SIOCSIWRETRY:
3343
3344		rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
3345		break;
3346
3347	case SIOCGIWRETRY:
3348
3349		rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
3350		break;
3351
3352		// Get range of parameters
3353	case SIOCGIWRANGE:
3354
3355		{
3356			struct iw_range range;
3357
3358			rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *) &range);
3359			if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
3360				rc = -EFAULT;
3361		}
3362
3363		break;
3364
3365	case SIOCGIWPOWER:
3366
3367		rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
3368		break;
3369
3370
3371	case SIOCSIWPOWER:
3372
3373		rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
3374		break;
3375
3376
3377	case SIOCGIWSENS:
3378
3379	    rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
3380		break;
3381
3382	case SIOCSIWSENS:
3383        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
3384		rc = -EOPNOTSUPP;
3385		break;
3386
3387	case SIOCGIWAPLIST:
3388	    {
3389            char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
3390
3391		    if (wrq->u.data.pointer) {
3392		        rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
3393		        if (rc == 0) {
3394                    if (copy_to_user(wrq->u.data.pointer,
3395					                buffer,
3396					               (wrq->u.data.length * (sizeof(struct sockaddr) +  sizeof(struct iw_quality)))
3397				        ))
3398				    rc = -EFAULT;
3399		        }
3400            }
3401        }
3402		break;
3403
3404
3405#ifdef WIRELESS_SPY
3406		// Set the spy list
3407	case SIOCSIWSPY:
3408
3409        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
3410		rc = -EOPNOTSUPP;
3411		break;
3412
3413		// Get the spy list
3414	case SIOCGIWSPY:
3415
3416        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWSPY \n");
3417		rc = -EOPNOTSUPP;
3418		break;
3419
3420#endif // WIRELESS_SPY
3421
3422	case SIOCGIWPRIV:
3423        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
3424		rc = -EOPNOTSUPP;
3425/*
3426		if(wrq->u.data.pointer) {
3427			wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
3428
3429			if(copy_to_user(wrq->u.data.pointer,
3430					(u_char *) iwctl_private_args,
3431					sizeof(iwctl_private_args)))
3432				rc = -EFAULT;
3433		}
3434*/
3435		break;
3436
3437
3438//2008-0409-07, <Add> by Einsn Liu
3439#ifdef  WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3440	case SIOCSIWAUTH:
3441		DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH \n");
3442		rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
3443		break;
3444
3445	case SIOCGIWAUTH:
3446		DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
3447		rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
3448		break;
3449
3450	case SIOCSIWGENIE:
3451		DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
3452		rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3453		break;
3454
3455	case SIOCGIWGENIE:
3456		DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
3457		rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3458		break;
3459
3460	case SIOCSIWENCODEEXT:
3461		{
3462			char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
3463			DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
3464			if(wrq->u.encoding.pointer){
3465				memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1);
3466				if(wrq->u.encoding.length > (sizeof(struct iw_encode_ext)+ MAX_KEY_LEN)){
3467					rc = -E2BIG;
3468					break;
3469				}
3470				if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
3471					rc = -EFAULT;
3472					break;
3473				}
3474			}else if(wrq->u.encoding.length != 0){
3475				rc = -EINVAL;
3476				break;
3477			}
3478			rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
3479		}
3480		break;
3481
3482	case SIOCGIWENCODEEXT:
3483		DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
3484		rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
3485		break;
3486
3487	case SIOCSIWMLME:
3488		DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
3489		rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3490		break;
3491
3492#endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3493//End Add -- //2008-0409-07, <Add> by Einsn Liu
3494
3495    case IOCTL_CMD_TEST:
3496
3497		if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
3498		    rc = -EFAULT;
3499		    break;
3500		} else {
3501		    rc = 0;
3502		}
3503        pReq = (PSCmdRequest)rq;
3504        pReq->wResult = MAGIC_CODE;
3505        break;
3506
3507    case IOCTL_CMD_SET:
3508
3509               #ifdef SndEvt_ToAPI
3510                  if((((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_EVT) &&
3511		       !(pDevice->flags & DEVICE_FLAGS_OPENED))
3512	      #else
3513		if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
3514		       (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
3515	      #endif
3516		{
3517		    rc = -EFAULT;
3518		    break;
3519		} else {
3520		    rc = 0;
3521		}
3522
3523	    if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
3524		    return -EBUSY;
3525	    }
3526        rc = private_ioctl(pDevice, rq);
3527        clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
3528        break;
3529
3530    case IOCTL_CMD_HOSTAPD:
3531
3532
3533	rc = vt6655_hostap_ioctl(pDevice, &wrq->u.data);
3534        break;
3535
3536    case IOCTL_CMD_WPA:
3537
3538	rc = wpa_ioctl(pDevice, &wrq->u.data);
3539        break;
3540
3541	case SIOCETHTOOL:
3542        return ethtool_ioctl(dev, (void *) rq->ifr_data);
3543	// All other calls are currently unsupported
3544
3545	default:
3546		rc = -EOPNOTSUPP;
3547        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
3548
3549
3550    }
3551
3552    if (pDevice->bCommit) {
3553       if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
3554           netif_stop_queue(pDevice->dev);
3555           spin_lock_irq(&pDevice->lock);
3556           bScheduleCommand((void *)pDevice, WLAN_CMD_RUN_AP, NULL);
3557           spin_unlock_irq(&pDevice->lock);
3558       }
3559       else {
3560           DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
3561           spin_lock_irq(&pDevice->lock);
3562           pDevice->bLinkPass = false;
3563           memset(pMgmt->abyCurrBSSID, 0, 6);
3564           pMgmt->eCurrState = WMAC_STATE_IDLE;
3565           netif_stop_queue(pDevice->dev);
3566	#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3567	      pMgmt->eScanType = WMAC_SCAN_ACTIVE;
3568	 if(pDevice->bWPASuppWextEnabled !=true)
3569	 #endif
3570           bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
3571           bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL);
3572           spin_unlock_irq(&pDevice->lock);
3573      }
3574      pDevice->bCommit = false;
3575    }
3576
3577    return rc;
3578}
3579
3580
3581static int ethtool_ioctl(struct net_device *dev, void *useraddr)
3582{
3583	u32 ethcmd;
3584
3585	if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
3586		return -EFAULT;
3587
3588        switch (ethcmd) {
3589	case ETHTOOL_GDRVINFO: {
3590		struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
3591		strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
3592		strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
3593		if (copy_to_user(useraddr, &info, sizeof(info)))
3594			return -EFAULT;
3595		return 0;
3596	}
3597
3598        }
3599
3600	return -EOPNOTSUPP;
3601}
3602
3603/*------------------------------------------------------------------*/
3604
3605MODULE_DEVICE_TABLE(pci, vt6655_pci_id_table);
3606
3607static struct pci_driver device_driver = {
3608	.name = DEVICE_NAME,
3609	.id_table = vt6655_pci_id_table,
3610	.probe = vt6655_probe,
3611	.remove = vt6655_remove,
3612#ifdef CONFIG_PM
3613	.suspend = viawget_suspend,
3614	.resume = viawget_resume,
3615#endif
3616};
3617
3618static int __init vt6655_init_module(void)
3619{
3620    int ret;
3621
3622
3623//    ret=pci_module_init(&device_driver);
3624	//ret = pcie_port_service_register(&device_driver);
3625	ret = pci_register_driver(&device_driver);
3626#ifdef CONFIG_PM
3627    if(ret >= 0)
3628        register_reboot_notifier(&device_notifier);
3629#endif
3630
3631    return ret;
3632}
3633
3634static void __exit vt6655_cleanup_module(void)
3635{
3636
3637
3638#ifdef CONFIG_PM
3639    unregister_reboot_notifier(&device_notifier);
3640#endif
3641    pci_unregister_driver(&device_driver);
3642
3643}
3644
3645module_init(vt6655_init_module);
3646module_exit(vt6655_cleanup_module);
3647
3648
3649#ifdef CONFIG_PM
3650static int
3651device_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
3652{
3653    struct pci_dev *pdev = NULL;
3654    switch(event) {
3655    case SYS_DOWN:
3656    case SYS_HALT:
3657    case SYS_POWER_OFF:
3658	for_each_pci_dev(pdev) {
3659            if(pci_dev_driver(pdev) == &device_driver) {
3660                if (pci_get_drvdata(pdev))
3661                    viawget_suspend(pdev, PMSG_HIBERNATE);
3662            }
3663        }
3664    }
3665    return NOTIFY_DONE;
3666}
3667
3668static int
3669viawget_suspend(struct pci_dev *pcid, pm_message_t state)
3670{
3671    int power_status;   // to silence the compiler
3672
3673    PSDevice pDevice=pci_get_drvdata(pcid);
3674    PSMgmtObject  pMgmt = pDevice->pMgmt;
3675
3676    netif_stop_queue(pDevice->dev);
3677    spin_lock_irq(&pDevice->lock);
3678    pci_save_state(pcid);
3679    del_timer(&pDevice->sTimerCommand);
3680    del_timer(&pMgmt->sTimerSecondCallback);
3681    pDevice->cbFreeCmdQueue = CMD_Q_SIZE;
3682    pDevice->uCmdDequeueIdx = 0;
3683    pDevice->uCmdEnqueueIdx = 0;
3684    pDevice->bCmdRunning = false;
3685    MACbShutdown(pDevice->PortOffset);
3686    MACvSaveContext(pDevice->PortOffset, pDevice->abyMacContext);
3687    pDevice->bLinkPass = false;
3688    memset(pMgmt->abyCurrBSSID, 0, 6);
3689    pMgmt->eCurrState = WMAC_STATE_IDLE;
3690    pci_disable_device(pcid);
3691    power_status = pci_set_power_state(pcid, pci_choose_state(pcid, state));
3692    spin_unlock_irq(&pDevice->lock);
3693    return 0;
3694}
3695
3696static int
3697viawget_resume(struct pci_dev *pcid)
3698{
3699    PSDevice  pDevice=pci_get_drvdata(pcid);
3700    PSMgmtObject  pMgmt = pDevice->pMgmt;
3701    int power_status;   // to silence the compiler
3702
3703
3704    power_status = pci_set_power_state(pcid, 0);
3705    power_status = pci_enable_wake(pcid, 0, 0);
3706    pci_restore_state(pcid);
3707    if (netif_running(pDevice->dev)) {
3708        spin_lock_irq(&pDevice->lock);
3709        MACvRestoreContext(pDevice->PortOffset, pDevice->abyMacContext);
3710        device_init_registers(pDevice, DEVICE_INIT_DXPL);
3711        if (pMgmt->sNodeDBTable[0].bActive == true) { // Assoc with BSS
3712            pMgmt->sNodeDBTable[0].bActive = false;
3713            pDevice->bLinkPass = false;
3714            if(pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
3715                // In Adhoc, BSS state set back to started.
3716                pMgmt->eCurrState = WMAC_STATE_STARTED;
3717           }
3718            else {
3719                pMgmt->eCurrMode = WMAC_MODE_STANDBY;
3720                pMgmt->eCurrState = WMAC_STATE_IDLE;
3721            }
3722        }
3723        init_timer(&pMgmt->sTimerSecondCallback);
3724        init_timer(&pDevice->sTimerCommand);
3725        MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
3726        BSSvClearBSSList((void *)pDevice, pDevice->bLinkPass);
3727        bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
3728        bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL);
3729        spin_unlock_irq(&pDevice->lock);
3730    }
3731    return 0;
3732}
3733
3734#endif
3735
3736
3737
3738
3739