staging: vt6655: do not use PCI resources before pci_enable_device()
[pandora-kernel.git] / drivers / staging / vt6655 / device_main.c
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;
93 static int          msglevel                =   MSG_LEVEL_INFO;
94
95 //#define       PLICE_DEBUG
96 //
97 // Define module options
98 //
99 MODULE_AUTHOR("VIA Networking Technologies, Inc., <lyndonchen@vntek.com.tw>");
100 MODULE_LICENSE("GPL");
101 MODULE_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
118 DEVICE_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
123 DEVICE_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
128 DEVICE_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
133 DEVICE_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 enviroment, the IP header should be unsigned long byte aligned,
141       or the packet will be droped when we receive it. (eg: IPVS)
142 */
143 DEVICE_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
150 DEVICE_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
156 DEVICE_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
166 DEVICE_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
173 DEVICE_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
180 DEVICE_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
203 DEVICE_PARAM(ConnectionRate, "Connection data rate");
204
205 #define OP_MODE_DEF     0
206
207 DEVICE_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
223 DEVICE_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
231 DEVICE_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
238 DEVICE_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
250 DEVICE_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
261 DEVICE_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
270 DEVICE_PARAM(bDiversityANTEnable, "ANT diversity mode");
271
272
273 //
274 // Static vars definitions
275 //
276
277
278 static int          device_nics             =0;
279 static PSDevice     pDevice_Infos           =NULL;
280 static struct net_device *root_device_dev = NULL;
281
282 static 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
288 DEFINE_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
296 static int  vt6655_probe(struct pci_dev *pcid, const struct pci_device_id *ent);
297 static bool vt6655_init_info(struct pci_dev* pcid, PSDevice* ppDevice, PCHIP_INFO);
298 static void device_free_info(PSDevice pDevice);
299 static bool device_get_pci_info(PSDevice, struct pci_dev* pcid);
300 static void device_print_info(PSDevice pDevice);
301 static struct net_device_stats *device_get_stats(struct net_device *dev);
302 static void device_init_diversity_timer(PSDevice pDevice);
303 static int  device_open(struct net_device *dev);
304 static int  device_xmit(struct sk_buff *skb, struct net_device *dev);
305 static  irqreturn_t  device_intr(int irq,  void*dev_instance);
306 static void device_set_multi(struct net_device *dev);
307 static int  device_close(struct net_device *dev);
308 static int  device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
309
310 #ifdef CONFIG_PM
311 static int device_notify_reboot(struct notifier_block *, unsigned long event, void *ptr);
312 static int viawget_suspend(struct pci_dev *pcid, pm_message_t state);
313 static int viawget_resume(struct pci_dev *pcid);
314 struct notifier_block device_notifier = {
315         notifier_call:  device_notify_reboot,
316         next:           NULL,
317         priority:       0
318 };
319 #endif
320
321
322 static void device_init_rd0_ring(PSDevice pDevice);
323 static void device_init_rd1_ring(PSDevice pDevice);
324 static void device_init_defrag_cb(PSDevice pDevice);
325 static void device_init_td0_ring(PSDevice pDevice);
326 static void device_init_td1_ring(PSDevice pDevice);
327
328 static int  device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev);
329 //2008-0714<Add>by Mike Liu
330 static bool device_release_WPADEV(PSDevice pDevice);
331
332 static int  ethtool_ioctl(struct net_device *dev, void *useraddr);
333 static int  device_rx_srv(PSDevice pDevice, unsigned int uIdx);
334 static int  device_tx_srv(PSDevice pDevice, unsigned int uIdx);
335 static bool device_alloc_rx_buf(PSDevice pDevice, PSRxDesc pDesc);
336 static void device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType);
337 static void device_free_tx_buf(PSDevice pDevice, PSTxDesc pDesc);
338 static void device_free_td0_ring(PSDevice pDevice);
339 static void device_free_td1_ring(PSDevice pDevice);
340 static void device_free_rd0_ring(PSDevice pDevice);
341 static void device_free_rd1_ring(PSDevice pDevice);
342 static void device_free_rings(PSDevice pDevice);
343 static void device_free_frag_buf(PSDevice pDevice);
344 static 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
354 static 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
362 static 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 /*
373 static void
374 device_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
388 static void
389 device_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 */
404 static void
405 device_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;
412 pOpts->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
419 pOpts->flags|=DEVICE_FLAGS_PREAMBLE_TYPE;
420 pOpts->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;
425 pOpts->flags|=DEVICE_FLAGS_80211h_MODE;
426 pOpts->flags|=DEVICE_FLAGS_DiversityANT;
427
428
429 }
430
431 static void
432 device_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<-
463 pDevice->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
483 static 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
528 static 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
605 byValue1 = 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
663 else
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
795 if (pDevice->byGPIO & GPIO0_DATA){pDevice->bHWRadioOff = true;}
796 if ( !(pDevice->byGPIO & GPIO0_DATA)){pDevice->bHWRadioOff = false;}
797
798             }
799         if ( (pDevice->bRadioControlOff == true)) {
800             CARDbRadioPowerOff(pDevice);
801         }
802 else  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
852 static 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
873 static 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
908 static 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_multicast_list = device_set_multi,
915 };
916
917
918
919 static int __devinit
920 vt6655_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
1110 static 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
1127 static 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
1155 static 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
1221 static 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
1227 device_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
1270 static 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
1368 static 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
1389 static 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
1414 static 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
1439 static 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
1458 static 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
1475 static 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
1493 static 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
1508 static 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
1533 static 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
1560 static 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
1577 static 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
1600 static 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
1628 static 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
1655 bool 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
1668 static 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
1802 static 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
1818 static 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 ->
1839 void    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 ->
1851 int 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
1900 static 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
1924 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call device init rd0 ring\n");
1925 device_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;
1975 DBG_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
2014 DBG_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
2031 static 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
2077 device_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
2087 static 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
2122 bool 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
2271 static 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
2503 printk("auto rate:Rate : %d,AckRate:%d,TopCCKRate:%d,TopOFDMRate:%d\n",
2504 pDevice->wCurrentRate,pDevice->byACKRate,
2505 pDevice->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;
2642 bool 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
2676 static  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
2968 static unsigned const ethernet_polynomial = 0x04c11db7U;
2969 static 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
2985 static 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
3000 int 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
3033 buffer = kmalloc(1024, GFP_KERNEL);
3034 if(buffer==NULL) {
3035   printk("alllocate mem for file fail?\n");
3036   result = -1;
3037   goto error1;
3038 }
3039
3040 if(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
3046 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer)!=true) {
3047   printk("get parameter error?\n");
3048   result = -1;
3049   goto error1;
3050 }
3051
3052 if(memcmp(tmpbuffer,"USA",3)==0) {
3053   result=ZoneType_USA;
3054 }
3055 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
3056   result=ZoneType_Japan;
3057 }
3058 else if(memcmp(tmpbuffer,"EUROPE",5)==0) {
3059  result=ZoneType_Europe;
3060 }
3061 else {
3062   result = -1;
3063   printk("Unknown Zonetype[%s]?\n",tmpbuffer);
3064 }
3065
3066 error1:
3067   if(buffer)
3068          kfree(buffer);
3069
3070   if(filp_close(filp,NULL))
3071        printk("Config_FileOperation:close file fail\n");
3072
3073 error2:
3074   set_fs (old_fs);
3075
3076   /*
3077   current->cred->fsuid=oldfsuid;
3078   current->cred->fsgid=oldfsgid;
3079   */
3080
3081   return result;
3082 }
3083
3084
3085
3086 static void device_set_multi(struct net_device *dev) {
3087     PSDevice         pDevice = (PSDevice) netdev_priv(dev);
3088
3089     PSMgmtObject     pMgmt = pDevice->pMgmt;
3090     u32              mc_filter[2];
3091     struct netdev_hw_addr *ha;
3092
3093
3094     VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byRxMode));
3095
3096     if (dev->flags & IFF_PROMISC) {         /* Set promiscuous. */
3097         DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
3098         /* Unconditionally log net taps. */
3099         pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
3100     }
3101     else if ((netdev_mc_count(dev) > pDevice->multicast_limit)
3102         ||  (dev->flags & IFF_ALLMULTI)) {
3103         MACvSelectPage1(pDevice->PortOffset);
3104         VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, 0xffffffff);
3105         VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0 + 4, 0xffffffff);
3106         MACvSelectPage0(pDevice->PortOffset);
3107         pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
3108     }
3109     else {
3110         memset(mc_filter, 0, sizeof(mc_filter));
3111         netdev_for_each_mc_addr(ha, dev) {
3112             int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
3113             mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
3114         }
3115         MACvSelectPage1(pDevice->PortOffset);
3116         VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, mc_filter[0]);
3117         VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0 + 4, mc_filter[1]);
3118         MACvSelectPage0(pDevice->PortOffset);
3119         pDevice->byRxMode &= ~(RCR_UNICAST);
3120         pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
3121     }
3122
3123     if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
3124         // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
3125         pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
3126         pDevice->byRxMode &= ~(RCR_UNICAST);
3127     }
3128
3129     VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byRxMode);
3130     DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode = %x\n", pDevice->byRxMode );
3131 }
3132
3133
3134 static struct net_device_stats *device_get_stats(struct net_device *dev) {
3135     PSDevice pDevice=(PSDevice) netdev_priv(dev);
3136
3137     return &pDevice->stats;
3138 }
3139
3140
3141
3142 static int  device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
3143         PSDevice                pDevice = (PSDevice)netdev_priv(dev);
3144
3145         struct iwreq *wrq = (struct iwreq *) rq;
3146         int                 rc =0;
3147     PSMgmtObject        pMgmt = pDevice->pMgmt;
3148     PSCmdRequest        pReq;
3149
3150
3151     if (pMgmt == NULL) {
3152         rc = -EFAULT;
3153         return rc;
3154     }
3155
3156     switch(cmd) {
3157
3158         case SIOCGIWNAME:
3159                 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
3160                 break;
3161
3162         case SIOCGIWNWID:     //0x8b03  support
3163         #ifdef  WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3164           rc = iwctl_giwnwid(dev, NULL, &(wrq->u.nwid), NULL);
3165         #else
3166         rc = -EOPNOTSUPP;
3167         #endif
3168                 break;
3169
3170                 // Set frequency/channel
3171         case SIOCSIWFREQ:
3172             rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
3173                 break;
3174
3175                 // Get frequency/channel
3176         case SIOCGIWFREQ:
3177                 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
3178                 break;
3179
3180                 // Set desired network name (ESSID)
3181         case SIOCSIWESSID:
3182
3183                 {
3184                         char essid[IW_ESSID_MAX_SIZE+1];
3185                         if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
3186                                 rc = -E2BIG;
3187                                 break;
3188                         }
3189                         if (copy_from_user(essid, wrq->u.essid.pointer,
3190                                            wrq->u.essid.length)) {
3191                                 rc = -EFAULT;
3192                                 break;
3193                         }
3194                         rc = iwctl_siwessid(dev, NULL,
3195                                             &(wrq->u.essid), essid);
3196                 }
3197                 break;
3198
3199
3200                 // Get current network name (ESSID)
3201         case SIOCGIWESSID:
3202
3203                 {
3204                         char essid[IW_ESSID_MAX_SIZE+1];
3205                         if (wrq->u.essid.pointer)
3206                                 rc = iwctl_giwessid(dev, NULL,
3207                                                     &(wrq->u.essid), essid);
3208                                 if (copy_to_user(wrq->u.essid.pointer,
3209                                                          essid,
3210                                                          wrq->u.essid.length) )
3211                                         rc = -EFAULT;
3212                 }
3213                 break;
3214
3215         case SIOCSIWAP:
3216
3217                 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
3218                 break;
3219
3220
3221                 // Get current Access Point (BSSID)
3222         case SIOCGIWAP:
3223                 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
3224                 break;
3225
3226
3227                 // Set desired station name
3228         case SIOCSIWNICKN:
3229         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
3230         rc = -EOPNOTSUPP;
3231                 break;
3232
3233                 // Get current station name
3234         case SIOCGIWNICKN:
3235         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
3236         rc = -EOPNOTSUPP;
3237                 break;
3238
3239                 // Set the desired bit-rate
3240         case SIOCSIWRATE:
3241                 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
3242                 break;
3243
3244         // Get the current bit-rate
3245         case SIOCGIWRATE:
3246
3247                 rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
3248                 break;
3249
3250         // Set the desired RTS threshold
3251         case SIOCSIWRTS:
3252
3253                 rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
3254                 break;
3255
3256         // Get the current RTS threshold
3257         case SIOCGIWRTS:
3258
3259                 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
3260                 break;
3261
3262                 // Set the desired fragmentation threshold
3263         case SIOCSIWFRAG:
3264
3265                 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
3266             break;
3267
3268         // Get the current fragmentation threshold
3269         case SIOCGIWFRAG:
3270
3271                 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
3272                 break;
3273
3274                 // Set mode of operation
3275         case SIOCSIWMODE:
3276         rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
3277                 break;
3278
3279                 // Get mode of operation
3280         case SIOCGIWMODE:
3281                 rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
3282                 break;
3283
3284                 // Set WEP keys and mode
3285         case SIOCSIWENCODE:
3286                 {
3287             char abyKey[WLAN_WEP232_KEYLEN];
3288
3289                         if (wrq->u.encoding.pointer) {
3290
3291
3292                                 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
3293                                         rc = -E2BIG;
3294                                         break;
3295                                 }
3296                                 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
3297                                 if (copy_from_user(abyKey,
3298                                                   wrq->u.encoding.pointer,
3299                                                   wrq->u.encoding.length)) {
3300                                         rc = -EFAULT;
3301                                         break;
3302                                 }
3303                         } else if (wrq->u.encoding.length != 0) {
3304                                 rc = -EINVAL;
3305                                 break;
3306                         }
3307                         rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
3308                 }
3309                 break;
3310
3311                 // Get the WEP keys and mode
3312         case SIOCGIWENCODE:
3313
3314                 if (!capable(CAP_NET_ADMIN)) {
3315                         rc = -EPERM;
3316                         break;
3317                 }
3318                 {
3319                     char abyKey[WLAN_WEP232_KEYLEN];
3320
3321                     rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
3322                     if (rc != 0) break;
3323                         if (wrq->u.encoding.pointer) {
3324                                 if (copy_to_user(wrq->u.encoding.pointer,
3325                                                         abyKey,
3326                                                         wrq->u.encoding.length))
3327                                         rc = -EFAULT;
3328                         }
3329                 }
3330                 break;
3331
3332                 // Get the current Tx-Power
3333         case SIOCGIWTXPOW:
3334         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
3335         rc = -EOPNOTSUPP;
3336                 break;
3337
3338         case SIOCSIWTXPOW:
3339         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWTXPOW \n");
3340         rc = -EOPNOTSUPP;
3341                 break;
3342
3343         case SIOCSIWRETRY:
3344
3345                 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
3346                 break;
3347
3348         case SIOCGIWRETRY:
3349
3350                 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
3351                 break;
3352
3353                 // Get range of parameters
3354         case SIOCGIWRANGE:
3355
3356                 {
3357                         struct iw_range range;
3358
3359                         rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *) &range);
3360                         if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
3361                                 rc = -EFAULT;
3362                 }
3363
3364                 break;
3365
3366         case SIOCGIWPOWER:
3367
3368                 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
3369                 break;
3370
3371
3372         case SIOCSIWPOWER:
3373
3374                 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
3375                 break;
3376
3377
3378         case SIOCGIWSENS:
3379
3380             rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
3381                 break;
3382
3383         case SIOCSIWSENS:
3384         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
3385                 rc = -EOPNOTSUPP;
3386                 break;
3387
3388         case SIOCGIWAPLIST:
3389             {
3390             char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
3391
3392                     if (wrq->u.data.pointer) {
3393                         rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
3394                         if (rc == 0) {
3395                     if (copy_to_user(wrq->u.data.pointer,
3396                                                         buffer,
3397                                                        (wrq->u.data.length * (sizeof(struct sockaddr) +  sizeof(struct iw_quality)))
3398                                         ))
3399                                     rc = -EFAULT;
3400                         }
3401             }
3402         }
3403                 break;
3404
3405
3406 #ifdef WIRELESS_SPY
3407                 // Set the spy list
3408         case SIOCSIWSPY:
3409
3410         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
3411                 rc = -EOPNOTSUPP;
3412                 break;
3413
3414                 // Get the spy list
3415         case SIOCGIWSPY:
3416
3417         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWSPY \n");
3418                 rc = -EOPNOTSUPP;
3419                 break;
3420
3421 #endif // WIRELESS_SPY
3422
3423         case SIOCGIWPRIV:
3424         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
3425                 rc = -EOPNOTSUPP;
3426 /*
3427                 if(wrq->u.data.pointer) {
3428                         wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
3429
3430                         if(copy_to_user(wrq->u.data.pointer,
3431                                         (u_char *) iwctl_private_args,
3432                                         sizeof(iwctl_private_args)))
3433                                 rc = -EFAULT;
3434                 }
3435 */
3436                 break;
3437
3438
3439 //2008-0409-07, <Add> by Einsn Liu
3440 #ifdef  WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3441         case SIOCSIWAUTH:
3442                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH \n");
3443                 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
3444                 break;
3445
3446         case SIOCGIWAUTH:
3447                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
3448                 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
3449                 break;
3450
3451         case SIOCSIWGENIE:
3452                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
3453                 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3454                 break;
3455
3456         case SIOCGIWGENIE:
3457                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
3458                 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3459                 break;
3460
3461         case SIOCSIWENCODEEXT:
3462                 {
3463                         char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
3464                         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
3465                         if(wrq->u.encoding.pointer){
3466                                 memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1);
3467                                 if(wrq->u.encoding.length > (sizeof(struct iw_encode_ext)+ MAX_KEY_LEN)){
3468                                         rc = -E2BIG;
3469                                         break;
3470                                 }
3471                                 if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
3472                                         rc = -EFAULT;
3473                                         break;
3474                                 }
3475                         }else if(wrq->u.encoding.length != 0){
3476                                 rc = -EINVAL;
3477                                 break;
3478                         }
3479                         rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
3480                 }
3481                 break;
3482
3483         case SIOCGIWENCODEEXT:
3484                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
3485                 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
3486                 break;
3487
3488         case SIOCSIWMLME:
3489                 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
3490                 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3491                 break;
3492
3493 #endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3494 //End Add -- //2008-0409-07, <Add> by Einsn Liu
3495
3496     case IOCTL_CMD_TEST:
3497
3498                 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
3499                     rc = -EFAULT;
3500                     break;
3501                 } else {
3502                     rc = 0;
3503                 }
3504         pReq = (PSCmdRequest)rq;
3505         pReq->wResult = MAGIC_CODE;
3506         break;
3507
3508     case IOCTL_CMD_SET:
3509
3510                #ifdef SndEvt_ToAPI
3511                   if((((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_EVT) &&
3512                        !(pDevice->flags & DEVICE_FLAGS_OPENED))
3513               #else
3514                 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
3515                        (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
3516               #endif
3517                 {
3518                     rc = -EFAULT;
3519                     break;
3520                 } else {
3521                     rc = 0;
3522                 }
3523
3524             if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
3525                     return -EBUSY;
3526             }
3527         rc = private_ioctl(pDevice, rq);
3528         clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
3529         break;
3530
3531     case IOCTL_CMD_HOSTAPD:
3532
3533
3534         rc = vt6655_hostap_ioctl(pDevice, &wrq->u.data);
3535         break;
3536
3537     case IOCTL_CMD_WPA:
3538
3539         rc = wpa_ioctl(pDevice, &wrq->u.data);
3540         break;
3541
3542         case SIOCETHTOOL:
3543         return ethtool_ioctl(dev, (void *) rq->ifr_data);
3544         // All other calls are currently unsupported
3545
3546         default:
3547                 rc = -EOPNOTSUPP;
3548         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
3549
3550
3551     }
3552
3553     if (pDevice->bCommit) {
3554        if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
3555            netif_stop_queue(pDevice->dev);
3556            spin_lock_irq(&pDevice->lock);
3557            bScheduleCommand((void *)pDevice, WLAN_CMD_RUN_AP, NULL);
3558            spin_unlock_irq(&pDevice->lock);
3559        }
3560        else {
3561            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
3562            spin_lock_irq(&pDevice->lock);
3563            pDevice->bLinkPass = false;
3564            memset(pMgmt->abyCurrBSSID, 0, 6);
3565            pMgmt->eCurrState = WMAC_STATE_IDLE;
3566            netif_stop_queue(pDevice->dev);
3567         #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3568               pMgmt->eScanType = WMAC_SCAN_ACTIVE;
3569          if(pDevice->bWPASuppWextEnabled !=true)
3570          #endif
3571            bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
3572            bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL);
3573            spin_unlock_irq(&pDevice->lock);
3574       }
3575       pDevice->bCommit = false;
3576     }
3577
3578     return rc;
3579 }
3580
3581
3582 static int ethtool_ioctl(struct net_device *dev, void *useraddr)
3583 {
3584         u32 ethcmd;
3585
3586         if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
3587                 return -EFAULT;
3588
3589         switch (ethcmd) {
3590         case ETHTOOL_GDRVINFO: {
3591                 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
3592                 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
3593                 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
3594                 if (copy_to_user(useraddr, &info, sizeof(info)))
3595                         return -EFAULT;
3596                 return 0;
3597         }
3598
3599         }
3600
3601         return -EOPNOTSUPP;
3602 }
3603
3604 /*------------------------------------------------------------------*/
3605
3606 MODULE_DEVICE_TABLE(pci, vt6655_pci_id_table);
3607
3608 static struct pci_driver device_driver = {
3609         name:       DEVICE_NAME,
3610         id_table:   vt6655_pci_id_table,
3611         probe:      vt6655_probe,
3612         remove:     vt6655_remove,
3613 #ifdef CONFIG_PM
3614         suspend:    viawget_suspend,
3615         resume:     viawget_resume,
3616 #endif
3617 };
3618
3619 static int __init vt6655_init_module(void)
3620 {
3621     int ret;
3622
3623
3624 //    ret=pci_module_init(&device_driver);
3625         //ret = pcie_port_service_register(&device_driver);
3626         ret = pci_register_driver(&device_driver);
3627 #ifdef CONFIG_PM
3628     if(ret >= 0)
3629         register_reboot_notifier(&device_notifier);
3630 #endif
3631
3632     return ret;
3633 }
3634
3635 static void __exit vt6655_cleanup_module(void)
3636 {
3637
3638
3639 #ifdef CONFIG_PM
3640     unregister_reboot_notifier(&device_notifier);
3641 #endif
3642     pci_unregister_driver(&device_driver);
3643
3644 }
3645
3646 module_init(vt6655_init_module);
3647 module_exit(vt6655_cleanup_module);
3648
3649
3650 #ifdef CONFIG_PM
3651 static int
3652 device_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
3653 {
3654     struct pci_dev *pdev = NULL;
3655     switch(event) {
3656     case SYS_DOWN:
3657     case SYS_HALT:
3658     case SYS_POWER_OFF:
3659         for_each_pci_dev(pdev) {
3660             if(pci_dev_driver(pdev) == &device_driver) {
3661                 if (pci_get_drvdata(pdev))
3662                     viawget_suspend(pdev, PMSG_HIBERNATE);
3663             }
3664         }
3665     }
3666     return NOTIFY_DONE;
3667 }
3668
3669 static int
3670 viawget_suspend(struct pci_dev *pcid, pm_message_t state)
3671 {
3672     int power_status;   // to silence the compiler
3673
3674     PSDevice pDevice=pci_get_drvdata(pcid);
3675     PSMgmtObject  pMgmt = pDevice->pMgmt;
3676
3677     netif_stop_queue(pDevice->dev);
3678     spin_lock_irq(&pDevice->lock);
3679     pci_save_state(pcid);
3680     del_timer(&pDevice->sTimerCommand);
3681     del_timer(&pMgmt->sTimerSecondCallback);
3682     pDevice->cbFreeCmdQueue = CMD_Q_SIZE;
3683     pDevice->uCmdDequeueIdx = 0;
3684     pDevice->uCmdEnqueueIdx = 0;
3685     pDevice->bCmdRunning = false;
3686     MACbShutdown(pDevice->PortOffset);
3687     MACvSaveContext(pDevice->PortOffset, pDevice->abyMacContext);
3688     pDevice->bLinkPass = false;
3689     memset(pMgmt->abyCurrBSSID, 0, 6);
3690     pMgmt->eCurrState = WMAC_STATE_IDLE;
3691     pci_disable_device(pcid);
3692     power_status = pci_set_power_state(pcid, pci_choose_state(pcid, state));
3693     spin_unlock_irq(&pDevice->lock);
3694     return 0;
3695 }
3696
3697 static int
3698 viawget_resume(struct pci_dev *pcid)
3699 {
3700     PSDevice  pDevice=pci_get_drvdata(pcid);
3701     PSMgmtObject  pMgmt = pDevice->pMgmt;
3702     int power_status;   // to silence the compiler
3703
3704
3705     power_status = pci_set_power_state(pcid, 0);
3706     power_status = pci_enable_wake(pcid, 0, 0);
3707     pci_restore_state(pcid);
3708     if (netif_running(pDevice->dev)) {
3709         spin_lock_irq(&pDevice->lock);
3710         MACvRestoreContext(pDevice->PortOffset, pDevice->abyMacContext);
3711         device_init_registers(pDevice, DEVICE_INIT_DXPL);
3712         if (pMgmt->sNodeDBTable[0].bActive == true) { // Assoc with BSS
3713             pMgmt->sNodeDBTable[0].bActive = false;
3714             pDevice->bLinkPass = false;
3715             if(pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
3716                 // In Adhoc, BSS state set back to started.
3717                 pMgmt->eCurrState = WMAC_STATE_STARTED;
3718            }
3719             else {
3720                 pMgmt->eCurrMode = WMAC_MODE_STANDBY;
3721                 pMgmt->eCurrState = WMAC_STATE_IDLE;
3722             }
3723         }
3724         init_timer(&pMgmt->sTimerSecondCallback);
3725         init_timer(&pDevice->sTimerCommand);
3726         MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
3727         BSSvClearBSSList((void *)pDevice, pDevice->bLinkPass);
3728         bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
3729         bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL);
3730         spin_unlock_irq(&pDevice->lock);
3731     }
3732     return 0;
3733 }
3734
3735 #endif
3736
3737
3738
3739