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