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 * device_found1 - module initial (insmod) driver entry
30 * device_remove1 - module remove entry
31 * device_init_info - device structure resource allocation function
32 * device_free_info - device structure resource free function
33 * device_get_pci_info - get allocated pci io/mem resource
34 * device_print_info - print out resource
35 * device_open - allocate dma/descripter resource & initial mac/bbp function
36 * device_xmit - asynchrous data tx function
37 * device_intr - interrupt handle function
38 * device_set_multi - set mac filter
39 * device_ioctl - ioctl entry
40 * device_close - shutdown mac/bbp & free dma/descripter resource
41 * device_rx_srv - rx service function
42 * device_receive_frame - rx data function
43 * device_alloc_rx_buf - rx buffer pre-allocated function
44 * device_alloc_frag_buf - rx fragement pre-allocated function
45 * device_free_tx_buf - free tx buffer function
46 * device_free_frag_buf- free de-fragement buffer
47 * device_dma0_tx_80211- tx 802.11 frame via dma0
48 * device_dma0_xmit- tx PS bufferred frame via dma0
49 * device_init_rd0_ring- initial rd dma0 ring
50 * device_init_rd1_ring- initial rd dma1 ring
51 * device_init_td0_ring- initial tx dma0 ring buffer
52 * device_init_td1_ring- initial tx dma1 ring buffer
53 * device_init_registers- initial MAC & BBP & RF internal registers.
54 * device_init_rings- initial tx/rx ring buffer
55 * device_init_defrag_cb- initial & allocate de-fragement buffer.
56 * device_free_rings- free all allocated ring buffer
57 * device_tx_srv- tx interrupt service function
63 #if !defined(__DEVICE_H__)
66 #if !defined(__CARD_H__)
69 #if !defined(__TBIT_H__)
72 #if !defined(__BASEBAND_H__)
75 #if !defined(__MAC_H__)
78 #if !defined(__TETHER_H__)
81 #if !defined(__WMGR_H__)
84 #if !defined(__WCTL_H__)
87 #if !defined(__POWER_H__)
90 #if !defined(__WCMD_H__)
93 #if !defined(__IOCMD_H__)
96 #if !defined(__TCRC_H__)
99 #if !defined(__RXTX_H__)
102 #if !defined(__WROUTE_H__)
105 #if !defined(__BSSDB_H__)
108 #if !defined(__HOSTAP_H__)
111 #if !defined(__WPACTL_H__)
114 #if !defined(__IOCTL_H__)
117 #if !defined(__IWCTL_H__)
120 #if !defined(__DPC_H__)
123 #if !defined(__DATARATE_H__)
124 #include "datarate.h"
126 #if !defined(__RF_H__)
129 #if !defined(__IOWPA_H__)
133 #include <linux/delay.h>
134 #include <linux/kthread.h>
135 // #ifdef PRIVATE_OBJ
136 //#if !defined(__DEVICE_EXP_H)
137 //#include "device_exp.h"
139 //#if !defined(__DEVICE_MODULE_H)
140 //#include "device_module.h"
146 /*--------------------- Static Definitions -------------------------*/
147 //static int msglevel =MSG_LEVEL_DEBUG;
148 static int msglevel = MSG_LEVEL_INFO;
150 //#define PLICE_DEBUG
152 // Define module options
155 MODULE_AUTHOR("VIA Networking Technologies, Inc., <lyndonchen@vntek.com.tw>");
156 MODULE_LICENSE("GPL");
157 MODULE_DESCRIPTION("VIA Networking Solomon-A/B/G Wireless LAN Adapter Driver");
161 static int mlme_kill;
162 //static struct task_struct * mlme_task;
165 #define DEVICE_PARAM(N,D)
167 static const int N[MAX_UINTS]=OPTION_DEFAULT;\
168 MODULE_PARM(N, "1-" __MODULE_STRING(MAX_UINTS) "i");\
169 MODULE_PARM_DESC(N, D);
172 #define RX_DESC_MIN0 16
173 #define RX_DESC_MAX0 128
174 #define RX_DESC_DEF0 32
175 DEVICE_PARAM(RxDescriptors0,"Number of receive descriptors0");
177 #define RX_DESC_MIN1 16
178 #define RX_DESC_MAX1 128
179 #define RX_DESC_DEF1 32
180 DEVICE_PARAM(RxDescriptors1,"Number of receive descriptors1");
182 #define TX_DESC_MIN0 16
183 #define TX_DESC_MAX0 128
184 #define TX_DESC_DEF0 32
185 DEVICE_PARAM(TxDescriptors0,"Number of transmit descriptors0");
187 #define TX_DESC_MIN1 16
188 #define TX_DESC_MAX1 128
189 #define TX_DESC_DEF1 64
190 DEVICE_PARAM(TxDescriptors1,"Number of transmit descriptors1");
193 #define IP_ALIG_DEF 0
194 /* IP_byte_align[] is used for IP header DWORD byte aligned
195 0: indicate the IP header won't be DWORD byte aligned.(Default) .
196 1: indicate the IP header will be DWORD byte aligned.
197 In some enviroment, the IP header should be DWORD byte aligned,
198 or the packet will be droped when we receive it. (eg: IPVS)
200 DEVICE_PARAM(IP_byte_align,"Enable IP header dword aligned");
203 #define INT_WORKS_DEF 20
204 #define INT_WORKS_MIN 10
205 #define INT_WORKS_MAX 64
207 DEVICE_PARAM(int_works,"Number of packets per interrupt services");
209 #define CHANNEL_MIN 1
210 #define CHANNEL_MAX 14
211 #define CHANNEL_DEF 6
213 DEVICE_PARAM(Channel, "Channel number");
216 /* PreambleType[] is the preamble length used for transmit.
217 0: indicate allows long preamble type
218 1: indicate allows short preamble type
221 #define PREAMBLE_TYPE_DEF 1
223 DEVICE_PARAM(PreambleType, "Preamble Type");
226 #define RTS_THRESH_MIN 512
227 #define RTS_THRESH_MAX 2347
228 #define RTS_THRESH_DEF 2347
230 DEVICE_PARAM(RTSThreshold, "RTS threshold");
233 #define FRAG_THRESH_MIN 256
234 #define FRAG_THRESH_MAX 2346
235 #define FRAG_THRESH_DEF 2346
237 DEVICE_PARAM(FragThreshold, "Fragmentation threshold");
240 #define DATA_RATE_MIN 0
241 #define DATA_RATE_MAX 13
242 #define DATA_RATE_DEF 13
244 0: indicate 1 Mbps 0x02
245 1: indicate 2 Mbps 0x04
246 2: indicate 5.5 Mbps 0x0B
247 3: indicate 11 Mbps 0x16
248 4: indicate 6 Mbps 0x0c
249 5: indicate 9 Mbps 0x12
250 6: indicate 12 Mbps 0x18
251 7: indicate 18 Mbps 0x24
252 8: indicate 24 Mbps 0x30
253 9: indicate 36 Mbps 0x48
254 10: indicate 48 Mbps 0x60
255 11: indicate 54 Mbps 0x6c
256 12: indicate 72 Mbps 0x90
257 13: indicate auto rate
260 DEVICE_PARAM(ConnectionRate, "Connection data rate");
262 #define OP_MODE_DEF 0
264 DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode ");
266 /* OpMode[] is used for transmit.
267 0: indicate infrastruct mode used
268 1: indicate adhoc mode used
269 2: indicate AP mode used
274 0: indicate disable power saving mode
275 1: indicate enable power saving mode
278 #define PS_MODE_DEF 0
280 DEVICE_PARAM(PSMode, "Power saving mode");
283 #define SHORT_RETRY_MIN 0
284 #define SHORT_RETRY_MAX 31
285 #define SHORT_RETRY_DEF 8
288 DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");
290 #define LONG_RETRY_MIN 0
291 #define LONG_RETRY_MAX 15
292 #define LONG_RETRY_DEF 4
295 DEVICE_PARAM(LongRetryLimit, "long frame retry limits");
298 /* BasebandType[] baseband type selected
299 0: indicate 802.11a type
300 1: indicate 802.11b type
301 2: indicate 802.11g type
303 #define BBP_TYPE_MIN 0
304 #define BBP_TYPE_MAX 2
305 #define BBP_TYPE_DEF 2
307 DEVICE_PARAM(BasebandType, "baseband type");
312 0: indicate disable 802.11h
313 1: indicate enable 802.11h
316 #define X80211h_MODE_DEF 0
318 DEVICE_PARAM(b80211hEnable, "802.11h mode");
321 0: indicate disable 802.11h
322 1: indicate enable 802.11h
325 #define DIVERSITY_ANT_DEF 0
327 DEVICE_PARAM(bDiversityANTEnable, "ANT diversity mode");
331 // Static vars definitions
336 static int device_nics =0;
337 static PSDevice pDevice_Infos =NULL;
338 static struct net_device *root_device_dev = NULL;
340 static CHIP_INFO chip_info_table[]= {
341 { VT3253, "VIA Networking Solomon-A/B/G Wireless LAN Adapter ",
342 256, 1, DEVICE_FLAGS_IP_ALIGN|DEVICE_FLAGS_TX_ALIGN },
346 static struct pci_device_id device_id_table[] __devinitdata = {
347 { 0x1106, 0x3253, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (int)&chip_info_table[0]},
352 /*--------------------- Static Functions --------------------------*/
356 static int device_found1(struct pci_dev *pcid, const struct pci_device_id *ent);
357 static BOOL device_init_info(struct pci_dev* pcid, PSDevice* ppDevice, PCHIP_INFO);
358 static void device_free_info(PSDevice pDevice);
359 static BOOL device_get_pci_info(PSDevice, struct pci_dev* pcid);
360 static void device_print_info(PSDevice pDevice);
361 static struct net_device_stats *device_get_stats(struct net_device *dev);
362 static void device_init_diversity_timer(PSDevice pDevice);
363 static int device_open(struct net_device *dev);
364 static int device_xmit(struct sk_buff *skb, struct net_device *dev);
365 static irqreturn_t device_intr(int irq, void*dev_instance);
366 static void device_set_multi(struct net_device *dev);
367 static int device_close(struct net_device *dev);
368 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
371 static int device_notify_reboot(struct notifier_block *, unsigned long event, void *ptr);
372 static int viawget_suspend(struct pci_dev *pcid, u32 state);
373 static int viawget_resume(struct pci_dev *pcid);
374 struct notifier_block device_notifier = {
375 notifier_call: device_notify_reboot,
381 #endif // #ifndef PRIVATE_OBJ
383 static void device_init_rd0_ring(PSDevice pDevice);
384 static void device_init_rd1_ring(PSDevice pDevice);
385 static void device_init_defrag_cb(PSDevice pDevice);
386 static void device_init_td0_ring(PSDevice pDevice);
387 static void device_init_td1_ring(PSDevice pDevice);
390 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev);
392 //2008-0714<Add>by Mike Liu
393 static BOOL device_release_WPADEV(PSDevice pDevice);
395 static int ethtool_ioctl(struct net_device *dev, void *useraddr);
396 static int device_rx_srv(PSDevice pDevice, UINT uIdx);
397 static int device_tx_srv(PSDevice pDevice, UINT uIdx);
398 static BOOL device_alloc_rx_buf(PSDevice pDevice, PSRxDesc pDesc);
399 static void device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType);
400 static void device_free_tx_buf(PSDevice pDevice, PSTxDesc pDesc);
401 static void device_free_td0_ring(PSDevice pDevice);
402 static void device_free_td1_ring(PSDevice pDevice);
403 static void device_free_rd0_ring(PSDevice pDevice);
404 static void device_free_rd1_ring(PSDevice pDevice);
405 static void device_free_rings(PSDevice pDevice);
406 static void device_free_frag_buf(PSDevice pDevice);
407 static int Config_FileGetParameter(UCHAR *string, UCHAR *dest,UCHAR *source);
410 /*--------------------- Export Variables --------------------------*/
412 /*--------------------- Export Functions --------------------------*/
417 static char* get_chip_name(int chip_id) {
419 for (i=0;chip_info_table[i].name!=NULL;i++)
420 if (chip_info_table[i].chip_id==chip_id)
422 return chip_info_table[i].name;
425 static void __devexit device_remove1(struct pci_dev *pcid)
427 PSDevice pDevice=pci_get_drvdata(pcid);
431 device_free_info(pDevice);
438 device_set_int_opt(int *opt, int val, int min, int max, int def,char* name,char* devname) {
441 else if (val<min || val>max) {
442 DEVICE_PRT(MSG_LEVEL_INFO, KERN_NOTICE "%s: the value of parameter %s is invalid, the valid range is (%d-%d)\n" ,
443 devname,name, min,max);
446 DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: set value of parameter %s to %d\n",
453 device_set_bool_opt(PU32 opt, int val,BOOL def,U32 flag, char* name,char* devname) {
456 *opt|=(def ? flag : 0);
457 else if (val<0 || val>1) {
458 DEVICE_PRT(MSG_LEVEL_INFO, KERN_NOTICE
459 "%s: the value of parameter %s is invalid, the valid range is (0-1)\n",devname,name);
460 *opt|=(def ? flag : 0);
462 DEVICE_PRT(MSG_LEVEL_INFO, KERN_NOTICE "%s: set parameter %s to %s\n",
463 devname,name , val ? "TRUE" : "FALSE");
464 *opt|=(val ? flag : 0);
469 device_get_options(PSDevice pDevice, int index, char* devname) {
471 POPTIONS pOpts = &(pDevice->sOpts);
472 pOpts->nRxDescs0=RX_DESC_DEF0;
473 pOpts->nRxDescs1=RX_DESC_DEF1;
474 pOpts->nTxDescs[0]=TX_DESC_DEF0;
475 pOpts->nTxDescs[1]=TX_DESC_DEF1;
476 pOpts->flags|=DEVICE_FLAGS_IP_ALIGN;
477 pOpts->int_works=INT_WORKS_DEF;
478 pOpts->rts_thresh=RTS_THRESH_DEF;
479 pOpts->frag_thresh=FRAG_THRESH_DEF;
480 pOpts->data_rate=DATA_RATE_DEF;
481 pOpts->channel_num=CHANNEL_DEF;
483 pOpts->flags|=DEVICE_FLAGS_PREAMBLE_TYPE;
484 pOpts->flags|=DEVICE_FLAGS_OP_MODE;
485 //pOpts->flags|=DEVICE_FLAGS_PS_MODE;
486 pOpts->short_retry=SHORT_RETRY_DEF;
487 pOpts->long_retry=LONG_RETRY_DEF;
488 pOpts->bbp_type=BBP_TYPE_DEF;
489 pOpts->flags|=DEVICE_FLAGS_80211h_MODE;
490 pOpts->flags|=DEVICE_FLAGS_DiversityANT;
496 device_set_options(PSDevice pDevice) {
498 BYTE abyBroadcastAddr[U_ETHER_ADDR_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
499 BYTE abySNAP_RFC1042[U_ETHER_ADDR_LEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
500 BYTE abySNAP_Bridgetunnel[U_ETHER_ADDR_LEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
503 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, U_ETHER_ADDR_LEN);
504 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, U_ETHER_ADDR_LEN);
505 memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, U_ETHER_ADDR_LEN);
507 pDevice->uChannel = pDevice->sOpts.channel_num;
508 pDevice->wRTSThreshold = pDevice->sOpts.rts_thresh;
509 pDevice->wFragmentationThreshold = pDevice->sOpts.frag_thresh;
510 pDevice->byShortRetryLimit = pDevice->sOpts.short_retry;
511 pDevice->byLongRetryLimit = pDevice->sOpts.long_retry;
512 pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME;
513 pDevice->byShortPreamble = (pDevice->sOpts.flags & DEVICE_FLAGS_PREAMBLE_TYPE) ? 1 : 0;
514 pDevice->byOpMode = (pDevice->sOpts.flags & DEVICE_FLAGS_OP_MODE) ? 1 : 0;
515 pDevice->ePSMode = (pDevice->sOpts.flags & DEVICE_FLAGS_PS_MODE) ? 1 : 0;
516 pDevice->b11hEnable = (pDevice->sOpts.flags & DEVICE_FLAGS_80211h_MODE) ? 1 : 0;
517 pDevice->bDiversityRegCtlON = (pDevice->sOpts.flags & DEVICE_FLAGS_DiversityANT) ? 1 : 0;
518 pDevice->uConnectionRate = pDevice->sOpts.data_rate;
519 if (pDevice->uConnectionRate < RATE_AUTO) pDevice->bFixRate = TRUE;
520 pDevice->byBBType = pDevice->sOpts.bbp_type;
521 pDevice->byPacketType = pDevice->byBBType;
524 pDevice->byAutoFBCtrl = AUTO_FB_0;
525 //pDevice->byAutoFBCtrl = AUTO_FB_1;
527 pDevice->bUpdateBBVGA = TRUE;
528 pDevice->byFOETuning = 0;
529 pDevice->wCTSDuration = 0;
530 pDevice->byPreambleType = 0;
533 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" uChannel= %d\n",(INT)pDevice->uChannel);
534 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byOpMode= %d\n",(INT)pDevice->byOpMode);
535 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" ePSMode= %d\n",(INT)pDevice->ePSMode);
536 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" wRTSThreshold= %d\n",(INT)pDevice->wRTSThreshold);
537 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byShortRetryLimit= %d\n",(INT)pDevice->byShortRetryLimit);
538 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byLongRetryLimit= %d\n",(INT)pDevice->byLongRetryLimit);
539 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byPreambleType= %d\n",(INT)pDevice->byPreambleType);
540 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byShortPreamble= %d\n",(INT)pDevice->byShortPreamble);
541 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" uConnectionRate= %d\n",(INT)pDevice->uConnectionRate);
542 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" byBBType= %d\n",(INT)pDevice->byBBType);
543 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" pDevice->b11hEnable= %d\n",(INT)pDevice->b11hEnable);
544 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" pDevice->bDiversityRegCtlON= %d\n",(INT)pDevice->bDiversityRegCtlON);
547 static VOID s_vCompleteCurrentMeasure (IN PSDevice pDevice, IN BYTE byResult)
550 DWORD dwDuration = 0;
553 for(ii=1;ii<8;ii++) {
554 pDevice->dwRPIs[ii] *= 255;
555 dwDuration |= *((PWORD) (pDevice->pCurrMeasureEID->sReq.abyDuration));
557 pDevice->dwRPIs[ii] /= dwDuration;
558 pDevice->abyRPIs[ii] = (BYTE) pDevice->dwRPIs[ii];
559 byRPI0 += pDevice->abyRPIs[ii];
561 pDevice->abyRPIs[0] = (0xFF - byRPI0);
563 if (pDevice->uNumOfMeasureEIDs == 0) {
564 VNTWIFIbMeasureReport( pDevice->pMgmt,
566 pDevice->pCurrMeasureEID,
569 pDevice->byCCAFraction,
573 VNTWIFIbMeasureReport( pDevice->pMgmt,
575 pDevice->pCurrMeasureEID,
578 pDevice->byCCAFraction,
581 CARDbStartMeasure (pDevice, pDevice->pCurrMeasureEID++, pDevice->uNumOfMeasureEIDs);
589 // Initialiation of MAC & BBP registers
592 static void device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType)
597 BYTE byCCKPwrdBm = 0;
598 BYTE byOFDMPwrdBm = 0;
600 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
601 MACbShutdown(pDevice->PortOffset);
602 BBvSoftwareReset(pDevice->PortOffset);
604 if ((InitType == DEVICE_INIT_COLD) ||
605 (InitType == DEVICE_INIT_DXPL)) {
606 // Do MACbSoftwareReset in MACvInitialize
607 MACbSoftwareReset(pDevice->PortOffset);
609 pDevice->bCCK = TRUE;
610 pDevice->bAES = FALSE;
611 pDevice->bProtectMode = FALSE; //Only used in 11g type, sync with ERP IE
612 pDevice->bNonERPPresent = FALSE;
613 pDevice->bBarkerPreambleMd = FALSE;
614 pDevice->wCurrentRate = RATE_1M;
615 pDevice->byTopOFDMBasicRate = RATE_24M;
616 pDevice->byTopCCKBasicRate = RATE_1M;
618 pDevice->byRevId = 0; //Target to IF pin while programming to RF chip.
621 MACvInitialize(pDevice->PortOffset);
624 VNSvInPortB(pDevice->PortOffset + MAC_REG_LOCALID, &(pDevice->byLocalID));
626 spin_lock_irq(&pDevice->lock);
627 SROMvReadAllContents(pDevice->PortOffset,pDevice->abyEEPROM);
629 spin_unlock_irq(&pDevice->lock);
633 pDevice->byMinChannel = 1;
634 pDevice->byMaxChannel = CB_MAX_CHANNEL;
637 byValue = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ANTENNA);
638 if (byValue & EEP_ANTINV)
639 pDevice->bTxRxAntInv = TRUE;
641 pDevice->bTxRxAntInv = FALSE;
643 //printk("init_register:TxRxAntInv is %d,byValue is %d\n",pDevice->bTxRxAntInv,byValue);
646 byValue &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
647 if (byValue == 0) // if not set default is All
648 byValue = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
650 //printk("init_register:byValue is %d\n",byValue);
652 pDevice->ulDiversityNValue = 100*260;//100*SROMbyReadEmbedded(pDevice->PortOffset, 0x51);
653 pDevice->ulDiversityMValue = 100*16;//SROMbyReadEmbedded(pDevice->PortOffset, 0x52);
654 pDevice->byTMax = 1;//SROMbyReadEmbedded(pDevice->PortOffset, 0x53);
655 pDevice->byTMax2 = 4;//SROMbyReadEmbedded(pDevice->PortOffset, 0x54);
656 pDevice->ulSQ3TH = 0;//(ULONG) SROMbyReadEmbedded(pDevice->PortOffset, 0x55);
657 pDevice->byTMax3 = 64;//SROMbyReadEmbedded(pDevice->PortOffset, 0x56);
659 if (byValue == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
660 pDevice->byAntennaCount = 2;
661 pDevice->byTxAntennaMode = ANT_B;
662 pDevice->dwTxAntennaSel = 1;
663 pDevice->dwRxAntennaSel = 1;
664 if (pDevice->bTxRxAntInv == TRUE)
665 pDevice->byRxAntennaMode = ANT_A;
667 pDevice->byRxAntennaMode = ANT_B;
668 // chester for antenna
669 byValue1 = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ANTENNA);
670 // if (pDevice->bDiversityRegCtlON)
671 if((byValue1&0x08)==0)
672 pDevice->bDiversityEnable = FALSE;//SROMbyReadEmbedded(pDevice->PortOffset, 0x50);
674 pDevice->bDiversityEnable = TRUE;
676 //printk("aux |main antenna: RxAntennaMode is %d\n",pDevice->byRxAntennaMode);
679 pDevice->bDiversityEnable = FALSE;
680 pDevice->byAntennaCount = 1;
681 pDevice->dwTxAntennaSel = 0;
682 pDevice->dwRxAntennaSel = 0;
683 if (byValue & EEP_ANTENNA_AUX) {
684 pDevice->byTxAntennaMode = ANT_A;
685 if (pDevice->bTxRxAntInv == TRUE)
686 pDevice->byRxAntennaMode = ANT_B;
688 pDevice->byRxAntennaMode = ANT_A;
690 pDevice->byTxAntennaMode = ANT_B;
691 if (pDevice->bTxRxAntInv == TRUE)
692 pDevice->byRxAntennaMode = ANT_A;
694 pDevice->byRxAntennaMode = ANT_B;
698 //printk("init registers: TxAntennaMode is %d\n",pDevice->byTxAntennaMode);
700 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "bDiversityEnable=[%d],NValue=[%d],MValue=[%d],TMax=[%d],TMax2=[%d]\n",
701 pDevice->bDiversityEnable,(int)pDevice->ulDiversityNValue,(int)pDevice->ulDiversityMValue,pDevice->byTMax,pDevice->byTMax2);
703 //#ifdef ZoneType_DefaultSetting
704 //2008-8-4 <add> by chester
706 pDevice->byOriginalZonetype = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
707 if((zonetype=Config_FileOperation(pDevice,FALSE,NULL)) >= 0) { //read zonetype file ok!
708 if ((zonetype == 0)&&
709 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] !=0x00)){ //for USA
710 pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0;
711 pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0B;
712 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Init Zone Type :USA\n");
714 else if((zonetype == 1)&&
715 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE]!=0x01)){ //for Japan
716 pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0x01;
717 pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
719 else if((zonetype == 2)&&
720 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE]!=0x02)){ //for Europe
721 pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0x02;
722 pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
723 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Init Zone Type :Europe\n");
728 if(zonetype!=pDevice->abyEEPROM[EEP_OFS_ZONETYPE])
729 printk("zonetype in file[%02x] mismatch with in EEPROM[%02x]\n",zonetype,pDevice->abyEEPROM[EEP_OFS_ZONETYPE]);
731 printk("Read Zonetype file sucess,use default zonetype setting[%02x]\n",zonetype);
735 printk("Read Zonetype file fail,use default zonetype setting[%02x]\n",SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ZONETYPE));
738 pDevice->byRFType = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RFTYPE);
740 if ((pDevice->byRFType & RF_EMU) != 0) {
741 // force change RevID for VT3253 emu
742 pDevice->byRevId = 0x80;
745 pDevice->byRFType &= RF_MASK;
746 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRFType = %x\n", pDevice->byRFType);
748 if (pDevice->bZoneRegExist == FALSE) {
749 pDevice->byZoneType = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
751 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byZoneType = %x\n", pDevice->byZoneType);
756 //Get Desire Power Value
757 pDevice->byCurPwr = 0xFF;
758 pDevice->byCCKPwr = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_PWR_CCK);
759 pDevice->byOFDMPwrG = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_PWR_OFDMG);
760 //byCCKPwrdBm = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_CCK_PWR_dBm);
762 //byOFDMPwrdBm = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_OFDM_PWR_dBm);
763 //printk("CCKPwrdBm is 0x%x,byOFDMPwrdBm is 0x%x\n",byCCKPwrdBm,byOFDMPwrdBm);
767 for (ii=0;ii<CB_MAX_CHANNEL_24G;ii++) {
768 pDevice->abyCCKPwrTbl[ii+1] = SROMbyReadEmbedded(pDevice->PortOffset, (BYTE)(ii + EEP_OFS_CCK_PWR_TBL));
769 if (pDevice->abyCCKPwrTbl[ii+1] == 0) {
770 pDevice->abyCCKPwrTbl[ii+1] = pDevice->byCCKPwr;
772 pDevice->abyOFDMPwrTbl[ii+1] = SROMbyReadEmbedded(pDevice->PortOffset, (BYTE)(ii + EEP_OFS_OFDM_PWR_TBL));
773 if (pDevice->abyOFDMPwrTbl[ii+1] == 0) {
774 pDevice->abyOFDMPwrTbl[ii+1] = pDevice->byOFDMPwrG;
776 pDevice->abyCCKDefaultPwr[ii+1] = byCCKPwrdBm;
777 pDevice->abyOFDMDefaultPwr[ii+1] = byOFDMPwrdBm;
779 //2008-8-4 <add> by chester
780 //recover 12,13 ,14channel for EUROPE by 11 channel
781 if(((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) ||
782 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe))&&
783 (pDevice->byOriginalZonetype == ZoneType_USA)) {
784 for(ii=11;ii<14;ii++) {
785 pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
786 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];
792 // Load OFDM A Power Table
793 for (ii=0;ii<CB_MAX_CHANNEL_5G;ii++) { //RobertYu:20041224, bug using CB_MAX_CHANNEL
794 pDevice->abyOFDMPwrTbl[ii+CB_MAX_CHANNEL_24G+1] = SROMbyReadEmbedded(pDevice->PortOffset, (BYTE)(ii + EEP_OFS_OFDMA_PWR_TBL));
795 pDevice->abyOFDMDefaultPwr[ii+CB_MAX_CHANNEL_24G+1] = SROMbyReadEmbedded(pDevice->PortOffset, (BYTE)(ii + EEP_OFS_OFDMA_PWR_dBm));
797 CARDvInitChannelTable((PVOID)pDevice);
800 if (pDevice->byLocalID > REV_ID_VT3253_B1) {
801 MACvSelectPage1(pDevice->PortOffset);
802 VNSvOutPortB(pDevice->PortOffset + MAC_REG_MSRCTL + 1, (MSRCTL1_TXPWR | MSRCTL1_CSAPAREN));
803 MACvSelectPage0(pDevice->PortOffset);
807 // use relative tx timeout and 802.11i D4
808 MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_CFG, (CFG_TKIPOPT | CFG_NOTXTIMEOUT));
810 // set performance parameter by registry
811 MACvSetShortRetryLimit(pDevice->PortOffset, pDevice->byShortRetryLimit);
812 MACvSetLongRetryLimit(pDevice->PortOffset, pDevice->byLongRetryLimit);
815 VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
816 // enable TSF counter
817 VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
819 // initialize BBP registers
820 BBbVT3253Init(pDevice);
822 if (pDevice->bUpdateBBVGA) {
823 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
824 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
825 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
828 //printk("init registers:RxAntennaMode is %x,TxAntennaMode is %x\n",pDevice->byRxAntennaMode,pDevice->byTxAntennaMode);
830 BBvSetRxAntennaMode(pDevice->PortOffset, pDevice->byRxAntennaMode);
831 BBvSetTxAntennaMode(pDevice->PortOffset, pDevice->byTxAntennaMode);
833 pDevice->byCurrentCh = 0;
835 //pDevice->NetworkType = Ndis802_11Automode;
836 // Set BB and packet type at the same time.
837 // Set Short Slot Time, xIFS, and RSPINF.
838 if (pDevice->uConnectionRate == RATE_AUTO) {
839 pDevice->wCurrentRate = RATE_54M;
841 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
845 VNTWIFIbConfigPhyMode(pDevice->pMgmt, PHY_TYPE_11G);
846 VNTWIFIbConfigPhyMode(pDevice->pMgmt, PHY_TYPE_AUTO);
848 pDevice->bRadioOff = FALSE;
850 pDevice->byRadioCtl = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RADIOCTL);
851 pDevice->bHWRadioOff = FALSE;
853 if (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) {
855 MACvGPIOIn(pDevice->PortOffset, &pDevice->byGPIO);
856 //2008-4-14 <add> by chester for led issue
857 #ifdef FOR_LED_ON_NOTEBOOK
858 if (BITbIsBitOn(pDevice->byGPIO,GPIO0_DATA)){pDevice->bHWRadioOff = TRUE;}
859 if (BITbIsBitOff(pDevice->byGPIO,GPIO0_DATA)){pDevice->bHWRadioOff = FALSE;}
862 if ( (pDevice->bRadioControlOff == TRUE)) {
863 CARDbRadioPowerOff(pDevice);
865 else CARDbRadioPowerOn(pDevice);
867 if ((BITbIsBitOn(pDevice->byGPIO,GPIO0_DATA) && BITbIsBitOff(pDevice->byRadioCtl, EEP_RADIOCTL_INV)) ||
868 (BITbIsBitOff(pDevice->byGPIO,GPIO0_DATA) && BITbIsBitOn(pDevice->byRadioCtl, EEP_RADIOCTL_INV))) {
869 pDevice->bHWRadioOff = TRUE;
872 if ((pDevice->bHWRadioOff == TRUE) || (pDevice->bRadioControlOff == TRUE)) {
873 CARDbRadioPowerOff(pDevice);
878 pMgmt->eScanType = WMAC_SCAN_PASSIVE;
879 // get Permanent network address
880 SROMvReadEtherAddress(pDevice->PortOffset, pDevice->abyCurrentNetAddr);
881 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Network address = %02x-%02x-%02x=%02x-%02x-%02x\n",
882 pDevice->abyCurrentNetAddr[0],
883 pDevice->abyCurrentNetAddr[1],
884 pDevice->abyCurrentNetAddr[2],
885 pDevice->abyCurrentNetAddr[3],
886 pDevice->abyCurrentNetAddr[4],
887 pDevice->abyCurrentNetAddr[5]);
891 CARDvSafeResetRx(pDevice);
893 CARDvSafeResetTx(pDevice);
895 if (pDevice->byLocalID <= REV_ID_VT3253_A1) {
896 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_RCR, RCR_WPAERR);
899 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
902 MACvReceive0(pDevice->PortOffset);
903 MACvReceive1(pDevice->PortOffset);
906 MACvStart(pDevice->PortOffset);
908 netif_stop_queue(pDevice->dev);
915 static VOID device_init_diversity_timer(PSDevice pDevice) {
917 init_timer(&pDevice->TimerSQ3Tmax1);
918 pDevice->TimerSQ3Tmax1.data = (ULONG)pDevice;
919 pDevice->TimerSQ3Tmax1.function = (TimerFunction)TimerSQ3CallBack;
920 pDevice->TimerSQ3Tmax1.expires = RUN_AT(HZ);
922 init_timer(&pDevice->TimerSQ3Tmax2);
923 pDevice->TimerSQ3Tmax2.data = (ULONG)pDevice;
924 pDevice->TimerSQ3Tmax2.function = (TimerFunction)TimerSQ3CallBack;
925 pDevice->TimerSQ3Tmax2.expires = RUN_AT(HZ);
927 init_timer(&pDevice->TimerSQ3Tmax3);
928 pDevice->TimerSQ3Tmax3.data = (ULONG)pDevice;
929 pDevice->TimerSQ3Tmax3.function = (TimerFunction)TimerState1CallBack;
930 pDevice->TimerSQ3Tmax3.expires = RUN_AT(HZ);
936 static BOOL device_release_WPADEV(PSDevice pDevice)
938 viawget_wpa_header *wpahdr;
940 // wait_queue_head_t Set_wait;
941 //send device close to wpa_supplicnat layer
942 if (pDevice->bWPADEVUp==TRUE) {
943 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
944 wpahdr->type = VIAWGET_DEVICECLOSE_MSG;
945 wpahdr->resp_ie_len = 0;
946 wpahdr->req_ie_len = 0;
947 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
948 pDevice->skb->dev = pDevice->wpadev;
949 pDevice->skb->mac_header = pDevice->skb->data;
950 pDevice->skb->pkt_type = PACKET_HOST;
951 pDevice->skb->protocol = htons(ETH_P_802_2);
952 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
953 netif_rx(pDevice->skb);
954 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
956 //wait release WPADEV
957 // init_waitqueue_head(&Set_wait);
958 // wait_event_timeout(Set_wait, ((pDevice->wpadev==NULL)&&(pDevice->skb == NULL)),5*HZ); //1s wait
959 while((pDevice->bWPADEVUp==TRUE)) {
960 set_current_state(TASK_UNINTERRUPTIBLE);
961 schedule_timeout (HZ/20); //wait 50ms
974 device_found1(struct pci_dev *pcid, const struct pci_device_id *ent)
976 static BOOL bFirst = TRUE;
977 struct net_device* dev = NULL;
978 PCHIP_INFO pChip_info = (PCHIP_INFO)ent->driver_data;
981 if (device_nics ++>= MAX_UINTS) {
982 printk(KERN_NOTICE DEVICE_NAME ": already found %d NICs\n", device_nics);
987 dev = alloc_etherdev(sizeof(DEVICE_INFO));
989 pDevice = (PSDevice) netdev_priv(dev);
992 printk(KERN_ERR DEVICE_NAME ": allocate net device failed \n");
996 // Chain it all together
997 // SET_MODULE_OWNER(dev);
998 SET_NETDEV_DEV(dev, &pcid->dev);
1001 printk(KERN_NOTICE "%s Ver. %s\n",DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
1002 printk(KERN_NOTICE "Copyright (c) 2003 VIA Networking Technologies, Inc.\n");
1006 if (!device_init_info(pcid, &pDevice, pChip_info)) {
1010 pDevice->next_module = root_device_dev;
1011 root_device_dev = dev;
1012 dev->irq = pcid->irq;
1014 if (pci_enable_device(pcid)) {
1015 device_free_info(pDevice);
1019 printk("Before get pci_info memaddr is %x\n",pDevice->memaddr);
1021 if (device_get_pci_info(pDevice,pcid) == FALSE) {
1022 printk(KERN_ERR DEVICE_NAME ": Failed to find PCI device.\n");
1023 device_free_info(pDevice);
1031 //pci_read_config_byte(pcid, PCI_BASE_ADDRESS_0, &pDevice->byRevId);
1032 printk("after get pci_info memaddr is %x, io addr is %x,io_size is %d\n",pDevice->memaddr,pDevice->ioaddr,pDevice->io_size);
1044 for (i=0;address[i];i++)
1046 //pci_write_config_dword(pcid,address[i], 0xFFFFFFFF);
1047 pci_read_config_dword(pcid, address[i], &bar);
1048 printk("bar %d is %x\n",i,bar);
1051 printk("bar %d not implemented\n",i);
1054 if (bar & PCI_BASE_ADDRESS_SPACE_IO) {
1057 len = bar & (PCI_BASE_ADDRESS_IO_MASK & 0xFFFF);
1058 len = len & ~(len - 1);
1060 printk("IO space: len in IO %x, BAR %d\n", len, i);
1064 len = bar & 0xFFFFFFF0;
1067 printk("len in MEM %x, BAR %d\n", len, i);
1079 pDevice->PortOffset = (DWORD)ioremap(pDevice->memaddr & PCI_BASE_ADDRESS_MEM_MASK, pDevice->io_size);
1080 //pDevice->PortOffset = (DWORD)ioremap(pDevice->ioaddr & PCI_BASE_ADDRESS_IO_MASK, pDevice->io_size);
1082 if(pDevice->PortOffset == 0) {
1083 printk(KERN_ERR DEVICE_NAME ": Failed to IO remapping ..\n");
1084 device_free_info(pDevice);
1091 rc = pci_request_regions(pcid, DEVICE_NAME);
1093 printk(KERN_ERR DEVICE_NAME ": Failed to find PCI device\n");
1094 device_free_info(pDevice);
1098 dev->base_addr = pDevice->ioaddr;
1102 VNSvInPortB(pDevice->PortOffset+0x4F, &value);
1103 printk("Before write: value is %x\n",value);
1104 //VNSvInPortB(pDevice->PortOffset+0x3F, 0x00);
1105 VNSvOutPortB(pDevice->PortOffset,value);
1106 VNSvInPortB(pDevice->PortOffset+0x4F, &value);
1107 printk("After write: value is %x\n",value);
1113 pDevice->PortOffset = pDevice->ioaddr;
1116 if (!MACbSoftwareReset(pDevice->PortOffset)) {
1117 printk(KERN_ERR DEVICE_NAME ": Failed to access MAC hardware..\n");
1118 device_free_info(pDevice);
1121 // initial to reload eeprom
1122 MACvInitialize(pDevice->PortOffset);
1123 MACvReadEtherAddress(pDevice->PortOffset, dev->dev_addr);
1125 device_get_options(pDevice, device_nics-1, dev->name);
1126 device_set_options(pDevice);
1127 //Mask out the options cannot be set to the chip
1128 pDevice->sOpts.flags &= pChip_info->flags;
1130 //Enable the chip specified capbilities
1131 pDevice->flags = pDevice->sOpts.flags | (pChip_info->flags & 0xFF000000UL);
1132 pDevice->tx_80211 = device_dma0_tx_80211;
1133 pDevice->sMgmtObj.pAdapter = (PVOID)pDevice;
1134 pDevice->pMgmt = &(pDevice->sMgmtObj);
1136 dev->irq = pcid->irq;
1137 dev->open = device_open;
1138 dev->hard_start_xmit = device_xmit;
1139 dev->stop = device_close;
1140 dev->get_stats = device_get_stats;
1141 dev->set_multicast_list = device_set_multi;
1142 dev->do_ioctl = device_ioctl;
1145 //Einsn Modify for ubuntu-7.04
1146 // dev->wireless_handlers->get_wireless_stats = iwctl_get_wireless_stats;
1147 #if WIRELESS_EXT > 12
1148 dev->wireless_handlers = (struct iw_handler_def *)&iwctl_handler_def;
1149 // netdev->wireless_handlers = NULL;
1150 #endif /* WIRELESS_EXT > 12 */
1151 #endif /* WIRELESS_EXT */
1153 rc = register_netdev(dev);
1156 printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
1157 device_free_info(pDevice);
1160 //2008-07-21-01<Add>by MikeLiu
1162 if(wpa_set_wpadev(pDevice, 1)!=0) {
1163 printk("Fail to Register WPADEV?\n");
1164 unregister_netdev(pDevice->dev);
1167 device_print_info(pDevice);
1168 pci_set_drvdata(pcid, pDevice);
1173 static void device_print_info(PSDevice pDevice)
1175 struct net_device* dev=pDevice->dev;
1177 DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: %s\n",dev->name, get_chip_name(pDevice->chip_id));
1178 DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: MAC=%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
1180 dev->dev_addr[0],dev->dev_addr[1],dev->dev_addr[2],
1181 dev->dev_addr[3],dev->dev_addr[4],dev->dev_addr[5]);
1183 DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO" IO=0x%lx ",(ULONG) pDevice->ioaddr);
1184 DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO" IRQ=%d \n", pDevice->dev->irq);
1186 DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO" IO=0x%lx Mem=0x%lx ",(ULONG) pDevice->ioaddr,(ULONG) pDevice->PortOffset);
1187 DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO" IRQ=%d \n", pDevice->dev->irq);
1192 static BOOL device_init_info(struct pci_dev* pcid, PSDevice* ppDevice,
1193 PCHIP_INFO pChip_info) {
1197 memset(*ppDevice,0,sizeof(DEVICE_INFO));
1199 if (pDevice_Infos == NULL) {
1200 pDevice_Infos =*ppDevice;
1203 for (p=pDevice_Infos;p->next!=NULL;p=p->next)
1205 p->next = *ppDevice;
1206 (*ppDevice)->prev = p;
1209 (*ppDevice)->pcid = pcid;
1210 (*ppDevice)->chip_id = pChip_info->chip_id;
1211 (*ppDevice)->io_size = pChip_info->io_size;
1212 (*ppDevice)->nTxQueues = pChip_info->nTxQueue;
1213 (*ppDevice)->multicast_limit =32;
1215 spin_lock_init(&((*ppDevice)->lock));
1220 static BOOL device_get_pci_info(PSDevice pDevice, struct pci_dev* pcid) {
1226 BYTE pci_config[256];
1230 memset(pci_config,0x00,256);
1233 pci_read_config_byte(pcid, PCI_REVISION_ID, &pDevice->byRevId);
1234 pci_read_config_word(pcid, PCI_SUBSYSTEM_ID,&pDevice->SubSystemID);
1235 pci_read_config_word(pcid, PCI_SUBSYSTEM_VENDOR_ID, &pDevice->SubVendorID);
1236 pci_read_config_word(pcid, PCI_COMMAND, (u16 *) & (pci_cmd));
1238 pci_set_master(pcid);
1240 pDevice->memaddr = pci_resource_start(pcid,0);
1241 pDevice->ioaddr = pci_resource_start(pcid,1);
1244 // pDevice->ioaddr = pci_resource_start(pcid, 0);
1245 // pDevice->memaddr = pci_resource_start(pcid,1);
1248 cis_addr = pci_resource_start(pcid,2);
1250 pDevice->pcid = pcid;
1252 pci_read_config_byte(pcid, PCI_REG_COMMAND, &b);
1253 pci_write_config_byte(pcid, PCI_REG_COMMAND, (b|COMMAND_BUSM));
1256 //pci_read_config_word(pcid,PCI_REG_MAX_LAT,&max_lat);
1257 //printk("max lat is %x,SubSystemID is %x\n",max_lat,pDevice->SubSystemID);
1258 //for (ii=0;ii<0xFF;ii++)
1259 //pci_read_config_word(pcid,PCI_REG_MAX_LAT,&max_lat);
1261 //pci_write_config_word(pcid,PCI_REG_MAX_LAT,max_lat);
1262 //pci_read_config_word(pcid,PCI_REG_MAX_LAT,&max_lat);
1263 //printk("max lat is %x\n",max_lat);
1265 for (ii=0;ii<0xFF;ii++)
1267 pci_read_config_byte(pcid,ii,&value);
1268 pci_config[ii] = value;
1270 for (ii=0,j=1;ii<0x100;ii++,j++)
1274 printk("%x:",pci_config[ii]);
1279 printk("%x:",pci_config[ii]);
1286 static void device_free_info(PSDevice pDevice) {
1288 struct net_device* dev=pDevice->dev;
1291 //2008-0714-01<Add>by chester
1292 device_release_WPADEV(pDevice);
1294 //2008-07-21-01<Add>by MikeLiu
1296 if(wpa_set_wpadev(pDevice, 0)!=0)
1297 printk("unregister wpadev fail?\n");
1299 if (pDevice_Infos==NULL)
1302 for (ptr=pDevice_Infos;ptr && (ptr!=pDevice);ptr=ptr->next)
1306 if (ptr==pDevice_Infos)
1307 pDevice_Infos=ptr->next;
1309 ptr->prev->next=ptr->next;
1312 DEVICE_PRT(MSG_LEVEL_ERR, KERN_ERR "info struct not found\n");
1317 hostap_set_hostapd(pDevice, 0, 0);
1320 unregister_netdev(dev);
1322 if (pDevice->PortOffset)
1323 iounmap((PVOID)pDevice->PortOffset);
1326 pci_release_regions(pDevice->pcid);
1330 if (pDevice->pcid) {
1331 pci_set_drvdata(pDevice->pcid,NULL);
1334 #endif// ifndef PRIVATE_OBJ
1336 static BOOL device_init_rings(PSDevice pDevice) {
1340 /*allocate all RD/TD rings a single pool*/
1341 vir_pool = pci_alloc_consistent(pDevice->pcid,
1342 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1343 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1344 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1345 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
1346 &pDevice->pool_dma);
1348 if (vir_pool == NULL) {
1349 DEVICE_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate desc dma memory failed\n", pDevice->dev->name);
1354 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1355 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1356 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1357 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc)
1360 pDevice->aRD0Ring = vir_pool;
1361 pDevice->aRD1Ring = vir_pool +
1362 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
1365 pDevice->rd0_pool_dma = pDevice->pool_dma;
1366 pDevice->rd1_pool_dma = pDevice->rd0_pool_dma +
1367 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
1369 pDevice->tx0_bufs = pci_alloc_consistent(pDevice->pcid,
1370 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
1371 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
1372 CB_BEACON_BUF_SIZE +
1374 &pDevice->tx_bufs_dma0);
1376 if (pDevice->tx0_bufs == NULL) {
1377 DEVICE_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: allocate buf dma memory failed\n", pDevice->dev->name);
1378 pci_free_consistent(pDevice->pcid,
1379 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1380 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1381 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1382 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
1383 vir_pool, pDevice->pool_dma
1388 memset(pDevice->tx0_bufs, 0,
1389 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
1390 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
1391 CB_BEACON_BUF_SIZE +
1395 pDevice->td0_pool_dma = pDevice->rd1_pool_dma +
1396 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
1398 pDevice->td1_pool_dma = pDevice->td0_pool_dma +
1399 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
1402 // vir_pool: pvoid type
1403 pDevice->apTD0Rings = vir_pool
1404 + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
1405 + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
1407 pDevice->apTD1Rings = vir_pool
1408 + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
1409 + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc)
1410 + pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
1413 pDevice->tx1_bufs = pDevice->tx0_bufs +
1414 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
1417 pDevice->tx_beacon_bufs = pDevice->tx1_bufs +
1418 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
1420 pDevice->pbyTmpBuff = pDevice->tx_beacon_bufs +
1423 pDevice->tx_bufs_dma1 = pDevice->tx_bufs_dma0 +
1424 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
1427 pDevice->tx_beacon_dma = pDevice->tx_bufs_dma1 +
1428 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
1434 static void device_free_rings(PSDevice pDevice) {
1436 pci_free_consistent(pDevice->pcid,
1437 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1438 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1439 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1440 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc)
1442 pDevice->aRD0Ring, pDevice->pool_dma
1445 if (pDevice->tx0_bufs)
1446 pci_free_consistent(pDevice->pcid,
1447 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
1448 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
1449 CB_BEACON_BUF_SIZE +
1451 pDevice->tx0_bufs, pDevice->tx_bufs_dma0
1455 static void device_init_rd0_ring(PSDevice pDevice) {
1457 dma_addr_t curr = pDevice->rd0_pool_dma;
1460 /* Init the RD0 ring entries */
1461 for (i = 0; i < pDevice->sOpts.nRxDescs0; i ++, curr += sizeof(SRxDesc)) {
1462 pDesc = &(pDevice->aRD0Ring[i]);
1463 pDesc->pRDInfo = alloc_rd_info();
1464 ASSERT(pDesc->pRDInfo);
1465 if (!device_alloc_rx_buf(pDevice, pDesc)) {
1466 DEVICE_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc rx bufs\n",
1467 pDevice->dev->name);
1469 pDesc->next = &(pDevice->aRD0Ring[(i+1) % pDevice->sOpts.nRxDescs0]);
1470 pDesc->pRDInfo->curr_desc = cpu_to_le32(curr);
1471 pDesc->next_desc = cpu_to_le32(curr + sizeof(SRxDesc));
1474 pDevice->aRD0Ring[i-1].next_desc = cpu_to_le32(pDevice->rd0_pool_dma);
1475 pDevice->pCurrRD[0] = &(pDevice->aRD0Ring[0]);
1479 static void device_init_rd1_ring(PSDevice pDevice) {
1481 dma_addr_t curr = pDevice->rd1_pool_dma;
1484 /* Init the RD1 ring entries */
1485 for (i = 0; i < pDevice->sOpts.nRxDescs1; i ++, curr += sizeof(SRxDesc)) {
1486 pDesc = &(pDevice->aRD1Ring[i]);
1487 pDesc->pRDInfo = alloc_rd_info();
1488 ASSERT(pDesc->pRDInfo);
1489 if (!device_alloc_rx_buf(pDevice, pDesc)) {
1490 DEVICE_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc rx bufs\n",
1491 pDevice->dev->name);
1493 pDesc->next = &(pDevice->aRD1Ring[(i+1) % pDevice->sOpts.nRxDescs1]);
1494 pDesc->pRDInfo->curr_desc = cpu_to_le32(curr);
1495 pDesc->next_desc = cpu_to_le32(curr + sizeof(SRxDesc));
1498 pDevice->aRD1Ring[i-1].next_desc = cpu_to_le32(pDevice->rd1_pool_dma);
1499 pDevice->pCurrRD[1] = &(pDevice->aRD1Ring[0]);
1503 static void device_init_defrag_cb(PSDevice pDevice) {
1505 PSDeFragControlBlock pDeF;
1507 /* Init the fragment ctl entries */
1508 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1509 pDeF = &(pDevice->sRxDFCB[i]);
1510 if (!device_alloc_frag_buf(pDevice, pDeF)) {
1511 DEVICE_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
1512 pDevice->dev->name);
1515 pDevice->cbDFCB = CB_MAX_RX_FRAG;
1516 pDevice->cbFreeDFCB = pDevice->cbDFCB;
1522 static void device_free_rd0_ring(PSDevice pDevice) {
1525 for (i = 0; i < pDevice->sOpts.nRxDescs0; i++) {
1526 PSRxDesc pDesc =&(pDevice->aRD0Ring[i]);
1527 PDEVICE_RD_INFO pRDInfo =pDesc->pRDInfo;
1529 pci_unmap_single(pDevice->pcid,pRDInfo->skb_dma,
1530 pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1532 dev_kfree_skb(pRDInfo->skb);
1534 kfree((PVOID)pDesc->pRDInfo);
1539 static void device_free_rd1_ring(PSDevice pDevice) {
1543 for (i = 0; i < pDevice->sOpts.nRxDescs1; i++) {
1544 PSRxDesc pDesc=&(pDevice->aRD1Ring[i]);
1545 PDEVICE_RD_INFO pRDInfo=pDesc->pRDInfo;
1547 pci_unmap_single(pDevice->pcid,pRDInfo->skb_dma,
1548 pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1550 dev_kfree_skb(pRDInfo->skb);
1552 kfree((PVOID)pDesc->pRDInfo);
1557 static void device_free_frag_buf(PSDevice pDevice) {
1558 PSDeFragControlBlock pDeF;
1561 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1563 pDeF = &(pDevice->sRxDFCB[i]);
1566 dev_kfree_skb(pDeF->skb);
1572 static void device_init_td0_ring(PSDevice pDevice) {
1577 curr = pDevice->td0_pool_dma;
1578 for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++, curr += sizeof(STxDesc)) {
1579 pDesc = &(pDevice->apTD0Rings[i]);
1580 pDesc->pTDInfo = alloc_td_info();
1581 ASSERT(pDesc->pTDInfo);
1582 if (pDevice->flags & DEVICE_FLAGS_TX_ALIGN) {
1583 pDesc->pTDInfo->buf = pDevice->tx0_bufs + (i)*PKT_BUF_SZ;
1584 pDesc->pTDInfo->buf_dma = pDevice->tx_bufs_dma0 + (i)*PKT_BUF_SZ;
1586 pDesc->next =&(pDevice->apTD0Rings[(i+1) % pDevice->sOpts.nTxDescs[0]]);
1587 pDesc->pTDInfo->curr_desc = cpu_to_le32(curr);
1588 pDesc->next_desc = cpu_to_le32(curr+sizeof(STxDesc));
1591 pDevice->apTD0Rings[i-1].next_desc = cpu_to_le32(pDevice->td0_pool_dma);
1592 pDevice->apTailTD[0] = pDevice->apCurrTD[0] =&(pDevice->apTD0Rings[0]);
1596 static void device_init_td1_ring(PSDevice pDevice) {
1601 /* Init the TD ring entries */
1602 curr=pDevice->td1_pool_dma;
1603 for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++, curr+=sizeof(STxDesc)) {
1604 pDesc=&(pDevice->apTD1Rings[i]);
1605 pDesc->pTDInfo = alloc_td_info();
1606 ASSERT(pDesc->pTDInfo);
1607 if (pDevice->flags & DEVICE_FLAGS_TX_ALIGN) {
1608 pDesc->pTDInfo->buf=pDevice->tx1_bufs+(i)*PKT_BUF_SZ;
1609 pDesc->pTDInfo->buf_dma=pDevice->tx_bufs_dma1+(i)*PKT_BUF_SZ;
1611 pDesc->next=&(pDevice->apTD1Rings[(i+1) % pDevice->sOpts.nTxDescs[1]]);
1612 pDesc->pTDInfo->curr_desc = cpu_to_le32(curr);
1613 pDesc->next_desc = cpu_to_le32(curr+sizeof(STxDesc));
1616 pDevice->apTD1Rings[i-1].next_desc = cpu_to_le32(pDevice->td1_pool_dma);
1617 pDevice->apTailTD[1] = pDevice->apCurrTD[1] = &(pDevice->apTD1Rings[0]);
1622 static void device_free_td0_ring(PSDevice pDevice) {
1624 for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++) {
1625 PSTxDesc pDesc=&(pDevice->apTD0Rings[i]);
1626 PDEVICE_TD_INFO pTDInfo=pDesc->pTDInfo;
1628 if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma))
1629 pci_unmap_single(pDevice->pcid,pTDInfo->skb_dma,
1630 pTDInfo->skb->len, PCI_DMA_TODEVICE);
1633 dev_kfree_skb(pTDInfo->skb);
1635 kfree((PVOID)pDesc->pTDInfo);
1639 static void device_free_td1_ring(PSDevice pDevice) {
1642 for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++) {
1643 PSTxDesc pDesc=&(pDevice->apTD1Rings[i]);
1644 PDEVICE_TD_INFO pTDInfo=pDesc->pTDInfo;
1646 if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma))
1647 pci_unmap_single(pDevice->pcid, pTDInfo->skb_dma,
1648 pTDInfo->skb->len, PCI_DMA_TODEVICE);
1651 dev_kfree_skb(pTDInfo->skb);
1653 kfree((PVOID)pDesc->pTDInfo);
1660 /*-----------------------------------------------------------------*/
1662 static int device_rx_srv(PSDevice pDevice, UINT uIdx) {
1667 for (pRD = pDevice->pCurrRD[uIdx];
1668 pRD->m_rd0RD0.f1Owner == OWNED_BY_HOST;
1670 // DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->pCurrRD = %x, works = %d\n", pRD, works);
1673 if (device_receive_frame(pDevice, pRD)) {
1674 if (!device_alloc_rx_buf(pDevice,pRD)) {
1675 DEVICE_PRT(MSG_LEVEL_ERR, KERN_ERR
1676 "%s: can not allocate rx buf\n", pDevice->dev->name);
1680 pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
1682 ref_set_rx_jiffies(pDevice->dev);
1684 pDevice->dev->last_rx = jiffies;
1688 pDevice->pCurrRD[uIdx]=pRD;
1694 static BOOL device_alloc_rx_buf(PSDevice pDevice, PSRxDesc pRD) {
1696 PDEVICE_RD_INFO pRDInfo=pRD->pRDInfo;
1700 pRDInfo->skb=dev_alloc_skb(pDevice->rx_buf_sz);
1701 if (pRDInfo->skb==NULL)
1703 ref_skb_remap(pDevice->dev, &(pRDInfo->ref_skb), pRDInfo->skb);
1704 pRDInfo->skb_dma = pci_map_single(pDevice->pcid, pRDInfo->ref_skb.tail, pDevice->rx_buf_sz,
1705 PCI_DMA_FROMDEVICE);
1708 pRDInfo->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1710 //printk("device_alloc_rx_buf:skb is %x\n",pRDInfo->skb);
1712 if (pRDInfo->skb==NULL)
1714 ASSERT(pRDInfo->skb);
1715 pRDInfo->skb->dev = pDevice->dev;
1716 pRDInfo->skb_dma = pci_map_single(pDevice->pcid, pRDInfo->skb->tail, pDevice->rx_buf_sz,
1717 PCI_DMA_FROMDEVICE);
1719 *((PU32) &(pRD->m_rd0RD0)) = 0;
1721 pRD->m_rd0RD0.wResCount = cpu_to_le16(pDevice->rx_buf_sz);
1722 pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
1723 pRD->m_rd1RD1.wReqCount = cpu_to_le16(pDevice->rx_buf_sz);
1724 pRD->buff_addr = cpu_to_le32(pRDInfo->skb_dma);
1731 BOOL device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {
1735 pDeF->skb=dev_alloc_skb(pDevice->rx_buf_sz);
1736 if (pDeF->skb==NULL)
1738 ref_skb_remap(pDevice->dev, &(pDeF->ref_skb), pDeF->skb);
1741 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1742 if (pDeF->skb == NULL)
1745 pDeF->skb->dev = pDevice->dev;
1753 static int device_tx_srv(PSDevice pDevice, UINT uIdx) {
1759 UINT uFrameSize, uFIFOHeaderSize;
1760 PSTxBufHead pTxBufHead;
1761 struct net_device_stats* pStats = &pDevice->stats;
1762 struct sk_buff* skb;
1764 PSMgmtObject pMgmt = pDevice->pMgmt;
1766 ref_sk_buff ref_skb;
1770 for (pTD = pDevice->apTailTD[uIdx]; pDevice->iTDUsed[uIdx] >0; pTD = pTD->next) {
1772 if (pTD->m_td0TD0.f1Owner == OWNED_BY_NIC)
1777 byTsr0 = pTD->m_td0TD0.byTSR0;
1778 byTsr1 = pTD->m_td0TD0.byTSR1;
1780 //Only the status of first TD in the chain is correct
1781 if (pTD->m_td1TD1.byTCR & TCR_STP) {
1783 if ((pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0) {
1784 uFIFOHeaderSize = pTD->pTDInfo->dwHeaderLength;
1785 uFrameSize = pTD->pTDInfo->dwReqCount - uFIFOHeaderSize;
1786 pTxBufHead = (PSTxBufHead) (pTD->pTDInfo->buf);
1788 ref_skb_remap(pDevice->dev, &ref_skb, pTD->pTDInfo->skb);
1790 // Update the statistics based on the Transmit status
1791 // now, we DO'NT check TSR0_CDH
1793 STAvUpdateTDStatCounter(&pDevice->scStatistic,
1795 (PBYTE)(pTD->pTDInfo->buf + uFIFOHeaderSize),
1799 BSSvUpdateNodeTxCounter(pDevice,
1801 (PBYTE)(pTD->pTDInfo->buf),
1805 if (BITbIsBitOff(byTsr1, TSR1_TERR)) {
1807 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X].\n",
1808 (INT)uIdx, byTsr1, byTsr0);
1810 if ((pTxBufHead->wFragCtl & FRAGCTL_ENDFRAG) != FRAGCTL_NONFRAG) {
1811 pDevice->s802_11Counter.TransmittedFragmentCount ++;
1813 pStats->tx_packets++;
1815 pStats->tx_bytes += *(ref_skb.len);
1817 pStats->tx_bytes += pTD->pTDInfo->skb->len;
1821 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] dropped & tsr1[%02X] tsr0[%02X].\n",
1822 (INT)uIdx, byTsr1, byTsr0);
1823 pStats->tx_errors++;
1824 pStats->tx_dropped++;
1828 if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
1829 if (pDevice->bEnableHostapd) {
1830 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "tx call back netif.. \n");
1832 ref_skb_remap(pDevice->apdev, &(ref_skb), pTD->pTDInfo->skb);
1833 ref_skb.mac.raw = ref_skb.data;
1834 *(ref_skb.pkt_type) = PACKET_OTHERHOST;
1835 //*(ref_skb.protocol) = htons(ETH_P_802_2);
1836 memset(ref_skb.cb, 0, sizeof(ref_skb.cb));
1837 netif_rx(ref_skb.skb);
1839 skb = pTD->pTDInfo->skb;
1840 skb->dev = pDevice->apdev;
1841 skb->mac_header = skb->data;
1842 skb->pkt_type = PACKET_OTHERHOST;
1843 //skb->protocol = htons(ETH_P_802_2);
1844 memset(skb->cb, 0, sizeof(skb->cb));
1850 if (BITbIsBitOn(byTsr1, TSR1_TERR)) {
1851 if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
1852 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X].\n",
1853 (INT)uIdx, byTsr1, byTsr0);
1856 // DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X].\n",
1857 // (INT)uIdx, byTsr1, byTsr0);
1859 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
1860 (pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB)) {
1862 BYTE byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
1864 skb = pTD->pTDInfo->skb;
1865 if (BSSDBbIsSTAInNodeDB(pMgmt, (PBYTE)(skb->data), &uNodeIndex)) {
1866 if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
1867 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
1868 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
1870 wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
1871 pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
1872 pTD->pTDInfo->byFlags &= ~(TD_FLAGS_NETIF_SKB);
1873 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "tx_srv:tx fail re-queue sta index= %d, QueCnt= %d\n"
1874 ,(INT)uNodeIndex, pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt);
1875 pStats->tx_errors--;
1876 pStats->tx_dropped--;
1881 device_free_tx_buf(pDevice,pTD);
1882 pDevice->iTDUsed[uIdx]--;
1887 if (uIdx == TYPE_AC0DMA) {
1888 // RESERV_AC0DMA reserved for relay
1890 if (AVAIL_TD(pDevice, uIdx) < RESERV_AC0DMA) {
1892 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " AC0DMA is Full = %d\n", pDevice->iTDUsed[uIdx]);
1894 if (netif_queue_stopped(pDevice->dev) && (bFull==FALSE)){
1895 netif_wake_queue(pDevice->dev);
1900 pDevice->apTailTD[uIdx] = pTD;
1906 static void device_error(PSDevice pDevice, WORD status) {
1908 if (status & ISR_FETALERR) {
1909 DEVICE_PRT(MSG_LEVEL_ERR, KERN_ERR
1910 "%s: Hardware fatal error.\n",
1911 pDevice->dev->name);
1912 netif_stop_queue(pDevice->dev);
1913 del_timer(&pDevice->sTimerCommand);
1914 del_timer(&(pDevice->pMgmt->sTimerSecondCallback));
1915 pDevice->bCmdRunning = FALSE;
1916 MACbShutdown(pDevice->PortOffset);
1922 static void device_free_tx_buf(PSDevice pDevice, PSTxDesc pDesc) {
1923 PDEVICE_TD_INFO pTDInfo=pDesc->pTDInfo;
1924 struct sk_buff* skb=pTDInfo->skb;
1926 // pre-allocated buf_dma can't be unmapped.
1927 if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma)) {
1928 pci_unmap_single(pDevice->pcid,pTDInfo->skb_dma,skb->len,
1932 if ((pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0)
1933 dev_kfree_skb_irq(skb);
1935 pTDInfo->skb_dma = 0;
1937 pTDInfo->byFlags = 0;
1943 VOID InitRxManagementQueue(PSDevice pDevice)
1945 pDevice->rxManeQueue.packet_num = 0;
1946 pDevice->rxManeQueue.head = pDevice->rxManeQueue.tail = 0;
1958 PSDevice pDevice = (PSDevice) Context;
1959 PSRxMgmtPacket pRxMgmtPacket;
1961 //complete(&pDevice->notify);
1962 //printk("Enter MngWorkItem,Queue packet num is %d\n",pDevice->rxManeQueue.packet_num);
1964 //printk("Enter MlmeThread,packet _num is %d\n",pDevice->rxManeQueue.packet_num);
1971 //down(&pDevice->mlme_semaphore);
1972 // pRxMgmtPacket = DeQueue(pDevice);
1974 spin_lock_irq(&pDevice->lock);
1975 while(pDevice->rxManeQueue.packet_num != 0)
1977 pRxMgmtPacket = DeQueue(pDevice);
1979 //DequeueManageObject(pDevice->FirstRecvMngList, pDevice->LastRecvMngList);
1980 vMgrRxManagePacket(pDevice, pDevice->pMgmt, pRxMgmtPacket);
1981 //printk("packet_num is %d\n",pDevice->rxManeQueue.packet_num);
1984 spin_unlock_irq(&pDevice->lock);
1989 //printk("Before schedule thread jiffies is %x\n",jiffies);
1991 //printk("after schedule thread jiffies is %x\n",jiffies);
1994 //printk("i is %d\n",i);
2005 int __device_open(HANDLE pExDevice) {
2006 PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
2007 PSDevice pDevice = (PSDevice)(pDevice_info->pWDevice);
2011 static int device_open(struct net_device *dev) {
2012 PSDevice pDevice=(PSDevice) netdev_priv(dev);
2015 pDevice->rx_buf_sz = PKT_BUF_SZ;
2016 if (!device_init_rings(pDevice)) {
2019 //2008-5-13 <add> by chester
2021 i=request_irq(pDevice->pcid->irq, &device_intr, IRQF_SHARED, dev->name, dev);
2025 //printk("DEBUG1\n");
2026 #ifdef WPA_SM_Transtatus
2027 extern SWPAResult wpa_Result;
2028 memset(wpa_Result.ifname,0,sizeof(wpa_Result.ifname));
2029 wpa_Result.proto = 0;
2030 wpa_Result.key_mgmt = 0;
2031 wpa_Result.eap_type = 0;
2032 wpa_Result.authenticated = FALSE;
2033 pDevice->fWPA_Authened = FALSE;
2035 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call device init rd0 ring\n");
2036 device_init_rd0_ring(pDevice);
2037 device_init_rd1_ring(pDevice);
2038 device_init_defrag_cb(pDevice);
2039 device_init_td0_ring(pDevice);
2040 device_init_td1_ring(pDevice);
2041 // VNTWIFIvSet11h(pDevice->pMgmt, pDevice->b11hEnable);
2044 if (pDevice->bDiversityRegCtlON) {
2045 device_init_diversity_timer(pDevice);
2047 vMgrObjectInit(pDevice);
2048 vMgrTimerInit(pDevice);
2052 tasklet_init (&pDevice->RxMngWorkItem,(void *)MngWorkItem,(unsigned long )pDevice);
2055 InitRxManagementQueue(pDevice);
2057 mlme_task = kthread_run(MlmeThread,(void *) pDevice, "MLME");
2058 if (IS_ERR(mlme_task)) {
2059 printk("thread create fail\n");
2069 pDevice->MLMEThr_pid = kernel_thread(MlmeThread, pDevice, CLONE_VM);
2070 if (pDevice->MLMEThr_pid <0 )
2072 printk("unable start thread MlmeThread\n");
2077 //printk("thread id is %d\n",pDevice->MLMEThr_pid);
2078 //printk("Create thread time is %x\n",jiffies);
2079 //wait_for_completion(&pDevice->notify);
2084 // if (( SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RADIOCTL)&0x06)==0x04)
2086 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call device_init_registers\n");
2087 device_init_registers(pDevice, DEVICE_INIT_COLD);
2088 MACvReadEtherAddress(pDevice->PortOffset, pDevice->abyCurrentNetAddr);
2089 memcpy(pDevice->pMgmt->abyMACAddr, pDevice->abyCurrentNetAddr, U_ETHER_ADDR_LEN);
2091 __device_set_multi(pExDevice);
2093 device_set_multi(pDevice->dev);
2096 // Init for Key Management
2097 KeyvInitTable(&pDevice->sKey, pDevice->PortOffset);
2098 add_timer(&(pDevice->pMgmt->sTimerSecondCallback));
2100 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2102 pDevice->bwextstep0 = FALSE;
2103 pDevice->bwextstep1 = FALSE;
2104 pDevice->bwextstep2 = FALSE;
2105 pDevice->bwextstep3 = FALSE;
2107 pDevice->bwextcount=0;
2108 pDevice->bWPASuppWextEnabled = FALSE;
2110 pDevice->byReAssocCount = 0;
2111 pDevice->bWPADEVUp = FALSE;
2112 // Patch: if WEP key already set by iwconfig but device not yet open
2113 if ((pDevice->bEncryptionEnable == TRUE) && (pDevice->bTransmitKey == TRUE)) {
2114 KeybSetDefaultKey(&(pDevice->sKey),
2115 (DWORD)(pDevice->byKeyIndex | (1 << 31)),
2116 pDevice->uKeyLength,
2120 pDevice->PortOffset,
2123 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
2126 //printk("DEBUG2\n");
2129 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call MACvIntEnable\n");
2130 MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
2132 if (pDevice->pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2133 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RUN_AP, NULL);
2136 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
2137 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_SSID, NULL);
2139 pDevice->flags |=DEVICE_FLAGS_OPENED;
2141 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
2148 int __device_close(HANDLE pExDevice) {
2149 PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
2150 struct net_device *dev = pDevice_info->dev;
2151 PSDevice pDevice = (PSDevice)(pDevice_info->pWDevice);
2154 static int device_close(struct net_device *dev) {
2155 PSDevice pDevice=(PSDevice) netdev_priv(dev);
2157 PSMgmtObject pMgmt = pDevice->pMgmt;
2163 //2007-1121-02<Add>by EinsnLiu
2164 if (pDevice->bLinkPass) {
2165 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
2169 del_timer(&pDevice->sTimerTxData);
2171 del_timer(&pDevice->sTimerCommand);
2172 del_timer(&pMgmt->sTimerSecondCallback);
2173 if (pDevice->bDiversityRegCtlON) {
2174 del_timer(&pDevice->TimerSQ3Tmax1);
2175 del_timer(&pDevice->TimerSQ3Tmax2);
2176 del_timer(&pDevice->TimerSQ3Tmax3);
2180 tasklet_kill(&pDevice->RxMngWorkItem);
2182 netif_stop_queue(dev);
2183 pDevice->bCmdRunning = FALSE;
2184 MACbShutdown(pDevice->PortOffset);
2185 MACbSoftwareReset(pDevice->PortOffset);
2186 CARDbRadioPowerOff(pDevice);
2188 pDevice->bLinkPass = FALSE;
2189 memset(pMgmt->abyCurrBSSID, 0, 6);
2190 pMgmt->eCurrState = WMAC_STATE_IDLE;
2191 device_free_td0_ring(pDevice);
2192 device_free_td1_ring(pDevice);
2193 device_free_rd0_ring(pDevice);
2194 device_free_rd1_ring(pDevice);
2195 device_free_frag_buf(pDevice);
2196 device_free_rings(pDevice);
2197 BSSvClearNodeDBTable(pDevice, 0);
2198 free_irq(dev->irq, dev);
2199 pDevice->flags &=(~DEVICE_FLAGS_OPENED);
2200 //2008-0714-01<Add>by chester
2201 device_release_WPADEV(pDevice);
2203 //tasklet_kill(&pDevice->RxMngWorkItem);
2205 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close.. \n");
2211 int __device_dma0_tx_80211(HANDLE pExDevice, struct sk_buff *skb) {
2212 PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
2213 PSDevice pDevice = (PSDevice)(pDevice_info->pWDevice);
2214 ref_sk_buff ref_skb;
2219 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev) {
2220 PSDevice pDevice=netdev_priv(dev);
2226 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211\n");
2227 spin_lock_irq(&pDevice->lock);
2229 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
2230 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211, td0 <=0\n");
2231 dev_kfree_skb_irq(skb);
2232 spin_unlock_irq(&pDevice->lock);
2236 if (pDevice->bStopTx0Pkt == TRUE) {
2237 dev_kfree_skb_irq(skb);
2238 spin_unlock_irq(&pDevice->lock);
2243 ref_skb_remap(pDevice->dev, &ref_skb, skb);
2244 cbMPDULen = *(ref_skb.len);
2245 pbMPDU = ref_skb.data;
2247 cbMPDULen = skb->len;
2251 vDMA0_tx_80211(pDevice, skb, pbMPDU, cbMPDULen);
2253 spin_unlock_irq(&pDevice->lock);
2261 BOOL device_dma0_xmit(PSDevice pDevice, struct sk_buff *skb, UINT uNodeIndex) {
2262 PSMgmtObject pMgmt = pDevice->pMgmt;
2263 PSTxDesc pHeadTD, pLastTD;
2264 UINT cbFrameBodySize;
2267 BOOL bNeedEncryption = FALSE;
2268 PSKeyItem pTransmitKey = NULL;
2272 // BYTE byKeyIndex = 0;
2274 ref_sk_buff ref_skb;
2278 if (pDevice->bStopTx0Pkt == TRUE) {
2279 dev_kfree_skb_irq(skb);
2283 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
2284 dev_kfree_skb_irq(skb);
2285 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_xmit, td0 <=0\n");
2289 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2290 if (pDevice->uAssocCount == 0) {
2291 dev_kfree_skb_irq(skb);
2292 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_xmit, assocCount = 0\n");
2298 ref_skb_remap(pDevice->dev, &(ref_skb), skb);
2300 pHeadTD = pDevice->apCurrTD[TYPE_TXDMA0];
2302 pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP);
2305 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)(ref_skb.data), U_HEADER_LEN);
2306 cbFrameBodySize = *(ref_skb.len) - U_HEADER_LEN;
2309 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)(skb->data), U_HEADER_LEN);
2310 cbFrameBodySize = skb->len - U_HEADER_LEN;
2314 if (ntohs(pDevice->sTxEthHeader.wType) > MAX_DATA_LEN) {
2315 cbFrameBodySize += 8;
2317 uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader);
2319 if ( uMACfragNum > AVAIL_TD(pDevice, TYPE_TXDMA0)) {
2320 dev_kfree_skb_irq(skb);
2323 byPktTyp = (BYTE)pDevice->byPacketType;
2326 if (pDevice->bFixRate) {
2327 if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
2328 if (pDevice->uConnectionRate >= RATE_11M) {
2329 pDevice->wCurrentRate = RATE_11M;
2331 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
2334 if (pDevice->uConnectionRate >= RATE_54M)
2335 pDevice->wCurrentRate = RATE_54M;
2337 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
2341 pDevice->wCurrentRate = pDevice->pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2345 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2346 pDevice->byPreambleType = pDevice->byShortPreamble;
2349 pDevice->byPreambleType = PREAMBLE_LONG;
2352 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dma0: pDevice->wCurrentRate = %d \n", pDevice->wCurrentRate);
2355 if (pDevice->wCurrentRate <= RATE_11M) {
2356 byPktTyp = PK_TYPE_11B;
2357 } else if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2358 byPktTyp = PK_TYPE_11A;
2360 if (pDevice->bProtectMode == TRUE) {
2361 byPktTyp = PK_TYPE_11GB;
2363 byPktTyp = PK_TYPE_11GA;
2367 if (pDevice->bEncryptionEnable == TRUE)
2368 bNeedEncryption = TRUE;
2370 if (pDevice->bEnableHostWEP) {
2371 pTransmitKey = &STempKey;
2372 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2373 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2374 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2375 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2376 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2377 memcpy(pTransmitKey->abyKey,
2378 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2379 pTransmitKey->uKeyLength
2382 vGenerateFIFOHeader(pDevice, byPktTyp, pDevice->pbyTmpBuff, bNeedEncryption,
2383 cbFrameBodySize, TYPE_TXDMA0, pHeadTD,
2384 &pDevice->sTxEthHeader, (PBYTE)skb->data, pTransmitKey, uNodeIndex,
2389 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2391 MACbPSWakeup(pDevice->PortOffset);
2394 pDevice->bPWBitOn = FALSE;
2397 for (ii = 0; ii < uMACfragNum; ii++) {
2398 // Poll Transmit the adapter
2400 pHeadTD->m_td0TD0.f1Owner=OWNED_BY_NIC;
2402 if (ii == (uMACfragNum - 1))
2404 pHeadTD = pHeadTD->next;
2407 // Save the information needed by the tx interrupt handler
2408 // to complete the Send request
2409 pLastTD->pTDInfo->skb = skb;
2410 pLastTD->pTDInfo->byFlags = 0;
2411 pLastTD->pTDInfo->byFlags |= TD_FLAGS_NETIF_SKB;
2413 pDevice->apCurrTD[TYPE_TXDMA0] = pHeadTD;
2415 MACvTransmit0(pDevice->PortOffset);
2421 //TYPE_AC0DMA data tx
2424 int __device_xmit(HANDLE pExDevice, struct sk_buff *skb) {
2425 PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
2426 PSDevice pDevice = (PSDevice)(pDevice_info->pWDevice);
2427 struct net_device *dev = pDevice_info->dev;
2428 ref_sk_buff ref_skb;
2431 static int device_xmit(struct sk_buff *skb, struct net_device *dev) {
2432 PSDevice pDevice=netdev_priv(dev);
2435 PSMgmtObject pMgmt = pDevice->pMgmt;
2436 PSTxDesc pHeadTD, pLastTD;
2437 UINT uNodeIndex = 0;
2438 BYTE byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
2440 UINT uMACfragNum = 1;
2441 UINT cbFrameBodySize;
2444 BOOL bNeedEncryption = FALSE;
2445 PSKeyItem pTransmitKey = NULL;
2448 BOOL bTKIP_UseGTK = FALSE;
2449 BOOL bNeedDeAuth = FALSE;
2451 BOOL bNodeExist = FALSE;
2455 spin_lock_irq(&pDevice->lock);
2456 if (pDevice->bLinkPass == FALSE) {
2457 dev_kfree_skb_irq(skb);
2458 spin_unlock_irq(&pDevice->lock);
2462 if (pDevice->bStopDataPkt) {
2463 dev_kfree_skb_irq(skb);
2464 spin_unlock_irq(&pDevice->lock);
2469 ref_skb_remap(pDevice->dev, &ref_skb, skb);
2472 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2473 if (pDevice->uAssocCount == 0) {
2474 dev_kfree_skb_irq(skb);
2475 spin_unlock_irq(&pDevice->lock);
2479 if (IS_MULTICAST_ADDRESS((PBYTE)(ref_skb.data))) {
2481 if (IS_MULTICAST_ADDRESS((PBYTE)(skb->data))) {
2485 if (pMgmt->sNodeDBTable[0].bPSEnable) {
2487 skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), ref_skb.skb);
2489 skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb);
2491 pMgmt->sNodeDBTable[0].wEnQueueCnt++;
2493 pMgmt->abyPSTxMap[0] |= byMask[0];
2494 spin_unlock_irq(&pDevice->lock);
2499 if (BSSDBbIsSTAInNodeDB(pMgmt, (PBYTE)(ref_skb.data), &uNodeIndex)) {
2501 if (BSSDBbIsSTAInNodeDB(pMgmt, (PBYTE)(skb->data), &uNodeIndex)) {
2503 if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
2505 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, ref_skb.skb);
2507 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
2509 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
2511 wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
2512 pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
2513 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set:pMgmt->abyPSTxMap[%d]= %d\n",
2514 (wAID >> 3), pMgmt->abyPSTxMap[wAID >> 3]);
2515 spin_unlock_irq(&pDevice->lock);
2519 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2520 pDevice->byPreambleType = pDevice->byShortPreamble;
2523 pDevice->byPreambleType = PREAMBLE_LONG;
2530 if (bNodeExist == FALSE) {
2531 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Unknown STA not found in node DB \n");
2532 dev_kfree_skb_irq(skb);
2533 spin_unlock_irq(&pDevice->lock);
2538 pHeadTD = pDevice->apCurrTD[TYPE_AC0DMA];
2540 pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP);
2544 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)(ref_skb.data), U_HEADER_LEN);
2545 cbFrameBodySize = *(ref_skb.len) - U_HEADER_LEN;
2547 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)(skb->data), U_HEADER_LEN);
2548 cbFrameBodySize = skb->len - U_HEADER_LEN;
2551 if (ntohs(pDevice->sTxEthHeader.wType) > MAX_DATA_LEN) {
2552 cbFrameBodySize += 8;
2556 if (pDevice->bEncryptionEnable == TRUE) {
2557 bNeedEncryption = TRUE;
2560 if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
2561 (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2562 pbyBSSID = pDevice->abyBSSID;
2564 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
2566 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
2567 bTKIP_UseGTK = TRUE;
2568 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2572 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get PTK.\n");
2575 }else if (pDevice->pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2577 pbyBSSID = pDevice->sTxEthHeader.abyDstAddr; //TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1
2578 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS Serach Key: \n");
2579 for (ii = 0; ii< 6; ii++)
2580 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"%x \n", *(pbyBSSID+ii));
2581 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"\n");
2584 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == TRUE)
2588 pbyBSSID = pDevice->abyBroadcastAddr;
2589 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
2590 pTransmitKey = NULL;
2591 if (pDevice->pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2592 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS and KEY is NULL. [%d]\n", pDevice->pMgmt->eCurrMode);
2595 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"NOT IBSS and KEY is NULL. [%d]\n", pDevice->pMgmt->eCurrMode);
2597 bTKIP_UseGTK = TRUE;
2598 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2603 if (pDevice->bEnableHostWEP) {
2604 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"acdma0: STA index %d\n", uNodeIndex);
2605 if (pDevice->bEncryptionEnable == TRUE) {
2606 pTransmitKey = &STempKey;
2607 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2608 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2609 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2610 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2611 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2612 memcpy(pTransmitKey->abyKey,
2613 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2614 pTransmitKey->uKeyLength
2619 uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader);
2621 if (uMACfragNum > AVAIL_TD(pDevice, TYPE_AC0DMA)) {
2622 DEVICE_PRT(MSG_LEVEL_ERR, KERN_DEBUG "uMACfragNum > AVAIL_TD(TYPE_AC0DMA) = %d\n", uMACfragNum);
2623 dev_kfree_skb_irq(skb);
2624 spin_unlock_irq(&pDevice->lock);
2628 if (pTransmitKey != NULL) {
2629 if ((pTransmitKey->byCipherSuite == KEY_CTL_WEP) &&
2630 (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN)) {
2631 uMACfragNum = 1; //WEP256 doesn't support fragment
2635 byPktTyp = (BYTE)pDevice->byPacketType;
2637 if (pDevice->bFixRate) {
2639 printk("Fix Rate: PhyType is %d,ConnectionRate is %d\n",pDevice->eCurrentPHYType,pDevice->uConnectionRate);
2642 if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
2643 if (pDevice->uConnectionRate >= RATE_11M) {
2644 pDevice->wCurrentRate = RATE_11M;
2646 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
2649 if ((pDevice->eCurrentPHYType == PHY_TYPE_11A) &&
2650 (pDevice->uConnectionRate <= RATE_6M)) {
2651 pDevice->wCurrentRate = RATE_6M;
2653 if (pDevice->uConnectionRate >= RATE_54M)
2654 pDevice->wCurrentRate = RATE_54M;
2656 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
2660 pDevice->byACKRate = (BYTE) pDevice->wCurrentRate;
2661 pDevice->byTopCCKBasicRate = RATE_1M;
2662 pDevice->byTopOFDMBasicRate = RATE_6M;
2666 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
2667 if (pDevice->eCurrentPHYType != PHY_TYPE_11A) {
2668 pDevice->wCurrentRate = RATE_1M;
2669 pDevice->byACKRate = RATE_1M;
2670 pDevice->byTopCCKBasicRate = RATE_1M;
2671 pDevice->byTopOFDMBasicRate = RATE_6M;
2673 pDevice->wCurrentRate = RATE_6M;
2674 pDevice->byACKRate = RATE_6M;
2675 pDevice->byTopCCKBasicRate = RATE_1M;
2676 pDevice->byTopOFDMBasicRate = RATE_6M;
2680 VNTWIFIvGetTxRate( pDevice->pMgmt,
2681 pDevice->sTxEthHeader.abyDstAddr,
2682 &(pDevice->wCurrentRate),
2683 &(pDevice->byACKRate),
2684 &(pDevice->byTopCCKBasicRate),
2685 &(pDevice->byTopOFDMBasicRate));
2688 printk("auto rate:Rate : %d,AckRate:%d,TopCCKRate:%d,TopOFDMRate:%d\n",
2689 pDevice->wCurrentRate,pDevice->byACKRate,
2690 pDevice->byTopCCKBasicRate,pDevice->byTopOFDMBasicRate);
2696 pDevice->wCurrentRate = 11;
2697 pDevice->byACKRate = 8;
2698 pDevice->byTopCCKBasicRate = 3;
2699 pDevice->byTopOFDMBasicRate = 8;
2706 // DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "acdma0: pDevice->wCurrentRate = %d \n", pDevice->wCurrentRate);
2708 if (pDevice->wCurrentRate <= RATE_11M) {
2709 byPktTyp = PK_TYPE_11B;
2710 } else if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2711 byPktTyp = PK_TYPE_11A;
2713 if (pDevice->bProtectMode == TRUE) {
2714 byPktTyp = PK_TYPE_11GB;
2716 byPktTyp = PK_TYPE_11GA;
2720 //#ifdef PLICE_DEBUG
2721 // printk("FIX RATE:CurrentRate is %d");
2724 if (bNeedEncryption == TRUE) {
2725 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType));
2726 if ((pDevice->sTxEthHeader.wType) == TYPE_PKT_802_1x) {
2727 bNeedEncryption = FALSE;
2728 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType));
2729 if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2730 if (pTransmitKey == NULL) {
2731 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Don't Find TX KEY\n");
2734 if (bTKIP_UseGTK == TRUE) {
2735 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n");
2738 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
2739 bNeedEncryption = TRUE;
2744 if (pDevice->byCntMeasure == 2) {
2746 pDevice->s802_11Counter.TKIPCounterMeasuresInvoked++;
2749 if (pDevice->bEnableHostWEP) {
2750 if ((uNodeIndex != 0) &&
2751 (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) {
2752 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
2753 bNeedEncryption = TRUE;
2758 if (pTransmitKey == NULL) {
2759 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n");
2760 dev_kfree_skb_irq(skb);
2761 spin_unlock_irq(&pDevice->lock);
2769 vGenerateFIFOHeader(pDevice, byPktTyp, pDevice->pbyTmpBuff, bNeedEncryption,
2770 cbFrameBodySize, TYPE_AC0DMA, pHeadTD,
2771 &pDevice->sTxEthHeader, (PBYTE)ref_skb.data, pTransmitKey, uNodeIndex,
2777 //if (skb->len == 98)
2779 // printk("ping:len is %d\n");
2782 vGenerateFIFOHeader(pDevice, byPktTyp, pDevice->pbyTmpBuff, bNeedEncryption,
2783 cbFrameBodySize, TYPE_AC0DMA, pHeadTD,
2784 &pDevice->sTxEthHeader, (PBYTE)skb->data, pTransmitKey, uNodeIndex,
2790 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2792 MACbPSWakeup(pDevice->PortOffset);
2794 pDevice->bPWBitOn = FALSE;
2797 for (ii = 0; ii < uMACfragNum; ii++) {
2798 // Poll Transmit the adapter
2800 pHeadTD->m_td0TD0.f1Owner=OWNED_BY_NIC;
2802 if (ii == uMACfragNum - 1)
2804 pHeadTD = pHeadTD->next;
2807 // Save the information needed by the tx interrupt handler
2808 // to complete the Send request
2810 pLastTD->pTDInfo->skb = ref_skb.skb;
2812 pLastTD->pTDInfo->skb = skb;
2814 pLastTD->pTDInfo->byFlags = 0;
2815 pLastTD->pTDInfo->byFlags |= TD_FLAGS_NETIF_SKB;
2817 pDevice->nTxDataTimeCout=0; //2008-8-21 chester <add> for send null packet
2819 if (AVAIL_TD(pDevice, TYPE_AC0DMA) <= 1) {
2820 netif_stop_queue(dev);
2823 pDevice->apCurrTD[TYPE_AC0DMA] = pHeadTD;
2824 //#ifdef PLICE_DEBUG
2825 if (pDevice->bFixRate)
2827 printk("FixRate:Rate is %d,TxPower is %d\n",pDevice->wCurrentRate,pDevice->byCurPwr);
2831 //printk("Auto Rate:Rate is %d,TxPower is %d\n",pDevice->wCurrentRate,pDevice->byCurPwr);
2836 BYTE Protocol_Version; //802.1x Authentication
2837 BYTE Packet_Type; //802.1x Authentication
2838 BYTE Descriptor_type;
2840 BOOL bTxeapol_key = FALSE;
2841 Protocol_Version = skb->data[U_HEADER_LEN];
2842 Packet_Type = skb->data[U_HEADER_LEN+1];
2843 Descriptor_type = skb->data[U_HEADER_LEN+1+1+2];
2844 Key_info = (skb->data[U_HEADER_LEN+1+1+2+1] << 8)|(skb->data[U_HEADER_LEN+1+1+2+2]);
2845 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
2846 if(((Protocol_Version==1) ||(Protocol_Version==2)) &&
2847 (Packet_Type==3)) { //802.1x OR eapol-key challenge frame transfer
2848 bTxeapol_key = TRUE;
2849 if((Descriptor_type==254)||(Descriptor_type==2)) { //WPA or RSN
2850 if(!(Key_info & BIT3) && //group-key challenge
2851 (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key
2852 pDevice->fWPA_Authened = TRUE;
2853 if(Descriptor_type==254)
2857 printk("Authentication completed!!\n");
2864 MACvTransmitAC0(pDevice->PortOffset);
2865 // DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "acdma0:pDevice->apCurrTD= %p\n", pHeadTD);
2868 ref_set_tx_jiffies(pDevice->dev);
2870 dev->trans_start = jiffies;
2873 spin_unlock_irq(&pDevice->lock);
2880 int __device_intr(int irq, HANDLE pExDevice, struct pt_regs *regs) {
2881 PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
2882 PSDevice pDevice = (PSDevice)(pDevice_info->pWDevice);
2886 static irqreturn_t device_intr(int irq, void *dev_instance) {
2887 struct net_device* dev=dev_instance;
2888 PSDevice pDevice=(PSDevice) netdev_priv(dev);
2892 DWORD dwMIBCounter=0;
2893 PSMgmtObject pMgmt = pDevice->pMgmt;
2894 BYTE byOrgPageSel=0;
2901 MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
2903 if (pDevice->dwIsr == 0)
2904 return IRQ_RETVAL(handled);
2906 if (pDevice->dwIsr == 0xffffffff) {
2907 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dwIsr = 0xffff\n");
2908 return IRQ_RETVAL(handled);
2911 // 2008-05-21 <mark> by Richardtai, we can't read RSSI here, because no packet bound with RSSI
2913 if ((BITbIsBitOn(pDevice->dwIsr, ISR_RXDMA0)) &&
2914 (pDevice->byLocalID != REV_ID_VT3253_B0) &&
2915 (pDevice->bBSSIDFilter == TRUE)) {
2917 //BBbReadEmbeded(pDevice->PortOffset, 0x3E, &byRSSI);
2918 //pDevice->uCurrRSSI = byRSSI;
2923 MACvIntDisable(pDevice->PortOffset);
2924 spin_lock_irq(&pDevice->lock);
2926 //Make sure current page is 0
2927 VNSvInPortB(pDevice->PortOffset + MAC_REG_PAGE1SEL, &byOrgPageSel);
2928 if (byOrgPageSel == 1) {
2929 MACvSelectPage0(pDevice->PortOffset);
2934 MACvReadMIBCounter(pDevice->PortOffset, &dwMIBCounter);
2936 // Must do this after doing rx/tx, cause ISR bit is slow
2937 // than RD/TD write back
2938 // update ISR counter
2939 STAvUpdate802_11Counter(&pDevice->s802_11Counter, &pDevice->scStatistic , dwMIBCounter);
2940 while (pDevice->dwIsr != 0) {
2942 STAvUpdateIsrStatCounter(&pDevice->scStatistic, pDevice->dwIsr);
2943 MACvWriteISR(pDevice->PortOffset, pDevice->dwIsr);
2945 if (pDevice->dwIsr & ISR_FETALERR){
2946 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " ISR_FETALERR \n");
2947 VNSvOutPortB(pDevice->PortOffset + MAC_REG_SOFTPWRCTL, 0);
2948 VNSvOutPortW(pDevice->PortOffset + MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPECTI);
2949 device_error(pDevice, pDevice->dwIsr);
2952 if (pDevice->byLocalID > REV_ID_VT3253_B1) {
2954 if (BITbIsBitOn(pDevice->dwIsr, ISR_MEASURESTART)) {
2955 // 802.11h measure start
2956 pDevice->byOrgChannel = pDevice->byCurrentCh;
2957 VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byOrgRCR));
2958 VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, (RCR_RXALLTYPE | RCR_UNICAST | RCR_BROADCAST | RCR_MULTICAST | RCR_WPAERR));
2959 MACvSelectPage1(pDevice->PortOffset);
2960 VNSvInPortD(pDevice->PortOffset + MAC_REG_MAR0, &(pDevice->dwOrgMAR0));
2961 VNSvInPortD(pDevice->PortOffset + MAC_REG_MAR4, &(pDevice->dwOrgMAR4));
2962 MACvSelectPage0(pDevice->PortOffset);
2964 // WCMDbFlushCommandQueue(pDevice->pMgmt, TRUE);
2965 if (CARDbSetChannel(pDevice, pDevice->pCurrMeasureEID->sReq.byChannel) == TRUE) {
2966 pDevice->bMeasureInProgress = TRUE;
2967 MACvSelectPage1(pDevice->PortOffset);
2968 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_READY);
2969 MACvSelectPage0(pDevice->PortOffset);
2970 pDevice->byBasicMap = 0;
2971 pDevice->byCCAFraction = 0;
2972 for(ii=0;ii<8;ii++) {
2973 pDevice->dwRPIs[ii] = 0;
2976 // can not measure because set channel fail
2977 // WCMDbResetCommandQueue(pDevice->pMgmt);
2978 // clear measure control
2979 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
2980 s_vCompleteCurrentMeasure(pDevice, MEASURE_MODE_INCAPABLE);
2981 MACvSelectPage1(pDevice->PortOffset);
2982 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2983 MACvSelectPage0(pDevice->PortOffset);
2986 if (BITbIsBitOn(pDevice->dwIsr, ISR_MEASUREEND)) {
2987 // 802.11h measure end
2988 pDevice->bMeasureInProgress = FALSE;
2989 VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byOrgRCR);
2990 MACvSelectPage1(pDevice->PortOffset);
2991 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, pDevice->dwOrgMAR0);
2992 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR4, pDevice->dwOrgMAR4);
2993 VNSvInPortB(pDevice->PortOffset + MAC_REG_MSRBBSTS, &byData);
2994 pDevice->byBasicMap |= (byData >> 4);
2995 VNSvInPortB(pDevice->PortOffset + MAC_REG_CCAFRACTION, &pDevice->byCCAFraction);
2996 VNSvInPortB(pDevice->PortOffset + MAC_REG_MSRCTL, &byData);
2997 // clear measure control
2998 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
2999 MACvSelectPage0(pDevice->PortOffset);
3000 CARDbSetChannel(pDevice, pDevice->byOrgChannel);
3001 // WCMDbResetCommandQueue(pDevice->pMgmt);
3002 MACvSelectPage1(pDevice->PortOffset);
3003 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
3004 MACvSelectPage0(pDevice->PortOffset);
3005 if (BITbIsBitOn(byData, MSRCTL_FINISH)) {
3007 s_vCompleteCurrentMeasure(pDevice, 0);
3009 // can not measure because not ready before end of measure time
3010 s_vCompleteCurrentMeasure(pDevice, MEASURE_MODE_LATE);
3013 if (BITbIsBitOn(pDevice->dwIsr, ISR_QUIETSTART)) {
3016 } while (CARDbStartQuiet(pDevice) == FALSE);
3020 if (pDevice->dwIsr & ISR_TBTT) {
3021 if (pDevice->bEnableFirstQuiet == TRUE) {
3022 pDevice->byQuietStartCount--;
3023 if (pDevice->byQuietStartCount == 0) {
3024 pDevice->bEnableFirstQuiet = FALSE;
3025 MACvSelectPage1(pDevice->PortOffset);
3026 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN));
3027 MACvSelectPage0(pDevice->PortOffset);
3030 if ((pDevice->bChannelSwitch == TRUE) &&
3031 (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE)) {
3032 pDevice->byChannelSwitchCount--;
3033 if (pDevice->byChannelSwitchCount == 0) {
3034 pDevice->bChannelSwitch = FALSE;
3035 CARDbSetChannel(pDevice, pDevice->byNewChannel);
3036 VNTWIFIbChannelSwitch(pDevice->pMgmt, pDevice->byNewChannel);
3037 MACvSelectPage1(pDevice->PortOffset);
3038 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
3039 MACvSelectPage0(pDevice->PortOffset);
3040 CARDbStartTxPacket(pDevice, PKT_TYPE_802_11_ALL);
3044 if (pDevice->eOPMode == OP_MODE_ADHOC) {
3045 //pDevice->bBeaconSent = FALSE;
3047 if ((pDevice->bUpdateBBVGA) && (pDevice->bLinkPass == TRUE) && (pDevice->uCurrRSSI != 0)) {
3050 RFvRSSITodBm(pDevice, (BYTE) pDevice->uCurrRSSI, &ldBm);
3051 for (ii=0;ii<BB_VGA_LEVEL;ii++) {
3052 if (ldBm < pDevice->ldBmThreshold[ii]) {
3053 pDevice->byBBVGANew = pDevice->abyBBVGA[ii];
3057 if (pDevice->byBBVGANew != pDevice->byBBVGACurrent) {
3058 pDevice->uBBVGADiffCount++;
3059 if (pDevice->uBBVGADiffCount == 1) {
3060 // first VGA diff gain
3061 BBvSetVGAGainOffset(pDevice, pDevice->byBBVGANew);
3062 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"First RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
3063 (int)ldBm, pDevice->byBBVGANew, pDevice->byBBVGACurrent, (int)pDevice->uBBVGADiffCount);
3065 if (pDevice->uBBVGADiffCount >= BB_VGA_CHANGE_THRESHOLD) {
3066 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
3067 (int)ldBm, pDevice->byBBVGANew, pDevice->byBBVGACurrent, (int)pDevice->uBBVGADiffCount);
3068 BBvSetVGAGainOffset(pDevice, pDevice->byBBVGANew);
3071 pDevice->uBBVGADiffCount = 1;
3076 pDevice->bBeaconSent = FALSE;
3077 if (pDevice->bEnablePSMode) {
3078 PSbIsNextTBTTWakeUp((HANDLE)pDevice);
3081 if ((pDevice->eOPMode == OP_MODE_AP) ||
3082 (pDevice->eOPMode == OP_MODE_ADHOC)) {
3084 MACvOneShotTimer1MicroSec(pDevice->PortOffset,
3085 (pMgmt->wIBSSBeaconPeriod - MAKE_BEACON_RESERVED) << 10);
3088 if (pDevice->eOPMode == OP_MODE_ADHOC && pDevice->pMgmt->wCurrATIMWindow > 0) {
3089 // todo adhoc PS mode
3094 if (pDevice->dwIsr & ISR_BNTX) {
3096 if (pDevice->eOPMode == OP_MODE_ADHOC) {
3097 pDevice->bIsBeaconBufReadySet = FALSE;
3098 pDevice->cbBeaconBufReadySetCnt = 0;
3101 if (pDevice->eOPMode == OP_MODE_AP) {
3102 if(pMgmt->byDTIMCount > 0) {
3103 pMgmt->byDTIMCount --;
3104 pMgmt->sNodeDBTable[0].bRxPSPoll = FALSE;
3107 if(pMgmt->byDTIMCount == 0) {
3108 // check if mutltcast tx bufferring
3109 pMgmt->byDTIMCount = pMgmt->byDTIMPeriod - 1;
3110 pMgmt->sNodeDBTable[0].bRxPSPoll = TRUE;
3111 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RX_PSPOLL, NULL);
3115 pDevice->bBeaconSent = TRUE;
3117 if (pDevice->bChannelSwitch == TRUE) {
3118 pDevice->byChannelSwitchCount--;
3119 if (pDevice->byChannelSwitchCount == 0) {
3120 pDevice->bChannelSwitch = FALSE;
3121 CARDbSetChannel(pDevice, pDevice->byNewChannel);
3122 VNTWIFIbChannelSwitch(pDevice->pMgmt, pDevice->byNewChannel);
3123 MACvSelectPage1(pDevice->PortOffset);
3124 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
3125 MACvSelectPage0(pDevice->PortOffset);
3126 //VNTWIFIbSendBeacon(pDevice->pMgmt);
3127 CARDbStartTxPacket(pDevice, PKT_TYPE_802_11_ALL);
3133 if (pDevice->dwIsr & ISR_RXDMA0) {
3134 max_count += device_rx_srv(pDevice, TYPE_RXDMA0);
3136 if (pDevice->dwIsr & ISR_RXDMA1) {
3137 max_count += device_rx_srv(pDevice, TYPE_RXDMA1);
3139 if (pDevice->dwIsr & ISR_TXDMA0){
3140 max_count += device_tx_srv(pDevice, TYPE_TXDMA0);
3142 if (pDevice->dwIsr & ISR_AC0DMA){
3143 max_count += device_tx_srv(pDevice, TYPE_AC0DMA);
3145 if (pDevice->dwIsr & ISR_SOFTTIMER) {
3148 if (pDevice->dwIsr & ISR_SOFTTIMER1) {
3149 if (pDevice->eOPMode == OP_MODE_AP) {
3150 if (pDevice->bShortSlotTime)
3151 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTSLOTTIME(1);
3153 pMgmt->wCurrCapInfo &= ~(WLAN_SET_CAP_INFO_SHORTSLOTTIME(1));
3155 bMgrPrepareBeaconToSend(pDevice, pMgmt);
3156 pDevice->byCntMeasure = 0;
3159 MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
3161 MACvReceive0(pDevice->PortOffset);
3162 MACvReceive1(pDevice->PortOffset);
3164 if (max_count>pDevice->sOpts.int_works)
3168 if (byOrgPageSel == 1) {
3169 MACvSelectPage1(pDevice->PortOffset);
3172 spin_unlock_irq(&pDevice->lock);
3173 MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
3175 return IRQ_RETVAL(handled);
3179 static unsigned const ethernet_polynomial = 0x04c11db7U;
3180 static inline u32 ether_crc(int length, unsigned char *data)
3184 while(--length >= 0) {
3185 unsigned char current_octet = *data++;
3187 for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
3189 ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
3195 //2008-8-4 <add> by chester
3196 static int Config_FileGetParameter(UCHAR *string, UCHAR *dest,UCHAR *source)
3199 int source_len = strlen(source);
3202 strcat(buf1, string);
3204 source+=strlen(buf1);
3206 memcpy(dest,source,source_len-strlen(buf1));
3210 int Config_FileOperation(PSDevice pDevice,BOOL fwrite,unsigned char *Parameter) {
3211 UCHAR *config_path=CONFIG_PATH;
3213 UCHAR tmpbuffer[20];
3214 struct file *filp=NULL;
3215 mm_segment_t old_fs = get_fs();
3216 //int oldfsuid=0,oldfsgid=0;
3221 /* Can't do this anymore, so we rely on correct filesystem permissions:
3222 //Make sure a caller can read or write power as root
3223 oldfsuid=current->cred->fsuid;
3224 oldfsgid=current->cred->fsgid;
3225 current->cred->fsuid = 0;
3226 current->cred->fsgid = 0;
3230 filp = filp_open(config_path, O_RDWR, 0);
3232 printk("Config_FileOperation:open file fail?\n");
3237 if(!(filp->f_op) || !(filp->f_op->read) ||!(filp->f_op->write)) {
3238 printk("file %s cann't readable or writable?\n",config_path);
3243 buffer = (UCHAR *)kmalloc(1024, GFP_KERNEL);
3245 printk("alllocate mem for file fail?\n");
3250 if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
3251 printk("read file error?\n");
3256 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer)!=TRUE) {
3257 printk("get parameter error?\n");
3262 if(memcmp(tmpbuffer,"USA",3)==0) {
3263 result=ZoneType_USA;
3265 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
3266 result=ZoneType_Japan;
3268 else if(memcmp(tmpbuffer,"EUROPE",5)==0) {
3269 result=ZoneType_Europe;
3273 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
3280 if(filp_close(filp,NULL))
3281 printk("Config_FileOperation:close file fail\n");
3287 current->cred->fsuid=oldfsuid;
3288 current->cred->fsgid=oldfsgid;
3297 void __device_set_multi(HANDLE pExDevice) {
3298 PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
3299 ref_net_device *dev = &(pDevice_info->ref_dev);
3300 PSDevice pDevice = (PSDevice)(pDevice_info->pWDevice);
3304 static void device_set_multi(struct net_device *dev) {
3305 PSDevice pDevice = (PSDevice) netdev_priv(dev);
3308 PSMgmtObject pMgmt = pDevice->pMgmt;
3311 struct dev_mc_list *mclist;
3314 VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byRxMode));
3317 if (*(dev->flags) & IFF_PROMISC) { /* Set promiscuous. */
3318 DEVICE_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: Promiscuous mode enabled.\n", pDevice->dev->name);
3321 if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
3322 DEVICE_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
3324 /* Unconditionally log net taps. */
3325 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
3328 else if ((*(dev->mc_count) > pDevice->multicast_limit)
3329 || (*(dev->flags) & IFF_ALLMULTI)) {
3331 else if ((dev->mc_count > pDevice->multicast_limit)
3332 || (dev->flags & IFF_ALLMULTI)) {
3334 MACvSelectPage1(pDevice->PortOffset);
3335 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, 0xffffffff);
3336 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0 + 4, 0xffffffff);
3337 MACvSelectPage0(pDevice->PortOffset);
3338 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
3341 memset(mc_filter, 0, sizeof(mc_filter));
3343 for (i = 0, mclist = dev->mc_list; mclist && i < *(dev->mc_count);
3344 i++, mclist = mclist->next) {
3346 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
3347 i++, mclist = mclist->next) {
3349 int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
3350 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
3352 MACvSelectPage1(pDevice->PortOffset);
3353 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, mc_filter[0]);
3354 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0 + 4, mc_filter[1]);
3355 MACvSelectPage0(pDevice->PortOffset);
3356 pDevice->byRxMode &= ~(RCR_UNICAST);
3357 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
3360 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
3361 // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
3362 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
3363 pDevice->byRxMode &= ~(RCR_UNICAST);
3366 VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byRxMode);
3367 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode = %x\n", pDevice->byRxMode );
3373 struct net_device_stats *__device_get_stats(HANDLE pExDevice) {
3374 PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
3375 PSDevice pDevice = (PSDevice)(pDevice_info->pWDevice);
3378 static struct net_device_stats *device_get_stats(struct net_device *dev) {
3379 PSDevice pDevice=(PSDevice) netdev_priv(dev);
3382 return &pDevice->stats;
3388 int __device_ioctl(HANDLE pExDevice, struct ifreq *rq, int cmd) {
3389 PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
3390 struct net_device *dev = pDevice_info->dev;
3391 PSDevice pDevice = (PSDevice)(pDevice_info->pWDevice);
3395 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
3396 PSDevice pDevice = (PSDevice)netdev_priv(dev);
3400 struct iwreq *wrq = (struct iwreq *) rq;
3403 PSMgmtObject pMgmt = pDevice->pMgmt;
3407 if (pMgmt == NULL) {
3415 //#if WIRELESS_EXT < 13
3418 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
3421 case SIOCGIWNWID: //0x8b03 support
3422 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3423 rc = iwctl_giwnwid(dev, NULL, &(wrq->u.nwid), NULL);
3429 // Set frequency/channel
3431 rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
3434 // Get frequency/channel
3436 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
3439 // Set desired network name (ESSID)
3443 char essid[IW_ESSID_MAX_SIZE+1];
3444 if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
3448 if (copy_from_user(essid, wrq->u.essid.pointer,
3449 wrq->u.essid.length)) {
3453 rc = iwctl_siwessid(dev, NULL,
3454 &(wrq->u.essid), essid);
3459 // Get current network name (ESSID)
3463 char essid[IW_ESSID_MAX_SIZE+1];
3464 if (wrq->u.essid.pointer)
3465 rc = iwctl_giwessid(dev, NULL,
3466 &(wrq->u.essid), essid);
3467 if (copy_to_user(wrq->u.essid.pointer,
3469 wrq->u.essid.length) )
3476 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
3480 // Get current Access Point (BSSID)
3482 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
3486 // Set desired station name
3488 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
3492 // Get current station name
3494 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
3498 // Set the desired bit-rate
3500 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
3503 // Get the current bit-rate
3506 rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
3509 // Set the desired RTS threshold
3512 rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
3515 // Get the current RTS threshold
3518 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
3521 // Set the desired fragmentation threshold
3524 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
3527 // Get the current fragmentation threshold
3530 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
3533 // Set mode of operation
3535 rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
3538 // Get mode of operation
3540 rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
3543 // Set WEP keys and mode
3546 char abyKey[WLAN_WEP232_KEYLEN];
3548 if (wrq->u.encoding.pointer) {
3551 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
3555 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
3556 if (copy_from_user(abyKey,
3557 wrq->u.encoding.pointer,
3558 wrq->u.encoding.length)) {
3562 } else if (wrq->u.encoding.length != 0) {
3566 rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
3570 // Get the WEP keys and mode
3573 if (!capable(CAP_NET_ADMIN)) {
3578 char abyKey[WLAN_WEP232_KEYLEN];
3580 rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
3582 if (wrq->u.encoding.pointer) {
3583 if (copy_to_user(wrq->u.encoding.pointer,
3585 wrq->u.encoding.length))
3591 #if WIRELESS_EXT > 9
3592 // Get the current Tx-Power
3594 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
3599 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
3603 #endif // WIRELESS_EXT > 9
3605 #if WIRELESS_EXT > 10
3608 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
3613 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
3616 #endif // WIRELESS_EXT > 10
3618 // Get range of parameters
3622 struct iw_range range;
3624 rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *) &range);
3625 if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
3633 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
3639 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
3645 rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
3649 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
3655 char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
3657 if (wrq->u.data.pointer) {
3658 rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
3660 if (copy_to_user(wrq->u.data.pointer,
3662 (wrq->u.data.length * (sizeof(struct sockaddr) + sizeof(struct iw_quality)))
3675 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
3682 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
3686 #endif // WIRELESS_SPY
3689 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
3692 if(wrq->u.data.pointer) {
3693 wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
3695 if(copy_to_user(wrq->u.data.pointer,
3696 (u_char *) iwctl_private_args,
3697 sizeof(iwctl_private_args)))
3704 //#endif // WIRELESS_EXT < 13
3705 //2008-0409-07, <Add> by Einsn Liu
3706 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3708 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH \n");
3709 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
3713 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
3714 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
3718 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
3719 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3723 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
3724 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3727 case SIOCSIWENCODEEXT:
3729 char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
3730 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
3731 if(wrq->u.encoding.pointer){
3732 memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1);
3733 if(wrq->u.encoding.length > (sizeof(struct iw_encode_ext)+ MAX_KEY_LEN)){
3737 if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
3741 }else if(wrq->u.encoding.length != 0){
3745 rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
3749 case SIOCGIWENCODEEXT:
3750 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
3751 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
3755 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
3756 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3759 #endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3760 //End Add -- //2008-0409-07, <Add> by Einsn Liu
3762 #endif // WIRELESS_EXT
3764 case IOCTL_CMD_TEST:
3766 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
3772 pReq = (PSCmdRequest)rq;
3773 pReq->wResult = MAGIC_CODE;
3779 if((((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_EVT) &&
3780 !(pDevice->flags & DEVICE_FLAGS_OPENED))
3782 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
3783 (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
3792 if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
3795 rc = private_ioctl(pDevice, rq);
3796 clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
3799 case IOCTL_CMD_HOSTAPD:
3802 #if WIRELESS_EXT > 8
3803 rc = hostap_ioctl(pDevice, &wrq->u.data);
3804 #else // WIRELESS_EXT > 8
3805 rc = hostap_ioctl(pDevice, (struct iw_point *) &wrq->u.data);
3806 #endif // WIRELESS_EXT > 8
3811 #if WIRELESS_EXT > 8
3812 rc = wpa_ioctl(pDevice, &wrq->u.data);
3813 #else // WIRELESS_EXT > 8
3814 rc = wpa_ioctl(pDevice, (struct iw_point *) &wrq->u.data);
3815 #endif // WIRELESS_EXT > 8
3819 return ethtool_ioctl(dev, (void *) rq->ifr_data);
3820 // All other calls are currently unsupported
3824 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
3829 if (pDevice->bCommit) {
3830 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
3831 netif_stop_queue(pDevice->dev);
3832 spin_lock_irq(&pDevice->lock);
3833 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RUN_AP, NULL);
3834 spin_unlock_irq(&pDevice->lock);
3837 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
3838 spin_lock_irq(&pDevice->lock);
3839 pDevice->bLinkPass = FALSE;
3840 memset(pMgmt->abyCurrBSSID, 0, 6);
3841 pMgmt->eCurrState = WMAC_STATE_IDLE;
3842 netif_stop_queue(pDevice->dev);
3843 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3844 pMgmt->eScanType = WMAC_SCAN_ACTIVE;
3845 if(pDevice->bWPASuppWextEnabled !=TRUE)
3847 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
3848 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, NULL);
3849 spin_unlock_irq(&pDevice->lock);
3851 pDevice->bCommit = FALSE;
3858 static int ethtool_ioctl(struct net_device *dev, void *useraddr)
3862 if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd)))
3866 case ETHTOOL_GDRVINFO: {
3867 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
3868 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
3869 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
3870 if (copy_to_user(useraddr, &info, sizeof(info)))
3880 /*------------------------------------------------------------------*/
3883 MODULE_DEVICE_TABLE(pci, device_id_table);
3885 static struct pci_driver device_driver = {
3887 id_table: device_id_table,
3888 probe: device_found1,
3889 remove: device_remove1,
3891 suspend: viawget_suspend,
3892 resume: viawget_resume,
3896 static int __init device_init_module(void)
3901 // ret=pci_module_init(&device_driver);
3902 //ret = pcie_port_service_register(&device_driver);
3903 ret = pci_register_driver(&device_driver);
3906 register_reboot_notifier(&device_notifier);
3912 static void __exit device_cleanup_module(void)
3917 unregister_reboot_notifier(&device_notifier);
3919 pci_unregister_driver(&device_driver);
3923 module_init(device_init_module);
3924 module_exit(device_cleanup_module);
3929 device_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
3931 struct pci_dev *pdev = NULL;
3936 while ((pdev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pdev)) != NULL) {
3937 if(pci_dev_driver(pdev) == &device_driver) {
3938 if (pci_get_drvdata(pdev))
3939 viawget_suspend(pdev, 3);
3947 viawget_suspend(struct pci_dev *pcid, u32 state)
3949 int power_status; // to silence the compiler
3951 PSDevice pDevice=pci_get_drvdata(pcid);
3952 PSMgmtObject pMgmt = pDevice->pMgmt;
3954 netif_stop_queue(pDevice->dev);
3955 spin_lock_irq(&pDevice->lock);
3956 pci_save_state(pcid);
3957 del_timer(&pDevice->sTimerCommand);
3958 del_timer(&pMgmt->sTimerSecondCallback);
3959 pDevice->cbFreeCmdQueue = CMD_Q_SIZE;
3960 pDevice->uCmdDequeueIdx = 0;
3961 pDevice->uCmdEnqueueIdx = 0;
3962 pDevice->bCmdRunning = FALSE;
3963 MACbShutdown(pDevice->PortOffset);
3964 MACvSaveContext(pDevice->PortOffset, pDevice->abyMacContext);
3965 pDevice->bLinkPass = FALSE;
3966 memset(pMgmt->abyCurrBSSID, 0, 6);
3967 pMgmt->eCurrState = WMAC_STATE_IDLE;
3968 pci_disable_device(pcid);
3969 power_status = pci_set_power_state(pcid, state);
3970 spin_unlock_irq(&pDevice->lock);
3975 viawget_resume(struct pci_dev *pcid)
3977 PSDevice pDevice=pci_get_drvdata(pcid);
3978 PSMgmtObject pMgmt = pDevice->pMgmt;
3979 int power_status; // to silence the compiler
3982 power_status = pci_set_power_state(pcid, 0);
3983 power_status = pci_enable_wake(pcid, 0, 0);
3984 pci_restore_state(pcid);
3985 if (netif_running(pDevice->dev)) {
3986 spin_lock_irq(&pDevice->lock);
3987 MACvRestoreContext(pDevice->PortOffset, pDevice->abyMacContext);
3988 device_init_registers(pDevice, DEVICE_INIT_DXPL);
3989 if (pMgmt->sNodeDBTable[0].bActive == TRUE) { // Assoc with BSS
3990 pMgmt->sNodeDBTable[0].bActive = FALSE;
3991 pDevice->bLinkPass = FALSE;
3992 if(pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
3993 // In Adhoc, BSS state set back to started.
3994 pMgmt->eCurrState = WMAC_STATE_STARTED;
3997 pMgmt->eCurrMode = WMAC_MODE_STANDBY;
3998 pMgmt->eCurrState = WMAC_STATE_IDLE;
4001 init_timer(&pMgmt->sTimerSecondCallback);
4002 init_timer(&pDevice->sTimerCommand);
4003 MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
4004 BSSvClearBSSList((HANDLE)pDevice, pDevice->bLinkPass);
4005 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
4006 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, NULL);
4007 spin_unlock_irq(&pDevice->lock);
4014 #endif //#ifndef PRIVATE_OBJ
4019 int __device_hw_reset(HANDLE pExDevice){
4020 PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
4022 return MACbSoftwareReset(pDevice_info->port_offset);
4026 int __device_hw_init(HANDLE pExDevice){
4027 PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
4030 pDevice = (PSDevice)kmalloc(sizeof(DEVICE_INFO), (int)GFP_ATOMIC);
4031 if (pDevice == NULL)
4034 memset(pDevice, 0, sizeof(DEVICE_INFO));
4035 pDevice_info->pWDevice = pDevice;
4036 pDevice->PortOffset = pDevice_info->port_offset;
4037 pDevice->dev = pDevice_info->dev;
4038 pDevice->pcid = pDevice_info->pcid;
4039 pDevice->chip_id = pDevice_info->chip_id;
4040 pDevice->memaddr = pDevice_info->mem_addr;
4041 pDevice->ioaddr = pDevice_info->io_addr;
4042 pDevice->io_size = pDevice_info->io_size;
4043 pDevice->nTxQueues = pDevice_info->nTxQueues;
4044 pDevice->multicast_limit = pDevice_info->multicast_limit;
4045 pDevice->sMgmtObj.pAdapter = (PVOID)pDevice;
4046 pDevice->pMgmt = &(pDevice->sMgmtObj);
4047 MACvInitialize(pDevice->PortOffset);
4048 device_get_options(pDevice, 0 , pDevice_info->dev->name);
4049 device_set_options(pDevice);
4050 pDevice->sOpts.flags &= pDevice_info->flags;
4051 pDevice->flags = pDevice->sOpts.flags | (pDevice_info->flags & 0xFF000000UL);
4052 spin_lock_init(&(pDevice->lock));
4058 void __device_read_mac(HANDLE pExDevice, PBYTE dev_addr){
4059 PSDevice_info pDevice_info = (PSDevice_info)pExDevice;
4060 PSDevice pDevice = (PSDevice)(pDevice_info->pWDevice);
4062 MACvReadEtherAddress(pDevice->PortOffset, dev_addr);