1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61#undef __NO_VERSION__
62
63#include <linux/file.h>
64#include "device.h"
65#include "card.h"
66#include "channel.h"
67#include "baseband.h"
68#include "mac.h"
69#include "tether.h"
70#include "wmgr.h"
71#include "wctl.h"
72#include "power.h"
73#include "wcmd.h"
74#include "iocmd.h"
75#include "tcrc.h"
76#include "rxtx.h"
77#include "wroute.h"
78#include "bssdb.h"
79#include "hostap.h"
80#include "wpactl.h"
81#include "ioctl.h"
82#include "iwctl.h"
83#include "dpc.h"
84#include "datarate.h"
85#include "rf.h"
86#include "iowpa.h"
87#include <linux/delay.h>
88#include <linux/kthread.h>
89#include <linux/slab.h>
90
91
92
93
94
95MODULE_AUTHOR("VIA Networking Technologies, Inc., <lyndonchen@vntek.com.tw>");
96MODULE_LICENSE("GPL");
97MODULE_DESCRIPTION("VIA Networking Solomon-A/B/G Wireless LAN Adapter Driver");
98
99#define DEVICE_PARAM(N, D)
100
101#define RX_DESC_MIN0 16
102#define RX_DESC_MAX0 128
103#define RX_DESC_DEF0 32
104DEVICE_PARAM(RxDescriptors0, "Number of receive descriptors0");
105
106#define RX_DESC_MIN1 16
107#define RX_DESC_MAX1 128
108#define RX_DESC_DEF1 32
109DEVICE_PARAM(RxDescriptors1, "Number of receive descriptors1");
110
111#define TX_DESC_MIN0 16
112#define TX_DESC_MAX0 128
113#define TX_DESC_DEF0 32
114DEVICE_PARAM(TxDescriptors0, "Number of transmit descriptors0");
115
116#define TX_DESC_MIN1 16
117#define TX_DESC_MAX1 128
118#define TX_DESC_DEF1 64
119DEVICE_PARAM(TxDescriptors1, "Number of transmit descriptors1");
120
121#define IP_ALIG_DEF 0
122
123
124
125
126
127
128DEVICE_PARAM(IP_byte_align, "Enable IP header dword aligned");
129
130#define INT_WORKS_DEF 20
131#define INT_WORKS_MIN 10
132#define INT_WORKS_MAX 64
133
134DEVICE_PARAM(int_works, "Number of packets per interrupt services");
135
136#define CHANNEL_MIN 1
137#define CHANNEL_MAX 14
138#define CHANNEL_DEF 6
139
140DEVICE_PARAM(Channel, "Channel number");
141
142
143
144
145
146
147#define PREAMBLE_TYPE_DEF 1
148
149DEVICE_PARAM(PreambleType, "Preamble Type");
150
151#define RTS_THRESH_MIN 512
152#define RTS_THRESH_MAX 2347
153#define RTS_THRESH_DEF 2347
154
155DEVICE_PARAM(RTSThreshold, "RTS threshold");
156
157#define FRAG_THRESH_MIN 256
158#define FRAG_THRESH_MAX 2346
159#define FRAG_THRESH_DEF 2346
160
161DEVICE_PARAM(FragThreshold, "Fragmentation threshold");
162
163#define DATA_RATE_MIN 0
164#define DATA_RATE_MAX 13
165#define DATA_RATE_DEF 13
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183DEVICE_PARAM(ConnectionRate, "Connection data rate");
184
185#define OP_MODE_DEF 0
186
187DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode ");
188
189
190
191
192
193
194
195
196
197
198
199
200#define PS_MODE_DEF 0
201
202DEVICE_PARAM(PSMode, "Power saving mode");
203
204#define SHORT_RETRY_MIN 0
205#define SHORT_RETRY_MAX 31
206#define SHORT_RETRY_DEF 8
207
208DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");
209
210#define LONG_RETRY_MIN 0
211#define LONG_RETRY_MAX 15
212#define LONG_RETRY_DEF 4
213
214DEVICE_PARAM(LongRetryLimit, "long frame retry limits");
215
216
217
218
219
220
221#define BBP_TYPE_MIN 0
222#define BBP_TYPE_MAX 2
223#define BBP_TYPE_DEF 2
224
225DEVICE_PARAM(BasebandType, "baseband type");
226
227
228
229
230
231
232#define X80211h_MODE_DEF 0
233
234DEVICE_PARAM(b80211hEnable, "802.11h mode");
235
236
237
238
239
240
241#define DIVERSITY_ANT_DEF 0
242
243DEVICE_PARAM(bDiversityANTEnable, "ANT diversity mode");
244
245
246
247
248static CHIP_INFO chip_info_table[] = {
249 { VT3253, "VIA Networking Solomon-A/B/G Wireless LAN Adapter ",
250 256, 1, DEVICE_FLAGS_IP_ALIGN|DEVICE_FLAGS_TX_ALIGN },
251 {0, NULL}
252};
253
254static const struct pci_device_id vt6655_pci_id_table[] = {
255 { PCI_VDEVICE(VIA, 0x3253), (kernel_ulong_t)chip_info_table},
256 { 0, }
257};
258
259
260
261static int vt6655_probe(struct pci_dev *pcid, const struct pci_device_id *ent);
262static void vt6655_init_info(struct pci_dev *pcid,
263 struct vnt_private **ppDevice, PCHIP_INFO);
264static void device_free_info(struct vnt_private *pDevice);
265static bool device_get_pci_info(struct vnt_private *, struct pci_dev *pcid);
266static void device_print_info(struct vnt_private *pDevice);
267static void device_init_diversity_timer(struct vnt_private *pDevice);
268static int device_open(struct net_device *dev);
269static int device_xmit(struct sk_buff *skb, struct net_device *dev);
270static irqreturn_t device_intr(int irq, void *dev_instance);
271static void device_set_multi(struct net_device *dev);
272static int device_close(struct net_device *dev);
273static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
274
275#ifdef CONFIG_PM
276static int device_notify_reboot(struct notifier_block *, unsigned long event, void *ptr);
277static int viawget_suspend(struct pci_dev *pcid, pm_message_t state);
278static int viawget_resume(struct pci_dev *pcid);
279static struct notifier_block device_notifier = {
280 .notifier_call = device_notify_reboot,
281 .next = NULL,
282 .priority = 0,
283};
284#endif
285
286static void device_init_rd0_ring(struct vnt_private *pDevice);
287static void device_init_rd1_ring(struct vnt_private *pDevice);
288static void device_init_defrag_cb(struct vnt_private *pDevice);
289static void device_init_td0_ring(struct vnt_private *pDevice);
290static void device_init_td1_ring(struct vnt_private *pDevice);
291
292static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev);
293
294static bool device_release_WPADEV(struct vnt_private *pDevice);
295
296static int ethtool_ioctl(struct net_device *dev, void __user *useraddr);
297static int device_rx_srv(struct vnt_private *pDevice, unsigned int uIdx);
298static int device_tx_srv(struct vnt_private *pDevice, unsigned int uIdx);
299static bool device_alloc_rx_buf(struct vnt_private *pDevice, PSRxDesc pDesc);
300static void device_init_registers(struct vnt_private *pDevice);
301static void device_free_tx_buf(struct vnt_private *pDevice, PSTxDesc pDesc);
302static void device_free_td0_ring(struct vnt_private *pDevice);
303static void device_free_td1_ring(struct vnt_private *pDevice);
304static void device_free_rd0_ring(struct vnt_private *pDevice);
305static void device_free_rd1_ring(struct vnt_private *pDevice);
306static void device_free_rings(struct vnt_private *pDevice);
307static void device_free_frag_buf(struct vnt_private *pDevice);
308static int Config_FileGetParameter(unsigned char *string,
309 unsigned char *dest, unsigned char *source);
310
311
312
313
314
315static char *get_chip_name(int chip_id)
316{
317 int i;
318
319 for (i = 0; chip_info_table[i].name != NULL; i++)
320 if (chip_info_table[i].chip_id == chip_id)
321 break;
322 return chip_info_table[i].name;
323}
324
325static void vt6655_remove(struct pci_dev *pcid)
326{
327 struct vnt_private *pDevice = pci_get_drvdata(pcid);
328
329 if (pDevice == NULL)
330 return;
331 device_free_info(pDevice);
332}
333
334static void device_get_options(struct vnt_private *pDevice)
335{
336 POPTIONS pOpts = &(pDevice->sOpts);
337
338 pOpts->nRxDescs0 = RX_DESC_DEF0;
339 pOpts->nRxDescs1 = RX_DESC_DEF1;
340 pOpts->nTxDescs[0] = TX_DESC_DEF0;
341 pOpts->nTxDescs[1] = TX_DESC_DEF1;
342 pOpts->flags |= DEVICE_FLAGS_IP_ALIGN;
343 pOpts->int_works = INT_WORKS_DEF;
344 pOpts->rts_thresh = RTS_THRESH_DEF;
345 pOpts->frag_thresh = FRAG_THRESH_DEF;
346 pOpts->data_rate = DATA_RATE_DEF;
347 pOpts->channel_num = CHANNEL_DEF;
348
349 pOpts->flags |= DEVICE_FLAGS_PREAMBLE_TYPE;
350 pOpts->flags |= DEVICE_FLAGS_OP_MODE;
351 pOpts->short_retry = SHORT_RETRY_DEF;
352 pOpts->long_retry = LONG_RETRY_DEF;
353 pOpts->bbp_type = BBP_TYPE_DEF;
354 pOpts->flags |= DEVICE_FLAGS_80211h_MODE;
355 pOpts->flags |= DEVICE_FLAGS_DiversityANT;
356}
357
358static void
359device_set_options(struct vnt_private *pDevice)
360{
361 unsigned char abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
362 unsigned char abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
363 unsigned char abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
364
365 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
366 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
367 memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, ETH_ALEN);
368
369 pDevice->uChannel = pDevice->sOpts.channel_num;
370 pDevice->wRTSThreshold = pDevice->sOpts.rts_thresh;
371 pDevice->wFragmentationThreshold = pDevice->sOpts.frag_thresh;
372 pDevice->byShortRetryLimit = pDevice->sOpts.short_retry;
373 pDevice->byLongRetryLimit = pDevice->sOpts.long_retry;
374 pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME;
375 pDevice->byShortPreamble = (pDevice->sOpts.flags & DEVICE_FLAGS_PREAMBLE_TYPE) ? 1 : 0;
376 pDevice->byOpMode = (pDevice->sOpts.flags & DEVICE_FLAGS_OP_MODE) ? 1 : 0;
377 pDevice->ePSMode = (pDevice->sOpts.flags & DEVICE_FLAGS_PS_MODE) ? 1 : 0;
378 pDevice->b11hEnable = (pDevice->sOpts.flags & DEVICE_FLAGS_80211h_MODE) ? 1 : 0;
379 pDevice->bDiversityRegCtlON = (pDevice->sOpts.flags & DEVICE_FLAGS_DiversityANT) ? 1 : 0;
380 pDevice->uConnectionRate = pDevice->sOpts.data_rate;
381 if (pDevice->uConnectionRate < RATE_AUTO)
382 pDevice->bFixRate = true;
383 pDevice->byBBType = pDevice->sOpts.bbp_type;
384 pDevice->byPacketType = (VIA_PKT_TYPE)pDevice->byBBType;
385 pDevice->byAutoFBCtrl = AUTO_FB_0;
386 pDevice->bUpdateBBVGA = true;
387 pDevice->byFOETuning = 0;
388 pDevice->byPreambleType = 0;
389
390 pr_debug(" uChannel= %d\n", (int)pDevice->uChannel);
391 pr_debug(" byOpMode= %d\n", (int)pDevice->byOpMode);
392 pr_debug(" ePSMode= %d\n", (int)pDevice->ePSMode);
393 pr_debug(" wRTSThreshold= %d\n", (int)pDevice->wRTSThreshold);
394 pr_debug(" byShortRetryLimit= %d\n", (int)pDevice->byShortRetryLimit);
395 pr_debug(" byLongRetryLimit= %d\n", (int)pDevice->byLongRetryLimit);
396 pr_debug(" byPreambleType= %d\n", (int)pDevice->byPreambleType);
397 pr_debug(" byShortPreamble= %d\n", (int)pDevice->byShortPreamble);
398 pr_debug(" uConnectionRate= %d\n", (int)pDevice->uConnectionRate);
399 pr_debug(" byBBType= %d\n", (int)pDevice->byBBType);
400 pr_debug(" pDevice->b11hEnable= %d\n", (int)pDevice->b11hEnable);
401 pr_debug(" pDevice->bDiversityRegCtlON= %d\n",
402 (int)pDevice->bDiversityRegCtlON);
403}
404
405static void s_vCompleteCurrentMeasure(struct vnt_private *pDevice,
406 unsigned char byResult)
407{
408 unsigned int ii;
409 unsigned long dwDuration = 0;
410 unsigned char byRPI0 = 0;
411
412 for (ii = 1; ii < 8; ii++) {
413 pDevice->dwRPIs[ii] *= 255;
414 dwDuration |= *((unsigned short *)(pDevice->pCurrMeasureEID->sReq.abyDuration));
415 dwDuration <<= 10;
416 pDevice->dwRPIs[ii] /= dwDuration;
417 pDevice->abyRPIs[ii] = (unsigned char)pDevice->dwRPIs[ii];
418 byRPI0 += pDevice->abyRPIs[ii];
419 }
420 pDevice->abyRPIs[0] = (0xFF - byRPI0);
421
422 if (pDevice->uNumOfMeasureEIDs == 0) {
423 VNTWIFIbMeasureReport(pDevice->pMgmt,
424 true,
425 pDevice->pCurrMeasureEID,
426 byResult,
427 pDevice->byBasicMap,
428 pDevice->byCCAFraction,
429 pDevice->abyRPIs
430 );
431 } else {
432 VNTWIFIbMeasureReport(pDevice->pMgmt,
433 false,
434 pDevice->pCurrMeasureEID,
435 byResult,
436 pDevice->byBasicMap,
437 pDevice->byCCAFraction,
438 pDevice->abyRPIs
439 );
440 CARDbStartMeasure(pDevice, pDevice->pCurrMeasureEID++, pDevice->uNumOfMeasureEIDs);
441 }
442}
443
444
445
446
447
448static void device_init_registers(struct vnt_private *pDevice)
449{
450 unsigned int ii;
451 unsigned char byValue;
452 unsigned char byValue1;
453 unsigned char byCCKPwrdBm = 0;
454 unsigned char byOFDMPwrdBm = 0;
455 int zonetype = 0;
456 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
457
458 MACbShutdown(pDevice->PortOffset);
459 BBvSoftwareReset(pDevice->PortOffset);
460
461
462 MACbSoftwareReset(pDevice->PortOffset);
463
464 pDevice->bAES = false;
465
466
467 pDevice->bProtectMode = false;
468
469 pDevice->bNonERPPresent = false;
470 pDevice->bBarkerPreambleMd = false;
471 pDevice->wCurrentRate = RATE_1M;
472 pDevice->byTopOFDMBasicRate = RATE_24M;
473 pDevice->byTopCCKBasicRate = RATE_1M;
474
475
476 pDevice->byRevId = 0;
477
478
479 MACvInitialize(pDevice->PortOffset);
480
481
482 VNSvInPortB(pDevice->PortOffset + MAC_REG_LOCALID, &pDevice->byLocalID);
483
484 spin_lock_irq(&pDevice->lock);
485
486 SROMvReadAllContents(pDevice->PortOffset, pDevice->abyEEPROM);
487
488 spin_unlock_irq(&pDevice->lock);
489
490
491 pDevice->byMinChannel = 1;
492 pDevice->byMaxChannel = CB_MAX_CHANNEL;
493
494
495 byValue = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ANTENNA);
496 if (byValue & EEP_ANTINV)
497 pDevice->bTxRxAntInv = true;
498 else
499 pDevice->bTxRxAntInv = false;
500
501 byValue &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
502
503 if (byValue == 0)
504 byValue = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
505
506 pDevice->ulDiversityNValue = 100*260;
507 pDevice->ulDiversityMValue = 100*16;
508 pDevice->byTMax = 1;
509 pDevice->byTMax2 = 4;
510 pDevice->ulSQ3TH = 0;
511 pDevice->byTMax3 = 64;
512
513 if (byValue == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
514 pDevice->byAntennaCount = 2;
515 pDevice->byTxAntennaMode = ANT_B;
516 pDevice->dwTxAntennaSel = 1;
517 pDevice->dwRxAntennaSel = 1;
518
519 if (pDevice->bTxRxAntInv)
520 pDevice->byRxAntennaMode = ANT_A;
521 else
522 pDevice->byRxAntennaMode = ANT_B;
523
524 byValue1 = SROMbyReadEmbedded(pDevice->PortOffset,
525 EEP_OFS_ANTENNA);
526
527 if ((byValue1 & 0x08) == 0)
528 pDevice->bDiversityEnable = false;
529 else
530 pDevice->bDiversityEnable = true;
531 } else {
532 pDevice->bDiversityEnable = false;
533 pDevice->byAntennaCount = 1;
534 pDevice->dwTxAntennaSel = 0;
535 pDevice->dwRxAntennaSel = 0;
536
537 if (byValue & EEP_ANTENNA_AUX) {
538 pDevice->byTxAntennaMode = ANT_A;
539
540 if (pDevice->bTxRxAntInv)
541 pDevice->byRxAntennaMode = ANT_B;
542 else
543 pDevice->byRxAntennaMode = ANT_A;
544 } else {
545 pDevice->byTxAntennaMode = ANT_B;
546
547 if (pDevice->bTxRxAntInv)
548 pDevice->byRxAntennaMode = ANT_A;
549 else
550 pDevice->byRxAntennaMode = ANT_B;
551 }
552 }
553
554 pr_debug("bDiversityEnable=[%d],NValue=[%d],MValue=[%d],TMax=[%d],TMax2=[%d]\n",
555 pDevice->bDiversityEnable, (int)pDevice->ulDiversityNValue,
556 (int)pDevice->ulDiversityMValue, pDevice->byTMax,
557 pDevice->byTMax2);
558
559
560 pDevice->byOriginalZonetype = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
561 zonetype = Config_FileOperation(pDevice, false, NULL);
562
563 if (zonetype >= 0) {
564 if ((zonetype == 0) &&
565 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] != 0x00)) {
566
567 pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0;
568 pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0B;
569
570 pr_debug("Init Zone Type :USA\n");
571 } else if ((zonetype == 1) &&
572 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] != 0x01)) {
573
574 pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0x01;
575 pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
576 } else if ((zonetype == 2) &&
577 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] != 0x02)) {
578
579 pDevice->abyEEPROM[EEP_OFS_ZONETYPE] = 0x02;
580 pDevice->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
581
582 pr_debug("Init Zone Type :Europe\n");
583 } else {
584 if (zonetype != pDevice->abyEEPROM[EEP_OFS_ZONETYPE])
585 pr_debug("zonetype in file[%02x] mismatch with in EEPROM[%02x]\n",
586 zonetype,
587 pDevice->abyEEPROM[EEP_OFS_ZONETYPE]);
588 else
589 pr_debug("Read Zonetype file success,use default zonetype setting[%02x]\n",
590 zonetype);
591 }
592 } else {
593 pr_debug("Read Zonetype file fail,use default zonetype setting[%02x]\n",
594 SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ZONETYPE));
595 }
596
597
598 pDevice->byRFType = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RFTYPE);
599
600
601 if ((pDevice->byRFType & RF_EMU) != 0)
602 pDevice->byRevId = 0x80;
603
604 pDevice->byRFType &= RF_MASK;
605 pr_debug("pDevice->byRFType = %x\n", pDevice->byRFType);
606
607 if (!pDevice->bZoneRegExist)
608 pDevice->byZoneType = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
609
610 pr_debug("pDevice->byZoneType = %x\n", pDevice->byZoneType);
611
612
613 RFbInit(pDevice);
614
615
616 pDevice->byCurPwr = 0xFF;
617 pDevice->byCCKPwr = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_PWR_CCK);
618 pDevice->byOFDMPwrG = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_PWR_OFDMG);
619
620
621 for (ii = 0; ii < CB_MAX_CHANNEL_24G; ii++) {
622 pDevice->abyCCKPwrTbl[ii + 1] =
623 SROMbyReadEmbedded(pDevice->PortOffset,
624 (unsigned char)(ii + EEP_OFS_CCK_PWR_TBL));
625 if (pDevice->abyCCKPwrTbl[ii + 1] == 0)
626 pDevice->abyCCKPwrTbl[ii+1] = pDevice->byCCKPwr;
627
628 pDevice->abyOFDMPwrTbl[ii + 1] =
629 SROMbyReadEmbedded(pDevice->PortOffset,
630 (unsigned char)(ii + EEP_OFS_OFDM_PWR_TBL));
631 if (pDevice->abyOFDMPwrTbl[ii + 1] == 0)
632 pDevice->abyOFDMPwrTbl[ii + 1] = pDevice->byOFDMPwrG;
633
634 pDevice->abyCCKDefaultPwr[ii + 1] = byCCKPwrdBm;
635 pDevice->abyOFDMDefaultPwr[ii + 1] = byOFDMPwrdBm;
636 }
637
638
639 if (((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) ||
640 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe)) &&
641 (pDevice->byOriginalZonetype == ZoneType_USA)) {
642 for (ii = 11; ii < 14; ii++) {
643 pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
644 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];
645
646 }
647 }
648
649
650 for (ii = 0; ii < CB_MAX_CHANNEL_5G; ii++) {
651 pDevice->abyOFDMPwrTbl[ii + CB_MAX_CHANNEL_24G + 1] =
652 SROMbyReadEmbedded(pDevice->PortOffset,
653 (unsigned char)(ii + EEP_OFS_OFDMA_PWR_TBL));
654
655 pDevice->abyOFDMDefaultPwr[ii + CB_MAX_CHANNEL_24G + 1] =
656 SROMbyReadEmbedded(pDevice->PortOffset,
657 (unsigned char)(ii + EEP_OFS_OFDMA_PWR_dBm));
658 }
659
660 init_channel_table((void *)pDevice);
661
662 if (pDevice->byLocalID > REV_ID_VT3253_B1) {
663 MACvSelectPage1(pDevice->PortOffset);
664
665 VNSvOutPortB(pDevice->PortOffset + MAC_REG_MSRCTL + 1,
666 (MSRCTL1_TXPWR | MSRCTL1_CSAPAREN));
667
668 MACvSelectPage0(pDevice->PortOffset);
669 }
670
671
672 MACvWordRegBitsOn(pDevice->PortOffset,
673 MAC_REG_CFG, (CFG_TKIPOPT | CFG_NOTXTIMEOUT));
674
675
676 MACvSetShortRetryLimit(pDevice->PortOffset, pDevice->byShortRetryLimit);
677 MACvSetLongRetryLimit(pDevice->PortOffset, pDevice->byLongRetryLimit);
678
679
680 VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
681
682 VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
683
684
685 BBbVT3253Init(pDevice);
686
687 if (pDevice->bUpdateBBVGA) {
688 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
689 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
690 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
691 }
692
693 BBvSetRxAntennaMode(pDevice->PortOffset, pDevice->byRxAntennaMode);
694 BBvSetTxAntennaMode(pDevice->PortOffset, pDevice->byTxAntennaMode);
695
696 pDevice->byCurrentCh = 0;
697
698
699
700 if (pDevice->uConnectionRate == RATE_AUTO)
701 pDevice->wCurrentRate = RATE_54M;
702 else
703 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
704
705
706 VNTWIFIbConfigPhyMode(pDevice->pMgmt, PHY_TYPE_11G);
707 VNTWIFIbConfigPhyMode(pDevice->pMgmt, PHY_TYPE_AUTO);
708
709 pDevice->bRadioOff = false;
710
711 pDevice->byRadioCtl = SROMbyReadEmbedded(pDevice->PortOffset,
712 EEP_OFS_RADIOCTL);
713 pDevice->bHWRadioOff = false;
714
715 if (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) {
716
717 MACvGPIOIn(pDevice->PortOffset, &pDevice->byGPIO);
718
719 if (((pDevice->byGPIO & GPIO0_DATA) &&
720 !(pDevice->byRadioCtl & EEP_RADIOCTL_INV)) ||
721 (!(pDevice->byGPIO & GPIO0_DATA) &&
722 (pDevice->byRadioCtl & EEP_RADIOCTL_INV)))
723 pDevice->bHWRadioOff = true;
724 }
725
726 if (pDevice->bHWRadioOff || pDevice->bRadioControlOff)
727 CARDbRadioPowerOff(pDevice);
728
729 pMgmt->eScanType = WMAC_SCAN_PASSIVE;
730
731
732 SROMvReadEtherAddress(pDevice->PortOffset, pDevice->abyCurrentNetAddr);
733 pr_debug("Network address = %pM\n", pDevice->abyCurrentNetAddr);
734
735
736 CARDvSafeResetRx(pDevice);
737
738 CARDvSafeResetTx(pDevice);
739
740 if (pDevice->byLocalID <= REV_ID_VT3253_A1)
741 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_RCR, RCR_WPAERR);
742
743 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
744
745
746 MACvReceive0(pDevice->PortOffset);
747 MACvReceive1(pDevice->PortOffset);
748
749
750 MACvStart(pDevice->PortOffset);
751
752 netif_stop_queue(pDevice->dev);
753}
754
755static void device_init_diversity_timer(struct vnt_private *pDevice)
756{
757 init_timer(&pDevice->TimerSQ3Tmax1);
758 pDevice->TimerSQ3Tmax1.data = (unsigned long) pDevice;
759 pDevice->TimerSQ3Tmax1.function = (TimerFunction)TimerSQ3CallBack;
760 pDevice->TimerSQ3Tmax1.expires = RUN_AT(HZ);
761
762 init_timer(&pDevice->TimerSQ3Tmax2);
763 pDevice->TimerSQ3Tmax2.data = (unsigned long) pDevice;
764 pDevice->TimerSQ3Tmax2.function = (TimerFunction)TimerSQ3CallBack;
765 pDevice->TimerSQ3Tmax2.expires = RUN_AT(HZ);
766
767 init_timer(&pDevice->TimerSQ3Tmax3);
768 pDevice->TimerSQ3Tmax3.data = (unsigned long) pDevice;
769 pDevice->TimerSQ3Tmax3.function = (TimerFunction)TimerState1CallBack;
770 pDevice->TimerSQ3Tmax3.expires = RUN_AT(HZ);
771}
772
773static bool device_release_WPADEV(struct vnt_private *pDevice)
774{
775 viawget_wpa_header *wpahdr;
776 int ii = 0;
777
778
779 if (pDevice->bWPADEVUp) {
780 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
781 wpahdr->type = VIAWGET_DEVICECLOSE_MSG;
782 wpahdr->resp_ie_len = 0;
783 wpahdr->req_ie_len = 0;
784 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
785 pDevice->skb->dev = pDevice->wpadev;
786 skb_reset_mac_header(pDevice->skb);
787 pDevice->skb->pkt_type = PACKET_HOST;
788 pDevice->skb->protocol = htons(ETH_P_802_2);
789 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
790 netif_rx(pDevice->skb);
791 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
792
793 while (pDevice->bWPADEVUp) {
794 set_current_state(TASK_UNINTERRUPTIBLE);
795 schedule_timeout(HZ / 20);
796 ii++;
797 if (ii > 20)
798 break;
799 }
800 }
801 return true;
802}
803
804static const struct net_device_ops device_netdev_ops = {
805 .ndo_open = device_open,
806 .ndo_stop = device_close,
807 .ndo_do_ioctl = device_ioctl,
808 .ndo_start_xmit = device_xmit,
809 .ndo_set_rx_mode = device_set_multi,
810};
811
812static int
813vt6655_probe(struct pci_dev *pcid, const struct pci_device_id *ent)
814{
815 static bool bFirst = true;
816 struct net_device *dev = NULL;
817 PCHIP_INFO pChip_info = (PCHIP_INFO)ent->driver_data;
818 struct vnt_private *pDevice;
819 int rc;
820
821 dev = alloc_etherdev(sizeof(*pDevice));
822
823 pDevice = netdev_priv(dev);
824
825 if (dev == NULL) {
826 pr_err(DEVICE_NAME ": allocate net device failed\n");
827 return -ENOMEM;
828 }
829
830
831 SET_NETDEV_DEV(dev, &pcid->dev);
832
833 if (bFirst) {
834 pr_notice("%s Ver. %s\n", DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
835 pr_notice("Copyright (c) 2003 VIA Networking Technologies, Inc.\n");
836 bFirst = false;
837 }
838
839 vt6655_init_info(pcid, &pDevice, pChip_info);
840 pDevice->dev = dev;
841
842 if (pci_enable_device(pcid)) {
843 device_free_info(pDevice);
844 return -ENODEV;
845 }
846 dev->irq = pcid->irq;
847
848#ifdef DEBUG
849 pr_debug("Before get pci_info memaddr is %x\n", pDevice->memaddr);
850#endif
851 if (!device_get_pci_info(pDevice, pcid)) {
852 pr_err(DEVICE_NAME ": Failed to find PCI device.\n");
853 device_free_info(pDevice);
854 return -ENODEV;
855 }
856
857#if 1
858
859#ifdef DEBUG
860
861 pr_debug("after get pci_info memaddr is %x, io addr is %x,io_size is %d\n", pDevice->memaddr, pDevice->ioaddr, pDevice->io_size);
862 {
863 int i;
864 u32 bar, len;
865 u32 address[] = {
866 PCI_BASE_ADDRESS_0,
867 PCI_BASE_ADDRESS_1,
868 PCI_BASE_ADDRESS_2,
869 PCI_BASE_ADDRESS_3,
870 PCI_BASE_ADDRESS_4,
871 PCI_BASE_ADDRESS_5,
872 0};
873 for (i = 0; address[i]; i++) {
874 pci_read_config_dword(pcid, address[i], &bar);
875 pr_debug("bar %d is %x\n", i, bar);
876 if (!bar) {
877 pr_debug("bar %d not implemented\n", i);
878 continue;
879 }
880 if (bar & PCI_BASE_ADDRESS_SPACE_IO) {
881
882
883 len = bar & (PCI_BASE_ADDRESS_IO_MASK & 0xFFFF);
884 len = len & ~(len - 1);
885
886 pr_debug("IO space: len in IO %x, BAR %d\n", len, i);
887 } else {
888 len = bar & 0xFFFFFFF0;
889 len = ~len + 1;
890
891 pr_debug("len in MEM %x, BAR %d\n", len, i);
892 }
893 }
894 }
895#endif
896
897#endif
898
899 pDevice->PortOffset = ioremap(pDevice->memaddr & PCI_BASE_ADDRESS_MEM_MASK, pDevice->io_size);
900
901 if (pDevice->PortOffset == NULL) {
902 pr_err(DEVICE_NAME ": Failed to IO remapping ..\n");
903 device_free_info(pDevice);
904 return -ENODEV;
905 }
906
907 rc = pci_request_regions(pcid, DEVICE_NAME);
908 if (rc) {
909 pr_err(DEVICE_NAME ": Failed to find PCI device\n");
910 device_free_info(pDevice);
911 return -ENODEV;
912 }
913
914 dev->base_addr = pDevice->ioaddr;
915
916 if (!MACbSoftwareReset(pDevice->PortOffset)) {
917 pr_err(DEVICE_NAME ": Failed to access MAC hardware..\n");
918 device_free_info(pDevice);
919 return -ENODEV;
920 }
921
922 MACvInitialize(pDevice->PortOffset);
923 MACvReadEtherAddress(pDevice->PortOffset, dev->dev_addr);
924
925 device_get_options(pDevice);
926 device_set_options(pDevice);
927
928 pDevice->sOpts.flags &= pChip_info->flags;
929
930
931 pDevice->flags = pDevice->sOpts.flags | (pChip_info->flags & 0xFF000000UL);
932 pDevice->tx_80211 = device_dma0_tx_80211;
933 pDevice->sMgmtObj.pAdapter = (void *)pDevice;
934 pDevice->pMgmt = &(pDevice->sMgmtObj);
935
936 dev->irq = pcid->irq;
937 dev->netdev_ops = &device_netdev_ops;
938
939 dev->wireless_handlers = (struct iw_handler_def *)&iwctl_handler_def;
940
941 rc = register_netdev(dev);
942 if (rc) {
943 pr_err(DEVICE_NAME " Failed to register netdev\n");
944 device_free_info(pDevice);
945 return -ENODEV;
946 }
947 device_print_info(pDevice);
948 pci_set_drvdata(pcid, pDevice);
949 return 0;
950}
951
952static void device_print_info(struct vnt_private *pDevice)
953{
954 struct net_device *dev = pDevice->dev;
955
956 pr_info("%s: %s\n", dev->name, get_chip_name(pDevice->chip_id));
957 pr_info("%s: MAC=%pM IO=0x%lx Mem=0x%lx IRQ=%d\n",
958 dev->name, dev->dev_addr, (unsigned long)pDevice->ioaddr,
959 (unsigned long)pDevice->PortOffset, pDevice->dev->irq);
960}
961
962static void vt6655_init_info(struct pci_dev *pcid,
963 struct vnt_private **ppDevice,
964 PCHIP_INFO pChip_info)
965{
966 memset(*ppDevice, 0, sizeof(**ppDevice));
967
968 (*ppDevice)->pcid = pcid;
969 (*ppDevice)->chip_id = pChip_info->chip_id;
970 (*ppDevice)->io_size = pChip_info->io_size;
971 (*ppDevice)->nTxQueues = pChip_info->nTxQueue;
972 (*ppDevice)->multicast_limit = 32;
973
974 spin_lock_init(&((*ppDevice)->lock));
975}
976
977static bool device_get_pci_info(struct vnt_private *pDevice,
978 struct pci_dev *pcid)
979{
980 u16 pci_cmd;
981 u8 b;
982 unsigned int cis_addr;
983
984 pci_read_config_byte(pcid, PCI_REVISION_ID, &pDevice->byRevId);
985 pci_read_config_word(pcid, PCI_SUBSYSTEM_ID, &pDevice->SubSystemID);
986 pci_read_config_word(pcid, PCI_SUBSYSTEM_VENDOR_ID, &pDevice->SubVendorID);
987 pci_read_config_word(pcid, PCI_COMMAND, (u16 *)&(pci_cmd));
988
989 pci_set_master(pcid);
990
991 pDevice->memaddr = pci_resource_start(pcid, 0);
992 pDevice->ioaddr = pci_resource_start(pcid, 1);
993
994 cis_addr = pci_resource_start(pcid, 2);
995
996 pDevice->pcid = pcid;
997
998 pci_read_config_byte(pcid, PCI_COMMAND, &b);
999 pci_write_config_byte(pcid, PCI_COMMAND, (b|PCI_COMMAND_MASTER));
1000
1001 return true;
1002}
1003
1004static void device_free_info(struct vnt_private *pDevice)
1005{
1006 struct net_device *dev = pDevice->dev;
1007
1008 ASSERT(pDevice);
1009
1010 device_release_WPADEV(pDevice);
1011
1012
1013
1014 if (wpa_set_wpadev(pDevice, 0) != 0)
1015 pr_err("unregister wpadev fail?\n");
1016
1017#ifdef HOSTAP
1018 if (dev)
1019 vt6655_hostap_set_hostapd(pDevice, 0, 0);
1020#endif
1021 if (dev)
1022 unregister_netdev(dev);
1023
1024 if (pDevice->PortOffset)
1025 iounmap(pDevice->PortOffset);
1026
1027 if (pDevice->pcid)
1028 pci_release_regions(pDevice->pcid);
1029 if (dev)
1030 free_netdev(dev);
1031}
1032
1033static bool device_init_rings(struct vnt_private *pDevice)
1034{
1035 void *vir_pool;
1036
1037
1038 vir_pool = pci_zalloc_consistent(pDevice->pcid,
1039 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1040 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1041 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1042 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
1043 &pDevice->pool_dma);
1044 if (vir_pool == NULL) {
1045 dev_err(&pDevice->pcid->dev, "allocate desc dma memory failed\n");
1046 return false;
1047 }
1048
1049 pDevice->aRD0Ring = vir_pool;
1050 pDevice->aRD1Ring = vir_pool +
1051 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
1052
1053 pDevice->rd0_pool_dma = pDevice->pool_dma;
1054 pDevice->rd1_pool_dma = pDevice->rd0_pool_dma +
1055 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
1056
1057 pDevice->tx0_bufs = pci_zalloc_consistent(pDevice->pcid,
1058 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
1059 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
1060 CB_BEACON_BUF_SIZE +
1061 CB_MAX_BUF_SIZE,
1062 &pDevice->tx_bufs_dma0);
1063 if (pDevice->tx0_bufs == NULL) {
1064 dev_err(&pDevice->pcid->dev, "allocate buf dma memory failed\n");
1065
1066 pci_free_consistent(pDevice->pcid,
1067 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1068 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1069 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1070 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
1071 vir_pool, pDevice->pool_dma
1072 );
1073 return false;
1074 }
1075
1076 pDevice->td0_pool_dma = pDevice->rd1_pool_dma +
1077 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
1078
1079 pDevice->td1_pool_dma = pDevice->td0_pool_dma +
1080 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
1081
1082
1083 pDevice->apTD0Rings = vir_pool
1084 + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
1085 + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
1086
1087 pDevice->apTD1Rings = vir_pool
1088 + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
1089 + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc)
1090 + pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
1091
1092 pDevice->tx1_bufs = pDevice->tx0_bufs +
1093 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
1094
1095 pDevice->tx_beacon_bufs = pDevice->tx1_bufs +
1096 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
1097
1098 pDevice->pbyTmpBuff = pDevice->tx_beacon_bufs +
1099 CB_BEACON_BUF_SIZE;
1100
1101 pDevice->tx_bufs_dma1 = pDevice->tx_bufs_dma0 +
1102 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
1103
1104 pDevice->tx_beacon_dma = pDevice->tx_bufs_dma1 +
1105 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
1106
1107 return true;
1108}
1109
1110static void device_free_rings(struct vnt_private *pDevice)
1111{
1112 pci_free_consistent(pDevice->pcid,
1113 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
1114 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
1115 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
1116 pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc)
1117 ,
1118 pDevice->aRD0Ring, pDevice->pool_dma
1119 );
1120
1121 if (pDevice->tx0_bufs)
1122 pci_free_consistent(pDevice->pcid,
1123 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
1124 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
1125 CB_BEACON_BUF_SIZE +
1126 CB_MAX_BUF_SIZE,
1127 pDevice->tx0_bufs, pDevice->tx_bufs_dma0
1128 );
1129}
1130
1131static void device_init_rd0_ring(struct vnt_private *pDevice)
1132{
1133 int i;
1134 dma_addr_t curr = pDevice->rd0_pool_dma;
1135 PSRxDesc pDesc;
1136
1137
1138 for (i = 0; i < pDevice->sOpts.nRxDescs0; i ++, curr += sizeof(SRxDesc)) {
1139 pDesc = &(pDevice->aRD0Ring[i]);
1140 pDesc->pRDInfo = alloc_rd_info();
1141 ASSERT(pDesc->pRDInfo);
1142 if (!device_alloc_rx_buf(pDevice, pDesc))
1143 dev_err(&pDevice->pcid->dev, "can not alloc rx bufs\n");
1144
1145 pDesc->next = &(pDevice->aRD0Ring[(i+1) % pDevice->sOpts.nRxDescs0]);
1146 pDesc->pRDInfo->curr_desc = cpu_to_le32(curr);
1147 pDesc->next_desc = cpu_to_le32(curr + sizeof(SRxDesc));
1148 }
1149
1150 if (i > 0)
1151 pDevice->aRD0Ring[i-1].next_desc = cpu_to_le32(pDevice->rd0_pool_dma);
1152 pDevice->pCurrRD[0] = &(pDevice->aRD0Ring[0]);
1153}
1154
1155static void device_init_rd1_ring(struct vnt_private *pDevice)
1156{
1157 int i;
1158 dma_addr_t curr = pDevice->rd1_pool_dma;
1159 PSRxDesc pDesc;
1160
1161
1162 for (i = 0; i < pDevice->sOpts.nRxDescs1; i ++, curr += sizeof(SRxDesc)) {
1163 pDesc = &(pDevice->aRD1Ring[i]);
1164 pDesc->pRDInfo = alloc_rd_info();
1165 ASSERT(pDesc->pRDInfo);
1166 if (!device_alloc_rx_buf(pDevice, pDesc))
1167 dev_err(&pDevice->pcid->dev, "can not alloc rx bufs\n");
1168
1169 pDesc->next = &(pDevice->aRD1Ring[(i+1) % pDevice->sOpts.nRxDescs1]);
1170 pDesc->pRDInfo->curr_desc = cpu_to_le32(curr);
1171 pDesc->next_desc = cpu_to_le32(curr + sizeof(SRxDesc));
1172 }
1173
1174 if (i > 0)
1175 pDevice->aRD1Ring[i-1].next_desc = cpu_to_le32(pDevice->rd1_pool_dma);
1176 pDevice->pCurrRD[1] = &(pDevice->aRD1Ring[0]);
1177}
1178
1179static void device_init_defrag_cb(struct vnt_private *pDevice)
1180{
1181 int i;
1182 PSDeFragControlBlock pDeF;
1183
1184
1185 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1186 pDeF = &(pDevice->sRxDFCB[i]);
1187 if (!device_alloc_frag_buf(pDevice, pDeF))
1188 dev_err(&pDevice->pcid->dev, "can not alloc frag bufs\n");
1189 }
1190 pDevice->cbDFCB = CB_MAX_RX_FRAG;
1191 pDevice->cbFreeDFCB = pDevice->cbDFCB;
1192}
1193
1194static void device_free_rd0_ring(struct vnt_private *pDevice)
1195{
1196 int i;
1197
1198 for (i = 0; i < pDevice->sOpts.nRxDescs0; i++) {
1199 PSRxDesc pDesc = &(pDevice->aRD0Ring[i]);
1200 PDEVICE_RD_INFO pRDInfo = pDesc->pRDInfo;
1201
1202 pci_unmap_single(pDevice->pcid, pRDInfo->skb_dma,
1203 pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1204
1205 dev_kfree_skb(pRDInfo->skb);
1206
1207 kfree((void *)pDesc->pRDInfo);
1208 }
1209}
1210
1211static void device_free_rd1_ring(struct vnt_private *pDevice)
1212{
1213 int i;
1214
1215 for (i = 0; i < pDevice->sOpts.nRxDescs1; i++) {
1216 PSRxDesc pDesc = &(pDevice->aRD1Ring[i]);
1217 PDEVICE_RD_INFO pRDInfo = pDesc->pRDInfo;
1218
1219 pci_unmap_single(pDevice->pcid, pRDInfo->skb_dma,
1220 pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1221
1222 dev_kfree_skb(pRDInfo->skb);
1223
1224 kfree((void *)pDesc->pRDInfo);
1225 }
1226}
1227
1228static void device_free_frag_buf(struct vnt_private *pDevice)
1229{
1230 PSDeFragControlBlock pDeF;
1231 int i;
1232
1233 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1234 pDeF = &(pDevice->sRxDFCB[i]);
1235
1236 if (pDeF->skb)
1237 dev_kfree_skb(pDeF->skb);
1238
1239 }
1240}
1241
1242static void device_init_td0_ring(struct vnt_private *pDevice)
1243{
1244 int i;
1245 dma_addr_t curr;
1246 PSTxDesc pDesc;
1247
1248 curr = pDevice->td0_pool_dma;
1249 for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++, curr += sizeof(STxDesc)) {
1250 pDesc = &(pDevice->apTD0Rings[i]);
1251 pDesc->pTDInfo = alloc_td_info();
1252 ASSERT(pDesc->pTDInfo);
1253 if (pDevice->flags & DEVICE_FLAGS_TX_ALIGN) {
1254 pDesc->pTDInfo->buf = pDevice->tx0_bufs + (i)*PKT_BUF_SZ;
1255 pDesc->pTDInfo->buf_dma = pDevice->tx_bufs_dma0 + (i)*PKT_BUF_SZ;
1256 }
1257 pDesc->next = &(pDevice->apTD0Rings[(i+1) % pDevice->sOpts.nTxDescs[0]]);
1258 pDesc->pTDInfo->curr_desc = cpu_to_le32(curr);
1259 pDesc->next_desc = cpu_to_le32(curr+sizeof(STxDesc));
1260 }
1261
1262 if (i > 0)
1263 pDevice->apTD0Rings[i-1].next_desc = cpu_to_le32(pDevice->td0_pool_dma);
1264 pDevice->apTailTD[0] = pDevice->apCurrTD[0] = &(pDevice->apTD0Rings[0]);
1265}
1266
1267static void device_init_td1_ring(struct vnt_private *pDevice)
1268{
1269 int i;
1270 dma_addr_t curr;
1271 PSTxDesc pDesc;
1272
1273
1274 curr = pDevice->td1_pool_dma;
1275 for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++, curr += sizeof(STxDesc)) {
1276 pDesc = &(pDevice->apTD1Rings[i]);
1277 pDesc->pTDInfo = alloc_td_info();
1278 ASSERT(pDesc->pTDInfo);
1279 if (pDevice->flags & DEVICE_FLAGS_TX_ALIGN) {
1280 pDesc->pTDInfo->buf = pDevice->tx1_bufs + (i) * PKT_BUF_SZ;
1281 pDesc->pTDInfo->buf_dma = pDevice->tx_bufs_dma1 + (i) * PKT_BUF_SZ;
1282 }
1283 pDesc->next = &(pDevice->apTD1Rings[(i + 1) % pDevice->sOpts.nTxDescs[1]]);
1284 pDesc->pTDInfo->curr_desc = cpu_to_le32(curr);
1285 pDesc->next_desc = cpu_to_le32(curr+sizeof(STxDesc));
1286 }
1287
1288 if (i > 0)
1289 pDevice->apTD1Rings[i-1].next_desc = cpu_to_le32(pDevice->td1_pool_dma);
1290 pDevice->apTailTD[1] = pDevice->apCurrTD[1] = &(pDevice->apTD1Rings[0]);
1291}
1292
1293static void device_free_td0_ring(struct vnt_private *pDevice)
1294{
1295 int i;
1296
1297 for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++) {
1298 PSTxDesc pDesc = &(pDevice->apTD0Rings[i]);
1299 PDEVICE_TD_INFO pTDInfo = pDesc->pTDInfo;
1300
1301 if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma))
1302 pci_unmap_single(pDevice->pcid, pTDInfo->skb_dma,
1303 pTDInfo->skb->len, PCI_DMA_TODEVICE);
1304
1305 if (pTDInfo->skb)
1306 dev_kfree_skb(pTDInfo->skb);
1307
1308 kfree((void *)pDesc->pTDInfo);
1309 }
1310}
1311
1312static void device_free_td1_ring(struct vnt_private *pDevice)
1313{
1314 int i;
1315
1316 for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++) {
1317 PSTxDesc pDesc = &(pDevice->apTD1Rings[i]);
1318 PDEVICE_TD_INFO pTDInfo = pDesc->pTDInfo;
1319
1320 if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma))
1321 pci_unmap_single(pDevice->pcid, pTDInfo->skb_dma,
1322 pTDInfo->skb->len, PCI_DMA_TODEVICE);
1323
1324 if (pTDInfo->skb)
1325 dev_kfree_skb(pTDInfo->skb);
1326
1327 kfree((void *)pDesc->pTDInfo);
1328 }
1329}
1330
1331
1332
1333static int device_rx_srv(struct vnt_private *pDevice, unsigned int uIdx)
1334{
1335 PSRxDesc pRD;
1336 int works = 0;
1337
1338 for (pRD = pDevice->pCurrRD[uIdx];
1339 pRD->m_rd0RD0.f1Owner == OWNED_BY_HOST;
1340 pRD = pRD->next) {
1341 if (works++ > 15)
1342 break;
1343 if (device_receive_frame(pDevice, pRD)) {
1344 if (!device_alloc_rx_buf(pDevice, pRD)) {
1345 dev_err(&pDevice->pcid->dev,
1346 "can not allocate rx buf\n");
1347 break;
1348 }
1349 }
1350 pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
1351 pDevice->dev->last_rx = jiffies;
1352 }
1353
1354 pDevice->pCurrRD[uIdx] = pRD;
1355
1356 return works;
1357}
1358
1359static bool device_alloc_rx_buf(struct vnt_private *pDevice, PSRxDesc pRD)
1360{
1361 PDEVICE_RD_INFO pRDInfo = pRD->pRDInfo;
1362
1363 pRDInfo->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1364 if (pRDInfo->skb == NULL)
1365 return false;
1366 ASSERT(pRDInfo->skb);
1367 pRDInfo->skb->dev = pDevice->dev;
1368 pRDInfo->skb_dma = pci_map_single(pDevice->pcid, skb_tail_pointer(pRDInfo->skb),
1369 pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
1370 *((unsigned int *)&(pRD->m_rd0RD0)) = 0;
1371
1372 pRD->m_rd0RD0.wResCount = cpu_to_le16(pDevice->rx_buf_sz);
1373 pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
1374 pRD->m_rd1RD1.wReqCount = cpu_to_le16(pDevice->rx_buf_sz);
1375 pRD->buff_addr = cpu_to_le32(pRDInfo->skb_dma);
1376
1377 return true;
1378}
1379
1380bool device_alloc_frag_buf(struct vnt_private *pDevice,
1381 PSDeFragControlBlock pDeF)
1382{
1383 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1384 if (pDeF->skb == NULL)
1385 return false;
1386 ASSERT(pDeF->skb);
1387 pDeF->skb->dev = pDevice->dev;
1388
1389 return true;
1390}
1391
1392static int device_tx_srv(struct vnt_private *pDevice, unsigned int uIdx)
1393{
1394 PSTxDesc pTD;
1395 bool bFull = false;
1396 int works = 0;
1397 unsigned char byTsr0;
1398 unsigned char byTsr1;
1399 unsigned int uFrameSize, uFIFOHeaderSize;
1400 PSTxBufHead pTxBufHead;
1401 struct net_device_stats *pStats = &pDevice->dev->stats;
1402 struct sk_buff *skb;
1403 unsigned int uNodeIndex;
1404 PSMgmtObject pMgmt = pDevice->pMgmt;
1405
1406 for (pTD = pDevice->apTailTD[uIdx]; pDevice->iTDUsed[uIdx] > 0; pTD = pTD->next) {
1407 if (pTD->m_td0TD0.f1Owner == OWNED_BY_NIC)
1408 break;
1409 if (works++ > 15)
1410 break;
1411
1412 byTsr0 = pTD->m_td0TD0.byTSR0;
1413 byTsr1 = pTD->m_td0TD0.byTSR1;
1414
1415
1416 if (pTD->m_td1TD1.byTCR & TCR_STP) {
1417 if ((pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0) {
1418 uFIFOHeaderSize = pTD->pTDInfo->dwHeaderLength;
1419 uFrameSize = pTD->pTDInfo->dwReqCount - uFIFOHeaderSize;
1420 pTxBufHead = (PSTxBufHead) (pTD->pTDInfo->buf);
1421
1422
1423
1424 STAvUpdateTDStatCounter(&pDevice->scStatistic,
1425 byTsr0, byTsr1,
1426 (unsigned char *)(pTD->pTDInfo->buf + uFIFOHeaderSize),
1427 uFrameSize, uIdx);
1428
1429 BSSvUpdateNodeTxCounter(pDevice,
1430 byTsr0, byTsr1,
1431 (unsigned char *)(pTD->pTDInfo->buf),
1432 uFIFOHeaderSize
1433 );
1434
1435 if (!(byTsr1 & TSR1_TERR)) {
1436 if (byTsr0 != 0) {
1437 pr_debug(" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X]\n",
1438 (int)uIdx, byTsr1,
1439 byTsr0);
1440 }
1441 if ((pTxBufHead->wFragCtl & FRAGCTL_ENDFRAG) != FRAGCTL_NONFRAG)
1442 pDevice->s802_11Counter.TransmittedFragmentCount++;
1443
1444 pStats->tx_packets++;
1445 pStats->tx_bytes += pTD->pTDInfo->skb->len;
1446 } else {
1447 pr_debug(" Tx[%d] dropped & tsr1[%02X] tsr0[%02X]\n",
1448 (int)uIdx, byTsr1, byTsr0);
1449 pStats->tx_errors++;
1450 pStats->tx_dropped++;
1451 }
1452 }
1453
1454 if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
1455 if (pDevice->bEnableHostapd) {
1456 pr_debug("tx call back netif..\n");
1457 skb = pTD->pTDInfo->skb;
1458 skb->dev = pDevice->apdev;
1459 skb_reset_mac_header(skb);
1460 skb->pkt_type = PACKET_OTHERHOST;
1461 memset(skb->cb, 0, sizeof(skb->cb));
1462 netif_rx(skb);
1463 }
1464 }
1465
1466 if (byTsr1 & TSR1_TERR) {
1467 if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
1468 pr_debug(" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X]\n",
1469 (int)uIdx, byTsr1, byTsr0);
1470 }
1471
1472
1473 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
1474 (pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB)) {
1475 unsigned short wAID;
1476 unsigned char byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
1477
1478 skb = pTD->pTDInfo->skb;
1479 if (BSSDBbIsSTAInNodeDB(pMgmt, (unsigned char *)(skb->data), &uNodeIndex)) {
1480 if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
1481 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
1482 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
1483
1484 wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
1485 pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
1486 pTD->pTDInfo->byFlags &= ~(TD_FLAGS_NETIF_SKB);
1487 pr_debug("tx_srv:tx fail re-queue sta index= %d, QueCnt= %d\n",
1488 (int)uNodeIndex,
1489 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt);
1490 pStats->tx_errors--;
1491 pStats->tx_dropped--;
1492 }
1493 }
1494 }
1495 }
1496 device_free_tx_buf(pDevice, pTD);
1497 pDevice->iTDUsed[uIdx]--;
1498 }
1499 }
1500
1501 if (uIdx == TYPE_AC0DMA) {
1502
1503
1504 if (AVAIL_TD(pDevice, uIdx) < RESERV_AC0DMA) {
1505 bFull = true;
1506 pr_debug(" AC0DMA is Full = %d\n",
1507 pDevice->iTDUsed[uIdx]);
1508 }
1509 if (netif_queue_stopped(pDevice->dev) && !bFull)
1510 netif_wake_queue(pDevice->dev);
1511
1512 }
1513
1514 pDevice->apTailTD[uIdx] = pTD;
1515
1516 return works;
1517}
1518
1519static void device_error(struct vnt_private *pDevice, unsigned short status)
1520{
1521 if (status & ISR_FETALERR) {
1522 dev_err(&pDevice->pcid->dev, "Hardware fatal error\n");
1523
1524 netif_stop_queue(pDevice->dev);
1525 del_timer(&pDevice->sTimerCommand);
1526 del_timer(&(pDevice->pMgmt->sTimerSecondCallback));
1527 pDevice->bCmdRunning = false;
1528 MACbShutdown(pDevice->PortOffset);
1529 return;
1530 }
1531}
1532
1533static void device_free_tx_buf(struct vnt_private *pDevice, PSTxDesc pDesc)
1534{
1535 PDEVICE_TD_INFO pTDInfo = pDesc->pTDInfo;
1536 struct sk_buff *skb = pTDInfo->skb;
1537
1538
1539 if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma)) {
1540 pci_unmap_single(pDevice->pcid, pTDInfo->skb_dma, skb->len,
1541 PCI_DMA_TODEVICE);
1542 }
1543
1544 if ((pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0)
1545 dev_kfree_skb_irq(skb);
1546
1547 pTDInfo->skb_dma = 0;
1548 pTDInfo->skb = NULL;
1549 pTDInfo->byFlags = 0;
1550}
1551
1552static int device_open(struct net_device *dev)
1553{
1554 struct vnt_private *pDevice = netdev_priv(dev);
1555 int i;
1556#ifdef WPA_SM_Transtatus
1557 extern SWPAResult wpa_Result;
1558#endif
1559
1560 pDevice->rx_buf_sz = PKT_BUF_SZ;
1561 if (!device_init_rings(pDevice))
1562 return -ENOMEM;
1563
1564
1565 i = request_irq(pDevice->pcid->irq, &device_intr, IRQF_SHARED, dev->name, dev);
1566 if (i)
1567 return i;
1568
1569#ifdef WPA_SM_Transtatus
1570 memset(wpa_Result.ifname, 0, sizeof(wpa_Result.ifname));
1571 wpa_Result.proto = 0;
1572 wpa_Result.key_mgmt = 0;
1573 wpa_Result.eap_type = 0;
1574 wpa_Result.authenticated = false;
1575 pDevice->fWPA_Authened = false;
1576#endif
1577 pr_debug("call device init rd0 ring\n");
1578 device_init_rd0_ring(pDevice);
1579 device_init_rd1_ring(pDevice);
1580 device_init_defrag_cb(pDevice);
1581 device_init_td0_ring(pDevice);
1582 device_init_td1_ring(pDevice);
1583
1584 if (pDevice->bDiversityRegCtlON)
1585 device_init_diversity_timer(pDevice);
1586
1587 vMgrObjectInit(pDevice);
1588 vMgrTimerInit(pDevice);
1589
1590 pr_debug("call device_init_registers\n");
1591 device_init_registers(pDevice);
1592
1593 MACvReadEtherAddress(pDevice->PortOffset, pDevice->abyCurrentNetAddr);
1594 memcpy(pDevice->pMgmt->abyMACAddr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1595 device_set_multi(pDevice->dev);
1596
1597
1598 KeyvInitTable(&pDevice->sKey, pDevice->PortOffset);
1599 add_timer(&(pDevice->pMgmt->sTimerSecondCallback));
1600
1601#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1602 pDevice->bwextcount = 0;
1603 pDevice->bWPASuppWextEnabled = false;
1604#endif
1605 pDevice->byReAssocCount = 0;
1606 pDevice->bWPADEVUp = false;
1607
1608 if (pDevice->bEncryptionEnable && pDevice->bTransmitKey) {
1609 KeybSetDefaultKey(&(pDevice->sKey),
1610 (unsigned long)(pDevice->byKeyIndex | (1 << 31)),
1611 pDevice->uKeyLength,
1612 NULL,
1613 pDevice->abyKey,
1614 KEY_CTL_WEP,
1615 pDevice->PortOffset,
1616 pDevice->byLocalID
1617 );
1618 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1619 }
1620
1621 pr_debug("call MACvIntEnable\n");
1622 MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
1623
1624 if (pDevice->pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1625 bScheduleCommand((void *)pDevice, WLAN_CMD_RUN_AP, NULL);
1626 } else {
1627 bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1628 bScheduleCommand((void *)pDevice, WLAN_CMD_SSID, NULL);
1629 }
1630 pDevice->flags |= DEVICE_FLAGS_OPENED;
1631
1632 pr_debug("device_open success..\n");
1633 return 0;
1634}
1635
1636static int device_close(struct net_device *dev)
1637{
1638 struct vnt_private *pDevice = netdev_priv(dev);
1639 PSMgmtObject pMgmt = pDevice->pMgmt;
1640
1641 if (pDevice->bLinkPass) {
1642 bScheduleCommand((void *)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
1643 mdelay(30);
1644 }
1645
1646 del_timer(&pDevice->sTimerTxData);
1647 del_timer(&pDevice->sTimerCommand);
1648 del_timer(&pMgmt->sTimerSecondCallback);
1649 if (pDevice->bDiversityRegCtlON) {
1650 del_timer(&pDevice->TimerSQ3Tmax1);
1651 del_timer(&pDevice->TimerSQ3Tmax2);
1652 del_timer(&pDevice->TimerSQ3Tmax3);
1653 }
1654
1655 netif_stop_queue(dev);
1656 pDevice->bCmdRunning = false;
1657 MACbShutdown(pDevice->PortOffset);
1658 MACbSoftwareReset(pDevice->PortOffset);
1659 CARDbRadioPowerOff(pDevice);
1660
1661 pDevice->bLinkPass = false;
1662 memset(pMgmt->abyCurrBSSID, 0, 6);
1663 pMgmt->eCurrState = WMAC_STATE_IDLE;
1664 device_free_td0_ring(pDevice);
1665 device_free_td1_ring(pDevice);
1666 device_free_rd0_ring(pDevice);
1667 device_free_rd1_ring(pDevice);
1668 device_free_frag_buf(pDevice);
1669 device_free_rings(pDevice);
1670 BSSvClearNodeDBTable(pDevice, 0);
1671 free_irq(dev->irq, dev);
1672 pDevice->flags &= (~DEVICE_FLAGS_OPENED);
1673
1674 device_release_WPADEV(pDevice);
1675
1676 pr_debug("device_close..\n");
1677 return 0;
1678}
1679
1680static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev)
1681{
1682 struct vnt_private *pDevice = netdev_priv(dev);
1683 unsigned char *pbMPDU;
1684 unsigned int cbMPDULen = 0;
1685
1686 pr_debug("device_dma0_tx_80211\n");
1687 spin_lock_irq(&pDevice->lock);
1688
1689 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
1690 pr_debug("device_dma0_tx_80211, td0 <=0\n");
1691 dev_kfree_skb_irq(skb);
1692 spin_unlock_irq(&pDevice->lock);
1693 return 0;
1694 }
1695
1696 if (pDevice->bStopTx0Pkt) {
1697 dev_kfree_skb_irq(skb);
1698 spin_unlock_irq(&pDevice->lock);
1699 return 0;
1700 }
1701
1702 cbMPDULen = skb->len;
1703 pbMPDU = skb->data;
1704
1705 vDMA0_tx_80211(pDevice, skb, pbMPDU, cbMPDULen);
1706
1707 spin_unlock_irq(&pDevice->lock);
1708
1709 return 0;
1710}
1711
1712bool device_dma0_xmit(struct vnt_private *pDevice,
1713 struct sk_buff *skb, unsigned int uNodeIndex)
1714{
1715 PSMgmtObject pMgmt = pDevice->pMgmt;
1716 PSTxDesc pHeadTD, pLastTD;
1717 unsigned int cbFrameBodySize;
1718 unsigned int uMACfragNum;
1719 unsigned char byPktType;
1720 bool bNeedEncryption = false;
1721 PSKeyItem pTransmitKey = NULL;
1722 unsigned int cbHeaderSize;
1723 unsigned int ii;
1724 SKeyItem STempKey;
1725
1726 if (pDevice->bStopTx0Pkt) {
1727 dev_kfree_skb_irq(skb);
1728 return false;
1729 }
1730
1731 if (AVAIL_TD(pDevice, TYPE_TXDMA0) <= 0) {
1732 dev_kfree_skb_irq(skb);
1733 pr_debug("device_dma0_xmit, td0 <=0\n");
1734 return false;
1735 }
1736
1737 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
1738 if (pDevice->uAssocCount == 0) {
1739 dev_kfree_skb_irq(skb);
1740 pr_debug("device_dma0_xmit, assocCount = 0\n");
1741 return false;
1742 }
1743 }
1744
1745 pHeadTD = pDevice->apCurrTD[TYPE_TXDMA0];
1746
1747 pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP);
1748
1749 memcpy(pDevice->sTxEthHeader.abyDstAddr, (unsigned char *)(skb->data), ETH_HLEN);
1750 cbFrameBodySize = skb->len - ETH_HLEN;
1751
1752
1753 if (ntohs(pDevice->sTxEthHeader.wType) > ETH_DATA_LEN)
1754 cbFrameBodySize += 8;
1755
1756 uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader);
1757
1758 if (uMACfragNum > AVAIL_TD(pDevice, TYPE_TXDMA0)) {
1759 dev_kfree_skb_irq(skb);
1760 return false;
1761 }
1762 byPktType = (unsigned char)pDevice->byPacketType;
1763
1764 if (pDevice->bFixRate) {
1765 if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
1766 if (pDevice->uConnectionRate >= RATE_11M)
1767 pDevice->wCurrentRate = RATE_11M;
1768 else
1769 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
1770 } else {
1771 if (pDevice->uConnectionRate >= RATE_54M)
1772 pDevice->wCurrentRate = RATE_54M;
1773 else
1774 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
1775 }
1776 } else {
1777 pDevice->wCurrentRate = pDevice->pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
1778 }
1779
1780
1781 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble)
1782 pDevice->byPreambleType = pDevice->byShortPreamble;
1783 else
1784 pDevice->byPreambleType = PREAMBLE_LONG;
1785
1786 pr_debug("dma0: pDevice->wCurrentRate = %d\n", pDevice->wCurrentRate);
1787
1788 if (pDevice->wCurrentRate <= RATE_11M) {
1789 byPktType = PK_TYPE_11B;
1790 } else if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
1791 byPktType = PK_TYPE_11A;
1792 } else {
1793 if (pDevice->bProtectMode)
1794 byPktType = PK_TYPE_11GB;
1795 else
1796 byPktType = PK_TYPE_11GA;
1797 }
1798
1799 if (pDevice->bEncryptionEnable)
1800 bNeedEncryption = true;
1801
1802 if (pDevice->bEnableHostWEP) {
1803 pTransmitKey = &STempKey;
1804 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
1805 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
1806 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
1807 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
1808 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
1809 memcpy(pTransmitKey->abyKey,
1810 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
1811 pTransmitKey->uKeyLength
1812 );
1813 }
1814 vGenerateFIFOHeader(pDevice, byPktType, pDevice->pbyTmpBuff, bNeedEncryption,
1815 cbFrameBodySize, TYPE_TXDMA0, pHeadTD,
1816 &pDevice->sTxEthHeader, (unsigned char *)skb->data, pTransmitKey, uNodeIndex,
1817 &uMACfragNum,
1818 &cbHeaderSize
1819 );
1820
1821 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
1822
1823 MACbPSWakeup(pDevice->PortOffset);
1824 }
1825
1826 pDevice->bPWBitOn = false;
1827
1828 pLastTD = pHeadTD;
1829 for (ii = 0; ii < uMACfragNum; ii++) {
1830
1831 wmb();
1832 pHeadTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
1833 wmb();
1834 if (ii == (uMACfragNum - 1))
1835 pLastTD = pHeadTD;
1836 pHeadTD = pHeadTD->next;
1837 }
1838
1839
1840
1841 pLastTD->pTDInfo->skb = skb;
1842 pLastTD->pTDInfo->byFlags = 0;
1843 pLastTD->pTDInfo->byFlags |= TD_FLAGS_NETIF_SKB;
1844
1845 pDevice->apCurrTD[TYPE_TXDMA0] = pHeadTD;
1846
1847 MACvTransmit0(pDevice->PortOffset);
1848
1849 return true;
1850}
1851
1852
1853static int device_xmit(struct sk_buff *skb, struct net_device *dev) {
1854 struct vnt_private *pDevice = netdev_priv(dev);
1855 PSMgmtObject pMgmt = pDevice->pMgmt;
1856 PSTxDesc pHeadTD, pLastTD;
1857 unsigned int uNodeIndex = 0;
1858 unsigned char byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
1859 unsigned short wAID;
1860 unsigned int uMACfragNum = 1;
1861 unsigned int cbFrameBodySize;
1862 unsigned char byPktType;
1863 unsigned int cbHeaderSize;
1864 bool bNeedEncryption = false;
1865 PSKeyItem pTransmitKey = NULL;
1866 SKeyItem STempKey;
1867 unsigned int ii;
1868 bool bTKIP_UseGTK = false;
1869 bool bNeedDeAuth = false;
1870 unsigned char *pbyBSSID;
1871 bool bNodeExist = false;
1872
1873 spin_lock_irq(&pDevice->lock);
1874 if (!pDevice->bLinkPass) {
1875 dev_kfree_skb_irq(skb);
1876 spin_unlock_irq(&pDevice->lock);
1877 return 0;
1878 }
1879
1880 if (pDevice->bStopDataPkt) {
1881 dev_kfree_skb_irq(skb);
1882 spin_unlock_irq(&pDevice->lock);
1883 return 0;
1884 }
1885
1886 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
1887 if (pDevice->uAssocCount == 0) {
1888 dev_kfree_skb_irq(skb);
1889 spin_unlock_irq(&pDevice->lock);
1890 return 0;
1891 }
1892 if (is_multicast_ether_addr((unsigned char *)(skb->data))) {
1893 uNodeIndex = 0;
1894 bNodeExist = true;
1895 if (pMgmt->sNodeDBTable[0].bPSEnable) {
1896 skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb);
1897 pMgmt->sNodeDBTable[0].wEnQueueCnt++;
1898
1899 pMgmt->abyPSTxMap[0] |= byMask[0];
1900 spin_unlock_irq(&pDevice->lock);
1901 return 0;
1902 }
1903 } else {
1904 if (BSSDBbIsSTAInNodeDB(pMgmt, (unsigned char *)(skb->data), &uNodeIndex)) {
1905 if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
1906 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
1907 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
1908
1909 wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
1910 pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
1911 pr_debug("Set:pMgmt->abyPSTxMap[%d]= %d\n",
1912 (wAID >> 3),
1913 pMgmt->abyPSTxMap[wAID >> 3]);
1914 spin_unlock_irq(&pDevice->lock);
1915 return 0;
1916 }
1917
1918 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble)
1919 pDevice->byPreambleType = pDevice->byShortPreamble;
1920 else
1921 pDevice->byPreambleType = PREAMBLE_LONG;
1922
1923 bNodeExist = true;
1924
1925 }
1926 }
1927
1928 if (!bNodeExist) {
1929 pr_debug("Unknown STA not found in node DB\n");
1930 dev_kfree_skb_irq(skb);
1931 spin_unlock_irq(&pDevice->lock);
1932 return 0;
1933 }
1934 }
1935
1936 pHeadTD = pDevice->apCurrTD[TYPE_AC0DMA];
1937
1938 pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP);
1939
1940 memcpy(pDevice->sTxEthHeader.abyDstAddr, (unsigned char *)(skb->data), ETH_HLEN);
1941 cbFrameBodySize = skb->len - ETH_HLEN;
1942
1943 if (ntohs(pDevice->sTxEthHeader.wType) > ETH_DATA_LEN)
1944 cbFrameBodySize += 8;
1945
1946 if (pDevice->bEncryptionEnable) {
1947 bNeedEncryption = true;
1948
1949 do {
1950 if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
1951 (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
1952 pbyBSSID = pDevice->abyBSSID;
1953
1954 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) {
1955
1956 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) {
1957 bTKIP_UseGTK = true;
1958 pr_debug("Get GTK\n");
1959 break;
1960 }
1961 } else {
1962 pr_debug("Get PTK\n");
1963 break;
1964 }
1965 } else if (pDevice->pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
1966 pbyBSSID = pDevice->sTxEthHeader.abyDstAddr;
1967 pr_debug("IBSS Serach Key:\n");
1968 for (ii = 0; ii < 6; ii++)
1969 pr_debug("%x\n", *(pbyBSSID+ii));
1970 pr_debug("\n");
1971
1972
1973 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == true)
1974 break;
1975 }
1976
1977 pbyBSSID = pDevice->abyBroadcastAddr;
1978 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) {
1979 pTransmitKey = NULL;
1980 if (pDevice->pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)
1981 pr_debug("IBSS and KEY is NULL. [%d]\n",
1982 pDevice->pMgmt->eCurrMode);
1983 else
1984 pr_debug("NOT IBSS and KEY is NULL. [%d]\n",
1985 pDevice->pMgmt->eCurrMode);
1986 } else {
1987 bTKIP_UseGTK = true;
1988 pr_debug("Get GTK\n");
1989 }
1990 } while (false);
1991 }
1992
1993 if (pDevice->bEnableHostWEP) {
1994 pr_debug("acdma0: STA index %d\n", uNodeIndex);
1995 if (pDevice->bEncryptionEnable) {
1996 pTransmitKey = &STempKey;
1997 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
1998 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
1999 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2000 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2001 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2002 memcpy(pTransmitKey->abyKey,
2003 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2004 pTransmitKey->uKeyLength
2005 );
2006 }
2007 }
2008
2009 uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader);
2010
2011 if (uMACfragNum > AVAIL_TD(pDevice, TYPE_AC0DMA)) {
2012 pr_debug("uMACfragNum > AVAIL_TD(TYPE_AC0DMA) = %d\n",
2013 uMACfragNum);
2014 dev_kfree_skb_irq(skb);
2015 spin_unlock_irq(&pDevice->lock);
2016 return 0;
2017 }
2018
2019 if (pTransmitKey != NULL) {
2020 if ((pTransmitKey->byCipherSuite == KEY_CTL_WEP) &&
2021 (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN)) {
2022 uMACfragNum = 1;
2023 }
2024 }
2025
2026 byPktType = (unsigned char)pDevice->byPacketType;
2027
2028 if (pDevice->bFixRate) {
2029 if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
2030 if (pDevice->uConnectionRate >= RATE_11M)
2031 pDevice->wCurrentRate = RATE_11M;
2032 else
2033 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2034 } else {
2035 if ((pDevice->eCurrentPHYType == PHY_TYPE_11A) &&
2036 (pDevice->uConnectionRate <= RATE_6M)) {
2037 pDevice->wCurrentRate = RATE_6M;
2038 } else {
2039 if (pDevice->uConnectionRate >= RATE_54M)
2040 pDevice->wCurrentRate = RATE_54M;
2041 else
2042 pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate;
2043
2044 }
2045 }
2046 pDevice->byACKRate = (unsigned char) pDevice->wCurrentRate;
2047 pDevice->byTopCCKBasicRate = RATE_1M;
2048 pDevice->byTopOFDMBasicRate = RATE_6M;
2049 } else {
2050
2051 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
2052 if (pDevice->eCurrentPHYType != PHY_TYPE_11A) {
2053 pDevice->wCurrentRate = RATE_1M;
2054 pDevice->byACKRate = RATE_1M;
2055 pDevice->byTopCCKBasicRate = RATE_1M;
2056 pDevice->byTopOFDMBasicRate = RATE_6M;
2057 } else {
2058 pDevice->wCurrentRate = RATE_6M;
2059 pDevice->byACKRate = RATE_6M;
2060 pDevice->byTopCCKBasicRate = RATE_1M;
2061 pDevice->byTopOFDMBasicRate = RATE_6M;
2062 }
2063 } else {
2064 VNTWIFIvGetTxRate(pDevice->pMgmt,
2065 pDevice->sTxEthHeader.abyDstAddr,
2066 &(pDevice->wCurrentRate),
2067 &(pDevice->byACKRate),
2068 &(pDevice->byTopCCKBasicRate),
2069 &(pDevice->byTopOFDMBasicRate));
2070
2071 }
2072 }
2073
2074
2075 if (pDevice->wCurrentRate <= RATE_11M) {
2076 byPktType = PK_TYPE_11B;
2077 } else if (pDevice->eCurrentPHYType == PHY_TYPE_11A) {
2078 byPktType = PK_TYPE_11A;
2079 } else {
2080 if (pDevice->bProtectMode)
2081 byPktType = PK_TYPE_11GB;
2082 else
2083 byPktType = PK_TYPE_11GA;
2084 }
2085
2086 if (bNeedEncryption) {
2087 pr_debug("ntohs Pkt Type=%04x\n",
2088 ntohs(pDevice->sTxEthHeader.wType));
2089 if ((pDevice->sTxEthHeader.wType) == TYPE_PKT_802_1x) {
2090 bNeedEncryption = false;
2091 pr_debug("Pkt Type=%04x\n",
2092 (pDevice->sTxEthHeader.wType));
2093 if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2094 if (pTransmitKey == NULL) {
2095 pr_debug("Don't Find TX KEY\n");
2096 } else {
2097 if (bTKIP_UseGTK) {
2098 pr_debug("error: KEY is GTK!!~~\n");
2099 } else {
2100 pr_debug("Find PTK [%lX]\n",
2101 pTransmitKey->dwKeyIndex);
2102 bNeedEncryption = true;
2103 }
2104 }
2105 }
2106
2107 if (pDevice->byCntMeasure == 2) {
2108 bNeedDeAuth = true;
2109 pDevice->s802_11Counter.TKIPCounterMeasuresInvoked++;
2110 }
2111
2112 if (pDevice->bEnableHostWEP) {
2113 if ((uNodeIndex != 0) &&
2114 (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) {
2115 pr_debug("Find PTK [%lX]\n",
2116 pTransmitKey->dwKeyIndex);
2117 bNeedEncryption = true;
2118 }
2119 }
2120 } else {
2121 if (pTransmitKey == NULL) {
2122 pr_debug("return no tx key\n");
2123 dev_kfree_skb_irq(skb);
2124 spin_unlock_irq(&pDevice->lock);
2125 return 0;
2126 }
2127 }
2128 }
2129
2130 vGenerateFIFOHeader(pDevice, byPktType, pDevice->pbyTmpBuff, bNeedEncryption,
2131 cbFrameBodySize, TYPE_AC0DMA, pHeadTD,
2132 &pDevice->sTxEthHeader, (unsigned char *)skb->data, pTransmitKey, uNodeIndex,
2133 &uMACfragNum,
2134 &cbHeaderSize
2135 );
2136
2137 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) {
2138
2139 MACbPSWakeup(pDevice->PortOffset);
2140 }
2141 pDevice->bPWBitOn = false;
2142
2143 pLastTD = pHeadTD;
2144 for (ii = 0; ii < uMACfragNum; ii++) {
2145
2146 wmb();
2147 pHeadTD->m_td0TD0.f1Owner = OWNED_BY_NIC;
2148 wmb();
2149 if (ii == uMACfragNum - 1)
2150 pLastTD = pHeadTD;
2151 pHeadTD = pHeadTD->next;
2152 }
2153
2154
2155
2156 pLastTD->pTDInfo->skb = skb;
2157 pLastTD->pTDInfo->byFlags = 0;
2158 pLastTD->pTDInfo->byFlags |= TD_FLAGS_NETIF_SKB;
2159 pDevice->nTxDataTimeCout = 0;
2160
2161 if (AVAIL_TD(pDevice, TYPE_AC0DMA) <= 1)
2162 netif_stop_queue(dev);
2163
2164 pDevice->apCurrTD[TYPE_AC0DMA] = pHeadTD;
2165
2166 if (pDevice->bFixRate)
2167 pr_debug("FixRate:Rate is %d,TxPower is %d\n", pDevice->wCurrentRate, pDevice->byCurPwr);
2168
2169 {
2170 unsigned char Protocol_Version;
2171 unsigned char Packet_Type;
2172 unsigned char Descriptor_type;
2173 unsigned short Key_info;
2174 bool bTxeapol_key = false;
2175
2176 Protocol_Version = skb->data[ETH_HLEN];
2177 Packet_Type = skb->data[ETH_HLEN+1];
2178 Descriptor_type = skb->data[ETH_HLEN+1+1+2];
2179 Key_info = (skb->data[ETH_HLEN+1+1+2+1] << 8)|(skb->data[ETH_HLEN+1+1+2+2]);
2180 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
2181 if (((Protocol_Version == 1) || (Protocol_Version == 2)) &&
2182 (Packet_Type == 3)) {
2183 bTxeapol_key = true;
2184 if ((Descriptor_type == 254) || (Descriptor_type == 2)) {
2185 if (!(Key_info & BIT3) &&
2186 (Key_info & BIT8) && (Key_info & BIT9)) {
2187 pDevice->fWPA_Authened = true;
2188 if (Descriptor_type == 254)
2189 pr_debug("WPA ");
2190 else
2191 pr_debug("WPA2 ");
2192 pr_debug("Authentication completed!!\n");
2193 }
2194 }
2195 }
2196 }
2197 }
2198
2199 MACvTransmitAC0(pDevice->PortOffset);
2200
2201 dev->trans_start = jiffies;
2202
2203 spin_unlock_irq(&pDevice->lock);
2204 return 0;
2205}
2206
2207static irqreturn_t device_intr(int irq, void *dev_instance)
2208{
2209 struct net_device *dev = dev_instance;
2210 struct vnt_private *pDevice = netdev_priv(dev);
2211 int max_count = 0;
2212 unsigned long dwMIBCounter = 0;
2213 PSMgmtObject pMgmt = pDevice->pMgmt;
2214 unsigned char byOrgPageSel = 0;
2215 int handled = 0;
2216 unsigned char byData = 0;
2217 int ii = 0;
2218 unsigned long flags;
2219
2220 MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
2221
2222 if (pDevice->dwIsr == 0)
2223 return IRQ_RETVAL(handled);
2224
2225 if (pDevice->dwIsr == 0xffffffff) {
2226 pr_debug("dwIsr = 0xffff\n");
2227 return IRQ_RETVAL(handled);
2228 }
2229
2230 handled = 1;
2231 MACvIntDisable(pDevice->PortOffset);
2232
2233 spin_lock_irqsave(&pDevice->lock, flags);
2234
2235
2236 VNSvInPortB(pDevice->PortOffset + MAC_REG_PAGE1SEL, &byOrgPageSel);
2237 if (byOrgPageSel == 1)
2238 MACvSelectPage0(pDevice->PortOffset);
2239 else
2240 byOrgPageSel = 0;
2241
2242 MACvReadMIBCounter(pDevice->PortOffset, &dwMIBCounter);
2243
2244
2245
2246
2247 STAvUpdate802_11Counter(&pDevice->s802_11Counter, &pDevice->scStatistic , dwMIBCounter);
2248 while (pDevice->dwIsr != 0) {
2249 STAvUpdateIsrStatCounter(&pDevice->scStatistic, pDevice->dwIsr);
2250 MACvWriteISR(pDevice->PortOffset, pDevice->dwIsr);
2251
2252 if (pDevice->dwIsr & ISR_FETALERR) {
2253 pr_debug(" ISR_FETALERR\n");
2254 VNSvOutPortB(pDevice->PortOffset + MAC_REG_SOFTPWRCTL, 0);
2255 VNSvOutPortW(pDevice->PortOffset + MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPECTI);
2256 device_error(pDevice, pDevice->dwIsr);
2257 }
2258
2259 if (pDevice->byLocalID > REV_ID_VT3253_B1) {
2260 if (pDevice->dwIsr & ISR_MEASURESTART) {
2261
2262 pDevice->byOrgChannel = pDevice->byCurrentCh;
2263 VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byOrgRCR));
2264 VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, (RCR_RXALLTYPE | RCR_UNICAST | RCR_BROADCAST | RCR_MULTICAST | RCR_WPAERR));
2265 MACvSelectPage1(pDevice->PortOffset);
2266 VNSvInPortD(pDevice->PortOffset + MAC_REG_MAR0, &(pDevice->dwOrgMAR0));
2267 VNSvInPortD(pDevice->PortOffset + MAC_REG_MAR4, &(pDevice->dwOrgMAR4));
2268 MACvSelectPage0(pDevice->PortOffset);
2269
2270 if (set_channel(pDevice, pDevice->pCurrMeasureEID->sReq.byChannel)) {
2271 pDevice->bMeasureInProgress = true;
2272 MACvSelectPage1(pDevice->PortOffset);
2273 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_READY);
2274 MACvSelectPage0(pDevice->PortOffset);
2275 pDevice->byBasicMap = 0;
2276 pDevice->byCCAFraction = 0;
2277 for (ii = 0; ii < 8; ii++)
2278 pDevice->dwRPIs[ii] = 0;
2279
2280 } else {
2281
2282
2283 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
2284 s_vCompleteCurrentMeasure(pDevice, MEASURE_MODE_INCAPABLE);
2285 MACvSelectPage1(pDevice->PortOffset);
2286 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2287 MACvSelectPage0(pDevice->PortOffset);
2288 }
2289 }
2290 if (pDevice->dwIsr & ISR_MEASUREEND) {
2291
2292 pDevice->bMeasureInProgress = false;
2293 VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byOrgRCR);
2294 MACvSelectPage1(pDevice->PortOffset);
2295 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, pDevice->dwOrgMAR0);
2296 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR4, pDevice->dwOrgMAR4);
2297 VNSvInPortB(pDevice->PortOffset + MAC_REG_MSRBBSTS, &byData);
2298 pDevice->byBasicMap |= (byData >> 4);
2299 VNSvInPortB(pDevice->PortOffset + MAC_REG_CCAFRACTION, &pDevice->byCCAFraction);
2300 VNSvInPortB(pDevice->PortOffset + MAC_REG_MSRCTL, &byData);
2301
2302 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
2303 MACvSelectPage0(pDevice->PortOffset);
2304 set_channel(pDevice, pDevice->byOrgChannel);
2305 MACvSelectPage1(pDevice->PortOffset);
2306 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2307 MACvSelectPage0(pDevice->PortOffset);
2308 if (byData & MSRCTL_FINISH) {
2309
2310 s_vCompleteCurrentMeasure(pDevice, 0);
2311 } else {
2312
2313 s_vCompleteCurrentMeasure(pDevice, MEASURE_MODE_LATE);
2314 }
2315 }
2316 if (pDevice->dwIsr & ISR_QUIETSTART) {
2317 do {
2318 ;
2319 } while (!CARDbStartQuiet(pDevice));
2320 }
2321 }
2322
2323 if (pDevice->dwIsr & ISR_TBTT) {
2324 if (pDevice->bEnableFirstQuiet) {
2325 pDevice->byQuietStartCount--;
2326 if (pDevice->byQuietStartCount == 0) {
2327 pDevice->bEnableFirstQuiet = false;
2328 MACvSelectPage1(pDevice->PortOffset);
2329 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN));
2330 MACvSelectPage0(pDevice->PortOffset);
2331 }
2332 }
2333 if (pDevice->bChannelSwitch &&
2334 (pDevice->op_mode == NL80211_IFTYPE_STATION)) {
2335 pDevice->byChannelSwitchCount--;
2336 if (pDevice->byChannelSwitchCount == 0) {
2337 pDevice->bChannelSwitch = false;
2338 set_channel(pDevice, pDevice->byNewChannel);
2339 VNTWIFIbChannelSwitch(pDevice->pMgmt, pDevice->byNewChannel);
2340 MACvSelectPage1(pDevice->PortOffset);
2341 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2342 MACvSelectPage0(pDevice->PortOffset);
2343 CARDbStartTxPacket(pDevice, PKT_TYPE_802_11_ALL);
2344
2345 }
2346 }
2347 if (pDevice->op_mode != NL80211_IFTYPE_ADHOC) {
2348 if ((pDevice->bUpdateBBVGA) && pDevice->bLinkPass && (pDevice->uCurrRSSI != 0)) {
2349 long ldBm;
2350
2351 RFvRSSITodBm(pDevice, (unsigned char) pDevice->uCurrRSSI, &ldBm);
2352 for (ii = 0; ii < BB_VGA_LEVEL; ii++) {
2353 if (ldBm < pDevice->ldBmThreshold[ii]) {
2354 pDevice->byBBVGANew = pDevice->abyBBVGA[ii];
2355 break;
2356 }
2357 }
2358 if (pDevice->byBBVGANew != pDevice->byBBVGACurrent) {
2359 pDevice->uBBVGADiffCount++;
2360 if (pDevice->uBBVGADiffCount == 1) {
2361
2362 BBvSetVGAGainOffset(pDevice, pDevice->byBBVGANew);
2363 pr_debug("First RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
2364 (int)ldBm,
2365 pDevice->byBBVGANew,
2366 pDevice->byBBVGACurrent,
2367 (int)pDevice->uBBVGADiffCount);
2368 }
2369 if (pDevice->uBBVGADiffCount >= BB_VGA_CHANGE_THRESHOLD) {
2370 pr_debug("RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
2371 (int)ldBm,
2372 pDevice->byBBVGANew,
2373 pDevice->byBBVGACurrent,
2374 (int)pDevice->uBBVGADiffCount);
2375 BBvSetVGAGainOffset(pDevice, pDevice->byBBVGANew);
2376 }
2377 } else {
2378 pDevice->uBBVGADiffCount = 1;
2379 }
2380 }
2381 }
2382
2383 pDevice->bBeaconSent = false;
2384 if (pDevice->bEnablePSMode)
2385 PSbIsNextTBTTWakeUp((void *)pDevice);
2386
2387 if ((pDevice->op_mode == NL80211_IFTYPE_AP) ||
2388 (pDevice->op_mode == NL80211_IFTYPE_ADHOC)) {
2389 MACvOneShotTimer1MicroSec(pDevice->PortOffset,
2390 (pMgmt->wIBSSBeaconPeriod - MAKE_BEACON_RESERVED) << 10);
2391 }
2392
2393
2394
2395 }
2396
2397 if (pDevice->dwIsr & ISR_BNTX) {
2398 if (pDevice->op_mode == NL80211_IFTYPE_ADHOC) {
2399 pDevice->bIsBeaconBufReadySet = false;
2400 pDevice->cbBeaconBufReadySetCnt = 0;
2401 }
2402
2403 if (pDevice->op_mode == NL80211_IFTYPE_AP) {
2404 if (pMgmt->byDTIMCount > 0) {
2405 pMgmt->byDTIMCount--;
2406 pMgmt->sNodeDBTable[0].bRxPSPoll = false;
2407 } else {
2408 if (pMgmt->byDTIMCount == 0) {
2409
2410 pMgmt->byDTIMCount = pMgmt->byDTIMPeriod - 1;
2411 pMgmt->sNodeDBTable[0].bRxPSPoll = true;
2412 bScheduleCommand((void *)pDevice, WLAN_CMD_RX_PSPOLL, NULL);
2413 }
2414 }
2415 }
2416 pDevice->bBeaconSent = true;
2417
2418 if (pDevice->bChannelSwitch) {
2419 pDevice->byChannelSwitchCount--;
2420 if (pDevice->byChannelSwitchCount == 0) {
2421 pDevice->bChannelSwitch = false;
2422 set_channel(pDevice, pDevice->byNewChannel);
2423 VNTWIFIbChannelSwitch(pDevice->pMgmt, pDevice->byNewChannel);
2424 MACvSelectPage1(pDevice->PortOffset);
2425 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
2426 MACvSelectPage0(pDevice->PortOffset);
2427 CARDbStartTxPacket(pDevice, PKT_TYPE_802_11_ALL);
2428 }
2429 }
2430
2431 }
2432
2433 if (pDevice->dwIsr & ISR_RXDMA0)
2434 max_count += device_rx_srv(pDevice, TYPE_RXDMA0);
2435
2436 if (pDevice->dwIsr & ISR_RXDMA1)
2437 max_count += device_rx_srv(pDevice, TYPE_RXDMA1);
2438
2439 if (pDevice->dwIsr & ISR_TXDMA0)
2440 max_count += device_tx_srv(pDevice, TYPE_TXDMA0);
2441
2442 if (pDevice->dwIsr & ISR_AC0DMA)
2443 max_count += device_tx_srv(pDevice, TYPE_AC0DMA);
2444
2445 if (pDevice->dwIsr & ISR_SOFTTIMER1) {
2446 if (pDevice->op_mode == NL80211_IFTYPE_AP) {
2447 if (pDevice->bShortSlotTime)
2448 pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTSLOTTIME(1);
2449 else
2450 pMgmt->wCurrCapInfo &= ~(WLAN_SET_CAP_INFO_SHORTSLOTTIME(1));
2451 }
2452 bMgrPrepareBeaconToSend(pDevice, pMgmt);
2453 pDevice->byCntMeasure = 0;
2454 }
2455
2456 MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
2457
2458 MACvReceive0(pDevice->PortOffset);
2459 MACvReceive1(pDevice->PortOffset);
2460
2461 if (max_count > pDevice->sOpts.int_works)
2462 break;
2463 }
2464
2465 if (byOrgPageSel == 1)
2466 MACvSelectPage1(pDevice->PortOffset);
2467
2468 spin_unlock_irqrestore(&pDevice->lock, flags);
2469
2470 MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
2471
2472 return IRQ_RETVAL(handled);
2473}
2474
2475
2476static int Config_FileGetParameter(unsigned char *string,
2477 unsigned char *dest, unsigned char *source)
2478{
2479 unsigned char buf1[100];
2480 int source_len = strlen(source);
2481
2482 memset(buf1, 0, 100);
2483 strcat(buf1, string);
2484 strcat(buf1, "=");
2485 source += strlen(buf1);
2486
2487 memcpy(dest, source, source_len - strlen(buf1));
2488 return true;
2489}
2490
2491int Config_FileOperation(struct vnt_private *pDevice,
2492 bool fwrite, unsigned char *Parameter)
2493{
2494 unsigned char *buffer = kmalloc(1024, GFP_KERNEL);
2495 unsigned char tmpbuffer[20];
2496 struct file *file;
2497 int result = 0;
2498
2499 if (!buffer) {
2500 pr_err("allocate mem for file fail?\n");
2501 return -1;
2502 }
2503 file = filp_open(CONFIG_PATH, O_RDONLY, 0);
2504 if (IS_ERR(file)) {
2505 kfree(buffer);
2506 pr_err("Config_FileOperation:open file fail?\n");
2507 return -1;
2508 }
2509
2510 if (kernel_read(file, 0, buffer, 1024) < 0) {
2511 pr_err("read file error?\n");
2512 result = -1;
2513 goto error1;
2514 }
2515
2516 if (Config_FileGetParameter("ZONETYPE", tmpbuffer, buffer) != true) {
2517 pr_err("get parameter error?\n");
2518 result = -1;
2519 goto error1;
2520 }
2521
2522 if (memcmp(tmpbuffer, "USA", 3) == 0) {
2523 result = ZoneType_USA;
2524 } else if (memcmp(tmpbuffer, "JAPAN", 5) == 0) {
2525 result = ZoneType_Japan;
2526 } else if (memcmp(tmpbuffer, "EUROPE", 5) == 0) {
2527 result = ZoneType_Europe;
2528 } else {
2529 result = -1;
2530 pr_err("Unknown Zonetype[%s]?\n", tmpbuffer);
2531 }
2532
2533error1:
2534 kfree(buffer);
2535 fput(file);
2536 return result;
2537}
2538
2539static void device_set_multi(struct net_device *dev) {
2540 struct vnt_private *pDevice = netdev_priv(dev);
2541 PSMgmtObject pMgmt = pDevice->pMgmt;
2542 u32 mc_filter[2];
2543 struct netdev_hw_addr *ha;
2544
2545 VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byRxMode));
2546
2547 if (dev->flags & IFF_PROMISC) {
2548 pr_notice("%s: Promiscuous mode enabled\n", dev->name);
2549
2550 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
2551 } else if ((netdev_mc_count(dev) > pDevice->multicast_limit)
2552 || (dev->flags & IFF_ALLMULTI)) {
2553 MACvSelectPage1(pDevice->PortOffset);
2554 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, 0xffffffff);
2555 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0 + 4, 0xffffffff);
2556 MACvSelectPage0(pDevice->PortOffset);
2557 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
2558 } else {
2559 memset(mc_filter, 0, sizeof(mc_filter));
2560 netdev_for_each_mc_addr(ha, dev) {
2561 int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
2562
2563 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
2564 }
2565 MACvSelectPage1(pDevice->PortOffset);
2566 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, mc_filter[0]);
2567 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0 + 4, mc_filter[1]);
2568 MACvSelectPage0(pDevice->PortOffset);
2569 pDevice->byRxMode &= ~(RCR_UNICAST);
2570 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
2571 }
2572
2573 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2574
2575 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
2576 pDevice->byRxMode &= ~(RCR_UNICAST);
2577 }
2578
2579 VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byRxMode);
2580 pr_debug("pDevice->byRxMode = %x\n", pDevice->byRxMode);
2581}
2582
2583static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
2584{
2585 struct vnt_private *pDevice = netdev_priv(dev);
2586 struct iwreq *wrq = (struct iwreq *)rq;
2587 int rc = 0;
2588 PSMgmtObject pMgmt = pDevice->pMgmt;
2589 PSCmdRequest pReq;
2590
2591 if (pMgmt == NULL) {
2592 rc = -EFAULT;
2593 return rc;
2594 }
2595
2596 switch (cmd) {
2597 case SIOCGIWNAME:
2598 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
2599 break;
2600
2601 case SIOCGIWNWID:
2602 rc = -EOPNOTSUPP;
2603 break;
2604
2605
2606 case SIOCSIWFREQ:
2607 rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
2608 break;
2609
2610
2611 case SIOCGIWFREQ:
2612 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
2613 break;
2614
2615
2616 case SIOCSIWESSID:
2617
2618 {
2619 char essid[IW_ESSID_MAX_SIZE+1];
2620
2621 if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
2622 rc = -E2BIG;
2623 break;
2624 }
2625 if (copy_from_user(essid, wrq->u.essid.pointer,
2626 wrq->u.essid.length)) {
2627 rc = -EFAULT;
2628 break;
2629 }
2630 rc = iwctl_siwessid(dev, NULL,
2631 &(wrq->u.essid), essid);
2632 }
2633 break;
2634
2635
2636 case SIOCGIWESSID:
2637
2638 {
2639 char essid[IW_ESSID_MAX_SIZE+1];
2640
2641 if (wrq->u.essid.pointer)
2642 rc = iwctl_giwessid(dev, NULL,
2643 &(wrq->u.essid), essid);
2644 if (copy_to_user(wrq->u.essid.pointer,
2645 essid,
2646 wrq->u.essid.length))
2647 rc = -EFAULT;
2648 }
2649 break;
2650
2651 case SIOCSIWAP:
2652
2653 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
2654 break;
2655
2656
2657 case SIOCGIWAP:
2658 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
2659 break;
2660
2661
2662 case SIOCSIWNICKN:
2663 pr_debug(" SIOCSIWNICKN\n");
2664 rc = -EOPNOTSUPP;
2665 break;
2666
2667
2668 case SIOCGIWNICKN:
2669 pr_debug(" SIOCGIWNICKN\n");
2670 rc = -EOPNOTSUPP;
2671 break;
2672
2673
2674 case SIOCSIWRATE:
2675 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
2676 break;
2677
2678
2679 case SIOCGIWRATE:
2680
2681 rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
2682 break;
2683
2684
2685 case SIOCSIWRTS:
2686
2687 rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
2688 break;
2689
2690
2691 case SIOCGIWRTS:
2692
2693 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
2694 break;
2695
2696
2697 case SIOCSIWFRAG:
2698
2699 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
2700 break;
2701
2702
2703 case SIOCGIWFRAG:
2704
2705 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
2706 break;
2707
2708
2709 case SIOCSIWMODE:
2710 rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
2711 break;
2712
2713
2714 case SIOCGIWMODE:
2715 rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
2716 break;
2717
2718
2719 case SIOCSIWENCODE: {
2720 char abyKey[WLAN_WEP232_KEYLEN];
2721
2722 if (wrq->u.encoding.pointer) {
2723 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
2724 rc = -E2BIG;
2725 break;
2726 }
2727 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
2728 if (copy_from_user(abyKey,
2729 wrq->u.encoding.pointer,
2730 wrq->u.encoding.length)) {
2731 rc = -EFAULT;
2732 break;
2733 }
2734 } else if (wrq->u.encoding.length != 0) {
2735 rc = -EINVAL;
2736 break;
2737 }
2738 rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
2739 }
2740 break;
2741
2742
2743 case SIOCGIWENCODE:
2744
2745 if (!capable(CAP_NET_ADMIN)) {
2746 rc = -EPERM;
2747 break;
2748 }
2749 {
2750 char abyKey[WLAN_WEP232_KEYLEN];
2751
2752 rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
2753 if (rc != 0)
2754 break;
2755 if (wrq->u.encoding.pointer) {
2756 if (copy_to_user(wrq->u.encoding.pointer,
2757 abyKey,
2758 wrq->u.encoding.length))
2759 rc = -EFAULT;
2760 }
2761 }
2762 break;
2763
2764
2765 case SIOCGIWTXPOW:
2766 pr_debug(" SIOCGIWTXPOW\n");
2767 rc = -EOPNOTSUPP;
2768 break;
2769
2770 case SIOCSIWTXPOW:
2771 pr_debug(" SIOCSIWTXPOW\n");
2772 rc = -EOPNOTSUPP;
2773 break;
2774
2775 case SIOCSIWRETRY:
2776
2777 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
2778 break;
2779
2780 case SIOCGIWRETRY:
2781
2782 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
2783 break;
2784
2785
2786 case SIOCGIWRANGE:
2787
2788 {
2789 struct iw_range range;
2790
2791 rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *)&range);
2792 if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
2793 rc = -EFAULT;
2794 }
2795
2796 break;
2797
2798 case SIOCGIWPOWER:
2799
2800 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
2801 break;
2802
2803 case SIOCSIWPOWER:
2804
2805 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
2806 break;
2807
2808 case SIOCGIWSENS:
2809
2810 rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
2811 break;
2812
2813 case SIOCSIWSENS:
2814 pr_debug(" SIOCSIWSENS\n");
2815 rc = -EOPNOTSUPP;
2816 break;
2817
2818 case SIOCGIWAPLIST: {
2819 char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
2820
2821 if (wrq->u.data.pointer) {
2822 rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
2823 if (rc == 0) {
2824 if (copy_to_user(wrq->u.data.pointer,
2825 buffer,
2826 (wrq->u.data.length * (sizeof(struct sockaddr) + sizeof(struct iw_quality)))
2827 ))
2828 rc = -EFAULT;
2829 }
2830 }
2831 }
2832 break;
2833
2834#ifdef WIRELESS_SPY
2835
2836 case SIOCSIWSPY:
2837
2838 pr_debug(" SIOCSIWSPY\n");
2839 rc = -EOPNOTSUPP;
2840 break;
2841
2842
2843 case SIOCGIWSPY:
2844
2845 pr_debug(" SIOCGIWSPY\n");
2846 rc = -EOPNOTSUPP;
2847 break;
2848
2849#endif
2850
2851 case SIOCGIWPRIV:
2852 pr_debug(" SIOCGIWPRIV\n");
2853 rc = -EOPNOTSUPP;
2854 break;
2855
2856
2857#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2858 case SIOCSIWAUTH:
2859 pr_debug(" SIOCSIWAUTH\n");
2860 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
2861 break;
2862
2863 case SIOCGIWAUTH:
2864 pr_debug(" SIOCGIWAUTH\n");
2865 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
2866 break;
2867
2868 case SIOCSIWGENIE:
2869 pr_debug(" SIOCSIWGENIE\n");
2870 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2871 break;
2872
2873 case SIOCGIWGENIE:
2874 pr_debug(" SIOCGIWGENIE\n");
2875 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2876 break;
2877
2878 case SIOCSIWENCODEEXT: {
2879 char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
2880
2881 pr_debug(" SIOCSIWENCODEEXT\n");
2882 if (wrq->u.encoding.pointer) {
2883 memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN + 1);
2884 if (wrq->u.encoding.length > (sizeof(struct iw_encode_ext) + MAX_KEY_LEN)) {
2885 rc = -E2BIG;
2886 break;
2887 }
2888 if (copy_from_user(extra, wrq->u.encoding.pointer, wrq->u.encoding.length)) {
2889 rc = -EFAULT;
2890 break;
2891 }
2892 } else if (wrq->u.encoding.length != 0) {
2893 rc = -EINVAL;
2894 break;
2895 }
2896 rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
2897 }
2898 break;
2899
2900 case SIOCGIWENCODEEXT:
2901 pr_debug(" SIOCGIWENCODEEXT\n");
2902 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
2903 break;
2904
2905 case SIOCSIWMLME:
2906 pr_debug(" SIOCSIWMLME\n");
2907 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2908 break;
2909
2910#endif
2911
2912
2913 case IOCTL_CMD_TEST:
2914
2915 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2916 rc = -EFAULT;
2917 break;
2918 } else {
2919 rc = 0;
2920 }
2921 pReq = (PSCmdRequest)rq;
2922 pReq->wResult = MAGIC_CODE;
2923 break;
2924
2925 case IOCTL_CMD_SET:
2926
2927#ifdef SndEvt_ToAPI
2928 if ((((PSCmdRequest)rq)->wCmdCode != WLAN_CMD_SET_EVT) &&
2929 !(pDevice->flags & DEVICE_FLAGS_OPENED))
2930#else
2931 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
2932 (((PSCmdRequest)rq)->wCmdCode != WLAN_CMD_SET_WPA))
2933#endif
2934 {
2935 rc = -EFAULT;
2936 break;
2937 } else {
2938 rc = 0;
2939 }
2940
2941 if (test_and_set_bit(0, (void *)&(pMgmt->uCmdBusy)))
2942 return -EBUSY;
2943
2944 rc = private_ioctl(pDevice, rq);
2945 clear_bit(0, (void *)&(pMgmt->uCmdBusy));
2946 break;
2947
2948 case IOCTL_CMD_HOSTAPD:
2949
2950 rc = vt6655_hostap_ioctl(pDevice, &wrq->u.data);
2951 break;
2952
2953 case IOCTL_CMD_WPA:
2954
2955 rc = wpa_ioctl(pDevice, &wrq->u.data);
2956 break;
2957
2958 case SIOCETHTOOL:
2959 return ethtool_ioctl(dev, rq->ifr_data);
2960
2961
2962 default:
2963 rc = -EOPNOTSUPP;
2964 pr_debug("Ioctl command not support..%x\n", cmd);
2965
2966 }
2967
2968 if (pDevice->bCommit) {
2969 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2970 netif_stop_queue(pDevice->dev);
2971 spin_lock_irq(&pDevice->lock);
2972 bScheduleCommand((void *)pDevice, WLAN_CMD_RUN_AP, NULL);
2973 spin_unlock_irq(&pDevice->lock);
2974 } else {
2975 pr_debug("Commit the settings\n");
2976 spin_lock_irq(&pDevice->lock);
2977 pDevice->bLinkPass = false;
2978 memset(pMgmt->abyCurrBSSID, 0, 6);
2979 pMgmt->eCurrState = WMAC_STATE_IDLE;
2980 netif_stop_queue(pDevice->dev);
2981#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2982 pMgmt->eScanType = WMAC_SCAN_ACTIVE;
2983 if (!pDevice->bWPASuppWextEnabled)
2984#endif
2985 bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
2986 bScheduleCommand((void *)pDevice, WLAN_CMD_SSID, NULL);
2987 spin_unlock_irq(&pDevice->lock);
2988 }
2989 pDevice->bCommit = false;
2990 }
2991
2992 return rc;
2993}
2994
2995static int ethtool_ioctl(struct net_device *dev, void __user *useraddr)
2996{
2997 u32 ethcmd;
2998
2999 if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd)))
3000 return -EFAULT;
3001
3002 switch (ethcmd) {
3003 case ETHTOOL_GDRVINFO: {
3004 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
3005
3006 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
3007 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
3008 if (copy_to_user(useraddr, &info, sizeof(info)))
3009 return -EFAULT;
3010 return 0;
3011 }
3012
3013 }
3014
3015 return -EOPNOTSUPP;
3016}
3017
3018
3019
3020MODULE_DEVICE_TABLE(pci, vt6655_pci_id_table);
3021
3022static struct pci_driver device_driver = {
3023 .name = DEVICE_NAME,
3024 .id_table = vt6655_pci_id_table,
3025 .probe = vt6655_probe,
3026 .remove = vt6655_remove,
3027#ifdef CONFIG_PM
3028 .suspend = viawget_suspend,
3029 .resume = viawget_resume,
3030#endif
3031};
3032
3033static int __init vt6655_init_module(void)
3034{
3035 int ret;
3036
3037 ret = pci_register_driver(&device_driver);
3038#ifdef CONFIG_PM
3039 if (ret >= 0)
3040 register_reboot_notifier(&device_notifier);
3041#endif
3042
3043 return ret;
3044}
3045
3046static void __exit vt6655_cleanup_module(void)
3047{
3048#ifdef CONFIG_PM
3049 unregister_reboot_notifier(&device_notifier);
3050#endif
3051 pci_unregister_driver(&device_driver);
3052}
3053
3054module_init(vt6655_init_module);
3055module_exit(vt6655_cleanup_module);
3056
3057#ifdef CONFIG_PM
3058static int
3059device_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
3060{
3061 struct pci_dev *pdev = NULL;
3062
3063 switch (event) {
3064 case SYS_DOWN:
3065 case SYS_HALT:
3066 case SYS_POWER_OFF:
3067 for_each_pci_dev(pdev) {
3068 if (pci_dev_driver(pdev) == &device_driver) {
3069 if (pci_get_drvdata(pdev))
3070 viawget_suspend(pdev, PMSG_HIBERNATE);
3071 }
3072 }
3073 }
3074 return NOTIFY_DONE;
3075}
3076
3077static int
3078viawget_suspend(struct pci_dev *pcid, pm_message_t state)
3079{
3080 int power_status;
3081
3082 struct vnt_private *pDevice = pci_get_drvdata(pcid);
3083 PSMgmtObject pMgmt = pDevice->pMgmt;
3084
3085 netif_stop_queue(pDevice->dev);
3086 spin_lock_irq(&pDevice->lock);
3087 pci_save_state(pcid);
3088 del_timer(&pDevice->sTimerCommand);
3089 del_timer(&pMgmt->sTimerSecondCallback);
3090 pDevice->cbFreeCmdQueue = CMD_Q_SIZE;
3091 pDevice->uCmdDequeueIdx = 0;
3092 pDevice->uCmdEnqueueIdx = 0;
3093 pDevice->bCmdRunning = false;
3094 MACbShutdown(pDevice->PortOffset);
3095 MACvSaveContext(pDevice->PortOffset, pDevice->abyMacContext);
3096 pDevice->bLinkPass = false;
3097 memset(pMgmt->abyCurrBSSID, 0, 6);
3098 pMgmt->eCurrState = WMAC_STATE_IDLE;
3099 pci_disable_device(pcid);
3100 power_status = pci_set_power_state(pcid, pci_choose_state(pcid, state));
3101 spin_unlock_irq(&pDevice->lock);
3102 return 0;
3103}
3104
3105static int
3106viawget_resume(struct pci_dev *pcid)
3107{
3108 struct vnt_private *pDevice = pci_get_drvdata(pcid);
3109 PSMgmtObject pMgmt = pDevice->pMgmt;
3110 int power_status;
3111
3112 power_status = pci_set_power_state(pcid, PCI_D0);
3113 power_status = pci_enable_wake(pcid, PCI_D0, 0);
3114 pci_restore_state(pcid);
3115 if (netif_running(pDevice->dev)) {
3116 spin_lock_irq(&pDevice->lock);
3117 MACvRestoreContext(pDevice->PortOffset, pDevice->abyMacContext);
3118 device_init_registers(pDevice);
3119 if (pMgmt->sNodeDBTable[0].bActive) {
3120 pMgmt->sNodeDBTable[0].bActive = false;
3121 pDevice->bLinkPass = false;
3122 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
3123
3124 pMgmt->eCurrState = WMAC_STATE_STARTED;
3125 } else {
3126 pMgmt->eCurrMode = WMAC_MODE_STANDBY;
3127 pMgmt->eCurrState = WMAC_STATE_IDLE;
3128 }
3129 }
3130 init_timer(&pMgmt->sTimerSecondCallback);
3131 init_timer(&pDevice->sTimerCommand);
3132 MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
3133 BSSvClearBSSList((void *)pDevice, pDevice->bLinkPass);
3134 bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
3135 bScheduleCommand((void *)pDevice, WLAN_CMD_SSID, NULL);
3136 spin_unlock_irq(&pDevice->lock);
3137 }
3138 return 0;
3139}
3140
3141#endif
3142