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);
818 union iwreq_data wrqu;
819 memset(&wrqu, 0, sizeof(wrqu));
820 wrqu.data.flags = RT_INSMOD_EVENT_FLAG;
821 wrqu.data.length =IFNAMSIZ;
822 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, pDevice->dev->name);
830 //2008-0922-01<Add>by MikeLiu, decrease usb counter.
837 static void device_free_tx_bufs(PSDevice pDevice)
839 PUSB_SEND_CONTEXT pTxContext;
842 for (ii = 0; ii < pDevice->cbTD; ii++) {
844 pTxContext = pDevice->apTD[ii];
846 if (pTxContext->pUrb) {
847 usb_kill_urb(pTxContext->pUrb);
848 usb_free_urb(pTxContext->pUrb);
857 static void device_free_rx_bufs(PSDevice pDevice)
862 for (ii = 0; ii < pDevice->cbRD; ii++) {
864 pRCB = pDevice->apRCB[ii];
867 usb_kill_urb(pRCB->pUrb);
868 usb_free_urb(pRCB->pUrb);
872 dev_kfree_skb(pRCB->skb);
874 if (pDevice->pRCBMem)
875 kfree(pDevice->pRCBMem);
880 //2007-1107-02<Add>by MikeLiu
881 static void usb_device_reset(PSDevice pDevice)
884 status = usb_reset_device(pDevice->usb);
886 printk("usb_device_reset fail status=%d\n",status);
890 static void device_free_int_bufs(PSDevice pDevice)
892 if (pDevice->intBuf.pDataBuf != NULL)
893 kfree(pDevice->intBuf.pDataBuf);
898 static BOOL device_alloc_bufs(PSDevice pDevice) {
900 PUSB_SEND_CONTEXT pTxContext;
905 for (ii = 0; ii < pDevice->cbTD; ii++) {
907 pTxContext = kmalloc(sizeof(USB_SEND_CONTEXT), GFP_KERNEL);
908 if (pTxContext == NULL) {
909 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate tx usb context failed\n", pDevice->dev->name);
912 pDevice->apTD[ii] = pTxContext;
913 pTxContext->pDevice = (void *) pDevice;
915 pTxContext->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
916 if (pTxContext->pUrb == NULL) {
917 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "alloc tx urb failed\n");
920 pTxContext->bBoolInUse = FALSE;
924 pDevice->pRCBMem = kmalloc((sizeof(RCB) * pDevice->cbRD), GFP_KERNEL);
925 if (pDevice->pRCBMem == NULL) {
926 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : alloc rx usb context failed\n", pDevice->dev->name);
931 pDevice->FirstRecvFreeList = NULL;
932 pDevice->LastRecvFreeList = NULL;
933 pDevice->FirstRecvMngList = NULL;
934 pDevice->LastRecvMngList = NULL;
935 pDevice->NumRecvFreeList = 0;
936 memset(pDevice->pRCBMem, 0, (sizeof(RCB) * pDevice->cbRD));
937 pRCB = (PRCB) pDevice->pRCBMem;
939 for (ii = 0; ii < pDevice->cbRD; ii++) {
941 pDevice->apRCB[ii] = pRCB;
942 pRCB->pDevice = (void *) pDevice;
944 pRCB->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
946 if (pRCB->pUrb == NULL) {
947 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx urb\n");
950 pRCB->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
951 if (pRCB->skb == NULL) {
952 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx skb\n");
955 pRCB->skb->dev = pDevice->dev;
956 pRCB->bBoolInUse = FALSE;
957 EnqueueRCB(pDevice->FirstRecvFreeList, pDevice->LastRecvFreeList, pRCB);
958 pDevice->NumRecvFreeList++;
963 pDevice->pControlURB = usb_alloc_urb(0, GFP_ATOMIC);
964 if (pDevice->pControlURB == NULL) {
965 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc control urb\n");
969 pDevice->pInterruptURB = usb_alloc_urb(0, GFP_ATOMIC);
970 if (pDevice->pInterruptURB == NULL) {
971 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int urb\n");
972 usb_kill_urb(pDevice->pControlURB);
973 usb_free_urb(pDevice->pControlURB);
977 pDevice->intBuf.pDataBuf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL);
978 if (pDevice->intBuf.pDataBuf == NULL) {
979 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int buf\n");
980 usb_kill_urb(pDevice->pControlURB);
981 usb_kill_urb(pDevice->pInterruptURB);
982 usb_free_urb(pDevice->pControlURB);
983 usb_free_urb(pDevice->pInterruptURB);
990 device_free_rx_bufs(pDevice);
993 device_free_tx_bufs(pDevice);
1001 static BOOL device_init_defrag_cb(PSDevice pDevice) {
1003 PSDeFragControlBlock pDeF;
1005 /* Init the fragment ctl entries */
1006 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1007 pDeF = &(pDevice->sRxDFCB[i]);
1008 if (!device_alloc_frag_buf(pDevice, pDeF)) {
1009 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
1010 pDevice->dev->name);
1014 pDevice->cbDFCB = CB_MAX_RX_FRAG;
1015 pDevice->cbFreeDFCB = pDevice->cbDFCB;
1019 device_free_frag_bufs(pDevice);
1025 static void device_free_frag_bufs(PSDevice pDevice) {
1026 PSDeFragControlBlock pDeF;
1029 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1031 pDeF = &(pDevice->sRxDFCB[i]);
1034 dev_kfree_skb(pDeF->skb);
1040 BOOL device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {
1042 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1043 if (pDeF->skb == NULL)
1046 pDeF->skb->dev = pDevice->dev;
1052 /*-----------------------------------------------------------------*/
1054 static int device_open(struct net_device *dev) {
1055 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1057 #ifdef WPA_SM_Transtatus
1058 extern SWPAResult wpa_Result;
1059 memset(wpa_Result.ifname,0,sizeof(wpa_Result.ifname));
1060 wpa_Result.proto = 0;
1061 wpa_Result.key_mgmt = 0;
1062 wpa_Result.eap_type = 0;
1063 wpa_Result.authenticated = FALSE;
1064 pDevice->fWPA_Authened = FALSE;
1067 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_open...\n");
1070 pDevice->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS;
1072 if (device_alloc_bufs(pDevice) == FALSE) {
1073 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_alloc_bufs fail... \n");
1077 if (device_init_defrag_cb(pDevice)== FALSE) {
1078 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Initial defragement cb fail \n");
1082 MP_CLEAR_FLAG(pDevice, fMP_DISCONNECTED);
1083 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
1084 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
1085 MP_SET_FLAG(pDevice, fMP_POST_READS);
1086 MP_SET_FLAG(pDevice, fMP_POST_WRITES);
1089 Read_config_file(pDevice);
1091 if (device_init_registers(pDevice, DEVICE_INIT_COLD) == FALSE) {
1092 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " init register fail\n");
1096 device_set_multi(pDevice->dev);
1097 // Init for Key Management
1099 KeyvInitTable(pDevice,&pDevice->sKey);
1100 memcpy(pDevice->sMgmtObj.abyMACAddr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1101 memcpy(pDevice->dev->dev_addr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1102 pDevice->bStopTx0Pkt = FALSE;
1103 pDevice->bStopDataPkt = FALSE;
1104 pDevice->bRoaming = FALSE; //DavidWang
1105 pDevice->bIsRoaming = FALSE;//DavidWang
1106 pDevice->bEnableRoaming = FALSE;
1107 if (pDevice->bDiversityRegCtlON) {
1108 device_init_diversity_timer(pDevice);
1111 vMgrObjectInit(pDevice);
1112 tasklet_init(&pDevice->RxMngWorkItem, (void *)RXvMngWorkItem, (unsigned long)pDevice);
1113 tasklet_init(&pDevice->ReadWorkItem, (void *)RXvWorkItem, (unsigned long)pDevice);
1114 tasklet_init(&pDevice->EventWorkItem, (void *)INTvWorkItem, (unsigned long)pDevice);
1115 add_timer(&(pDevice->sMgmtObj.sTimerSecondCallback));
1116 pDevice->int_interval = 100; //Max 100 microframes.
1117 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1119 pDevice->bIsRxWorkItemQueued = TRUE;
1120 pDevice->fKillEventPollingThread = FALSE;
1121 pDevice->bEventAvailable = FALSE;
1123 pDevice->bWPADEVUp = FALSE;
1124 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1125 pDevice->bwextstep0 = FALSE;
1126 pDevice->bwextstep1 = FALSE;
1127 pDevice->bwextstep2 = FALSE;
1128 pDevice->bwextstep3 = FALSE;
1129 pDevice->bWPASuppWextEnabled = FALSE;
1131 pDevice->byReAssocCount = 0;
1133 RXvWorkItem(pDevice);
1134 INTvWorkItem(pDevice);
1136 // Patch: if WEP key already set by iwconfig but device not yet open
1137 if ((pDevice->bEncryptionEnable == TRUE) && (pDevice->bTransmitKey == TRUE)) {
1138 spin_lock_irq(&pDevice->lock);
1139 KeybSetDefaultKey( pDevice,
1141 pDevice->byKeyIndex | (1 << 31),
1142 pDevice->uKeyLength,
1147 spin_unlock_irq(&pDevice->lock);
1148 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1151 if (pDevice->sMgmtObj.eConfigMode == WMAC_CONFIG_AP) {
1152 bScheduleCommand((void *) pDevice, WLAN_CMD_RUN_AP, NULL);
1155 //mike:mark@2008-11-10
1156 bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1157 /* bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL); */
1161 netif_stop_queue(pDevice->dev);
1162 pDevice->flags |= DEVICE_FLAGS_OPENED;
1166 union iwreq_data wrqu;
1167 memset(&wrqu, 0, sizeof(wrqu));
1168 wrqu.data.flags = RT_UPDEV_EVENT_FLAG;
1169 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1173 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
1177 device_free_frag_bufs(pDevice);
1179 device_free_rx_bufs(pDevice);
1180 device_free_tx_bufs(pDevice);
1181 device_free_int_bufs(pDevice);
1182 usb_kill_urb(pDevice->pControlURB);
1183 usb_kill_urb(pDevice->pInterruptURB);
1184 usb_free_urb(pDevice->pControlURB);
1185 usb_free_urb(pDevice->pInterruptURB);
1187 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open fail.. \n");
1193 static int device_close(struct net_device *dev) {
1194 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1195 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1199 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close1 \n");
1200 if (pDevice == NULL)
1205 union iwreq_data wrqu;
1206 memset(&wrqu, 0, sizeof(wrqu));
1207 wrqu.data.flags = RT_DOWNDEV_EVENT_FLAG;
1208 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1212 //2007-1121-02<Add>by EinsnLiu
1213 if (pDevice->bLinkPass) {
1214 bScheduleCommand((void *) pDevice, WLAN_CMD_DISASSOCIATE, NULL);
1219 //2008-0714-01<Add>by MikeLiu
1220 device_release_WPADEV(pDevice);
1222 memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
1223 pMgmt->bShareKeyAlgorithm = FALSE;
1224 pDevice->bEncryptionEnable = FALSE;
1225 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1226 spin_lock_irq(&pDevice->lock);
1227 for (uu = 0; uu < MAX_KEY_TABLE; uu++)
1228 MACvDisableKeyEntry(pDevice,uu);
1229 spin_unlock_irq(&pDevice->lock);
1231 if ((pDevice->flags & DEVICE_FLAGS_UNPLUG) == FALSE) {
1232 MACbShutdown(pDevice);
1234 netif_stop_queue(pDevice->dev);
1235 MP_SET_FLAG(pDevice, fMP_DISCONNECTED);
1236 MP_CLEAR_FLAG(pDevice, fMP_POST_WRITES);
1237 MP_CLEAR_FLAG(pDevice, fMP_POST_READS);
1238 pDevice->fKillEventPollingThread = TRUE;
1239 del_timer(&pDevice->sTimerCommand);
1240 del_timer(&pMgmt->sTimerSecondCallback);
1242 del_timer(&pDevice->sTimerTxData);
1244 if (pDevice->bDiversityRegCtlON) {
1245 del_timer(&pDevice->TimerSQ3Tmax1);
1246 del_timer(&pDevice->TimerSQ3Tmax2);
1247 del_timer(&pDevice->TimerSQ3Tmax3);
1249 tasklet_kill(&pDevice->RxMngWorkItem);
1250 tasklet_kill(&pDevice->ReadWorkItem);
1251 tasklet_kill(&pDevice->EventWorkItem);
1253 pDevice->bRoaming = FALSE; //DavidWang
1254 pDevice->bIsRoaming = FALSE;//DavidWang
1255 pDevice->bEnableRoaming = FALSE;
1256 pDevice->bCmdRunning = FALSE;
1257 pDevice->bLinkPass = FALSE;
1258 memset(pMgmt->abyCurrBSSID, 0, 6);
1259 pMgmt->eCurrState = WMAC_STATE_IDLE;
1261 device_free_tx_bufs(pDevice);
1262 device_free_rx_bufs(pDevice);
1263 device_free_int_bufs(pDevice);
1264 device_free_frag_bufs(pDevice);
1266 usb_kill_urb(pDevice->pControlURB);
1267 usb_kill_urb(pDevice->pInterruptURB);
1268 usb_free_urb(pDevice->pControlURB);
1269 usb_free_urb(pDevice->pInterruptURB);
1271 BSSvClearNodeDBTable(pDevice, 0);
1272 pDevice->flags &=(~DEVICE_FLAGS_OPENED);
1274 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n");
1279 static void __devexit vt6656_disconnect(struct usb_interface *intf)
1281 PSDevice device = usb_get_intfdata(intf);
1288 union iwreq_data req;
1289 memset(&req, 0, sizeof(req));
1290 req.data.flags = RT_RMMOD_EVENT_FLAG;
1291 wireless_send_event(device->dev, IWEVCUSTOM, &req, NULL);
1295 device_release_WPADEV(device);
1297 usb_set_intfdata(intf, NULL);
1298 usb_put_dev(interface_to_usbdev(intf));
1300 device->flags |= DEVICE_FLAGS_UNPLUG;
1303 unregister_netdev(device->dev);
1304 wpa_set_wpadev(device, 0);
1305 free_netdev(device->dev);
1309 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev) {
1310 PSDevice pDevice=netdev_priv(dev);
1312 unsigned int cbMPDULen = 0;
1315 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211\n");
1316 spin_lock_irq(&pDevice->lock);
1318 if (pDevice->bStopTx0Pkt == TRUE) {
1319 dev_kfree_skb_irq(skb);
1320 spin_unlock_irq(&pDevice->lock);
1325 cbMPDULen = skb->len;
1328 vDMA0_tx_80211(pDevice, skb);
1330 spin_unlock_irq(&pDevice->lock);
1337 static int device_xmit(struct sk_buff *skb, struct net_device *dev) {
1338 PSDevice pDevice=netdev_priv(dev);
1339 struct net_device_stats* pStats = &pDevice->stats;
1342 spin_lock_irq(&pDevice->lock);
1344 netif_stop_queue(pDevice->dev);
1346 if (pDevice->bLinkPass == FALSE) {
1347 dev_kfree_skb_irq(skb);
1348 spin_unlock_irq(&pDevice->lock);
1351 if (pDevice->bStopDataPkt == TRUE) {
1352 dev_kfree_skb_irq(skb);
1353 pStats->tx_dropped++;
1354 spin_unlock_irq(&pDevice->lock);
1358 if(nsDMA_tx_packet(pDevice, TYPE_AC0DMA, skb) !=0) { //mike add:xmit fail!
1359 if (netif_queue_stopped(pDevice->dev))
1360 netif_wake_queue(pDevice->dev);
1363 spin_unlock_irq(&pDevice->lock);
1370 static unsigned const ethernet_polynomial = 0x04c11db7U;
1371 static inline u32 ether_crc(int length, unsigned char *data)
1375 while(--length >= 0) {
1376 unsigned char current_octet = *data++;
1378 for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
1380 ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
1386 //find out the start position of str2 from str1
1387 static unsigned char *kstrstr(const unsigned char *str1,
1388 const unsigned char *str2) {
1389 int str1_len = strlen(str1);
1390 int str2_len = strlen(str2);
1392 while (str1_len >= str2_len) {
1394 if(memcmp(str1,str2,str2_len)==0)
1395 return (unsigned char *) str1;
1401 static int Config_FileGetParameter(unsigned char *string,
1402 unsigned char *dest,
1403 unsigned char *source)
1405 unsigned char buf1[100];
1406 unsigned char buf2[100];
1407 unsigned char *start_p = NULL, *end_p = NULL, *tmp_p = NULL;
1411 strcat(buf1, string);
1413 source+=strlen(buf1);
1415 //find target string start point
1416 start_p = kstrstr(source,buf1);
1417 if (start_p == NULL)
1420 //check if current config line is marked by "#" ??
1421 for (ii = 1; ; ii++) {
1422 if (memcmp(start_p - ii, "\n", 1) == 0)
1424 if (memcmp(start_p - ii, "#", 1) == 0)
1428 //find target string end point
1429 end_p = kstrstr(start_p,"\n");
1430 if (end_p == NULL) { //can't find "\n",but don't care
1431 end_p=start_p+strlen(start_p); //no include "\n"
1435 memcpy(buf2,start_p,end_p-start_p); //get the tartget line
1436 buf2[end_p-start_p]='\0';
1439 start_p = kstrstr(buf2,"=");
1440 if (start_p == NULL)
1443 strcpy(buf1,start_p+1);
1447 while(*tmp_p != 0x00) {
1454 memcpy(dest,tmp_p,strlen(tmp_p));
1458 //if read fail,return NULL,or return data pointer;
1459 static unsigned char *Config_FileOperation(PSDevice pDevice)
1461 unsigned char *config_path = CONFIG_PATH;
1462 unsigned char *buffer = NULL;
1463 struct file *filp=NULL;
1464 mm_segment_t old_fs = get_fs();
1465 //int oldfsuid=0,oldfsgid=0;
1469 /* Can't do this anymore, so we rely on correct filesystem permissions:
1470 //Make sure a caller can read or write power as root
1471 oldfsuid=current->fsuid;
1472 oldfsgid=current->fsgid;
1478 filp = filp_open(config_path, O_RDWR, 0);
1480 printk("Config_FileOperation file Not exist\n");
1485 if(!(filp->f_op) || !(filp->f_op->read) ||!(filp->f_op->write)) {
1486 printk("file %s cann't readable or writable?\n",config_path);
1491 buffer = kmalloc(1024, GFP_KERNEL);
1493 printk("alllocate mem for file fail?\n");
1498 if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
1499 printk("read file error?\n");
1504 if(filp_close(filp,NULL))
1505 printk("Config_FileOperation:close file fail\n");
1511 current->fsuid=oldfsuid;
1512 current->fsgid=oldfsgid;
1523 //return --->-1:fail; >=0:successful
1524 static int Read_config_file(PSDevice pDevice) {
1526 unsigned char tmpbuffer[100];
1527 unsigned char *buffer = NULL;
1529 //init config setting
1530 pDevice->config_file.ZoneType = -1;
1531 pDevice->config_file.eAuthenMode = -1;
1532 pDevice->config_file.eEncryptionStatus = -1;
1534 buffer = Config_FileOperation(pDevice);
1535 if (buffer == NULL) {
1542 memset(tmpbuffer,0,sizeof(tmpbuffer));
1543 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer) ==TRUE) {
1544 if(memcmp(tmpbuffer,"USA",3)==0) {
1545 pDevice->config_file.ZoneType=ZoneType_USA;
1547 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
1548 pDevice->config_file.ZoneType=ZoneType_Japan;
1550 else if(memcmp(tmpbuffer,"EUROPE",6)==0) {
1551 pDevice->config_file.ZoneType=ZoneType_Europe;
1554 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
1560 //get other parameter
1562 memset(tmpbuffer,0,sizeof(tmpbuffer));
1563 if(Config_FileGetParameter("AUTHENMODE",tmpbuffer,buffer)==TRUE) {
1564 pDevice->config_file.eAuthenMode = (int) simple_strtol(tmpbuffer, NULL, 10);
1567 memset(tmpbuffer,0,sizeof(tmpbuffer));
1568 if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer,buffer)==TRUE) {
1569 pDevice->config_file.eEncryptionStatus= (int) simple_strtol(tmpbuffer, NULL, 10);
1578 static void device_set_multi(struct net_device *dev) {
1579 PSDevice pDevice = (PSDevice) netdev_priv(dev);
1580 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1583 struct netdev_hw_addr *ha;
1584 BYTE pbyData[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
1589 spin_lock_irq(&pDevice->lock);
1590 rc = CONTROLnsRequestIn(pDevice,
1593 MESSAGE_REQUEST_MACREG,
1597 if (rc == 0) pDevice->byRxMode = byTmpMode;
1599 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode in= %x\n", pDevice->byRxMode);
1601 if (dev->flags & IFF_PROMISC) { // Set promiscuous.
1602 DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
1603 // Unconditionally log net taps.
1604 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
1606 else if ((netdev_mc_count(dev) > pDevice->multicast_limit) ||
1607 (dev->flags & IFF_ALLMULTI)) {
1608 CONTROLnsRequestOut(pDevice,
1611 MESSAGE_REQUEST_MACREG,
1615 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1618 memset(mc_filter, 0, sizeof(mc_filter));
1619 netdev_for_each_mc_addr(ha, dev) {
1620 int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
1621 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
1623 for (ii = 0; ii < 4; ii++) {
1624 MACvWriteMultiAddr(pDevice, ii, *((PBYTE)&mc_filter[0] + ii));
1625 MACvWriteMultiAddr(pDevice, ii+ 4, *((PBYTE)&mc_filter[1] + ii));
1627 pDevice->byRxMode &= ~(RCR_UNICAST);
1628 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1631 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1632 // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
1633 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1634 pDevice->byRxMode &= ~(RCR_UNICAST);
1636 ControlvWriteByte(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_RCR, pDevice->byRxMode);
1637 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode out= %x\n", pDevice->byRxMode);
1638 spin_unlock_irq(&pDevice->lock);
1643 static struct net_device_stats *device_get_stats(struct net_device *dev) {
1644 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1646 return &pDevice->stats;
1650 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
1651 PSDevice pDevice = (PSDevice)netdev_priv(dev);
1652 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1654 //BOOL bCommit = FALSE;
1655 struct iwreq *wrq = (struct iwreq *) rq;
1658 if (pMgmt == NULL) {
1666 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
1673 case SIOCGIWNWID: //0x8b03 support
1674 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1675 rc = iwctl_giwnwid(dev, NULL, &(wrq->u.nwid), NULL);
1681 // Set frequency/channel
1683 rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
1686 // Get frequency/channel
1688 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
1691 // Set desired network name (ESSID)
1695 char essid[IW_ESSID_MAX_SIZE+1];
1696 if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
1700 if (copy_from_user(essid, wrq->u.essid.pointer,
1701 wrq->u.essid.length)) {
1705 rc = iwctl_siwessid(dev, NULL,
1706 &(wrq->u.essid), essid);
1711 // Get current network name (ESSID)
1715 char essid[IW_ESSID_MAX_SIZE+1];
1716 if (wrq->u.essid.pointer)
1717 rc = iwctl_giwessid(dev, NULL,
1718 &(wrq->u.essid), essid);
1719 if (copy_to_user(wrq->u.essid.pointer,
1721 wrq->u.essid.length) )
1728 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1732 // Get current Access Point (BSSID)
1734 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1738 // Set desired station name
1740 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
1744 // Get current station name
1746 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
1750 // Set the desired bit-rate
1752 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1755 // Get the current bit-rate
1758 rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1761 // Set the desired RTS threshold
1764 rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
1767 // Get the current RTS threshold
1770 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
1773 // Set the desired fragmentation threshold
1776 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
1779 // Get the current fragmentation threshold
1782 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
1785 // Set mode of operation
1787 rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
1790 // Get mode of operation
1792 rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
1795 // Set WEP keys and mode
1798 char abyKey[WLAN_WEP232_KEYLEN];
1800 if (wrq->u.encoding.pointer) {
1803 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
1807 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
1808 if (copy_from_user(abyKey,
1809 wrq->u.encoding.pointer,
1810 wrq->u.encoding.length)) {
1814 } else if (wrq->u.encoding.length != 0) {
1818 rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
1822 // Get the WEP keys and mode
1825 if (!capable(CAP_NET_ADMIN)) {
1830 char abyKey[WLAN_WEP232_KEYLEN];
1832 rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
1834 if (wrq->u.encoding.pointer) {
1835 if (copy_to_user(wrq->u.encoding.pointer,
1837 wrq->u.encoding.length))
1843 // Get the current Tx-Power
1845 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
1850 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
1856 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
1861 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
1864 // Get range of parameters
1868 struct iw_range range;
1870 rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *) &range);
1871 if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
1879 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
1885 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
1891 rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
1895 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
1901 char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
1903 if (wrq->u.data.pointer) {
1904 rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
1906 if (copy_to_user(wrq->u.data.pointer,
1908 (wrq->u.data.length * (sizeof(struct sockaddr) + sizeof(struct iw_quality)))
1921 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
1928 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
1932 #endif // WIRELESS_SPY
1935 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
1938 if(wrq->u.data.pointer) {
1939 wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
1941 if(copy_to_user(wrq->u.data.pointer,
1942 (u_char *) iwctl_private_args,
1943 sizeof(iwctl_private_args)))
1950 //2008-0409-07, <Add> by Einsn Liu
1951 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1953 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH \n");
1954 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
1958 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
1959 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
1963 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
1964 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1968 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
1969 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1972 case SIOCSIWENCODEEXT:
1974 char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
1975 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
1976 if(wrq->u.encoding.pointer){
1977 memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1);
1978 if(wrq->u.encoding.length > (sizeof(struct iw_encode_ext)+ MAX_KEY_LEN)){
1982 if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
1986 }else if(wrq->u.encoding.length != 0){
1990 rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
1994 case SIOCGIWENCODEEXT:
1995 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
1996 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
2000 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
2001 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2004 #endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2005 //End Add -- //2008-0409-07, <Add> by Einsn Liu
2007 case IOCTL_CMD_TEST:
2009 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2015 pReq = (PSCmdRequest)rq;
2017 //20080130-01,<Remark> by Mike Liu
2018 // if(pDevice->bLinkPass==TRUE)
2019 pReq->wResult = MAGIC_CODE; //Linking status:0x3142
2020 //20080130-02,<Remark> by Mike Liu
2022 // pReq->wResult = MAGIC_CODE+1; //disconnect status:0x3143
2026 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
2027 (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
2035 if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
2038 rc = private_ioctl(pDevice, rq);
2039 clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
2042 case IOCTL_CMD_HOSTAPD:
2044 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2051 rc = vt6656_hostap_ioctl(pDevice, &wrq->u.data);
2056 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2063 rc = wpa_ioctl(pDevice, &wrq->u.data);
2067 return ethtool_ioctl(dev, (void *) rq->ifr_data);
2068 // All other calls are currently unsupported
2072 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
2077 if (pDevice->bCommit) {
2078 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2079 netif_stop_queue(pDevice->dev);
2080 spin_lock_irq(&pDevice->lock);
2081 bScheduleCommand((void *) pDevice, WLAN_CMD_RUN_AP, NULL);
2082 spin_unlock_irq(&pDevice->lock);
2085 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
2086 spin_lock_irq(&pDevice->lock);
2087 //2007-1121-01<Modify>by EinsnLiu
2088 if (pDevice->bLinkPass &&
2089 memcmp(pMgmt->abyCurrSSID,pMgmt->abyDesireSSID,WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN)) {
2090 bScheduleCommand((void *) pDevice, WLAN_CMD_DISASSOCIATE, NULL);
2092 pDevice->bLinkPass = FALSE;
2093 pMgmt->eCurrState = WMAC_STATE_IDLE;
2094 memset(pMgmt->abyCurrBSSID, 0, 6);
2096 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
2098 netif_stop_queue(pDevice->dev);
2099 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2100 pMgmt->eScanType = WMAC_SCAN_ACTIVE;
2101 if (!pDevice->bWPASuppWextEnabled)
2103 bScheduleCommand((void *) pDevice,
2104 WLAN_CMD_BSSID_SCAN,
2105 pMgmt->abyDesireSSID);
2106 bScheduleCommand((void *) pDevice,
2109 spin_unlock_irq(&pDevice->lock);
2111 pDevice->bCommit = FALSE;
2119 static int ethtool_ioctl(struct net_device *dev, void *useraddr)
2123 if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd)))
2127 case ETHTOOL_GDRVINFO: {
2128 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
2129 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
2130 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
2131 if (copy_to_user(useraddr, &info, sizeof(info)))
2142 /*------------------------------------------------------------------*/
2144 MODULE_DEVICE_TABLE(usb, vt6656_table);
2146 static struct usb_driver vt6656_driver = {
2147 .name = DEVICE_NAME,
2148 .probe = vt6656_probe,
2149 .disconnect = vt6656_disconnect,
2150 .id_table = vt6656_table,
2152 .suspend = vt6656_suspend,
2153 .resume = vt6656_resume,
2154 #endif /* CONFIG_PM */
2157 static int __init vt6656_init_module(void)
2159 printk(KERN_NOTICE DEVICE_FULL_DRV_NAM " " DEVICE_VERSION);
2160 return usb_register(&vt6656_driver);
2163 static void __exit vt6656_cleanup_module(void)
2165 usb_deregister(&vt6656_driver);
2168 module_init(vt6656_init_module);
2169 module_exit(vt6656_cleanup_module);