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