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 //2008-0714<Add>by Mike Liu
286 static BOOL device_release_WPADEV(PSDevice pDevice);
288 static void usb_device_reset(PSDevice pDevice);
292 /*--------------------- Export Variables --------------------------*/
294 /*--------------------- Export Functions --------------------------*/
298 device_set_options(PSDevice pDevice) {
300 BYTE abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
301 BYTE abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
302 u8 abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
304 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
305 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
306 memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, ETH_ALEN);
308 pDevice->cbTD = TX_DESC_DEF0;
309 pDevice->cbRD = RX_DESC_DEF0;
310 pDevice->uChannel = CHANNEL_DEF;
311 pDevice->wRTSThreshold = RTS_THRESH_DEF;
312 pDevice->wFragmentationThreshold = FRAG_THRESH_DEF;
313 pDevice->byShortRetryLimit = SHORT_RETRY_DEF;
314 pDevice->byLongRetryLimit = LONG_RETRY_DEF;
315 pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME;
316 pDevice->byShortPreamble = PREAMBLE_TYPE_DEF;
317 pDevice->ePSMode = PS_MODE_DEF;
318 pDevice->b11hEnable = X80211h_MODE_DEF;
319 pDevice->eOPMode = OP_MODE_DEF;
320 pDevice->uConnectionRate = DATA_RATE_DEF;
321 if (pDevice->uConnectionRate < RATE_AUTO) pDevice->bFixRate = TRUE;
322 pDevice->byBBType = BBP_TYPE_DEF;
323 pDevice->byPacketType = pDevice->byBBType;
324 pDevice->byAutoFBCtrl = AUTO_FB_0;
325 pDevice->bUpdateBBVGA = TRUE;
326 pDevice->byFOETuning = 0;
327 pDevice->byAutoPwrTunning = 0;
328 pDevice->wCTSDuration = 0;
329 pDevice->byPreambleType = 0;
330 pDevice->bExistSWNetAddr = FALSE;
331 // pDevice->bDiversityRegCtlON = TRUE;
332 pDevice->bDiversityRegCtlON = FALSE;
336 static void device_init_diversity_timer(PSDevice pDevice)
338 init_timer(&pDevice->TimerSQ3Tmax1);
339 pDevice->TimerSQ3Tmax1.data = (unsigned long)pDevice;
340 pDevice->TimerSQ3Tmax1.function = (TimerFunction)TimerSQ3CallBack;
341 pDevice->TimerSQ3Tmax1.expires = RUN_AT(HZ);
343 init_timer(&pDevice->TimerSQ3Tmax2);
344 pDevice->TimerSQ3Tmax2.data = (unsigned long)pDevice;
345 pDevice->TimerSQ3Tmax2.function = (TimerFunction)TimerSQ3CallBack;
346 pDevice->TimerSQ3Tmax2.expires = RUN_AT(HZ);
348 init_timer(&pDevice->TimerSQ3Tmax3);
349 pDevice->TimerSQ3Tmax3.data = (unsigned long)pDevice;
350 pDevice->TimerSQ3Tmax3.function = (TimerFunction)TimerSQ3Tmax3CallBack;
351 pDevice->TimerSQ3Tmax3.expires = RUN_AT(HZ);
358 // Initialiation of MAC & BBP registers
361 static BOOL device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType)
363 u8 abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
364 u8 abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
365 u8 abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
368 CMD_CARD_INIT sInitCmd;
369 NTSTATUS ntStatus = STATUS_SUCCESS;
370 RSP_CARD_INIT sInitRsp;
371 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
373 BYTE byCalibTXIQ = 0;
374 BYTE byCalibTXDC = 0;
375 BYTE byCalibRXIQ = 0;
377 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "---->INIbInitAdapter. [%d][%d]\n", InitType, pDevice->byPacketType);
378 spin_lock_irq(&pDevice->lock);
379 if (InitType == DEVICE_INIT_COLD) {
380 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
381 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
382 memcpy(pDevice->abySNAP_Bridgetunnel,
383 abySNAP_Bridgetunnel,
386 if ( !FIRMWAREbCheckVersion(pDevice) ) {
387 if (FIRMWAREbDownload(pDevice) == TRUE) {
388 if (FIRMWAREbBrach2Sram(pDevice) == FALSE) {
389 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbBrach2Sram fail \n");
390 spin_unlock_irq(&pDevice->lock);
395 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbDownload fail \n");
396 spin_unlock_irq(&pDevice->lock);
401 if ( !BBbVT3184Init(pDevice) ) {
402 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" BBbVT3184Init fail \n");
403 spin_unlock_irq(&pDevice->lock);
408 sInitCmd.byInitClass = (BYTE)InitType;
409 sInitCmd.bExistSWNetAddr = (BYTE) pDevice->bExistSWNetAddr;
410 for (ii = 0; ii < 6; ii++)
411 sInitCmd.bySWNetAddr[ii] = pDevice->abyCurrentNetAddr[ii];
412 sInitCmd.byShortRetryLimit = pDevice->byShortRetryLimit;
413 sInitCmd.byLongRetryLimit = pDevice->byLongRetryLimit;
415 //issue Card_init command to device
416 ntStatus = CONTROLnsRequestOut(pDevice,
417 MESSAGE_TYPE_CARDINIT,
420 sizeof(CMD_CARD_INIT),
421 (PBYTE) &(sInitCmd));
423 if ( ntStatus != STATUS_SUCCESS ) {
424 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Issue Card init fail \n");
425 spin_unlock_irq(&pDevice->lock);
428 if (InitType == DEVICE_INIT_COLD) {
430 ntStatus = CONTROLnsRequestIn(pDevice,MESSAGE_TYPE_INIT_RSP,0,0,sizeof(RSP_CARD_INIT), (PBYTE) &(sInitRsp));
432 if (ntStatus != STATUS_SUCCESS) {
433 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Cardinit request in status fail!\n");
434 spin_unlock_irq(&pDevice->lock);
438 //Local ID for AES functions
439 ntStatus = CONTROLnsRequestIn(pDevice,
442 MESSAGE_REQUEST_MACREG,
444 &pDevice->byLocalID);
446 if ( ntStatus != STATUS_SUCCESS ) {
447 spin_unlock_irq(&pDevice->lock);
451 // Do MACbSoftwareReset in MACvInitialize
453 pDevice->bCCK = TRUE;
454 pDevice->bProtectMode = FALSE; //Only used in 11g type, sync with ERP IE
455 pDevice->bNonERPPresent = FALSE;
456 pDevice->bBarkerPreambleMd = FALSE;
457 if ( pDevice->bFixRate ) {
458 pDevice->wCurrentRate = (WORD) pDevice->uConnectionRate;
460 if ( pDevice->byBBType == BB_TYPE_11B )
461 pDevice->wCurrentRate = RATE_11M;
463 pDevice->wCurrentRate = RATE_54M;
466 CHvInitChannelTable(pDevice);
468 pDevice->byTopOFDMBasicRate = RATE_24M;
469 pDevice->byTopCCKBasicRate = RATE_1M;
470 pDevice->byRevId = 0; //Target to IF pin while programming to RF chip.
471 pDevice->byCurPwr = 0xFF;
473 pDevice->byCCKPwr = pDevice->abyEEPROM[EEP_OFS_PWR_CCK];
474 pDevice->byOFDMPwrG = pDevice->abyEEPROM[EEP_OFS_PWR_OFDMG];
476 for (ii=0;ii<14;ii++) {
477 pDevice->abyCCKPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_CCK_PWR_TBL];
478 if (pDevice->abyCCKPwrTbl[ii] == 0)
479 pDevice->abyCCKPwrTbl[ii] = pDevice->byCCKPwr;
480 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_OFDM_PWR_TBL];
481 if (pDevice->abyOFDMPwrTbl[ii] == 0)
482 pDevice->abyOFDMPwrTbl[ii] = pDevice->byOFDMPwrG;
485 //original zonetype is USA,but customize zonetype is europe,
486 // then need recover 12,13 ,14 channel with 11 channel
487 if(((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) ||
488 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe))&&
489 (pDevice->byOriginalZonetype == ZoneType_USA)) {
490 for (ii = 11; ii < 14; ii++) {
491 pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
492 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];
496 //{{ RobertYu: 20041124
497 pDevice->byOFDMPwrA = 0x34; // same as RFbMA2829SelectChannel
498 // Load OFDM A Power Table
499 for (ii=0;ii<CB_MAX_CHANNEL_5G;ii++) { //RobertYu:20041224, bug using CB_MAX_CHANNEL
500 pDevice->abyOFDMAPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_OFDMA_PWR_TBL];
501 if (pDevice->abyOFDMAPwrTbl[ii] == 0)
502 pDevice->abyOFDMAPwrTbl[ii] = pDevice->byOFDMPwrA;
506 byAntenna = pDevice->abyEEPROM[EEP_OFS_ANTENNA];
507 if (byAntenna & EEP_ANTINV)
508 pDevice->bTxRxAntInv = TRUE;
510 pDevice->bTxRxAntInv = FALSE;
512 byAntenna &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
514 if (byAntenna == 0) // if not set default is All
515 byAntenna = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
517 if (byAntenna == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
518 pDevice->byAntennaCount = 2;
519 pDevice->byTxAntennaMode = ANT_B;
520 pDevice->dwTxAntennaSel = 1;
521 pDevice->dwRxAntennaSel = 1;
522 if (pDevice->bTxRxAntInv == TRUE)
523 pDevice->byRxAntennaMode = ANT_A;
525 pDevice->byRxAntennaMode = ANT_B;
527 if (pDevice->bDiversityRegCtlON)
528 pDevice->bDiversityEnable = TRUE;
530 pDevice->bDiversityEnable = FALSE;
532 pDevice->bDiversityEnable = FALSE;
533 pDevice->byAntennaCount = 1;
534 pDevice->dwTxAntennaSel = 0;
535 pDevice->dwRxAntennaSel = 0;
536 if (byAntenna & EEP_ANTENNA_AUX) {
537 pDevice->byTxAntennaMode = ANT_A;
538 if (pDevice->bTxRxAntInv == TRUE)
539 pDevice->byRxAntennaMode = ANT_B;
541 pDevice->byRxAntennaMode = ANT_A;
543 pDevice->byTxAntennaMode = ANT_B;
544 if (pDevice->bTxRxAntInv == TRUE)
545 pDevice->byRxAntennaMode = ANT_A;
547 pDevice->byRxAntennaMode = ANT_B;
550 pDevice->ulDiversityNValue = 100*255;
551 pDevice->ulDiversityMValue = 100*16;
553 pDevice->byTMax2 = 4;
554 pDevice->ulSQ3TH = 0;
555 pDevice->byTMax3 = 64;
556 // -----------------------------------------------------------------
558 //Get Auto Fall Back Type
559 pDevice->byAutoFBCtrl = AUTO_FB_0;
562 pDevice->uScanTime = WLAN_SCAN_MINITIME;
565 //pDevice->NetworkType = Ndis802_11Automode;
566 pDevice->eConfigPHYMode = PHY_TYPE_AUTO;
567 pDevice->byBBType = BB_TYPE_11G;
569 // initialize BBP registers
570 pDevice->ulTxPower = 25;
573 pDevice->byMinChannel = 1;
574 pDevice->byMaxChannel = CB_MAX_CHANNEL;
577 pDevice->byRFType = sInitRsp.byRFType;
579 if ((pDevice->byRFType & RF_EMU) != 0) {
580 // force change RevID for VT3253 emu
581 pDevice->byRevId = 0x80;
584 // Load EEPROM calibrated vt3266 parameters
585 if (pDevice->byRFType == RF_VT3226D0) {
586 if((pDevice->abyEEPROM[EEP_OFS_MAJOR_VER] == 0x1) &&
587 (pDevice->abyEEPROM[EEP_OFS_MINOR_VER] >= 0x4)) {
588 byCalibTXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_IQ];
589 byCalibTXDC = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_DC];
590 byCalibRXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_RX_IQ];
591 if( (byCalibTXIQ || byCalibTXDC || byCalibRXIQ) ) {
592 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFF, 0x03); // CR255, Set BB to support TX/RX IQ and DC compensation Mode
593 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFB, byCalibTXIQ); // CR251, TX I/Q Imbalance Calibration
594 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFC, byCalibTXDC); // CR252, TX DC-Offset Calibration
595 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFD, byCalibRXIQ); // CR253, RX I/Q Imbalance Calibration
597 // turn off BB Calibration compensation
598 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFF, 0x0); // CR255
602 pMgmt->eScanType = WMAC_SCAN_PASSIVE;
603 pMgmt->uCurrChannel = pDevice->uChannel;
604 pMgmt->uIBSSChannel = pDevice->uChannel;
605 CARDbSetMediaChannel(pDevice, pMgmt->uCurrChannel);
607 // get Permanent network address
608 memcpy(pDevice->abyPermanentNetAddr,&(sInitRsp.byNetAddr[0]),6);
609 memcpy(pDevice->abyCurrentNetAddr,
610 pDevice->abyPermanentNetAddr,
613 // if exist SW network address, use SW network address.
615 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Network address = %02x-%02x-%02x=%02x-%02x-%02x\n",
616 pDevice->abyCurrentNetAddr[0],
617 pDevice->abyCurrentNetAddr[1],
618 pDevice->abyCurrentNetAddr[2],
619 pDevice->abyCurrentNetAddr[3],
620 pDevice->abyCurrentNetAddr[4],
621 pDevice->abyCurrentNetAddr[5]);
626 // Set BB and packet type at the same time.
627 // Set Short Slot Time, xIFS, and RSPINF.
628 if (pDevice->byBBType == BB_TYPE_11A) {
629 CARDbAddBasicRate(pDevice, RATE_6M);
630 pDevice->bShortSlotTime = TRUE;
632 CARDbAddBasicRate(pDevice, RATE_1M);
633 pDevice->bShortSlotTime = FALSE;
635 BBvSetShortSlotTime(pDevice);
636 CARDvSetBSSMode(pDevice);
638 if (pDevice->bUpdateBBVGA) {
639 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
640 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
641 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
644 pDevice->byRadioCtl = pDevice->abyEEPROM[EEP_OFS_RADIOCTL];
645 pDevice->bHWRadioOff = FALSE;
646 if ( (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) != 0 ) {
647 ntStatus = CONTROLnsRequestIn(pDevice,
650 MESSAGE_REQUEST_MACREG,
654 if ( ntStatus != STATUS_SUCCESS ) {
655 spin_unlock_irq(&pDevice->lock);
658 if ( (byTmp & GPIO3_DATA) == 0 ) {
659 pDevice->bHWRadioOff = TRUE;
660 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
662 MACvRegBitsOff(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
663 pDevice->bHWRadioOff = FALSE;
666 } //EEP_RADIOCTL_ENABLE
668 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_TMLEN,0x38);
669 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
670 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL0,0x01);
672 if ((pDevice->bHWRadioOff == TRUE) || (pDevice->bRadioControlOff == TRUE)) {
673 CARDbRadioPowerOff(pDevice);
675 CARDbRadioPowerOn(pDevice);
678 spin_unlock_irq(&pDevice->lock);
679 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"<----INIbInitAdapter Exit\n");
683 static BOOL device_release_WPADEV(PSDevice pDevice)
685 viawget_wpa_header *wpahdr;
687 // wait_queue_head_t Set_wait;
688 //send device close to wpa_supplicnat layer
689 if (pDevice->bWPADEVUp==TRUE) {
690 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
691 wpahdr->type = VIAWGET_DEVICECLOSE_MSG;
692 wpahdr->resp_ie_len = 0;
693 wpahdr->req_ie_len = 0;
694 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
695 pDevice->skb->dev = pDevice->wpadev;
696 skb_reset_mac_header(pDevice->skb);
697 pDevice->skb->pkt_type = PACKET_HOST;
698 pDevice->skb->protocol = htons(ETH_P_802_2);
699 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
700 netif_rx(pDevice->skb);
701 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
703 //wait release WPADEV
704 // init_waitqueue_head(&Set_wait);
705 // wait_event_timeout(Set_wait, ((pDevice->wpadev==NULL)&&(pDevice->skb == NULL)),5*HZ); //1s wait
706 while(pDevice->bWPADEVUp==TRUE) {
707 set_current_state(TASK_UNINTERRUPTIBLE);
708 schedule_timeout (HZ/20); //wait 50ms
717 #ifdef CONFIG_PM /* Minimal support for suspend and resume */
719 static int vt6656_suspend(struct usb_interface *intf, pm_message_t message)
721 PSDevice device = usb_get_intfdata(intf);
723 if (!device || !device->dev)
726 if (device->flags & DEVICE_FLAGS_OPENED)
727 device_close(device->dev);
729 usb_put_dev(interface_to_usbdev(intf));
734 static int vt6656_resume(struct usb_interface *intf)
736 PSDevice device = usb_get_intfdata(intf);
738 if (!device || !device->dev)
741 usb_get_dev(interface_to_usbdev(intf));
743 if (!(device->flags & DEVICE_FLAGS_OPENED))
744 device_open(device->dev);
749 #endif /* CONFIG_PM */
751 static const struct net_device_ops device_netdev_ops = {
752 .ndo_open = device_open,
753 .ndo_stop = device_close,
754 .ndo_do_ioctl = device_ioctl,
755 .ndo_get_stats = device_get_stats,
756 .ndo_start_xmit = device_xmit,
757 .ndo_set_multicast_list = device_set_multi,
762 vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id)
764 u8 fake_mac[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
765 struct usb_device *udev = interface_to_usbdev(intf);
767 struct net_device *netdev = NULL;
768 PSDevice pDevice = NULL;
771 printk(KERN_NOTICE "%s Ver. %s\n",DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
772 printk(KERN_NOTICE "Copyright (c) 2004 VIA Networking Technologies, Inc.\n");
774 udev = usb_get_dev(udev);
776 netdev = alloc_etherdev(sizeof(DEVICE_INFO));
778 if (netdev == NULL) {
779 printk(KERN_ERR DEVICE_NAME ": allocate net device failed \n");
784 pDevice = netdev_priv(netdev);
785 memset(pDevice, 0, sizeof(DEVICE_INFO));
787 pDevice->dev = netdev;
790 // Set initial settings
791 device_set_options(pDevice);
792 spin_lock_init(&pDevice->lock);
794 pDevice->tx_80211 = device_dma0_tx_80211;
795 pDevice->sMgmtObj.pAdapter = (void *)pDevice;
797 netdev->netdev_ops = &device_netdev_ops;
799 netdev->wireless_handlers = (struct iw_handler_def *)&iwctl_handler_def;
801 //2008-0623-01<Remark>by MikeLiu
802 //2007-0821-01<Add>by MikeLiu
803 usb_set_intfdata(intf, pDevice);
804 SET_NETDEV_DEV(netdev, &intf->dev);
805 memcpy(pDevice->dev->dev_addr, fake_mac, ETH_ALEN);
806 rc = register_netdev(netdev);
808 printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
814 usb_device_reset(pDevice);
817 union iwreq_data wrqu;
818 memset(&wrqu, 0, sizeof(wrqu));
819 wrqu.data.flags = RT_INSMOD_EVENT_FLAG;
820 wrqu.data.length =IFNAMSIZ;
821 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, pDevice->dev->name);
828 //2008-0922-01<Add>by MikeLiu, decrease usb counter.
835 static void device_free_tx_bufs(PSDevice pDevice)
837 PUSB_SEND_CONTEXT pTxContext;
840 for (ii = 0; ii < pDevice->cbTD; ii++) {
842 pTxContext = pDevice->apTD[ii];
844 if (pTxContext->pUrb) {
845 usb_kill_urb(pTxContext->pUrb);
846 usb_free_urb(pTxContext->pUrb);
855 static void device_free_rx_bufs(PSDevice pDevice)
860 for (ii = 0; ii < pDevice->cbRD; ii++) {
862 pRCB = pDevice->apRCB[ii];
865 usb_kill_urb(pRCB->pUrb);
866 usb_free_urb(pRCB->pUrb);
870 dev_kfree_skb(pRCB->skb);
872 if (pDevice->pRCBMem)
873 kfree(pDevice->pRCBMem);
878 //2007-1107-02<Add>by MikeLiu
879 static void usb_device_reset(PSDevice pDevice)
882 status = usb_reset_device(pDevice->usb);
884 printk("usb_device_reset fail status=%d\n",status);
888 static void device_free_int_bufs(PSDevice pDevice)
890 if (pDevice->intBuf.pDataBuf != NULL)
891 kfree(pDevice->intBuf.pDataBuf);
896 static BOOL device_alloc_bufs(PSDevice pDevice) {
898 PUSB_SEND_CONTEXT pTxContext;
903 for (ii = 0; ii < pDevice->cbTD; ii++) {
905 pTxContext = kmalloc(sizeof(USB_SEND_CONTEXT), GFP_KERNEL);
906 if (pTxContext == NULL) {
907 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate tx usb context failed\n", pDevice->dev->name);
910 pDevice->apTD[ii] = pTxContext;
911 pTxContext->pDevice = (void *) pDevice;
913 pTxContext->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
914 if (pTxContext->pUrb == NULL) {
915 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "alloc tx urb failed\n");
918 pTxContext->bBoolInUse = FALSE;
922 pDevice->pRCBMem = kmalloc((sizeof(RCB) * pDevice->cbRD), GFP_KERNEL);
923 if (pDevice->pRCBMem == NULL) {
924 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : alloc rx usb context failed\n", pDevice->dev->name);
929 pDevice->FirstRecvFreeList = NULL;
930 pDevice->LastRecvFreeList = NULL;
931 pDevice->FirstRecvMngList = NULL;
932 pDevice->LastRecvMngList = NULL;
933 pDevice->NumRecvFreeList = 0;
934 memset(pDevice->pRCBMem, 0, (sizeof(RCB) * pDevice->cbRD));
935 pRCB = (PRCB) pDevice->pRCBMem;
937 for (ii = 0; ii < pDevice->cbRD; ii++) {
939 pDevice->apRCB[ii] = pRCB;
940 pRCB->pDevice = (void *) pDevice;
942 pRCB->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
944 if (pRCB->pUrb == NULL) {
945 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx urb\n");
948 pRCB->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
949 if (pRCB->skb == NULL) {
950 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx skb\n");
953 pRCB->skb->dev = pDevice->dev;
954 pRCB->bBoolInUse = FALSE;
955 EnqueueRCB(pDevice->FirstRecvFreeList, pDevice->LastRecvFreeList, pRCB);
956 pDevice->NumRecvFreeList++;
961 pDevice->pControlURB = usb_alloc_urb(0, GFP_ATOMIC);
962 if (pDevice->pControlURB == NULL) {
963 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc control urb\n");
967 pDevice->pInterruptURB = usb_alloc_urb(0, GFP_ATOMIC);
968 if (pDevice->pInterruptURB == NULL) {
969 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int urb\n");
970 usb_kill_urb(pDevice->pControlURB);
971 usb_free_urb(pDevice->pControlURB);
975 pDevice->intBuf.pDataBuf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL);
976 if (pDevice->intBuf.pDataBuf == NULL) {
977 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int buf\n");
978 usb_kill_urb(pDevice->pControlURB);
979 usb_kill_urb(pDevice->pInterruptURB);
980 usb_free_urb(pDevice->pControlURB);
981 usb_free_urb(pDevice->pInterruptURB);
988 device_free_rx_bufs(pDevice);
991 device_free_tx_bufs(pDevice);
999 static BOOL device_init_defrag_cb(PSDevice pDevice) {
1001 PSDeFragControlBlock pDeF;
1003 /* Init the fragment ctl entries */
1004 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1005 pDeF = &(pDevice->sRxDFCB[i]);
1006 if (!device_alloc_frag_buf(pDevice, pDeF)) {
1007 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
1008 pDevice->dev->name);
1012 pDevice->cbDFCB = CB_MAX_RX_FRAG;
1013 pDevice->cbFreeDFCB = pDevice->cbDFCB;
1017 device_free_frag_bufs(pDevice);
1023 static void device_free_frag_bufs(PSDevice pDevice) {
1024 PSDeFragControlBlock pDeF;
1027 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1029 pDeF = &(pDevice->sRxDFCB[i]);
1032 dev_kfree_skb(pDeF->skb);
1038 BOOL device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {
1040 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1041 if (pDeF->skb == NULL)
1044 pDeF->skb->dev = pDevice->dev;
1050 /*-----------------------------------------------------------------*/
1052 static int device_open(struct net_device *dev) {
1053 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1055 #ifdef WPA_SM_Transtatus
1056 extern SWPAResult wpa_Result;
1057 memset(wpa_Result.ifname,0,sizeof(wpa_Result.ifname));
1058 wpa_Result.proto = 0;
1059 wpa_Result.key_mgmt = 0;
1060 wpa_Result.eap_type = 0;
1061 wpa_Result.authenticated = FALSE;
1062 pDevice->fWPA_Authened = FALSE;
1065 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_open...\n");
1068 pDevice->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS;
1070 if (device_alloc_bufs(pDevice) == FALSE) {
1071 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_alloc_bufs fail... \n");
1075 if (device_init_defrag_cb(pDevice)== FALSE) {
1076 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Initial defragement cb fail \n");
1080 MP_CLEAR_FLAG(pDevice, fMP_DISCONNECTED);
1081 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
1082 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
1083 MP_SET_FLAG(pDevice, fMP_POST_READS);
1084 MP_SET_FLAG(pDevice, fMP_POST_WRITES);
1087 Read_config_file(pDevice);
1089 if (device_init_registers(pDevice, DEVICE_INIT_COLD) == FALSE) {
1090 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " init register fail\n");
1094 device_set_multi(pDevice->dev);
1095 // Init for Key Management
1097 KeyvInitTable(pDevice,&pDevice->sKey);
1098 memcpy(pDevice->sMgmtObj.abyMACAddr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1099 memcpy(pDevice->dev->dev_addr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1100 pDevice->bStopTx0Pkt = FALSE;
1101 pDevice->bStopDataPkt = FALSE;
1102 pDevice->bRoaming = FALSE; //DavidWang
1103 pDevice->bIsRoaming = FALSE;//DavidWang
1104 pDevice->bEnableRoaming = FALSE;
1105 if (pDevice->bDiversityRegCtlON) {
1106 device_init_diversity_timer(pDevice);
1109 vMgrObjectInit(pDevice);
1110 tasklet_init(&pDevice->RxMngWorkItem, (void *)RXvMngWorkItem, (unsigned long)pDevice);
1111 tasklet_init(&pDevice->ReadWorkItem, (void *)RXvWorkItem, (unsigned long)pDevice);
1112 tasklet_init(&pDevice->EventWorkItem, (void *)INTvWorkItem, (unsigned long)pDevice);
1113 add_timer(&(pDevice->sMgmtObj.sTimerSecondCallback));
1114 pDevice->int_interval = 100; //Max 100 microframes.
1115 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1117 pDevice->bIsRxWorkItemQueued = TRUE;
1118 pDevice->fKillEventPollingThread = FALSE;
1119 pDevice->bEventAvailable = FALSE;
1121 pDevice->bWPADEVUp = FALSE;
1122 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1123 pDevice->bwextstep0 = FALSE;
1124 pDevice->bwextstep1 = FALSE;
1125 pDevice->bwextstep2 = FALSE;
1126 pDevice->bwextstep3 = FALSE;
1127 pDevice->bWPASuppWextEnabled = FALSE;
1129 pDevice->byReAssocCount = 0;
1131 RXvWorkItem(pDevice);
1132 INTvWorkItem(pDevice);
1134 // Patch: if WEP key already set by iwconfig but device not yet open
1135 if ((pDevice->bEncryptionEnable == TRUE) && (pDevice->bTransmitKey == TRUE)) {
1136 spin_lock_irq(&pDevice->lock);
1137 KeybSetDefaultKey( pDevice,
1139 pDevice->byKeyIndex | (1 << 31),
1140 pDevice->uKeyLength,
1145 spin_unlock_irq(&pDevice->lock);
1146 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1149 if (pDevice->sMgmtObj.eConfigMode == WMAC_CONFIG_AP) {
1150 bScheduleCommand((void *) pDevice, WLAN_CMD_RUN_AP, NULL);
1153 //mike:mark@2008-11-10
1154 bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1155 /* bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL); */
1159 netif_stop_queue(pDevice->dev);
1160 pDevice->flags |= DEVICE_FLAGS_OPENED;
1163 union iwreq_data wrqu;
1164 memset(&wrqu, 0, sizeof(wrqu));
1165 wrqu.data.flags = RT_UPDEV_EVENT_FLAG;
1166 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1169 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
1173 device_free_frag_bufs(pDevice);
1175 device_free_rx_bufs(pDevice);
1176 device_free_tx_bufs(pDevice);
1177 device_free_int_bufs(pDevice);
1178 usb_kill_urb(pDevice->pControlURB);
1179 usb_kill_urb(pDevice->pInterruptURB);
1180 usb_free_urb(pDevice->pControlURB);
1181 usb_free_urb(pDevice->pInterruptURB);
1183 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open fail.. \n");
1189 static int device_close(struct net_device *dev) {
1190 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1191 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1195 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close1 \n");
1196 if (pDevice == NULL)
1200 union iwreq_data wrqu;
1201 memset(&wrqu, 0, sizeof(wrqu));
1202 wrqu.data.flags = RT_DOWNDEV_EVENT_FLAG;
1203 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1206 //2007-1121-02<Add>by EinsnLiu
1207 if (pDevice->bLinkPass) {
1208 bScheduleCommand((void *) pDevice, WLAN_CMD_DISASSOCIATE, NULL);
1213 //2008-0714-01<Add>by MikeLiu
1214 device_release_WPADEV(pDevice);
1216 memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
1217 pMgmt->bShareKeyAlgorithm = FALSE;
1218 pDevice->bEncryptionEnable = FALSE;
1219 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1220 spin_lock_irq(&pDevice->lock);
1221 for (uu = 0; uu < MAX_KEY_TABLE; uu++)
1222 MACvDisableKeyEntry(pDevice,uu);
1223 spin_unlock_irq(&pDevice->lock);
1225 if ((pDevice->flags & DEVICE_FLAGS_UNPLUG) == FALSE) {
1226 MACbShutdown(pDevice);
1228 netif_stop_queue(pDevice->dev);
1229 MP_SET_FLAG(pDevice, fMP_DISCONNECTED);
1230 MP_CLEAR_FLAG(pDevice, fMP_POST_WRITES);
1231 MP_CLEAR_FLAG(pDevice, fMP_POST_READS);
1232 pDevice->fKillEventPollingThread = TRUE;
1233 del_timer(&pDevice->sTimerCommand);
1234 del_timer(&pMgmt->sTimerSecondCallback);
1236 del_timer(&pDevice->sTimerTxData);
1238 if (pDevice->bDiversityRegCtlON) {
1239 del_timer(&pDevice->TimerSQ3Tmax1);
1240 del_timer(&pDevice->TimerSQ3Tmax2);
1241 del_timer(&pDevice->TimerSQ3Tmax3);
1243 tasklet_kill(&pDevice->RxMngWorkItem);
1244 tasklet_kill(&pDevice->ReadWorkItem);
1245 tasklet_kill(&pDevice->EventWorkItem);
1247 pDevice->bRoaming = FALSE; //DavidWang
1248 pDevice->bIsRoaming = FALSE;//DavidWang
1249 pDevice->bEnableRoaming = FALSE;
1250 pDevice->bCmdRunning = FALSE;
1251 pDevice->bLinkPass = FALSE;
1252 memset(pMgmt->abyCurrBSSID, 0, 6);
1253 pMgmt->eCurrState = WMAC_STATE_IDLE;
1255 device_free_tx_bufs(pDevice);
1256 device_free_rx_bufs(pDevice);
1257 device_free_int_bufs(pDevice);
1258 device_free_frag_bufs(pDevice);
1260 usb_kill_urb(pDevice->pControlURB);
1261 usb_kill_urb(pDevice->pInterruptURB);
1262 usb_free_urb(pDevice->pControlURB);
1263 usb_free_urb(pDevice->pInterruptURB);
1265 BSSvClearNodeDBTable(pDevice, 0);
1266 pDevice->flags &=(~DEVICE_FLAGS_OPENED);
1268 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n");
1273 static void __devexit vt6656_disconnect(struct usb_interface *intf)
1275 PSDevice device = usb_get_intfdata(intf);
1281 union iwreq_data req;
1282 memset(&req, 0, sizeof(req));
1283 req.data.flags = RT_RMMOD_EVENT_FLAG;
1284 wireless_send_event(device->dev, IWEVCUSTOM, &req, NULL);
1287 device_release_WPADEV(device);
1289 usb_set_intfdata(intf, NULL);
1290 usb_put_dev(interface_to_usbdev(intf));
1292 device->flags |= DEVICE_FLAGS_UNPLUG;
1295 unregister_netdev(device->dev);
1296 wpa_set_wpadev(device, 0);
1297 free_netdev(device->dev);
1301 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev) {
1302 PSDevice pDevice=netdev_priv(dev);
1304 unsigned int cbMPDULen = 0;
1307 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211\n");
1308 spin_lock_irq(&pDevice->lock);
1310 if (pDevice->bStopTx0Pkt == TRUE) {
1311 dev_kfree_skb_irq(skb);
1312 spin_unlock_irq(&pDevice->lock);
1317 cbMPDULen = skb->len;
1320 vDMA0_tx_80211(pDevice, skb);
1322 spin_unlock_irq(&pDevice->lock);
1329 static int device_xmit(struct sk_buff *skb, struct net_device *dev) {
1330 PSDevice pDevice=netdev_priv(dev);
1331 struct net_device_stats* pStats = &pDevice->stats;
1334 spin_lock_irq(&pDevice->lock);
1336 netif_stop_queue(pDevice->dev);
1338 if (pDevice->bLinkPass == FALSE) {
1339 dev_kfree_skb_irq(skb);
1340 spin_unlock_irq(&pDevice->lock);
1343 if (pDevice->bStopDataPkt == TRUE) {
1344 dev_kfree_skb_irq(skb);
1345 pStats->tx_dropped++;
1346 spin_unlock_irq(&pDevice->lock);
1350 if(nsDMA_tx_packet(pDevice, TYPE_AC0DMA, skb) !=0) { //mike add:xmit fail!
1351 if (netif_queue_stopped(pDevice->dev))
1352 netif_wake_queue(pDevice->dev);
1355 spin_unlock_irq(&pDevice->lock);
1362 static unsigned const ethernet_polynomial = 0x04c11db7U;
1363 static inline u32 ether_crc(int length, unsigned char *data)
1367 while(--length >= 0) {
1368 unsigned char current_octet = *data++;
1370 for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
1372 ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
1378 //find out the start position of str2 from str1
1379 static unsigned char *kstrstr(const unsigned char *str1,
1380 const unsigned char *str2) {
1381 int str1_len = strlen(str1);
1382 int str2_len = strlen(str2);
1384 while (str1_len >= str2_len) {
1386 if(memcmp(str1,str2,str2_len)==0)
1387 return (unsigned char *) str1;
1393 static int Config_FileGetParameter(unsigned char *string,
1394 unsigned char *dest,
1395 unsigned char *source)
1397 unsigned char buf1[100];
1398 unsigned char buf2[100];
1399 unsigned char *start_p = NULL, *end_p = NULL, *tmp_p = NULL;
1403 strcat(buf1, string);
1405 source+=strlen(buf1);
1407 //find target string start point
1408 start_p = kstrstr(source,buf1);
1409 if (start_p == NULL)
1412 //check if current config line is marked by "#" ??
1413 for (ii = 1; ; ii++) {
1414 if (memcmp(start_p - ii, "\n", 1) == 0)
1416 if (memcmp(start_p - ii, "#", 1) == 0)
1420 //find target string end point
1421 end_p = kstrstr(start_p,"\n");
1422 if (end_p == NULL) { //can't find "\n",but don't care
1423 end_p=start_p+strlen(start_p); //no include "\n"
1427 memcpy(buf2,start_p,end_p-start_p); //get the tartget line
1428 buf2[end_p-start_p]='\0';
1431 start_p = kstrstr(buf2,"=");
1432 if (start_p == NULL)
1435 strcpy(buf1,start_p+1);
1439 while(*tmp_p != 0x00) {
1446 memcpy(dest,tmp_p,strlen(tmp_p));
1450 //if read fail,return NULL,or return data pointer;
1451 static unsigned char *Config_FileOperation(PSDevice pDevice)
1453 unsigned char *config_path = CONFIG_PATH;
1454 unsigned char *buffer = NULL;
1455 struct file *filp=NULL;
1456 mm_segment_t old_fs = get_fs();
1457 //int oldfsuid=0,oldfsgid=0;
1461 /* Can't do this anymore, so we rely on correct filesystem permissions:
1462 //Make sure a caller can read or write power as root
1463 oldfsuid=current->fsuid;
1464 oldfsgid=current->fsgid;
1470 filp = filp_open(config_path, O_RDWR, 0);
1472 printk("Config_FileOperation file Not exist\n");
1477 if(!(filp->f_op) || !(filp->f_op->read) ||!(filp->f_op->write)) {
1478 printk("file %s cann't readable or writable?\n",config_path);
1483 buffer = kmalloc(1024, GFP_KERNEL);
1485 printk("alllocate mem for file fail?\n");
1490 if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
1491 printk("read file error?\n");
1496 if(filp_close(filp,NULL))
1497 printk("Config_FileOperation:close file fail\n");
1503 current->fsuid=oldfsuid;
1504 current->fsgid=oldfsgid;
1515 //return --->-1:fail; >=0:successful
1516 static int Read_config_file(PSDevice pDevice) {
1518 unsigned char tmpbuffer[100];
1519 unsigned char *buffer = NULL;
1521 //init config setting
1522 pDevice->config_file.ZoneType = -1;
1523 pDevice->config_file.eAuthenMode = -1;
1524 pDevice->config_file.eEncryptionStatus = -1;
1526 buffer = Config_FileOperation(pDevice);
1527 if (buffer == NULL) {
1534 memset(tmpbuffer,0,sizeof(tmpbuffer));
1535 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer) ==TRUE) {
1536 if(memcmp(tmpbuffer,"USA",3)==0) {
1537 pDevice->config_file.ZoneType=ZoneType_USA;
1539 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
1540 pDevice->config_file.ZoneType=ZoneType_Japan;
1542 else if(memcmp(tmpbuffer,"EUROPE",6)==0) {
1543 pDevice->config_file.ZoneType=ZoneType_Europe;
1546 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
1552 //get other parameter
1554 memset(tmpbuffer,0,sizeof(tmpbuffer));
1555 if(Config_FileGetParameter("AUTHENMODE",tmpbuffer,buffer)==TRUE) {
1556 pDevice->config_file.eAuthenMode = (int) simple_strtol(tmpbuffer, NULL, 10);
1559 memset(tmpbuffer,0,sizeof(tmpbuffer));
1560 if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer,buffer)==TRUE) {
1561 pDevice->config_file.eEncryptionStatus= (int) simple_strtol(tmpbuffer, NULL, 10);
1570 static void device_set_multi(struct net_device *dev) {
1571 PSDevice pDevice = (PSDevice) netdev_priv(dev);
1572 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1575 struct netdev_hw_addr *ha;
1576 BYTE pbyData[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
1581 spin_lock_irq(&pDevice->lock);
1582 rc = CONTROLnsRequestIn(pDevice,
1585 MESSAGE_REQUEST_MACREG,
1589 if (rc == 0) pDevice->byRxMode = byTmpMode;
1591 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode in= %x\n", pDevice->byRxMode);
1593 if (dev->flags & IFF_PROMISC) { // Set promiscuous.
1594 DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
1595 // Unconditionally log net taps.
1596 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
1598 else if ((netdev_mc_count(dev) > pDevice->multicast_limit) ||
1599 (dev->flags & IFF_ALLMULTI)) {
1600 CONTROLnsRequestOut(pDevice,
1603 MESSAGE_REQUEST_MACREG,
1607 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1610 memset(mc_filter, 0, sizeof(mc_filter));
1611 netdev_for_each_mc_addr(ha, dev) {
1612 int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
1613 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
1615 for (ii = 0; ii < 4; ii++) {
1616 MACvWriteMultiAddr(pDevice, ii, *((PBYTE)&mc_filter[0] + ii));
1617 MACvWriteMultiAddr(pDevice, ii+ 4, *((PBYTE)&mc_filter[1] + ii));
1619 pDevice->byRxMode &= ~(RCR_UNICAST);
1620 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1623 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1624 // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
1625 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1626 pDevice->byRxMode &= ~(RCR_UNICAST);
1628 ControlvWriteByte(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_RCR, pDevice->byRxMode);
1629 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode out= %x\n", pDevice->byRxMode);
1630 spin_unlock_irq(&pDevice->lock);
1635 static struct net_device_stats *device_get_stats(struct net_device *dev) {
1636 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1638 return &pDevice->stats;
1642 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
1643 PSDevice pDevice = (PSDevice)netdev_priv(dev);
1644 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1646 //BOOL bCommit = FALSE;
1647 struct iwreq *wrq = (struct iwreq *) rq;
1650 if (pMgmt == NULL) {
1658 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
1665 case SIOCGIWNWID: //0x8b03 support
1666 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1667 rc = iwctl_giwnwid(dev, NULL, &(wrq->u.nwid), NULL);
1673 // Set frequency/channel
1675 rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
1678 // Get frequency/channel
1680 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
1683 // Set desired network name (ESSID)
1687 char essid[IW_ESSID_MAX_SIZE+1];
1688 if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
1692 if (copy_from_user(essid, wrq->u.essid.pointer,
1693 wrq->u.essid.length)) {
1697 rc = iwctl_siwessid(dev, NULL,
1698 &(wrq->u.essid), essid);
1703 // Get current network name (ESSID)
1707 char essid[IW_ESSID_MAX_SIZE+1];
1708 if (wrq->u.essid.pointer)
1709 rc = iwctl_giwessid(dev, NULL,
1710 &(wrq->u.essid), essid);
1711 if (copy_to_user(wrq->u.essid.pointer,
1713 wrq->u.essid.length) )
1720 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1724 // Get current Access Point (BSSID)
1726 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1730 // Set desired station name
1732 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
1736 // Get current station name
1738 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
1742 // Set the desired bit-rate
1744 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1747 // Get the current bit-rate
1750 rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1753 // Set the desired RTS threshold
1756 rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
1759 // Get the current RTS threshold
1762 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
1765 // Set the desired fragmentation threshold
1768 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
1771 // Get the current fragmentation threshold
1774 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
1777 // Set mode of operation
1779 rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
1782 // Get mode of operation
1784 rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
1787 // Set WEP keys and mode
1790 char abyKey[WLAN_WEP232_KEYLEN];
1792 if (wrq->u.encoding.pointer) {
1795 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
1799 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
1800 if (copy_from_user(abyKey,
1801 wrq->u.encoding.pointer,
1802 wrq->u.encoding.length)) {
1806 } else if (wrq->u.encoding.length != 0) {
1810 rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
1814 // Get the WEP keys and mode
1817 if (!capable(CAP_NET_ADMIN)) {
1822 char abyKey[WLAN_WEP232_KEYLEN];
1824 rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
1826 if (wrq->u.encoding.pointer) {
1827 if (copy_to_user(wrq->u.encoding.pointer,
1829 wrq->u.encoding.length))
1835 // Get the current Tx-Power
1837 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
1842 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
1848 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
1853 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
1856 // Get range of parameters
1860 struct iw_range range;
1862 rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *) &range);
1863 if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
1871 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
1877 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
1883 rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
1887 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
1893 char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
1895 if (wrq->u.data.pointer) {
1896 rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
1898 if (copy_to_user(wrq->u.data.pointer,
1900 (wrq->u.data.length * (sizeof(struct sockaddr) + sizeof(struct iw_quality)))
1913 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
1920 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
1924 #endif // WIRELESS_SPY
1927 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
1930 if(wrq->u.data.pointer) {
1931 wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
1933 if(copy_to_user(wrq->u.data.pointer,
1934 (u_char *) iwctl_private_args,
1935 sizeof(iwctl_private_args)))
1942 //2008-0409-07, <Add> by Einsn Liu
1943 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1945 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH \n");
1946 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
1950 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
1951 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
1955 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
1956 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1960 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
1961 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1964 case SIOCSIWENCODEEXT:
1966 char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
1967 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
1968 if(wrq->u.encoding.pointer){
1969 memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1);
1970 if(wrq->u.encoding.length > (sizeof(struct iw_encode_ext)+ MAX_KEY_LEN)){
1974 if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
1978 }else if(wrq->u.encoding.length != 0){
1982 rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
1986 case SIOCGIWENCODEEXT:
1987 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
1988 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
1992 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
1993 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1996 #endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1997 //End Add -- //2008-0409-07, <Add> by Einsn Liu
1999 case IOCTL_CMD_TEST:
2001 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2007 pReq = (PSCmdRequest)rq;
2009 //20080130-01,<Remark> by Mike Liu
2010 // if(pDevice->bLinkPass==TRUE)
2011 pReq->wResult = MAGIC_CODE; //Linking status:0x3142
2012 //20080130-02,<Remark> by Mike Liu
2014 // pReq->wResult = MAGIC_CODE+1; //disconnect status:0x3143
2018 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
2019 (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
2027 if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
2030 rc = private_ioctl(pDevice, rq);
2031 clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
2034 case IOCTL_CMD_HOSTAPD:
2036 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2043 rc = vt6656_hostap_ioctl(pDevice, &wrq->u.data);
2048 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2055 rc = wpa_ioctl(pDevice, &wrq->u.data);
2059 return ethtool_ioctl(dev, (void *) rq->ifr_data);
2060 // All other calls are currently unsupported
2064 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
2069 if (pDevice->bCommit) {
2070 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2071 netif_stop_queue(pDevice->dev);
2072 spin_lock_irq(&pDevice->lock);
2073 bScheduleCommand((void *) pDevice, WLAN_CMD_RUN_AP, NULL);
2074 spin_unlock_irq(&pDevice->lock);
2077 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
2078 spin_lock_irq(&pDevice->lock);
2079 //2007-1121-01<Modify>by EinsnLiu
2080 if (pDevice->bLinkPass &&
2081 memcmp(pMgmt->abyCurrSSID,pMgmt->abyDesireSSID,WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN)) {
2082 bScheduleCommand((void *) pDevice, WLAN_CMD_DISASSOCIATE, NULL);
2084 pDevice->bLinkPass = FALSE;
2085 pMgmt->eCurrState = WMAC_STATE_IDLE;
2086 memset(pMgmt->abyCurrBSSID, 0, 6);
2088 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
2090 netif_stop_queue(pDevice->dev);
2091 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2092 pMgmt->eScanType = WMAC_SCAN_ACTIVE;
2093 if (!pDevice->bWPASuppWextEnabled)
2095 bScheduleCommand((void *) pDevice,
2096 WLAN_CMD_BSSID_SCAN,
2097 pMgmt->abyDesireSSID);
2098 bScheduleCommand((void *) pDevice,
2101 spin_unlock_irq(&pDevice->lock);
2103 pDevice->bCommit = FALSE;
2111 static int ethtool_ioctl(struct net_device *dev, void *useraddr)
2115 if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd)))
2119 case ETHTOOL_GDRVINFO: {
2120 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
2121 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
2122 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
2123 if (copy_to_user(useraddr, &info, sizeof(info)))
2134 /*------------------------------------------------------------------*/
2136 MODULE_DEVICE_TABLE(usb, vt6656_table);
2138 static struct usb_driver vt6656_driver = {
2139 .name = DEVICE_NAME,
2140 .probe = vt6656_probe,
2141 .disconnect = vt6656_disconnect,
2142 .id_table = vt6656_table,
2144 .suspend = vt6656_suspend,
2145 .resume = vt6656_resume,
2146 #endif /* CONFIG_PM */
2149 static int __init vt6656_init_module(void)
2151 printk(KERN_NOTICE DEVICE_FULL_DRV_NAM " " DEVICE_VERSION);
2152 return usb_register(&vt6656_driver);
2155 static void __exit vt6656_cleanup_module(void)
2157 usb_deregister(&vt6656_driver);
2160 module_init(vt6656_init_module);
2161 module_exit(vt6656_cleanup_module);