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