2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
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.
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.
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.
21 * Purpose: driver entry for initial, open, close, tx and rx.
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
86 #include <linux/delay.h>
87 #include <linux/kthread.h>
88 #include <linux/slab.h>
90 /*--------------------- Static Definitions -------------------------*/
91 //static int msglevel =MSG_LEVEL_DEBUG;
92 static int msglevel = MSG_LEVEL_INFO;
95 // Define module options
98 MODULE_LICENSE("GPL");
99 MODULE_DESCRIPTION("VIA Networking Solomon-A/B/G Wireless LAN Adapter Driver");
101 static int mlme_kill;
102 //static struct task_struct * mlme_task;
104 #define DEVICE_PARAM(N,D)
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);
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");
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");
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");
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");
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)
139 DEVICE_PARAM(IP_byte_align,"Enable IP header dword aligned");
142 #define INT_WORKS_DEF 20
143 #define INT_WORKS_MIN 10
144 #define INT_WORKS_MAX 64
146 DEVICE_PARAM(int_works,"Number of packets per interrupt services");
148 #define CHANNEL_MIN 1
149 #define CHANNEL_MAX 14
150 #define CHANNEL_DEF 6
152 DEVICE_PARAM(Channel, "Channel number");
155 /* PreambleType[] is the preamble length used for transmit.
156 0: indicate allows long preamble type
157 1: indicate allows short preamble type
160 #define PREAMBLE_TYPE_DEF 1
162 DEVICE_PARAM(PreambleType, "Preamble Type");
165 #define RTS_THRESH_MIN 512
166 #define RTS_THRESH_MAX 2347
167 #define RTS_THRESH_DEF 2347
169 DEVICE_PARAM(RTSThreshold, "RTS threshold");
172 #define FRAG_THRESH_MIN 256
173 #define FRAG_THRESH_MAX 2346
174 #define FRAG_THRESH_DEF 2346
176 DEVICE_PARAM(FragThreshold, "Fragmentation threshold");
179 #define DATA_RATE_MIN 0
180 #define DATA_RATE_MAX 13
181 #define DATA_RATE_DEF 13
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
199 DEVICE_PARAM(ConnectionRate, "Connection data rate");
201 #define OP_MODE_DEF 0
203 DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode ");
205 /* OpMode[] is used for transmit.
206 0: indicate infrastruct mode used
207 1: indicate adhoc mode used
208 2: indicate AP mode used
213 0: indicate disable power saving mode
214 1: indicate enable power saving mode
217 #define PS_MODE_DEF 0
219 DEVICE_PARAM(PSMode, "Power saving mode");
222 #define SHORT_RETRY_MIN 0
223 #define SHORT_RETRY_MAX 31
224 #define SHORT_RETRY_DEF 8
227 DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");
229 #define LONG_RETRY_MIN 0
230 #define LONG_RETRY_MAX 15
231 #define LONG_RETRY_DEF 4
234 DEVICE_PARAM(LongRetryLimit, "long frame retry limits");
237 /* BasebandType[] baseband type selected
238 0: indicate 802.11a type
239 1: indicate 802.11b type
240 2: indicate 802.11g type
242 #define BBP_TYPE_MIN 0
243 #define BBP_TYPE_MAX 2
244 #define BBP_TYPE_DEF 2
246 DEVICE_PARAM(BasebandType, "baseband type");
251 0: indicate disable 802.11h
252 1: indicate enable 802.11h
255 #define X80211h_MODE_DEF 0
257 DEVICE_PARAM(b80211hEnable, "802.11h mode");
260 0: indicate disable 802.11h
261 1: indicate enable 802.11h
264 #define DIVERSITY_ANT_DEF 0
266 DEVICE_PARAM(bDiversityANTEnable, "ANT diversity mode");
270 // Static vars definitions
274 static int device_nics =0;
275 static PSDevice pDevice_Infos =NULL;
276 static struct net_device *root_device_dev = NULL;
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 },
284 DEFINE_PCI_DEVICE_TABLE(vt6655_pci_id_table) = {
285 { PCI_VDEVICE(VIA, 0x3253), (kernel_ulong_t)chip_info_table},
289 /*--------------------- Static Functions --------------------------*/
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);
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,
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);
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);
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);
344 /*--------------------- Export Variables --------------------------*/
346 /*--------------------- Export Functions --------------------------*/
350 static char* get_chip_name(int chip_id)
353 for (i = 0; chip_info_table[i].name != NULL; i++)
354 if (chip_info_table[i].chip_id == chip_id)
356 return chip_info_table[i].name;
359 static void vt6655_remove(struct pci_dev *pcid)
361 PSDevice pDevice = pci_get_drvdata(pcid);
365 device_free_info(pDevice);
371 device_set_int_opt(int *opt, int val, int min, int max, int def,char* name,char* devname) {
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);
379 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: set value of parameter %s to %d\n",
386 device_set_bool_opt(unsigned int *opt, int val,bool def,u32 flag, char* name,char* devname) {
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);
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);
401 static void device_get_options(PSDevice pDevice, int index, char* devname)
403 POPTIONS pOpts = &(pDevice->sOpts);
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;
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;
427 device_set_options(PSDevice pDevice) {
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};
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);
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;
455 pDevice->byAutoFBCtrl = AUTO_FB_0;
456 //pDevice->byAutoFBCtrl = AUTO_FB_1;
458 pDevice->bUpdateBBVGA = true;
459 pDevice->byFOETuning = 0;
460 pDevice->wCTSDuration = 0;
461 pDevice->byPreambleType = 0;
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);
478 static void s_vCompleteCurrentMeasure (PSDevice pDevice, unsigned char byResult)
481 unsigned long dwDuration = 0;
482 unsigned char byRPI0 = 0;
484 for(ii=1;ii<8;ii++) {
485 pDevice->dwRPIs[ii] *= 255;
486 dwDuration |= *((unsigned short *) (pDevice->pCurrMeasureEID->sReq.abyDuration));
488 pDevice->dwRPIs[ii] /= dwDuration;
489 pDevice->abyRPIs[ii] = (unsigned char) pDevice->dwRPIs[ii];
490 byRPI0 += pDevice->abyRPIs[ii];
492 pDevice->abyRPIs[0] = (0xFF - byRPI0);
494 if (pDevice->uNumOfMeasureEIDs == 0) {
495 VNTWIFIbMeasureReport( pDevice->pMgmt,
497 pDevice->pCurrMeasureEID,
500 pDevice->byCCAFraction,
504 VNTWIFIbMeasureReport( pDevice->pMgmt,
506 pDevice->pCurrMeasureEID,
509 pDevice->byCCAFraction,
512 CARDbStartMeasure (pDevice, pDevice->pCurrMeasureEID++, pDevice->uNumOfMeasureEIDs);
520 // Initialisation of MAC & BBP registers
523 static void device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType)
526 unsigned char byValue;
527 unsigned char byValue1;
528 unsigned char byCCKPwrdBm = 0;
529 unsigned char byOFDMPwrdBm = 0;
531 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
532 MACbShutdown(pDevice->PortOffset);
533 BBvSoftwareReset(pDevice->PortOffset);
535 if ((InitType == DEVICE_INIT_COLD) ||
536 (InitType == DEVICE_INIT_DXPL)) {
537 // Do MACbSoftwareReset in MACvInitialize
538 MACbSoftwareReset(pDevice->PortOffset);
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;
549 pDevice->byRevId = 0; //Target to IF pin while programming to RF chip.
552 MACvInitialize(pDevice->PortOffset);
555 VNSvInPortB(pDevice->PortOffset + MAC_REG_LOCALID, &(pDevice->byLocalID));
557 spin_lock_irq(&pDevice->lock);
558 SROMvReadAllContents(pDevice->PortOffset,pDevice->abyEEPROM);
560 spin_unlock_irq(&pDevice->lock);
564 pDevice->byMinChannel = 1;
565 pDevice->byMaxChannel = CB_MAX_CHANNEL;
568 byValue = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ANTENNA);
569 if (byValue & EEP_ANTINV)
570 pDevice->bTxRxAntInv = true;
572 pDevice->bTxRxAntInv = false;
574 //printk("init_register:TxRxAntInv is %d,byValue is %d\n",pDevice->bTxRxAntInv,byValue);
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);
581 //printk("init_register:byValue is %d\n",byValue);
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);
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;
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);
605 pDevice->bDiversityEnable = true;
607 //printk("aux |main antenna: RxAntennaMode is %d\n",pDevice->byRxAntennaMode);
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;
619 pDevice->byRxAntennaMode = ANT_A;
621 pDevice->byTxAntennaMode = ANT_B;
622 if (pDevice->bTxRxAntInv == true)
623 pDevice->byRxAntennaMode = ANT_A;
625 pDevice->byRxAntennaMode = ANT_B;
629 //printk("init registers: TxAntennaMode is %d\n",pDevice->byTxAntennaMode);
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);
634 //#ifdef ZoneType_DefaultSetting
635 //2008-8-4 <add> by chester
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");
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;
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");
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]);
663 printk("Read Zonetype file success,use default zonetype setting[%02x]\n",zonetype);
667 printk("Read Zonetype file fail,use default zonetype setting[%02x]\n",SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ZONETYPE));
670 pDevice->byRFType = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RFTYPE);
672 if ((pDevice->byRFType & RF_EMU) != 0) {
673 // force change RevID for VT3253 emu
674 pDevice->byRevId = 0x80;
677 pDevice->byRFType &= RF_MASK;
678 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRFType = %x\n", pDevice->byRFType);
680 if (pDevice->bZoneRegExist == false) {
681 pDevice->byZoneType = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
683 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byZoneType = %x\n", pDevice->byZoneType);
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);
694 //byOFDMPwrdBm = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_OFDM_PWR_dBm);
695 //printk("CCKPwrdBm is 0x%x,byOFDMPwrdBm is 0x%x\n",byCCKPwrdBm,byOFDMPwrdBm);
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;
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;
708 pDevice->abyCCKDefaultPwr[ii+1] = byCCKPwrdBm;
709 pDevice->abyOFDMDefaultPwr[ii+1] = byOFDMPwrdBm;
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];
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));
729 init_channel_table((void *)pDevice);
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);
739 // use relative tx timeout and 802.11i D4
740 MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_CFG, (CFG_TKIPOPT | CFG_NOTXTIMEOUT));
742 // set performance parameter by registry
743 MACvSetShortRetryLimit(pDevice->PortOffset, pDevice->byShortRetryLimit);
744 MACvSetLongRetryLimit(pDevice->PortOffset, pDevice->byLongRetryLimit);
747 VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
748 // enable TSF counter
749 VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
751 // initialize BBP registers
752 BBbVT3253Init(pDevice);
754 if (pDevice->bUpdateBBVGA) {
755 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
756 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
757 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
760 //printk("init registers:RxAntennaMode is %x,TxAntennaMode is %x\n",pDevice->byRxAntennaMode,pDevice->byTxAntennaMode);
762 BBvSetRxAntennaMode(pDevice->PortOffset, pDevice->byRxAntennaMode);
763 BBvSetTxAntennaMode(pDevice->PortOffset, pDevice->byTxAntennaMode);
765 pDevice->byCurrentCh = 0;
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;
773 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
777 VNTWIFIbConfigPhyMode(pDevice->pMgmt, PHY_TYPE_11G);
778 VNTWIFIbConfigPhyMode(pDevice->pMgmt, PHY_TYPE_AUTO);
780 pDevice->bRadioOff = false;
782 pDevice->byRadioCtl = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RADIOCTL);
783 pDevice->bHWRadioOff = false;
785 if (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) {
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;}
794 if ( (pDevice->bRadioControlOff == true)) {
795 CARDbRadioPowerOff(pDevice);
797 else CARDbRadioPowerOn(pDevice);
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;
804 if ((pDevice->bHWRadioOff == true) || (pDevice->bRadioControlOff == true)) {
805 CARDbRadioPowerOff(pDevice);
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);
817 CARDvSafeResetRx(pDevice);
819 CARDvSafeResetTx(pDevice);
821 if (pDevice->byLocalID <= REV_ID_VT3253_A1) {
822 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_RCR, RCR_WPAERR);
825 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
828 MACvReceive0(pDevice->PortOffset);
829 MACvReceive1(pDevice->PortOffset);
832 MACvStart(pDevice->PortOffset);
834 netif_stop_queue(pDevice->dev);
841 static void device_init_diversity_timer(PSDevice pDevice) {
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);
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);
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);
862 static bool device_release_WPADEV(PSDevice pDevice)
864 viawget_wpa_header *wpahdr;
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);
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
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,
906 vt6655_probe(struct pci_dev *pcid, const struct pci_device_id *ent)
908 static bool bFirst = true;
909 struct net_device* dev = NULL;
910 PCHIP_INFO pChip_info = (PCHIP_INFO)ent->driver_data;
913 if (device_nics ++>= MAX_UINTS) {
914 printk(KERN_NOTICE DEVICE_NAME ": already found %d NICs\n", device_nics);
919 dev = alloc_etherdev(sizeof(DEVICE_INFO));
921 pDevice = (PSDevice) netdev_priv(dev);
924 printk(KERN_ERR DEVICE_NAME ": allocate net device failed \n");
928 // Chain it all together
929 // SET_MODULE_OWNER(dev);
930 SET_NETDEV_DEV(dev, &pcid->dev);
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");
938 vt6655_init_info(pcid, &pDevice, pChip_info);
940 pDevice->next_module = root_device_dev;
941 root_device_dev = dev;
943 if (pci_enable_device(pcid)) {
944 device_free_info(pDevice);
947 dev->irq = pcid->irq;
950 printk("Before get pci_info memaddr is %x\n",pDevice->memaddr);
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);
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);
975 for (i=0;address[i];i++)
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);
982 printk("bar %d not implemented\n",i);
985 if (bar & PCI_BASE_ADDRESS_SPACE_IO) {
988 len = bar & (PCI_BASE_ADDRESS_IO_MASK & 0xFFFF);
989 len = len & ~(len - 1);
991 printk("IO space: len in IO %x, BAR %d\n", len, i);
995 len = bar & 0xFFFFFFF0;
998 printk("len in MEM %x, BAR %d\n", len, i);
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);
1013 if(pDevice->PortOffset == 0) {
1014 printk(KERN_ERR DEVICE_NAME ": Failed to IO remapping ..\n");
1015 device_free_info(pDevice);
1022 rc = pci_request_regions(pcid, DEVICE_NAME);
1024 printk(KERN_ERR DEVICE_NAME ": Failed to find PCI device\n");
1025 device_free_info(pDevice);
1029 dev->base_addr = pDevice->ioaddr;
1031 unsigned char value;
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);
1044 pDevice->PortOffset = pDevice->ioaddr;
1047 if (!MACbSoftwareReset(pDevice->PortOffset)) {
1048 printk(KERN_ERR DEVICE_NAME ": Failed to access MAC hardware..\n");
1049 device_free_info(pDevice);
1052 // initial to reload eeprom
1053 MACvInitialize(pDevice->PortOffset);
1054 MACvReadEtherAddress(pDevice->PortOffset, dev->dev_addr);
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;
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);
1067 dev->irq = pcid->irq;
1068 dev->netdev_ops = &device_netdev_ops;
1070 dev->wireless_handlers = (struct iw_handler_def *)&iwctl_handler_def;
1072 rc = register_netdev(dev);
1075 printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
1076 device_free_info(pDevice);
1079 device_print_info(pDevice);
1080 pci_set_drvdata(pcid, pDevice);
1085 static void device_print_info(PSDevice pDevice)
1087 struct net_device* dev=pDevice->dev;
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);
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);
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);
1102 static void vt6655_init_info(struct pci_dev* pcid, PSDevice* ppDevice,
1103 PCHIP_INFO pChip_info) {
1107 memset(*ppDevice,0,sizeof(DEVICE_INFO));
1109 if (pDevice_Infos == NULL) {
1110 pDevice_Infos =*ppDevice;
1113 for (p=pDevice_Infos;p->next!=NULL;p=p->next)
1115 p->next = *ppDevice;
1116 (*ppDevice)->prev = p;
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;
1125 spin_lock_init(&((*ppDevice)->lock));
1128 static bool device_get_pci_info(PSDevice pDevice, struct pci_dev* pcid) {
1132 unsigned int cis_addr;
1134 unsigned char pci_config[256];
1135 unsigned char value =0x00;
1138 memset(pci_config,0x00,256);
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));
1146 pci_set_master(pcid);
1148 pDevice->memaddr = pci_resource_start(pcid,0);
1149 pDevice->ioaddr = pci_resource_start(pcid,1);
1152 // pDevice->ioaddr = pci_resource_start(pcid, 0);
1153 // pDevice->memaddr = pci_resource_start(pcid,1);
1156 cis_addr = pci_resource_start(pcid,2);
1158 pDevice->pcid = pcid;
1160 pci_read_config_byte(pcid, PCI_COMMAND, &b);
1161 pci_write_config_byte(pcid, PCI_COMMAND, (b|PCI_COMMAND_MASTER));
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);
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);
1173 for (ii=0;ii<0xFF;ii++)
1175 pci_read_config_byte(pcid,ii,&value);
1176 pci_config[ii] = value;
1178 for (ii=0,j=1;ii<0x100;ii++,j++)
1182 printk("%x:",pci_config[ii]);
1187 printk("%x:",pci_config[ii]);
1194 static void device_free_info(PSDevice pDevice) {
1196 struct net_device* dev=pDevice->dev;
1199 //2008-0714-01<Add>by chester
1200 device_release_WPADEV(pDevice);
1202 //2008-07-21-01<Add>by MikeLiu
1204 if(wpa_set_wpadev(pDevice, 0)!=0)
1205 printk("unregister wpadev fail?\n");
1207 if (pDevice_Infos==NULL)
1210 for (ptr=pDevice_Infos;ptr && (ptr!=pDevice);ptr=ptr->next)
1214 if (ptr==pDevice_Infos)
1215 pDevice_Infos=ptr->next;
1217 ptr->prev->next=ptr->next;
1220 DBG_PRT(MSG_LEVEL_ERR, KERN_ERR "info struct not found\n");
1225 vt6655_hostap_set_hostapd(pDevice, 0, 0);
1228 unregister_netdev(dev);
1230 if (pDevice->PortOffset)
1231 iounmap((void *)pDevice->PortOffset);
1234 pci_release_regions(pDevice->pcid);
1238 if (pDevice->pcid) {
1239 pci_set_drvdata(pDevice->pcid,NULL);
1243 static bool device_init_rings(PSDevice pDevice) {
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);
1255 if (vir_pool == NULL) {
1256 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate desc dma memory failed\n", pDevice->dev->name);
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)
1267 pDevice->aRD0Ring = vir_pool;
1268 pDevice->aRD1Ring = vir_pool +
1269 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
1272 pDevice->rd0_pool_dma = pDevice->pool_dma;
1273 pDevice->rd1_pool_dma = pDevice->rd0_pool_dma +
1274 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
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 +
1281 &pDevice->tx_bufs_dma0);
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
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 +
1302 pDevice->td0_pool_dma = pDevice->rd1_pool_dma +
1303 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
1305 pDevice->td1_pool_dma = pDevice->td0_pool_dma +
1306 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
1309 // vir_pool: pvoid type
1310 pDevice->apTD0Rings = vir_pool
1311 + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
1312 + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
1314 pDevice->apTD1Rings = vir_pool
1315 + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
1316 + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc)
1317 + pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
1320 pDevice->tx1_bufs = pDevice->tx0_bufs +
1321 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
1324 pDevice->tx_beacon_bufs = pDevice->tx1_bufs +
1325 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
1327 pDevice->pbyTmpBuff = pDevice->tx_beacon_bufs +
1330 pDevice->tx_bufs_dma1 = pDevice->tx_bufs_dma0 +
1331 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
1334 pDevice->tx_beacon_dma = pDevice->tx_bufs_dma1 +
1335 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
1341 static void device_free_rings(PSDevice pDevice) {
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)
1349 pDevice->aRD0Ring, pDevice->pool_dma
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 +
1358 pDevice->tx0_bufs, pDevice->tx_bufs_dma0
1362 static void device_init_rd0_ring(PSDevice pDevice) {
1364 dma_addr_t curr = pDevice->rd0_pool_dma;
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);
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));
1382 pDevice->aRD0Ring[i-1].next_desc = cpu_to_le32(pDevice->rd0_pool_dma);
1383 pDevice->pCurrRD[0] = &(pDevice->aRD0Ring[0]);
1387 static void device_init_rd1_ring(PSDevice pDevice) {
1389 dma_addr_t curr = pDevice->rd1_pool_dma;
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);
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));
1407 pDevice->aRD1Ring[i-1].next_desc = cpu_to_le32(pDevice->rd1_pool_dma);
1408 pDevice->pCurrRD[1] = &(pDevice->aRD1Ring[0]);
1412 static void device_init_defrag_cb(PSDevice pDevice) {
1414 PSDeFragControlBlock pDeF;
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);
1424 pDevice->cbDFCB = CB_MAX_RX_FRAG;
1425 pDevice->cbFreeDFCB = pDevice->cbDFCB;
1431 static void device_free_rd0_ring(PSDevice pDevice) {
1434 for (i = 0; i < pDevice->sOpts.nRxDescs0; i++) {
1435 PSRxDesc pDesc =&(pDevice->aRD0Ring[i]);
1436 PDEVICE_RD_INFO pRDInfo =pDesc->pRDInfo;
1438 pci_unmap_single(pDevice->pcid,pRDInfo->skb_dma,
1439 pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1441 dev_kfree_skb(pRDInfo->skb);
1443 kfree((void *)pDesc->pRDInfo);
1448 static void device_free_rd1_ring(PSDevice pDevice) {
1452 for (i = 0; i < pDevice->sOpts.nRxDescs1; i++) {
1453 PSRxDesc pDesc=&(pDevice->aRD1Ring[i]);
1454 PDEVICE_RD_INFO pRDInfo=pDesc->pRDInfo;
1456 pci_unmap_single(pDevice->pcid,pRDInfo->skb_dma,
1457 pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1459 dev_kfree_skb(pRDInfo->skb);
1461 kfree((void *)pDesc->pRDInfo);
1466 static void device_free_frag_buf(PSDevice pDevice) {
1467 PSDeFragControlBlock pDeF;
1470 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1472 pDeF = &(pDevice->sRxDFCB[i]);
1475 dev_kfree_skb(pDeF->skb);
1481 static void device_init_td0_ring(PSDevice pDevice) {
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;
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));
1501 pDevice->apTD0Rings[i-1].next_desc = cpu_to_le32(pDevice->td0_pool_dma);
1502 pDevice->apTailTD[0] = pDevice->apCurrTD[0] =&(pDevice->apTD0Rings[0]);
1506 static void device_init_td1_ring(PSDevice pDevice) {
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;
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));
1527 pDevice->apTD1Rings[i-1].next_desc = cpu_to_le32(pDevice->td1_pool_dma);
1528 pDevice->apTailTD[1] = pDevice->apCurrTD[1] = &(pDevice->apTD1Rings[0]);
1533 static void device_free_td0_ring(PSDevice pDevice) {
1535 for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++) {
1536 PSTxDesc pDesc=&(pDevice->apTD0Rings[i]);
1537 PDEVICE_TD_INFO pTDInfo=pDesc->pTDInfo;
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);
1544 dev_kfree_skb(pTDInfo->skb);
1546 kfree((void *)pDesc->pTDInfo);
1550 static void device_free_td1_ring(PSDevice pDevice) {
1553 for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++) {
1554 PSTxDesc pDesc=&(pDevice->apTD1Rings[i]);
1555 PDEVICE_TD_INFO pTDInfo=pDesc->pTDInfo;
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);
1562 dev_kfree_skb(pTDInfo->skb);
1564 kfree((void *)pDesc->pTDInfo);
1571 /*-----------------------------------------------------------------*/
1573 static int device_rx_srv(PSDevice pDevice, unsigned int uIdx) {
1578 for (pRD = pDevice->pCurrRD[uIdx];
1579 pRD->m_rd0RD0.f1Owner == OWNED_BY_HOST;
1581 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->pCurrRD = %x, works = %d\n", pRD, works);
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);
1591 pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
1592 pDevice->dev->last_rx = jiffies;
1595 pDevice->pCurrRD[uIdx]=pRD;
1601 static bool device_alloc_rx_buf(PSDevice pDevice, PSRxDesc pRD) {
1603 PDEVICE_RD_INFO pRDInfo=pRD->pRDInfo;
1606 pRDInfo->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1608 //printk("device_alloc_rx_buf:skb is %x\n",pRDInfo->skb);
1610 if (pRDInfo->skb==NULL)
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 */
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);
1628 bool device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {
1630 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1631 if (pDeF->skb == NULL)
1634 pDeF->skb->dev = pDevice->dev;
1641 static int device_tx_srv(PSDevice pDevice, unsigned int uIdx) {
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;
1655 for (pTD = pDevice->apTailTD[uIdx]; pDevice->iTDUsed[uIdx] >0; pTD = pTD->next) {
1657 if (pTD->m_td0TD0.f1Owner == OWNED_BY_NIC)
1662 byTsr0 = pTD->m_td0TD0.byTSR0;
1663 byTsr1 = pTD->m_td0TD0.byTSR1;
1665 //Only the status of first TD in the chain is correct
1666 if (pTD->m_td1TD1.byTCR & TCR_STP) {
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
1675 STAvUpdateTDStatCounter(&pDevice->scStatistic,
1677 (unsigned char *)(pTD->pTDInfo->buf + uFIFOHeaderSize),
1681 BSSvUpdateNodeTxCounter(pDevice,
1683 (unsigned char *)(pTD->pTDInfo->buf),
1687 if ( !(byTsr1 & TSR1_TERR)) {
1689 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X].\n",
1690 (int)uIdx, byTsr1, byTsr0);
1692 if ((pTxBufHead->wFragCtl & FRAGCTL_ENDFRAG) != FRAGCTL_NONFRAG) {
1693 pDevice->s802_11Counter.TransmittedFragmentCount ++;
1695 pStats->tx_packets++;
1696 pStats->tx_bytes += pTD->pTDInfo->skb->len;
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++;
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));
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);
1725 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X].\n",
1726 // (int)uIdx, byTsr1, byTsr0);
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};
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++;
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--;
1750 device_free_tx_buf(pDevice,pTD);
1751 pDevice->iTDUsed[uIdx]--;
1756 if (uIdx == TYPE_AC0DMA) {
1757 // RESERV_AC0DMA reserved for relay
1759 if (AVAIL_TD(pDevice, uIdx) < RESERV_AC0DMA) {
1761 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " AC0DMA is Full = %d\n", pDevice->iTDUsed[uIdx]);
1763 if (netif_queue_stopped(pDevice->dev) && (bFull==false)){
1764 netif_wake_queue(pDevice->dev);
1769 pDevice->apTailTD[uIdx] = pTD;
1775 static void device_error(PSDevice pDevice, unsigned short status) {
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);
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;
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,
1801 if ((pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0)
1802 dev_kfree_skb_irq(skb);
1804 pTDInfo->skb_dma = 0;
1806 pTDInfo->byFlags = 0;
1812 void InitRxManagementQueue(PSDevice pDevice)
1814 pDevice->rxManeQueue.packet_num = 0;
1815 pDevice->rxManeQueue.head = pDevice->rxManeQueue.tail = 0;
1827 PSDevice pDevice = (PSDevice) Context;
1828 PSRxMgmtPacket pRxMgmtPacket;
1830 //complete(&pDevice->notify);
1831 //printk("Enter MngWorkItem,Queue packet num is %d\n",pDevice->rxManeQueue.packet_num);
1833 //printk("Enter MlmeThread,packet _num is %d\n",pDevice->rxManeQueue.packet_num);
1840 //down(&pDevice->mlme_semaphore);
1841 // pRxMgmtPacket = DeQueue(pDevice);
1843 spin_lock_irq(&pDevice->lock);
1844 while(pDevice->rxManeQueue.packet_num != 0)
1846 pRxMgmtPacket = DeQueue(pDevice);
1848 //DequeueManageObject(pDevice->FirstRecvMngList, pDevice->LastRecvMngList);
1849 vMgrRxManagePacket(pDevice, pDevice->pMgmt, pRxMgmtPacket);
1850 //printk("packet_num is %d\n",pDevice->rxManeQueue.packet_num);
1853 spin_unlock_irq(&pDevice->lock);
1858 //printk("Before schedule thread jiffies is %x\n",jiffies);
1860 //printk("after schedule thread jiffies is %x\n",jiffies);
1863 //printk("i is %d\n",i);
1873 static int device_open(struct net_device *dev) {
1874 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1876 #ifdef WPA_SM_Transtatus
1877 extern SWPAResult wpa_Result;
1880 pDevice->rx_buf_sz = PKT_BUF_SZ;
1881 if (!device_init_rings(pDevice)) {
1884 //2008-5-13 <add> by chester
1885 i=request_irq(pDevice->pcid->irq, &device_intr, IRQF_SHARED, dev->name, dev);
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;
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);
1906 if (pDevice->bDiversityRegCtlON) {
1907 device_init_diversity_timer(pDevice);
1909 vMgrObjectInit(pDevice);
1910 vMgrTimerInit(pDevice);
1914 tasklet_init (&pDevice->RxMngWorkItem,(void *)MngWorkItem,(unsigned long )pDevice);
1917 InitRxManagementQueue(pDevice);
1919 mlme_task = kthread_run(MlmeThread,(void *) pDevice, "MLME");
1920 if (IS_ERR(mlme_task)) {
1921 printk("thread create fail\n");
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);
1937 // if (( SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RADIOCTL)&0x06)==0x04)
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);
1945 // Init for Key Management
1946 KeyvInitTable(&pDevice->sKey, pDevice->PortOffset);
1947 add_timer(&(pDevice->pMgmt->sTimerSecondCallback));
1949 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1951 pDevice->bwextstep0 = false;
1952 pDevice->bwextstep1 = false;
1953 pDevice->bwextstep2 = false;
1954 pDevice->bwextstep3 = false;
1956 pDevice->bwextcount=0;
1957 pDevice->bWPASuppWextEnabled = false;
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,
1969 pDevice->PortOffset,
1972 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1975 //printk("DEBUG2\n");
1978 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call MACvIntEnable\n");
1979 MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
1981 if (pDevice->pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1982 bScheduleCommand((void *)pDevice, WLAN_CMD_RUN_AP, NULL);
1985 bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1986 bScheduleCommand((void *)pDevice, WLAN_CMD_SSID, NULL);
1988 pDevice->flags |=DEVICE_FLAGS_OPENED;
1990 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
1995 static int device_close(struct net_device *dev) {
1996 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1997 PSMgmtObject pMgmt = pDevice->pMgmt;
2003 //2007-1121-02<Add>by EinsnLiu
2004 if (pDevice->bLinkPass) {
2005 bScheduleCommand((void *)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
2009 del_timer(&pDevice->sTimerTxData);
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);
2020 tasklet_kill(&pDevice->RxMngWorkItem);
2022 netif_stop_queue(dev);
2023 pDevice->bCmdRunning = false;
2024 MACbShutdown(pDevice->PortOffset);
2025 MACbSoftwareReset(pDevice->PortOffset);
2026 CARDbRadioPowerOff(pDevice);
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);
2043 //tasklet_kill(&pDevice->RxMngWorkItem);
2045 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close.. \n");
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;
2057 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211\n");
2058 spin_lock_irq(&pDevice->lock);
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);
2067 if (pDevice->bStopTx0Pkt == true) {
2068 dev_kfree_skb_irq(skb);
2069 spin_unlock_irq(&pDevice->lock);
2073 cbMPDULen = skb->len;
2076 vDMA0_tx_80211(pDevice, skb, pbMPDU, cbMPDULen);
2078 spin_unlock_irq(&pDevice->lock);
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;
2097 // unsigned char byKeyIndex = 0;
2100 if (pDevice->bStopTx0Pkt == true) {
2101 dev_kfree_skb_irq(skb);
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");
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");
2119 pHeadTD = pDevice->apCurrTD[TYPE_TXDMA0];
2121 pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP);
2123 memcpy(pDevice->sTxEthHeader.abyDstAddr, (unsigned char *)(skb->data), ETH_HLEN);
2124 cbFrameBodySize = skb->len - ETH_HLEN;
2127 if (ntohs(pDevice->sTxEthHeader.wType) > ETH_DATA_LEN) {
2128 cbFrameBodySize += 8;
2130 uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader);
2132 if ( uMACfragNum > AVAIL_TD(pDevice, TYPE_TXDMA0)) {
2133 dev_kfree_skb_irq(skb);
2136 byPktType = (unsigned char)pDevice->byPacketType;
2139 if (pDevice->bFixRate) {
2140 if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
2141 if (pDevice->uConnectionRate >= RATE_11M) {
2142 pDevice->wCurrentRate = RATE_11M;
2144 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2147 if (pDevice->uConnectionRate >= RATE_54M)
2148 pDevice->wCurrentRate = RATE_54M;
2150 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2154 pDevice->wCurrentRate = pDevice->pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2158 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2159 pDevice->byPreambleType = pDevice->byShortPreamble;
2162 pDevice->byPreambleType = PREAMBLE_LONG;
2165 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dma0: pDevice->wCurrentRate = %d \n", pDevice->wCurrentRate);
2168 if (pDevice->wCurrentRate <= RATE_11M) {
2169 byPktType = PK_TYPE_11B;
2170 } else if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2171 byPktType = PK_TYPE_11A;
2173 if (pDevice->bProtectMode == true) {
2174 byPktType = PK_TYPE_11GB;
2176 byPktType = PK_TYPE_11GA;
2180 if (pDevice->bEncryptionEnable == true)
2181 bNeedEncryption = true;
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
2195 vGenerateFIFOHeader(pDevice, byPktType, pDevice->pbyTmpBuff, bNeedEncryption,
2196 cbFrameBodySize, TYPE_TXDMA0, pHeadTD,
2197 &pDevice->sTxEthHeader, (unsigned char *)skb->data, pTransmitKey, uNodeIndex,
2202 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2204 MACbPSWakeup(pDevice->PortOffset);
2207 pDevice->bPWBitOn = false;
2210 for (ii = 0; ii < uMACfragNum; ii++) {
2211 // Poll Transmit the adapter
2213 pHeadTD->m_td0TD0.f1Owner=OWNED_BY_NIC;
2215 if (ii == (uMACfragNum - 1))
2217 pHeadTD = pHeadTD->next;
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;
2226 pDevice->apCurrTD[TYPE_TXDMA0] = pHeadTD;
2228 MACvTransmit0(pDevice->PortOffset);
2234 //TYPE_AC0DMA data tx
2235 static int device_xmit(struct sk_buff *skb, struct net_device *dev) {
2236 PSDevice pDevice=netdev_priv(dev);
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;
2251 bool bTKIP_UseGTK = false;
2252 bool bNeedDeAuth = false;
2253 unsigned char *pbyBSSID;
2254 bool bNodeExist = false;
2258 spin_lock_irq(&pDevice->lock);
2259 if (pDevice->bLinkPass == false) {
2260 dev_kfree_skb_irq(skb);
2261 spin_unlock_irq(&pDevice->lock);
2265 if (pDevice->bStopDataPkt) {
2266 dev_kfree_skb_irq(skb);
2267 spin_unlock_irq(&pDevice->lock);
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);
2278 if (is_multicast_ether_addr((unsigned char *)(skb->data))) {
2281 if (pMgmt->sNodeDBTable[0].bPSEnable) {
2282 skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb);
2283 pMgmt->sNodeDBTable[0].wEnQueueCnt++;
2285 pMgmt->abyPSTxMap[0] |= byMask[0];
2286 spin_unlock_irq(&pDevice->lock);
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++;
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);
2303 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2304 pDevice->byPreambleType = pDevice->byShortPreamble;
2307 pDevice->byPreambleType = PREAMBLE_LONG;
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);
2322 pHeadTD = pDevice->apCurrTD[TYPE_AC0DMA];
2324 pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP);
2327 memcpy(pDevice->sTxEthHeader.abyDstAddr, (unsigned char *)(skb->data), ETH_HLEN);
2328 cbFrameBodySize = skb->len - ETH_HLEN;
2330 if (ntohs(pDevice->sTxEthHeader.wType) > ETH_DATA_LEN) {
2331 cbFrameBodySize += 8;
2335 if (pDevice->bEncryptionEnable == true) {
2336 bNeedEncryption = true;
2339 if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
2340 (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2341 pbyBSSID = pDevice->abyBSSID;
2343 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
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");
2351 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get PTK.\n");
2354 }else if (pDevice->pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
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");
2363 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == true)
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);
2374 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"NOT IBSS and KEY is NULL. [%d]\n", pDevice->pMgmt->eCurrMode);
2376 bTKIP_UseGTK = true;
2377 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
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
2398 uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader);
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);
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
2414 byPktType = (unsigned char)pDevice->byPacketType;
2416 if (pDevice->bFixRate) {
2418 printk("Fix Rate: PhyType is %d,ConnectionRate is %d\n",pDevice->eCurrentPHYType,pDevice->uConnectionRate);
2421 if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
2422 if (pDevice->uConnectionRate >= RATE_11M) {
2423 pDevice->wCurrentRate = RATE_11M;
2425 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2428 if ((pDevice->eCurrentPHYType == PHY_TYPE_11A) &&
2429 (pDevice->uConnectionRate <= RATE_6M)) {
2430 pDevice->wCurrentRate = RATE_6M;
2432 if (pDevice->uConnectionRate >= RATE_54M)
2433 pDevice->wCurrentRate = RATE_54M;
2435 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2439 pDevice->byACKRate = (unsigned char) pDevice->wCurrentRate;
2440 pDevice->byTopCCKBasicRate = RATE_1M;
2441 pDevice->byTopOFDMBasicRate = RATE_6M;
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;
2452 pDevice->wCurrentRate = RATE_6M;
2453 pDevice->byACKRate = RATE_6M;
2454 pDevice->byTopCCKBasicRate = RATE_1M;
2455 pDevice->byTopOFDMBasicRate = RATE_6M;
2459 VNTWIFIvGetTxRate( pDevice->pMgmt,
2460 pDevice->sTxEthHeader.abyDstAddr,
2461 &(pDevice->wCurrentRate),
2462 &(pDevice->byACKRate),
2463 &(pDevice->byTopCCKBasicRate),
2464 &(pDevice->byTopOFDMBasicRate));
2470 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "acdma0: pDevice->wCurrentRate = %d \n", pDevice->wCurrentRate);
2472 if (pDevice->wCurrentRate <= RATE_11M) {
2473 byPktType = PK_TYPE_11B;
2474 } else if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2475 byPktType = PK_TYPE_11A;
2477 if (pDevice->bProtectMode == true) {
2478 byPktType = PK_TYPE_11GB;
2480 byPktType = PK_TYPE_11GA;
2484 //#ifdef PLICE_DEBUG
2485 // printk("FIX RATE:CurrentRate is %d");
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");
2498 if (bTKIP_UseGTK == true) {
2499 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n");
2502 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
2503 bNeedEncryption = true;
2508 if (pDevice->byCntMeasure == 2) {
2510 pDevice->s802_11Counter.TKIPCounterMeasuresInvoked++;
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;
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);
2533 //if (skb->len == 98)
2535 // printk("ping:len is %d\n");
2538 vGenerateFIFOHeader(pDevice, byPktType, pDevice->pbyTmpBuff, bNeedEncryption,
2539 cbFrameBodySize, TYPE_AC0DMA, pHeadTD,
2540 &pDevice->sTxEthHeader, (unsigned char *)skb->data, pTransmitKey, uNodeIndex,
2545 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2547 MACbPSWakeup(pDevice->PortOffset);
2549 pDevice->bPWBitOn = false;
2552 for (ii = 0; ii < uMACfragNum; ii++) {
2553 // Poll Transmit the adapter
2555 pHeadTD->m_td0TD0.f1Owner=OWNED_BY_NIC;
2557 if (ii == uMACfragNum - 1)
2559 pHeadTD = pHeadTD->next;
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;
2568 pDevice->nTxDataTimeCout=0; //2008-8-21 chester <add> for send null packet
2570 if (AVAIL_TD(pDevice, TYPE_AC0DMA) <= 1) {
2571 netif_stop_queue(dev);
2574 pDevice->apCurrTD[TYPE_AC0DMA] = pHeadTD;
2575 //#ifdef PLICE_DEBUG
2576 if (pDevice->bFixRate)
2578 printk("FixRate:Rate is %d,TxPower is %d\n",pDevice->wCurrentRate,pDevice->byCurPwr);
2582 //printk("Auto Rate:Rate is %d,TxPower is %d\n",pDevice->wCurrentRate,pDevice->byCurPwr);
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)
2608 printk("Authentication completed!!\n");
2615 MACvTransmitAC0(pDevice->PortOffset);
2616 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "acdma0:pDevice->apCurrTD= %p\n", pHeadTD);
2618 dev->trans_start = jiffies;
2620 spin_unlock_irq(&pDevice->lock);
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);
2630 unsigned long dwMIBCounter=0;
2631 PSMgmtObject pMgmt = pDevice->pMgmt;
2632 unsigned char byOrgPageSel=0;
2634 unsigned char byData = 0;
2636 // unsigned char byRSSI;
2639 MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
2641 if (pDevice->dwIsr == 0)
2642 return IRQ_RETVAL(handled);
2644 if (pDevice->dwIsr == 0xffffffff) {
2645 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dwIsr = 0xffff\n");
2646 return IRQ_RETVAL(handled);
2649 // 2008-05-21 <mark> by Richardtai, we can't read RSSI here, because no packet bound with RSSI
2651 if ((pDevice->dwIsr & ISR_RXDMA0) &&
2652 (pDevice->byLocalID != REV_ID_VT3253_B0) &&
2653 (pDevice->bBSSIDFilter == true)) {
2655 //BBbReadEmbedded(pDevice->PortOffset, 0x3E, &byRSSI);
2656 //pDevice->uCurrRSSI = byRSSI;
2661 MACvIntDisable(pDevice->PortOffset);
2662 spin_lock_irq(&pDevice->lock);
2664 //Make sure current page is 0
2665 VNSvInPortB(pDevice->PortOffset + MAC_REG_PAGE1SEL, &byOrgPageSel);
2666 if (byOrgPageSel == 1) {
2667 MACvSelectPage0(pDevice->PortOffset);
2672 MACvReadMIBCounter(pDevice->PortOffset, &dwMIBCounter);
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) {
2680 STAvUpdateIsrStatCounter(&pDevice->scStatistic, pDevice->dwIsr);
2681 MACvWriteISR(pDevice->PortOffset, pDevice->dwIsr);
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);
2690 if (pDevice->byLocalID > REV_ID_VT3253_B1) {
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);
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;
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);
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) {
2745 s_vCompleteCurrentMeasure(pDevice, 0);
2747 // can not measure because not ready before end of measure time
2748 s_vCompleteCurrentMeasure(pDevice, MEASURE_MODE_LATE);
2751 if (pDevice->dwIsr & ISR_QUIETSTART) {
2754 } while (CARDbStartQuiet(pDevice) == false);
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);
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);
2782 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2783 //pDevice->bBeaconSent = false;
2785 if ((pDevice->bUpdateBBVGA) && (pDevice->bLinkPass == true) && (pDevice->uCurrRSSI != 0)) {
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];
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);
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);
2809 pDevice->uBBVGADiffCount = 1;
2814 pDevice->bBeaconSent = false;
2815 if (pDevice->bEnablePSMode) {
2816 PSbIsNextTBTTWakeUp((void *)pDevice);
2819 if ((pDevice->eOPMode == OP_MODE_AP) ||
2820 (pDevice->eOPMode == OP_MODE_ADHOC)) {
2822 MACvOneShotTimer1MicroSec(pDevice->PortOffset,
2823 (pMgmt->wIBSSBeaconPeriod - MAKE_BEACON_RESERVED) << 10);
2826 if (pDevice->eOPMode == OP_MODE_ADHOC && pDevice->pMgmt->wCurrATIMWindow > 0) {
2827 // todo adhoc PS mode
2832 if (pDevice->dwIsr & ISR_BNTX) {
2834 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2835 pDevice->bIsBeaconBufReadySet = false;
2836 pDevice->cbBeaconBufReadySetCnt = 0;
2839 if (pDevice->eOPMode == OP_MODE_AP) {
2840 if(pMgmt->byDTIMCount > 0) {
2841 pMgmt->byDTIMCount --;
2842 pMgmt->sNodeDBTable[0].bRxPSPoll = false;
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);
2853 pDevice->bBeaconSent = true;
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);
2871 if (pDevice->dwIsr & ISR_RXDMA0) {
2872 max_count += device_rx_srv(pDevice, TYPE_RXDMA0);
2874 if (pDevice->dwIsr & ISR_RXDMA1) {
2875 max_count += device_rx_srv(pDevice, TYPE_RXDMA1);
2877 if (pDevice->dwIsr & ISR_TXDMA0){
2878 max_count += device_tx_srv(pDevice, TYPE_TXDMA0);
2880 if (pDevice->dwIsr & ISR_AC0DMA){
2881 max_count += device_tx_srv(pDevice, TYPE_AC0DMA);
2883 if (pDevice->dwIsr & ISR_SOFTTIMER) {
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);
2891 pMgmt->wCurrCapInfo &= ~(WLAN_SET_CAP_INFO_SHORTSLOTTIME(1));
2893 bMgrPrepareBeaconToSend(pDevice, pMgmt);
2894 pDevice->byCntMeasure = 0;
2897 MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
2899 MACvReceive0(pDevice->PortOffset);
2900 MACvReceive1(pDevice->PortOffset);
2902 if (max_count>pDevice->sOpts.int_works)
2906 if (byOrgPageSel == 1) {
2907 MACvSelectPage1(pDevice->PortOffset);
2910 spin_unlock_irq(&pDevice->lock);
2911 MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
2913 return IRQ_RETVAL(handled);
2917 static unsigned const ethernet_polynomial = 0x04c11db7U;
2918 static inline u32 ether_crc(int length, unsigned char *data)
2922 while(--length >= 0) {
2923 unsigned char current_octet = *data++;
2925 for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
2927 ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
2933 //2008-8-4 <add> by chester
2934 static int Config_FileGetParameter(unsigned char *string,
2935 unsigned char *dest, unsigned char *source)
2937 unsigned char buf1[100];
2938 int source_len = strlen(source);
2941 strcat(buf1, string);
2943 source+=strlen(buf1);
2945 memcpy(dest,source,source_len-strlen(buf1));
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;
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;
2969 filp = filp_open(config_path, O_RDWR, 0);
2971 printk("Config_FileOperation:open file fail?\n");
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);
2982 buffer = kmalloc(1024, GFP_KERNEL);
2984 printk("allocate mem for file fail?\n");
2989 if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
2990 printk("read file error?\n");
2995 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer)!=true) {
2996 printk("get parameter error?\n");
3001 if(memcmp(tmpbuffer,"USA",3)==0) {
3002 result=ZoneType_USA;
3004 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
3005 result=ZoneType_Japan;
3007 else if(memcmp(tmpbuffer,"EUROPE",5)==0) {
3008 result=ZoneType_Europe;
3012 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
3018 if(filp_close(filp,NULL))
3019 printk("Config_FileOperation:close file fail\n");
3025 current->cred->fsuid=oldfsuid;
3026 current->cred->fsgid=oldfsgid;
3034 static void device_set_multi(struct net_device *dev) {
3035 PSDevice pDevice = (PSDevice) netdev_priv(dev);
3037 PSMgmtObject pMgmt = pDevice->pMgmt;
3039 struct netdev_hw_addr *ha;
3042 VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byRxMode));
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);
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);
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));
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);
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);
3077 VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byRxMode);
3078 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode = %x\n", pDevice->byRxMode );
3082 static struct net_device_stats *device_get_stats(struct net_device *dev) {
3083 PSDevice pDevice=(PSDevice) netdev_priv(dev);
3085 return &pDevice->stats;
3090 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
3091 PSDevice pDevice = (PSDevice)netdev_priv(dev);
3093 struct iwreq *wrq = (struct iwreq *) rq;
3095 PSMgmtObject pMgmt = pDevice->pMgmt;
3099 if (pMgmt == NULL) {
3107 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
3110 case SIOCGIWNWID: //0x8b03 support
3114 // Set frequency/channel
3116 rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
3119 // Get frequency/channel
3121 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
3124 // Set desired network name (ESSID)
3128 char essid[IW_ESSID_MAX_SIZE+1];
3129 if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
3133 if (copy_from_user(essid, wrq->u.essid.pointer,
3134 wrq->u.essid.length)) {
3138 rc = iwctl_siwessid(dev, NULL,
3139 &(wrq->u.essid), essid);
3144 // Get current network name (ESSID)
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,
3154 wrq->u.essid.length) )
3161 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
3165 // Get current Access Point (BSSID)
3167 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
3171 // Set desired station name
3173 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
3177 // Get current station name
3179 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
3183 // Set the desired bit-rate
3185 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
3188 // Get the current bit-rate
3191 rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
3194 // Set the desired RTS threshold
3197 rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
3200 // Get the current RTS threshold
3203 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
3206 // Set the desired fragmentation threshold
3209 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
3212 // Get the current fragmentation threshold
3215 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
3218 // Set mode of operation
3220 rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
3223 // Get mode of operation
3225 rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
3228 // Set WEP keys and mode
3231 char abyKey[WLAN_WEP232_KEYLEN];
3233 if (wrq->u.encoding.pointer) {
3236 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
3240 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
3241 if (copy_from_user(abyKey,
3242 wrq->u.encoding.pointer,
3243 wrq->u.encoding.length)) {
3247 } else if (wrq->u.encoding.length != 0) {
3251 rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
3255 // Get the WEP keys and mode
3258 if (!capable(CAP_NET_ADMIN)) {
3263 char abyKey[WLAN_WEP232_KEYLEN];
3265 rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
3267 if (wrq->u.encoding.pointer) {
3268 if (copy_to_user(wrq->u.encoding.pointer,
3270 wrq->u.encoding.length))
3276 // Get the current Tx-Power
3278 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
3283 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWTXPOW \n");
3289 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
3294 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
3297 // Get range of parameters
3301 struct iw_range range;
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)))
3312 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
3318 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
3324 rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
3328 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
3334 char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
3336 if (wrq->u.data.pointer) {
3337 rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
3339 if (copy_to_user(wrq->u.data.pointer,
3341 (wrq->u.data.length * (sizeof(struct sockaddr) + sizeof(struct iw_quality)))
3354 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
3361 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWSPY \n");
3365 #endif // WIRELESS_SPY
3368 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
3371 if(wrq->u.data.pointer) {
3372 wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
3374 if(copy_to_user(wrq->u.data.pointer,
3375 (u_char *) iwctl_private_args,
3376 sizeof(iwctl_private_args)))
3383 //2008-0409-07, <Add> by Einsn Liu
3384 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3386 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH \n");
3387 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
3391 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
3392 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
3396 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
3397 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3401 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
3402 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3405 case SIOCSIWENCODEEXT:
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)){
3415 if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
3419 }else if(wrq->u.encoding.length != 0){
3423 rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
3427 case SIOCGIWENCODEEXT:
3428 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
3429 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
3433 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
3434 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3437 #endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3438 //End Add -- //2008-0409-07, <Add> by Einsn Liu
3440 case IOCTL_CMD_TEST:
3442 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
3448 pReq = (PSCmdRequest)rq;
3449 pReq->wResult = MAGIC_CODE;
3455 if((((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_EVT) &&
3456 !(pDevice->flags & DEVICE_FLAGS_OPENED))
3458 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
3459 (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
3468 if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
3471 rc = private_ioctl(pDevice, rq);
3472 clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
3475 case IOCTL_CMD_HOSTAPD:
3478 rc = vt6655_hostap_ioctl(pDevice, &wrq->u.data);
3483 rc = wpa_ioctl(pDevice, &wrq->u.data);
3487 return ethtool_ioctl(dev, (void *) rq->ifr_data);
3488 // All other calls are currently unsupported
3492 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
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);
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)
3515 bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
3516 bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL);
3517 spin_unlock_irq(&pDevice->lock);
3519 pDevice->bCommit = false;
3526 static int ethtool_ioctl(struct net_device *dev, void *useraddr)
3530 if (copy_from_user(ðcmd, useraddr, sizeof(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)))
3548 /*------------------------------------------------------------------*/
3550 MODULE_DEVICE_TABLE(pci, vt6655_pci_id_table);
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,
3558 .suspend = viawget_suspend,
3559 .resume = viawget_resume,
3563 static int __init vt6655_init_module(void)
3568 // ret=pci_module_init(&device_driver);
3569 //ret = pcie_port_service_register(&device_driver);
3570 ret = pci_register_driver(&device_driver);
3573 register_reboot_notifier(&device_notifier);
3579 static void __exit vt6655_cleanup_module(void)
3584 unregister_reboot_notifier(&device_notifier);
3586 pci_unregister_driver(&device_driver);
3590 module_init(vt6655_init_module);
3591 module_exit(vt6655_cleanup_module);
3596 device_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
3598 struct pci_dev *pdev = NULL;
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);
3614 viawget_suspend(struct pci_dev *pcid, pm_message_t state)
3616 int power_status; // to silence the compiler
3618 PSDevice pDevice=pci_get_drvdata(pcid);
3619 PSMgmtObject pMgmt = pDevice->pMgmt;
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);
3642 viawget_resume(struct pci_dev *pcid)
3644 PSDevice pDevice=pci_get_drvdata(pcid);
3645 PSMgmtObject pMgmt = pDevice->pMgmt;
3646 int power_status; // to silence the compiler
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;
3664 pMgmt->eCurrMode = WMAC_MODE_STANDBY;
3665 pMgmt->eCurrState = WMAC_STATE_IDLE;
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);