2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 * Purpose: driver entry for initial, open, close, tx and rx.
29 * vt6655_probe - module initial (insmod) driver entry
30 * vt6655_remove - module remove entry
31 * vt6655_init_info - device structure resource allocation function
32 * device_free_info - device structure resource free function
33 * device_get_pci_info - get allocated pci io/mem resource
34 * device_print_info - print out resource
35 * device_open - allocate dma/descripter resource & initial mac/bbp function
36 * device_xmit - asynchrous data tx function
37 * device_intr - interrupt handle function
38 * device_set_multi - set mac filter
39 * device_ioctl - ioctl entry
40 * device_close - shutdown mac/bbp & free dma/descripter resource
41 * device_rx_srv - rx service function
42 * device_receive_frame - rx data function
43 * device_alloc_rx_buf - rx buffer pre-allocated function
44 * device_alloc_frag_buf - rx fragement pre-allocated function
45 * device_free_tx_buf - free tx buffer function
46 * device_free_frag_buf- free de-fragement buffer
47 * device_dma0_tx_80211- tx 802.11 frame via dma0
48 * device_dma0_xmit- tx PS bufferred frame via dma0
49 * device_init_rd0_ring- initial rd dma0 ring
50 * device_init_rd1_ring- initial rd dma1 ring
51 * device_init_td0_ring- initial tx dma0 ring buffer
52 * device_init_td1_ring- initial tx dma1 ring buffer
53 * device_init_registers- initial MAC & BBP & RF internal registers.
54 * device_init_rings- initial tx/rx ring buffer
55 * device_init_defrag_cb- initial & allocate de-fragement buffer.
56 * device_free_rings- free all allocated ring buffer
57 * device_tx_srv- tx interrupt service function
86 #include <linux/delay.h>
87 #include <linux/kthread.h>
88 #include <linux/slab.h>
90 /*--------------------- Static Definitions -------------------------*/
91 //static int msglevel =MSG_LEVEL_DEBUG;
92 static int msglevel = MSG_LEVEL_INFO;
95 // Define module options
97 MODULE_AUTHOR("VIA Networking Technologies, Inc., <lyndonchen@vntek.com.tw>");
98 MODULE_LICENSE("GPL");
99 MODULE_DESCRIPTION("VIA Networking Solomon-A/B/G Wireless LAN Adapter Driver");
101 static int mlme_kill;
102 //static struct task_struct * mlme_task;
104 #define DEVICE_PARAM(N, D)
106 static const int N[MAX_UINTS]=OPTION_DEFAULT;\
107 MODULE_PARM(N, "1-" __MODULE_STRING(MAX_UINTS) "i");\
108 MODULE_PARM_DESC(N, D);
111 #define RX_DESC_MIN0 16
112 #define RX_DESC_MAX0 128
113 #define RX_DESC_DEF0 32
114 DEVICE_PARAM(RxDescriptors0, "Number of receive descriptors0");
116 #define RX_DESC_MIN1 16
117 #define RX_DESC_MAX1 128
118 #define RX_DESC_DEF1 32
119 DEVICE_PARAM(RxDescriptors1, "Number of receive descriptors1");
121 #define TX_DESC_MIN0 16
122 #define TX_DESC_MAX0 128
123 #define TX_DESC_DEF0 32
124 DEVICE_PARAM(TxDescriptors0, "Number of transmit descriptors0");
126 #define TX_DESC_MIN1 16
127 #define TX_DESC_MAX1 128
128 #define TX_DESC_DEF1 64
129 DEVICE_PARAM(TxDescriptors1, "Number of transmit descriptors1");
131 #define IP_ALIG_DEF 0
132 /* IP_byte_align[] is used for IP header unsigned long byte aligned
133 0: indicate the IP header won't be unsigned long byte aligned.(Default) .
134 1: indicate the IP header will be unsigned long byte aligned.
135 In some environment, the IP header should be unsigned long byte aligned,
136 or the packet will be droped when we receive it. (eg: IPVS)
138 DEVICE_PARAM(IP_byte_align, "Enable IP header dword aligned");
140 #define INT_WORKS_DEF 20
141 #define INT_WORKS_MIN 10
142 #define INT_WORKS_MAX 64
144 DEVICE_PARAM(int_works, "Number of packets per interrupt services");
146 #define CHANNEL_MIN 1
147 #define CHANNEL_MAX 14
148 #define CHANNEL_DEF 6
150 DEVICE_PARAM(Channel, "Channel number");
152 /* PreambleType[] is the preamble length used for transmit.
153 0: indicate allows long preamble type
154 1: indicate allows short preamble type
157 #define PREAMBLE_TYPE_DEF 1
159 DEVICE_PARAM(PreambleType, "Preamble Type");
161 #define RTS_THRESH_MIN 512
162 #define RTS_THRESH_MAX 2347
163 #define RTS_THRESH_DEF 2347
165 DEVICE_PARAM(RTSThreshold, "RTS threshold");
167 #define FRAG_THRESH_MIN 256
168 #define FRAG_THRESH_MAX 2346
169 #define FRAG_THRESH_DEF 2346
171 DEVICE_PARAM(FragThreshold, "Fragmentation threshold");
173 #define DATA_RATE_MIN 0
174 #define DATA_RATE_MAX 13
175 #define DATA_RATE_DEF 13
177 0: indicate 1 Mbps 0x02
178 1: indicate 2 Mbps 0x04
179 2: indicate 5.5 Mbps 0x0B
180 3: indicate 11 Mbps 0x16
181 4: indicate 6 Mbps 0x0c
182 5: indicate 9 Mbps 0x12
183 6: indicate 12 Mbps 0x18
184 7: indicate 18 Mbps 0x24
185 8: indicate 24 Mbps 0x30
186 9: indicate 36 Mbps 0x48
187 10: indicate 48 Mbps 0x60
188 11: indicate 54 Mbps 0x6c
189 12: indicate 72 Mbps 0x90
190 13: indicate auto rate
193 DEVICE_PARAM(ConnectionRate, "Connection data rate");
195 #define OP_MODE_DEF 0
197 DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode ");
199 /* OpMode[] is used for transmit.
200 0: indicate infrastruct mode used
201 1: indicate adhoc mode used
202 2: indicate AP mode used
206 0: indicate disable power saving mode
207 1: indicate enable power saving mode
210 #define PS_MODE_DEF 0
212 DEVICE_PARAM(PSMode, "Power saving mode");
214 #define SHORT_RETRY_MIN 0
215 #define SHORT_RETRY_MAX 31
216 #define SHORT_RETRY_DEF 8
218 DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");
220 #define LONG_RETRY_MIN 0
221 #define LONG_RETRY_MAX 15
222 #define LONG_RETRY_DEF 4
224 DEVICE_PARAM(LongRetryLimit, "long frame retry limits");
226 /* BasebandType[] baseband type selected
227 0: indicate 802.11a type
228 1: indicate 802.11b type
229 2: indicate 802.11g type
231 #define BBP_TYPE_MIN 0
232 #define BBP_TYPE_MAX 2
233 #define BBP_TYPE_DEF 2
235 DEVICE_PARAM(BasebandType, "baseband type");
238 0: indicate disable 802.11h
239 1: indicate enable 802.11h
242 #define X80211h_MODE_DEF 0
244 DEVICE_PARAM(b80211hEnable, "802.11h mode");
247 0: indicate disable 802.11h
248 1: indicate enable 802.11h
251 #define DIVERSITY_ANT_DEF 0
253 DEVICE_PARAM(bDiversityANTEnable, "ANT diversity mode");
256 // Static vars definitions
259 static int device_nics = 0;
260 static PSDevice pDevice_Infos = NULL;
261 static struct net_device *root_device_dev = NULL;
263 static CHIP_INFO chip_info_table[] = {
264 { VT3253, "VIA Networking Solomon-A/B/G Wireless LAN Adapter ",
265 256, 1, DEVICE_FLAGS_IP_ALIGN|DEVICE_FLAGS_TX_ALIGN },
269 DEFINE_PCI_DEVICE_TABLE(vt6655_pci_id_table) = {
270 { PCI_VDEVICE(VIA, 0x3253), (kernel_ulong_t)chip_info_table},
274 /*--------------------- Static Functions --------------------------*/
276 static int vt6655_probe(struct pci_dev *pcid, const struct pci_device_id *ent);
277 static void vt6655_init_info(struct pci_dev *pcid, PSDevice *ppDevice, PCHIP_INFO);
278 static void device_free_info(PSDevice pDevice);
279 static bool device_get_pci_info(PSDevice, struct pci_dev *pcid);
280 static void device_print_info(PSDevice pDevice);
281 static struct net_device_stats *device_get_stats(struct net_device *dev);
282 static void device_init_diversity_timer(PSDevice pDevice);
283 static int device_open(struct net_device *dev);
284 static int device_xmit(struct sk_buff *skb, struct net_device *dev);
285 static irqreturn_t device_intr(int irq, void *dev_instance);
286 static void device_set_multi(struct net_device *dev);
287 static int device_close(struct net_device *dev);
288 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
291 static int device_notify_reboot(struct notifier_block *, unsigned long event, void *ptr);
292 static int viawget_suspend(struct pci_dev *pcid, pm_message_t state);
293 static int viawget_resume(struct pci_dev *pcid);
294 struct notifier_block device_notifier = {
295 .notifier_call = device_notify_reboot,
301 static void device_init_rd0_ring(PSDevice pDevice);
302 static void device_init_rd1_ring(PSDevice pDevice);
303 static void device_init_defrag_cb(PSDevice pDevice);
304 static void device_init_td0_ring(PSDevice pDevice);
305 static void device_init_td1_ring(PSDevice pDevice);
307 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev);
308 //2008-0714<Add>by Mike Liu
309 static bool device_release_WPADEV(PSDevice pDevice);
311 static int ethtool_ioctl(struct net_device *dev, void *useraddr);
312 static int device_rx_srv(PSDevice pDevice, unsigned int uIdx);
313 static int device_tx_srv(PSDevice pDevice, unsigned int uIdx);
314 static bool device_alloc_rx_buf(PSDevice pDevice, PSRxDesc pDesc);
315 static void device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType);
316 static void device_free_tx_buf(PSDevice pDevice, PSTxDesc pDesc);
317 static void device_free_td0_ring(PSDevice pDevice);
318 static void device_free_td1_ring(PSDevice pDevice);
319 static void device_free_rd0_ring(PSDevice pDevice);
320 static void device_free_rd1_ring(PSDevice pDevice);
321 static void device_free_rings(PSDevice pDevice);
322 static void device_free_frag_buf(PSDevice pDevice);
323 static int Config_FileGetParameter(unsigned char *string,
324 unsigned char *dest, unsigned char *source);
326 /*--------------------- Export Variables --------------------------*/
328 /*--------------------- Export Functions --------------------------*/
330 static char *get_chip_name(int chip_id)
333 for (i = 0; chip_info_table[i].name != NULL; i++)
334 if (chip_info_table[i].chip_id == chip_id)
336 return chip_info_table[i].name;
339 static void vt6655_remove(struct pci_dev *pcid)
341 PSDevice pDevice = pci_get_drvdata(pcid);
345 device_free_info(pDevice);
350 device_set_int_opt(int *opt, int val, int min, int max, int def,char* name,char* devname) {
353 else if (val<min || val>max) {
354 DBG_PRT(MSG_LEVEL_INFO, KERN_NOTICE "%s: the value of parameter %s is invalid, the valid range is (%d-%d)\n" ,
355 devname,name, min,max);
358 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: set value of parameter %s to %d\n",
365 device_set_bool_opt(unsigned int *opt, int val,bool def,u32 flag, char* name,char* devname) {
368 *opt|=(def ? flag : 0);
369 else if (val<0 || val>1) {
370 DBG_PRT(MSG_LEVEL_INFO, KERN_NOTICE
371 "%s: the value of parameter %s is invalid, the valid range is (0-1)\n",devname,name);
372 *opt|=(def ? flag : 0);
374 DBG_PRT(MSG_LEVEL_INFO, KERN_NOTICE "%s: set parameter %s to %s\n",
375 devname,name , val ? "true" : "false");
376 *opt|=(val ? flag : 0);
380 static void device_get_options(PSDevice pDevice, int index, char *devname)
382 POPTIONS pOpts = &(pDevice->sOpts);
384 pOpts->nRxDescs0 = RX_DESC_DEF0;
385 pOpts->nRxDescs1 = RX_DESC_DEF1;
386 pOpts->nTxDescs[0] = TX_DESC_DEF0;
387 pOpts->nTxDescs[1] = TX_DESC_DEF1;
388 pOpts->flags |= DEVICE_FLAGS_IP_ALIGN;
389 pOpts->int_works = INT_WORKS_DEF;
390 pOpts->rts_thresh = RTS_THRESH_DEF;
391 pOpts->frag_thresh = FRAG_THRESH_DEF;
392 pOpts->data_rate = DATA_RATE_DEF;
393 pOpts->channel_num = CHANNEL_DEF;
395 pOpts->flags |= DEVICE_FLAGS_PREAMBLE_TYPE;
396 pOpts->flags |= DEVICE_FLAGS_OP_MODE;
397 //pOpts->flags|=DEVICE_FLAGS_PS_MODE;
398 pOpts->short_retry = SHORT_RETRY_DEF;
399 pOpts->long_retry = LONG_RETRY_DEF;
400 pOpts->bbp_type = BBP_TYPE_DEF;
401 pOpts->flags |= DEVICE_FLAGS_80211h_MODE;
402 pOpts->flags |= DEVICE_FLAGS_DiversityANT;
406 device_set_options(PSDevice pDevice) {
407 unsigned char abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
408 unsigned char abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
409 unsigned char abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
411 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
412 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
413 memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, ETH_ALEN);
415 pDevice->uChannel = pDevice->sOpts.channel_num;
416 pDevice->wRTSThreshold = pDevice->sOpts.rts_thresh;
417 pDevice->wFragmentationThreshold = pDevice->sOpts.frag_thresh;
418 pDevice->byShortRetryLimit = pDevice->sOpts.short_retry;
419 pDevice->byLongRetryLimit = pDevice->sOpts.long_retry;
420 pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME;
421 pDevice->byShortPreamble = (pDevice->sOpts.flags & DEVICE_FLAGS_PREAMBLE_TYPE) ? 1 : 0;
422 pDevice->byOpMode = (pDevice->sOpts.flags & DEVICE_FLAGS_OP_MODE) ? 1 : 0;
423 pDevice->ePSMode = (pDevice->sOpts.flags & DEVICE_FLAGS_PS_MODE) ? 1 : 0;
424 pDevice->b11hEnable = (pDevice->sOpts.flags & DEVICE_FLAGS_80211h_MODE) ? 1 : 0;
425 pDevice->bDiversityRegCtlON = (pDevice->sOpts.flags & DEVICE_FLAGS_DiversityANT) ? 1 : 0;
426 pDevice->uConnectionRate = pDevice->sOpts.data_rate;
427 if (pDevice->uConnectionRate < RATE_AUTO) pDevice->bFixRate = true;
428 pDevice->byBBType = pDevice->sOpts.bbp_type;
429 pDevice->byPacketType = pDevice->byBBType;
432 pDevice->byAutoFBCtrl = AUTO_FB_0;
433 //pDevice->byAutoFBCtrl = AUTO_FB_1;
435 pDevice->bUpdateBBVGA = true;
436 pDevice->byFOETuning = 0;
437 pDevice->wCTSDuration = 0;
438 pDevice->byPreambleType = 0;
440 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " uChannel= %d\n", (int)pDevice->uChannel);
441 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " byOpMode= %d\n", (int)pDevice->byOpMode);
442 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " ePSMode= %d\n", (int)pDevice->ePSMode);
443 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " wRTSThreshold= %d\n", (int)pDevice->wRTSThreshold);
444 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " byShortRetryLimit= %d\n", (int)pDevice->byShortRetryLimit);
445 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " byLongRetryLimit= %d\n", (int)pDevice->byLongRetryLimit);
446 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " byPreambleType= %d\n", (int)pDevice->byPreambleType);
447 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " byShortPreamble= %d\n", (int)pDevice->byShortPreamble);
448 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " uConnectionRate= %d\n", (int)pDevice->uConnectionRate);
449 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " byBBType= %d\n", (int)pDevice->byBBType);
450 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " pDevice->b11hEnable= %d\n", (int)pDevice->b11hEnable);
451 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " pDevice->bDiversityRegCtlON= %d\n", (int)pDevice->bDiversityRegCtlON);
454 static void s_vCompleteCurrentMeasure(PSDevice pDevice, unsigned char byResult)
457 unsigned long dwDuration = 0;
458 unsigned char byRPI0 = 0;
460 for (ii = 1; ii < 8; ii++) {
461 pDevice->dwRPIs[ii] *= 255;
462 dwDuration |= *((unsigned short *)(pDevice->pCurrMeasureEID->sReq.abyDuration));
464 pDevice->dwRPIs[ii] /= dwDuration;
465 pDevice->abyRPIs[ii] = (unsigned char)pDevice->dwRPIs[ii];
466 byRPI0 += pDevice->abyRPIs[ii];
468 pDevice->abyRPIs[0] = (0xFF - byRPI0);
470 if (pDevice->uNumOfMeasureEIDs == 0) {
471 VNTWIFIbMeasureReport(pDevice->pMgmt,
473 pDevice->pCurrMeasureEID,
476 pDevice->byCCAFraction,
480 VNTWIFIbMeasureReport(pDevice->pMgmt,
482 pDevice->pCurrMeasureEID,
485 pDevice->byCCAFraction,
488 CARDbStartMeasure(pDevice, pDevice->pCurrMeasureEID++, pDevice->uNumOfMeasureEIDs);
493 // Initialisation of MAC & BBP registers
496 static void device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType)
499 unsigned char byValue;
500 unsigned char byValue1;
501 unsigned char byCCKPwrdBm = 0;
502 unsigned char byOFDMPwrdBm = 0;
504 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
505 MACbShutdown(pDevice->PortOffset);
506 BBvSoftwareReset(pDevice->PortOffset);
508 if ((InitType == DEVICE_INIT_COLD) ||
509 (InitType == DEVICE_INIT_DXPL)) {
510 // Do MACbSoftwareReset in MACvInitialize
511 MACbSoftwareReset(pDevice->PortOffset);
513 pDevice->bCCK = true;
514 pDevice->bAES = false;
515 pDevice->bProtectMode = false; //Only used in 11g type, sync with ERP IE
516 pDevice->bNonERPPresent = false;
517 pDevice->bBarkerPreambleMd = false;
518 pDevice->wCurrentRate = RATE_1M;
519 pDevice->byTopOFDMBasicRate = RATE_24M;
520 pDevice->byTopCCKBasicRate = RATE_1M;
522 pDevice->byRevId = 0; //Target to IF pin while programming to RF chip.
525 MACvInitialize(pDevice->PortOffset);
528 VNSvInPortB(pDevice->PortOffset + MAC_REG_LOCALID, &(pDevice->byLocalID));
530 spin_lock_irq(&pDevice->lock);
531 SROMvReadAllContents(pDevice->PortOffset, pDevice->abyEEPROM);
533 spin_unlock_irq(&pDevice->lock);
537 pDevice->byMinChannel = 1;
538 pDevice->byMaxChannel = CB_MAX_CHANNEL;
541 byValue = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ANTENNA);
542 if (byValue & EEP_ANTINV)
543 pDevice->bTxRxAntInv = true;
545 pDevice->bTxRxAntInv = false;
547 byValue &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
548 if (byValue == 0) // if not set default is All
549 byValue = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
551 pDevice->ulDiversityNValue = 100*260;//100*SROMbyReadEmbedded(pDevice->PortOffset, 0x51);
552 pDevice->ulDiversityMValue = 100*16;//SROMbyReadEmbedded(pDevice->PortOffset, 0x52);
553 pDevice->byTMax = 1;//SROMbyReadEmbedded(pDevice->PortOffset, 0x53);
554 pDevice->byTMax2 = 4;//SROMbyReadEmbedded(pDevice->PortOffset, 0x54);
555 pDevice->ulSQ3TH = 0;//(unsigned long) SROMbyReadEmbedded(pDevice->PortOffset, 0x55);
556 pDevice->byTMax3 = 64;//SROMbyReadEmbedded(pDevice->PortOffset, 0x56);
558 if (byValue == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
559 pDevice->byAntennaCount = 2;
560 pDevice->byTxAntennaMode = ANT_B;
561 pDevice->dwTxAntennaSel = 1;
562 pDevice->dwRxAntennaSel = 1;
563 if (pDevice->bTxRxAntInv == true)
564 pDevice->byRxAntennaMode = ANT_A;
566 pDevice->byRxAntennaMode = ANT_B;
567 // chester for antenna
568 byValue1 = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ANTENNA);
569 if ((byValue1 & 0x08) == 0)
570 pDevice->bDiversityEnable = false;//SROMbyReadEmbedded(pDevice->PortOffset, 0x50);
572 pDevice->bDiversityEnable = true;
574 pDevice->bDiversityEnable = false;
575 pDevice->byAntennaCount = 1;
576 pDevice->dwTxAntennaSel = 0;
577 pDevice->dwRxAntennaSel = 0;
578 if (byValue & EEP_ANTENNA_AUX) {
579 pDevice->byTxAntennaMode = ANT_A;
580 if (pDevice->bTxRxAntInv == true)
581 pDevice->byRxAntennaMode = ANT_B;
583 pDevice->byRxAntennaMode = ANT_A;
585 pDevice->byTxAntennaMode = ANT_B;
586 if (pDevice->bTxRxAntInv == true)
587 pDevice->byRxAntennaMode = ANT_A;
589 pDevice->byRxAntennaMode = ANT_B;
592 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "bDiversityEnable=[%d],NValue=[%d],MValue=[%d],TMax=[%d],TMax2=[%d]\n",
593 pDevice->bDiversityEnable, (int)pDevice->ulDiversityNValue, (int)pDevice->ulDiversityMValue, pDevice->byTMax, pDevice->byTMax2);
595 //#ifdef ZoneType_DefaultSetting
596 //2008-8-4 <add> by chester
598 pDevice->byOriginalZonetype = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
599 zonetype = Config_FileOperation(pDevice, false, NULL);
600 if (zonetype >= 0) { //read zonetype file ok!
601 if ((zonetype == 0) &&
602 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] != 0x00)) { //for USA
603 pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0;
604 pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0B;
605 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Init Zone Type :USA\n");
606 } else if ((zonetype == 1) &&
607 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] != 0x01)) { //for Japan
608 pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0x01;
609 pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
610 } else if ((zonetype == 2) &&
611 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] != 0x02)) { //for Europe
612 pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0x02;
613 pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
614 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Init Zone Type :Europe\n");
618 if (zonetype != pDevice->abyEEPROM[EEP_OFS_ZONETYPE])
619 printk("zonetype in file[%02x] mismatch with in EEPROM[%02x]\n", zonetype, pDevice->abyEEPROM[EEP_OFS_ZONETYPE]);
621 printk("Read Zonetype file success,use default zonetype setting[%02x]\n", zonetype);
624 printk("Read Zonetype file fail,use default zonetype setting[%02x]\n", SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ZONETYPE));
627 pDevice->byRFType = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RFTYPE);
629 if ((pDevice->byRFType & RF_EMU) != 0) {
630 // force change RevID for VT3253 emu
631 pDevice->byRevId = 0x80;
634 pDevice->byRFType &= RF_MASK;
635 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRFType = %x\n", pDevice->byRFType);
637 if (pDevice->bZoneRegExist == false) {
638 pDevice->byZoneType = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
640 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byZoneType = %x\n", pDevice->byZoneType);
645 //Get Desire Power Value
646 pDevice->byCurPwr = 0xFF;
647 pDevice->byCCKPwr = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_PWR_CCK);
648 pDevice->byOFDMPwrG = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_PWR_OFDMG);
649 //byCCKPwrdBm = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_CCK_PWR_dBm);
651 //byOFDMPwrdBm = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_OFDM_PWR_dBm);
655 for (ii = 0; ii < CB_MAX_CHANNEL_24G; ii++) {
656 pDevice->abyCCKPwrTbl[ii + 1] = SROMbyReadEmbedded(pDevice->PortOffset, (unsigned char)(ii + EEP_OFS_CCK_PWR_TBL));
657 if (pDevice->abyCCKPwrTbl[ii + 1] == 0) {
658 pDevice->abyCCKPwrTbl[ii+1] = pDevice->byCCKPwr;
660 pDevice->abyOFDMPwrTbl[ii + 1] = SROMbyReadEmbedded(pDevice->PortOffset, (unsigned char)(ii + EEP_OFS_OFDM_PWR_TBL));
661 if (pDevice->abyOFDMPwrTbl[ii + 1] == 0) {
662 pDevice->abyOFDMPwrTbl[ii + 1] = pDevice->byOFDMPwrG;
664 pDevice->abyCCKDefaultPwr[ii + 1] = byCCKPwrdBm;
665 pDevice->abyOFDMDefaultPwr[ii + 1] = byOFDMPwrdBm;
667 //2008-8-4 <add> by chester
668 //recover 12,13 ,14channel for EUROPE by 11 channel
669 if (((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) ||
670 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe)) &&
671 (pDevice->byOriginalZonetype == ZoneType_USA)) {
672 for (ii = 11; ii < 14; ii++) {
673 pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
674 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];
679 // Load OFDM A Power Table
680 for (ii = 0; ii < CB_MAX_CHANNEL_5G; ii++) { //RobertYu:20041224, bug using CB_MAX_CHANNEL
681 pDevice->abyOFDMPwrTbl[ii + CB_MAX_CHANNEL_24G + 1] = SROMbyReadEmbedded(pDevice->PortOffset, (unsigned char)(ii + EEP_OFS_OFDMA_PWR_TBL));
682 pDevice->abyOFDMDefaultPwr[ii + CB_MAX_CHANNEL_24G + 1] = SROMbyReadEmbedded(pDevice->PortOffset, (unsigned char)(ii + EEP_OFS_OFDMA_PWR_dBm));
684 init_channel_table((void *)pDevice);
686 if (pDevice->byLocalID > REV_ID_VT3253_B1) {
687 MACvSelectPage1(pDevice->PortOffset);
688 VNSvOutPortB(pDevice->PortOffset + MAC_REG_MSRCTL + 1, (MSRCTL1_TXPWR | MSRCTL1_CSAPAREN));
689 MACvSelectPage0(pDevice->PortOffset);
692 // use relative tx timeout and 802.11i D4
693 MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_CFG, (CFG_TKIPOPT | CFG_NOTXTIMEOUT));
695 // set performance parameter by registry
696 MACvSetShortRetryLimit(pDevice->PortOffset, pDevice->byShortRetryLimit);
697 MACvSetLongRetryLimit(pDevice->PortOffset, pDevice->byLongRetryLimit);
700 VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
701 // enable TSF counter
702 VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
704 // initialize BBP registers
705 BBbVT3253Init(pDevice);
707 if (pDevice->bUpdateBBVGA) {
708 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
709 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
710 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
712 BBvSetRxAntennaMode(pDevice->PortOffset, pDevice->byRxAntennaMode);
713 BBvSetTxAntennaMode(pDevice->PortOffset, pDevice->byTxAntennaMode);
715 pDevice->byCurrentCh = 0;
717 //pDevice->NetworkType = Ndis802_11Automode;
718 // Set BB and packet type at the same time.
719 // Set Short Slot Time, xIFS, and RSPINF.
720 if (pDevice->uConnectionRate == RATE_AUTO) {
721 pDevice->wCurrentRate = RATE_54M;
723 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
727 VNTWIFIbConfigPhyMode(pDevice->pMgmt, PHY_TYPE_11G);
728 VNTWIFIbConfigPhyMode(pDevice->pMgmt, PHY_TYPE_AUTO);
730 pDevice->bRadioOff = false;
732 pDevice->byRadioCtl = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RADIOCTL);
733 pDevice->bHWRadioOff = false;
735 if (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) {
737 MACvGPIOIn(pDevice->PortOffset, &pDevice->byGPIO);
738 //2008-4-14 <add> by chester for led issue
739 #ifdef FOR_LED_ON_NOTEBOOK
740 if (pDevice->byGPIO & GPIO0_DATA) { pDevice->bHWRadioOff = true; }
741 if (!(pDevice->byGPIO & GPIO0_DATA)) { pDevice->bHWRadioOff = false; }
744 if ((pDevice->bRadioControlOff == true)) {
745 CARDbRadioPowerOff(pDevice);
746 } else CARDbRadioPowerOn(pDevice);
748 if (((pDevice->byGPIO & GPIO0_DATA) && !(pDevice->byRadioCtl & EEP_RADIOCTL_INV)) ||
749 (!(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV))) {
750 pDevice->bHWRadioOff = true;
753 if ((pDevice->bHWRadioOff == true) || (pDevice->bRadioControlOff == true)) {
754 CARDbRadioPowerOff(pDevice);
759 pMgmt->eScanType = WMAC_SCAN_PASSIVE;
760 // get Permanent network address
761 SROMvReadEtherAddress(pDevice->PortOffset, pDevice->abyCurrentNetAddr);
762 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Network address = %pM\n",
763 pDevice->abyCurrentNetAddr);
766 CARDvSafeResetRx(pDevice);
768 CARDvSafeResetTx(pDevice);
770 if (pDevice->byLocalID <= REV_ID_VT3253_A1) {
771 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_RCR, RCR_WPAERR);
774 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
777 MACvReceive0(pDevice->PortOffset);
778 MACvReceive1(pDevice->PortOffset);
781 MACvStart(pDevice->PortOffset);
783 netif_stop_queue(pDevice->dev);
786 static void device_init_diversity_timer(PSDevice pDevice) {
787 init_timer(&pDevice->TimerSQ3Tmax1);
788 pDevice->TimerSQ3Tmax1.data = (unsigned long) pDevice;
789 pDevice->TimerSQ3Tmax1.function = (TimerFunction)TimerSQ3CallBack;
790 pDevice->TimerSQ3Tmax1.expires = RUN_AT(HZ);
792 init_timer(&pDevice->TimerSQ3Tmax2);
793 pDevice->TimerSQ3Tmax2.data = (unsigned long) pDevice;
794 pDevice->TimerSQ3Tmax2.function = (TimerFunction)TimerSQ3CallBack;
795 pDevice->TimerSQ3Tmax2.expires = RUN_AT(HZ);
797 init_timer(&pDevice->TimerSQ3Tmax3);
798 pDevice->TimerSQ3Tmax3.data = (unsigned long) pDevice;
799 pDevice->TimerSQ3Tmax3.function = (TimerFunction)TimerState1CallBack;
800 pDevice->TimerSQ3Tmax3.expires = RUN_AT(HZ);
805 static bool device_release_WPADEV(PSDevice pDevice)
807 viawget_wpa_header *wpahdr;
809 // wait_queue_head_t Set_wait;
810 //send device close to wpa_supplicnat layer
811 if (pDevice->bWPADEVUp == true) {
812 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
813 wpahdr->type = VIAWGET_DEVICECLOSE_MSG;
814 wpahdr->resp_ie_len = 0;
815 wpahdr->req_ie_len = 0;
816 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
817 pDevice->skb->dev = pDevice->wpadev;
818 skb_reset_mac_header(pDevice->skb);
819 pDevice->skb->pkt_type = PACKET_HOST;
820 pDevice->skb->protocol = htons(ETH_P_802_2);
821 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
822 netif_rx(pDevice->skb);
823 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
825 //wait release WPADEV
826 // init_waitqueue_head(&Set_wait);
827 // wait_event_timeout(Set_wait, ((pDevice->wpadev==NULL)&&(pDevice->skb == NULL)),5*HZ); //1s wait
828 while ((pDevice->bWPADEVUp == true)) {
829 set_current_state(TASK_UNINTERRUPTIBLE);
830 schedule_timeout(HZ / 20); //wait 50ms
839 static const struct net_device_ops device_netdev_ops = {
840 .ndo_open = device_open,
841 .ndo_stop = device_close,
842 .ndo_do_ioctl = device_ioctl,
843 .ndo_get_stats = device_get_stats,
844 .ndo_start_xmit = device_xmit,
845 .ndo_set_rx_mode = device_set_multi,
849 vt6655_probe(struct pci_dev *pcid, const struct pci_device_id *ent)
851 static bool bFirst = true;
852 struct net_device *dev = NULL;
853 PCHIP_INFO pChip_info = (PCHIP_INFO)ent->driver_data;
856 if (device_nics++ >= MAX_UINTS) {
857 printk(KERN_NOTICE DEVICE_NAME ": already found %d NICs\n", device_nics);
861 dev = alloc_etherdev(sizeof(DEVICE_INFO));
863 pDevice = (PSDevice) netdev_priv(dev);
866 printk(KERN_ERR DEVICE_NAME ": allocate net device failed \n");
870 // Chain it all together
871 // SET_MODULE_OWNER(dev);
872 SET_NETDEV_DEV(dev, &pcid->dev);
875 printk(KERN_NOTICE "%s Ver. %s\n", DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
876 printk(KERN_NOTICE "Copyright (c) 2003 VIA Networking Technologies, Inc.\n");
880 vt6655_init_info(pcid, &pDevice, pChip_info);
882 pDevice->next_module = root_device_dev;
883 root_device_dev = dev;
885 if (pci_enable_device(pcid)) {
886 device_free_info(pDevice);
889 dev->irq = pcid->irq;
892 printk("Before get pci_info memaddr is %x\n", pDevice->memaddr);
894 if (device_get_pci_info(pDevice, pcid) == false) {
895 printk(KERN_ERR DEVICE_NAME ": Failed to find PCI device.\n");
896 device_free_info(pDevice);
904 //pci_read_config_byte(pcid, PCI_BASE_ADDRESS_0, &pDevice->byRevId);
905 printk("after get pci_info memaddr is %x, io addr is %x,io_size is %d\n", pDevice->memaddr, pDevice->ioaddr, pDevice->io_size);
917 for (i = 0; address[i]; i++) {
918 //pci_write_config_dword(pcid,address[i], 0xFFFFFFFF);
919 pci_read_config_dword(pcid, address[i], &bar);
920 printk("bar %d is %x\n", i, bar);
922 printk("bar %d not implemented\n", i);
925 if (bar & PCI_BASE_ADDRESS_SPACE_IO) {
928 len = bar & (PCI_BASE_ADDRESS_IO_MASK & 0xFFFF);
929 len = len & ~(len - 1);
931 printk("IO space: len in IO %x, BAR %d\n", len, i);
933 len = bar & 0xFFFFFFF0;
936 printk("len in MEM %x, BAR %d\n", len, i);
947 pDevice->PortOffset = (unsigned long)ioremap(pDevice->memaddr & PCI_BASE_ADDRESS_MEM_MASK, pDevice->io_size);
948 //pDevice->PortOffset = (unsigned long)ioremap(pDevice->ioaddr & PCI_BASE_ADDRESS_IO_MASK, pDevice->io_size);
950 if (pDevice->PortOffset == 0) {
951 printk(KERN_ERR DEVICE_NAME ": Failed to IO remapping ..\n");
952 device_free_info(pDevice);
956 rc = pci_request_regions(pcid, DEVICE_NAME);
958 printk(KERN_ERR DEVICE_NAME ": Failed to find PCI device\n");
959 device_free_info(pDevice);
963 dev->base_addr = pDevice->ioaddr;
967 VNSvInPortB(pDevice->PortOffset+0x4F, &value);
968 printk("Before write: value is %x\n", value);
969 //VNSvInPortB(pDevice->PortOffset+0x3F, 0x00);
970 VNSvOutPortB(pDevice->PortOffset, value);
971 VNSvInPortB(pDevice->PortOffset+0x4F, &value);
972 printk("After write: value is %x\n", value);
976 pDevice->PortOffset = pDevice->ioaddr;
979 if (!MACbSoftwareReset(pDevice->PortOffset)) {
980 printk(KERN_ERR DEVICE_NAME ": Failed to access MAC hardware..\n");
981 device_free_info(pDevice);
984 // initial to reload eeprom
985 MACvInitialize(pDevice->PortOffset);
986 MACvReadEtherAddress(pDevice->PortOffset, dev->dev_addr);
988 device_get_options(pDevice, device_nics-1, dev->name);
989 device_set_options(pDevice);
990 //Mask out the options cannot be set to the chip
991 pDevice->sOpts.flags &= pChip_info->flags;
993 //Enable the chip specified capabilities
994 pDevice->flags = pDevice->sOpts.flags | (pChip_info->flags & 0xFF000000UL);
995 pDevice->tx_80211 = device_dma0_tx_80211;
996 pDevice->sMgmtObj.pAdapter = (void *)pDevice;
997 pDevice->pMgmt = &(pDevice->sMgmtObj);
999 dev->irq = pcid->irq;
1000 dev->netdev_ops = &device_netdev_ops;
1002 dev->wireless_handlers = (struct iw_handler_def *)&iwctl_handler_def;
1004 rc = register_netdev(dev);
1006 printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
1007 device_free_info(pDevice);
1010 device_print_info(pDevice);
1011 pci_set_drvdata(pcid, pDevice);
1015 static void device_print_info(PSDevice pDevice)
1017 struct net_device *dev = pDevice->dev;
1019 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: %s\n", dev->name, get_chip_name(pDevice->chip_id));
1020 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "%s: MAC=%pM", dev->name, dev->dev_addr);
1022 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO " IO=0x%lx ", (unsigned long)pDevice->ioaddr);
1023 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO " IRQ=%d \n", pDevice->dev->irq);
1025 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO " IO=0x%lx Mem=0x%lx ",
1026 (unsigned long)pDevice->ioaddr, (unsigned long)pDevice->PortOffset);
1027 DBG_PRT(MSG_LEVEL_INFO, KERN_INFO " IRQ=%d \n", pDevice->dev->irq);
1031 static void vt6655_init_info(struct pci_dev *pcid, PSDevice *ppDevice,
1032 PCHIP_INFO pChip_info) {
1035 memset(*ppDevice, 0, sizeof(DEVICE_INFO));
1037 if (pDevice_Infos == NULL) {
1038 pDevice_Infos = *ppDevice;
1040 for (p = pDevice_Infos; p->next != NULL; p = p->next)
1042 p->next = *ppDevice;
1043 (*ppDevice)->prev = p;
1046 (*ppDevice)->pcid = pcid;
1047 (*ppDevice)->chip_id = pChip_info->chip_id;
1048 (*ppDevice)->io_size = pChip_info->io_size;
1049 (*ppDevice)->nTxQueues = pChip_info->nTxQueue;
1050 (*ppDevice)->multicast_limit = 32;
1052 spin_lock_init(&((*ppDevice)->lock));
1055 static bool device_get_pci_info(PSDevice pDevice, struct pci_dev *pcid) {
1058 unsigned int cis_addr;
1060 unsigned char pci_config[256];
1061 unsigned char value = 0x00;
1063 u16 max_lat = 0x0000;
1064 memset(pci_config, 0x00, 256);
1067 pci_read_config_byte(pcid, PCI_REVISION_ID, &pDevice->byRevId);
1068 pci_read_config_word(pcid, PCI_SUBSYSTEM_ID, &pDevice->SubSystemID);
1069 pci_read_config_word(pcid, PCI_SUBSYSTEM_VENDOR_ID, &pDevice->SubVendorID);
1070 pci_read_config_word(pcid, PCI_COMMAND, (u16 *)&(pci_cmd));
1072 pci_set_master(pcid);
1074 pDevice->memaddr = pci_resource_start(pcid, 0);
1075 pDevice->ioaddr = pci_resource_start(pcid, 1);
1078 // pDevice->ioaddr = pci_resource_start(pcid, 0);
1079 // pDevice->memaddr = pci_resource_start(pcid,1);
1082 cis_addr = pci_resource_start(pcid, 2);
1084 pDevice->pcid = pcid;
1086 pci_read_config_byte(pcid, PCI_COMMAND, &b);
1087 pci_write_config_byte(pcid, PCI_COMMAND, (b|PCI_COMMAND_MASTER));
1090 //pci_read_config_word(pcid,PCI_MAX_LAT,&max_lat);
1091 //for (ii=0;ii<0xFF;ii++)
1092 //pci_read_config_word(pcid,PCI_MAX_LAT,&max_lat);
1094 //pci_write_config_word(pcid,PCI_MAX_LAT,max_lat);
1095 //pci_read_config_word(pcid,PCI_MAX_LAT,&max_lat);
1097 for (ii = 0; ii < 0xFF; ii++) {
1098 pci_read_config_byte(pcid, ii, &value);
1099 pci_config[ii] = value;
1101 for (ii = 0, j = 1; ii < 0x100; ii++, j++) {
1103 printk("%x:", pci_config[ii]);
1106 printk("%x:", pci_config[ii]);
1113 static void device_free_info(PSDevice pDevice) {
1115 struct net_device *dev = pDevice->dev;
1118 //2008-0714-01<Add>by chester
1119 device_release_WPADEV(pDevice);
1121 //2008-07-21-01<Add>by MikeLiu
1123 if (wpa_set_wpadev(pDevice, 0) != 0)
1124 printk("unregister wpadev fail?\n");
1126 if (pDevice_Infos == NULL)
1129 for (ptr = pDevice_Infos; ptr && (ptr != pDevice); ptr = ptr->next)
1132 if (ptr == pDevice) {
1133 if (ptr == pDevice_Infos)
1134 pDevice_Infos = ptr->next;
1136 ptr->prev->next = ptr->next;
1138 DBG_PRT(MSG_LEVEL_ERR, KERN_ERR "info struct not found\n");
1143 vt6655_hostap_set_hostapd(pDevice, 0, 0);
1146 unregister_netdev(dev);
1148 if (pDevice->PortOffset)
1149 iounmap((void *)pDevice->PortOffset);
1152 pci_release_regions(pDevice->pcid);
1156 if (pDevice->pcid) {
1157 pci_set_drvdata(pDevice->pcid, NULL);
1161 static bool device_init_rings(PSDevice pDevice) {
1164 /*allocate all RD/TD rings a single pool*/
1165 vir_pool = pci_alloc_consistent(pDevice->pcid,
1166 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1167 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1168 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1169 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
1170 &pDevice->pool_dma);
1172 if (vir_pool == NULL) {
1173 DBG_PRT(MSG_LEVEL_ERR, KERN_ERR "%s : allocate desc dma memory failed\n", pDevice->dev->name);
1178 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1179 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1180 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1181 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc)
1184 pDevice->aRD0Ring = vir_pool;
1185 pDevice->aRD1Ring = vir_pool +
1186 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
1188 pDevice->rd0_pool_dma = pDevice->pool_dma;
1189 pDevice->rd1_pool_dma = pDevice->rd0_pool_dma +
1190 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
1192 pDevice->tx0_bufs = pci_alloc_consistent(pDevice->pcid,
1193 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
1194 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
1195 CB_BEACON_BUF_SIZE +
1197 &pDevice->tx_bufs_dma0);
1199 if (pDevice->tx0_bufs == NULL) {
1200 DBG_PRT(MSG_LEVEL_ERR, KERN_ERR "%s: allocate buf dma memory failed\n", pDevice->dev->name);
1201 pci_free_consistent(pDevice->pcid,
1202 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1203 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1204 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1205 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
1206 vir_pool, pDevice->pool_dma
1211 memset(pDevice->tx0_bufs, 0,
1212 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
1213 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
1214 CB_BEACON_BUF_SIZE +
1218 pDevice->td0_pool_dma = pDevice->rd1_pool_dma +
1219 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
1221 pDevice->td1_pool_dma = pDevice->td0_pool_dma +
1222 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
1224 // vir_pool: pvoid type
1225 pDevice->apTD0Rings = vir_pool
1226 + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
1227 + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
1229 pDevice->apTD1Rings = vir_pool
1230 + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
1231 + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc)
1232 + pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
1234 pDevice->tx1_bufs = pDevice->tx0_bufs +
1235 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
1237 pDevice->tx_beacon_bufs = pDevice->tx1_bufs +
1238 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
1240 pDevice->pbyTmpBuff = pDevice->tx_beacon_bufs +
1243 pDevice->tx_bufs_dma1 = pDevice->tx_bufs_dma0 +
1244 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
1246 pDevice->tx_beacon_dma = pDevice->tx_bufs_dma1 +
1247 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
1252 static void device_free_rings(PSDevice pDevice) {
1253 pci_free_consistent(pDevice->pcid,
1254 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1255 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1256 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1257 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc)
1259 pDevice->aRD0Ring, pDevice->pool_dma
1262 if (pDevice->tx0_bufs)
1263 pci_free_consistent(pDevice->pcid,
1264 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
1265 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
1266 CB_BEACON_BUF_SIZE +
1268 pDevice->tx0_bufs, pDevice->tx_bufs_dma0
1272 static void device_init_rd0_ring(PSDevice pDevice) {
1274 dma_addr_t curr = pDevice->rd0_pool_dma;
1277 /* Init the RD0 ring entries */
1278 for (i = 0; i < pDevice->sOpts.nRxDescs0; i ++, curr += sizeof(SRxDesc)) {
1279 pDesc = &(pDevice->aRD0Ring[i]);
1280 pDesc->pRDInfo = alloc_rd_info();
1281 ASSERT(pDesc->pRDInfo);
1282 if (!device_alloc_rx_buf(pDevice, pDesc)) {
1283 DBG_PRT(MSG_LEVEL_ERR, KERN_ERR "%s: can not alloc rx bufs\n",
1284 pDevice->dev->name);
1286 pDesc->next = &(pDevice->aRD0Ring[(i+1) % pDevice->sOpts.nRxDescs0]);
1287 pDesc->pRDInfo->curr_desc = cpu_to_le32(curr);
1288 pDesc->next_desc = cpu_to_le32(curr + sizeof(SRxDesc));
1292 pDevice->aRD0Ring[i-1].next_desc = cpu_to_le32(pDevice->rd0_pool_dma);
1293 pDevice->pCurrRD[0] = &(pDevice->aRD0Ring[0]);
1296 static void device_init_rd1_ring(PSDevice pDevice) {
1298 dma_addr_t curr = pDevice->rd1_pool_dma;
1301 /* Init the RD1 ring entries */
1302 for (i = 0; i < pDevice->sOpts.nRxDescs1; i ++, curr += sizeof(SRxDesc)) {
1303 pDesc = &(pDevice->aRD1Ring[i]);
1304 pDesc->pRDInfo = alloc_rd_info();
1305 ASSERT(pDesc->pRDInfo);
1306 if (!device_alloc_rx_buf(pDevice, pDesc)) {
1307 DBG_PRT(MSG_LEVEL_ERR, KERN_ERR "%s: can not alloc rx bufs\n",
1308 pDevice->dev->name);
1310 pDesc->next = &(pDevice->aRD1Ring[(i+1) % pDevice->sOpts.nRxDescs1]);
1311 pDesc->pRDInfo->curr_desc = cpu_to_le32(curr);
1312 pDesc->next_desc = cpu_to_le32(curr + sizeof(SRxDesc));
1316 pDevice->aRD1Ring[i-1].next_desc = cpu_to_le32(pDevice->rd1_pool_dma);
1317 pDevice->pCurrRD[1] = &(pDevice->aRD1Ring[0]);
1320 static void device_init_defrag_cb(PSDevice pDevice) {
1322 PSDeFragControlBlock pDeF;
1324 /* Init the fragment ctl entries */
1325 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1326 pDeF = &(pDevice->sRxDFCB[i]);
1327 if (!device_alloc_frag_buf(pDevice, pDeF)) {
1328 DBG_PRT(MSG_LEVEL_ERR, KERN_ERR "%s: can not alloc frag bufs\n",
1329 pDevice->dev->name);
1332 pDevice->cbDFCB = CB_MAX_RX_FRAG;
1333 pDevice->cbFreeDFCB = pDevice->cbDFCB;
1336 static void device_free_rd0_ring(PSDevice pDevice) {
1339 for (i = 0; i < pDevice->sOpts.nRxDescs0; i++) {
1340 PSRxDesc pDesc = &(pDevice->aRD0Ring[i]);
1341 PDEVICE_RD_INFO pRDInfo = pDesc->pRDInfo;
1343 pci_unmap_single(pDevice->pcid, pRDInfo->skb_dma,
1344 pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1346 dev_kfree_skb(pRDInfo->skb);
1348 kfree((void *)pDesc->pRDInfo);
1352 static void device_free_rd1_ring(PSDevice pDevice) {
1355 for (i = 0; i < pDevice->sOpts.nRxDescs1; i++) {
1356 PSRxDesc pDesc = &(pDevice->aRD1Ring[i]);
1357 PDEVICE_RD_INFO pRDInfo = pDesc->pRDInfo;
1359 pci_unmap_single(pDevice->pcid, pRDInfo->skb_dma,
1360 pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1362 dev_kfree_skb(pRDInfo->skb);
1364 kfree((void *)pDesc->pRDInfo);
1368 static void device_free_frag_buf(PSDevice pDevice) {
1369 PSDeFragControlBlock pDeF;
1372 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1373 pDeF = &(pDevice->sRxDFCB[i]);
1376 dev_kfree_skb(pDeF->skb);
1381 static void device_init_td0_ring(PSDevice pDevice) {
1386 curr = pDevice->td0_pool_dma;
1387 for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++, curr += sizeof(STxDesc)) {
1388 pDesc = &(pDevice->apTD0Rings[i]);
1389 pDesc->pTDInfo = alloc_td_info();
1390 ASSERT(pDesc->pTDInfo);
1391 if (pDevice->flags & DEVICE_FLAGS_TX_ALIGN) {
1392 pDesc->pTDInfo->buf = pDevice->tx0_bufs + (i)*PKT_BUF_SZ;
1393 pDesc->pTDInfo->buf_dma = pDevice->tx_bufs_dma0 + (i)*PKT_BUF_SZ;
1395 pDesc->next = &(pDevice->apTD0Rings[(i+1) % pDevice->sOpts.nTxDescs[0]]);
1396 pDesc->pTDInfo->curr_desc = cpu_to_le32(curr);
1397 pDesc->next_desc = cpu_to_le32(curr+sizeof(STxDesc));
1401 pDevice->apTD0Rings[i-1].next_desc = cpu_to_le32(pDevice->td0_pool_dma);
1402 pDevice->apTailTD[0] = pDevice->apCurrTD[0] = &(pDevice->apTD0Rings[0]);
1405 static void device_init_td1_ring(PSDevice pDevice) {
1410 /* Init the TD ring entries */
1411 curr = pDevice->td1_pool_dma;
1412 for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++, curr += sizeof(STxDesc)) {
1413 pDesc = &(pDevice->apTD1Rings[i]);
1414 pDesc->pTDInfo = alloc_td_info();
1415 ASSERT(pDesc->pTDInfo);
1416 if (pDevice->flags & DEVICE_FLAGS_TX_ALIGN) {
1417 pDesc->pTDInfo->buf = pDevice->tx1_bufs + (i) * PKT_BUF_SZ;
1418 pDesc->pTDInfo->buf_dma = pDevice->tx_bufs_dma1 + (i) * PKT_BUF_SZ;
1420 pDesc->next = &(pDevice->apTD1Rings[(i + 1) % pDevice->sOpts.nTxDescs[1]]);
1421 pDesc->pTDInfo->curr_desc = cpu_to_le32(curr);
1422 pDesc->next_desc = cpu_to_le32(curr+sizeof(STxDesc));
1426 pDevice->apTD1Rings[i-1].next_desc = cpu_to_le32(pDevice->td1_pool_dma);
1427 pDevice->apTailTD[1] = pDevice->apCurrTD[1] = &(pDevice->apTD1Rings[0]);
1430 static void device_free_td0_ring(PSDevice pDevice) {
1432 for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++) {
1433 PSTxDesc pDesc = &(pDevice->apTD0Rings[i]);
1434 PDEVICE_TD_INFO pTDInfo = pDesc->pTDInfo;
1436 if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma))
1437 pci_unmap_single(pDevice->pcid, pTDInfo->skb_dma,
1438 pTDInfo->skb->len, PCI_DMA_TODEVICE);
1441 dev_kfree_skb(pTDInfo->skb);
1443 kfree((void *)pDesc->pTDInfo);
1447 static void device_free_td1_ring(PSDevice pDevice) {
1450 for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++) {
1451 PSTxDesc pDesc = &(pDevice->apTD1Rings[i]);
1452 PDEVICE_TD_INFO pTDInfo = pDesc->pTDInfo;
1454 if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma))
1455 pci_unmap_single(pDevice->pcid, pTDInfo->skb_dma,
1456 pTDInfo->skb->len, PCI_DMA_TODEVICE);
1459 dev_kfree_skb(pTDInfo->skb);
1461 kfree((void *)pDesc->pTDInfo);
1465 /*-----------------------------------------------------------------*/
1467 static int device_rx_srv(PSDevice pDevice, unsigned int uIdx) {
1471 for (pRD = pDevice->pCurrRD[uIdx];
1472 pRD->m_rd0RD0.f1Owner == OWNED_BY_HOST;
1474 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->pCurrRD = %x, works = %d\n", pRD, works);
1477 if (device_receive_frame(pDevice, pRD)) {
1478 if (!device_alloc_rx_buf(pDevice, pRD)) {
1479 DBG_PRT(MSG_LEVEL_ERR, KERN_ERR
1480 "%s: can not allocate rx buf\n", pDevice->dev->name);
1484 pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
1485 pDevice->dev->last_rx = jiffies;
1488 pDevice->pCurrRD[uIdx] = pRD;
1493 static bool device_alloc_rx_buf(PSDevice pDevice, PSRxDesc pRD) {
1494 PDEVICE_RD_INFO pRDInfo = pRD->pRDInfo;
1496 pRDInfo->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1497 if (pRDInfo->skb == NULL)
1499 ASSERT(pRDInfo->skb);
1500 pRDInfo->skb->dev = pDevice->dev;
1501 pRDInfo->skb_dma = pci_map_single(pDevice->pcid, skb_tail_pointer(pRDInfo->skb),
1502 pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1503 *((unsigned int *)&(pRD->m_rd0RD0)) = 0; /* FIX cast */
1505 pRD->m_rd0RD0.wResCount = cpu_to_le16(pDevice->rx_buf_sz);
1506 pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
1507 pRD->m_rd1RD1.wReqCount = cpu_to_le16(pDevice->rx_buf_sz);
1508 pRD->buff_addr = cpu_to_le32(pRDInfo->skb_dma);
1513 bool device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {
1514 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1515 if (pDeF->skb == NULL)
1518 pDeF->skb->dev = pDevice->dev;
1523 static int device_tx_srv(PSDevice pDevice, unsigned int uIdx) {
1527 unsigned char byTsr0;
1528 unsigned char byTsr1;
1529 unsigned int uFrameSize, uFIFOHeaderSize;
1530 PSTxBufHead pTxBufHead;
1531 struct net_device_stats *pStats = &pDevice->stats;
1532 struct sk_buff *skb;
1533 unsigned int uNodeIndex;
1534 PSMgmtObject pMgmt = pDevice->pMgmt;
1536 for (pTD = pDevice->apTailTD[uIdx]; pDevice->iTDUsed[uIdx] > 0; pTD = pTD->next) {
1537 if (pTD->m_td0TD0.f1Owner == OWNED_BY_NIC)
1542 byTsr0 = pTD->m_td0TD0.byTSR0;
1543 byTsr1 = pTD->m_td0TD0.byTSR1;
1545 //Only the status of first TD in the chain is correct
1546 if (pTD->m_td1TD1.byTCR & TCR_STP) {
1547 if ((pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0) {
1548 uFIFOHeaderSize = pTD->pTDInfo->dwHeaderLength;
1549 uFrameSize = pTD->pTDInfo->dwReqCount - uFIFOHeaderSize;
1550 pTxBufHead = (PSTxBufHead) (pTD->pTDInfo->buf);
1551 // Update the statistics based on the Transmit status
1552 // now, we DONT check TSR0_CDH
1554 STAvUpdateTDStatCounter(&pDevice->scStatistic,
1556 (unsigned char *)(pTD->pTDInfo->buf + uFIFOHeaderSize),
1559 BSSvUpdateNodeTxCounter(pDevice,
1561 (unsigned char *)(pTD->pTDInfo->buf),
1565 if (!(byTsr1 & TSR1_TERR)) {
1567 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X].\n",
1568 (int)uIdx, byTsr1, byTsr0);
1570 if ((pTxBufHead->wFragCtl & FRAGCTL_ENDFRAG) != FRAGCTL_NONFRAG) {
1571 pDevice->s802_11Counter.TransmittedFragmentCount++;
1573 pStats->tx_packets++;
1574 pStats->tx_bytes += pTD->pTDInfo->skb->len;
1576 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Tx[%d] dropped & tsr1[%02X] tsr0[%02X].\n",
1577 (int)uIdx, byTsr1, byTsr0);
1578 pStats->tx_errors++;
1579 pStats->tx_dropped++;
1583 if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
1584 if (pDevice->bEnableHostapd) {
1585 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "tx call back netif.. \n");
1586 skb = pTD->pTDInfo->skb;
1587 skb->dev = pDevice->apdev;
1588 skb_reset_mac_header(skb);
1589 skb->pkt_type = PACKET_OTHERHOST;
1590 //skb->protocol = htons(ETH_P_802_2);
1591 memset(skb->cb, 0, sizeof(skb->cb));
1596 if (byTsr1 & TSR1_TERR) {
1597 if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
1598 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Tx[%d] fail has error. tsr1[%02X] tsr0[%02X].\n",
1599 (int)uIdx, byTsr1, byTsr0);
1602 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Tx[%d] fail has error. tsr1[%02X] tsr0[%02X].\n",
1603 // (int)uIdx, byTsr1, byTsr0);
1605 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
1606 (pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB)) {
1607 unsigned short wAID;
1608 unsigned char byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
1610 skb = pTD->pTDInfo->skb;
1611 if (BSSDBbIsSTAInNodeDB(pMgmt, (unsigned char *)(skb->data), &uNodeIndex)) {
1612 if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
1613 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
1614 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
1616 wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
1617 pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
1618 pTD->pTDInfo->byFlags &= ~(TD_FLAGS_NETIF_SKB);
1619 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "tx_srv:tx fail re-queue sta index= %d, QueCnt= %d\n"
1620 , (int)uNodeIndex, pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt);
1621 pStats->tx_errors--;
1622 pStats->tx_dropped--;
1627 device_free_tx_buf(pDevice, pTD);
1628 pDevice->iTDUsed[uIdx]--;
1632 if (uIdx == TYPE_AC0DMA) {
1633 // RESERV_AC0DMA reserved for relay
1635 if (AVAIL_TD(pDevice, uIdx) < RESERV_AC0DMA) {
1637 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " AC0DMA is Full = %d\n", pDevice->iTDUsed[uIdx]);
1639 if (netif_queue_stopped(pDevice->dev) && (bFull == false)) {
1640 netif_wake_queue(pDevice->dev);
1644 pDevice->apTailTD[uIdx] = pTD;
1649 static void device_error(PSDevice pDevice, unsigned short status) {
1650 if (status & ISR_FETALERR) {
1651 DBG_PRT(MSG_LEVEL_ERR, KERN_ERR
1652 "%s: Hardware fatal error.\n",
1653 pDevice->dev->name);
1654 netif_stop_queue(pDevice->dev);
1655 del_timer(&pDevice->sTimerCommand);
1656 del_timer(&(pDevice->pMgmt->sTimerSecondCallback));
1657 pDevice->bCmdRunning = false;
1658 MACbShutdown(pDevice->PortOffset);
1663 static void device_free_tx_buf(PSDevice pDevice, PSTxDesc pDesc) {
1664 PDEVICE_TD_INFO pTDInfo = pDesc->pTDInfo;
1665 struct sk_buff *skb = pTDInfo->skb;
1667 // pre-allocated buf_dma can't be unmapped.
1668 if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma)) {
1669 pci_unmap_single(pDevice->pcid, pTDInfo->skb_dma, skb->len,
1673 if ((pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0)
1674 dev_kfree_skb_irq(skb);
1676 pTDInfo->skb_dma = 0;
1678 pTDInfo->byFlags = 0;
1682 void InitRxManagementQueue(PSDevice pDevice)
1684 pDevice->rxManeQueue.packet_num = 0;
1685 pDevice->rxManeQueue.head = pDevice->rxManeQueue.tail = 0;
1693 PSDevice pDevice = (PSDevice) Context;
1694 PSRxMgmtPacket pRxMgmtPacket;
1696 //complete(&pDevice->notify);
1701 //down(&pDevice->mlme_semaphore);
1702 // pRxMgmtPacket = DeQueue(pDevice);
1704 spin_lock_irq(&pDevice->lock);
1705 while (pDevice->rxManeQueue.packet_num != 0) {
1706 pRxMgmtPacket = DeQueue(pDevice);
1708 //DequeueManageObject(pDevice->FirstRecvMngList, pDevice->LastRecvMngList);
1709 vMgrRxManagePacket(pDevice, pDevice->pMgmt, pRxMgmtPacket);
1711 spin_unlock_irq(&pDevice->lock);
1725 static int device_open(struct net_device *dev) {
1726 PSDevice pDevice = (PSDevice)netdev_priv(dev);
1728 #ifdef WPA_SM_Transtatus
1729 extern SWPAResult wpa_Result;
1732 pDevice->rx_buf_sz = PKT_BUF_SZ;
1733 if (!device_init_rings(pDevice)) {
1736 //2008-5-13 <add> by chester
1737 i = request_irq(pDevice->pcid->irq, &device_intr, IRQF_SHARED, dev->name, dev);
1741 #ifdef WPA_SM_Transtatus
1742 memset(wpa_Result.ifname, 0, sizeof(wpa_Result.ifname));
1743 wpa_Result.proto = 0;
1744 wpa_Result.key_mgmt = 0;
1745 wpa_Result.eap_type = 0;
1746 wpa_Result.authenticated = false;
1747 pDevice->fWPA_Authened = false;
1749 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call device init rd0 ring\n");
1750 device_init_rd0_ring(pDevice);
1751 device_init_rd1_ring(pDevice);
1752 device_init_defrag_cb(pDevice);
1753 device_init_td0_ring(pDevice);
1754 device_init_td1_ring(pDevice);
1755 // VNTWIFIvSet11h(pDevice->pMgmt, pDevice->b11hEnable);
1757 if (pDevice->bDiversityRegCtlON) {
1758 device_init_diversity_timer(pDevice);
1760 vMgrObjectInit(pDevice);
1761 vMgrTimerInit(pDevice);
1765 tasklet_init(&pDevice->RxMngWorkItem, (void *)MngWorkItem, (unsigned long)pDevice);
1768 InitRxManagementQueue(pDevice);
1770 mlme_task = kthread_run(MlmeThread, (void *)pDevice, "MLME");
1771 if (IS_ERR(mlme_task)) {
1772 printk("thread create fail\n");
1779 //wait_for_completion(&pDevice->notify);
1781 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call device_init_registers\n");
1782 device_init_registers(pDevice, DEVICE_INIT_COLD);
1783 MACvReadEtherAddress(pDevice->PortOffset, pDevice->abyCurrentNetAddr);
1784 memcpy(pDevice->pMgmt->abyMACAddr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1785 device_set_multi(pDevice->dev);
1787 // Init for Key Management
1788 KeyvInitTable(&pDevice->sKey, pDevice->PortOffset);
1789 add_timer(&(pDevice->pMgmt->sTimerSecondCallback));
1791 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1793 pDevice->bwextstep0 = false;
1794 pDevice->bwextstep1 = false;
1795 pDevice->bwextstep2 = false;
1796 pDevice->bwextstep3 = false;
1798 pDevice->bwextcount = 0;
1799 pDevice->bWPASuppWextEnabled = false;
1801 pDevice->byReAssocCount = 0;
1802 pDevice->bWPADEVUp = false;
1803 // Patch: if WEP key already set by iwconfig but device not yet open
1804 if ((pDevice->bEncryptionEnable == true) && (pDevice->bTransmitKey == true)) {
1805 KeybSetDefaultKey(&(pDevice->sKey),
1806 (unsigned long)(pDevice->byKeyIndex | (1 << 31)),
1807 pDevice->uKeyLength,
1811 pDevice->PortOffset,
1814 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1817 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "call MACvIntEnable\n");
1818 MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
1820 if (pDevice->pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1821 bScheduleCommand((void *)pDevice, WLAN_CMD_RUN_AP, NULL);
1823 bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1824 bScheduleCommand((void *)pDevice, WLAN_CMD_SSID, NULL);
1826 pDevice->flags |= DEVICE_FLAGS_OPENED;
1828 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
1832 static int device_close(struct net_device *dev) {
1833 PSDevice pDevice = (PSDevice)netdev_priv(dev);
1834 PSMgmtObject pMgmt = pDevice->pMgmt;
1840 //2007-1121-02<Add>by EinsnLiu
1841 if (pDevice->bLinkPass) {
1842 bScheduleCommand((void *)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
1846 del_timer(&pDevice->sTimerTxData);
1848 del_timer(&pDevice->sTimerCommand);
1849 del_timer(&pMgmt->sTimerSecondCallback);
1850 if (pDevice->bDiversityRegCtlON) {
1851 del_timer(&pDevice->TimerSQ3Tmax1);
1852 del_timer(&pDevice->TimerSQ3Tmax2);
1853 del_timer(&pDevice->TimerSQ3Tmax3);
1857 tasklet_kill(&pDevice->RxMngWorkItem);
1859 netif_stop_queue(dev);
1860 pDevice->bCmdRunning = false;
1861 MACbShutdown(pDevice->PortOffset);
1862 MACbSoftwareReset(pDevice->PortOffset);
1863 CARDbRadioPowerOff(pDevice);
1865 pDevice->bLinkPass = false;
1866 memset(pMgmt->abyCurrBSSID, 0, 6);
1867 pMgmt->eCurrState = WMAC_STATE_IDLE;
1868 device_free_td0_ring(pDevice);
1869 device_free_td1_ring(pDevice);
1870 device_free_rd0_ring(pDevice);
1871 device_free_rd1_ring(pDevice);
1872 device_free_frag_buf(pDevice);
1873 device_free_rings(pDevice);
1874 BSSvClearNodeDBTable(pDevice, 0);
1875 free_irq(dev->irq, dev);
1876 pDevice->flags &= (~DEVICE_FLAGS_OPENED);
1877 //2008-0714-01<Add>by chester
1878 device_release_WPADEV(pDevice);
1880 //tasklet_kill(&pDevice->RxMngWorkItem);
1882 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close.. \n");
1886 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev) {
1887 PSDevice pDevice = netdev_priv(dev);
1888 unsigned char *pbMPDU;
1889 unsigned int cbMPDULen = 0;
1891 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211\n");
1892 spin_lock_irq(&pDevice->lock);
1894 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
1895 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211, td0 <=0\n");
1896 dev_kfree_skb_irq(skb);
1897 spin_unlock_irq(&pDevice->lock);
1901 if (pDevice->bStopTx0Pkt == true) {
1902 dev_kfree_skb_irq(skb);
1903 spin_unlock_irq(&pDevice->lock);
1907 cbMPDULen = skb->len;
1910 vDMA0_tx_80211(pDevice, skb, pbMPDU, cbMPDULen);
1912 spin_unlock_irq(&pDevice->lock);
1917 bool device_dma0_xmit(PSDevice pDevice, struct sk_buff *skb, unsigned int uNodeIndex) {
1918 PSMgmtObject pMgmt = pDevice->pMgmt;
1919 PSTxDesc pHeadTD, pLastTD;
1920 unsigned int cbFrameBodySize;
1921 unsigned int uMACfragNum;
1922 unsigned char byPktType;
1923 bool bNeedEncryption = false;
1924 PSKeyItem pTransmitKey = NULL;
1925 unsigned int cbHeaderSize;
1928 // unsigned char byKeyIndex = 0;
1930 if (pDevice->bStopTx0Pkt == true) {
1931 dev_kfree_skb_irq(skb);
1935 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
1936 dev_kfree_skb_irq(skb);
1937 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_xmit, td0 <=0\n");
1941 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
1942 if (pDevice->uAssocCount == 0) {
1943 dev_kfree_skb_irq(skb);
1944 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_xmit, assocCount = 0\n");
1949 pHeadTD = pDevice->apCurrTD[TYPE_TXDMA0];
1951 pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP);
1953 memcpy(pDevice->sTxEthHeader.abyDstAddr, (unsigned char *)(skb->data), ETH_HLEN);
1954 cbFrameBodySize = skb->len - ETH_HLEN;
1957 if (ntohs(pDevice->sTxEthHeader.wType) > ETH_DATA_LEN) {
1958 cbFrameBodySize += 8;
1960 uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader);
1962 if (uMACfragNum > AVAIL_TD(pDevice, TYPE_TXDMA0)) {
1963 dev_kfree_skb_irq(skb);
1966 byPktType = (unsigned char)pDevice->byPacketType;
1968 if (pDevice->bFixRate) {
1969 if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
1970 if (pDevice->uConnectionRate >= RATE_11M) {
1971 pDevice->wCurrentRate = RATE_11M;
1973 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
1976 if (pDevice->uConnectionRate >= RATE_54M)
1977 pDevice->wCurrentRate = RATE_54M;
1979 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
1982 pDevice->wCurrentRate = pDevice->pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
1986 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
1987 pDevice->byPreambleType = pDevice->byShortPreamble;
1989 pDevice->byPreambleType = PREAMBLE_LONG;
1992 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dma0: pDevice->wCurrentRate = %d \n", pDevice->wCurrentRate);
1994 if (pDevice->wCurrentRate <= RATE_11M) {
1995 byPktType = PK_TYPE_11B;
1996 } else if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
1997 byPktType = PK_TYPE_11A;
1999 if (pDevice->bProtectMode == true) {
2000 byPktType = PK_TYPE_11GB;
2002 byPktType = PK_TYPE_11GA;
2006 if (pDevice->bEncryptionEnable == true)
2007 bNeedEncryption = true;
2009 if (pDevice->bEnableHostWEP) {
2010 pTransmitKey = &STempKey;
2011 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2012 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2013 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2014 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2015 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2016 memcpy(pTransmitKey->abyKey,
2017 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2018 pTransmitKey->uKeyLength
2021 vGenerateFIFOHeader(pDevice, byPktType, pDevice->pbyTmpBuff, bNeedEncryption,
2022 cbFrameBodySize, TYPE_TXDMA0, pHeadTD,
2023 &pDevice->sTxEthHeader, (unsigned char *)skb->data, pTransmitKey, uNodeIndex,
2028 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2030 MACbPSWakeup(pDevice->PortOffset);
2033 pDevice->bPWBitOn = false;
2036 for (ii = 0; ii < uMACfragNum; ii++) {
2037 // Poll Transmit the adapter
2039 pHeadTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2041 if (ii == (uMACfragNum - 1))
2043 pHeadTD = pHeadTD->next;
2046 // Save the information needed by the tx interrupt handler
2047 // to complete the Send request
2048 pLastTD->pTDInfo->skb = skb;
2049 pLastTD->pTDInfo->byFlags = 0;
2050 pLastTD->pTDInfo->byFlags |= TD_FLAGS_NETIF_SKB;
2052 pDevice->apCurrTD[TYPE_TXDMA0] = pHeadTD;
2054 MACvTransmit0(pDevice->PortOffset);
2059 //TYPE_AC0DMA data tx
2060 static int device_xmit(struct sk_buff *skb, struct net_device *dev) {
2061 PSDevice pDevice = netdev_priv(dev);
2063 PSMgmtObject pMgmt = pDevice->pMgmt;
2064 PSTxDesc pHeadTD, pLastTD;
2065 unsigned int uNodeIndex = 0;
2066 unsigned char byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
2067 unsigned short wAID;
2068 unsigned int uMACfragNum = 1;
2069 unsigned int cbFrameBodySize;
2070 unsigned char byPktType;
2071 unsigned int cbHeaderSize;
2072 bool bNeedEncryption = false;
2073 PSKeyItem pTransmitKey = NULL;
2076 bool bTKIP_UseGTK = false;
2077 bool bNeedDeAuth = false;
2078 unsigned char *pbyBSSID;
2079 bool bNodeExist = false;
2081 spin_lock_irq(&pDevice->lock);
2082 if (pDevice->bLinkPass == false) {
2083 dev_kfree_skb_irq(skb);
2084 spin_unlock_irq(&pDevice->lock);
2088 if (pDevice->bStopDataPkt) {
2089 dev_kfree_skb_irq(skb);
2090 spin_unlock_irq(&pDevice->lock);
2094 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2095 if (pDevice->uAssocCount == 0) {
2096 dev_kfree_skb_irq(skb);
2097 spin_unlock_irq(&pDevice->lock);
2100 if (is_multicast_ether_addr((unsigned char *)(skb->data))) {
2103 if (pMgmt->sNodeDBTable[0].bPSEnable) {
2104 skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb);
2105 pMgmt->sNodeDBTable[0].wEnQueueCnt++;
2107 pMgmt->abyPSTxMap[0] |= byMask[0];
2108 spin_unlock_irq(&pDevice->lock);
2112 if (BSSDBbIsSTAInNodeDB(pMgmt, (unsigned char *)(skb->data), &uNodeIndex)) {
2113 if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
2114 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
2115 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
2117 wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
2118 pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
2119 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set:pMgmt->abyPSTxMap[%d]= %d\n",
2120 (wAID >> 3), pMgmt->abyPSTxMap[wAID >> 3]);
2121 spin_unlock_irq(&pDevice->lock);
2125 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2126 pDevice->byPreambleType = pDevice->byShortPreamble;
2129 pDevice->byPreambleType = PREAMBLE_LONG;
2136 if (bNodeExist == false) {
2137 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG "Unknown STA not found in node DB \n");
2138 dev_kfree_skb_irq(skb);
2139 spin_unlock_irq(&pDevice->lock);
2144 pHeadTD = pDevice->apCurrTD[TYPE_AC0DMA];
2146 pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP);
2148 memcpy(pDevice->sTxEthHeader.abyDstAddr, (unsigned char *)(skb->data), ETH_HLEN);
2149 cbFrameBodySize = skb->len - ETH_HLEN;
2151 if (ntohs(pDevice->sTxEthHeader.wType) > ETH_DATA_LEN) {
2152 cbFrameBodySize += 8;
2155 if (pDevice->bEncryptionEnable == true) {
2156 bNeedEncryption = true;
2159 if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
2160 (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2161 pbyBSSID = pDevice->abyBSSID;
2163 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
2165 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
2166 bTKIP_UseGTK = true;
2167 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG "Get GTK.\n");
2171 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG "Get PTK.\n");
2174 } else if (pDevice->pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2175 pbyBSSID = pDevice->sTxEthHeader.abyDstAddr; //TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1
2176 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG "IBSS Serach Key: \n");
2177 for (ii = 0; ii < 6; ii++)
2178 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG "%x \n", *(pbyBSSID+ii));
2179 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG "\n");
2182 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == true)
2186 pbyBSSID = pDevice->abyBroadcastAddr;
2187 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
2188 pTransmitKey = NULL;
2189 if (pDevice->pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2190 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG "IBSS and KEY is NULL. [%d]\n", pDevice->pMgmt->eCurrMode);
2192 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG "NOT IBSS and KEY is NULL. [%d]\n", pDevice->pMgmt->eCurrMode);
2194 bTKIP_UseGTK = true;
2195 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG "Get GTK.\n");
2200 if (pDevice->bEnableHostWEP) {
2201 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG "acdma0: STA index %d\n", uNodeIndex);
2202 if (pDevice->bEncryptionEnable == true) {
2203 pTransmitKey = &STempKey;
2204 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2205 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2206 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2207 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2208 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2209 memcpy(pTransmitKey->abyKey,
2210 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2211 pTransmitKey->uKeyLength
2216 uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader);
2218 if (uMACfragNum > AVAIL_TD(pDevice, TYPE_AC0DMA)) {
2219 DBG_PRT(MSG_LEVEL_ERR, KERN_DEBUG "uMACfragNum > AVAIL_TD(TYPE_AC0DMA) = %d\n", uMACfragNum);
2220 dev_kfree_skb_irq(skb);
2221 spin_unlock_irq(&pDevice->lock);
2225 if (pTransmitKey != NULL) {
2226 if ((pTransmitKey->byCipherSuite == KEY_CTL_WEP) &&
2227 (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN)) {
2228 uMACfragNum = 1; //WEP256 doesn't support fragment
2232 byPktType = (unsigned char)pDevice->byPacketType;
2234 if (pDevice->bFixRate) {
2236 printk("Fix Rate: PhyType is %d,ConnectionRate is %d\n", pDevice->eCurrentPHYType, pDevice->uConnectionRate);
2239 if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
2240 if (pDevice->uConnectionRate >= RATE_11M) {
2241 pDevice->wCurrentRate = RATE_11M;
2243 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2246 if ((pDevice->eCurrentPHYType == PHY_TYPE_11A) &&
2247 (pDevice->uConnectionRate <= RATE_6M)) {
2248 pDevice->wCurrentRate = RATE_6M;
2250 if (pDevice->uConnectionRate >= RATE_54M)
2251 pDevice->wCurrentRate = RATE_54M;
2253 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2257 pDevice->byACKRate = (unsigned char) pDevice->wCurrentRate;
2258 pDevice->byTopCCKBasicRate = RATE_1M;
2259 pDevice->byTopOFDMBasicRate = RATE_6M;
2262 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
2263 if (pDevice->eCurrentPHYType != PHY_TYPE_11A) {
2264 pDevice->wCurrentRate = RATE_1M;
2265 pDevice->byACKRate = RATE_1M;
2266 pDevice->byTopCCKBasicRate = RATE_1M;
2267 pDevice->byTopOFDMBasicRate = RATE_6M;
2269 pDevice->wCurrentRate = RATE_6M;
2270 pDevice->byACKRate = RATE_6M;
2271 pDevice->byTopCCKBasicRate = RATE_1M;
2272 pDevice->byTopOFDMBasicRate = RATE_6M;
2275 VNTWIFIvGetTxRate(pDevice->pMgmt,
2276 pDevice->sTxEthHeader.abyDstAddr,
2277 &(pDevice->wCurrentRate),
2278 &(pDevice->byACKRate),
2279 &(pDevice->byTopCCKBasicRate),
2280 &(pDevice->byTopOFDMBasicRate));
2285 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "acdma0: pDevice->wCurrentRate = %d \n", pDevice->wCurrentRate);
2287 if (pDevice->wCurrentRate <= RATE_11M) {
2288 byPktType = PK_TYPE_11B;
2289 } else if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2290 byPktType = PK_TYPE_11A;
2292 if (pDevice->bProtectMode == true) {
2293 byPktType = PK_TYPE_11GB;
2295 byPktType = PK_TYPE_11GA;
2299 //#ifdef PLICE_DEBUG
2300 // printk("FIX RATE:CurrentRate is %d");
2303 if (bNeedEncryption == true) {
2304 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType));
2305 if ((pDevice->sTxEthHeader.wType) == TYPE_PKT_802_1x) {
2306 bNeedEncryption = false;
2307 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType));
2308 if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2309 if (pTransmitKey == NULL) {
2310 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Don't Find TX KEY\n");
2312 if (bTKIP_UseGTK == true) {
2313 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "error: KEY is GTK!!~~\n");
2315 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
2316 bNeedEncryption = true;
2321 if (pDevice->byCntMeasure == 2) {
2323 pDevice->s802_11Counter.TKIPCounterMeasuresInvoked++;
2326 if (pDevice->bEnableHostWEP) {
2327 if ((uNodeIndex != 0) &&
2328 (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) {
2329 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
2330 bNeedEncryption = true;
2334 if (pTransmitKey == NULL) {
2335 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "return no tx key\n");
2336 dev_kfree_skb_irq(skb);
2337 spin_unlock_irq(&pDevice->lock);
2343 vGenerateFIFOHeader(pDevice, byPktType, pDevice->pbyTmpBuff, bNeedEncryption,
2344 cbFrameBodySize, TYPE_AC0DMA, pHeadTD,
2345 &pDevice->sTxEthHeader, (unsigned char *)skb->data, pTransmitKey, uNodeIndex,
2350 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2352 MACbPSWakeup(pDevice->PortOffset);
2354 pDevice->bPWBitOn = false;
2357 for (ii = 0; ii < uMACfragNum; ii++) {
2358 // Poll Transmit the adapter
2360 pHeadTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2362 if (ii == uMACfragNum - 1)
2364 pHeadTD = pHeadTD->next;
2367 // Save the information needed by the tx interrupt handler
2368 // to complete the Send request
2369 pLastTD->pTDInfo->skb = skb;
2370 pLastTD->pTDInfo->byFlags = 0;
2371 pLastTD->pTDInfo->byFlags |= TD_FLAGS_NETIF_SKB;
2373 pDevice->nTxDataTimeCout = 0; //2008-8-21 chester <add> for send null packet
2375 if (AVAIL_TD(pDevice, TYPE_AC0DMA) <= 1) {
2376 netif_stop_queue(dev);
2379 pDevice->apCurrTD[TYPE_AC0DMA] = pHeadTD;
2380 //#ifdef PLICE_DEBUG
2381 if (pDevice->bFixRate) {
2382 printk("FixRate:Rate is %d,TxPower is %d\n", pDevice->wCurrentRate, pDevice->byCurPwr);
2388 unsigned char Protocol_Version; //802.1x Authentication
2389 unsigned char Packet_Type; //802.1x Authentication
2390 unsigned char Descriptor_type;
2391 unsigned short Key_info;
2392 bool bTxeapol_key = false;
2393 Protocol_Version = skb->data[ETH_HLEN];
2394 Packet_Type = skb->data[ETH_HLEN+1];
2395 Descriptor_type = skb->data[ETH_HLEN+1+1+2];
2396 Key_info = (skb->data[ETH_HLEN+1+1+2+1] << 8)|(skb->data[ETH_HLEN+1+1+2+2]);
2397 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
2398 if (((Protocol_Version == 1) || (Protocol_Version == 2)) &&
2399 (Packet_Type == 3)) { //802.1x OR eapol-key challenge frame transfer
2400 bTxeapol_key = true;
2401 if ((Descriptor_type == 254) || (Descriptor_type == 2)) { //WPA or RSN
2402 if (!(Key_info & BIT3) && //group-key challenge
2403 (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key
2404 pDevice->fWPA_Authened = true;
2405 if (Descriptor_type == 254)
2409 printk("Authentication completed!!\n");
2416 MACvTransmitAC0(pDevice->PortOffset);
2417 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "acdma0:pDevice->apCurrTD= %p\n", pHeadTD);
2419 dev->trans_start = jiffies;
2421 spin_unlock_irq(&pDevice->lock);
2425 static irqreturn_t device_intr(int irq, void *dev_instance) {
2426 struct net_device *dev = dev_instance;
2427 PSDevice pDevice = (PSDevice)netdev_priv(dev);
2430 unsigned long dwMIBCounter = 0;
2431 PSMgmtObject pMgmt = pDevice->pMgmt;
2432 unsigned char byOrgPageSel = 0;
2434 unsigned char byData = 0;
2436 // unsigned char byRSSI;
2438 MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
2440 if (pDevice->dwIsr == 0)
2441 return IRQ_RETVAL(handled);
2443 if (pDevice->dwIsr == 0xffffffff) {
2444 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dwIsr = 0xffff\n");
2445 return IRQ_RETVAL(handled);
2448 // 2008-05-21 <mark> by Richardtai, we can't read RSSI here, because no packet bound with RSSI
2450 if ((pDevice->dwIsr & ISR_RXDMA0) &&
2451 (pDevice->byLocalID != REV_ID_VT3253_B0) &&
2452 (pDevice->bBSSIDFilter == true)) {
2454 //BBbReadEmbedded(pDevice->PortOffset, 0x3E, &byRSSI);
2455 //pDevice->uCurrRSSI = byRSSI;
2460 MACvIntDisable(pDevice->PortOffset);
2461 spin_lock_irq(&pDevice->lock);
2463 //Make sure current page is 0
2464 VNSvInPortB(pDevice->PortOffset + MAC_REG_PAGE1SEL, &byOrgPageSel);
2465 if (byOrgPageSel == 1) {
2466 MACvSelectPage0(pDevice->PortOffset);
2470 MACvReadMIBCounter(pDevice->PortOffset, &dwMIBCounter);
2472 // Must do this after doing rx/tx, cause ISR bit is slow
2473 // than RD/TD write back
2474 // update ISR counter
2475 STAvUpdate802_11Counter(&pDevice->s802_11Counter, &pDevice->scStatistic , dwMIBCounter);
2476 while (pDevice->dwIsr != 0) {
2477 STAvUpdateIsrStatCounter(&pDevice->scStatistic, pDevice->dwIsr);
2478 MACvWriteISR(pDevice->PortOffset, pDevice->dwIsr);
2480 if (pDevice->dwIsr & ISR_FETALERR) {
2481 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " ISR_FETALERR \n");
2482 VNSvOutPortB(pDevice->PortOffset + MAC_REG_SOFTPWRCTL, 0);
2483 VNSvOutPortW(pDevice->PortOffset + MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPECTI);
2484 device_error(pDevice, pDevice->dwIsr);
2487 if (pDevice->byLocalID > REV_ID_VT3253_B1) {
2488 if (pDevice->dwIsr & ISR_MEASURESTART) {
2489 // 802.11h measure start
2490 pDevice->byOrgChannel = pDevice->byCurrentCh;
2491 VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byOrgRCR));
2492 VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, (RCR_RXALLTYPE | RCR_UNICAST | RCR_BROADCAST | RCR_MULTICAST | RCR_WPAERR));
2493 MACvSelectPage1(pDevice->PortOffset);
2494 VNSvInPortD(pDevice->PortOffset + MAC_REG_MAR0, &(pDevice->dwOrgMAR0));
2495 VNSvInPortD(pDevice->PortOffset + MAC_REG_MAR4, &(pDevice->dwOrgMAR4));
2496 MACvSelectPage0(pDevice->PortOffset);
2498 // WCMDbFlushCommandQueue(pDevice->pMgmt, true);
2499 if (set_channel(pDevice, pDevice->pCurrMeasureEID->sReq.byChannel) == true) {
2500 pDevice->bMeasureInProgress = true;
2501 MACvSelectPage1(pDevice->PortOffset);
2502 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_READY);
2503 MACvSelectPage0(pDevice->PortOffset);
2504 pDevice->byBasicMap = 0;
2505 pDevice->byCCAFraction = 0;
2506 for (ii = 0; ii < 8; ii++) {
2507 pDevice->dwRPIs[ii] = 0;
2510 // can not measure because set channel fail
2511 // WCMDbResetCommandQueue(pDevice->pMgmt);
2512 // clear measure control
2513 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
2514 s_vCompleteCurrentMeasure(pDevice, MEASURE_MODE_INCAPABLE);
2515 MACvSelectPage1(pDevice->PortOffset);
2516 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2517 MACvSelectPage0(pDevice->PortOffset);
2520 if (pDevice->dwIsr & ISR_MEASUREEND) {
2521 // 802.11h measure end
2522 pDevice->bMeasureInProgress = false;
2523 VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byOrgRCR);
2524 MACvSelectPage1(pDevice->PortOffset);
2525 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, pDevice->dwOrgMAR0);
2526 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR4, pDevice->dwOrgMAR4);
2527 VNSvInPortB(pDevice->PortOffset + MAC_REG_MSRBBSTS, &byData);
2528 pDevice->byBasicMap |= (byData >> 4);
2529 VNSvInPortB(pDevice->PortOffset + MAC_REG_CCAFRACTION, &pDevice->byCCAFraction);
2530 VNSvInPortB(pDevice->PortOffset + MAC_REG_MSRCTL, &byData);
2531 // clear measure control
2532 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
2533 MACvSelectPage0(pDevice->PortOffset);
2534 set_channel(pDevice, pDevice->byOrgChannel);
2535 // WCMDbResetCommandQueue(pDevice->pMgmt);
2536 MACvSelectPage1(pDevice->PortOffset);
2537 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2538 MACvSelectPage0(pDevice->PortOffset);
2539 if (byData & MSRCTL_FINISH) {
2541 s_vCompleteCurrentMeasure(pDevice, 0);
2543 // can not measure because not ready before end of measure time
2544 s_vCompleteCurrentMeasure(pDevice, MEASURE_MODE_LATE);
2547 if (pDevice->dwIsr & ISR_QUIETSTART) {
2550 } while (CARDbStartQuiet(pDevice) == false);
2554 if (pDevice->dwIsr & ISR_TBTT) {
2555 if (pDevice->bEnableFirstQuiet == true) {
2556 pDevice->byQuietStartCount--;
2557 if (pDevice->byQuietStartCount == 0) {
2558 pDevice->bEnableFirstQuiet = false;
2559 MACvSelectPage1(pDevice->PortOffset);
2560 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN));
2561 MACvSelectPage0(pDevice->PortOffset);
2564 if ((pDevice->bChannelSwitch == true) &&
2565 (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE)) {
2566 pDevice->byChannelSwitchCount--;
2567 if (pDevice->byChannelSwitchCount == 0) {
2568 pDevice->bChannelSwitch = false;
2569 set_channel(pDevice, pDevice->byNewChannel);
2570 VNTWIFIbChannelSwitch(pDevice->pMgmt, pDevice->byNewChannel);
2571 MACvSelectPage1(pDevice->PortOffset);
2572 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2573 MACvSelectPage0(pDevice->PortOffset);
2574 CARDbStartTxPacket(pDevice, PKT_TYPE_802_11_ALL);
2578 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2579 //pDevice->bBeaconSent = false;
2581 if ((pDevice->bUpdateBBVGA) && (pDevice->bLinkPass == true) && (pDevice->uCurrRSSI != 0)) {
2584 RFvRSSITodBm(pDevice, (unsigned char) pDevice->uCurrRSSI, &ldBm);
2585 for (ii = 0; ii < BB_VGA_LEVEL; ii++) {
2586 if (ldBm < pDevice->ldBmThreshold[ii]) {
2587 pDevice->byBBVGANew = pDevice->abyBBVGA[ii];
2591 if (pDevice->byBBVGANew != pDevice->byBBVGACurrent) {
2592 pDevice->uBBVGADiffCount++;
2593 if (pDevice->uBBVGADiffCount == 1) {
2594 // first VGA diff gain
2595 BBvSetVGAGainOffset(pDevice, pDevice->byBBVGANew);
2596 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "First RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
2597 (int)ldBm, pDevice->byBBVGANew, pDevice->byBBVGACurrent, (int)pDevice->uBBVGADiffCount);
2599 if (pDevice->uBBVGADiffCount >= BB_VGA_CHANGE_THRESHOLD) {
2600 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
2601 (int)ldBm, pDevice->byBBVGANew, pDevice->byBBVGACurrent, (int)pDevice->uBBVGADiffCount);
2602 BBvSetVGAGainOffset(pDevice, pDevice->byBBVGANew);
2605 pDevice->uBBVGADiffCount = 1;
2610 pDevice->bBeaconSent = false;
2611 if (pDevice->bEnablePSMode) {
2612 PSbIsNextTBTTWakeUp((void *)pDevice);
2615 if ((pDevice->eOPMode == OP_MODE_AP) ||
2616 (pDevice->eOPMode == OP_MODE_ADHOC)) {
2617 MACvOneShotTimer1MicroSec(pDevice->PortOffset,
2618 (pMgmt->wIBSSBeaconPeriod - MAKE_BEACON_RESERVED) << 10);
2621 if (pDevice->eOPMode == OP_MODE_ADHOC && pDevice->pMgmt->wCurrATIMWindow > 0) {
2622 // todo adhoc PS mode
2627 if (pDevice->dwIsr & ISR_BNTX) {
2628 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2629 pDevice->bIsBeaconBufReadySet = false;
2630 pDevice->cbBeaconBufReadySetCnt = 0;
2633 if (pDevice->eOPMode == OP_MODE_AP) {
2634 if (pMgmt->byDTIMCount > 0) {
2635 pMgmt->byDTIMCount--;
2636 pMgmt->sNodeDBTable[0].bRxPSPoll = false;
2638 if (pMgmt->byDTIMCount == 0) {
2639 // check if mutltcast tx bufferring
2640 pMgmt->byDTIMCount = pMgmt->byDTIMPeriod - 1;
2641 pMgmt->sNodeDBTable[0].bRxPSPoll = true;
2642 bScheduleCommand((void *)pDevice, WLAN_CMD_RX_PSPOLL, NULL);
2646 pDevice->bBeaconSent = true;
2648 if (pDevice->bChannelSwitch == true) {
2649 pDevice->byChannelSwitchCount--;
2650 if (pDevice->byChannelSwitchCount == 0) {
2651 pDevice->bChannelSwitch = false;
2652 set_channel(pDevice, pDevice->byNewChannel);
2653 VNTWIFIbChannelSwitch(pDevice->pMgmt, pDevice->byNewChannel);
2654 MACvSelectPage1(pDevice->PortOffset);
2655 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2656 MACvSelectPage0(pDevice->PortOffset);
2657 //VNTWIFIbSendBeacon(pDevice->pMgmt);
2658 CARDbStartTxPacket(pDevice, PKT_TYPE_802_11_ALL);
2664 if (pDevice->dwIsr & ISR_RXDMA0) {
2665 max_count += device_rx_srv(pDevice, TYPE_RXDMA0);
2667 if (pDevice->dwIsr & ISR_RXDMA1) {
2668 max_count += device_rx_srv(pDevice, TYPE_RXDMA1);
2670 if (pDevice->dwIsr & ISR_TXDMA0) {
2671 max_count += device_tx_srv(pDevice, TYPE_TXDMA0);
2673 if (pDevice->dwIsr & ISR_AC0DMA) {
2674 max_count += device_tx_srv(pDevice, TYPE_AC0DMA);
2676 if (pDevice->dwIsr & ISR_SOFTTIMER) {
2678 if (pDevice->dwIsr & ISR_SOFTTIMER1) {
2679 if (pDevice->eOPMode == OP_MODE_AP) {
2680 if (pDevice->bShortSlotTime)
2681 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTSLOTTIME(1);
2683 pMgmt->wCurrCapInfo &= ~(WLAN_SET_CAP_INFO_SHORTSLOTTIME(1));
2685 bMgrPrepareBeaconToSend(pDevice, pMgmt);
2686 pDevice->byCntMeasure = 0;
2689 MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
2691 MACvReceive0(pDevice->PortOffset);
2692 MACvReceive1(pDevice->PortOffset);
2694 if (max_count > pDevice->sOpts.int_works)
2698 if (byOrgPageSel == 1) {
2699 MACvSelectPage1(pDevice->PortOffset);
2702 spin_unlock_irq(&pDevice->lock);
2703 MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
2705 return IRQ_RETVAL(handled);
2708 static unsigned const ethernet_polynomial = 0x04c11db7U;
2709 static inline u32 ether_crc(int length, unsigned char *data)
2713 while (--length >= 0) {
2714 unsigned char current_octet = *data++;
2716 for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
2718 ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
2724 //2008-8-4 <add> by chester
2725 static int Config_FileGetParameter(unsigned char *string,
2726 unsigned char *dest, unsigned char *source)
2728 unsigned char buf1[100];
2729 int source_len = strlen(source);
2731 memset(buf1, 0, 100);
2732 strcat(buf1, string);
2734 source += strlen(buf1);
2736 memcpy(dest, source, source_len - strlen(buf1));
2740 int Config_FileOperation(PSDevice pDevice, bool fwrite, unsigned char *Parameter) {
2741 unsigned char *config_path = CONFIG_PATH;
2742 unsigned char *buffer = NULL;
2743 unsigned char tmpbuffer[20];
2744 struct file *filp = NULL;
2745 mm_segment_t old_fs = get_fs();
2746 //int oldfsuid=0,oldfsgid=0;
2751 /* Can't do this anymore, so we rely on correct filesystem permissions:
2752 //Make sure a caller can read or write power as root
2753 oldfsuid=current->cred->fsuid;
2754 oldfsgid=current->cred->fsgid;
2755 current->cred->fsuid = 0;
2756 current->cred->fsgid = 0;
2760 filp = filp_open(config_path, O_RDWR, 0);
2762 printk("Config_FileOperation:open file fail?\n");
2767 if (!(filp->f_op) || !(filp->f_op->read) || !(filp->f_op->write)) {
2768 printk("file %s cann't readable or writable?\n", config_path);
2773 buffer = kmalloc(1024, GFP_KERNEL);
2774 if (buffer == NULL) {
2775 printk("allocate mem for file fail?\n");
2780 if (filp->f_op->read(filp, buffer, 1024, &filp->f_pos) < 0) {
2781 printk("read file error?\n");
2786 if (Config_FileGetParameter("ZONETYPE", tmpbuffer, buffer) != true) {
2787 printk("get parameter error?\n");
2792 if (memcmp(tmpbuffer, "USA", 3) == 0) {
2793 result = ZoneType_USA;
2794 } else if (memcmp(tmpbuffer, "JAPAN", 5) == 0) {
2795 result = ZoneType_Japan;
2796 } else if (memcmp(tmpbuffer, "EUROPE", 5) == 0) {
2797 result = ZoneType_Europe;
2800 printk("Unknown Zonetype[%s]?\n", tmpbuffer);
2806 if (filp_close(filp, NULL))
2807 printk("Config_FileOperation:close file fail\n");
2813 current->cred->fsuid=oldfsuid;
2814 current->cred->fsgid=oldfsgid;
2820 static void device_set_multi(struct net_device *dev) {
2821 PSDevice pDevice = (PSDevice)netdev_priv(dev);
2823 PSMgmtObject pMgmt = pDevice->pMgmt;
2825 struct netdev_hw_addr *ha;
2827 VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byRxMode));
2829 if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
2830 DBG_PRT(MSG_LEVEL_ERR, KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
2831 /* Unconditionally log net taps. */
2832 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
2833 } else if ((netdev_mc_count(dev) > pDevice->multicast_limit)
2834 || (dev->flags & IFF_ALLMULTI)) {
2835 MACvSelectPage1(pDevice->PortOffset);
2836 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, 0xffffffff);
2837 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0 + 4, 0xffffffff);
2838 MACvSelectPage0(pDevice->PortOffset);
2839 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
2841 memset(mc_filter, 0, sizeof(mc_filter));
2842 netdev_for_each_mc_addr(ha, dev) {
2843 int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
2844 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
2846 MACvSelectPage1(pDevice->PortOffset);
2847 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, mc_filter[0]);
2848 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0 + 4, mc_filter[1]);
2849 MACvSelectPage0(pDevice->PortOffset);
2850 pDevice->byRxMode &= ~(RCR_UNICAST);
2851 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
2854 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2855 // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
2856 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
2857 pDevice->byRxMode &= ~(RCR_UNICAST);
2860 VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byRxMode);
2861 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode = %x\n", pDevice->byRxMode);
2864 static struct net_device_stats *device_get_stats(struct net_device *dev) {
2865 PSDevice pDevice = (PSDevice)netdev_priv(dev);
2867 return &pDevice->stats;
2870 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
2871 PSDevice pDevice = (PSDevice)netdev_priv(dev);
2873 struct iwreq *wrq = (struct iwreq *)rq;
2875 PSMgmtObject pMgmt = pDevice->pMgmt;
2878 if (pMgmt == NULL) {
2885 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
2888 case SIOCGIWNWID: //0x8b03 support
2892 // Set frequency/channel
2894 rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
2897 // Get frequency/channel
2899 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
2902 // Set desired network name (ESSID)
2906 char essid[IW_ESSID_MAX_SIZE+1];
2907 if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
2911 if (copy_from_user(essid, wrq->u.essid.pointer,
2912 wrq->u.essid.length)) {
2916 rc = iwctl_siwessid(dev, NULL,
2917 &(wrq->u.essid), essid);
2921 // Get current network name (ESSID)
2925 char essid[IW_ESSID_MAX_SIZE+1];
2926 if (wrq->u.essid.pointer)
2927 rc = iwctl_giwessid(dev, NULL,
2928 &(wrq->u.essid), essid);
2929 if (copy_to_user(wrq->u.essid.pointer,
2931 wrq->u.essid.length))
2938 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
2941 // Get current Access Point (BSSID)
2943 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
2946 // Set desired station name
2948 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
2952 // Get current station name
2954 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
2958 // Set the desired bit-rate
2960 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
2963 // Get the current bit-rate
2966 rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
2969 // Set the desired RTS threshold
2972 rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
2975 // Get the current RTS threshold
2978 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
2981 // Set the desired fragmentation threshold
2984 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
2987 // Get the current fragmentation threshold
2990 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
2993 // Set mode of operation
2995 rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
2998 // Get mode of operation
3000 rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
3003 // Set WEP keys and mode
3004 case SIOCSIWENCODE: {
3005 char abyKey[WLAN_WEP232_KEYLEN];
3007 if (wrq->u.encoding.pointer) {
3008 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
3012 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
3013 if (copy_from_user(abyKey,
3014 wrq->u.encoding.pointer,
3015 wrq->u.encoding.length)) {
3019 } else if (wrq->u.encoding.length != 0) {
3023 rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
3027 // Get the WEP keys and mode
3030 if (!capable(CAP_NET_ADMIN)) {
3035 char abyKey[WLAN_WEP232_KEYLEN];
3037 rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
3039 if (wrq->u.encoding.pointer) {
3040 if (copy_to_user(wrq->u.encoding.pointer,
3042 wrq->u.encoding.length))
3048 // Get the current Tx-Power
3050 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
3055 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWTXPOW \n");
3061 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
3066 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
3069 // Get range of parameters
3073 struct iw_range range;
3075 rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *)&range);
3076 if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
3084 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
3089 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
3094 rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
3098 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
3102 case SIOCGIWAPLIST: {
3103 char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
3105 if (wrq->u.data.pointer) {
3106 rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
3108 if (copy_to_user(wrq->u.data.pointer,
3110 (wrq->u.data.length * (sizeof(struct sockaddr) + sizeof(struct iw_quality)))
3122 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
3129 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWSPY \n");
3133 #endif // WIRELESS_SPY
3136 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
3139 if (wrq->u.data.pointer) {
3140 wrq->u.data.length = sizeof(iwctl_private_args) / sizeof(iwctl_private_args[0]);
3142 if (copy_to_user(wrq->u.data.pointer,
3143 (u_char *) iwctl_private_args,
3144 sizeof(iwctl_private_args)))
3150 //2008-0409-07, <Add> by Einsn Liu
3151 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3153 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH \n");
3154 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
3158 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
3159 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
3163 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
3164 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3168 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
3169 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3172 case SIOCSIWENCODEEXT: {
3173 char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
3174 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
3175 if (wrq->u.encoding.pointer) {
3176 memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN + 1);
3177 if (wrq->u.encoding.length > (sizeof(struct iw_encode_ext) + MAX_KEY_LEN)) {
3181 if (copy_from_user(extra, wrq->u.encoding.pointer, wrq->u.encoding.length)) {
3185 } else if (wrq->u.encoding.length != 0) {
3189 rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
3193 case SIOCGIWENCODEEXT:
3194 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
3195 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
3199 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
3200 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
3203 #endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3204 //End Add -- //2008-0409-07, <Add> by Einsn Liu
3206 case IOCTL_CMD_TEST:
3208 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
3214 pReq = (PSCmdRequest)rq;
3215 pReq->wResult = MAGIC_CODE;
3221 if ((((PSCmdRequest)rq)->wCmdCode != WLAN_CMD_SET_EVT) &&
3222 !(pDevice->flags & DEVICE_FLAGS_OPENED))
3224 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
3225 (((PSCmdRequest)rq)->wCmdCode != WLAN_CMD_SET_WPA))
3234 if (test_and_set_bit(0, (void *)&(pMgmt->uCmdBusy))) {
3237 rc = private_ioctl(pDevice, rq);
3238 clear_bit(0, (void *)&(pMgmt->uCmdBusy));
3241 case IOCTL_CMD_HOSTAPD:
3243 rc = vt6655_hostap_ioctl(pDevice, &wrq->u.data);
3248 rc = wpa_ioctl(pDevice, &wrq->u.data);
3252 return ethtool_ioctl(dev, (void *)rq->ifr_data);
3253 // All other calls are currently unsupported
3257 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
3261 if (pDevice->bCommit) {
3262 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
3263 netif_stop_queue(pDevice->dev);
3264 spin_lock_irq(&pDevice->lock);
3265 bScheduleCommand((void *)pDevice, WLAN_CMD_RUN_AP, NULL);
3266 spin_unlock_irq(&pDevice->lock);
3268 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
3269 spin_lock_irq(&pDevice->lock);
3270 pDevice->bLinkPass = false;
3271 memset(pMgmt->abyCurrBSSID, 0, 6);
3272 pMgmt->eCurrState = WMAC_STATE_IDLE;
3273 netif_stop_queue(pDevice->dev);
3274 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
3275 pMgmt->eScanType = WMAC_SCAN_ACTIVE;
3276 if (pDevice->bWPASuppWextEnabled != true)
3278 bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
3279 bScheduleCommand((void *)pDevice, WLAN_CMD_SSID, NULL);
3280 spin_unlock_irq(&pDevice->lock);
3282 pDevice->bCommit = false;
3288 static int ethtool_ioctl(struct net_device *dev, void *useraddr)
3292 if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd)))
3296 case ETHTOOL_GDRVINFO: {
3297 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
3298 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
3299 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
3300 if (copy_to_user(useraddr, &info, sizeof(info)))
3310 /*------------------------------------------------------------------*/
3312 MODULE_DEVICE_TABLE(pci, vt6655_pci_id_table);
3314 static struct pci_driver device_driver = {
3315 .name = DEVICE_NAME,
3316 .id_table = vt6655_pci_id_table,
3317 .probe = vt6655_probe,
3318 .remove = vt6655_remove,
3320 .suspend = viawget_suspend,
3321 .resume = viawget_resume,
3325 static int __init vt6655_init_module(void)
3329 // ret=pci_module_init(&device_driver);
3330 //ret = pcie_port_service_register(&device_driver);
3331 ret = pci_register_driver(&device_driver);
3334 register_reboot_notifier(&device_notifier);
3340 static void __exit vt6655_cleanup_module(void)
3343 unregister_reboot_notifier(&device_notifier);
3345 pci_unregister_driver(&device_driver);
3348 module_init(vt6655_init_module);
3349 module_exit(vt6655_cleanup_module);
3353 device_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
3355 struct pci_dev *pdev = NULL;
3360 for_each_pci_dev(pdev) {
3361 if (pci_dev_driver(pdev) == &device_driver) {
3362 if (pci_get_drvdata(pdev))
3363 viawget_suspend(pdev, PMSG_HIBERNATE);
3371 viawget_suspend(struct pci_dev *pcid, pm_message_t state)
3373 int power_status; // to silence the compiler
3375 PSDevice pDevice = pci_get_drvdata(pcid);
3376 PSMgmtObject pMgmt = pDevice->pMgmt;
3378 netif_stop_queue(pDevice->dev);
3379 spin_lock_irq(&pDevice->lock);
3380 pci_save_state(pcid);
3381 del_timer(&pDevice->sTimerCommand);
3382 del_timer(&pMgmt->sTimerSecondCallback);
3383 pDevice->cbFreeCmdQueue = CMD_Q_SIZE;
3384 pDevice->uCmdDequeueIdx = 0;
3385 pDevice->uCmdEnqueueIdx = 0;
3386 pDevice->bCmdRunning = false;
3387 MACbShutdown(pDevice->PortOffset);
3388 MACvSaveContext(pDevice->PortOffset, pDevice->abyMacContext);
3389 pDevice->bLinkPass = false;
3390 memset(pMgmt->abyCurrBSSID, 0, 6);
3391 pMgmt->eCurrState = WMAC_STATE_IDLE;
3392 pci_disable_device(pcid);
3393 power_status = pci_set_power_state(pcid, pci_choose_state(pcid, state));
3394 spin_unlock_irq(&pDevice->lock);
3399 viawget_resume(struct pci_dev *pcid)
3401 PSDevice pDevice = pci_get_drvdata(pcid);
3402 PSMgmtObject pMgmt = pDevice->pMgmt;
3403 int power_status; // to silence the compiler
3405 power_status = pci_set_power_state(pcid, 0);
3406 power_status = pci_enable_wake(pcid, 0, 0);
3407 pci_restore_state(pcid);
3408 if (netif_running(pDevice->dev)) {
3409 spin_lock_irq(&pDevice->lock);
3410 MACvRestoreContext(pDevice->PortOffset, pDevice->abyMacContext);
3411 device_init_registers(pDevice, DEVICE_INIT_DXPL);
3412 if (pMgmt->sNodeDBTable[0].bActive == true) { // Assoc with BSS
3413 pMgmt->sNodeDBTable[0].bActive = false;
3414 pDevice->bLinkPass = false;
3415 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
3416 // In Adhoc, BSS state set back to started.
3417 pMgmt->eCurrState = WMAC_STATE_STARTED;
3419 pMgmt->eCurrMode = WMAC_MODE_STANDBY;
3420 pMgmt->eCurrState = WMAC_STATE_IDLE;
3423 init_timer(&pMgmt->sTimerSecondCallback);
3424 init_timer(&pDevice->sTimerCommand);
3425 MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
3426 BSSvClearBSSList((void *)pDevice, pDevice->bLinkPass);
3427 bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
3428 bScheduleCommand((void *)pDevice, WLAN_CMD_SSID, NULL);
3429 spin_unlock_irq(&pDevice->lock);