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_DEF0 64
96 DEVICE_PARAM(RxDescriptors0
,"Number of receive usb desc buffer");
99 #define TX_DESC_DEF0 64
100 DEVICE_PARAM(TxDescriptors0
,"Number of transmit usb desc buffer");
102 #define CHANNEL_DEF 6
103 DEVICE_PARAM(Channel
, "Channel number");
106 /* PreambleType[] is the preamble length used for transmit.
107 0: indicate allows long preamble type
108 1: indicate allows short preamble type
111 #define PREAMBLE_TYPE_DEF 1
113 DEVICE_PARAM(PreambleType
, "Preamble Type");
115 #define RTS_THRESH_DEF 2347
116 DEVICE_PARAM(RTSThreshold
, "RTS threshold");
118 #define FRAG_THRESH_DEF 2346
119 DEVICE_PARAM(FragThreshold
, "Fragmentation threshold");
122 #define DATA_RATE_DEF 13
124 0: indicate 1 Mbps 0x02
125 1: indicate 2 Mbps 0x04
126 2: indicate 5.5 Mbps 0x0B
127 3: indicate 11 Mbps 0x16
128 4: indicate 6 Mbps 0x0c
129 5: indicate 9 Mbps 0x12
130 6: indicate 12 Mbps 0x18
131 7: indicate 18 Mbps 0x24
132 8: indicate 24 Mbps 0x30
133 9: indicate 36 Mbps 0x48
134 10: indicate 48 Mbps 0x60
135 11: indicate 54 Mbps 0x6c
136 12: indicate 72 Mbps 0x90
137 13: indicate auto rate
140 DEVICE_PARAM(ConnectionRate
, "Connection data rate");
142 #define OP_MODE_DEF 0
143 DEVICE_PARAM(OPMode
, "Infrastruct, adhoc, AP mode ");
145 /* OpMode[] is used for transmit.
146 0: indicate infrastruct mode used
147 1: indicate adhoc mode used
148 2: indicate AP mode used
153 0: indicate disable power saving mode
154 1: indicate enable power saving mode
157 #define PS_MODE_DEF 0
158 DEVICE_PARAM(PSMode
, "Power saving mode");
161 #define SHORT_RETRY_DEF 8
162 DEVICE_PARAM(ShortRetryLimit
, "Short frame retry limits");
164 #define LONG_RETRY_DEF 4
165 DEVICE_PARAM(LongRetryLimit
, "long frame retry limits");
167 /* BasebandType[] baseband type selected
168 0: indicate 802.11a type
169 1: indicate 802.11b type
170 2: indicate 802.11g type
173 #define BBP_TYPE_DEF 2
174 DEVICE_PARAM(BasebandType
, "baseband type");
179 0: indicate disable 802.11h
180 1: indicate enable 802.11h
183 #define X80211h_MODE_DEF 0
185 DEVICE_PARAM(b80211hEnable
, "802.11h mode");
189 // Static vars definitions
192 static struct usb_device_id vt6656_table
[] = {
193 {USB_DEVICE(VNT_USB_VENDOR_ID
, VNT_USB_PRODUCT_ID
)},
197 // Frequency list (map channels to frequencies)
199 static const long frequency_list[] = {
200 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 2484,
201 4915, 4920, 4925, 4935, 4940, 4945, 4960, 4980,
202 5035, 5040, 5045, 5055, 5060, 5080, 5170, 5180, 5190, 5200, 5210, 5220, 5230, 5240,
203 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640, 5660, 5680,
204 5700, 5745, 5765, 5785, 5805, 5825
208 static const struct iw_handler_def iwctl_handler_def;
211 /*--------------------- Static Functions --------------------------*/
213 static int vt6656_probe(struct usb_interface
*intf
,
214 const struct usb_device_id
*id
);
215 static void vt6656_disconnect(struct usb_interface
*intf
);
217 #ifdef CONFIG_PM /* Minimal support for suspend and resume */
218 static int vt6656_suspend(struct usb_interface
*intf
, pm_message_t message
);
219 static int vt6656_resume(struct usb_interface
*intf
);
220 #endif /* CONFIG_PM */
222 static struct net_device_stats
*device_get_stats(struct net_device
*dev
);
223 static int device_open(struct net_device
*dev
);
224 static int device_xmit(struct sk_buff
*skb
, struct net_device
*dev
);
225 static void device_set_multi(struct net_device
*dev
);
226 static int device_close(struct net_device
*dev
);
227 static int device_ioctl(struct net_device
*dev
, struct ifreq
*rq
, int cmd
);
229 static BOOL
device_init_registers(PSDevice pDevice
, DEVICE_INIT_TYPE InitType
);
230 static BOOL
device_init_defrag_cb(PSDevice pDevice
);
231 static void device_init_diversity_timer(PSDevice pDevice
);
232 static int device_dma0_tx_80211(struct sk_buff
*skb
, struct net_device
*dev
);
234 static int ethtool_ioctl(struct net_device
*dev
, void *useraddr
);
235 static void device_free_tx_bufs(PSDevice pDevice
);
236 static void device_free_rx_bufs(PSDevice pDevice
);
237 static void device_free_int_bufs(PSDevice pDevice
);
238 static void device_free_frag_bufs(PSDevice pDevice
);
239 static BOOL
device_alloc_bufs(PSDevice pDevice
);
241 static int Read_config_file(PSDevice pDevice
);
242 static unsigned char *Config_FileOperation(PSDevice pDevice
);
243 static int Config_FileGetParameter(unsigned char *string
,
245 unsigned char *source
);
247 static BOOL
device_release_WPADEV(PSDevice pDevice
);
249 static void usb_device_reset(PSDevice pDevice
);
253 /*--------------------- Export Variables --------------------------*/
255 /*--------------------- Export Functions --------------------------*/
259 device_set_options(PSDevice pDevice
) {
261 BYTE abyBroadcastAddr
[ETH_ALEN
] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
262 BYTE abySNAP_RFC1042
[ETH_ALEN
] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
263 u8 abySNAP_Bridgetunnel
[ETH_ALEN
] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
265 memcpy(pDevice
->abyBroadcastAddr
, abyBroadcastAddr
, ETH_ALEN
);
266 memcpy(pDevice
->abySNAP_RFC1042
, abySNAP_RFC1042
, ETH_ALEN
);
267 memcpy(pDevice
->abySNAP_Bridgetunnel
, abySNAP_Bridgetunnel
, ETH_ALEN
);
269 pDevice
->cbTD
= TX_DESC_DEF0
;
270 pDevice
->cbRD
= RX_DESC_DEF0
;
271 pDevice
->uChannel
= CHANNEL_DEF
;
272 pDevice
->wRTSThreshold
= RTS_THRESH_DEF
;
273 pDevice
->wFragmentationThreshold
= FRAG_THRESH_DEF
;
274 pDevice
->byShortRetryLimit
= SHORT_RETRY_DEF
;
275 pDevice
->byLongRetryLimit
= LONG_RETRY_DEF
;
276 pDevice
->wMaxTransmitMSDULifetime
= DEFAULT_MSDU_LIFETIME
;
277 pDevice
->byShortPreamble
= PREAMBLE_TYPE_DEF
;
278 pDevice
->ePSMode
= PS_MODE_DEF
;
279 pDevice
->b11hEnable
= X80211h_MODE_DEF
;
280 pDevice
->eOPMode
= OP_MODE_DEF
;
281 pDevice
->uConnectionRate
= DATA_RATE_DEF
;
282 if (pDevice
->uConnectionRate
< RATE_AUTO
) pDevice
->bFixRate
= TRUE
;
283 pDevice
->byBBType
= BBP_TYPE_DEF
;
284 pDevice
->byPacketType
= pDevice
->byBBType
;
285 pDevice
->byAutoFBCtrl
= AUTO_FB_0
;
286 pDevice
->bUpdateBBVGA
= TRUE
;
287 pDevice
->byFOETuning
= 0;
288 pDevice
->byAutoPwrTunning
= 0;
289 pDevice
->wCTSDuration
= 0;
290 pDevice
->byPreambleType
= 0;
291 pDevice
->bExistSWNetAddr
= FALSE
;
292 // pDevice->bDiversityRegCtlON = TRUE;
293 pDevice
->bDiversityRegCtlON
= FALSE
;
297 static void device_init_diversity_timer(PSDevice pDevice
)
299 init_timer(&pDevice
->TimerSQ3Tmax1
);
300 pDevice
->TimerSQ3Tmax1
.data
= (unsigned long)pDevice
;
301 pDevice
->TimerSQ3Tmax1
.function
= (TimerFunction
)TimerSQ3CallBack
;
302 pDevice
->TimerSQ3Tmax1
.expires
= RUN_AT(HZ
);
304 init_timer(&pDevice
->TimerSQ3Tmax2
);
305 pDevice
->TimerSQ3Tmax2
.data
= (unsigned long)pDevice
;
306 pDevice
->TimerSQ3Tmax2
.function
= (TimerFunction
)TimerSQ3CallBack
;
307 pDevice
->TimerSQ3Tmax2
.expires
= RUN_AT(HZ
);
309 init_timer(&pDevice
->TimerSQ3Tmax3
);
310 pDevice
->TimerSQ3Tmax3
.data
= (unsigned long)pDevice
;
311 pDevice
->TimerSQ3Tmax3
.function
= (TimerFunction
)TimerSQ3Tmax3CallBack
;
312 pDevice
->TimerSQ3Tmax3
.expires
= RUN_AT(HZ
);
319 // Initialiation of MAC & BBP registers
322 static BOOL
device_init_registers(PSDevice pDevice
, DEVICE_INIT_TYPE InitType
)
324 u8 abyBroadcastAddr
[ETH_ALEN
] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
325 u8 abySNAP_RFC1042
[ETH_ALEN
] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
326 u8 abySNAP_Bridgetunnel
[ETH_ALEN
] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
329 CMD_CARD_INIT sInitCmd
;
330 int ntStatus
= STATUS_SUCCESS
;
331 RSP_CARD_INIT sInitRsp
;
332 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
334 BYTE byCalibTXIQ
= 0;
335 BYTE byCalibTXDC
= 0;
336 BYTE byCalibRXIQ
= 0;
338 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"---->INIbInitAdapter. [%d][%d]\n", InitType
, pDevice
->byPacketType
);
339 spin_lock_irq(&pDevice
->lock
);
340 if (InitType
== DEVICE_INIT_COLD
) {
341 memcpy(pDevice
->abyBroadcastAddr
, abyBroadcastAddr
, ETH_ALEN
);
342 memcpy(pDevice
->abySNAP_RFC1042
, abySNAP_RFC1042
, ETH_ALEN
);
343 memcpy(pDevice
->abySNAP_Bridgetunnel
,
344 abySNAP_Bridgetunnel
,
347 if ( !FIRMWAREbCheckVersion(pDevice
) ) {
348 if (FIRMWAREbDownload(pDevice
) == TRUE
) {
349 if (FIRMWAREbBrach2Sram(pDevice
) == FALSE
) {
350 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" FIRMWAREbBrach2Sram fail \n");
351 spin_unlock_irq(&pDevice
->lock
);
356 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" FIRMWAREbDownload fail \n");
357 spin_unlock_irq(&pDevice
->lock
);
362 if ( !BBbVT3184Init(pDevice
) ) {
363 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" BBbVT3184Init fail \n");
364 spin_unlock_irq(&pDevice
->lock
);
369 sInitCmd
.byInitClass
= (BYTE
)InitType
;
370 sInitCmd
.bExistSWNetAddr
= (BYTE
) pDevice
->bExistSWNetAddr
;
371 for (ii
= 0; ii
< 6; ii
++)
372 sInitCmd
.bySWNetAddr
[ii
] = pDevice
->abyCurrentNetAddr
[ii
];
373 sInitCmd
.byShortRetryLimit
= pDevice
->byShortRetryLimit
;
374 sInitCmd
.byLongRetryLimit
= pDevice
->byLongRetryLimit
;
376 //issue Card_init command to device
377 ntStatus
= CONTROLnsRequestOut(pDevice
,
378 MESSAGE_TYPE_CARDINIT
,
381 sizeof(CMD_CARD_INIT
),
382 (PBYTE
) &(sInitCmd
));
384 if ( ntStatus
!= STATUS_SUCCESS
) {
385 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" Issue Card init fail \n");
386 spin_unlock_irq(&pDevice
->lock
);
389 if (InitType
== DEVICE_INIT_COLD
) {
391 ntStatus
= CONTROLnsRequestIn(pDevice
,MESSAGE_TYPE_INIT_RSP
,0,0,sizeof(RSP_CARD_INIT
), (PBYTE
) &(sInitRsp
));
393 if (ntStatus
!= STATUS_SUCCESS
) {
394 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Cardinit request in status fail!\n");
395 spin_unlock_irq(&pDevice
->lock
);
399 //Local ID for AES functions
400 ntStatus
= CONTROLnsRequestIn(pDevice
,
403 MESSAGE_REQUEST_MACREG
,
405 &pDevice
->byLocalID
);
407 if ( ntStatus
!= STATUS_SUCCESS
) {
408 spin_unlock_irq(&pDevice
->lock
);
412 // Do MACbSoftwareReset in MACvInitialize
414 pDevice
->bCCK
= TRUE
;
415 pDevice
->bProtectMode
= FALSE
; //Only used in 11g type, sync with ERP IE
416 pDevice
->bNonERPPresent
= FALSE
;
417 pDevice
->bBarkerPreambleMd
= FALSE
;
418 if ( pDevice
->bFixRate
) {
419 pDevice
->wCurrentRate
= (WORD
) pDevice
->uConnectionRate
;
421 if ( pDevice
->byBBType
== BB_TYPE_11B
)
422 pDevice
->wCurrentRate
= RATE_11M
;
424 pDevice
->wCurrentRate
= RATE_54M
;
427 CHvInitChannelTable(pDevice
);
429 pDevice
->byTopOFDMBasicRate
= RATE_24M
;
430 pDevice
->byTopCCKBasicRate
= RATE_1M
;
431 pDevice
->byRevId
= 0; //Target to IF pin while programming to RF chip.
432 pDevice
->byCurPwr
= 0xFF;
434 pDevice
->byCCKPwr
= pDevice
->abyEEPROM
[EEP_OFS_PWR_CCK
];
435 pDevice
->byOFDMPwrG
= pDevice
->abyEEPROM
[EEP_OFS_PWR_OFDMG
];
437 for (ii
=0;ii
<14;ii
++) {
438 pDevice
->abyCCKPwrTbl
[ii
] = pDevice
->abyEEPROM
[ii
+ EEP_OFS_CCK_PWR_TBL
];
439 if (pDevice
->abyCCKPwrTbl
[ii
] == 0)
440 pDevice
->abyCCKPwrTbl
[ii
] = pDevice
->byCCKPwr
;
441 pDevice
->abyOFDMPwrTbl
[ii
] = pDevice
->abyEEPROM
[ii
+ EEP_OFS_OFDM_PWR_TBL
];
442 if (pDevice
->abyOFDMPwrTbl
[ii
] == 0)
443 pDevice
->abyOFDMPwrTbl
[ii
] = pDevice
->byOFDMPwrG
;
446 //original zonetype is USA,but customize zonetype is europe,
447 // then need recover 12,13 ,14 channel with 11 channel
448 if(((pDevice
->abyEEPROM
[EEP_OFS_ZONETYPE
] == ZoneType_Japan
) ||
449 (pDevice
->abyEEPROM
[EEP_OFS_ZONETYPE
] == ZoneType_Europe
))&&
450 (pDevice
->byOriginalZonetype
== ZoneType_USA
)) {
451 for (ii
= 11; ii
< 14; ii
++) {
452 pDevice
->abyCCKPwrTbl
[ii
] = pDevice
->abyCCKPwrTbl
[10];
453 pDevice
->abyOFDMPwrTbl
[ii
] = pDevice
->abyOFDMPwrTbl
[10];
457 //{{ RobertYu: 20041124
458 pDevice
->byOFDMPwrA
= 0x34; // same as RFbMA2829SelectChannel
459 // Load OFDM A Power Table
460 for (ii
=0;ii
<CB_MAX_CHANNEL_5G
;ii
++) { //RobertYu:20041224, bug using CB_MAX_CHANNEL
461 pDevice
->abyOFDMAPwrTbl
[ii
] = pDevice
->abyEEPROM
[ii
+ EEP_OFS_OFDMA_PWR_TBL
];
462 if (pDevice
->abyOFDMAPwrTbl
[ii
] == 0)
463 pDevice
->abyOFDMAPwrTbl
[ii
] = pDevice
->byOFDMPwrA
;
467 byAntenna
= pDevice
->abyEEPROM
[EEP_OFS_ANTENNA
];
468 if (byAntenna
& EEP_ANTINV
)
469 pDevice
->bTxRxAntInv
= TRUE
;
471 pDevice
->bTxRxAntInv
= FALSE
;
473 byAntenna
&= (EEP_ANTENNA_AUX
| EEP_ANTENNA_MAIN
);
475 if (byAntenna
== 0) // if not set default is All
476 byAntenna
= (EEP_ANTENNA_AUX
| EEP_ANTENNA_MAIN
);
478 if (byAntenna
== (EEP_ANTENNA_AUX
| EEP_ANTENNA_MAIN
)) {
479 pDevice
->byAntennaCount
= 2;
480 pDevice
->byTxAntennaMode
= ANT_B
;
481 pDevice
->dwTxAntennaSel
= 1;
482 pDevice
->dwRxAntennaSel
= 1;
483 if (pDevice
->bTxRxAntInv
== TRUE
)
484 pDevice
->byRxAntennaMode
= ANT_A
;
486 pDevice
->byRxAntennaMode
= ANT_B
;
488 if (pDevice
->bDiversityRegCtlON
)
489 pDevice
->bDiversityEnable
= TRUE
;
491 pDevice
->bDiversityEnable
= FALSE
;
493 pDevice
->bDiversityEnable
= FALSE
;
494 pDevice
->byAntennaCount
= 1;
495 pDevice
->dwTxAntennaSel
= 0;
496 pDevice
->dwRxAntennaSel
= 0;
497 if (byAntenna
& EEP_ANTENNA_AUX
) {
498 pDevice
->byTxAntennaMode
= ANT_A
;
499 if (pDevice
->bTxRxAntInv
== TRUE
)
500 pDevice
->byRxAntennaMode
= ANT_B
;
502 pDevice
->byRxAntennaMode
= ANT_A
;
504 pDevice
->byTxAntennaMode
= ANT_B
;
505 if (pDevice
->bTxRxAntInv
== TRUE
)
506 pDevice
->byRxAntennaMode
= ANT_A
;
508 pDevice
->byRxAntennaMode
= ANT_B
;
511 pDevice
->ulDiversityNValue
= 100*255;
512 pDevice
->ulDiversityMValue
= 100*16;
514 pDevice
->byTMax2
= 4;
515 pDevice
->ulSQ3TH
= 0;
516 pDevice
->byTMax3
= 64;
517 // -----------------------------------------------------------------
519 //Get Auto Fall Back Type
520 pDevice
->byAutoFBCtrl
= AUTO_FB_0
;
523 pDevice
->uScanTime
= WLAN_SCAN_MINITIME
;
526 //pDevice->NetworkType = Ndis802_11Automode;
527 pDevice
->eConfigPHYMode
= PHY_TYPE_AUTO
;
528 pDevice
->byBBType
= BB_TYPE_11G
;
530 // initialize BBP registers
531 pDevice
->ulTxPower
= 25;
534 pDevice
->byMinChannel
= 1;
535 pDevice
->byMaxChannel
= CB_MAX_CHANNEL
;
538 pDevice
->byRFType
= sInitRsp
.byRFType
;
540 if ((pDevice
->byRFType
& RF_EMU
) != 0) {
541 // force change RevID for VT3253 emu
542 pDevice
->byRevId
= 0x80;
545 // Load EEPROM calibrated vt3266 parameters
546 if (pDevice
->byRFType
== RF_VT3226D0
) {
547 if((pDevice
->abyEEPROM
[EEP_OFS_MAJOR_VER
] == 0x1) &&
548 (pDevice
->abyEEPROM
[EEP_OFS_MINOR_VER
] >= 0x4)) {
549 byCalibTXIQ
= pDevice
->abyEEPROM
[EEP_OFS_CALIB_TX_IQ
];
550 byCalibTXDC
= pDevice
->abyEEPROM
[EEP_OFS_CALIB_TX_DC
];
551 byCalibRXIQ
= pDevice
->abyEEPROM
[EEP_OFS_CALIB_RX_IQ
];
552 if( (byCalibTXIQ
|| byCalibTXDC
|| byCalibRXIQ
) ) {
553 ControlvWriteByte(pDevice
, MESSAGE_REQUEST_BBREG
, 0xFF, 0x03); // CR255, Set BB to support TX/RX IQ and DC compensation Mode
554 ControlvWriteByte(pDevice
, MESSAGE_REQUEST_BBREG
, 0xFB, byCalibTXIQ
); // CR251, TX I/Q Imbalance Calibration
555 ControlvWriteByte(pDevice
, MESSAGE_REQUEST_BBREG
, 0xFC, byCalibTXDC
); // CR252, TX DC-Offset Calibration
556 ControlvWriteByte(pDevice
, MESSAGE_REQUEST_BBREG
, 0xFD, byCalibRXIQ
); // CR253, RX I/Q Imbalance Calibration
558 // turn off BB Calibration compensation
559 ControlvWriteByte(pDevice
, MESSAGE_REQUEST_BBREG
, 0xFF, 0x0); // CR255
563 pMgmt
->eScanType
= WMAC_SCAN_PASSIVE
;
564 pMgmt
->uCurrChannel
= pDevice
->uChannel
;
565 pMgmt
->uIBSSChannel
= pDevice
->uChannel
;
566 CARDbSetMediaChannel(pDevice
, pMgmt
->uCurrChannel
);
568 // get Permanent network address
569 memcpy(pDevice
->abyPermanentNetAddr
,&(sInitRsp
.byNetAddr
[0]),6);
570 memcpy(pDevice
->abyCurrentNetAddr
,
571 pDevice
->abyPermanentNetAddr
,
574 // if exist SW network address, use SW network address.
576 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Network address = %pM\n",
577 pDevice
->abyCurrentNetAddr
);
580 // Set BB and packet type at the same time.
581 // Set Short Slot Time, xIFS, and RSPINF.
582 if (pDevice
->byBBType
== BB_TYPE_11A
) {
583 CARDbAddBasicRate(pDevice
, RATE_6M
);
584 pDevice
->bShortSlotTime
= TRUE
;
586 CARDbAddBasicRate(pDevice
, RATE_1M
);
587 pDevice
->bShortSlotTime
= FALSE
;
589 BBvSetShortSlotTime(pDevice
);
590 CARDvSetBSSMode(pDevice
);
592 if (pDevice
->bUpdateBBVGA
) {
593 pDevice
->byBBVGACurrent
= pDevice
->abyBBVGA
[0];
594 pDevice
->byBBVGANew
= pDevice
->byBBVGACurrent
;
595 BBvSetVGAGainOffset(pDevice
, pDevice
->abyBBVGA
[0]);
598 pDevice
->byRadioCtl
= pDevice
->abyEEPROM
[EEP_OFS_RADIOCTL
];
599 pDevice
->bHWRadioOff
= FALSE
;
600 if ( (pDevice
->byRadioCtl
& EEP_RADIOCTL_ENABLE
) != 0 ) {
601 ntStatus
= CONTROLnsRequestIn(pDevice
,
604 MESSAGE_REQUEST_MACREG
,
608 if ( ntStatus
!= STATUS_SUCCESS
) {
609 spin_unlock_irq(&pDevice
->lock
);
612 if ( (byTmp
& GPIO3_DATA
) == 0 ) {
613 pDevice
->bHWRadioOff
= TRUE
;
614 MACvRegBitsOn(pDevice
,MAC_REG_GPIOCTL1
,GPIO3_INTMD
);
616 MACvRegBitsOff(pDevice
,MAC_REG_GPIOCTL1
,GPIO3_INTMD
);
617 pDevice
->bHWRadioOff
= FALSE
;
620 } //EEP_RADIOCTL_ENABLE
622 ControlvMaskByte(pDevice
,MESSAGE_REQUEST_MACREG
,MAC_REG_PAPEDELAY
,LEDSTS_TMLEN
,0x38);
623 ControlvMaskByte(pDevice
,MESSAGE_REQUEST_MACREG
,MAC_REG_PAPEDELAY
,LEDSTS_STS
,LEDSTS_SLOW
);
624 MACvRegBitsOn(pDevice
,MAC_REG_GPIOCTL0
,0x01);
626 if ((pDevice
->bHWRadioOff
== TRUE
) || (pDevice
->bRadioControlOff
== TRUE
)) {
627 CARDbRadioPowerOff(pDevice
);
629 CARDbRadioPowerOn(pDevice
);
632 spin_unlock_irq(&pDevice
->lock
);
633 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"<----INIbInitAdapter Exit\n");
637 static BOOL
device_release_WPADEV(PSDevice pDevice
)
639 viawget_wpa_header
*wpahdr
;
641 // wait_queue_head_t Set_wait;
642 //send device close to wpa_supplicnat layer
643 if (pDevice
->bWPADEVUp
==TRUE
) {
644 wpahdr
= (viawget_wpa_header
*)pDevice
->skb
->data
;
645 wpahdr
->type
= VIAWGET_DEVICECLOSE_MSG
;
646 wpahdr
->resp_ie_len
= 0;
647 wpahdr
->req_ie_len
= 0;
648 skb_put(pDevice
->skb
, sizeof(viawget_wpa_header
));
649 pDevice
->skb
->dev
= pDevice
->wpadev
;
650 skb_reset_mac_header(pDevice
->skb
);
651 pDevice
->skb
->pkt_type
= PACKET_HOST
;
652 pDevice
->skb
->protocol
= htons(ETH_P_802_2
);
653 memset(pDevice
->skb
->cb
, 0, sizeof(pDevice
->skb
->cb
));
654 netif_rx(pDevice
->skb
);
655 pDevice
->skb
= dev_alloc_skb((int)pDevice
->rx_buf_sz
);
657 //wait release WPADEV
658 // init_waitqueue_head(&Set_wait);
659 // wait_event_timeout(Set_wait, ((pDevice->wpadev==NULL)&&(pDevice->skb == NULL)),5*HZ); //1s wait
660 while(pDevice
->bWPADEVUp
==TRUE
) {
661 set_current_state(TASK_UNINTERRUPTIBLE
);
662 schedule_timeout (HZ
/20); //wait 50ms
671 #ifdef CONFIG_PM /* Minimal support for suspend and resume */
673 static int vt6656_suspend(struct usb_interface
*intf
, pm_message_t message
)
675 PSDevice device
= usb_get_intfdata(intf
);
677 if (!device
|| !device
->dev
)
680 if (device
->flags
& DEVICE_FLAGS_OPENED
)
681 device_close(device
->dev
);
683 usb_put_dev(interface_to_usbdev(intf
));
688 static int vt6656_resume(struct usb_interface
*intf
)
690 PSDevice device
= usb_get_intfdata(intf
);
692 if (!device
|| !device
->dev
)
695 usb_get_dev(interface_to_usbdev(intf
));
697 if (!(device
->flags
& DEVICE_FLAGS_OPENED
))
698 device_open(device
->dev
);
703 #endif /* CONFIG_PM */
705 static const struct net_device_ops device_netdev_ops
= {
706 .ndo_open
= device_open
,
707 .ndo_stop
= device_close
,
708 .ndo_do_ioctl
= device_ioctl
,
709 .ndo_get_stats
= device_get_stats
,
710 .ndo_start_xmit
= device_xmit
,
711 .ndo_set_rx_mode
= device_set_multi
,
715 vt6656_probe(struct usb_interface
*intf
, const struct usb_device_id
*id
)
717 u8 fake_mac
[ETH_ALEN
] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
718 struct usb_device
*udev
= interface_to_usbdev(intf
);
720 struct net_device
*netdev
= NULL
;
721 PSDevice pDevice
= NULL
;
723 printk(KERN_NOTICE
"%s Ver. %s\n", DEVICE_FULL_DRV_NAM
, DEVICE_VERSION
);
724 printk(KERN_NOTICE
"Copyright (c) 2004 VIA Networking Technologies, Inc.\n");
726 udev
= usb_get_dev(udev
);
727 netdev
= alloc_etherdev(sizeof(DEVICE_INFO
));
729 printk(KERN_ERR DEVICE_NAME
": allocate net device failed\n");
734 pDevice
= netdev_priv(netdev
);
735 memset(pDevice
, 0, sizeof(DEVICE_INFO
));
737 pDevice
->dev
= netdev
;
740 device_set_options(pDevice
);
741 spin_lock_init(&pDevice
->lock
);
743 pDevice
->tx_80211
= device_dma0_tx_80211
;
744 pDevice
->sMgmtObj
.pAdapter
= (void *) pDevice
;
746 netdev
->netdev_ops
= &device_netdev_ops
;
747 netdev
->wireless_handlers
=
748 (struct iw_handler_def
*) &iwctl_handler_def
;
750 usb_set_intfdata(intf
, pDevice
);
751 SET_NETDEV_DEV(netdev
, &intf
->dev
);
752 memcpy(pDevice
->dev
->dev_addr
, fake_mac
, ETH_ALEN
);
753 rc
= register_netdev(netdev
);
755 printk(KERN_ERR DEVICE_NAME
" Failed to register netdev\n");
759 usb_device_reset(pDevice
);
762 union iwreq_data wrqu
;
763 memset(&wrqu
, 0, sizeof(wrqu
));
764 wrqu
.data
.flags
= RT_INSMOD_EVENT_FLAG
;
765 wrqu
.data
.length
= IFNAMSIZ
;
766 wireless_send_event(pDevice
->dev
,
782 static void device_free_tx_bufs(PSDevice pDevice
)
784 PUSB_SEND_CONTEXT pTxContext
;
787 for (ii
= 0; ii
< pDevice
->cbTD
; ii
++) {
789 pTxContext
= pDevice
->apTD
[ii
];
791 if (pTxContext
->pUrb
) {
792 usb_kill_urb(pTxContext
->pUrb
);
793 usb_free_urb(pTxContext
->pUrb
);
801 static void device_free_rx_bufs(PSDevice pDevice
)
806 for (ii
= 0; ii
< pDevice
->cbRD
; ii
++) {
808 pRCB
= pDevice
->apRCB
[ii
];
811 usb_kill_urb(pRCB
->pUrb
);
812 usb_free_urb(pRCB
->pUrb
);
816 dev_kfree_skb(pRCB
->skb
);
818 kfree(pDevice
->pRCBMem
);
823 static void usb_device_reset(PSDevice pDevice
)
826 status
= usb_reset_device(pDevice
->usb
);
828 printk("usb_device_reset fail status=%d\n",status
);
832 static void device_free_int_bufs(PSDevice pDevice
)
834 kfree(pDevice
->intBuf
.pDataBuf
);
839 static BOOL
device_alloc_bufs(PSDevice pDevice
) {
841 PUSB_SEND_CONTEXT pTxContext
;
846 for (ii
= 0; ii
< pDevice
->cbTD
; ii
++) {
848 pTxContext
= kmalloc(sizeof(USB_SEND_CONTEXT
), GFP_KERNEL
);
849 if (pTxContext
== NULL
) {
850 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
"%s : allocate tx usb context failed\n", pDevice
->dev
->name
);
853 pDevice
->apTD
[ii
] = pTxContext
;
854 pTxContext
->pDevice
= (void *) pDevice
;
856 pTxContext
->pUrb
= usb_alloc_urb(0, GFP_ATOMIC
);
857 if (pTxContext
->pUrb
== NULL
) {
858 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
"alloc tx urb failed\n");
861 pTxContext
->bBoolInUse
= FALSE
;
865 pDevice
->pRCBMem
= kzalloc((sizeof(RCB
) * pDevice
->cbRD
), GFP_KERNEL
);
866 if (pDevice
->pRCBMem
== NULL
) {
867 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
"%s : alloc rx usb context failed\n", pDevice
->dev
->name
);
872 pDevice
->FirstRecvFreeList
= NULL
;
873 pDevice
->LastRecvFreeList
= NULL
;
874 pDevice
->FirstRecvMngList
= NULL
;
875 pDevice
->LastRecvMngList
= NULL
;
876 pDevice
->NumRecvFreeList
= 0;
877 pRCB
= (PRCB
) pDevice
->pRCBMem
;
879 for (ii
= 0; ii
< pDevice
->cbRD
; ii
++) {
881 pDevice
->apRCB
[ii
] = pRCB
;
882 pRCB
->pDevice
= (void *) pDevice
;
884 pRCB
->pUrb
= usb_alloc_urb(0, GFP_ATOMIC
);
886 if (pRCB
->pUrb
== NULL
) {
887 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
" Failed to alloc rx urb\n");
890 pRCB
->skb
= dev_alloc_skb((int)pDevice
->rx_buf_sz
);
891 if (pRCB
->skb
== NULL
) {
892 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
" Failed to alloc rx skb\n");
895 pRCB
->skb
->dev
= pDevice
->dev
;
896 pRCB
->bBoolInUse
= FALSE
;
897 EnqueueRCB(pDevice
->FirstRecvFreeList
, pDevice
->LastRecvFreeList
, pRCB
);
898 pDevice
->NumRecvFreeList
++;
903 pDevice
->pControlURB
= usb_alloc_urb(0, GFP_ATOMIC
);
904 if (pDevice
->pControlURB
== NULL
) {
905 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
"Failed to alloc control urb\n");
909 pDevice
->pInterruptURB
= usb_alloc_urb(0, GFP_ATOMIC
);
910 if (pDevice
->pInterruptURB
== NULL
) {
911 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
"Failed to alloc int urb\n");
912 usb_free_urb(pDevice
->pControlURB
);
916 pDevice
->intBuf
.pDataBuf
= kmalloc(MAX_INTERRUPT_SIZE
, GFP_KERNEL
);
917 if (pDevice
->intBuf
.pDataBuf
== NULL
) {
918 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
"Failed to alloc int buf\n");
919 usb_free_urb(pDevice
->pControlURB
);
920 usb_free_urb(pDevice
->pInterruptURB
);
927 device_free_rx_bufs(pDevice
);
930 device_free_tx_bufs(pDevice
);
938 static BOOL
device_init_defrag_cb(PSDevice pDevice
) {
940 PSDeFragControlBlock pDeF
;
942 /* Init the fragment ctl entries */
943 for (i
= 0; i
< CB_MAX_RX_FRAG
; i
++) {
944 pDeF
= &(pDevice
->sRxDFCB
[i
]);
945 if (!device_alloc_frag_buf(pDevice
, pDeF
)) {
946 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
"%s: can not alloc frag bufs\n",
951 pDevice
->cbDFCB
= CB_MAX_RX_FRAG
;
952 pDevice
->cbFreeDFCB
= pDevice
->cbDFCB
;
956 device_free_frag_bufs(pDevice
);
962 static void device_free_frag_bufs(PSDevice pDevice
) {
963 PSDeFragControlBlock pDeF
;
966 for (i
= 0; i
< CB_MAX_RX_FRAG
; i
++) {
968 pDeF
= &(pDevice
->sRxDFCB
[i
]);
971 dev_kfree_skb(pDeF
->skb
);
977 BOOL
device_alloc_frag_buf(PSDevice pDevice
, PSDeFragControlBlock pDeF
) {
979 pDeF
->skb
= dev_alloc_skb((int)pDevice
->rx_buf_sz
);
980 if (pDeF
->skb
== NULL
)
983 pDeF
->skb
->dev
= pDevice
->dev
;
989 /*-----------------------------------------------------------------*/
991 static int device_open(struct net_device
*dev
) {
992 PSDevice pDevice
=(PSDevice
) netdev_priv(dev
);
994 extern SWPAResult wpa_Result
;
995 memset(wpa_Result
.ifname
,0,sizeof(wpa_Result
.ifname
));
996 wpa_Result
.proto
= 0;
997 wpa_Result
.key_mgmt
= 0;
998 wpa_Result
.eap_type
= 0;
999 wpa_Result
.authenticated
= FALSE
;
1000 pDevice
->fWPA_Authened
= FALSE
;
1002 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" device_open...\n");
1005 pDevice
->rx_buf_sz
= MAX_TOTAL_SIZE_WITH_ALL_HEADERS
;
1007 if (device_alloc_bufs(pDevice
) == FALSE
) {
1008 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" device_alloc_bufs fail... \n");
1012 if (device_init_defrag_cb(pDevice
)== FALSE
) {
1013 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" Initial defragement cb fail \n");
1017 MP_CLEAR_FLAG(pDevice
, fMP_DISCONNECTED
);
1018 MP_CLEAR_FLAG(pDevice
, fMP_CONTROL_READS
);
1019 MP_CLEAR_FLAG(pDevice
, fMP_CONTROL_WRITES
);
1020 MP_SET_FLAG(pDevice
, fMP_POST_READS
);
1021 MP_SET_FLAG(pDevice
, fMP_POST_WRITES
);
1024 Read_config_file(pDevice
);
1026 if (device_init_registers(pDevice
, DEVICE_INIT_COLD
) == FALSE
) {
1027 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" init register fail\n");
1031 device_set_multi(pDevice
->dev
);
1032 // Init for Key Management
1034 KeyvInitTable(pDevice
,&pDevice
->sKey
);
1035 memcpy(pDevice
->sMgmtObj
.abyMACAddr
, pDevice
->abyCurrentNetAddr
, ETH_ALEN
);
1036 memcpy(pDevice
->dev
->dev_addr
, pDevice
->abyCurrentNetAddr
, ETH_ALEN
);
1037 pDevice
->bStopTx0Pkt
= FALSE
;
1038 pDevice
->bStopDataPkt
= FALSE
;
1039 pDevice
->bRoaming
= FALSE
;
1040 pDevice
->bIsRoaming
= FALSE
;
1041 pDevice
->bEnableRoaming
= FALSE
;
1042 if (pDevice
->bDiversityRegCtlON
) {
1043 device_init_diversity_timer(pDevice
);
1046 vMgrObjectInit(pDevice
);
1047 tasklet_init(&pDevice
->RxMngWorkItem
, (void *)RXvMngWorkItem
, (unsigned long)pDevice
);
1048 tasklet_init(&pDevice
->ReadWorkItem
, (void *)RXvWorkItem
, (unsigned long)pDevice
);
1049 tasklet_init(&pDevice
->EventWorkItem
, (void *)INTvWorkItem
, (unsigned long)pDevice
);
1050 add_timer(&(pDevice
->sMgmtObj
.sTimerSecondCallback
));
1051 pDevice
->int_interval
= 100; //Max 100 microframes.
1052 pDevice
->eEncryptionStatus
= Ndis802_11EncryptionDisabled
;
1054 pDevice
->bIsRxWorkItemQueued
= TRUE
;
1055 pDevice
->fKillEventPollingThread
= FALSE
;
1056 pDevice
->bEventAvailable
= FALSE
;
1058 pDevice
->bWPADEVUp
= FALSE
;
1059 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1060 pDevice
->bwextstep0
= FALSE
;
1061 pDevice
->bwextstep1
= FALSE
;
1062 pDevice
->bwextstep2
= FALSE
;
1063 pDevice
->bwextstep3
= FALSE
;
1064 pDevice
->bWPASuppWextEnabled
= FALSE
;
1066 pDevice
->byReAssocCount
= 0;
1068 RXvWorkItem(pDevice
);
1069 INTvWorkItem(pDevice
);
1071 // Patch: if WEP key already set by iwconfig but device not yet open
1072 if ((pDevice
->bEncryptionEnable
== TRUE
) && (pDevice
->bTransmitKey
== TRUE
)) {
1073 spin_lock_irq(&pDevice
->lock
);
1074 KeybSetDefaultKey( pDevice
,
1076 pDevice
->byKeyIndex
| (1 << 31),
1077 pDevice
->uKeyLength
,
1082 spin_unlock_irq(&pDevice
->lock
);
1083 pDevice
->eEncryptionStatus
= Ndis802_11Encryption1Enabled
;
1086 if (pDevice
->sMgmtObj
.eConfigMode
== WMAC_CONFIG_AP
) {
1087 bScheduleCommand((void *) pDevice
, WLAN_CMD_RUN_AP
, NULL
);
1090 //mike:mark@2008-11-10
1091 bScheduleCommand((void *) pDevice
, WLAN_CMD_BSSID_SCAN
, NULL
);
1092 /* bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL); */
1096 netif_stop_queue(pDevice
->dev
);
1097 pDevice
->flags
|= DEVICE_FLAGS_OPENED
;
1100 union iwreq_data wrqu
;
1101 memset(&wrqu
, 0, sizeof(wrqu
));
1102 wrqu
.data
.flags
= RT_UPDEV_EVENT_FLAG
;
1103 wireless_send_event(pDevice
->dev
, IWEVCUSTOM
, &wrqu
, NULL
);
1106 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"device_open success.. \n");
1110 device_free_frag_bufs(pDevice
);
1112 device_free_rx_bufs(pDevice
);
1113 device_free_tx_bufs(pDevice
);
1114 device_free_int_bufs(pDevice
);
1115 usb_kill_urb(pDevice
->pControlURB
);
1116 usb_kill_urb(pDevice
->pInterruptURB
);
1117 usb_free_urb(pDevice
->pControlURB
);
1118 usb_free_urb(pDevice
->pInterruptURB
);
1120 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"device_open fail.. \n");
1126 static int device_close(struct net_device
*dev
) {
1127 PSDevice pDevice
=(PSDevice
) netdev_priv(dev
);
1128 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
1132 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"device_close1 \n");
1133 if (pDevice
== NULL
)
1137 union iwreq_data wrqu
;
1138 memset(&wrqu
, 0, sizeof(wrqu
));
1139 wrqu
.data
.flags
= RT_DOWNDEV_EVENT_FLAG
;
1140 wireless_send_event(pDevice
->dev
, IWEVCUSTOM
, &wrqu
, NULL
);
1143 if (pDevice
->bLinkPass
) {
1144 bScheduleCommand((void *) pDevice
, WLAN_CMD_DISASSOCIATE
, NULL
);
1148 device_release_WPADEV(pDevice
);
1150 memset(pMgmt
->abyDesireSSID
, 0, WLAN_IEHDR_LEN
+ WLAN_SSID_MAXLEN
+ 1);
1151 pMgmt
->bShareKeyAlgorithm
= FALSE
;
1152 pDevice
->bEncryptionEnable
= FALSE
;
1153 pDevice
->eEncryptionStatus
= Ndis802_11EncryptionDisabled
;
1154 spin_lock_irq(&pDevice
->lock
);
1155 for (uu
= 0; uu
< MAX_KEY_TABLE
; uu
++)
1156 MACvDisableKeyEntry(pDevice
,uu
);
1157 spin_unlock_irq(&pDevice
->lock
);
1159 if ((pDevice
->flags
& DEVICE_FLAGS_UNPLUG
) == FALSE
) {
1160 MACbShutdown(pDevice
);
1162 netif_stop_queue(pDevice
->dev
);
1163 MP_SET_FLAG(pDevice
, fMP_DISCONNECTED
);
1164 MP_CLEAR_FLAG(pDevice
, fMP_POST_WRITES
);
1165 MP_CLEAR_FLAG(pDevice
, fMP_POST_READS
);
1166 pDevice
->fKillEventPollingThread
= TRUE
;
1167 del_timer(&pDevice
->sTimerCommand
);
1168 del_timer(&pMgmt
->sTimerSecondCallback
);
1170 del_timer(&pDevice
->sTimerTxData
);
1172 if (pDevice
->bDiversityRegCtlON
) {
1173 del_timer(&pDevice
->TimerSQ3Tmax1
);
1174 del_timer(&pDevice
->TimerSQ3Tmax2
);
1175 del_timer(&pDevice
->TimerSQ3Tmax3
);
1177 tasklet_kill(&pDevice
->RxMngWorkItem
);
1178 tasklet_kill(&pDevice
->ReadWorkItem
);
1179 tasklet_kill(&pDevice
->EventWorkItem
);
1181 pDevice
->bRoaming
= FALSE
;
1182 pDevice
->bIsRoaming
= FALSE
;
1183 pDevice
->bEnableRoaming
= FALSE
;
1184 pDevice
->bCmdRunning
= FALSE
;
1185 pDevice
->bLinkPass
= FALSE
;
1186 memset(pMgmt
->abyCurrBSSID
, 0, 6);
1187 pMgmt
->eCurrState
= WMAC_STATE_IDLE
;
1189 device_free_tx_bufs(pDevice
);
1190 device_free_rx_bufs(pDevice
);
1191 device_free_int_bufs(pDevice
);
1192 device_free_frag_bufs(pDevice
);
1194 usb_kill_urb(pDevice
->pControlURB
);
1195 usb_kill_urb(pDevice
->pInterruptURB
);
1196 usb_free_urb(pDevice
->pControlURB
);
1197 usb_free_urb(pDevice
->pInterruptURB
);
1199 BSSvClearNodeDBTable(pDevice
, 0);
1200 pDevice
->flags
&=(~DEVICE_FLAGS_OPENED
);
1202 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"device_close2 \n");
1207 static void __devexit
vt6656_disconnect(struct usb_interface
*intf
)
1209 PSDevice device
= usb_get_intfdata(intf
);
1215 union iwreq_data req
;
1216 memset(&req
, 0, sizeof(req
));
1217 req
.data
.flags
= RT_RMMOD_EVENT_FLAG
;
1218 wireless_send_event(device
->dev
, IWEVCUSTOM
, &req
, NULL
);
1221 device_release_WPADEV(device
);
1222 release_firmware(device
->firmware
);
1224 usb_set_intfdata(intf
, NULL
);
1225 usb_put_dev(interface_to_usbdev(intf
));
1227 device
->flags
|= DEVICE_FLAGS_UNPLUG
;
1230 unregister_netdev(device
->dev
);
1231 wpa_set_wpadev(device
, 0);
1232 free_netdev(device
->dev
);
1236 static int device_dma0_tx_80211(struct sk_buff
*skb
, struct net_device
*dev
)
1238 PSDevice pDevice
= netdev_priv(dev
);
1240 spin_lock_irq(&pDevice
->lock
);
1242 if (unlikely(pDevice
->bStopTx0Pkt
))
1243 dev_kfree_skb_irq(skb
);
1245 vDMA0_tx_80211(pDevice
, skb
);
1247 spin_unlock_irq(&pDevice
->lock
);
1249 return NETDEV_TX_OK
;
1252 static int device_xmit(struct sk_buff
*skb
, struct net_device
*dev
)
1254 PSDevice pDevice
= netdev_priv(dev
);
1255 struct net_device_stats
*stats
= &pDevice
->stats
;
1257 spin_lock_irq(&pDevice
->lock
);
1259 netif_stop_queue(dev
);
1261 if (!pDevice
->bLinkPass
) {
1262 dev_kfree_skb_irq(skb
);
1266 if (pDevice
->bStopDataPkt
) {
1267 dev_kfree_skb_irq(skb
);
1268 stats
->tx_dropped
++;
1272 if (nsDMA_tx_packet(pDevice
, TYPE_AC0DMA
, skb
)) {
1273 if (netif_queue_stopped(dev
))
1274 netif_wake_queue(dev
);
1278 spin_unlock_irq(&pDevice
->lock
);
1280 return NETDEV_TX_OK
;
1283 static unsigned const ethernet_polynomial
= 0x04c11db7U
;
1284 static inline u32
ether_crc(int length
, unsigned char *data
)
1288 while(--length
>= 0) {
1289 unsigned char current_octet
= *data
++;
1291 for (bit
= 0; bit
< 8; bit
++, current_octet
>>= 1) {
1293 ((crc
< 0) ^ (current_octet
& 1) ? ethernet_polynomial
: 0);
1299 //find out the start position of str2 from str1
1300 static unsigned char *kstrstr(const unsigned char *str1
,
1301 const unsigned char *str2
) {
1302 int str1_len
= strlen(str1
);
1303 int str2_len
= strlen(str2
);
1305 while (str1_len
>= str2_len
) {
1307 if(memcmp(str1
,str2
,str2_len
)==0)
1308 return (unsigned char *) str1
;
1314 static int Config_FileGetParameter(unsigned char *string
,
1315 unsigned char *dest
,
1316 unsigned char *source
)
1318 unsigned char buf1
[100];
1319 unsigned char buf2
[100];
1320 unsigned char *start_p
= NULL
, *end_p
= NULL
, *tmp_p
= NULL
;
1324 strcat(buf1
, string
);
1326 source
+=strlen(buf1
);
1328 //find target string start point
1329 start_p
= kstrstr(source
,buf1
);
1330 if (start_p
== NULL
)
1333 //check if current config line is marked by "#" ??
1334 for (ii
= 1; ; ii
++) {
1335 if (memcmp(start_p
- ii
, "\n", 1) == 0)
1337 if (memcmp(start_p
- ii
, "#", 1) == 0)
1341 //find target string end point
1342 end_p
= kstrstr(start_p
,"\n");
1343 if (end_p
== NULL
) { //can't find "\n",but don't care
1344 end_p
=start_p
+strlen(start_p
); //no include "\n"
1348 memcpy(buf2
,start_p
,end_p
-start_p
); //get the tartget line
1349 buf2
[end_p
-start_p
]='\0';
1352 start_p
= kstrstr(buf2
,"=");
1353 if (start_p
== NULL
)
1356 strcpy(buf1
,start_p
+1);
1360 while(*tmp_p
!= 0x00) {
1367 memcpy(dest
,tmp_p
,strlen(tmp_p
));
1371 //if read fail,return NULL,or return data pointer;
1372 static unsigned char *Config_FileOperation(PSDevice pDevice
)
1374 unsigned char *config_path
= CONFIG_PATH
;
1375 unsigned char *buffer
= NULL
;
1376 struct file
*filp
=NULL
;
1377 mm_segment_t old_fs
= get_fs();
1378 //int oldfsuid=0,oldfsgid=0;
1382 /* Can't do this anymore, so we rely on correct filesystem permissions:
1383 //Make sure a caller can read or write power as root
1384 oldfsuid=current->fsuid;
1385 oldfsgid=current->fsgid;
1391 filp
= filp_open(config_path
, O_RDWR
, 0);
1393 printk("Config_FileOperation file Not exist\n");
1398 if(!(filp
->f_op
) || !(filp
->f_op
->read
) ||!(filp
->f_op
->write
)) {
1399 printk("file %s cann't readable or writable?\n",config_path
);
1404 buffer
= kmalloc(1024, GFP_KERNEL
);
1406 printk("allocate mem for file fail?\n");
1411 if(filp
->f_op
->read(filp
, buffer
, 1024, &filp
->f_pos
)<0) {
1412 printk("read file error?\n");
1417 if(filp_close(filp
,NULL
))
1418 printk("Config_FileOperation:close file fail\n");
1424 current->fsuid=oldfsuid;
1425 current->fsgid=oldfsgid;
1435 //return --->-1:fail; >=0:successful
1436 static int Read_config_file(PSDevice pDevice
) {
1438 unsigned char tmpbuffer
[100];
1439 unsigned char *buffer
= NULL
;
1441 //init config setting
1442 pDevice
->config_file
.ZoneType
= -1;
1443 pDevice
->config_file
.eAuthenMode
= -1;
1444 pDevice
->config_file
.eEncryptionStatus
= -1;
1446 buffer
= Config_FileOperation(pDevice
);
1447 if (buffer
== NULL
) {
1454 memset(tmpbuffer
,0,sizeof(tmpbuffer
));
1455 if(Config_FileGetParameter("ZONETYPE",tmpbuffer
,buffer
) ==TRUE
) {
1456 if(memcmp(tmpbuffer
,"USA",3)==0) {
1457 pDevice
->config_file
.ZoneType
=ZoneType_USA
;
1459 else if(memcmp(tmpbuffer
,"JAPAN",5)==0) {
1460 pDevice
->config_file
.ZoneType
=ZoneType_Japan
;
1462 else if(memcmp(tmpbuffer
,"EUROPE",6)==0) {
1463 pDevice
->config_file
.ZoneType
=ZoneType_Europe
;
1466 printk("Unknown Zonetype[%s]?\n",tmpbuffer
);
1471 //get other parameter
1473 memset(tmpbuffer
,0,sizeof(tmpbuffer
));
1474 if(Config_FileGetParameter("AUTHENMODE",tmpbuffer
,buffer
)==TRUE
) {
1475 pDevice
->config_file
.eAuthenMode
= (int) simple_strtol(tmpbuffer
, NULL
, 10);
1478 memset(tmpbuffer
,0,sizeof(tmpbuffer
));
1479 if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer
,buffer
)==TRUE
) {
1480 pDevice
->config_file
.eEncryptionStatus
= (int) simple_strtol(tmpbuffer
, NULL
, 10);
1488 static void device_set_multi(struct net_device
*dev
) {
1489 PSDevice pDevice
= (PSDevice
) netdev_priv(dev
);
1490 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
1493 struct netdev_hw_addr
*ha
;
1494 BYTE pbyData
[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
1499 spin_lock_irq(&pDevice
->lock
);
1500 rc
= CONTROLnsRequestIn(pDevice
,
1503 MESSAGE_REQUEST_MACREG
,
1507 if (rc
== 0) pDevice
->byRxMode
= byTmpMode
;
1509 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"pDevice->byRxMode in= %x\n", pDevice
->byRxMode
);
1511 if (dev
->flags
& IFF_PROMISC
) { // Set promiscuous.
1512 DBG_PRT(MSG_LEVEL_ERR
,KERN_NOTICE
"%s: Promiscuous mode enabled.\n", dev
->name
);
1513 // Unconditionally log net taps.
1514 pDevice
->byRxMode
|= (RCR_MULTICAST
|RCR_BROADCAST
|RCR_UNICAST
);
1516 else if ((netdev_mc_count(dev
) > pDevice
->multicast_limit
) ||
1517 (dev
->flags
& IFF_ALLMULTI
)) {
1518 CONTROLnsRequestOut(pDevice
,
1521 MESSAGE_REQUEST_MACREG
,
1525 pDevice
->byRxMode
|= (RCR_MULTICAST
|RCR_BROADCAST
);
1528 memset(mc_filter
, 0, sizeof(mc_filter
));
1529 netdev_for_each_mc_addr(ha
, dev
) {
1530 int bit_nr
= ether_crc(ETH_ALEN
, ha
->addr
) >> 26;
1531 mc_filter
[bit_nr
>> 5] |= cpu_to_le32(1 << (bit_nr
& 31));
1533 for (ii
= 0; ii
< 4; ii
++) {
1534 MACvWriteMultiAddr(pDevice
, ii
, *((PBYTE
)&mc_filter
[0] + ii
));
1535 MACvWriteMultiAddr(pDevice
, ii
+ 4, *((PBYTE
)&mc_filter
[1] + ii
));
1537 pDevice
->byRxMode
&= ~(RCR_UNICAST
);
1538 pDevice
->byRxMode
|= (RCR_MULTICAST
|RCR_BROADCAST
);
1541 if (pMgmt
->eConfigMode
== WMAC_CONFIG_AP
) {
1542 // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
1543 pDevice
->byRxMode
|= (RCR_MULTICAST
|RCR_BROADCAST
);
1544 pDevice
->byRxMode
&= ~(RCR_UNICAST
);
1546 ControlvWriteByte(pDevice
, MESSAGE_REQUEST_MACREG
, MAC_REG_RCR
, pDevice
->byRxMode
);
1547 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"pDevice->byRxMode out= %x\n", pDevice
->byRxMode
);
1548 spin_unlock_irq(&pDevice
->lock
);
1553 static struct net_device_stats
*device_get_stats(struct net_device
*dev
) {
1554 PSDevice pDevice
=(PSDevice
) netdev_priv(dev
);
1556 return &pDevice
->stats
;
1560 static int device_ioctl(struct net_device
*dev
, struct ifreq
*rq
, int cmd
) {
1561 PSDevice pDevice
= (PSDevice
)netdev_priv(dev
);
1562 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
1564 //BOOL bCommit = FALSE;
1565 struct iwreq
*wrq
= (struct iwreq
*) rq
;
1568 if (pMgmt
== NULL
) {
1576 rc
= iwctl_giwname(dev
, NULL
, (char *)&(wrq
->u
.name
), NULL
);
1580 case SIOCGIWNWID
: //0x8b03 support
1584 // Set frequency/channel
1586 rc
= iwctl_siwfreq(dev
, NULL
, &(wrq
->u
.freq
), NULL
);
1589 // Get frequency/channel
1591 rc
= iwctl_giwfreq(dev
, NULL
, &(wrq
->u
.freq
), NULL
);
1594 // Set desired network name (ESSID)
1598 char essid
[IW_ESSID_MAX_SIZE
+1];
1599 if (wrq
->u
.essid
.length
> IW_ESSID_MAX_SIZE
) {
1603 if (copy_from_user(essid
, wrq
->u
.essid
.pointer
,
1604 wrq
->u
.essid
.length
)) {
1608 rc
= iwctl_siwessid(dev
, NULL
,
1609 &(wrq
->u
.essid
), essid
);
1614 // Get current network name (ESSID)
1618 char essid
[IW_ESSID_MAX_SIZE
+1];
1619 if (wrq
->u
.essid
.pointer
) {
1620 iwctl_giwessid(dev
, NULL
,
1621 &(wrq
->u
.essid
), essid
);
1622 if (copy_to_user(wrq
->u
.essid
.pointer
,
1624 wrq
->u
.essid
.length
) )
1632 rc
= iwctl_siwap(dev
, NULL
, &(wrq
->u
.ap_addr
), NULL
);
1636 // Get current Access Point (BSSID)
1638 rc
= iwctl_giwap(dev
, NULL
, &(wrq
->u
.ap_addr
), NULL
);
1642 // Set desired station name
1644 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWNICKN \n");
1648 // Get current station name
1650 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCGIWNICKN \n");
1654 // Set the desired bit-rate
1656 rc
= iwctl_siwrate(dev
, NULL
, &(wrq
->u
.bitrate
), NULL
);
1659 // Get the current bit-rate
1661 iwctl_giwrate(dev
, NULL
, &(wrq
->u
.bitrate
), NULL
);
1664 // Set the desired RTS threshold
1667 rc
= iwctl_siwrts(dev
, &(wrq
->u
.rts
));
1670 // Get the current RTS threshold
1673 rc
= iwctl_giwrts(dev
, NULL
, &(wrq
->u
.rts
), NULL
);
1676 // Set the desired fragmentation threshold
1679 rc
= iwctl_siwfrag(dev
, NULL
, &(wrq
->u
.frag
), NULL
);
1682 // Get the current fragmentation threshold
1685 rc
= iwctl_giwfrag(dev
, NULL
, &(wrq
->u
.frag
), NULL
);
1688 // Set mode of operation
1690 rc
= iwctl_siwmode(dev
, NULL
, &(wrq
->u
.mode
), NULL
);
1693 // Get mode of operation
1695 iwctl_giwmode(dev
, NULL
, &(wrq
->u
.mode
), NULL
);
1698 // Set WEP keys and mode
1701 char abyKey
[WLAN_WEP232_KEYLEN
];
1703 if (wrq
->u
.encoding
.pointer
) {
1706 if (wrq
->u
.encoding
.length
> WLAN_WEP232_KEYLEN
) {
1710 memset(abyKey
, 0, WLAN_WEP232_KEYLEN
);
1711 if (copy_from_user(abyKey
,
1712 wrq
->u
.encoding
.pointer
,
1713 wrq
->u
.encoding
.length
)) {
1717 } else if (wrq
->u
.encoding
.length
!= 0) {
1721 rc
= iwctl_siwencode(dev
, NULL
, &(wrq
->u
.encoding
), abyKey
);
1725 // Get the WEP keys and mode
1728 if (!capable(CAP_NET_ADMIN
)) {
1733 char abyKey
[WLAN_WEP232_KEYLEN
];
1735 rc
= iwctl_giwencode(dev
, NULL
, &(wrq
->u
.encoding
), abyKey
);
1737 if (wrq
->u
.encoding
.pointer
) {
1738 if (copy_to_user(wrq
->u
.encoding
.pointer
,
1740 wrq
->u
.encoding
.length
))
1746 // Get the current Tx-Power
1748 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCGIWTXPOW \n");
1753 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCGIWTXPOW \n");
1759 rc
= iwctl_siwretry(dev
, NULL
, &(wrq
->u
.retry
), NULL
);
1764 rc
= iwctl_giwretry(dev
, NULL
, &(wrq
->u
.retry
), NULL
);
1767 // Get range of parameters
1771 struct iw_range range
;
1773 iwctl_giwrange(dev
, NULL
, &(wrq
->u
.data
), (char *) &range
);
1774 if (copy_to_user(wrq
->u
.data
.pointer
, &range
, sizeof(struct iw_range
)))
1782 rc
= iwctl_giwpower(dev
, NULL
, &(wrq
->u
.power
), NULL
);
1788 rc
= iwctl_siwpower(dev
, NULL
, &(wrq
->u
.power
), NULL
);
1794 rc
= iwctl_giwsens(dev
, NULL
, &(wrq
->u
.sens
), NULL
);
1798 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWSENS \n");
1804 char buffer
[IW_MAX_AP
* (sizeof(struct sockaddr
) + sizeof(struct iw_quality
))];
1806 if (wrq
->u
.data
.pointer
) {
1807 rc
= iwctl_giwaplist(dev
, NULL
, &(wrq
->u
.data
), buffer
);
1809 if (copy_to_user(wrq
->u
.data
.pointer
,
1811 (wrq
->u
.data
.length
* (sizeof(struct sockaddr
) + sizeof(struct iw_quality
)))
1824 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWSPY \n");
1831 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWSPY \n");
1835 #endif // WIRELESS_SPY
1838 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCGIWPRIV \n");
1841 if(wrq->u.data.pointer) {
1842 wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
1844 if(copy_to_user(wrq->u.data.pointer,
1845 (u_char *) iwctl_private_args,
1846 sizeof(iwctl_private_args)))
1852 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1854 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWAUTH\n");
1855 rc
= iwctl_siwauth(dev
, NULL
, &(wrq
->u
.param
), NULL
);
1859 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCGIWAUTH \n");
1860 rc
= iwctl_giwauth(dev
, NULL
, &(wrq
->u
.param
), NULL
);
1864 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWGENIE \n");
1865 rc
= iwctl_siwgenie(dev
, NULL
, &(wrq
->u
.data
), wrq
->u
.data
.pointer
);
1869 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCGIWGENIE \n");
1870 rc
= iwctl_giwgenie(dev
, NULL
, &(wrq
->u
.data
), wrq
->u
.data
.pointer
);
1873 case SIOCSIWENCODEEXT
:
1875 char extra
[sizeof(struct iw_encode_ext
)+MAX_KEY_LEN
+1];
1876 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWENCODEEXT \n");
1877 if(wrq
->u
.encoding
.pointer
){
1878 memset(extra
, 0, sizeof(struct iw_encode_ext
)+MAX_KEY_LEN
+1);
1879 if(wrq
->u
.encoding
.length
> (sizeof(struct iw_encode_ext
)+ MAX_KEY_LEN
)){
1883 if(copy_from_user(extra
, wrq
->u
.encoding
.pointer
,wrq
->u
.encoding
.length
)){
1887 }else if(wrq
->u
.encoding
.length
!= 0){
1891 rc
= iwctl_siwencodeext(dev
, NULL
, &(wrq
->u
.encoding
), extra
);
1895 case SIOCGIWENCODEEXT
:
1896 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCGIWENCODEEXT \n");
1897 rc
= iwctl_giwencodeext(dev
, NULL
, &(wrq
->u
.encoding
), NULL
);
1901 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWMLME \n");
1902 rc
= iwctl_siwmlme(dev
, NULL
, &(wrq
->u
.data
), wrq
->u
.data
.pointer
);
1905 #endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1907 case IOCTL_CMD_TEST
:
1909 if (!(pDevice
->flags
& DEVICE_FLAGS_OPENED
)) {
1915 pReq
= (PSCmdRequest
)rq
;
1917 //20080130-01,<Remark> by Mike Liu
1918 // if(pDevice->bLinkPass==TRUE)
1919 pReq
->wResult
= MAGIC_CODE
; //Linking status:0x3142
1920 //20080130-02,<Remark> by Mike Liu
1922 // pReq->wResult = MAGIC_CODE+1; //disconnect status:0x3143
1926 if (!(pDevice
->flags
& DEVICE_FLAGS_OPENED
) &&
1927 (((PSCmdRequest
)rq
)->wCmdCode
!=WLAN_CMD_SET_WPA
))
1935 if (test_and_set_bit( 0, (void*)&(pMgmt
->uCmdBusy
))) {
1938 rc
= private_ioctl(pDevice
, rq
);
1939 clear_bit( 0, (void*)&(pMgmt
->uCmdBusy
));
1942 case IOCTL_CMD_HOSTAPD
:
1944 if (!(pDevice
->flags
& DEVICE_FLAGS_OPENED
)) {
1951 rc
= vt6656_hostap_ioctl(pDevice
, &wrq
->u
.data
);
1956 if (!(pDevice
->flags
& DEVICE_FLAGS_OPENED
)) {
1963 rc
= wpa_ioctl(pDevice
, &wrq
->u
.data
);
1967 return ethtool_ioctl(dev
, (void *) rq
->ifr_data
);
1968 // All other calls are currently unsupported
1972 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Ioctl command not support..%x\n", cmd
);
1977 if (pDevice
->bCommit
) {
1978 if (pMgmt
->eConfigMode
== WMAC_CONFIG_AP
) {
1979 netif_stop_queue(pDevice
->dev
);
1980 spin_lock_irq(&pDevice
->lock
);
1981 bScheduleCommand((void *) pDevice
, WLAN_CMD_RUN_AP
, NULL
);
1982 spin_unlock_irq(&pDevice
->lock
);
1985 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Commit the settings\n");
1986 spin_lock_irq(&pDevice
->lock
);
1987 //2007-1121-01<Modify>by EinsnLiu
1988 if (pDevice
->bLinkPass
&&
1989 memcmp(pMgmt
->abyCurrSSID
,pMgmt
->abyDesireSSID
,WLAN_IEHDR_LEN
+ WLAN_SSID_MAXLEN
)) {
1990 bScheduleCommand((void *) pDevice
, WLAN_CMD_DISASSOCIATE
, NULL
);
1992 pDevice
->bLinkPass
= FALSE
;
1993 pMgmt
->eCurrState
= WMAC_STATE_IDLE
;
1994 memset(pMgmt
->abyCurrBSSID
, 0, 6);
1996 ControlvMaskByte(pDevice
,MESSAGE_REQUEST_MACREG
,MAC_REG_PAPEDELAY
,LEDSTS_STS
,LEDSTS_SLOW
);
1998 netif_stop_queue(pDevice
->dev
);
1999 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2000 pMgmt
->eScanType
= WMAC_SCAN_ACTIVE
;
2001 if (!pDevice
->bWPASuppWextEnabled
)
2003 bScheduleCommand((void *) pDevice
,
2004 WLAN_CMD_BSSID_SCAN
,
2005 pMgmt
->abyDesireSSID
);
2006 bScheduleCommand((void *) pDevice
,
2009 spin_unlock_irq(&pDevice
->lock
);
2011 pDevice
->bCommit
= FALSE
;
2019 static int ethtool_ioctl(struct net_device
*dev
, void *useraddr
)
2023 if (copy_from_user(ðcmd
, useraddr
, sizeof(ethcmd
)))
2027 case ETHTOOL_GDRVINFO
: {
2028 struct ethtool_drvinfo info
= {ETHTOOL_GDRVINFO
};
2029 strncpy(info
.driver
, DEVICE_NAME
, sizeof(info
.driver
)-1);
2030 strncpy(info
.version
, DEVICE_VERSION
, sizeof(info
.version
)-1);
2031 if (copy_to_user(useraddr
, &info
, sizeof(info
)))
2042 /*------------------------------------------------------------------*/
2044 MODULE_DEVICE_TABLE(usb
, vt6656_table
);
2046 static struct usb_driver vt6656_driver
= {
2047 .name
= DEVICE_NAME
,
2048 .probe
= vt6656_probe
,
2049 .disconnect
= vt6656_disconnect
,
2050 .id_table
= vt6656_table
,
2052 .suspend
= vt6656_suspend
,
2053 .resume
= vt6656_resume
,
2054 #endif /* CONFIG_PM */
2057 module_usb_driver(vt6656_driver
);