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#undef __NO_VERSION__
48
49#include "device.h"
50#include "card.h"
51#include "baseband.h"
52#include "mac.h"
53#include "tether.h"
54#include "wmgr.h"
55#include "wctl.h"
56#include "power.h"
57#include "wcmd.h"
58#include "iocmd.h"
59#include "tcrc.h"
60#include "rxtx.h"
61#include "bssdb.h"
62#include "hostap.h"
63#include "wpactl.h"
64#include "ioctl.h"
65#include "iwctl.h"
66#include "dpc.h"
67#include "datarate.h"
68#include "rf.h"
69#include "firmware.h"
70#include "rndis.h"
71#include "control.h"
72#include "channel.h"
73#include "int.h"
74#include "iowpa.h"
75
76
77
78static int msglevel =MSG_LEVEL_INFO;
79
80
81
82
83
84
85#define DRIVER_AUTHOR "VIA Networking Technologies, Inc., <lyndonchen@vntek.com.tw>"
86MODULE_AUTHOR(DRIVER_AUTHOR);
87MODULE_LICENSE("GPL");
88MODULE_DESCRIPTION(DEVICE_FULL_DRV_NAM);
89
90#define DEVICE_PARAM(N,D) \
91 static int N[MAX_UINTS]=OPTION_DEFAULT;\
92 module_param_array(N, int, NULL, 0);\
93 MODULE_PARM_DESC(N, D);
94
95#define RX_DESC_MIN0 16
96#define RX_DESC_MAX0 128
97#define RX_DESC_DEF0 64
98DEVICE_PARAM(RxDescriptors0,"Number of receive usb desc buffer");
99
100
101#define TX_DESC_MIN0 16
102#define TX_DESC_MAX0 128
103#define TX_DESC_DEF0 64
104DEVICE_PARAM(TxDescriptors0,"Number of transmit usb desc buffer");
105
106
107#define CHANNEL_MIN 1
108#define CHANNEL_MAX 14
109#define CHANNEL_DEF 6
110
111DEVICE_PARAM(Channel, "Channel number");
112
113
114
115
116
117
118
119#define PREAMBLE_TYPE_DEF 1
120
121DEVICE_PARAM(PreambleType, "Preamble Type");
122
123
124#define RTS_THRESH_MIN 512
125#define RTS_THRESH_MAX 2347
126#define RTS_THRESH_DEF 2347
127
128DEVICE_PARAM(RTSThreshold, "RTS threshold");
129
130
131#define FRAG_THRESH_MIN 256
132#define FRAG_THRESH_MAX 2346
133#define FRAG_THRESH_DEF 2346
134
135DEVICE_PARAM(FragThreshold, "Fragmentation threshold");
136
137
138#define DATA_RATE_MIN 0
139#define DATA_RATE_MAX 13
140#define DATA_RATE_DEF 13
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158DEVICE_PARAM(ConnectionRate, "Connection data rate");
159
160#define OP_MODE_MAX 2
161#define OP_MODE_DEF 0
162#define OP_MODE_MIN 0
163
164DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode ");
165
166
167
168
169
170
171
172
173
174
175
176
177
178#define PS_MODE_DEF 0
179
180DEVICE_PARAM(PSMode, "Power saving mode");
181
182
183#define SHORT_RETRY_MIN 0
184#define SHORT_RETRY_MAX 31
185#define SHORT_RETRY_DEF 8
186
187
188DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");
189
190#define LONG_RETRY_MIN 0
191#define LONG_RETRY_MAX 15
192#define LONG_RETRY_DEF 4
193
194
195DEVICE_PARAM(LongRetryLimit, "long frame retry limits");
196
197
198
199
200
201
202
203#define BBP_TYPE_MIN 0
204#define BBP_TYPE_MAX 2
205#define BBP_TYPE_DEF 2
206
207DEVICE_PARAM(BasebandType, "baseband type");
208
209
210
211
212
213
214
215
216#define X80211h_MODE_DEF 0
217
218DEVICE_PARAM(b80211hEnable, "802.11h mode");
219
220
221
222
223
224
225static struct usb_device_id vt6656_table[] __devinitdata = {
226 {USB_DEVICE(VNT_USB_VENDOR_ID, VNT_USB_PRODUCT_ID)},
227 {}
228};
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251static int vt6656_probe(struct usb_interface *intf,
252 const struct usb_device_id *id);
253static void vt6656_disconnect(struct usb_interface *intf);
254
255#ifdef CONFIG_PM
256static int vt6656_suspend(struct usb_interface *intf, pm_message_t message);
257static int vt6656_resume(struct usb_interface *intf);
258#endif
259
260static struct net_device_stats *device_get_stats(struct net_device *dev);
261static int device_open(struct net_device *dev);
262static int device_xmit(struct sk_buff *skb, struct net_device *dev);
263static void device_set_multi(struct net_device *dev);
264static int device_close(struct net_device *dev);
265static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
266
267static BOOL device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType);
268static BOOL device_init_defrag_cb(PSDevice pDevice);
269static void device_init_diversity_timer(PSDevice pDevice);
270static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev);
271
272static int ethtool_ioctl(struct net_device *dev, void *useraddr);
273static void device_free_tx_bufs(PSDevice pDevice);
274static void device_free_rx_bufs(PSDevice pDevice);
275static void device_free_int_bufs(PSDevice pDevice);
276static void device_free_frag_bufs(PSDevice pDevice);
277static BOOL device_alloc_bufs(PSDevice pDevice);
278
279static int Read_config_file(PSDevice pDevice);
280static unsigned char *Config_FileOperation(PSDevice pDevice);
281static int Config_FileGetParameter(unsigned char *string,
282 unsigned char *dest,
283 unsigned char *source);
284
285static BOOL device_release_WPADEV(PSDevice pDevice);
286
287static void usb_device_reset(PSDevice pDevice);
288
289
290
291
292
293
294
295
296static void
297device_set_options(PSDevice pDevice) {
298
299 BYTE abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
300 BYTE abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
301 u8 abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
302
303 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
304 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
305 memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, ETH_ALEN);
306
307 pDevice->cbTD = TX_DESC_DEF0;
308 pDevice->cbRD = RX_DESC_DEF0;
309 pDevice->uChannel = CHANNEL_DEF;
310 pDevice->wRTSThreshold = RTS_THRESH_DEF;
311 pDevice->wFragmentationThreshold = FRAG_THRESH_DEF;
312 pDevice->byShortRetryLimit = SHORT_RETRY_DEF;
313 pDevice->byLongRetryLimit = LONG_RETRY_DEF;
314 pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME;
315 pDevice->byShortPreamble = PREAMBLE_TYPE_DEF;
316 pDevice->ePSMode = PS_MODE_DEF;
317 pDevice->b11hEnable = X80211h_MODE_DEF;
318 pDevice->eOPMode = OP_MODE_DEF;
319 pDevice->uConnectionRate = DATA_RATE_DEF;
320 if (pDevice->uConnectionRate < RATE_AUTO) pDevice->bFixRate = TRUE;
321 pDevice->byBBType = BBP_TYPE_DEF;
322 pDevice->byPacketType = pDevice->byBBType;
323 pDevice->byAutoFBCtrl = AUTO_FB_0;
324 pDevice->bUpdateBBVGA = TRUE;
325 pDevice->byFOETuning = 0;
326 pDevice->byAutoPwrTunning = 0;
327 pDevice->wCTSDuration = 0;
328 pDevice->byPreambleType = 0;
329 pDevice->bExistSWNetAddr = FALSE;
330
331 pDevice->bDiversityRegCtlON = FALSE;
332}
333
334
335static void device_init_diversity_timer(PSDevice pDevice)
336{
337 init_timer(&pDevice->TimerSQ3Tmax1);
338 pDevice->TimerSQ3Tmax1.data = (unsigned long)pDevice;
339 pDevice->TimerSQ3Tmax1.function = (TimerFunction)TimerSQ3CallBack;
340 pDevice->TimerSQ3Tmax1.expires = RUN_AT(HZ);
341
342 init_timer(&pDevice->TimerSQ3Tmax2);
343 pDevice->TimerSQ3Tmax2.data = (unsigned long)pDevice;
344 pDevice->TimerSQ3Tmax2.function = (TimerFunction)TimerSQ3CallBack;
345 pDevice->TimerSQ3Tmax2.expires = RUN_AT(HZ);
346
347 init_timer(&pDevice->TimerSQ3Tmax3);
348 pDevice->TimerSQ3Tmax3.data = (unsigned long)pDevice;
349 pDevice->TimerSQ3Tmax3.function = (TimerFunction)TimerSQ3Tmax3CallBack;
350 pDevice->TimerSQ3Tmax3.expires = RUN_AT(HZ);
351
352 return;
353}
354
355
356
357
358
359
360static BOOL device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType)
361{
362 u8 abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
363 u8 abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
364 u8 abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
365 BYTE byAntenna;
366 unsigned int ii;
367 CMD_CARD_INIT sInitCmd;
368 int ntStatus = STATUS_SUCCESS;
369 RSP_CARD_INIT sInitRsp;
370 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
371 BYTE byTmp;
372 BYTE byCalibTXIQ = 0;
373 BYTE byCalibTXDC = 0;
374 BYTE byCalibRXIQ = 0;
375
376 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "---->INIbInitAdapter. [%d][%d]\n", InitType, pDevice->byPacketType);
377 spin_lock_irq(&pDevice->lock);
378 if (InitType == DEVICE_INIT_COLD) {
379 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
380 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
381 memcpy(pDevice->abySNAP_Bridgetunnel,
382 abySNAP_Bridgetunnel,
383 ETH_ALEN);
384
385 if ( !FIRMWAREbCheckVersion(pDevice) ) {
386 if (FIRMWAREbDownload(pDevice) == TRUE) {
387 if (FIRMWAREbBrach2Sram(pDevice) == FALSE) {
388 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbBrach2Sram fail \n");
389 spin_unlock_irq(&pDevice->lock);
390 return FALSE;
391 }
392 } else {
393
394 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbDownload fail \n");
395 spin_unlock_irq(&pDevice->lock);
396 return FALSE;
397 }
398 }
399
400 if ( !BBbVT3184Init(pDevice) ) {
401 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" BBbVT3184Init fail \n");
402 spin_unlock_irq(&pDevice->lock);
403 return FALSE;
404 }
405 }
406
407 sInitCmd.byInitClass = (BYTE)InitType;
408 sInitCmd.bExistSWNetAddr = (BYTE) pDevice->bExistSWNetAddr;
409 for (ii = 0; ii < 6; ii++)
410 sInitCmd.bySWNetAddr[ii] = pDevice->abyCurrentNetAddr[ii];
411 sInitCmd.byShortRetryLimit = pDevice->byShortRetryLimit;
412 sInitCmd.byLongRetryLimit = pDevice->byLongRetryLimit;
413
414
415 ntStatus = CONTROLnsRequestOut(pDevice,
416 MESSAGE_TYPE_CARDINIT,
417 0,
418 0,
419 sizeof(CMD_CARD_INIT),
420 (PBYTE) &(sInitCmd));
421
422 if ( ntStatus != STATUS_SUCCESS ) {
423 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Issue Card init fail \n");
424 spin_unlock_irq(&pDevice->lock);
425 return FALSE;
426 }
427 if (InitType == DEVICE_INIT_COLD) {
428
429 ntStatus = CONTROLnsRequestIn(pDevice,MESSAGE_TYPE_INIT_RSP,0,0,sizeof(RSP_CARD_INIT), (PBYTE) &(sInitRsp));
430
431 if (ntStatus != STATUS_SUCCESS) {
432 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Cardinit request in status fail!\n");
433 spin_unlock_irq(&pDevice->lock);
434 return FALSE;
435 }
436
437
438 ntStatus = CONTROLnsRequestIn(pDevice,
439 MESSAGE_TYPE_READ,
440 MAC_REG_LOCALID,
441 MESSAGE_REQUEST_MACREG,
442 1,
443 &pDevice->byLocalID);
444
445 if ( ntStatus != STATUS_SUCCESS ) {
446 spin_unlock_irq(&pDevice->lock);
447 return FALSE;
448 }
449
450
451
452 pDevice->bCCK = TRUE;
453 pDevice->bProtectMode = FALSE;
454 pDevice->bNonERPPresent = FALSE;
455 pDevice->bBarkerPreambleMd = FALSE;
456 if ( pDevice->bFixRate ) {
457 pDevice->wCurrentRate = (WORD) pDevice->uConnectionRate;
458 } else {
459 if ( pDevice->byBBType == BB_TYPE_11B )
460 pDevice->wCurrentRate = RATE_11M;
461 else
462 pDevice->wCurrentRate = RATE_54M;
463 }
464
465 CHvInitChannelTable(pDevice);
466
467 pDevice->byTopOFDMBasicRate = RATE_24M;
468 pDevice->byTopCCKBasicRate = RATE_1M;
469 pDevice->byRevId = 0;
470 pDevice->byCurPwr = 0xFF;
471
472 pDevice->byCCKPwr = pDevice->abyEEPROM[EEP_OFS_PWR_CCK];
473 pDevice->byOFDMPwrG = pDevice->abyEEPROM[EEP_OFS_PWR_OFDMG];
474
475 for (ii=0;ii<14;ii++) {
476 pDevice->abyCCKPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_CCK_PWR_TBL];
477 if (pDevice->abyCCKPwrTbl[ii] == 0)
478 pDevice->abyCCKPwrTbl[ii] = pDevice->byCCKPwr;
479 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_OFDM_PWR_TBL];
480 if (pDevice->abyOFDMPwrTbl[ii] == 0)
481 pDevice->abyOFDMPwrTbl[ii] = pDevice->byOFDMPwrG;
482 }
483
484
485
486 if(((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) ||
487 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe))&&
488 (pDevice->byOriginalZonetype == ZoneType_USA)) {
489 for (ii = 11; ii < 14; ii++) {
490 pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
491 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];
492 }
493 }
494
495
496 pDevice->byOFDMPwrA = 0x34;
497
498 for (ii=0;ii<CB_MAX_CHANNEL_5G;ii++) {
499 pDevice->abyOFDMAPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_OFDMA_PWR_TBL];
500 if (pDevice->abyOFDMAPwrTbl[ii] == 0)
501 pDevice->abyOFDMAPwrTbl[ii] = pDevice->byOFDMPwrA;
502 }
503
504
505 byAntenna = pDevice->abyEEPROM[EEP_OFS_ANTENNA];
506 if (byAntenna & EEP_ANTINV)
507 pDevice->bTxRxAntInv = TRUE;
508 else
509 pDevice->bTxRxAntInv = FALSE;
510
511 byAntenna &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
512
513 if (byAntenna == 0)
514 byAntenna = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
515
516 if (byAntenna == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
517 pDevice->byAntennaCount = 2;
518 pDevice->byTxAntennaMode = ANT_B;
519 pDevice->dwTxAntennaSel = 1;
520 pDevice->dwRxAntennaSel = 1;
521 if (pDevice->bTxRxAntInv == TRUE)
522 pDevice->byRxAntennaMode = ANT_A;
523 else
524 pDevice->byRxAntennaMode = ANT_B;
525
526 if (pDevice->bDiversityRegCtlON)
527 pDevice->bDiversityEnable = TRUE;
528 else
529 pDevice->bDiversityEnable = FALSE;
530 } else {
531 pDevice->bDiversityEnable = FALSE;
532 pDevice->byAntennaCount = 1;
533 pDevice->dwTxAntennaSel = 0;
534 pDevice->dwRxAntennaSel = 0;
535 if (byAntenna & EEP_ANTENNA_AUX) {
536 pDevice->byTxAntennaMode = ANT_A;
537 if (pDevice->bTxRxAntInv == TRUE)
538 pDevice->byRxAntennaMode = ANT_B;
539 else
540 pDevice->byRxAntennaMode = ANT_A;
541 } else {
542 pDevice->byTxAntennaMode = ANT_B;
543 if (pDevice->bTxRxAntInv == TRUE)
544 pDevice->byRxAntennaMode = ANT_A;
545 else
546 pDevice->byRxAntennaMode = ANT_B;
547 }
548 }
549 pDevice->ulDiversityNValue = 100*255;
550 pDevice->ulDiversityMValue = 100*16;
551 pDevice->byTMax = 1;
552 pDevice->byTMax2 = 4;
553 pDevice->ulSQ3TH = 0;
554 pDevice->byTMax3 = 64;
555
556
557
558 pDevice->byAutoFBCtrl = AUTO_FB_0;
559
560
561 pDevice->uScanTime = WLAN_SCAN_MINITIME;
562
563
564
565 pDevice->eConfigPHYMode = PHY_TYPE_AUTO;
566 pDevice->byBBType = BB_TYPE_11G;
567
568
569 pDevice->ulTxPower = 25;
570
571
572 pDevice->byMinChannel = 1;
573 pDevice->byMaxChannel = CB_MAX_CHANNEL;
574
575
576 pDevice->byRFType = sInitRsp.byRFType;
577
578 if ((pDevice->byRFType & RF_EMU) != 0) {
579
580 pDevice->byRevId = 0x80;
581 }
582
583
584 if (pDevice->byRFType == RF_VT3226D0) {
585 if((pDevice->abyEEPROM[EEP_OFS_MAJOR_VER] == 0x1) &&
586 (pDevice->abyEEPROM[EEP_OFS_MINOR_VER] >= 0x4)) {
587 byCalibTXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_IQ];
588 byCalibTXDC = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_DC];
589 byCalibRXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_RX_IQ];
590 if( (byCalibTXIQ || byCalibTXDC || byCalibRXIQ) ) {
591 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFF, 0x03);
592 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFB, byCalibTXIQ);
593 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFC, byCalibTXDC);
594 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFD, byCalibRXIQ);
595 } else {
596
597 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFF, 0x0);
598 }
599 }
600 }
601 pMgmt->eScanType = WMAC_SCAN_PASSIVE;
602 pMgmt->uCurrChannel = pDevice->uChannel;
603 pMgmt->uIBSSChannel = pDevice->uChannel;
604 CARDbSetMediaChannel(pDevice, pMgmt->uCurrChannel);
605
606
607 memcpy(pDevice->abyPermanentNetAddr,&(sInitRsp.byNetAddr[0]),6);
608 memcpy(pDevice->abyCurrentNetAddr,
609 pDevice->abyPermanentNetAddr,
610 ETH_ALEN);
611
612
613
614 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Network address = %pM\n",
615 pDevice->abyCurrentNetAddr);
616 }
617
618
619
620 if (pDevice->byBBType == BB_TYPE_11A) {
621 CARDbAddBasicRate(pDevice, RATE_6M);
622 pDevice->bShortSlotTime = TRUE;
623 } else {
624 CARDbAddBasicRate(pDevice, RATE_1M);
625 pDevice->bShortSlotTime = FALSE;
626 }
627 BBvSetShortSlotTime(pDevice);
628 CARDvSetBSSMode(pDevice);
629
630 if (pDevice->bUpdateBBVGA) {
631 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
632 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
633 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
634 }
635
636 pDevice->byRadioCtl = pDevice->abyEEPROM[EEP_OFS_RADIOCTL];
637 pDevice->bHWRadioOff = FALSE;
638 if ( (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) != 0 ) {
639 ntStatus = CONTROLnsRequestIn(pDevice,
640 MESSAGE_TYPE_READ,
641 MAC_REG_GPIOCTL1,
642 MESSAGE_REQUEST_MACREG,
643 1,
644 &byTmp);
645
646 if ( ntStatus != STATUS_SUCCESS ) {
647 spin_unlock_irq(&pDevice->lock);
648 return FALSE;
649 }
650 if ( (byTmp & GPIO3_DATA) == 0 ) {
651 pDevice->bHWRadioOff = TRUE;
652 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
653 } else {
654 MACvRegBitsOff(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
655 pDevice->bHWRadioOff = FALSE;
656 }
657
658 }
659
660 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_TMLEN,0x38);
661 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
662 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL0,0x01);
663
664 if ((pDevice->bHWRadioOff == TRUE) || (pDevice->bRadioControlOff == TRUE)) {
665 CARDbRadioPowerOff(pDevice);
666 } else {
667 CARDbRadioPowerOn(pDevice);
668 }
669
670 spin_unlock_irq(&pDevice->lock);
671 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"<----INIbInitAdapter Exit\n");
672 return TRUE;
673}
674
675static BOOL device_release_WPADEV(PSDevice pDevice)
676{
677 viawget_wpa_header *wpahdr;
678 int ii=0;
679
680
681 if (pDevice->bWPADEVUp==TRUE) {
682 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
683 wpahdr->type = VIAWGET_DEVICECLOSE_MSG;
684 wpahdr->resp_ie_len = 0;
685 wpahdr->req_ie_len = 0;
686 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
687 pDevice->skb->dev = pDevice->wpadev;
688 skb_reset_mac_header(pDevice->skb);
689 pDevice->skb->pkt_type = PACKET_HOST;
690 pDevice->skb->protocol = htons(ETH_P_802_2);
691 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
692 netif_rx(pDevice->skb);
693 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
694
695
696
697
698 while(pDevice->bWPADEVUp==TRUE) {
699 set_current_state(TASK_UNINTERRUPTIBLE);
700 schedule_timeout (HZ/20);
701 ii++;
702 if(ii>20)
703 break;
704 }
705 }
706 return TRUE;
707}
708
709#ifdef CONFIG_PM
710
711static int vt6656_suspend(struct usb_interface *intf, pm_message_t message)
712{
713 PSDevice device = usb_get_intfdata(intf);
714
715 if (!device || !device->dev)
716 return -ENODEV;
717
718 if (device->flags & DEVICE_FLAGS_OPENED)
719 device_close(device->dev);
720
721 usb_put_dev(interface_to_usbdev(intf));
722
723 return 0;
724}
725
726static int vt6656_resume(struct usb_interface *intf)
727{
728 PSDevice device = usb_get_intfdata(intf);
729
730 if (!device || !device->dev)
731 return -ENODEV;
732
733 usb_get_dev(interface_to_usbdev(intf));
734
735 if (!(device->flags & DEVICE_FLAGS_OPENED))
736 device_open(device->dev);
737
738 return 0;
739}
740
741#endif
742
743static const struct net_device_ops device_netdev_ops = {
744 .ndo_open = device_open,
745 .ndo_stop = device_close,
746 .ndo_do_ioctl = device_ioctl,
747 .ndo_get_stats = device_get_stats,
748 .ndo_start_xmit = device_xmit,
749 .ndo_set_rx_mode = device_set_multi,
750};
751
752static int __devinit
753vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id)
754{
755 u8 fake_mac[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
756 struct usb_device *udev = interface_to_usbdev(intf);
757 int rc = 0;
758 struct net_device *netdev = NULL;
759 PSDevice pDevice = NULL;
760
761 printk(KERN_NOTICE "%s Ver. %s\n", DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
762 printk(KERN_NOTICE "Copyright (c) 2004 VIA Networking Technologies, Inc.\n");
763
764 udev = usb_get_dev(udev);
765 netdev = alloc_etherdev(sizeof(DEVICE_INFO));
766 if (!netdev) {
767 printk(KERN_ERR DEVICE_NAME ": allocate net device failed\n");
768 rc = -ENOMEM;
769 goto err_nomem;
770 }
771
772 pDevice = netdev_priv(netdev);
773 memset(pDevice, 0, sizeof(DEVICE_INFO));
774
775 pDevice->dev = netdev;
776 pDevice->usb = udev;
777
778 device_set_options(pDevice);
779 spin_lock_init(&pDevice->lock);
780
781 pDevice->tx_80211 = device_dma0_tx_80211;
782 pDevice->sMgmtObj.pAdapter = (void *) pDevice;
783
784 netdev->netdev_ops = &device_netdev_ops;
785 netdev->wireless_handlers =
786 (struct iw_handler_def *) &iwctl_handler_def;
787
788 usb_set_intfdata(intf, pDevice);
789 SET_NETDEV_DEV(netdev, &intf->dev);
790 memcpy(pDevice->dev->dev_addr, fake_mac, ETH_ALEN);
791 rc = register_netdev(netdev);
792 if (rc) {
793 printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
794 goto err_netdev;
795 }
796
797 usb_device_reset(pDevice);
798
799 {
800 union iwreq_data wrqu;
801 memset(&wrqu, 0, sizeof(wrqu));
802 wrqu.data.flags = RT_INSMOD_EVENT_FLAG;
803 wrqu.data.length = IFNAMSIZ;
804 wireless_send_event(pDevice->dev,
805 IWEVCUSTOM,
806 &wrqu,
807 pDevice->dev->name);
808 }
809
810 return 0;
811
812err_netdev:
813 free_netdev(netdev);
814err_nomem:
815 usb_put_dev(udev);
816
817 return rc;
818}
819
820static void device_free_tx_bufs(PSDevice pDevice)
821{
822 PUSB_SEND_CONTEXT pTxContext;
823 int ii;
824
825 for (ii = 0; ii < pDevice->cbTD; ii++) {
826
827 pTxContext = pDevice->apTD[ii];
828
829 if (pTxContext->pUrb) {
830 usb_kill_urb(pTxContext->pUrb);
831 usb_free_urb(pTxContext->pUrb);
832 }
833 kfree(pTxContext);
834 }
835 return;
836}
837
838
839static void device_free_rx_bufs(PSDevice pDevice)
840{
841 PRCB pRCB;
842 int ii;
843
844 for (ii = 0; ii < pDevice->cbRD; ii++) {
845
846 pRCB = pDevice->apRCB[ii];
847
848 if (pRCB->pUrb) {
849 usb_kill_urb(pRCB->pUrb);
850 usb_free_urb(pRCB->pUrb);
851 }
852
853 if (pRCB->skb)
854 dev_kfree_skb(pRCB->skb);
855 }
856 kfree(pDevice->pRCBMem);
857
858 return;
859}
860
861static void usb_device_reset(PSDevice pDevice)
862{
863 int status;
864 status = usb_reset_device(pDevice->usb);
865 if (status)
866 printk("usb_device_reset fail status=%d\n",status);
867 return ;
868}
869
870static void device_free_int_bufs(PSDevice pDevice)
871{
872 kfree(pDevice->intBuf.pDataBuf);
873 return;
874}
875
876
877static BOOL device_alloc_bufs(PSDevice pDevice) {
878
879 PUSB_SEND_CONTEXT pTxContext;
880 PRCB pRCB;
881 int ii;
882
883
884 for (ii = 0; ii < pDevice->cbTD; ii++) {
885
886 pTxContext = kmalloc(sizeof(USB_SEND_CONTEXT), GFP_KERNEL);
887 if (pTxContext == NULL) {
888 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate tx usb context failed\n", pDevice->dev->name);
889 goto free_tx;
890 }
891 pDevice->apTD[ii] = pTxContext;
892 pTxContext->pDevice = (void *) pDevice;
893
894 pTxContext->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
895 if (pTxContext->pUrb == NULL) {
896 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "alloc tx urb failed\n");
897 goto free_tx;
898 }
899 pTxContext->bBoolInUse = FALSE;
900 }
901
902
903 pDevice->pRCBMem = kzalloc((sizeof(RCB) * pDevice->cbRD), GFP_KERNEL);
904 if (pDevice->pRCBMem == NULL) {
905 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : alloc rx usb context failed\n", pDevice->dev->name);
906 goto free_tx;
907 }
908
909
910 pDevice->FirstRecvFreeList = NULL;
911 pDevice->LastRecvFreeList = NULL;
912 pDevice->FirstRecvMngList = NULL;
913 pDevice->LastRecvMngList = NULL;
914 pDevice->NumRecvFreeList = 0;
915 pRCB = (PRCB) pDevice->pRCBMem;
916
917 for (ii = 0; ii < pDevice->cbRD; ii++) {
918
919 pDevice->apRCB[ii] = pRCB;
920 pRCB->pDevice = (void *) pDevice;
921
922 pRCB->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
923
924 if (pRCB->pUrb == NULL) {
925 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx urb\n");
926 goto free_rx_tx;
927 }
928 pRCB->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
929 if (pRCB->skb == NULL) {
930 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx skb\n");
931 goto free_rx_tx;
932 }
933 pRCB->skb->dev = pDevice->dev;
934 pRCB->bBoolInUse = FALSE;
935 EnqueueRCB(pDevice->FirstRecvFreeList, pDevice->LastRecvFreeList, pRCB);
936 pDevice->NumRecvFreeList++;
937 pRCB++;
938 }
939
940
941 pDevice->pControlURB = usb_alloc_urb(0, GFP_ATOMIC);
942 if (pDevice->pControlURB == NULL) {
943 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc control urb\n");
944 goto free_rx_tx;
945 }
946
947 pDevice->pInterruptURB = usb_alloc_urb(0, GFP_ATOMIC);
948 if (pDevice->pInterruptURB == NULL) {
949 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int urb\n");
950 usb_free_urb(pDevice->pControlURB);
951 goto free_rx_tx;
952 }
953
954 pDevice->intBuf.pDataBuf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL);
955 if (pDevice->intBuf.pDataBuf == NULL) {
956 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int buf\n");
957 usb_free_urb(pDevice->pControlURB);
958 usb_free_urb(pDevice->pInterruptURB);
959 goto free_rx_tx;
960 }
961
962 return TRUE;
963
964free_rx_tx:
965 device_free_rx_bufs(pDevice);
966
967free_tx:
968 device_free_tx_bufs(pDevice);
969
970 return FALSE;
971}
972
973
974
975
976static BOOL device_init_defrag_cb(PSDevice pDevice) {
977 int i;
978 PSDeFragControlBlock pDeF;
979
980
981 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
982 pDeF = &(pDevice->sRxDFCB[i]);
983 if (!device_alloc_frag_buf(pDevice, pDeF)) {
984 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
985 pDevice->dev->name);
986 goto free_frag;
987 }
988 }
989 pDevice->cbDFCB = CB_MAX_RX_FRAG;
990 pDevice->cbFreeDFCB = pDevice->cbDFCB;
991 return TRUE;
992
993free_frag:
994 device_free_frag_bufs(pDevice);
995 return FALSE;
996}
997
998
999
1000static void device_free_frag_bufs(PSDevice pDevice) {
1001 PSDeFragControlBlock pDeF;
1002 int i;
1003
1004 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1005
1006 pDeF = &(pDevice->sRxDFCB[i]);
1007
1008 if (pDeF->skb)
1009 dev_kfree_skb(pDeF->skb);
1010 }
1011}
1012
1013
1014
1015BOOL device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {
1016
1017 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1018 if (pDeF->skb == NULL)
1019 return FALSE;
1020 ASSERT(pDeF->skb);
1021 pDeF->skb->dev = pDevice->dev;
1022
1023 return TRUE;
1024}
1025
1026
1027
1028
1029static int device_open(struct net_device *dev) {
1030 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1031
1032 extern SWPAResult wpa_Result;
1033 memset(wpa_Result.ifname,0,sizeof(wpa_Result.ifname));
1034 wpa_Result.proto = 0;
1035 wpa_Result.key_mgmt = 0;
1036 wpa_Result.eap_type = 0;
1037 wpa_Result.authenticated = FALSE;
1038 pDevice->fWPA_Authened = FALSE;
1039
1040 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_open...\n");
1041
1042
1043 pDevice->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS;
1044
1045 if (device_alloc_bufs(pDevice) == FALSE) {
1046 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_alloc_bufs fail... \n");
1047 return -ENOMEM;
1048 }
1049
1050 if (device_init_defrag_cb(pDevice)== FALSE) {
1051 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Initial defragement cb fail \n");
1052 goto free_rx_tx;
1053 }
1054
1055 MP_CLEAR_FLAG(pDevice, fMP_DISCONNECTED);
1056 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
1057 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
1058 MP_SET_FLAG(pDevice, fMP_POST_READS);
1059 MP_SET_FLAG(pDevice, fMP_POST_WRITES);
1060
1061
1062 Read_config_file(pDevice);
1063
1064 if (device_init_registers(pDevice, DEVICE_INIT_COLD) == FALSE) {
1065 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " init register fail\n");
1066 goto free_all;
1067 }
1068
1069 device_set_multi(pDevice->dev);
1070
1071
1072 KeyvInitTable(pDevice,&pDevice->sKey);
1073 memcpy(pDevice->sMgmtObj.abyMACAddr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1074 memcpy(pDevice->dev->dev_addr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1075 pDevice->bStopTx0Pkt = FALSE;
1076 pDevice->bStopDataPkt = FALSE;
1077 pDevice->bRoaming = FALSE;
1078 pDevice->bIsRoaming = FALSE;
1079 pDevice->bEnableRoaming = FALSE;
1080 if (pDevice->bDiversityRegCtlON) {
1081 device_init_diversity_timer(pDevice);
1082 }
1083
1084 vMgrObjectInit(pDevice);
1085 tasklet_init(&pDevice->RxMngWorkItem, (void *)RXvMngWorkItem, (unsigned long)pDevice);
1086 tasklet_init(&pDevice->ReadWorkItem, (void *)RXvWorkItem, (unsigned long)pDevice);
1087 tasklet_init(&pDevice->EventWorkItem, (void *)INTvWorkItem, (unsigned long)pDevice);
1088 add_timer(&(pDevice->sMgmtObj.sTimerSecondCallback));
1089 pDevice->int_interval = 100;
1090 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1091
1092 pDevice->bIsRxWorkItemQueued = TRUE;
1093 pDevice->fKillEventPollingThread = FALSE;
1094 pDevice->bEventAvailable = FALSE;
1095
1096 pDevice->bWPADEVUp = FALSE;
1097#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1098 pDevice->bwextstep0 = FALSE;
1099 pDevice->bwextstep1 = FALSE;
1100 pDevice->bwextstep2 = FALSE;
1101 pDevice->bwextstep3 = FALSE;
1102 pDevice->bWPASuppWextEnabled = FALSE;
1103#endif
1104 pDevice->byReAssocCount = 0;
1105
1106 RXvWorkItem(pDevice);
1107 INTvWorkItem(pDevice);
1108
1109
1110 if ((pDevice->bEncryptionEnable == TRUE) && (pDevice->bTransmitKey == TRUE)) {
1111 spin_lock_irq(&pDevice->lock);
1112 KeybSetDefaultKey( pDevice,
1113 &(pDevice->sKey),
1114 pDevice->byKeyIndex | (1 << 31),
1115 pDevice->uKeyLength,
1116 NULL,
1117 pDevice->abyKey,
1118 KEY_CTL_WEP
1119 );
1120 spin_unlock_irq(&pDevice->lock);
1121 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1122 }
1123
1124 if (pDevice->sMgmtObj.eConfigMode == WMAC_CONFIG_AP) {
1125 bScheduleCommand((void *) pDevice, WLAN_CMD_RUN_AP, NULL);
1126 }
1127 else {
1128
1129 bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1130
1131 }
1132
1133
1134 netif_stop_queue(pDevice->dev);
1135 pDevice->flags |= DEVICE_FLAGS_OPENED;
1136
1137{
1138 union iwreq_data wrqu;
1139 memset(&wrqu, 0, sizeof(wrqu));
1140 wrqu.data.flags = RT_UPDEV_EVENT_FLAG;
1141 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1142}
1143
1144 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
1145 return 0;
1146
1147free_all:
1148 device_free_frag_bufs(pDevice);
1149free_rx_tx:
1150 device_free_rx_bufs(pDevice);
1151 device_free_tx_bufs(pDevice);
1152 device_free_int_bufs(pDevice);
1153 usb_kill_urb(pDevice->pControlURB);
1154 usb_kill_urb(pDevice->pInterruptURB);
1155 usb_free_urb(pDevice->pControlURB);
1156 usb_free_urb(pDevice->pInterruptURB);
1157
1158 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open fail.. \n");
1159 return -ENOMEM;
1160}
1161
1162
1163
1164static int device_close(struct net_device *dev) {
1165 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1166 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1167
1168 int uu;
1169
1170 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close1 \n");
1171 if (pDevice == NULL)
1172 return -ENODEV;
1173
1174{
1175 union iwreq_data wrqu;
1176 memset(&wrqu, 0, sizeof(wrqu));
1177 wrqu.data.flags = RT_DOWNDEV_EVENT_FLAG;
1178 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1179}
1180
1181 if (pDevice->bLinkPass) {
1182 bScheduleCommand((void *) pDevice, WLAN_CMD_DISASSOCIATE, NULL);
1183 mdelay(30);
1184 }
1185
1186device_release_WPADEV(pDevice);
1187
1188 memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
1189 pMgmt->bShareKeyAlgorithm = FALSE;
1190 pDevice->bEncryptionEnable = FALSE;
1191 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1192 spin_lock_irq(&pDevice->lock);
1193 for (uu = 0; uu < MAX_KEY_TABLE; uu++)
1194 MACvDisableKeyEntry(pDevice,uu);
1195 spin_unlock_irq(&pDevice->lock);
1196
1197 if ((pDevice->flags & DEVICE_FLAGS_UNPLUG) == FALSE) {
1198 MACbShutdown(pDevice);
1199 }
1200 netif_stop_queue(pDevice->dev);
1201 MP_SET_FLAG(pDevice, fMP_DISCONNECTED);
1202 MP_CLEAR_FLAG(pDevice, fMP_POST_WRITES);
1203 MP_CLEAR_FLAG(pDevice, fMP_POST_READS);
1204 pDevice->fKillEventPollingThread = TRUE;
1205 del_timer(&pDevice->sTimerCommand);
1206 del_timer(&pMgmt->sTimerSecondCallback);
1207
1208 del_timer(&pDevice->sTimerTxData);
1209
1210 if (pDevice->bDiversityRegCtlON) {
1211 del_timer(&pDevice->TimerSQ3Tmax1);
1212 del_timer(&pDevice->TimerSQ3Tmax2);
1213 del_timer(&pDevice->TimerSQ3Tmax3);
1214 }
1215 tasklet_kill(&pDevice->RxMngWorkItem);
1216 tasklet_kill(&pDevice->ReadWorkItem);
1217 tasklet_kill(&pDevice->EventWorkItem);
1218
1219 pDevice->bRoaming = FALSE;
1220 pDevice->bIsRoaming = FALSE;
1221 pDevice->bEnableRoaming = FALSE;
1222 pDevice->bCmdRunning = FALSE;
1223 pDevice->bLinkPass = FALSE;
1224 memset(pMgmt->abyCurrBSSID, 0, 6);
1225 pMgmt->eCurrState = WMAC_STATE_IDLE;
1226
1227 device_free_tx_bufs(pDevice);
1228 device_free_rx_bufs(pDevice);
1229 device_free_int_bufs(pDevice);
1230 device_free_frag_bufs(pDevice);
1231
1232 usb_kill_urb(pDevice->pControlURB);
1233 usb_kill_urb(pDevice->pInterruptURB);
1234 usb_free_urb(pDevice->pControlURB);
1235 usb_free_urb(pDevice->pInterruptURB);
1236
1237 BSSvClearNodeDBTable(pDevice, 0);
1238 pDevice->flags &=(~DEVICE_FLAGS_OPENED);
1239
1240 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n");
1241
1242 return 0;
1243}
1244
1245static void __devexit vt6656_disconnect(struct usb_interface *intf)
1246{
1247 PSDevice device = usb_get_intfdata(intf);
1248
1249 if (!device)
1250 return;
1251
1252 {
1253 union iwreq_data req;
1254 memset(&req, 0, sizeof(req));
1255 req.data.flags = RT_RMMOD_EVENT_FLAG;
1256 wireless_send_event(device->dev, IWEVCUSTOM, &req, NULL);
1257 }
1258
1259 device_release_WPADEV(device);
1260
1261 if (device->firmware)
1262 release_firmware(device->firmware);
1263
1264 usb_set_intfdata(intf, NULL);
1265 usb_put_dev(interface_to_usbdev(intf));
1266
1267 device->flags |= DEVICE_FLAGS_UNPLUG;
1268
1269 if (device->dev) {
1270 unregister_netdev(device->dev);
1271 wpa_set_wpadev(device, 0);
1272 free_netdev(device->dev);
1273 }
1274}
1275
1276static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev)
1277{
1278 PSDevice pDevice = netdev_priv(dev);
1279
1280 spin_lock_irq(&pDevice->lock);
1281
1282 if (unlikely(pDevice->bStopTx0Pkt))
1283 dev_kfree_skb_irq(skb);
1284 else
1285 vDMA0_tx_80211(pDevice, skb);
1286
1287 spin_unlock_irq(&pDevice->lock);
1288
1289 return NETDEV_TX_OK;
1290}
1291
1292static int device_xmit(struct sk_buff *skb, struct net_device *dev)
1293{
1294 PSDevice pDevice = netdev_priv(dev);
1295 struct net_device_stats *stats = &pDevice->stats;
1296
1297 spin_lock_irq(&pDevice->lock);
1298
1299 netif_stop_queue(dev);
1300
1301 if (!pDevice->bLinkPass) {
1302 dev_kfree_skb_irq(skb);
1303 goto out;
1304 }
1305
1306 if (pDevice->bStopDataPkt) {
1307 dev_kfree_skb_irq(skb);
1308 stats->tx_dropped++;
1309 goto out;
1310 }
1311
1312 if (nsDMA_tx_packet(pDevice, TYPE_AC0DMA, skb)) {
1313 if (netif_queue_stopped(dev))
1314 netif_wake_queue(dev);
1315 }
1316
1317out:
1318 spin_unlock_irq(&pDevice->lock);
1319
1320 return NETDEV_TX_OK;
1321}
1322
1323static unsigned const ethernet_polynomial = 0x04c11db7U;
1324static inline u32 ether_crc(int length, unsigned char *data)
1325{
1326 int crc = -1;
1327
1328 while(--length >= 0) {
1329 unsigned char current_octet = *data++;
1330 int bit;
1331 for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
1332 crc = (crc << 1) ^
1333 ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
1334 }
1335 }
1336 return crc;
1337}
1338
1339
1340static unsigned char *kstrstr(const unsigned char *str1,
1341 const unsigned char *str2) {
1342 int str1_len = strlen(str1);
1343 int str2_len = strlen(str2);
1344
1345 while (str1_len >= str2_len) {
1346 str1_len--;
1347 if(memcmp(str1,str2,str2_len)==0)
1348 return (unsigned char *) str1;
1349 str1++;
1350 }
1351 return NULL;
1352}
1353
1354static int Config_FileGetParameter(unsigned char *string,
1355 unsigned char *dest,
1356 unsigned char *source)
1357{
1358 unsigned char buf1[100];
1359 unsigned char buf2[100];
1360 unsigned char *start_p = NULL, *end_p = NULL, *tmp_p = NULL;
1361 int ii;
1362
1363 memset(buf1,0,100);
1364 strcat(buf1, string);
1365 strcat(buf1, "=");
1366 source+=strlen(buf1);
1367
1368
1369 start_p = kstrstr(source,buf1);
1370 if (start_p == NULL)
1371 return FALSE;
1372
1373
1374 for (ii = 1; ; ii++) {
1375 if (memcmp(start_p - ii, "\n", 1) == 0)
1376 break;
1377 if (memcmp(start_p - ii, "#", 1) == 0)
1378 return FALSE;
1379 }
1380
1381
1382 end_p = kstrstr(start_p,"\n");
1383 if (end_p == NULL) {
1384 end_p=start_p+strlen(start_p);
1385 }
1386
1387 memset(buf2,0,100);
1388 memcpy(buf2,start_p,end_p-start_p);
1389 buf2[end_p-start_p]='\0';
1390
1391
1392 start_p = kstrstr(buf2,"=");
1393 if (start_p == NULL)
1394 return FALSE;
1395 memset(buf1,0,100);
1396 strcpy(buf1,start_p+1);
1397
1398
1399 tmp_p = buf1;
1400 while(*tmp_p != 0x00) {
1401 if(*tmp_p==' ')
1402 tmp_p++;
1403 else
1404 break;
1405 }
1406
1407 memcpy(dest,tmp_p,strlen(tmp_p));
1408 return TRUE;
1409}
1410
1411
1412static unsigned char *Config_FileOperation(PSDevice pDevice)
1413{
1414 unsigned char *config_path = CONFIG_PATH;
1415 unsigned char *buffer = NULL;
1416 struct file *filp=NULL;
1417 mm_segment_t old_fs = get_fs();
1418
1419 int result = 0;
1420
1421 set_fs (KERNEL_DS);
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431 filp = filp_open(config_path, O_RDWR, 0);
1432 if (IS_ERR(filp)) {
1433 printk("Config_FileOperation file Not exist\n");
1434 result=-1;
1435 goto error2;
1436 }
1437
1438 if(!(filp->f_op) || !(filp->f_op->read) ||!(filp->f_op->write)) {
1439 printk("file %s cann't readable or writable?\n",config_path);
1440 result = -1;
1441 goto error1;
1442 }
1443
1444 buffer = kmalloc(1024, GFP_KERNEL);
1445 if(buffer==NULL) {
1446 printk("allocate mem for file fail?\n");
1447 result = -1;
1448 goto error1;
1449 }
1450
1451 if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
1452 printk("read file error?\n");
1453 result = -1;
1454 }
1455
1456error1:
1457 if(filp_close(filp,NULL))
1458 printk("Config_FileOperation:close file fail\n");
1459
1460error2:
1461 set_fs (old_fs);
1462
1463
1464
1465
1466
1467
1468if(result!=0) {
1469 kfree(buffer);
1470 buffer=NULL;
1471}
1472 return buffer;
1473}
1474
1475
1476static int Read_config_file(PSDevice pDevice) {
1477 int result = 0;
1478 unsigned char tmpbuffer[100];
1479 unsigned char *buffer = NULL;
1480
1481
1482 pDevice->config_file.ZoneType = -1;
1483 pDevice->config_file.eAuthenMode = -1;
1484 pDevice->config_file.eEncryptionStatus = -1;
1485
1486 buffer = Config_FileOperation(pDevice);
1487 if (buffer == NULL) {
1488 result =-1;
1489 return result;
1490 }
1491
1492
1493{
1494 memset(tmpbuffer,0,sizeof(tmpbuffer));
1495 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer) ==TRUE) {
1496 if(memcmp(tmpbuffer,"USA",3)==0) {
1497 pDevice->config_file.ZoneType=ZoneType_USA;
1498 }
1499 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
1500 pDevice->config_file.ZoneType=ZoneType_Japan;
1501 }
1502 else if(memcmp(tmpbuffer,"EUROPE",6)==0) {
1503 pDevice->config_file.ZoneType=ZoneType_Europe;
1504 }
1505 else {
1506 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
1507 }
1508 }
1509}
1510
1511
1512 {
1513 memset(tmpbuffer,0,sizeof(tmpbuffer));
1514 if(Config_FileGetParameter("AUTHENMODE",tmpbuffer,buffer)==TRUE) {
1515 pDevice->config_file.eAuthenMode = (int) simple_strtol(tmpbuffer, NULL, 10);
1516 }
1517
1518 memset(tmpbuffer,0,sizeof(tmpbuffer));
1519 if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer,buffer)==TRUE) {
1520 pDevice->config_file.eEncryptionStatus= (int) simple_strtol(tmpbuffer, NULL, 10);
1521 }
1522 }
1523
1524 kfree(buffer);
1525 return result;
1526}
1527
1528static void device_set_multi(struct net_device *dev) {
1529 PSDevice pDevice = (PSDevice) netdev_priv(dev);
1530 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1531 u32 mc_filter[2];
1532 int ii;
1533 struct netdev_hw_addr *ha;
1534 BYTE pbyData[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
1535 BYTE byTmpMode = 0;
1536 int rc;
1537
1538
1539 spin_lock_irq(&pDevice->lock);
1540 rc = CONTROLnsRequestIn(pDevice,
1541 MESSAGE_TYPE_READ,
1542 MAC_REG_RCR,
1543 MESSAGE_REQUEST_MACREG,
1544 1,
1545 &byTmpMode
1546 );
1547 if (rc == 0) pDevice->byRxMode = byTmpMode;
1548
1549 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode in= %x\n", pDevice->byRxMode);
1550
1551 if (dev->flags & IFF_PROMISC) {
1552 DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
1553
1554 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
1555 }
1556 else if ((netdev_mc_count(dev) > pDevice->multicast_limit) ||
1557 (dev->flags & IFF_ALLMULTI)) {
1558 CONTROLnsRequestOut(pDevice,
1559 MESSAGE_TYPE_WRITE,
1560 MAC_REG_MAR0,
1561 MESSAGE_REQUEST_MACREG,
1562 8,
1563 pbyData
1564 );
1565 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1566 }
1567 else {
1568 memset(mc_filter, 0, sizeof(mc_filter));
1569 netdev_for_each_mc_addr(ha, dev) {
1570 int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
1571 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
1572 }
1573 for (ii = 0; ii < 4; ii++) {
1574 MACvWriteMultiAddr(pDevice, ii, *((PBYTE)&mc_filter[0] + ii));
1575 MACvWriteMultiAddr(pDevice, ii+ 4, *((PBYTE)&mc_filter[1] + ii));
1576 }
1577 pDevice->byRxMode &= ~(RCR_UNICAST);
1578 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1579 }
1580
1581 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1582
1583 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1584 pDevice->byRxMode &= ~(RCR_UNICAST);
1585 }
1586 ControlvWriteByte(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_RCR, pDevice->byRxMode);
1587 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode out= %x\n", pDevice->byRxMode);
1588 spin_unlock_irq(&pDevice->lock);
1589
1590}
1591
1592
1593static struct net_device_stats *device_get_stats(struct net_device *dev) {
1594 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1595
1596 return &pDevice->stats;
1597}
1598
1599
1600static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
1601 PSDevice pDevice = (PSDevice)netdev_priv(dev);
1602 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1603 PSCmdRequest pReq;
1604
1605 struct iwreq *wrq = (struct iwreq *) rq;
1606 int rc =0;
1607
1608 if (pMgmt == NULL) {
1609 rc = -EFAULT;
1610 return rc;
1611 }
1612
1613 switch(cmd) {
1614
1615 case SIOCGIWNAME:
1616 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
1617 break;
1618
1619 case SIOCSIWNWID:
1620 case SIOCGIWNWID:
1621 rc = -EOPNOTSUPP;
1622 break;
1623
1624
1625 case SIOCSIWFREQ:
1626 rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
1627 break;
1628
1629
1630 case SIOCGIWFREQ:
1631 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
1632 break;
1633
1634
1635 case SIOCSIWESSID:
1636
1637 {
1638 char essid[IW_ESSID_MAX_SIZE+1];
1639 if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
1640 rc = -E2BIG;
1641 break;
1642 }
1643 if (copy_from_user(essid, wrq->u.essid.pointer,
1644 wrq->u.essid.length)) {
1645 rc = -EFAULT;
1646 break;
1647 }
1648 rc = iwctl_siwessid(dev, NULL,
1649 &(wrq->u.essid), essid);
1650 }
1651 break;
1652
1653
1654
1655 case SIOCGIWESSID:
1656
1657 {
1658 char essid[IW_ESSID_MAX_SIZE+1];
1659 if (wrq->u.essid.pointer) {
1660 iwctl_giwessid(dev, NULL,
1661 &(wrq->u.essid), essid);
1662 if (copy_to_user(wrq->u.essid.pointer,
1663 essid,
1664 wrq->u.essid.length) )
1665 rc = -EFAULT;
1666 }
1667 }
1668 break;
1669
1670 case SIOCSIWAP:
1671
1672 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1673 break;
1674
1675
1676
1677 case SIOCGIWAP:
1678 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1679 break;
1680
1681
1682
1683 case SIOCSIWNICKN:
1684 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
1685 rc = -EOPNOTSUPP;
1686 break;
1687
1688
1689 case SIOCGIWNICKN:
1690 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
1691 rc = -EOPNOTSUPP;
1692 break;
1693
1694
1695 case SIOCSIWRATE:
1696 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1697 break;
1698
1699
1700 case SIOCGIWRATE:
1701 iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1702 break;
1703
1704
1705 case SIOCSIWRTS:
1706
1707 rc = iwctl_siwrts(dev, &(wrq->u.rts));
1708 break;
1709
1710
1711 case SIOCGIWRTS:
1712
1713 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
1714 break;
1715
1716
1717 case SIOCSIWFRAG:
1718
1719 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
1720 break;
1721
1722
1723 case SIOCGIWFRAG:
1724
1725 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
1726 break;
1727
1728
1729 case SIOCSIWMODE:
1730 rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
1731 break;
1732
1733
1734 case SIOCGIWMODE:
1735 iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
1736 break;
1737
1738
1739 case SIOCSIWENCODE:
1740 {
1741 char abyKey[WLAN_WEP232_KEYLEN];
1742
1743 if (wrq->u.encoding.pointer) {
1744
1745
1746 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
1747 rc = -E2BIG;
1748 break;
1749 }
1750 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
1751 if (copy_from_user(abyKey,
1752 wrq->u.encoding.pointer,
1753 wrq->u.encoding.length)) {
1754 rc = -EFAULT;
1755 break;
1756 }
1757 } else if (wrq->u.encoding.length != 0) {
1758 rc = -EINVAL;
1759 break;
1760 }
1761 rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
1762 }
1763 break;
1764
1765
1766 case SIOCGIWENCODE:
1767
1768 if (!capable(CAP_NET_ADMIN)) {
1769 rc = -EPERM;
1770 break;
1771 }
1772 {
1773 char abyKey[WLAN_WEP232_KEYLEN];
1774
1775 rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
1776 if (rc != 0) break;
1777 if (wrq->u.encoding.pointer) {
1778 if (copy_to_user(wrq->u.encoding.pointer,
1779 abyKey,
1780 wrq->u.encoding.length))
1781 rc = -EFAULT;
1782 }
1783 }
1784 break;
1785
1786
1787 case SIOCGIWTXPOW:
1788 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
1789 rc = -EOPNOTSUPP;
1790 break;
1791
1792 case SIOCSIWTXPOW:
1793 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
1794 rc = -EOPNOTSUPP;
1795 break;
1796
1797 case SIOCSIWRETRY:
1798
1799 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
1800 break;
1801
1802 case SIOCGIWRETRY:
1803
1804 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
1805 break;
1806
1807
1808 case SIOCGIWRANGE:
1809
1810 {
1811 struct iw_range range;
1812
1813 iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *) &range);
1814 if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
1815 rc = -EFAULT;
1816 }
1817
1818 break;
1819
1820 case SIOCGIWPOWER:
1821
1822 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
1823 break;
1824
1825
1826 case SIOCSIWPOWER:
1827
1828 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
1829 break;
1830
1831
1832 case SIOCGIWSENS:
1833
1834 rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
1835 break;
1836
1837 case SIOCSIWSENS:
1838 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
1839 rc = -EOPNOTSUPP;
1840 break;
1841
1842 case SIOCGIWAPLIST:
1843 {
1844 char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
1845
1846 if (wrq->u.data.pointer) {
1847 rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
1848 if (rc == 0) {
1849 if (copy_to_user(wrq->u.data.pointer,
1850 buffer,
1851 (wrq->u.data.length * (sizeof(struct sockaddr) + sizeof(struct iw_quality)))
1852 ))
1853 rc = -EFAULT;
1854 }
1855 }
1856 }
1857 break;
1858
1859
1860#ifdef WIRELESS_SPY
1861
1862 case SIOCSIWSPY:
1863
1864 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
1865 rc = -EOPNOTSUPP;
1866 break;
1867
1868
1869 case SIOCGIWSPY:
1870
1871 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
1872 rc = -EOPNOTSUPP;
1873 break;
1874
1875#endif
1876
1877 case SIOCGIWPRIV:
1878 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
1879 rc = -EOPNOTSUPP;
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890 break;
1891
1892#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1893 case SIOCSIWAUTH:
1894 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH\n");
1895 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
1896 break;
1897
1898 case SIOCGIWAUTH:
1899 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
1900 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
1901 break;
1902
1903 case SIOCSIWGENIE:
1904 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
1905 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1906 break;
1907
1908 case SIOCGIWGENIE:
1909 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
1910 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1911 break;
1912
1913 case SIOCSIWENCODEEXT:
1914 {
1915 char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
1916 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
1917 if(wrq->u.encoding.pointer){
1918 memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1);
1919 if(wrq->u.encoding.length > (sizeof(struct iw_encode_ext)+ MAX_KEY_LEN)){
1920 rc = -E2BIG;
1921 break;
1922 }
1923 if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
1924 rc = -EFAULT;
1925 break;
1926 }
1927 }else if(wrq->u.encoding.length != 0){
1928 rc = -EINVAL;
1929 break;
1930 }
1931 rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
1932 }
1933 break;
1934
1935 case SIOCGIWENCODEEXT:
1936 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
1937 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
1938 break;
1939
1940 case SIOCSIWMLME:
1941 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
1942 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1943 break;
1944
1945#endif
1946
1947 case IOCTL_CMD_TEST:
1948
1949 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
1950 rc = -EFAULT;
1951 break;
1952 } else {
1953 rc = 0;
1954 }
1955 pReq = (PSCmdRequest)rq;
1956
1957
1958
1959 pReq->wResult = MAGIC_CODE;
1960
1961
1962
1963 break;
1964
1965 case IOCTL_CMD_SET:
1966 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
1967 (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
1968 {
1969 rc = -EFAULT;
1970 break;
1971 } else {
1972 rc = 0;
1973 }
1974
1975 if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
1976 return -EBUSY;
1977 }
1978 rc = private_ioctl(pDevice, rq);
1979 clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
1980 break;
1981
1982 case IOCTL_CMD_HOSTAPD:
1983
1984 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
1985 rc = -EFAULT;
1986 break;
1987 } else {
1988 rc = 0;
1989 }
1990
1991 rc = vt6656_hostap_ioctl(pDevice, &wrq->u.data);
1992 break;
1993
1994 case IOCTL_CMD_WPA:
1995
1996 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
1997 rc = -EFAULT;
1998 break;
1999 } else {
2000 rc = 0;
2001 }
2002
2003 rc = wpa_ioctl(pDevice, &wrq->u.data);
2004 break;
2005
2006 case SIOCETHTOOL:
2007 return ethtool_ioctl(dev, (void *) rq->ifr_data);
2008
2009
2010 default:
2011 rc = -EOPNOTSUPP;
2012 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
2013
2014
2015 }
2016
2017 if (pDevice->bCommit) {
2018 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2019 netif_stop_queue(pDevice->dev);
2020 spin_lock_irq(&pDevice->lock);
2021 bScheduleCommand((void *) pDevice, WLAN_CMD_RUN_AP, NULL);
2022 spin_unlock_irq(&pDevice->lock);
2023 }
2024 else {
2025 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
2026 spin_lock_irq(&pDevice->lock);
2027
2028 if (pDevice->bLinkPass &&
2029 memcmp(pMgmt->abyCurrSSID,pMgmt->abyDesireSSID,WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN)) {
2030 bScheduleCommand((void *) pDevice, WLAN_CMD_DISASSOCIATE, NULL);
2031 } else {
2032 pDevice->bLinkPass = FALSE;
2033 pMgmt->eCurrState = WMAC_STATE_IDLE;
2034 memset(pMgmt->abyCurrBSSID, 0, 6);
2035 }
2036 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
2037
2038 netif_stop_queue(pDevice->dev);
2039#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2040 pMgmt->eScanType = WMAC_SCAN_ACTIVE;
2041 if (!pDevice->bWPASuppWextEnabled)
2042#endif
2043 bScheduleCommand((void *) pDevice,
2044 WLAN_CMD_BSSID_SCAN,
2045 pMgmt->abyDesireSSID);
2046 bScheduleCommand((void *) pDevice,
2047 WLAN_CMD_SSID,
2048 NULL);
2049 spin_unlock_irq(&pDevice->lock);
2050 }
2051 pDevice->bCommit = FALSE;
2052 }
2053
2054
2055 return rc;
2056}
2057
2058
2059static int ethtool_ioctl(struct net_device *dev, void *useraddr)
2060{
2061 u32 ethcmd;
2062
2063 if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd)))
2064 return -EFAULT;
2065
2066 switch (ethcmd) {
2067 case ETHTOOL_GDRVINFO: {
2068 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
2069 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
2070 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
2071 if (copy_to_user(useraddr, &info, sizeof(info)))
2072 return -EFAULT;
2073 return 0;
2074 }
2075
2076 }
2077
2078 return -EOPNOTSUPP;
2079}
2080
2081
2082
2083
2084MODULE_DEVICE_TABLE(usb, vt6656_table);
2085
2086static struct usb_driver vt6656_driver = {
2087 .name = DEVICE_NAME,
2088 .probe = vt6656_probe,
2089 .disconnect = vt6656_disconnect,
2090 .id_table = vt6656_table,
2091#ifdef CONFIG_PM
2092 .suspend = vt6656_suspend,
2093 .resume = vt6656_resume,
2094#endif
2095};
2096
2097module_usb_driver(vt6656_driver);
2098