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 UCHAR *Config_FileOperation(PSDevice pDevice);
281 static int Config_FileGetParameter(UCHAR *string, UCHAR *dest,UCHAR *source);
283 //2008-0714<Add>by Mike Liu
284 static BOOL device_release_WPADEV(PSDevice pDevice);
286 static void usb_device_reset(PSDevice pDevice);
290 /*--------------------- Export Variables --------------------------*/
292 /*--------------------- Export Functions --------------------------*/
296 device_set_options(PSDevice pDevice) {
298 BYTE abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
299 BYTE abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
300 u8 abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
302 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
303 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
304 memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, ETH_ALEN);
306 pDevice->cbTD = TX_DESC_DEF0;
307 pDevice->cbRD = RX_DESC_DEF0;
308 pDevice->uChannel = CHANNEL_DEF;
309 pDevice->wRTSThreshold = RTS_THRESH_DEF;
310 pDevice->wFragmentationThreshold = FRAG_THRESH_DEF;
311 pDevice->byShortRetryLimit = SHORT_RETRY_DEF;
312 pDevice->byLongRetryLimit = LONG_RETRY_DEF;
313 pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME;
314 pDevice->byShortPreamble = PREAMBLE_TYPE_DEF;
315 pDevice->ePSMode = PS_MODE_DEF;
316 pDevice->b11hEnable = X80211h_MODE_DEF;
317 pDevice->eOPMode = OP_MODE_DEF;
318 pDevice->uConnectionRate = DATA_RATE_DEF;
319 if (pDevice->uConnectionRate < RATE_AUTO) pDevice->bFixRate = TRUE;
320 pDevice->byBBType = BBP_TYPE_DEF;
321 pDevice->byPacketType = pDevice->byBBType;
322 pDevice->byAutoFBCtrl = AUTO_FB_0;
323 pDevice->bUpdateBBVGA = TRUE;
324 pDevice->byFOETuning = 0;
325 pDevice->byAutoPwrTunning = 0;
326 pDevice->wCTSDuration = 0;
327 pDevice->byPreambleType = 0;
328 pDevice->bExistSWNetAddr = FALSE;
329 // pDevice->bDiversityRegCtlON = TRUE;
330 pDevice->bDiversityRegCtlON = FALSE;
334 static void device_init_diversity_timer(PSDevice pDevice)
336 init_timer(&pDevice->TimerSQ3Tmax1);
337 pDevice->TimerSQ3Tmax1.data = (ULONG)pDevice;
338 pDevice->TimerSQ3Tmax1.function = (TimerFunction)TimerSQ3CallBack;
339 pDevice->TimerSQ3Tmax1.expires = RUN_AT(HZ);
341 init_timer(&pDevice->TimerSQ3Tmax2);
342 pDevice->TimerSQ3Tmax2.data = (ULONG)pDevice;
343 pDevice->TimerSQ3Tmax2.function = (TimerFunction)TimerSQ3CallBack;
344 pDevice->TimerSQ3Tmax2.expires = RUN_AT(HZ);
346 init_timer(&pDevice->TimerSQ3Tmax3);
347 pDevice->TimerSQ3Tmax3.data = (ULONG)pDevice;
348 pDevice->TimerSQ3Tmax3.function = (TimerFunction)TimerSQ3Tmax3CallBack;
349 pDevice->TimerSQ3Tmax3.expires = RUN_AT(HZ);
356 // Initialiation of MAC & BBP registers
359 static BOOL device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType)
361 u8 abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
362 u8 abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
363 u8 abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
366 CMD_CARD_INIT sInitCmd;
367 NTSTATUS ntStatus = STATUS_SUCCESS;
368 RSP_CARD_INIT sInitRsp;
369 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
371 BYTE byCalibTXIQ = 0;
372 BYTE byCalibTXDC = 0;
373 BYTE byCalibRXIQ = 0;
375 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "---->INIbInitAdapter. [%d][%d]\n", InitType, pDevice->byPacketType);
376 spin_lock_irq(&pDevice->lock);
377 if (InitType == DEVICE_INIT_COLD) {
378 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
379 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
380 memcpy(pDevice->abySNAP_Bridgetunnel,
381 abySNAP_Bridgetunnel,
384 if ( !FIRMWAREbCheckVersion(pDevice) ) {
385 if (FIRMWAREbDownload(pDevice) == TRUE) {
386 if (FIRMWAREbBrach2Sram(pDevice) == FALSE) {
387 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbBrach2Sram fail \n");
388 spin_unlock_irq(&pDevice->lock);
393 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbDownload fail \n");
394 spin_unlock_irq(&pDevice->lock);
399 if ( !BBbVT3184Init(pDevice) ) {
400 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" BBbVT3184Init fail \n");
401 spin_unlock_irq(&pDevice->lock);
406 sInitCmd.byInitClass = (BYTE)InitType;
407 sInitCmd.bExistSWNetAddr = (BYTE) pDevice->bExistSWNetAddr;
409 sInitCmd.bySWNetAddr[ii] = pDevice->abyCurrentNetAddr[ii];
410 sInitCmd.byShortRetryLimit = pDevice->byShortRetryLimit;
411 sInitCmd.byLongRetryLimit = pDevice->byLongRetryLimit;
413 //issue Card_init command to device
414 ntStatus = CONTROLnsRequestOut(pDevice,
415 MESSAGE_TYPE_CARDINIT,
418 sizeof(CMD_CARD_INIT),
419 (PBYTE) &(sInitCmd));
421 if ( ntStatus != STATUS_SUCCESS ) {
422 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Issue Card init fail \n");
423 spin_unlock_irq(&pDevice->lock);
426 if (InitType == DEVICE_INIT_COLD) {
428 ntStatus = CONTROLnsRequestIn(pDevice,MESSAGE_TYPE_INIT_RSP,0,0,sizeof(RSP_CARD_INIT), (PBYTE) &(sInitRsp));
430 if (ntStatus != STATUS_SUCCESS) {
431 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Cardinit request in status fail!\n");
432 spin_unlock_irq(&pDevice->lock);
436 //Local ID for AES functions
437 ntStatus = CONTROLnsRequestIn(pDevice,
440 MESSAGE_REQUEST_MACREG,
442 &pDevice->byLocalID);
444 if ( ntStatus != STATUS_SUCCESS ) {
445 spin_unlock_irq(&pDevice->lock);
449 // Do MACbSoftwareReset in MACvInitialize
451 pDevice->bCCK = TRUE;
452 pDevice->bProtectMode = FALSE; //Only used in 11g type, sync with ERP IE
453 pDevice->bNonERPPresent = FALSE;
454 pDevice->bBarkerPreambleMd = FALSE;
455 if ( pDevice->bFixRate ) {
456 pDevice->wCurrentRate = (WORD) pDevice->uConnectionRate;
458 if ( pDevice->byBBType == BB_TYPE_11B )
459 pDevice->wCurrentRate = RATE_11M;
461 pDevice->wCurrentRate = RATE_54M;
464 CHvInitChannelTable(pDevice);
466 pDevice->byTopOFDMBasicRate = RATE_24M;
467 pDevice->byTopCCKBasicRate = RATE_1M;
468 pDevice->byRevId = 0; //Target to IF pin while programming to RF chip.
469 pDevice->byCurPwr = 0xFF;
471 pDevice->byCCKPwr = pDevice->abyEEPROM[EEP_OFS_PWR_CCK];
472 pDevice->byOFDMPwrG = pDevice->abyEEPROM[EEP_OFS_PWR_OFDMG];
474 for (ii=0;ii<14;ii++) {
475 pDevice->abyCCKPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_CCK_PWR_TBL];
476 if (pDevice->abyCCKPwrTbl[ii] == 0)
477 pDevice->abyCCKPwrTbl[ii] = pDevice->byCCKPwr;
478 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_OFDM_PWR_TBL];
479 if (pDevice->abyOFDMPwrTbl[ii] == 0)
480 pDevice->abyOFDMPwrTbl[ii] = pDevice->byOFDMPwrG;
483 //original zonetype is USA,but customize zonetype is europe,
484 // then need recover 12,13 ,14 channel with 11 channel
485 if(((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) ||
486 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe))&&
487 (pDevice->byOriginalZonetype == ZoneType_USA)) {
488 for(ii=11;ii<14;ii++) {
489 pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
490 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];
494 //{{ RobertYu: 20041124
495 pDevice->byOFDMPwrA = 0x34; // same as RFbMA2829SelectChannel
496 // Load OFDM A Power Table
497 for (ii=0;ii<CB_MAX_CHANNEL_5G;ii++) { //RobertYu:20041224, bug using CB_MAX_CHANNEL
498 pDevice->abyOFDMAPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_OFDMA_PWR_TBL];
499 if (pDevice->abyOFDMAPwrTbl[ii] == 0)
500 pDevice->abyOFDMAPwrTbl[ii] = pDevice->byOFDMPwrA;
504 byAntenna = pDevice->abyEEPROM[EEP_OFS_ANTENNA];
505 if (byAntenna & EEP_ANTINV)
506 pDevice->bTxRxAntInv = TRUE;
508 pDevice->bTxRxAntInv = FALSE;
510 byAntenna &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
512 if (byAntenna == 0) // if not set default is All
513 byAntenna = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
515 if (byAntenna == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
516 pDevice->byAntennaCount = 2;
517 pDevice->byTxAntennaMode = ANT_B;
518 pDevice->dwTxAntennaSel = 1;
519 pDevice->dwRxAntennaSel = 1;
520 if (pDevice->bTxRxAntInv == TRUE)
521 pDevice->byRxAntennaMode = ANT_A;
523 pDevice->byRxAntennaMode = ANT_B;
525 if (pDevice->bDiversityRegCtlON)
526 pDevice->bDiversityEnable = TRUE;
528 pDevice->bDiversityEnable = FALSE;
530 pDevice->bDiversityEnable = FALSE;
531 pDevice->byAntennaCount = 1;
532 pDevice->dwTxAntennaSel = 0;
533 pDevice->dwRxAntennaSel = 0;
534 if (byAntenna & EEP_ANTENNA_AUX) {
535 pDevice->byTxAntennaMode = ANT_A;
536 if (pDevice->bTxRxAntInv == TRUE)
537 pDevice->byRxAntennaMode = ANT_B;
539 pDevice->byRxAntennaMode = ANT_A;
541 pDevice->byTxAntennaMode = ANT_B;
542 if (pDevice->bTxRxAntInv == TRUE)
543 pDevice->byRxAntennaMode = ANT_A;
545 pDevice->byRxAntennaMode = ANT_B;
548 pDevice->ulDiversityNValue = 100*255;
549 pDevice->ulDiversityMValue = 100*16;
551 pDevice->byTMax2 = 4;
552 pDevice->ulSQ3TH = 0;
553 pDevice->byTMax3 = 64;
554 // -----------------------------------------------------------------
556 //Get Auto Fall Back Type
557 pDevice->byAutoFBCtrl = AUTO_FB_0;
560 pDevice->uScanTime = WLAN_SCAN_MINITIME;
563 //pDevice->NetworkType = Ndis802_11Automode;
564 pDevice->eConfigPHYMode = PHY_TYPE_AUTO;
565 pDevice->byBBType = BB_TYPE_11G;
567 // initialize BBP registers
568 pDevice->ulTxPower = 25;
571 pDevice->byMinChannel = 1;
572 pDevice->byMaxChannel = CB_MAX_CHANNEL;
575 pDevice->byRFType = sInitRsp.byRFType;
577 if ((pDevice->byRFType & RF_EMU) != 0) {
578 // force change RevID for VT3253 emu
579 pDevice->byRevId = 0x80;
582 // Load EEPROM calibrated vt3266 parameters
583 if (pDevice->byRFType == RF_VT3226D0) {
584 if((pDevice->abyEEPROM[EEP_OFS_MAJOR_VER] == 0x1) &&
585 (pDevice->abyEEPROM[EEP_OFS_MINOR_VER] >= 0x4)) {
586 byCalibTXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_IQ];
587 byCalibTXDC = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_DC];
588 byCalibRXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_RX_IQ];
589 if( (byCalibTXIQ || byCalibTXDC || byCalibRXIQ) ) {
590 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFF, 0x03); // CR255, Set BB to support TX/RX IQ and DC compensation Mode
591 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFB, byCalibTXIQ); // CR251, TX I/Q Imbalance Calibration
592 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFC, byCalibTXDC); // CR252, TX DC-Offset Calibration
593 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFD, byCalibRXIQ); // CR253, RX I/Q Imbalance Calibration
595 // turn off BB Calibration compensation
596 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFF, 0x0); // CR255
600 pMgmt->eScanType = WMAC_SCAN_PASSIVE;
601 pMgmt->uCurrChannel = pDevice->uChannel;
602 pMgmt->uIBSSChannel = pDevice->uChannel;
603 CARDbSetMediaChannel(pDevice, pMgmt->uCurrChannel);
605 // get Permanent network address
606 memcpy(pDevice->abyPermanentNetAddr,&(sInitRsp.byNetAddr[0]),6);
607 memcpy(pDevice->abyCurrentNetAddr,
608 pDevice->abyPermanentNetAddr,
611 // if exist SW network address, use SW network address.
613 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Network address = %02x-%02x-%02x=%02x-%02x-%02x\n",
614 pDevice->abyCurrentNetAddr[0],
615 pDevice->abyCurrentNetAddr[1],
616 pDevice->abyCurrentNetAddr[2],
617 pDevice->abyCurrentNetAddr[3],
618 pDevice->abyCurrentNetAddr[4],
619 pDevice->abyCurrentNetAddr[5]);
624 // Set BB and packet type at the same time.
625 // Set Short Slot Time, xIFS, and RSPINF.
626 if (pDevice->byBBType == BB_TYPE_11A) {
627 CARDbAddBasicRate(pDevice, RATE_6M);
628 pDevice->bShortSlotTime = TRUE;
630 CARDbAddBasicRate(pDevice, RATE_1M);
631 pDevice->bShortSlotTime = FALSE;
633 BBvSetShortSlotTime(pDevice);
634 CARDvSetBSSMode(pDevice);
636 if (pDevice->bUpdateBBVGA) {
637 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
638 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
639 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
642 pDevice->byRadioCtl = pDevice->abyEEPROM[EEP_OFS_RADIOCTL];
643 pDevice->bHWRadioOff = FALSE;
644 if ( (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) != 0 ) {
645 ntStatus = CONTROLnsRequestIn(pDevice,
648 MESSAGE_REQUEST_MACREG,
652 if ( ntStatus != STATUS_SUCCESS ) {
653 spin_unlock_irq(&pDevice->lock);
656 if ( (byTmp & GPIO3_DATA) == 0 ) {
657 pDevice->bHWRadioOff = TRUE;
658 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
660 MACvRegBitsOff(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
661 pDevice->bHWRadioOff = FALSE;
664 } //EEP_RADIOCTL_ENABLE
666 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_TMLEN,0x38);
667 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
668 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL0,0x01);
670 if ((pDevice->bHWRadioOff == TRUE) || (pDevice->bRadioControlOff == TRUE)) {
671 CARDbRadioPowerOff(pDevice);
673 CARDbRadioPowerOn(pDevice);
676 spin_unlock_irq(&pDevice->lock);
677 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"<----INIbInitAdapter Exit\n");
681 static BOOL device_release_WPADEV(PSDevice pDevice)
683 viawget_wpa_header *wpahdr;
685 // wait_queue_head_t Set_wait;
686 //send device close to wpa_supplicnat layer
687 if (pDevice->bWPADEVUp==TRUE) {
688 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
689 wpahdr->type = VIAWGET_DEVICECLOSE_MSG;
690 wpahdr->resp_ie_len = 0;
691 wpahdr->req_ie_len = 0;
692 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
693 pDevice->skb->dev = pDevice->wpadev;
694 skb_reset_mac_header(pDevice->skb);
695 pDevice->skb->pkt_type = PACKET_HOST;
696 pDevice->skb->protocol = htons(ETH_P_802_2);
697 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
698 netif_rx(pDevice->skb);
699 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
701 //wait release WPADEV
702 // init_waitqueue_head(&Set_wait);
703 // wait_event_timeout(Set_wait, ((pDevice->wpadev==NULL)&&(pDevice->skb == NULL)),5*HZ); //1s wait
704 while(pDevice->bWPADEVUp==TRUE) {
705 set_current_state(TASK_UNINTERRUPTIBLE);
706 schedule_timeout (HZ/20); //wait 50ms
715 #ifdef CONFIG_PM /* Minimal support for suspend and resume */
717 static int vt6656_suspend(struct usb_interface *intf, pm_message_t message)
719 PSDevice pDevice = usb_get_intfdata(intf);
720 struct net_device *dev = pDevice->dev;
722 printk("VNTWUSB Suspend Start======>\n");
724 if(pDevice->flags & DEVICE_FLAGS_OPENED)
728 usb_put_dev(interface_to_usbdev(intf));
732 static int vt6656_resume(struct usb_interface *intf)
734 PSDevice pDevice = usb_get_intfdata(intf);
735 struct net_device *dev = pDevice->dev;
737 printk("VNTWUSB Resume Start======>\n");
739 usb_get_dev(interface_to_usbdev(intf));
740 if(!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
741 if(device_open(dev)!=0)
742 printk("VNTWUSB Resume Start======>open fail\n");
748 #endif /* CONFIG_PM */
750 static const struct net_device_ops device_netdev_ops = {
751 .ndo_open = device_open,
752 .ndo_stop = device_close,
753 .ndo_do_ioctl = device_ioctl,
754 .ndo_get_stats = device_get_stats,
755 .ndo_start_xmit = device_xmit,
756 .ndo_set_multicast_list = device_set_multi,
761 vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id)
763 u8 fake_mac[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
764 struct usb_device *udev = interface_to_usbdev(intf);
766 struct net_device *netdev = NULL;
767 PSDevice pDevice = NULL;
770 printk(KERN_NOTICE "%s Ver. %s\n",DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
771 printk(KERN_NOTICE "Copyright (c) 2004 VIA Networking Technologies, Inc.\n");
773 udev = usb_get_dev(udev);
775 netdev = alloc_etherdev(sizeof(DEVICE_INFO));
777 if (netdev == NULL) {
778 printk(KERN_ERR DEVICE_NAME ": allocate net device failed \n");
783 pDevice = netdev_priv(netdev);
784 memset(pDevice, 0, sizeof(DEVICE_INFO));
786 pDevice->dev = netdev;
789 // Set initial settings
790 device_set_options(pDevice);
791 spin_lock_init(&pDevice->lock);
793 pDevice->tx_80211 = device_dma0_tx_80211;
794 pDevice->sMgmtObj.pAdapter = (void *)pDevice;
796 netdev->netdev_ops = &device_netdev_ops;
798 netdev->wireless_handlers = (struct iw_handler_def *)&iwctl_handler_def;
800 //2008-0623-01<Remark>by MikeLiu
801 //2007-0821-01<Add>by MikeLiu
802 usb_set_intfdata(intf, pDevice);
803 SET_NETDEV_DEV(netdev, &intf->dev);
804 memcpy(pDevice->dev->dev_addr, fake_mac, ETH_ALEN);
805 rc = register_netdev(netdev);
807 printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
813 //2008-07-21-01<Add>by MikeLiu
816 if(wpa_set_wpadev(pDevice, 1)!=0) {
817 printk("Fail to Register WPADEV?\n");
818 unregister_netdev(pDevice->dev);
823 usb_device_reset(pDevice);
827 union iwreq_data wrqu;
828 memset(&wrqu, 0, sizeof(wrqu));
829 wrqu.data.flags = RT_INSMOD_EVENT_FLAG;
830 wrqu.data.length =IFNAMSIZ;
831 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, pDevice->dev->name);
839 //2008-0922-01<Add>by MikeLiu, decrease usb counter.
846 static void device_free_tx_bufs(PSDevice pDevice)
848 PUSB_SEND_CONTEXT pTxContext;
851 for (ii = 0; ii < pDevice->cbTD; ii++) {
853 pTxContext = pDevice->apTD[ii];
855 if (pTxContext->pUrb) {
856 usb_kill_urb(pTxContext->pUrb);
857 usb_free_urb(pTxContext->pUrb);
866 static void device_free_rx_bufs(PSDevice pDevice)
871 for (ii = 0; ii < pDevice->cbRD; ii++) {
873 pRCB = pDevice->apRCB[ii];
876 usb_kill_urb(pRCB->pUrb);
877 usb_free_urb(pRCB->pUrb);
881 dev_kfree_skb(pRCB->skb);
883 if (pDevice->pRCBMem)
884 kfree(pDevice->pRCBMem);
889 //2007-1107-02<Add>by MikeLiu
890 static void usb_device_reset(PSDevice pDevice)
893 status = usb_reset_device(pDevice->usb);
895 printk("usb_device_reset fail status=%d\n",status);
899 static void device_free_int_bufs(PSDevice pDevice)
901 if (pDevice->intBuf.pDataBuf != NULL)
902 kfree(pDevice->intBuf.pDataBuf);
907 static BOOL device_alloc_bufs(PSDevice pDevice) {
909 PUSB_SEND_CONTEXT pTxContext;
914 for (ii = 0; ii < pDevice->cbTD; ii++) {
916 pTxContext = kmalloc(sizeof(USB_SEND_CONTEXT), GFP_KERNEL);
917 if (pTxContext == NULL) {
918 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate tx usb context failed\n", pDevice->dev->name);
921 pDevice->apTD[ii] = pTxContext;
922 pTxContext->pDevice = (void *) pDevice;
924 pTxContext->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
925 if (pTxContext->pUrb == NULL) {
926 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "alloc tx urb failed\n");
929 pTxContext->bBoolInUse = FALSE;
933 pDevice->pRCBMem = kmalloc((sizeof(RCB) * pDevice->cbRD), GFP_KERNEL);
934 if (pDevice->pRCBMem == NULL) {
935 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : alloc rx usb context failed\n", pDevice->dev->name);
940 pDevice->FirstRecvFreeList = NULL;
941 pDevice->LastRecvFreeList = NULL;
942 pDevice->FirstRecvMngList = NULL;
943 pDevice->LastRecvMngList = NULL;
944 pDevice->NumRecvFreeList = 0;
945 memset(pDevice->pRCBMem, 0, (sizeof(RCB) * pDevice->cbRD));
946 pRCB = (PRCB) pDevice->pRCBMem;
948 for (ii = 0; ii < pDevice->cbRD; ii++) {
950 pDevice->apRCB[ii] = pRCB;
951 pRCB->pDevice = (void *) pDevice;
953 pRCB->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
955 if (pRCB->pUrb == NULL) {
956 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx urb\n");
959 pRCB->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
960 if (pRCB->skb == NULL) {
961 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx skb\n");
964 pRCB->skb->dev = pDevice->dev;
965 pRCB->bBoolInUse = FALSE;
966 EnqueueRCB(pDevice->FirstRecvFreeList, pDevice->LastRecvFreeList, pRCB);
967 pDevice->NumRecvFreeList++;
972 pDevice->pControlURB = usb_alloc_urb(0, GFP_ATOMIC);
973 if (pDevice->pControlURB == NULL) {
974 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc control urb\n");
978 pDevice->pInterruptURB = usb_alloc_urb(0, GFP_ATOMIC);
979 if (pDevice->pInterruptURB == NULL) {
980 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int urb\n");
981 usb_kill_urb(pDevice->pControlURB);
982 usb_free_urb(pDevice->pControlURB);
986 pDevice->intBuf.pDataBuf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL);
987 if (pDevice->intBuf.pDataBuf == NULL) {
988 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int buf\n");
989 usb_kill_urb(pDevice->pControlURB);
990 usb_kill_urb(pDevice->pInterruptURB);
991 usb_free_urb(pDevice->pControlURB);
992 usb_free_urb(pDevice->pInterruptURB);
999 device_free_rx_bufs(pDevice);
1002 device_free_tx_bufs(pDevice);
1010 static BOOL device_init_defrag_cb(PSDevice pDevice) {
1012 PSDeFragControlBlock pDeF;
1014 /* Init the fragment ctl entries */
1015 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1016 pDeF = &(pDevice->sRxDFCB[i]);
1017 if (!device_alloc_frag_buf(pDevice, pDeF)) {
1018 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
1019 pDevice->dev->name);
1023 pDevice->cbDFCB = CB_MAX_RX_FRAG;
1024 pDevice->cbFreeDFCB = pDevice->cbDFCB;
1028 device_free_frag_bufs(pDevice);
1034 static void device_free_frag_bufs(PSDevice pDevice) {
1035 PSDeFragControlBlock pDeF;
1038 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1040 pDeF = &(pDevice->sRxDFCB[i]);
1043 dev_kfree_skb(pDeF->skb);
1049 BOOL device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {
1051 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1052 if (pDeF->skb == NULL)
1055 pDeF->skb->dev = pDevice->dev;
1061 /*-----------------------------------------------------------------*/
1063 static int device_open(struct net_device *dev) {
1064 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1066 #ifdef WPA_SM_Transtatus
1067 extern SWPAResult wpa_Result;
1068 memset(wpa_Result.ifname,0,sizeof(wpa_Result.ifname));
1069 wpa_Result.proto = 0;
1070 wpa_Result.key_mgmt = 0;
1071 wpa_Result.eap_type = 0;
1072 wpa_Result.authenticated = FALSE;
1073 pDevice->fWPA_Authened = FALSE;
1076 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_open...\n");
1079 pDevice->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS;
1081 if (device_alloc_bufs(pDevice) == FALSE) {
1082 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_alloc_bufs fail... \n");
1086 if (device_init_defrag_cb(pDevice)== FALSE) {
1087 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Initial defragement cb fail \n");
1091 MP_CLEAR_FLAG(pDevice, fMP_DISCONNECTED);
1092 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
1093 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
1094 MP_SET_FLAG(pDevice, fMP_POST_READS);
1095 MP_SET_FLAG(pDevice, fMP_POST_WRITES);
1098 Read_config_file(pDevice);
1100 if (device_init_registers(pDevice, DEVICE_INIT_COLD) == FALSE) {
1101 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " init register fail\n");
1105 device_set_multi(pDevice->dev);
1106 // Init for Key Management
1108 KeyvInitTable(pDevice,&pDevice->sKey);
1109 memcpy(pDevice->sMgmtObj.abyMACAddr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1110 memcpy(pDevice->dev->dev_addr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1111 pDevice->bStopTx0Pkt = FALSE;
1112 pDevice->bStopDataPkt = FALSE;
1113 pDevice->bRoaming = FALSE; //DavidWang
1114 pDevice->bIsRoaming = FALSE;//DavidWang
1115 pDevice->bEnableRoaming = FALSE;
1116 if (pDevice->bDiversityRegCtlON) {
1117 device_init_diversity_timer(pDevice);
1120 vMgrObjectInit(pDevice);
1121 tasklet_init(&pDevice->RxMngWorkItem, (void *)RXvMngWorkItem, (unsigned long)pDevice);
1122 tasklet_init(&pDevice->ReadWorkItem, (void *)RXvWorkItem, (unsigned long)pDevice);
1123 tasklet_init(&pDevice->EventWorkItem, (void *)INTvWorkItem, (unsigned long)pDevice);
1124 add_timer(&(pDevice->sMgmtObj.sTimerSecondCallback));
1125 pDevice->int_interval = 100; //Max 100 microframes.
1126 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1128 pDevice->bIsRxWorkItemQueued = TRUE;
1129 pDevice->fKillEventPollingThread = FALSE;
1130 pDevice->bEventAvailable = FALSE;
1132 pDevice->bWPADEVUp = FALSE;
1133 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1134 pDevice->bwextstep0 = FALSE;
1135 pDevice->bwextstep1 = FALSE;
1136 pDevice->bwextstep2 = FALSE;
1137 pDevice->bwextstep3 = FALSE;
1138 pDevice->bWPASuppWextEnabled = FALSE;
1140 pDevice->byReAssocCount = 0;
1142 RXvWorkItem(pDevice);
1143 INTvWorkItem(pDevice);
1145 // Patch: if WEP key already set by iwconfig but device not yet open
1146 if ((pDevice->bEncryptionEnable == TRUE) && (pDevice->bTransmitKey == TRUE)) {
1147 spin_lock_irq(&pDevice->lock);
1148 KeybSetDefaultKey( pDevice,
1150 pDevice->byKeyIndex | (1 << 31),
1151 pDevice->uKeyLength,
1156 spin_unlock_irq(&pDevice->lock);
1157 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1160 if (pDevice->sMgmtObj.eConfigMode == WMAC_CONFIG_AP) {
1161 bScheduleCommand((void *) pDevice, WLAN_CMD_RUN_AP, NULL);
1164 //mike:mark@2008-11-10
1165 bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1166 /* bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL); */
1170 netif_stop_queue(pDevice->dev);
1171 pDevice->flags |= DEVICE_FLAGS_OPENED;
1175 union iwreq_data wrqu;
1176 memset(&wrqu, 0, sizeof(wrqu));
1177 wrqu.data.flags = RT_UPDEV_EVENT_FLAG;
1178 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1182 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
1186 device_free_frag_bufs(pDevice);
1188 device_free_rx_bufs(pDevice);
1189 device_free_tx_bufs(pDevice);
1190 device_free_int_bufs(pDevice);
1191 usb_kill_urb(pDevice->pControlURB);
1192 usb_kill_urb(pDevice->pInterruptURB);
1193 usb_free_urb(pDevice->pControlURB);
1194 usb_free_urb(pDevice->pInterruptURB);
1196 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open fail.. \n");
1202 static int device_close(struct net_device *dev) {
1203 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1204 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1208 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close1 \n");
1209 if (pDevice == NULL)
1214 union iwreq_data wrqu;
1215 memset(&wrqu, 0, sizeof(wrqu));
1216 wrqu.data.flags = RT_DOWNDEV_EVENT_FLAG;
1217 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1221 //2007-1121-02<Add>by EinsnLiu
1222 if (pDevice->bLinkPass) {
1223 bScheduleCommand((void *) pDevice, WLAN_CMD_DISASSOCIATE, NULL);
1228 //2008-0714-01<Add>by MikeLiu
1229 device_release_WPADEV(pDevice);
1231 memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
1232 pMgmt->bShareKeyAlgorithm = FALSE;
1233 pDevice->bEncryptionEnable = FALSE;
1234 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1235 spin_lock_irq(&pDevice->lock);
1236 for(uu=0;uu<MAX_KEY_TABLE;uu++)
1237 MACvDisableKeyEntry(pDevice,uu);
1238 spin_unlock_irq(&pDevice->lock);
1240 if ((pDevice->flags & DEVICE_FLAGS_UNPLUG) == FALSE) {
1241 MACbShutdown(pDevice);
1243 netif_stop_queue(pDevice->dev);
1244 MP_SET_FLAG(pDevice, fMP_DISCONNECTED);
1245 MP_CLEAR_FLAG(pDevice, fMP_POST_WRITES);
1246 MP_CLEAR_FLAG(pDevice, fMP_POST_READS);
1247 pDevice->fKillEventPollingThread = TRUE;
1248 del_timer(&pDevice->sTimerCommand);
1249 del_timer(&pMgmt->sTimerSecondCallback);
1251 //2007-0115-02<Add>by MikeLiu
1253 del_timer(&pDevice->sTimerTxData);
1256 if (pDevice->bDiversityRegCtlON) {
1257 del_timer(&pDevice->TimerSQ3Tmax1);
1258 del_timer(&pDevice->TimerSQ3Tmax2);
1259 del_timer(&pDevice->TimerSQ3Tmax3);
1261 tasklet_kill(&pDevice->RxMngWorkItem);
1262 tasklet_kill(&pDevice->ReadWorkItem);
1263 tasklet_kill(&pDevice->EventWorkItem);
1265 pDevice->bRoaming = FALSE; //DavidWang
1266 pDevice->bIsRoaming = FALSE;//DavidWang
1267 pDevice->bEnableRoaming = FALSE;
1268 pDevice->bCmdRunning = FALSE;
1269 pDevice->bLinkPass = FALSE;
1270 memset(pMgmt->abyCurrBSSID, 0, 6);
1271 pMgmt->eCurrState = WMAC_STATE_IDLE;
1273 device_free_tx_bufs(pDevice);
1274 device_free_rx_bufs(pDevice);
1275 device_free_int_bufs(pDevice);
1276 device_free_frag_bufs(pDevice);
1278 usb_kill_urb(pDevice->pControlURB);
1279 usb_kill_urb(pDevice->pInterruptURB);
1280 usb_free_urb(pDevice->pControlURB);
1281 usb_free_urb(pDevice->pInterruptURB);
1283 BSSvClearNodeDBTable(pDevice, 0);
1284 pDevice->flags &=(~DEVICE_FLAGS_OPENED);
1286 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n");
1292 static void __devexit vt6656_disconnect(struct usb_interface *intf)
1295 PSDevice pDevice = usb_get_intfdata(intf);
1297 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_disconnect1.. \n");
1298 if (pDevice == NULL)
1303 union iwreq_data wrqu;
1304 memset(&wrqu, 0, sizeof(wrqu));
1305 wrqu.data.flags = RT_RMMOD_EVENT_FLAG;
1306 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1310 //2008-0714-01<Add>by MikeLiu
1311 device_release_WPADEV(pDevice);
1313 usb_set_intfdata(intf, NULL);
1314 //2008-0922-01<Add>by MikeLiu, decrease usb counter.
1315 usb_put_dev(interface_to_usbdev(intf));
1317 pDevice->flags |= DEVICE_FLAGS_UNPLUG;
1318 if (pDevice->dev != NULL) {
1319 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "unregister_netdev..\n");
1320 unregister_netdev(pDevice->dev);
1322 //2008-07-21-01<Add>by MikeLiu
1324 if(wpa_set_wpadev(pDevice, 0)!=0)
1325 printk("unregister wpadev fail?\n");
1327 free_netdev(pDevice->dev);
1330 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_disconnect3.. \n");
1336 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev) {
1337 PSDevice pDevice=netdev_priv(dev);
1342 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211\n");
1343 spin_lock_irq(&pDevice->lock);
1345 if (pDevice->bStopTx0Pkt == TRUE) {
1346 dev_kfree_skb_irq(skb);
1347 spin_unlock_irq(&pDevice->lock);
1352 cbMPDULen = skb->len;
1355 vDMA0_tx_80211(pDevice, skb);
1357 spin_unlock_irq(&pDevice->lock);
1364 static int device_xmit(struct sk_buff *skb, struct net_device *dev) {
1365 PSDevice pDevice=netdev_priv(dev);
1366 struct net_device_stats* pStats = &pDevice->stats;
1369 spin_lock_irq(&pDevice->lock);
1371 netif_stop_queue(pDevice->dev);
1373 if (pDevice->bLinkPass == FALSE) {
1374 dev_kfree_skb_irq(skb);
1375 spin_unlock_irq(&pDevice->lock);
1378 if (pDevice->bStopDataPkt == TRUE) {
1379 dev_kfree_skb_irq(skb);
1380 pStats->tx_dropped++;
1381 spin_unlock_irq(&pDevice->lock);
1385 if(nsDMA_tx_packet(pDevice, TYPE_AC0DMA, skb) !=0) { //mike add:xmit fail!
1386 if (netif_queue_stopped(pDevice->dev))
1387 netif_wake_queue(pDevice->dev);
1390 spin_unlock_irq(&pDevice->lock);
1397 static unsigned const ethernet_polynomial = 0x04c11db7U;
1398 static inline u32 ether_crc(int length, unsigned char *data)
1402 while(--length >= 0) {
1403 unsigned char current_octet = *data++;
1405 for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
1407 ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
1413 //find out the start position of str2 from str1
1414 static UCHAR *kstrstr(const UCHAR *str1,const UCHAR *str2) {
1415 int str1_len=strlen(str1);
1416 int str2_len=strlen(str2);
1418 while (str1_len >= str2_len) {
1420 if(memcmp(str1,str2,str2_len)==0)
1421 return (UCHAR *)str1;
1427 static int Config_FileGetParameter(UCHAR *string, UCHAR *dest,UCHAR *source)
1431 UCHAR *start_p=NULL,*end_p=NULL,*tmp_p=NULL;
1435 strcat(buf1, string);
1437 source+=strlen(buf1);
1439 //find target string start point
1440 start_p = kstrstr(source,buf1);
1441 if (start_p == NULL)
1444 //check if current config line is marked by "#" ??
1446 if(memcmp(start_p-ii,"\n",1)==0)
1448 if(memcmp(start_p-ii,"#",1)==0)
1452 //find target string end point
1453 end_p = kstrstr(start_p,"\n");
1454 if (end_p == NULL) { //can't find "\n",but don't care
1455 end_p=start_p+strlen(start_p); //no include "\n"
1459 memcpy(buf2,start_p,end_p-start_p); //get the tartget line
1460 buf2[end_p-start_p]='\0';
1463 start_p = kstrstr(buf2,"=");
1464 if (start_p == NULL)
1467 strcpy(buf1,start_p+1);
1471 while(*tmp_p != 0x00) {
1478 memcpy(dest,tmp_p,strlen(tmp_p));
1482 //if read fail,return NULL,or return data pointer;
1483 static UCHAR *Config_FileOperation(PSDevice pDevice) {
1484 UCHAR *config_path=CONFIG_PATH;
1486 struct file *filp=NULL;
1487 mm_segment_t old_fs = get_fs();
1488 //int oldfsuid=0,oldfsgid=0;
1492 /* Can't do this anymore, so we rely on correct filesystem permissions:
1493 //Make sure a caller can read or write power as root
1494 oldfsuid=current->fsuid;
1495 oldfsgid=current->fsgid;
1501 filp = filp_open(config_path, O_RDWR, 0);
1503 printk("Config_FileOperation file Not exist\n");
1508 if(!(filp->f_op) || !(filp->f_op->read) ||!(filp->f_op->write)) {
1509 printk("file %s cann't readable or writable?\n",config_path);
1514 buffer = kmalloc(1024, GFP_KERNEL);
1516 printk("alllocate mem for file fail?\n");
1521 if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
1522 printk("read file error?\n");
1527 if(filp_close(filp,NULL))
1528 printk("Config_FileOperation:close file fail\n");
1534 current->fsuid=oldfsuid;
1535 current->fsgid=oldfsgid;
1546 //return --->-1:fail; >=0:successful
1547 static int Read_config_file(PSDevice pDevice) {
1549 UCHAR tmpbuffer[100];
1552 //init config setting
1553 pDevice->config_file.ZoneType = -1;
1554 pDevice->config_file.eAuthenMode = -1;
1555 pDevice->config_file.eEncryptionStatus = -1;
1557 buffer = Config_FileOperation(pDevice);
1558 if (buffer == NULL) {
1565 memset(tmpbuffer,0,sizeof(tmpbuffer));
1566 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer) ==TRUE) {
1567 if(memcmp(tmpbuffer,"USA",3)==0) {
1568 pDevice->config_file.ZoneType=ZoneType_USA;
1570 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
1571 pDevice->config_file.ZoneType=ZoneType_Japan;
1573 else if(memcmp(tmpbuffer,"EUROPE",6)==0) {
1574 pDevice->config_file.ZoneType=ZoneType_Europe;
1577 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
1583 //get other parameter
1585 memset(tmpbuffer,0,sizeof(tmpbuffer));
1586 if(Config_FileGetParameter("AUTHENMODE",tmpbuffer,buffer)==TRUE) {
1587 pDevice->config_file.eAuthenMode = (int) simple_strtol(tmpbuffer, NULL, 10);
1590 memset(tmpbuffer,0,sizeof(tmpbuffer));
1591 if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer,buffer)==TRUE) {
1592 pDevice->config_file.eEncryptionStatus= (int) simple_strtol(tmpbuffer, NULL, 10);
1601 static void device_set_multi(struct net_device *dev) {
1602 PSDevice pDevice = (PSDevice) netdev_priv(dev);
1603 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1606 struct dev_mc_list *mclist;
1607 BYTE pbyData[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
1612 spin_lock_irq(&pDevice->lock);
1613 rc = CONTROLnsRequestIn(pDevice,
1616 MESSAGE_REQUEST_MACREG,
1620 if (rc == 0) pDevice->byRxMode = byTmpMode;
1622 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode in= %x\n", pDevice->byRxMode);
1624 if (dev->flags & IFF_PROMISC) { // Set promiscuous.
1625 DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
1626 // Unconditionally log net taps.
1627 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
1629 else if ((netdev_mc_count(dev) > pDevice->multicast_limit) ||
1630 (dev->flags & IFF_ALLMULTI)) {
1631 CONTROLnsRequestOut(pDevice,
1634 MESSAGE_REQUEST_MACREG,
1638 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1641 memset(mc_filter, 0, sizeof(mc_filter));
1642 netdev_for_each_mc_addr(mclist, dev) {
1643 int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
1644 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
1646 for (ii = 0; ii < 4; ii++) {
1647 MACvWriteMultiAddr(pDevice, ii, *((PBYTE)&mc_filter[0] + ii));
1648 MACvWriteMultiAddr(pDevice, ii+ 4, *((PBYTE)&mc_filter[1] + ii));
1650 pDevice->byRxMode &= ~(RCR_UNICAST);
1651 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1654 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1655 // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
1656 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1657 pDevice->byRxMode &= ~(RCR_UNICAST);
1659 ControlvWriteByte(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_RCR, pDevice->byRxMode);
1660 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode out= %x\n", pDevice->byRxMode);
1661 spin_unlock_irq(&pDevice->lock);
1666 static struct net_device_stats *device_get_stats(struct net_device *dev) {
1667 PSDevice pDevice=(PSDevice) netdev_priv(dev);
1669 return &pDevice->stats;
1673 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
1674 PSDevice pDevice = (PSDevice)netdev_priv(dev);
1675 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1677 //BOOL bCommit = FALSE;
1678 struct iwreq *wrq = (struct iwreq *) rq;
1681 if (pMgmt == NULL) {
1689 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
1696 case SIOCGIWNWID: //0x8b03 support
1697 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1698 rc = iwctl_giwnwid(dev, NULL, &(wrq->u.nwid), NULL);
1704 // Set frequency/channel
1706 rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
1709 // Get frequency/channel
1711 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
1714 // Set desired network name (ESSID)
1718 char essid[IW_ESSID_MAX_SIZE+1];
1719 if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
1723 if (copy_from_user(essid, wrq->u.essid.pointer,
1724 wrq->u.essid.length)) {
1728 rc = iwctl_siwessid(dev, NULL,
1729 &(wrq->u.essid), essid);
1734 // Get current network name (ESSID)
1738 char essid[IW_ESSID_MAX_SIZE+1];
1739 if (wrq->u.essid.pointer)
1740 rc = iwctl_giwessid(dev, NULL,
1741 &(wrq->u.essid), essid);
1742 if (copy_to_user(wrq->u.essid.pointer,
1744 wrq->u.essid.length) )
1751 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1755 // Get current Access Point (BSSID)
1757 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1761 // Set desired station name
1763 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
1767 // Get current station name
1769 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
1773 // Set the desired bit-rate
1775 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1778 // Get the current bit-rate
1781 rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1784 // Set the desired RTS threshold
1787 rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
1790 // Get the current RTS threshold
1793 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
1796 // Set the desired fragmentation threshold
1799 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
1802 // Get the current fragmentation threshold
1805 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
1808 // Set mode of operation
1810 rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
1813 // Get mode of operation
1815 rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
1818 // Set WEP keys and mode
1821 char abyKey[WLAN_WEP232_KEYLEN];
1823 if (wrq->u.encoding.pointer) {
1826 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
1830 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
1831 if (copy_from_user(abyKey,
1832 wrq->u.encoding.pointer,
1833 wrq->u.encoding.length)) {
1837 } else if (wrq->u.encoding.length != 0) {
1841 rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
1845 // Get the WEP keys and mode
1848 if (!capable(CAP_NET_ADMIN)) {
1853 char abyKey[WLAN_WEP232_KEYLEN];
1855 rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
1857 if (wrq->u.encoding.pointer) {
1858 if (copy_to_user(wrq->u.encoding.pointer,
1860 wrq->u.encoding.length))
1866 // Get the current Tx-Power
1868 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
1873 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
1879 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
1884 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
1887 // Get range of parameters
1891 struct iw_range range;
1893 rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *) &range);
1894 if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
1902 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
1908 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
1914 rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
1918 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
1924 char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
1926 if (wrq->u.data.pointer) {
1927 rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
1929 if (copy_to_user(wrq->u.data.pointer,
1931 (wrq->u.data.length * (sizeof(struct sockaddr) + sizeof(struct iw_quality)))
1944 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
1951 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
1955 #endif // WIRELESS_SPY
1958 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
1961 if(wrq->u.data.pointer) {
1962 wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
1964 if(copy_to_user(wrq->u.data.pointer,
1965 (u_char *) iwctl_private_args,
1966 sizeof(iwctl_private_args)))
1973 //2008-0409-07, <Add> by Einsn Liu
1974 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1976 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH \n");
1977 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
1981 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
1982 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
1986 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
1987 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1991 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
1992 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1995 case SIOCSIWENCODEEXT:
1997 char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
1998 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
1999 if(wrq->u.encoding.pointer){
2000 memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1);
2001 if(wrq->u.encoding.length > (sizeof(struct iw_encode_ext)+ MAX_KEY_LEN)){
2005 if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
2009 }else if(wrq->u.encoding.length != 0){
2013 rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
2017 case SIOCGIWENCODEEXT:
2018 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
2019 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
2023 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
2024 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2027 #endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2028 //End Add -- //2008-0409-07, <Add> by Einsn Liu
2030 case IOCTL_CMD_TEST:
2032 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2038 pReq = (PSCmdRequest)rq;
2040 //20080130-01,<Remark> by Mike Liu
2041 // if(pDevice->bLinkPass==TRUE)
2042 pReq->wResult = MAGIC_CODE; //Linking status:0x3142
2043 //20080130-02,<Remark> by Mike Liu
2045 // pReq->wResult = MAGIC_CODE+1; //disconnect status:0x3143
2049 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
2050 (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
2058 if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
2061 rc = private_ioctl(pDevice, rq);
2062 clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
2065 case IOCTL_CMD_HOSTAPD:
2067 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2074 rc = vt6656_hostap_ioctl(pDevice, &wrq->u.data);
2079 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2086 rc = wpa_ioctl(pDevice, &wrq->u.data);
2090 return ethtool_ioctl(dev, (void *) rq->ifr_data);
2091 // All other calls are currently unsupported
2095 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
2100 if (pDevice->bCommit) {
2101 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2102 netif_stop_queue(pDevice->dev);
2103 spin_lock_irq(&pDevice->lock);
2104 bScheduleCommand((void *) pDevice, WLAN_CMD_RUN_AP, NULL);
2105 spin_unlock_irq(&pDevice->lock);
2108 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
2109 spin_lock_irq(&pDevice->lock);
2110 //2007-1121-01<Modify>by EinsnLiu
2111 if (pDevice->bLinkPass &&
2112 memcmp(pMgmt->abyCurrSSID,pMgmt->abyDesireSSID,WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN)) {
2113 bScheduleCommand((void *) pDevice, WLAN_CMD_DISASSOCIATE, NULL);
2115 pDevice->bLinkPass = FALSE;
2116 pMgmt->eCurrState = WMAC_STATE_IDLE;
2117 memset(pMgmt->abyCurrBSSID, 0, 6);
2119 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
2121 netif_stop_queue(pDevice->dev);
2122 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2123 pMgmt->eScanType = WMAC_SCAN_ACTIVE;
2124 if (!pDevice->bWPASuppWextEnabled)
2126 bScheduleCommand((void *) pDevice,
2127 WLAN_CMD_BSSID_SCAN,
2128 pMgmt->abyDesireSSID);
2129 bScheduleCommand((void *) pDevice,
2132 spin_unlock_irq(&pDevice->lock);
2134 pDevice->bCommit = FALSE;
2142 static int ethtool_ioctl(struct net_device *dev, void *useraddr)
2146 if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd)))
2150 case ETHTOOL_GDRVINFO: {
2151 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
2152 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
2153 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
2154 if (copy_to_user(useraddr, &info, sizeof(info)))
2165 /*------------------------------------------------------------------*/
2167 MODULE_DEVICE_TABLE(usb, vt6656_table);
2169 static struct usb_driver vt6656_driver = {
2170 .name = DEVICE_NAME,
2171 .probe = vt6656_probe,
2172 .disconnect = vt6656_disconnect,
2173 .id_table = vt6656_table,
2175 .suspend = vt6656_suspend,
2176 .resume = vt6656_resume,
2177 #endif /* CONFIG_PM */
2180 static int __init vt6656_init_module(void)
2182 printk(KERN_NOTICE DEVICE_FULL_DRV_NAM " " DEVICE_VERSION);
2183 return usb_register(&vt6656_driver);
2186 static void __exit vt6656_cleanup_module(void)
2188 usb_deregister(&vt6656_driver);
2191 module_init(vt6656_init_module);
2192 module_exit(vt6656_cleanup_module);