2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 * Purpose: driver entry for initial, open, close, tx and rx.
29 * vt6656_probe - module initial (insmod) driver entry
30 * device_remove1 - module remove entry
31 * device_open - allocate dma/descripter resource & initial mac/bbp function
32 * device_xmit - asynchrous data tx function
33 * device_set_multi - set mac filter
34 * device_ioctl - ioctl entry
35 * device_close - shutdown mac/bbp & free dma/descripter resource
36 * device_alloc_frag_buf - rx fragement pre-allocated function
37 * device_free_tx_bufs - free tx buffer function
38 * device_dma0_tx_80211- tx 802.11 frame via dma0
39 * device_dma0_xmit- tx PS bufferred frame via dma0
40 * device_init_registers- initial MAC & BBP & RF internal registers.
41 * device_init_rings- initial tx/rx ring buffer
42 * device_init_defrag_cb- initial & allocate de-fragement buffer.
43 * device_tx_srv- tx interrupt service function
76 /*--------------------- Static Definitions -------------------------*/
77 //static int msglevel =MSG_LEVEL_DEBUG;
78 static int msglevel =MSG_LEVEL_INFO;
81 // Define module options
84 // Version Information
85 #define DRIVER_AUTHOR "VIA Networking Technologies, Inc., <lyndonchen@vntek.com.tw>"
86 MODULE_AUTHOR(DRIVER_AUTHOR);
87 MODULE_LICENSE("GPL");
88 MODULE_DESCRIPTION(DEVICE_FULL_DRV_NAM);
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);
95 #define RX_DESC_MIN0 16
96 #define RX_DESC_MAX0 128
97 #define RX_DESC_DEF0 64
98 DEVICE_PARAM(RxDescriptors0,"Number of receive usb desc buffer");
101 #define TX_DESC_MIN0 16
102 #define TX_DESC_MAX0 128
103 #define TX_DESC_DEF0 64
104 DEVICE_PARAM(TxDescriptors0,"Number of transmit usb desc buffer");
107 #define CHANNEL_MIN 1
108 #define CHANNEL_MAX 14
109 #define CHANNEL_DEF 6
111 DEVICE_PARAM(Channel, "Channel number");
114 /* PreambleType[] is the preamble length used for transmit.
115 0: indicate allows long preamble type
116 1: indicate allows short preamble type
119 #define PREAMBLE_TYPE_DEF 1
121 DEVICE_PARAM(PreambleType, "Preamble Type");
124 #define RTS_THRESH_MIN 512
125 #define RTS_THRESH_MAX 2347
126 #define RTS_THRESH_DEF 2347
128 DEVICE_PARAM(RTSThreshold, "RTS threshold");
131 #define FRAG_THRESH_MIN 256
132 #define FRAG_THRESH_MAX 2346
133 #define FRAG_THRESH_DEF 2346
135 DEVICE_PARAM(FragThreshold, "Fragmentation threshold");
138 #define DATA_RATE_MIN 0
139 #define DATA_RATE_MAX 13
140 #define DATA_RATE_DEF 13
142 0: indicate 1 Mbps 0x02
143 1: indicate 2 Mbps 0x04
144 2: indicate 5.5 Mbps 0x0B
145 3: indicate 11 Mbps 0x16
146 4: indicate 6 Mbps 0x0c
147 5: indicate 9 Mbps 0x12
148 6: indicate 12 Mbps 0x18
149 7: indicate 18 Mbps 0x24
150 8: indicate 24 Mbps 0x30
151 9: indicate 36 Mbps 0x48
152 10: indicate 48 Mbps 0x60
153 11: indicate 54 Mbps 0x6c
154 12: indicate 72 Mbps 0x90
155 13: indicate auto rate
158 DEVICE_PARAM(ConnectionRate, "Connection data rate");
160 #define OP_MODE_MAX 2
161 #define OP_MODE_DEF 0
162 #define OP_MODE_MIN 0
164 DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode ");
166 /* OpMode[] is used for transmit.
167 0: indicate infrastruct mode used
168 1: indicate adhoc mode used
169 2: indicate AP mode used
174 0: indicate disable power saving mode
175 1: indicate enable power saving mode
178 #define PS_MODE_DEF 0
180 DEVICE_PARAM(PSMode, "Power saving mode");
183 #define SHORT_RETRY_MIN 0
184 #define SHORT_RETRY_MAX 31
185 #define SHORT_RETRY_DEF 8
188 DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");
190 #define LONG_RETRY_MIN 0
191 #define LONG_RETRY_MAX 15
192 #define LONG_RETRY_DEF 4
195 DEVICE_PARAM(LongRetryLimit, "long frame retry limits");
198 /* BasebandType[] baseband type selected
199 0: indicate 802.11a type
200 1: indicate 802.11b type
201 2: indicate 802.11g type
203 #define BBP_TYPE_MIN 0
204 #define BBP_TYPE_MAX 2
205 #define BBP_TYPE_DEF 2
207 DEVICE_PARAM(BasebandType, "baseband type");
212 0: indicate disable 802.11h
213 1: indicate enable 802.11h
216 #define X80211h_MODE_DEF 0
218 DEVICE_PARAM(b80211hEnable, "802.11h mode");
222 // Static vars definitions
225 static struct usb_device_id vt6656_table[] __devinitdata = {
226 {USB_DEVICE(VNT_USB_VENDOR_ID, VNT_USB_PRODUCT_ID)},
230 // Frequency list (map channels to frequencies)
232 static const long frequency_list[] = {
233 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 2484,
234 4915, 4920, 4925, 4935, 4940, 4945, 4960, 4980,
235 5035, 5040, 5045, 5055, 5060, 5080, 5170, 5180, 5190, 5200, 5210, 5220, 5230, 5240,
236 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640, 5660, 5680,
237 5700, 5745, 5765, 5785, 5805, 5825
241 #ifndef IW_ENCODE_NOKEY
242 #define IW_ENCODE_NOKEY 0x0800
243 #define IW_ENCODE_MODE (IW_ENCODE_DISABLED | IW_ENCODE_RESTRICTED | IW_ENCODE_OPEN)
246 static const struct iw_handler_def iwctl_handler_def;
249 /*--------------------- Static Functions --------------------------*/
251 static int vt6656_probe(struct usb_interface *intf,
252 const struct usb_device_id *id);
253 static void vt6656_disconnect(struct usb_interface *intf);
255 #ifdef CONFIG_PM /* Minimal support for suspend and resume */
256 static int vt6656_suspend(struct usb_interface *intf, pm_message_t message);
257 static int vt6656_resume(struct usb_interface *intf);
258 #endif /* CONFIG_PM */
260 static struct net_device_stats *device_get_stats(struct net_device *dev);
261 static int device_open(struct net_device *dev);
262 static int device_xmit(struct sk_buff *skb, struct net_device *dev);
263 static void device_set_multi(struct net_device *dev);
264 static int device_close(struct net_device *dev);
265 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
267 static BOOL device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType);
268 static BOOL device_init_defrag_cb(PSDevice pDevice);
269 static void device_init_diversity_timer(PSDevice pDevice);
270 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev);
272 static int ethtool_ioctl(struct net_device *dev, void *useraddr);
273 static void device_free_tx_bufs(PSDevice pDevice);
274 static void device_free_rx_bufs(PSDevice pDevice);
275 static void device_free_int_bufs(PSDevice pDevice);
276 static void device_free_frag_bufs(PSDevice pDevice);
277 static BOOL device_alloc_bufs(PSDevice pDevice);
279 static int Read_config_file(PSDevice pDevice);
280 static unsigned char *Config_FileOperation(PSDevice pDevice);
281 static int Config_FileGetParameter(unsigned char *string,
283 unsigned char *source);
285 static BOOL device_release_WPADEV(PSDevice pDevice);
287 static void usb_device_reset(PSDevice pDevice);
291 /*--------------------- Export Variables --------------------------*/
293 /*--------------------- Export Functions --------------------------*/
297 device_set_options(PSDevice pDevice) {
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};
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);
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 // pDevice->bDiversityRegCtlON = TRUE;
331 pDevice->bDiversityRegCtlON = FALSE;
335 static void device_init_diversity_timer(PSDevice pDevice)
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);
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);
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);
357 // Initialiation of MAC & BBP registers
360 static BOOL device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType)
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};
367 CMD_CARD_INIT sInitCmd;
368 int ntStatus = STATUS_SUCCESS;
369 RSP_CARD_INIT sInitRsp;
370 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
372 BYTE byCalibTXIQ = 0;
373 BYTE byCalibTXDC = 0;
374 BYTE byCalibRXIQ = 0;
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,
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);
394 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbDownload fail \n");
395 spin_unlock_irq(&pDevice->lock);
400 if ( !BBbVT3184Init(pDevice) ) {
401 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" BBbVT3184Init fail \n");
402 spin_unlock_irq(&pDevice->lock);
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;
414 //issue Card_init command to device
415 ntStatus = CONTROLnsRequestOut(pDevice,
416 MESSAGE_TYPE_CARDINIT,
419 sizeof(CMD_CARD_INIT),
420 (PBYTE) &(sInitCmd));
422 if ( ntStatus != STATUS_SUCCESS ) {
423 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Issue Card init fail \n");
424 spin_unlock_irq(&pDevice->lock);
427 if (InitType == DEVICE_INIT_COLD) {
429 ntStatus = CONTROLnsRequestIn(pDevice,MESSAGE_TYPE_INIT_RSP,0,0,sizeof(RSP_CARD_INIT), (PBYTE) &(sInitRsp));
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);
437 //Local ID for AES functions
438 ntStatus = CONTROLnsRequestIn(pDevice,
441 MESSAGE_REQUEST_MACREG,
443 &pDevice->byLocalID);
445 if ( ntStatus != STATUS_SUCCESS ) {
446 spin_unlock_irq(&pDevice->lock);
450 // Do MACbSoftwareReset in MACvInitialize
452 pDevice->bCCK = TRUE;
453 pDevice->bProtectMode = FALSE; //Only used in 11g type, sync with ERP IE
454 pDevice->bNonERPPresent = FALSE;
455 pDevice->bBarkerPreambleMd = FALSE;
456 if ( pDevice->bFixRate ) {
457 pDevice->wCurrentRate = (WORD) pDevice->uConnectionRate;
459 if ( pDevice->byBBType == BB_TYPE_11B )
460 pDevice->wCurrentRate = RATE_11M;
462 pDevice->wCurrentRate = RATE_54M;
465 CHvInitChannelTable(pDevice);
467 pDevice->byTopOFDMBasicRate = RATE_24M;
468 pDevice->byTopCCKBasicRate = RATE_1M;
469 pDevice->byRevId = 0; //Target to IF pin while programming to RF chip.
470 pDevice->byCurPwr = 0xFF;
472 pDevice->byCCKPwr = pDevice->abyEEPROM[EEP_OFS_PWR_CCK];
473 pDevice->byOFDMPwrG = pDevice->abyEEPROM[EEP_OFS_PWR_OFDMG];
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;
484 //original zonetype is USA,but customize zonetype is europe,
485 // then need recover 12,13 ,14 channel with 11 channel
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];
495 //{{ RobertYu: 20041124
496 pDevice->byOFDMPwrA = 0x34; // same as RFbMA2829SelectChannel
497 // Load OFDM A Power Table
498 for (ii=0;ii<CB_MAX_CHANNEL_5G;ii++) { //RobertYu:20041224, bug using CB_MAX_CHANNEL
499 pDevice->abyOFDMAPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_OFDMA_PWR_TBL];
500 if (pDevice->abyOFDMAPwrTbl[ii] == 0)
501 pDevice->abyOFDMAPwrTbl[ii] = pDevice->byOFDMPwrA;
505 byAntenna = pDevice->abyEEPROM[EEP_OFS_ANTENNA];
506 if (byAntenna & EEP_ANTINV)
507 pDevice->bTxRxAntInv = TRUE;
509 pDevice->bTxRxAntInv = FALSE;
511 byAntenna &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
513 if (byAntenna == 0) // if not set default is All
514 byAntenna = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
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;
524 pDevice->byRxAntennaMode = ANT_B;
526 if (pDevice->bDiversityRegCtlON)
527 pDevice->bDiversityEnable = TRUE;
529 pDevice->bDiversityEnable = FALSE;
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;
540 pDevice->byRxAntennaMode = ANT_A;
542 pDevice->byTxAntennaMode = ANT_B;
543 if (pDevice->bTxRxAntInv == TRUE)
544 pDevice->byRxAntennaMode = ANT_A;
546 pDevice->byRxAntennaMode = ANT_B;
549 pDevice->ulDiversityNValue = 100*255;
550 pDevice->ulDiversityMValue = 100*16;
552 pDevice->byTMax2 = 4;
553 pDevice->ulSQ3TH = 0;
554 pDevice->byTMax3 = 64;
555 // -----------------------------------------------------------------
557 //Get Auto Fall Back Type
558 pDevice->byAutoFBCtrl = AUTO_FB_0;
561 pDevice->uScanTime = WLAN_SCAN_MINITIME;
564 //pDevice->NetworkType = Ndis802_11Automode;
565 pDevice->eConfigPHYMode = PHY_TYPE_AUTO;
566 pDevice->byBBType = BB_TYPE_11G;
568 // initialize BBP registers
569 pDevice->ulTxPower = 25;
572 pDevice->byMinChannel = 1;
573 pDevice->byMaxChannel = CB_MAX_CHANNEL;
576 pDevice->byRFType = sInitRsp.byRFType;
578 if ((pDevice->byRFType & RF_EMU) != 0) {
579 // force change RevID for VT3253 emu
580 pDevice->byRevId = 0x80;
583 // Load EEPROM calibrated vt3266 parameters
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); // CR255, Set BB to support TX/RX IQ and DC compensation Mode
592 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFB, byCalibTXIQ); // CR251, TX I/Q Imbalance Calibration
593 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFC, byCalibTXDC); // CR252, TX DC-Offset Calibration
594 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFD, byCalibRXIQ); // CR253, RX I/Q Imbalance Calibration
596 // turn off BB Calibration compensation
597 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFF, 0x0); // CR255
601 pMgmt->eScanType = WMAC_SCAN_PASSIVE;
602 pMgmt->uCurrChannel = pDevice->uChannel;
603 pMgmt->uIBSSChannel = pDevice->uChannel;
604 CARDbSetMediaChannel(pDevice, pMgmt->uCurrChannel);
606 // get Permanent network address
607 memcpy(pDevice->abyPermanentNetAddr,&(sInitRsp.byNetAddr[0]),6);
608 memcpy(pDevice->abyCurrentNetAddr,
609 pDevice->abyPermanentNetAddr,
612 // if exist SW network address, use SW network address.
614 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Network address = %02x-%02x-%02x=%02x-%02x-%02x\n",
615 pDevice->abyCurrentNetAddr[0],
616 pDevice->abyCurrentNetAddr[1],
617 pDevice->abyCurrentNetAddr[2],
618 pDevice->abyCurrentNetAddr[3],
619 pDevice->abyCurrentNetAddr[4],
620 pDevice->abyCurrentNetAddr[5]);
625 // Set BB and packet type at the same time.
626 // Set Short Slot Time, xIFS, and RSPINF.
627 if (pDevice->byBBType == BB_TYPE_11A) {
628 CARDbAddBasicRate(pDevice, RATE_6M);
629 pDevice->bShortSlotTime = TRUE;
631 CARDbAddBasicRate(pDevice, RATE_1M);
632 pDevice->bShortSlotTime = FALSE;
634 BBvSetShortSlotTime(pDevice);
635 CARDvSetBSSMode(pDevice);
637 if (pDevice->bUpdateBBVGA) {
638 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
639 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
640 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
643 pDevice->byRadioCtl = pDevice->abyEEPROM[EEP_OFS_RADIOCTL];
644 pDevice->bHWRadioOff = FALSE;
645 if ( (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) != 0 ) {
646 ntStatus = CONTROLnsRequestIn(pDevice,
649 MESSAGE_REQUEST_MACREG,
653 if ( ntStatus != STATUS_SUCCESS ) {
654 spin_unlock_irq(&pDevice->lock);
657 if ( (byTmp & GPIO3_DATA) == 0 ) {
658 pDevice->bHWRadioOff = TRUE;
659 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
661 MACvRegBitsOff(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
662 pDevice->bHWRadioOff = FALSE;
665 } //EEP_RADIOCTL_ENABLE
667 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_TMLEN,0x38);
668 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
669 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL0,0x01);
671 if ((pDevice->bHWRadioOff == TRUE) || (pDevice->bRadioControlOff == TRUE)) {
672 CARDbRadioPowerOff(pDevice);
674 CARDbRadioPowerOn(pDevice);
677 spin_unlock_irq(&pDevice->lock);
678 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"<----INIbInitAdapter Exit\n");
682 static BOOL device_release_WPADEV(PSDevice pDevice)
684 viawget_wpa_header *wpahdr;
686 // wait_queue_head_t Set_wait;
687 //send device close to wpa_supplicnat layer
688 if (pDevice->bWPADEVUp==TRUE) {
689 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
690 wpahdr->type = VIAWGET_DEVICECLOSE_MSG;
691 wpahdr->resp_ie_len = 0;
692 wpahdr->req_ie_len = 0;
693 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
694 pDevice->skb->dev = pDevice->wpadev;
695 skb_reset_mac_header(pDevice->skb);
696 pDevice->skb->pkt_type = PACKET_HOST;
697 pDevice->skb->protocol = htons(ETH_P_802_2);
698 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
699 netif_rx(pDevice->skb);
700 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
702 //wait release WPADEV
703 // init_waitqueue_head(&Set_wait);
704 // wait_event_timeout(Set_wait, ((pDevice->wpadev==NULL)&&(pDevice->skb == NULL)),5*HZ); //1s wait
705 while(pDevice->bWPADEVUp==TRUE) {
706 set_current_state(TASK_UNINTERRUPTIBLE);
707 schedule_timeout (HZ/20); //wait 50ms
716 #ifdef CONFIG_PM /* Minimal support for suspend and resume */
718 static int vt6656_suspend(struct usb_interface *intf, pm_message_t message)
720 PSDevice device = usb_get_intfdata(intf);
722 if (!device || !device->dev)
725 if (device->flags & DEVICE_FLAGS_OPENED)
726 device_close(device->dev);
728 usb_put_dev(interface_to_usbdev(intf));
733 static int vt6656_resume(struct usb_interface *intf)
735 PSDevice device = usb_get_intfdata(intf);
737 if (!device || !device->dev)
740 usb_get_dev(interface_to_usbdev(intf));
742 if (!(device->flags & DEVICE_FLAGS_OPENED))
743 device_open(device->dev);
748 #endif /* CONFIG_PM */
750 static const struct net_device_ops device_netdev_ops = {
751 .ndo_open = device_open,
752 .ndo_stop = device_close,
753 .ndo_do_ioctl = device_ioctl,
754 .ndo_get_stats = device_get_stats,
755 .ndo_start_xmit = device_xmit,
756 .ndo_set_multicast_list = device_set_multi,
760 vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id)
762 u8 fake_mac[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
763 struct usb_device *udev = interface_to_usbdev(intf);
765 struct net_device *netdev = NULL;
766 PSDevice pDevice = NULL;
768 printk(KERN_NOTICE "%s Ver. %s\n", DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
769 printk(KERN_NOTICE "Copyright (c) 2004 VIA Networking Technologies, Inc.\n");
771 udev = usb_get_dev(udev);
772 netdev = alloc_etherdev(sizeof(DEVICE_INFO));
774 printk(KERN_ERR DEVICE_NAME ": allocate net device failed\n");
779 pDevice = netdev_priv(netdev);
780 memset(pDevice, 0, sizeof(DEVICE_INFO));
782 pDevice->dev = netdev;
785 device_set_options(pDevice);
786 spin_lock_init(&pDevice->lock);
788 pDevice->tx_80211 = device_dma0_tx_80211;
789 pDevice->sMgmtObj.pAdapter = (void *) pDevice;
791 netdev->netdev_ops = &device_netdev_ops;
792 netdev->wireless_handlers =
793 (struct iw_handler_def *) &iwctl_handler_def;
795 usb_set_intfdata(intf, pDevice);
796 SET_NETDEV_DEV(netdev, &intf->dev);
797 memcpy(pDevice->dev->dev_addr, fake_mac, ETH_ALEN);
798 rc = register_netdev(netdev);
800 printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
804 usb_device_reset(pDevice);
807 union iwreq_data wrqu;
808 memset(&wrqu, 0, sizeof(wrqu));
809 wrqu.data.flags = RT_INSMOD_EVENT_FLAG;
810 wrqu.data.length = IFNAMSIZ;
811 wireless_send_event(pDevice->dev,
827 static void device_free_tx_bufs(PSDevice pDevice)
829 PUSB_SEND_CONTEXT pTxContext;
832 for (ii = 0; ii < pDevice->cbTD; ii++) {
834 pTxContext = pDevice->apTD[ii];
836 if (pTxContext->pUrb) {
837 usb_kill_urb(pTxContext->pUrb);
838 usb_free_urb(pTxContext->pUrb);
846 static void device_free_rx_bufs(PSDevice pDevice)
851 for (ii = 0; ii < pDevice->cbRD; ii++) {
853 pRCB = pDevice->apRCB[ii];
856 usb_kill_urb(pRCB->pUrb);
857 usb_free_urb(pRCB->pUrb);
861 dev_kfree_skb(pRCB->skb);
863 kfree(pDevice->pRCBMem);
868 static void usb_device_reset(PSDevice pDevice)
871 status = usb_reset_device(pDevice->usb);
873 printk("usb_device_reset fail status=%d\n",status);
877 static void device_free_int_bufs(PSDevice pDevice)
879 kfree(pDevice->intBuf.pDataBuf);
884 static BOOL device_alloc_bufs(PSDevice pDevice) {
886 PUSB_SEND_CONTEXT pTxContext;
891 for (ii = 0; ii < pDevice->cbTD; ii++) {
893 pTxContext = kmalloc(sizeof(USB_SEND_CONTEXT), GFP_KERNEL);
894 if (pTxContext == NULL) {
895 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate tx usb context failed\n", pDevice->dev->name);
898 pDevice->apTD[ii] = pTxContext;
899 pTxContext->pDevice = (void *) pDevice;
901 pTxContext->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
902 if (pTxContext->pUrb == NULL) {
903 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "alloc tx urb failed\n");
906 pTxContext->bBoolInUse = FALSE;
910 pDevice->pRCBMem = kmalloc((sizeof(RCB) * pDevice->cbRD), GFP_KERNEL);
911 if (pDevice->pRCBMem == NULL) {
912 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : alloc rx usb context failed\n", pDevice->dev->name);
917 pDevice->FirstRecvFreeList = NULL;
918 pDevice->LastRecvFreeList = NULL;
919 pDevice->FirstRecvMngList = NULL;
920 pDevice->LastRecvMngList = NULL;
921 pDevice->NumRecvFreeList = 0;
922 memset(pDevice->pRCBMem, 0, (sizeof(RCB) * pDevice->cbRD));
923 pRCB = (PRCB) pDevice->pRCBMem;
925 for (ii = 0; ii < pDevice->cbRD; ii++) {
927 pDevice->apRCB[ii] = pRCB;
928 pRCB->pDevice = (void *) pDevice;
930 pRCB->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
932 if (pRCB->pUrb == NULL) {
933 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx urb\n");
936 pRCB->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
937 if (pRCB->skb == NULL) {
938 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx skb\n");
941 pRCB->skb->dev = pDevice->dev;
942 pRCB->bBoolInUse = FALSE;
943 EnqueueRCB(pDevice->FirstRecvFreeList, pDevice->LastRecvFreeList, pRCB);
944 pDevice->NumRecvFreeList++;
949 pDevice->pControlURB = usb_alloc_urb(0, GFP_ATOMIC);
950 if (pDevice->pControlURB == NULL) {
951 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc control urb\n");
955 pDevice->pInterruptURB = usb_alloc_urb(0, GFP_ATOMIC);
956 if (pDevice->pInterruptURB == NULL) {
957 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int urb\n");
958 usb_kill_urb(pDevice->pControlURB);
959 usb_free_urb(pDevice->pControlURB);
963 pDevice->intBuf.pDataBuf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL);
964 if (pDevice->intBuf.pDataBuf == NULL) {
965 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int buf\n");
966 usb_kill_urb(pDevice->pControlURB);
967 usb_kill_urb(pDevice->pInterruptURB);
968 usb_free_urb(pDevice->pControlURB);
969 usb_free_urb(pDevice->pInterruptURB);
976 device_free_rx_bufs(pDevice);
979 device_free_tx_bufs(pDevice);
987 static BOOL device_init_defrag_cb(PSDevice pDevice) {
989 PSDeFragControlBlock pDeF;
991 /* Init the fragment ctl entries */
992 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
993 pDeF = &(pDevice->sRxDFCB[i]);
994 if (!device_alloc_frag_buf(pDevice, pDeF)) {
995 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
1000 pDevice->cbDFCB = CB_MAX_RX_FRAG;
1001 pDevice->cbFreeDFCB = pDevice->cbDFCB;
1005 device_free_frag_bufs(pDevice);
1011 static void device_free_frag_bufs(PSDevice pDevice) {
1012 PSDeFragControlBlock pDeF;
1015 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1017 pDeF = &(pDevice->sRxDFCB[i]);
1020 dev_kfree_skb(pDeF->skb);
1026 BOOL device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {
1028 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1029 if (pDeF->skb == NULL)
1032 pDeF->skb->dev = pDevice->dev;
1038 /*-----------------------------------------------------------------*/
1040 static int device_open(struct net_device *dev) {
1041 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1043 extern SWPAResult wpa_Result;
1044 memset(wpa_Result.ifname,0,sizeof(wpa_Result.ifname));
1045 wpa_Result.proto = 0;
1046 wpa_Result.key_mgmt = 0;
1047 wpa_Result.eap_type = 0;
1048 wpa_Result.authenticated = FALSE;
1049 pDevice->fWPA_Authened = FALSE;
1051 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_open...\n");
1054 pDevice->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS;
1056 if (device_alloc_bufs(pDevice) == FALSE) {
1057 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_alloc_bufs fail... \n");
1061 if (device_init_defrag_cb(pDevice)== FALSE) {
1062 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Initial defragement cb fail \n");
1066 MP_CLEAR_FLAG(pDevice, fMP_DISCONNECTED);
1067 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
1068 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
1069 MP_SET_FLAG(pDevice, fMP_POST_READS);
1070 MP_SET_FLAG(pDevice, fMP_POST_WRITES);
1073 Read_config_file(pDevice);
1075 if (device_init_registers(pDevice, DEVICE_INIT_COLD) == FALSE) {
1076 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " init register fail\n");
1080 device_set_multi(pDevice->dev);
1081 // Init for Key Management
1083 KeyvInitTable(pDevice,&pDevice->sKey);
1084 memcpy(pDevice->sMgmtObj.abyMACAddr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1085 memcpy(pDevice->dev->dev_addr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1086 pDevice->bStopTx0Pkt = FALSE;
1087 pDevice->bStopDataPkt = FALSE;
1088 pDevice->bRoaming = FALSE;
1089 pDevice->bIsRoaming = FALSE;
1090 pDevice->bEnableRoaming = FALSE;
1091 if (pDevice->bDiversityRegCtlON) {
1092 device_init_diversity_timer(pDevice);
1095 vMgrObjectInit(pDevice);
1096 tasklet_init(&pDevice->RxMngWorkItem, (void *)RXvMngWorkItem, (unsigned long)pDevice);
1097 tasklet_init(&pDevice->ReadWorkItem, (void *)RXvWorkItem, (unsigned long)pDevice);
1098 tasklet_init(&pDevice->EventWorkItem, (void *)INTvWorkItem, (unsigned long)pDevice);
1099 add_timer(&(pDevice->sMgmtObj.sTimerSecondCallback));
1100 pDevice->int_interval = 100; //Max 100 microframes.
1101 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1103 pDevice->bIsRxWorkItemQueued = TRUE;
1104 pDevice->fKillEventPollingThread = FALSE;
1105 pDevice->bEventAvailable = FALSE;
1107 pDevice->bWPADEVUp = FALSE;
1108 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1109 pDevice->bwextstep0 = FALSE;
1110 pDevice->bwextstep1 = FALSE;
1111 pDevice->bwextstep2 = FALSE;
1112 pDevice->bwextstep3 = FALSE;
1113 pDevice->bWPASuppWextEnabled = FALSE;
1115 pDevice->byReAssocCount = 0;
1117 RXvWorkItem(pDevice);
1118 INTvWorkItem(pDevice);
1120 // Patch: if WEP key already set by iwconfig but device not yet open
1121 if ((pDevice->bEncryptionEnable == TRUE) && (pDevice->bTransmitKey == TRUE)) {
1122 spin_lock_irq(&pDevice->lock);
1123 KeybSetDefaultKey( pDevice,
1125 pDevice->byKeyIndex | (1 << 31),
1126 pDevice->uKeyLength,
1131 spin_unlock_irq(&pDevice->lock);
1132 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1135 if (pDevice->sMgmtObj.eConfigMode == WMAC_CONFIG_AP) {
1136 bScheduleCommand((void *) pDevice, WLAN_CMD_RUN_AP, NULL);
1139 //mike:mark@2008-11-10
1140 bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1141 /* bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL); */
1145 netif_stop_queue(pDevice->dev);
1146 pDevice->flags |= DEVICE_FLAGS_OPENED;
1149 union iwreq_data wrqu;
1150 memset(&wrqu, 0, sizeof(wrqu));
1151 wrqu.data.flags = RT_UPDEV_EVENT_FLAG;
1152 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1155 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
1159 device_free_frag_bufs(pDevice);
1161 device_free_rx_bufs(pDevice);
1162 device_free_tx_bufs(pDevice);
1163 device_free_int_bufs(pDevice);
1164 usb_kill_urb(pDevice->pControlURB);
1165 usb_kill_urb(pDevice->pInterruptURB);
1166 usb_free_urb(pDevice->pControlURB);
1167 usb_free_urb(pDevice->pInterruptURB);
1169 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open fail.. \n");
1175 static int device_close(struct net_device *dev) {
1176 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1177 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1181 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close1 \n");
1182 if (pDevice == NULL)
1186 union iwreq_data wrqu;
1187 memset(&wrqu, 0, sizeof(wrqu));
1188 wrqu.data.flags = RT_DOWNDEV_EVENT_FLAG;
1189 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1192 if (pDevice->bLinkPass) {
1193 bScheduleCommand((void *) pDevice, WLAN_CMD_DISASSOCIATE, NULL);
1197 device_release_WPADEV(pDevice);
1199 memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
1200 pMgmt->bShareKeyAlgorithm = FALSE;
1201 pDevice->bEncryptionEnable = FALSE;
1202 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1203 spin_lock_irq(&pDevice->lock);
1204 for (uu = 0; uu < MAX_KEY_TABLE; uu++)
1205 MACvDisableKeyEntry(pDevice,uu);
1206 spin_unlock_irq(&pDevice->lock);
1208 if ((pDevice->flags & DEVICE_FLAGS_UNPLUG) == FALSE) {
1209 MACbShutdown(pDevice);
1211 netif_stop_queue(pDevice->dev);
1212 MP_SET_FLAG(pDevice, fMP_DISCONNECTED);
1213 MP_CLEAR_FLAG(pDevice, fMP_POST_WRITES);
1214 MP_CLEAR_FLAG(pDevice, fMP_POST_READS);
1215 pDevice->fKillEventPollingThread = TRUE;
1216 del_timer(&pDevice->sTimerCommand);
1217 del_timer(&pMgmt->sTimerSecondCallback);
1219 del_timer(&pDevice->sTimerTxData);
1221 if (pDevice->bDiversityRegCtlON) {
1222 del_timer(&pDevice->TimerSQ3Tmax1);
1223 del_timer(&pDevice->TimerSQ3Tmax2);
1224 del_timer(&pDevice->TimerSQ3Tmax3);
1226 tasklet_kill(&pDevice->RxMngWorkItem);
1227 tasklet_kill(&pDevice->ReadWorkItem);
1228 tasklet_kill(&pDevice->EventWorkItem);
1230 pDevice->bRoaming = FALSE;
1231 pDevice->bIsRoaming = FALSE;
1232 pDevice->bEnableRoaming = FALSE;
1233 pDevice->bCmdRunning = FALSE;
1234 pDevice->bLinkPass = FALSE;
1235 memset(pMgmt->abyCurrBSSID, 0, 6);
1236 pMgmt->eCurrState = WMAC_STATE_IDLE;
1238 device_free_tx_bufs(pDevice);
1239 device_free_rx_bufs(pDevice);
1240 device_free_int_bufs(pDevice);
1241 device_free_frag_bufs(pDevice);
1243 usb_kill_urb(pDevice->pControlURB);
1244 usb_kill_urb(pDevice->pInterruptURB);
1245 usb_free_urb(pDevice->pControlURB);
1246 usb_free_urb(pDevice->pInterruptURB);
1248 BSSvClearNodeDBTable(pDevice, 0);
1249 pDevice->flags &=(~DEVICE_FLAGS_OPENED);
1251 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n");
1256 static void __devexit vt6656_disconnect(struct usb_interface *intf)
1258 PSDevice device = usb_get_intfdata(intf);
1264 union iwreq_data req;
1265 memset(&req, 0, sizeof(req));
1266 req.data.flags = RT_RMMOD_EVENT_FLAG;
1267 wireless_send_event(device->dev, IWEVCUSTOM, &req, NULL);
1270 device_release_WPADEV(device);
1272 if (device->firmware)
1273 release_firmware(device->firmware);
1275 usb_set_intfdata(intf, NULL);
1276 usb_put_dev(interface_to_usbdev(intf));
1278 device->flags |= DEVICE_FLAGS_UNPLUG;
1281 unregister_netdev(device->dev);
1282 wpa_set_wpadev(device, 0);
1283 free_netdev(device->dev);
1287 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev)
1289 PSDevice pDevice = netdev_priv(dev);
1291 spin_lock_irq(&pDevice->lock);
1293 if (unlikely(pDevice->bStopTx0Pkt))
1294 dev_kfree_skb_irq(skb);
1296 vDMA0_tx_80211(pDevice, skb);
1298 spin_unlock_irq(&pDevice->lock);
1300 return NETDEV_TX_OK;
1303 static int device_xmit(struct sk_buff *skb, struct net_device *dev)
1305 PSDevice pDevice = netdev_priv(dev);
1306 struct net_device_stats *stats = &pDevice->stats;
1308 spin_lock_irq(&pDevice->lock);
1310 netif_stop_queue(dev);
1312 if (!pDevice->bLinkPass) {
1313 dev_kfree_skb_irq(skb);
1317 if (pDevice->bStopDataPkt) {
1318 dev_kfree_skb_irq(skb);
1319 stats->tx_dropped++;
1323 if (nsDMA_tx_packet(pDevice, TYPE_AC0DMA, skb)) {
1324 if (netif_queue_stopped(dev))
1325 netif_wake_queue(dev);
1329 spin_unlock_irq(&pDevice->lock);
1331 return NETDEV_TX_OK;
1334 static unsigned const ethernet_polynomial = 0x04c11db7U;
1335 static inline u32 ether_crc(int length, unsigned char *data)
1339 while(--length >= 0) {
1340 unsigned char current_octet = *data++;
1342 for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
1344 ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
1350 //find out the start position of str2 from str1
1351 static unsigned char *kstrstr(const unsigned char *str1,
1352 const unsigned char *str2) {
1353 int str1_len = strlen(str1);
1354 int str2_len = strlen(str2);
1356 while (str1_len >= str2_len) {
1358 if(memcmp(str1,str2,str2_len)==0)
1359 return (unsigned char *) str1;
1365 static int Config_FileGetParameter(unsigned char *string,
1366 unsigned char *dest,
1367 unsigned char *source)
1369 unsigned char buf1[100];
1370 unsigned char buf2[100];
1371 unsigned char *start_p = NULL, *end_p = NULL, *tmp_p = NULL;
1375 strcat(buf1, string);
1377 source+=strlen(buf1);
1379 //find target string start point
1380 start_p = kstrstr(source,buf1);
1381 if (start_p == NULL)
1384 //check if current config line is marked by "#" ??
1385 for (ii = 1; ; ii++) {
1386 if (memcmp(start_p - ii, "\n", 1) == 0)
1388 if (memcmp(start_p - ii, "#", 1) == 0)
1392 //find target string end point
1393 end_p = kstrstr(start_p,"\n");
1394 if (end_p == NULL) { //can't find "\n",but don't care
1395 end_p=start_p+strlen(start_p); //no include "\n"
1399 memcpy(buf2,start_p,end_p-start_p); //get the tartget line
1400 buf2[end_p-start_p]='\0';
1403 start_p = kstrstr(buf2,"=");
1404 if (start_p == NULL)
1407 strcpy(buf1,start_p+1);
1411 while(*tmp_p != 0x00) {
1418 memcpy(dest,tmp_p,strlen(tmp_p));
1422 //if read fail,return NULL,or return data pointer;
1423 static unsigned char *Config_FileOperation(PSDevice pDevice)
1425 unsigned char *config_path = CONFIG_PATH;
1426 unsigned char *buffer = NULL;
1427 struct file *filp=NULL;
1428 mm_segment_t old_fs = get_fs();
1429 //int oldfsuid=0,oldfsgid=0;
1433 /* Can't do this anymore, so we rely on correct filesystem permissions:
1434 //Make sure a caller can read or write power as root
1435 oldfsuid=current->fsuid;
1436 oldfsgid=current->fsgid;
1442 filp = filp_open(config_path, O_RDWR, 0);
1444 printk("Config_FileOperation file Not exist\n");
1449 if(!(filp->f_op) || !(filp->f_op->read) ||!(filp->f_op->write)) {
1450 printk("file %s cann't readable or writable?\n",config_path);
1455 buffer = kmalloc(1024, GFP_KERNEL);
1457 printk("allocate mem for file fail?\n");
1462 if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
1463 printk("read file error?\n");
1468 if(filp_close(filp,NULL))
1469 printk("Config_FileOperation:close file fail\n");
1475 current->fsuid=oldfsuid;
1476 current->fsgid=oldfsgid;
1486 //return --->-1:fail; >=0:successful
1487 static int Read_config_file(PSDevice pDevice) {
1489 unsigned char tmpbuffer[100];
1490 unsigned char *buffer = NULL;
1492 //init config setting
1493 pDevice->config_file.ZoneType = -1;
1494 pDevice->config_file.eAuthenMode = -1;
1495 pDevice->config_file.eEncryptionStatus = -1;
1497 buffer = Config_FileOperation(pDevice);
1498 if (buffer == NULL) {
1505 memset(tmpbuffer,0,sizeof(tmpbuffer));
1506 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer) ==TRUE) {
1507 if(memcmp(tmpbuffer,"USA",3)==0) {
1508 pDevice->config_file.ZoneType=ZoneType_USA;
1510 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
1511 pDevice->config_file.ZoneType=ZoneType_Japan;
1513 else if(memcmp(tmpbuffer,"EUROPE",6)==0) {
1514 pDevice->config_file.ZoneType=ZoneType_Europe;
1517 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
1522 //get other parameter
1524 memset(tmpbuffer,0,sizeof(tmpbuffer));
1525 if(Config_FileGetParameter("AUTHENMODE",tmpbuffer,buffer)==TRUE) {
1526 pDevice->config_file.eAuthenMode = (int) simple_strtol(tmpbuffer, NULL, 10);
1529 memset(tmpbuffer,0,sizeof(tmpbuffer));
1530 if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer,buffer)==TRUE) {
1531 pDevice->config_file.eEncryptionStatus= (int) simple_strtol(tmpbuffer, NULL, 10);
1539 static void device_set_multi(struct net_device *dev) {
1540 PSDevice pDevice = (PSDevice) netdev_priv(dev);
1541 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1544 struct netdev_hw_addr *ha;
1545 BYTE pbyData[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
1550 spin_lock_irq(&pDevice->lock);
1551 rc = CONTROLnsRequestIn(pDevice,
1554 MESSAGE_REQUEST_MACREG,
1558 if (rc == 0) pDevice->byRxMode = byTmpMode;
1560 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode in= %x\n", pDevice->byRxMode);
1562 if (dev->flags & IFF_PROMISC) { // Set promiscuous.
1563 DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
1564 // Unconditionally log net taps.
1565 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
1567 else if ((netdev_mc_count(dev) > pDevice->multicast_limit) ||
1568 (dev->flags & IFF_ALLMULTI)) {
1569 CONTROLnsRequestOut(pDevice,
1572 MESSAGE_REQUEST_MACREG,
1576 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1579 memset(mc_filter, 0, sizeof(mc_filter));
1580 netdev_for_each_mc_addr(ha, dev) {
1581 int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
1582 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
1584 for (ii = 0; ii < 4; ii++) {
1585 MACvWriteMultiAddr(pDevice, ii, *((PBYTE)&mc_filter[0] + ii));
1586 MACvWriteMultiAddr(pDevice, ii+ 4, *((PBYTE)&mc_filter[1] + ii));
1588 pDevice->byRxMode &= ~(RCR_UNICAST);
1589 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1592 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1593 // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
1594 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1595 pDevice->byRxMode &= ~(RCR_UNICAST);
1597 ControlvWriteByte(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_RCR, pDevice->byRxMode);
1598 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode out= %x\n", pDevice->byRxMode);
1599 spin_unlock_irq(&pDevice->lock);
1604 static struct net_device_stats *device_get_stats(struct net_device *dev) {
1605 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1607 return &pDevice->stats;
1611 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
1612 PSDevice pDevice = (PSDevice)netdev_priv(dev);
1613 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1615 //BOOL bCommit = FALSE;
1616 struct iwreq *wrq = (struct iwreq *) rq;
1619 if (pMgmt == NULL) {
1627 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
1634 case SIOCGIWNWID: //0x8b03 support
1635 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1636 rc = iwctl_giwnwid(dev, NULL, &(wrq->u.nwid), NULL);
1642 // Set frequency/channel
1644 rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
1647 // Get frequency/channel
1649 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
1652 // Set desired network name (ESSID)
1656 char essid[IW_ESSID_MAX_SIZE+1];
1657 if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
1661 if (copy_from_user(essid, wrq->u.essid.pointer,
1662 wrq->u.essid.length)) {
1666 rc = iwctl_siwessid(dev, NULL,
1667 &(wrq->u.essid), essid);
1672 // Get current network name (ESSID)
1676 char essid[IW_ESSID_MAX_SIZE+1];
1677 if (wrq->u.essid.pointer) {
1678 rc = iwctl_giwessid(dev, NULL,
1679 &(wrq->u.essid), essid);
1680 if (copy_to_user(wrq->u.essid.pointer,
1682 wrq->u.essid.length) )
1690 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1694 // Get current Access Point (BSSID)
1696 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1700 // Set desired station name
1702 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
1706 // Get current station name
1708 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
1712 // Set the desired bit-rate
1714 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1717 // Get the current bit-rate
1720 rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1723 // Set the desired RTS threshold
1726 rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
1729 // Get the current RTS threshold
1732 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
1735 // Set the desired fragmentation threshold
1738 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
1741 // Get the current fragmentation threshold
1744 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
1747 // Set mode of operation
1749 rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
1752 // Get mode of operation
1754 rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
1757 // Set WEP keys and mode
1760 char abyKey[WLAN_WEP232_KEYLEN];
1762 if (wrq->u.encoding.pointer) {
1765 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
1769 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
1770 if (copy_from_user(abyKey,
1771 wrq->u.encoding.pointer,
1772 wrq->u.encoding.length)) {
1776 } else if (wrq->u.encoding.length != 0) {
1780 rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
1784 // Get the WEP keys and mode
1787 if (!capable(CAP_NET_ADMIN)) {
1792 char abyKey[WLAN_WEP232_KEYLEN];
1794 rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
1796 if (wrq->u.encoding.pointer) {
1797 if (copy_to_user(wrq->u.encoding.pointer,
1799 wrq->u.encoding.length))
1805 // Get the current Tx-Power
1807 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
1812 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
1818 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
1823 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
1826 // Get range of parameters
1830 struct iw_range range;
1832 rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *) &range);
1833 if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
1841 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
1847 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
1853 rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
1857 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
1863 char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
1865 if (wrq->u.data.pointer) {
1866 rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
1868 if (copy_to_user(wrq->u.data.pointer,
1870 (wrq->u.data.length * (sizeof(struct sockaddr) + sizeof(struct iw_quality)))
1883 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
1890 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
1894 #endif // WIRELESS_SPY
1897 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
1900 if(wrq->u.data.pointer) {
1901 wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
1903 if(copy_to_user(wrq->u.data.pointer,
1904 (u_char *) iwctl_private_args,
1905 sizeof(iwctl_private_args)))
1911 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1913 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH\n");
1914 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
1918 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
1919 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
1923 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
1924 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1928 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
1929 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1932 case SIOCSIWENCODEEXT:
1934 char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
1935 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
1936 if(wrq->u.encoding.pointer){
1937 memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1);
1938 if(wrq->u.encoding.length > (sizeof(struct iw_encode_ext)+ MAX_KEY_LEN)){
1942 if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
1946 }else if(wrq->u.encoding.length != 0){
1950 rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
1954 case SIOCGIWENCODEEXT:
1955 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
1956 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
1960 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
1961 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1964 #endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1966 case IOCTL_CMD_TEST:
1968 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
1974 pReq = (PSCmdRequest)rq;
1976 //20080130-01,<Remark> by Mike Liu
1977 // if(pDevice->bLinkPass==TRUE)
1978 pReq->wResult = MAGIC_CODE; //Linking status:0x3142
1979 //20080130-02,<Remark> by Mike Liu
1981 // pReq->wResult = MAGIC_CODE+1; //disconnect status:0x3143
1985 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
1986 (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
1994 if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
1997 rc = private_ioctl(pDevice, rq);
1998 clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
2001 case IOCTL_CMD_HOSTAPD:
2003 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2010 rc = vt6656_hostap_ioctl(pDevice, &wrq->u.data);
2015 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2022 rc = wpa_ioctl(pDevice, &wrq->u.data);
2026 return ethtool_ioctl(dev, (void *) rq->ifr_data);
2027 // All other calls are currently unsupported
2031 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
2036 if (pDevice->bCommit) {
2037 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2038 netif_stop_queue(pDevice->dev);
2039 spin_lock_irq(&pDevice->lock);
2040 bScheduleCommand((void *) pDevice, WLAN_CMD_RUN_AP, NULL);
2041 spin_unlock_irq(&pDevice->lock);
2044 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
2045 spin_lock_irq(&pDevice->lock);
2046 //2007-1121-01<Modify>by EinsnLiu
2047 if (pDevice->bLinkPass &&
2048 memcmp(pMgmt->abyCurrSSID,pMgmt->abyDesireSSID,WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN)) {
2049 bScheduleCommand((void *) pDevice, WLAN_CMD_DISASSOCIATE, NULL);
2051 pDevice->bLinkPass = FALSE;
2052 pMgmt->eCurrState = WMAC_STATE_IDLE;
2053 memset(pMgmt->abyCurrBSSID, 0, 6);
2055 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
2057 netif_stop_queue(pDevice->dev);
2058 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2059 pMgmt->eScanType = WMAC_SCAN_ACTIVE;
2060 if (!pDevice->bWPASuppWextEnabled)
2062 bScheduleCommand((void *) pDevice,
2063 WLAN_CMD_BSSID_SCAN,
2064 pMgmt->abyDesireSSID);
2065 bScheduleCommand((void *) pDevice,
2068 spin_unlock_irq(&pDevice->lock);
2070 pDevice->bCommit = FALSE;
2078 static int ethtool_ioctl(struct net_device *dev, void *useraddr)
2082 if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd)))
2086 case ETHTOOL_GDRVINFO: {
2087 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
2088 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
2089 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
2090 if (copy_to_user(useraddr, &info, sizeof(info)))
2101 /*------------------------------------------------------------------*/
2103 MODULE_DEVICE_TABLE(usb, vt6656_table);
2105 static struct usb_driver vt6656_driver = {
2106 .name = DEVICE_NAME,
2107 .probe = vt6656_probe,
2108 .disconnect = vt6656_disconnect,
2109 .id_table = vt6656_table,
2111 .suspend = vt6656_suspend,
2112 .resume = vt6656_resume,
2113 #endif /* CONFIG_PM */
2116 static int __init vt6656_init_module(void)
2118 printk(KERN_NOTICE DEVICE_FULL_DRV_NAM " " DEVICE_VERSION);
2119 return usb_register(&vt6656_driver);
2122 static void __exit vt6656_cleanup_module(void)
2124 usb_deregister(&vt6656_driver);
2127 module_init(vt6656_init_module);
2128 module_exit(vt6656_cleanup_module);