2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 * Purpose: driver entry for initial, open, close, tx and rx.
29 * vt6656_probe - module initial (insmod) driver entry
30 * device_remove1 - module remove entry
31 * device_open - allocate dma/descripter resource & initial mac/bbp function
32 * device_xmit - asynchrous data tx function
33 * device_set_multi - set mac filter
34 * device_ioctl - ioctl entry
35 * device_close - shutdown mac/bbp & free dma/descripter resource
36 * device_alloc_frag_buf - rx fragement pre-allocated function
37 * device_free_tx_bufs - free tx buffer function
38 * device_dma0_tx_80211- tx 802.11 frame via dma0
39 * device_dma0_xmit- tx PS bufferred frame via dma0
40 * device_init_registers- initial MAC & BBP & RF internal registers.
41 * device_init_rings- initial tx/rx ring buffer
42 * device_init_defrag_cb- initial & allocate de-fragement buffer.
43 * device_tx_srv- tx interrupt service function
76 /*--------------------- Static Definitions -------------------------*/
77 //static int msglevel =MSG_LEVEL_DEBUG;
78 static int msglevel
=MSG_LEVEL_INFO
;
81 // Define module options
84 // Version Information
85 #define DRIVER_AUTHOR "VIA Networking Technologies, Inc., <lyndonchen@vntek.com.tw>"
86 MODULE_AUTHOR(DRIVER_AUTHOR
);
87 MODULE_LICENSE("GPL");
88 MODULE_DESCRIPTION(DEVICE_FULL_DRV_NAM
);
90 #define DEVICE_PARAM(N,D) \
91 static int N[MAX_UINTS]=OPTION_DEFAULT;\
92 module_param_array(N, int, NULL, 0);\
93 MODULE_PARM_DESC(N, D);
95 #define RX_DESC_MIN0 16
96 #define RX_DESC_MAX0 128
97 #define RX_DESC_DEF0 64
98 DEVICE_PARAM(RxDescriptors0
,"Number of receive usb desc buffer");
101 #define TX_DESC_MIN0 16
102 #define TX_DESC_MAX0 128
103 #define TX_DESC_DEF0 64
104 DEVICE_PARAM(TxDescriptors0
,"Number of transmit usb desc buffer");
107 #define CHANNEL_MIN 1
108 #define CHANNEL_MAX 14
109 #define CHANNEL_DEF 6
111 DEVICE_PARAM(Channel
, "Channel number");
114 /* PreambleType[] is the preamble length used for transmit.
115 0: indicate allows long preamble type
116 1: indicate allows short preamble type
119 #define PREAMBLE_TYPE_DEF 1
121 DEVICE_PARAM(PreambleType
, "Preamble Type");
124 #define RTS_THRESH_MIN 512
125 #define RTS_THRESH_MAX 2347
126 #define RTS_THRESH_DEF 2347
128 DEVICE_PARAM(RTSThreshold
, "RTS threshold");
131 #define FRAG_THRESH_MIN 256
132 #define FRAG_THRESH_MAX 2346
133 #define FRAG_THRESH_DEF 2346
135 DEVICE_PARAM(FragThreshold
, "Fragmentation threshold");
138 #define DATA_RATE_MIN 0
139 #define DATA_RATE_MAX 13
140 #define DATA_RATE_DEF 13
142 0: indicate 1 Mbps 0x02
143 1: indicate 2 Mbps 0x04
144 2: indicate 5.5 Mbps 0x0B
145 3: indicate 11 Mbps 0x16
146 4: indicate 6 Mbps 0x0c
147 5: indicate 9 Mbps 0x12
148 6: indicate 12 Mbps 0x18
149 7: indicate 18 Mbps 0x24
150 8: indicate 24 Mbps 0x30
151 9: indicate 36 Mbps 0x48
152 10: indicate 48 Mbps 0x60
153 11: indicate 54 Mbps 0x6c
154 12: indicate 72 Mbps 0x90
155 13: indicate auto rate
158 DEVICE_PARAM(ConnectionRate
, "Connection data rate");
160 #define OP_MODE_MAX 2
161 #define OP_MODE_DEF 0
162 #define OP_MODE_MIN 0
164 DEVICE_PARAM(OPMode
, "Infrastruct, adhoc, AP mode ");
166 /* OpMode[] is used for transmit.
167 0: indicate infrastruct mode used
168 1: indicate adhoc mode used
169 2: indicate AP mode used
174 0: indicate disable power saving mode
175 1: indicate enable power saving mode
178 #define PS_MODE_DEF 0
180 DEVICE_PARAM(PSMode
, "Power saving mode");
183 #define SHORT_RETRY_MIN 0
184 #define SHORT_RETRY_MAX 31
185 #define SHORT_RETRY_DEF 8
188 DEVICE_PARAM(ShortRetryLimit
, "Short frame retry limits");
190 #define LONG_RETRY_MIN 0
191 #define LONG_RETRY_MAX 15
192 #define LONG_RETRY_DEF 4
195 DEVICE_PARAM(LongRetryLimit
, "long frame retry limits");
198 /* BasebandType[] baseband type selected
199 0: indicate 802.11a type
200 1: indicate 802.11b type
201 2: indicate 802.11g type
203 #define BBP_TYPE_MIN 0
204 #define BBP_TYPE_MAX 2
205 #define BBP_TYPE_DEF 2
207 DEVICE_PARAM(BasebandType
, "baseband type");
212 0: indicate disable 802.11h
213 1: indicate enable 802.11h
216 #define X80211h_MODE_DEF 0
218 DEVICE_PARAM(b80211hEnable
, "802.11h mode");
222 // Static vars definitions
225 static struct usb_device_id vt6656_table
[] __devinitdata
= {
226 {USB_DEVICE(VNT_USB_VENDOR_ID
, VNT_USB_PRODUCT_ID
)},
230 // Frequency list (map channels to frequencies)
232 static const long frequency_list[] = {
233 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 2484,
234 4915, 4920, 4925, 4935, 4940, 4945, 4960, 4980,
235 5035, 5040, 5045, 5055, 5060, 5080, 5170, 5180, 5190, 5200, 5210, 5220, 5230, 5240,
236 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640, 5660, 5680,
237 5700, 5745, 5765, 5785, 5805, 5825
241 #ifndef IW_ENCODE_NOKEY
242 #define IW_ENCODE_NOKEY 0x0800
243 #define IW_ENCODE_MODE (IW_ENCODE_DISABLED | IW_ENCODE_RESTRICTED | IW_ENCODE_OPEN)
246 static const struct iw_handler_def iwctl_handler_def;
249 /*--------------------- Static Functions --------------------------*/
251 static int vt6656_probe(struct usb_interface
*intf
,
252 const struct usb_device_id
*id
);
253 static void vt6656_disconnect(struct usb_interface
*intf
);
255 #ifdef CONFIG_PM /* Minimal support for suspend and resume */
256 static int vt6656_suspend(struct usb_interface
*intf
, pm_message_t message
);
257 static int vt6656_resume(struct usb_interface
*intf
);
258 #endif /* CONFIG_PM */
260 static struct net_device_stats
*device_get_stats(struct net_device
*dev
);
261 static int device_open(struct net_device
*dev
);
262 static int device_xmit(struct sk_buff
*skb
, struct net_device
*dev
);
263 static void device_set_multi(struct net_device
*dev
);
264 static int device_close(struct net_device
*dev
);
265 static int device_ioctl(struct net_device
*dev
, struct ifreq
*rq
, int cmd
);
267 static BOOL
device_init_registers(PSDevice pDevice
, DEVICE_INIT_TYPE InitType
);
268 static BOOL
device_init_defrag_cb(PSDevice pDevice
);
269 static void device_init_diversity_timer(PSDevice pDevice
);
270 static int device_dma0_tx_80211(struct sk_buff
*skb
, struct net_device
*dev
);
272 static int ethtool_ioctl(struct net_device
*dev
, void *useraddr
);
273 static void device_free_tx_bufs(PSDevice pDevice
);
274 static void device_free_rx_bufs(PSDevice pDevice
);
275 static void device_free_int_bufs(PSDevice pDevice
);
276 static void device_free_frag_bufs(PSDevice pDevice
);
277 static BOOL
device_alloc_bufs(PSDevice pDevice
);
279 static int Read_config_file(PSDevice pDevice
);
280 static unsigned char *Config_FileOperation(PSDevice pDevice
);
281 static int Config_FileGetParameter(unsigned char *string
,
283 unsigned char *source
);
285 static BOOL
device_release_WPADEV(PSDevice pDevice
);
287 static void usb_device_reset(PSDevice pDevice
);
291 /*--------------------- Export Variables --------------------------*/
293 /*--------------------- Export Functions --------------------------*/
297 device_set_options(PSDevice pDevice
) {
299 BYTE abyBroadcastAddr
[ETH_ALEN
] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
300 BYTE abySNAP_RFC1042
[ETH_ALEN
] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
301 u8 abySNAP_Bridgetunnel
[ETH_ALEN
] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
303 memcpy(pDevice
->abyBroadcastAddr
, abyBroadcastAddr
, ETH_ALEN
);
304 memcpy(pDevice
->abySNAP_RFC1042
, abySNAP_RFC1042
, ETH_ALEN
);
305 memcpy(pDevice
->abySNAP_Bridgetunnel
, abySNAP_Bridgetunnel
, ETH_ALEN
);
307 pDevice
->cbTD
= TX_DESC_DEF0
;
308 pDevice
->cbRD
= RX_DESC_DEF0
;
309 pDevice
->uChannel
= CHANNEL_DEF
;
310 pDevice
->wRTSThreshold
= RTS_THRESH_DEF
;
311 pDevice
->wFragmentationThreshold
= FRAG_THRESH_DEF
;
312 pDevice
->byShortRetryLimit
= SHORT_RETRY_DEF
;
313 pDevice
->byLongRetryLimit
= LONG_RETRY_DEF
;
314 pDevice
->wMaxTransmitMSDULifetime
= DEFAULT_MSDU_LIFETIME
;
315 pDevice
->byShortPreamble
= PREAMBLE_TYPE_DEF
;
316 pDevice
->ePSMode
= PS_MODE_DEF
;
317 pDevice
->b11hEnable
= X80211h_MODE_DEF
;
318 pDevice
->eOPMode
= OP_MODE_DEF
;
319 pDevice
->uConnectionRate
= DATA_RATE_DEF
;
320 if (pDevice
->uConnectionRate
< RATE_AUTO
) pDevice
->bFixRate
= TRUE
;
321 pDevice
->byBBType
= BBP_TYPE_DEF
;
322 pDevice
->byPacketType
= pDevice
->byBBType
;
323 pDevice
->byAutoFBCtrl
= AUTO_FB_0
;
324 pDevice
->bUpdateBBVGA
= TRUE
;
325 pDevice
->byFOETuning
= 0;
326 pDevice
->byAutoPwrTunning
= 0;
327 pDevice
->wCTSDuration
= 0;
328 pDevice
->byPreambleType
= 0;
329 pDevice
->bExistSWNetAddr
= FALSE
;
330 // pDevice->bDiversityRegCtlON = TRUE;
331 pDevice
->bDiversityRegCtlON
= FALSE
;
335 static void device_init_diversity_timer(PSDevice pDevice
)
337 init_timer(&pDevice
->TimerSQ3Tmax1
);
338 pDevice
->TimerSQ3Tmax1
.data
= (unsigned long)pDevice
;
339 pDevice
->TimerSQ3Tmax1
.function
= (TimerFunction
)TimerSQ3CallBack
;
340 pDevice
->TimerSQ3Tmax1
.expires
= RUN_AT(HZ
);
342 init_timer(&pDevice
->TimerSQ3Tmax2
);
343 pDevice
->TimerSQ3Tmax2
.data
= (unsigned long)pDevice
;
344 pDevice
->TimerSQ3Tmax2
.function
= (TimerFunction
)TimerSQ3CallBack
;
345 pDevice
->TimerSQ3Tmax2
.expires
= RUN_AT(HZ
);
347 init_timer(&pDevice
->TimerSQ3Tmax3
);
348 pDevice
->TimerSQ3Tmax3
.data
= (unsigned long)pDevice
;
349 pDevice
->TimerSQ3Tmax3
.function
= (TimerFunction
)TimerSQ3Tmax3CallBack
;
350 pDevice
->TimerSQ3Tmax3
.expires
= RUN_AT(HZ
);
357 // Initialiation of MAC & BBP registers
360 static BOOL
device_init_registers(PSDevice pDevice
, DEVICE_INIT_TYPE InitType
)
362 u8 abyBroadcastAddr
[ETH_ALEN
] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
363 u8 abySNAP_RFC1042
[ETH_ALEN
] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
364 u8 abySNAP_Bridgetunnel
[ETH_ALEN
] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
367 CMD_CARD_INIT sInitCmd
;
368 int ntStatus
= STATUS_SUCCESS
;
369 RSP_CARD_INIT sInitRsp
;
370 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
372 BYTE byCalibTXIQ
= 0;
373 BYTE byCalibTXDC
= 0;
374 BYTE byCalibRXIQ
= 0;
376 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"---->INIbInitAdapter. [%d][%d]\n", InitType
, pDevice
->byPacketType
);
377 spin_lock_irq(&pDevice
->lock
);
378 if (InitType
== DEVICE_INIT_COLD
) {
379 memcpy(pDevice
->abyBroadcastAddr
, abyBroadcastAddr
, ETH_ALEN
);
380 memcpy(pDevice
->abySNAP_RFC1042
, abySNAP_RFC1042
, ETH_ALEN
);
381 memcpy(pDevice
->abySNAP_Bridgetunnel
,
382 abySNAP_Bridgetunnel
,
385 if ( !FIRMWAREbCheckVersion(pDevice
) ) {
386 if (FIRMWAREbDownload(pDevice
) == TRUE
) {
387 if (FIRMWAREbBrach2Sram(pDevice
) == FALSE
) {
388 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" FIRMWAREbBrach2Sram fail \n");
389 spin_unlock_irq(&pDevice
->lock
);
394 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" FIRMWAREbDownload fail \n");
395 spin_unlock_irq(&pDevice
->lock
);
400 if ( !BBbVT3184Init(pDevice
) ) {
401 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" BBbVT3184Init fail \n");
402 spin_unlock_irq(&pDevice
->lock
);
407 sInitCmd
.byInitClass
= (BYTE
)InitType
;
408 sInitCmd
.bExistSWNetAddr
= (BYTE
) pDevice
->bExistSWNetAddr
;
409 for (ii
= 0; ii
< 6; ii
++)
410 sInitCmd
.bySWNetAddr
[ii
] = pDevice
->abyCurrentNetAddr
[ii
];
411 sInitCmd
.byShortRetryLimit
= pDevice
->byShortRetryLimit
;
412 sInitCmd
.byLongRetryLimit
= pDevice
->byLongRetryLimit
;
414 //issue Card_init command to device
415 ntStatus
= CONTROLnsRequestOut(pDevice
,
416 MESSAGE_TYPE_CARDINIT
,
419 sizeof(CMD_CARD_INIT
),
420 (PBYTE
) &(sInitCmd
));
422 if ( ntStatus
!= STATUS_SUCCESS
) {
423 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" Issue Card init fail \n");
424 spin_unlock_irq(&pDevice
->lock
);
427 if (InitType
== DEVICE_INIT_COLD
) {
429 ntStatus
= CONTROLnsRequestIn(pDevice
,MESSAGE_TYPE_INIT_RSP
,0,0,sizeof(RSP_CARD_INIT
), (PBYTE
) &(sInitRsp
));
431 if (ntStatus
!= STATUS_SUCCESS
) {
432 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Cardinit request in status fail!\n");
433 spin_unlock_irq(&pDevice
->lock
);
437 //Local ID for AES functions
438 ntStatus
= CONTROLnsRequestIn(pDevice
,
441 MESSAGE_REQUEST_MACREG
,
443 &pDevice
->byLocalID
);
445 if ( ntStatus
!= STATUS_SUCCESS
) {
446 spin_unlock_irq(&pDevice
->lock
);
450 // Do MACbSoftwareReset in MACvInitialize
452 pDevice
->bCCK
= TRUE
;
453 pDevice
->bProtectMode
= FALSE
; //Only used in 11g type, sync with ERP IE
454 pDevice
->bNonERPPresent
= FALSE
;
455 pDevice
->bBarkerPreambleMd
= FALSE
;
456 if ( pDevice
->bFixRate
) {
457 pDevice
->wCurrentRate
= (WORD
) pDevice
->uConnectionRate
;
459 if ( pDevice
->byBBType
== BB_TYPE_11B
)
460 pDevice
->wCurrentRate
= RATE_11M
;
462 pDevice
->wCurrentRate
= RATE_54M
;
465 CHvInitChannelTable(pDevice
);
467 pDevice
->byTopOFDMBasicRate
= RATE_24M
;
468 pDevice
->byTopCCKBasicRate
= RATE_1M
;
469 pDevice
->byRevId
= 0; //Target to IF pin while programming to RF chip.
470 pDevice
->byCurPwr
= 0xFF;
472 pDevice
->byCCKPwr
= pDevice
->abyEEPROM
[EEP_OFS_PWR_CCK
];
473 pDevice
->byOFDMPwrG
= pDevice
->abyEEPROM
[EEP_OFS_PWR_OFDMG
];
475 for (ii
=0;ii
<14;ii
++) {
476 pDevice
->abyCCKPwrTbl
[ii
] = pDevice
->abyEEPROM
[ii
+ EEP_OFS_CCK_PWR_TBL
];
477 if (pDevice
->abyCCKPwrTbl
[ii
] == 0)
478 pDevice
->abyCCKPwrTbl
[ii
] = pDevice
->byCCKPwr
;
479 pDevice
->abyOFDMPwrTbl
[ii
] = pDevice
->abyEEPROM
[ii
+ EEP_OFS_OFDM_PWR_TBL
];
480 if (pDevice
->abyOFDMPwrTbl
[ii
] == 0)
481 pDevice
->abyOFDMPwrTbl
[ii
] = pDevice
->byOFDMPwrG
;
484 //original zonetype is USA,but customize zonetype is europe,
485 // then need recover 12,13 ,14 channel with 11 channel
486 if(((pDevice
->abyEEPROM
[EEP_OFS_ZONETYPE
] == ZoneType_Japan
) ||
487 (pDevice
->abyEEPROM
[EEP_OFS_ZONETYPE
] == ZoneType_Europe
))&&
488 (pDevice
->byOriginalZonetype
== ZoneType_USA
)) {
489 for (ii
= 11; ii
< 14; ii
++) {
490 pDevice
->abyCCKPwrTbl
[ii
] = pDevice
->abyCCKPwrTbl
[10];
491 pDevice
->abyOFDMPwrTbl
[ii
] = pDevice
->abyOFDMPwrTbl
[10];
495 //{{ RobertYu: 20041124
496 pDevice
->byOFDMPwrA
= 0x34; // same as RFbMA2829SelectChannel
497 // Load OFDM A Power Table
498 for (ii
=0;ii
<CB_MAX_CHANNEL_5G
;ii
++) { //RobertYu:20041224, bug using CB_MAX_CHANNEL
499 pDevice
->abyOFDMAPwrTbl
[ii
] = pDevice
->abyEEPROM
[ii
+ EEP_OFS_OFDMA_PWR_TBL
];
500 if (pDevice
->abyOFDMAPwrTbl
[ii
] == 0)
501 pDevice
->abyOFDMAPwrTbl
[ii
] = pDevice
->byOFDMPwrA
;
505 byAntenna
= pDevice
->abyEEPROM
[EEP_OFS_ANTENNA
];
506 if (byAntenna
& EEP_ANTINV
)
507 pDevice
->bTxRxAntInv
= TRUE
;
509 pDevice
->bTxRxAntInv
= FALSE
;
511 byAntenna
&= (EEP_ANTENNA_AUX
| EEP_ANTENNA_MAIN
);
513 if (byAntenna
== 0) // if not set default is All
514 byAntenna
= (EEP_ANTENNA_AUX
| EEP_ANTENNA_MAIN
);
516 if (byAntenna
== (EEP_ANTENNA_AUX
| EEP_ANTENNA_MAIN
)) {
517 pDevice
->byAntennaCount
= 2;
518 pDevice
->byTxAntennaMode
= ANT_B
;
519 pDevice
->dwTxAntennaSel
= 1;
520 pDevice
->dwRxAntennaSel
= 1;
521 if (pDevice
->bTxRxAntInv
== TRUE
)
522 pDevice
->byRxAntennaMode
= ANT_A
;
524 pDevice
->byRxAntennaMode
= ANT_B
;
526 if (pDevice
->bDiversityRegCtlON
)
527 pDevice
->bDiversityEnable
= TRUE
;
529 pDevice
->bDiversityEnable
= FALSE
;
531 pDevice
->bDiversityEnable
= FALSE
;
532 pDevice
->byAntennaCount
= 1;
533 pDevice
->dwTxAntennaSel
= 0;
534 pDevice
->dwRxAntennaSel
= 0;
535 if (byAntenna
& EEP_ANTENNA_AUX
) {
536 pDevice
->byTxAntennaMode
= ANT_A
;
537 if (pDevice
->bTxRxAntInv
== TRUE
)
538 pDevice
->byRxAntennaMode
= ANT_B
;
540 pDevice
->byRxAntennaMode
= ANT_A
;
542 pDevice
->byTxAntennaMode
= ANT_B
;
543 if (pDevice
->bTxRxAntInv
== TRUE
)
544 pDevice
->byRxAntennaMode
= ANT_A
;
546 pDevice
->byRxAntennaMode
= ANT_B
;
549 pDevice
->ulDiversityNValue
= 100*255;
550 pDevice
->ulDiversityMValue
= 100*16;
552 pDevice
->byTMax2
= 4;
553 pDevice
->ulSQ3TH
= 0;
554 pDevice
->byTMax3
= 64;
555 // -----------------------------------------------------------------
557 //Get Auto Fall Back Type
558 pDevice
->byAutoFBCtrl
= AUTO_FB_0
;
561 pDevice
->uScanTime
= WLAN_SCAN_MINITIME
;
564 //pDevice->NetworkType = Ndis802_11Automode;
565 pDevice
->eConfigPHYMode
= PHY_TYPE_AUTO
;
566 pDevice
->byBBType
= BB_TYPE_11G
;
568 // initialize BBP registers
569 pDevice
->ulTxPower
= 25;
572 pDevice
->byMinChannel
= 1;
573 pDevice
->byMaxChannel
= CB_MAX_CHANNEL
;
576 pDevice
->byRFType
= sInitRsp
.byRFType
;
578 if ((pDevice
->byRFType
& RF_EMU
) != 0) {
579 // force change RevID for VT3253 emu
580 pDevice
->byRevId
= 0x80;
583 // Load EEPROM calibrated vt3266 parameters
584 if (pDevice
->byRFType
== RF_VT3226D0
) {
585 if((pDevice
->abyEEPROM
[EEP_OFS_MAJOR_VER
] == 0x1) &&
586 (pDevice
->abyEEPROM
[EEP_OFS_MINOR_VER
] >= 0x4)) {
587 byCalibTXIQ
= pDevice
->abyEEPROM
[EEP_OFS_CALIB_TX_IQ
];
588 byCalibTXDC
= pDevice
->abyEEPROM
[EEP_OFS_CALIB_TX_DC
];
589 byCalibRXIQ
= pDevice
->abyEEPROM
[EEP_OFS_CALIB_RX_IQ
];
590 if( (byCalibTXIQ
|| byCalibTXDC
|| byCalibRXIQ
) ) {
591 ControlvWriteByte(pDevice
, MESSAGE_REQUEST_BBREG
, 0xFF, 0x03); // CR255, Set BB to support TX/RX IQ and DC compensation Mode
592 ControlvWriteByte(pDevice
, MESSAGE_REQUEST_BBREG
, 0xFB, byCalibTXIQ
); // CR251, TX I/Q Imbalance Calibration
593 ControlvWriteByte(pDevice
, MESSAGE_REQUEST_BBREG
, 0xFC, byCalibTXDC
); // CR252, TX DC-Offset Calibration
594 ControlvWriteByte(pDevice
, MESSAGE_REQUEST_BBREG
, 0xFD, byCalibRXIQ
); // CR253, RX I/Q Imbalance Calibration
596 // turn off BB Calibration compensation
597 ControlvWriteByte(pDevice
, MESSAGE_REQUEST_BBREG
, 0xFF, 0x0); // CR255
601 pMgmt
->eScanType
= WMAC_SCAN_PASSIVE
;
602 pMgmt
->uCurrChannel
= pDevice
->uChannel
;
603 pMgmt
->uIBSSChannel
= pDevice
->uChannel
;
604 CARDbSetMediaChannel(pDevice
, pMgmt
->uCurrChannel
);
606 // get Permanent network address
607 memcpy(pDevice
->abyPermanentNetAddr
,&(sInitRsp
.byNetAddr
[0]),6);
608 memcpy(pDevice
->abyCurrentNetAddr
,
609 pDevice
->abyPermanentNetAddr
,
612 // if exist SW network address, use SW network address.
614 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Network address = %pM\n",
615 pDevice
->abyCurrentNetAddr
);
618 // Set BB and packet type at the same time.
619 // Set Short Slot Time, xIFS, and RSPINF.
620 if (pDevice
->byBBType
== BB_TYPE_11A
) {
621 CARDbAddBasicRate(pDevice
, RATE_6M
);
622 pDevice
->bShortSlotTime
= TRUE
;
624 CARDbAddBasicRate(pDevice
, RATE_1M
);
625 pDevice
->bShortSlotTime
= FALSE
;
627 BBvSetShortSlotTime(pDevice
);
628 CARDvSetBSSMode(pDevice
);
630 if (pDevice
->bUpdateBBVGA
) {
631 pDevice
->byBBVGACurrent
= pDevice
->abyBBVGA
[0];
632 pDevice
->byBBVGANew
= pDevice
->byBBVGACurrent
;
633 BBvSetVGAGainOffset(pDevice
, pDevice
->abyBBVGA
[0]);
636 pDevice
->byRadioCtl
= pDevice
->abyEEPROM
[EEP_OFS_RADIOCTL
];
637 pDevice
->bHWRadioOff
= FALSE
;
638 if ( (pDevice
->byRadioCtl
& EEP_RADIOCTL_ENABLE
) != 0 ) {
639 ntStatus
= CONTROLnsRequestIn(pDevice
,
642 MESSAGE_REQUEST_MACREG
,
646 if ( ntStatus
!= STATUS_SUCCESS
) {
647 spin_unlock_irq(&pDevice
->lock
);
650 if ( (byTmp
& GPIO3_DATA
) == 0 ) {
651 pDevice
->bHWRadioOff
= TRUE
;
652 MACvRegBitsOn(pDevice
,MAC_REG_GPIOCTL1
,GPIO3_INTMD
);
654 MACvRegBitsOff(pDevice
,MAC_REG_GPIOCTL1
,GPIO3_INTMD
);
655 pDevice
->bHWRadioOff
= FALSE
;
658 } //EEP_RADIOCTL_ENABLE
660 ControlvMaskByte(pDevice
,MESSAGE_REQUEST_MACREG
,MAC_REG_PAPEDELAY
,LEDSTS_TMLEN
,0x38);
661 ControlvMaskByte(pDevice
,MESSAGE_REQUEST_MACREG
,MAC_REG_PAPEDELAY
,LEDSTS_STS
,LEDSTS_SLOW
);
662 MACvRegBitsOn(pDevice
,MAC_REG_GPIOCTL0
,0x01);
664 if ((pDevice
->bHWRadioOff
== TRUE
) || (pDevice
->bRadioControlOff
== TRUE
)) {
665 CARDbRadioPowerOff(pDevice
);
667 CARDbRadioPowerOn(pDevice
);
670 spin_unlock_irq(&pDevice
->lock
);
671 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"<----INIbInitAdapter Exit\n");
675 static BOOL
device_release_WPADEV(PSDevice pDevice
)
677 viawget_wpa_header
*wpahdr
;
679 // wait_queue_head_t Set_wait;
680 //send device close to wpa_supplicnat layer
681 if (pDevice
->bWPADEVUp
==TRUE
) {
682 wpahdr
= (viawget_wpa_header
*)pDevice
->skb
->data
;
683 wpahdr
->type
= VIAWGET_DEVICECLOSE_MSG
;
684 wpahdr
->resp_ie_len
= 0;
685 wpahdr
->req_ie_len
= 0;
686 skb_put(pDevice
->skb
, sizeof(viawget_wpa_header
));
687 pDevice
->skb
->dev
= pDevice
->wpadev
;
688 skb_reset_mac_header(pDevice
->skb
);
689 pDevice
->skb
->pkt_type
= PACKET_HOST
;
690 pDevice
->skb
->protocol
= htons(ETH_P_802_2
);
691 memset(pDevice
->skb
->cb
, 0, sizeof(pDevice
->skb
->cb
));
692 netif_rx(pDevice
->skb
);
693 pDevice
->skb
= dev_alloc_skb((int)pDevice
->rx_buf_sz
);
695 //wait release WPADEV
696 // init_waitqueue_head(&Set_wait);
697 // wait_event_timeout(Set_wait, ((pDevice->wpadev==NULL)&&(pDevice->skb == NULL)),5*HZ); //1s wait
698 while(pDevice
->bWPADEVUp
==TRUE
) {
699 set_current_state(TASK_UNINTERRUPTIBLE
);
700 schedule_timeout (HZ
/20); //wait 50ms
709 #ifdef CONFIG_PM /* Minimal support for suspend and resume */
711 static int vt6656_suspend(struct usb_interface
*intf
, pm_message_t message
)
713 PSDevice device
= usb_get_intfdata(intf
);
715 if (!device
|| !device
->dev
)
718 if (device
->flags
& DEVICE_FLAGS_OPENED
)
719 device_close(device
->dev
);
721 usb_put_dev(interface_to_usbdev(intf
));
726 static int vt6656_resume(struct usb_interface
*intf
)
728 PSDevice device
= usb_get_intfdata(intf
);
730 if (!device
|| !device
->dev
)
733 usb_get_dev(interface_to_usbdev(intf
));
735 if (!(device
->flags
& DEVICE_FLAGS_OPENED
))
736 device_open(device
->dev
);
741 #endif /* CONFIG_PM */
743 static const struct net_device_ops device_netdev_ops
= {
744 .ndo_open
= device_open
,
745 .ndo_stop
= device_close
,
746 .ndo_do_ioctl
= device_ioctl
,
747 .ndo_get_stats
= device_get_stats
,
748 .ndo_start_xmit
= device_xmit
,
749 .ndo_set_rx_mode
= device_set_multi
,
753 vt6656_probe(struct usb_interface
*intf
, const struct usb_device_id
*id
)
755 u8 fake_mac
[ETH_ALEN
] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
756 struct usb_device
*udev
= interface_to_usbdev(intf
);
758 struct net_device
*netdev
= NULL
;
759 PSDevice pDevice
= NULL
;
761 printk(KERN_NOTICE
"%s Ver. %s\n", DEVICE_FULL_DRV_NAM
, DEVICE_VERSION
);
762 printk(KERN_NOTICE
"Copyright (c) 2004 VIA Networking Technologies, Inc.\n");
764 udev
= usb_get_dev(udev
);
765 netdev
= alloc_etherdev(sizeof(DEVICE_INFO
));
767 printk(KERN_ERR DEVICE_NAME
": allocate net device failed\n");
772 pDevice
= netdev_priv(netdev
);
773 memset(pDevice
, 0, sizeof(DEVICE_INFO
));
775 pDevice
->dev
= netdev
;
778 device_set_options(pDevice
);
779 spin_lock_init(&pDevice
->lock
);
781 pDevice
->tx_80211
= device_dma0_tx_80211
;
782 pDevice
->sMgmtObj
.pAdapter
= (void *) pDevice
;
784 netdev
->netdev_ops
= &device_netdev_ops
;
785 netdev
->wireless_handlers
=
786 (struct iw_handler_def
*) &iwctl_handler_def
;
788 usb_set_intfdata(intf
, pDevice
);
789 SET_NETDEV_DEV(netdev
, &intf
->dev
);
790 memcpy(pDevice
->dev
->dev_addr
, fake_mac
, ETH_ALEN
);
791 rc
= register_netdev(netdev
);
793 printk(KERN_ERR DEVICE_NAME
" Failed to register netdev\n");
797 usb_device_reset(pDevice
);
800 union iwreq_data wrqu
;
801 memset(&wrqu
, 0, sizeof(wrqu
));
802 wrqu
.data
.flags
= RT_INSMOD_EVENT_FLAG
;
803 wrqu
.data
.length
= IFNAMSIZ
;
804 wireless_send_event(pDevice
->dev
,
820 static void device_free_tx_bufs(PSDevice pDevice
)
822 PUSB_SEND_CONTEXT pTxContext
;
825 for (ii
= 0; ii
< pDevice
->cbTD
; ii
++) {
827 pTxContext
= pDevice
->apTD
[ii
];
829 if (pTxContext
->pUrb
) {
830 usb_kill_urb(pTxContext
->pUrb
);
831 usb_free_urb(pTxContext
->pUrb
);
839 static void device_free_rx_bufs(PSDevice pDevice
)
844 for (ii
= 0; ii
< pDevice
->cbRD
; ii
++) {
846 pRCB
= pDevice
->apRCB
[ii
];
849 usb_kill_urb(pRCB
->pUrb
);
850 usb_free_urb(pRCB
->pUrb
);
854 dev_kfree_skb(pRCB
->skb
);
856 kfree(pDevice
->pRCBMem
);
861 static void usb_device_reset(PSDevice pDevice
)
864 status
= usb_reset_device(pDevice
->usb
);
866 printk("usb_device_reset fail status=%d\n",status
);
870 static void device_free_int_bufs(PSDevice pDevice
)
872 kfree(pDevice
->intBuf
.pDataBuf
);
877 static BOOL
device_alloc_bufs(PSDevice pDevice
) {
879 PUSB_SEND_CONTEXT pTxContext
;
884 for (ii
= 0; ii
< pDevice
->cbTD
; ii
++) {
886 pTxContext
= kmalloc(sizeof(USB_SEND_CONTEXT
), GFP_KERNEL
);
887 if (pTxContext
== NULL
) {
888 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
"%s : allocate tx usb context failed\n", pDevice
->dev
->name
);
891 pDevice
->apTD
[ii
] = pTxContext
;
892 pTxContext
->pDevice
= (void *) pDevice
;
894 pTxContext
->pUrb
= usb_alloc_urb(0, GFP_ATOMIC
);
895 if (pTxContext
->pUrb
== NULL
) {
896 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
"alloc tx urb failed\n");
899 pTxContext
->bBoolInUse
= FALSE
;
903 pDevice
->pRCBMem
= kmalloc((sizeof(RCB
) * pDevice
->cbRD
), GFP_KERNEL
);
904 if (pDevice
->pRCBMem
== NULL
) {
905 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
"%s : alloc rx usb context failed\n", pDevice
->dev
->name
);
910 pDevice
->FirstRecvFreeList
= NULL
;
911 pDevice
->LastRecvFreeList
= NULL
;
912 pDevice
->FirstRecvMngList
= NULL
;
913 pDevice
->LastRecvMngList
= NULL
;
914 pDevice
->NumRecvFreeList
= 0;
915 memset(pDevice
->pRCBMem
, 0, (sizeof(RCB
) * pDevice
->cbRD
));
916 pRCB
= (PRCB
) pDevice
->pRCBMem
;
918 for (ii
= 0; ii
< pDevice
->cbRD
; ii
++) {
920 pDevice
->apRCB
[ii
] = pRCB
;
921 pRCB
->pDevice
= (void *) pDevice
;
923 pRCB
->pUrb
= usb_alloc_urb(0, GFP_ATOMIC
);
925 if (pRCB
->pUrb
== NULL
) {
926 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
" Failed to alloc rx urb\n");
929 pRCB
->skb
= dev_alloc_skb((int)pDevice
->rx_buf_sz
);
930 if (pRCB
->skb
== NULL
) {
931 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
" Failed to alloc rx skb\n");
934 pRCB
->skb
->dev
= pDevice
->dev
;
935 pRCB
->bBoolInUse
= FALSE
;
936 EnqueueRCB(pDevice
->FirstRecvFreeList
, pDevice
->LastRecvFreeList
, pRCB
);
937 pDevice
->NumRecvFreeList
++;
942 pDevice
->pControlURB
= usb_alloc_urb(0, GFP_ATOMIC
);
943 if (pDevice
->pControlURB
== NULL
) {
944 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
"Failed to alloc control urb\n");
948 pDevice
->pInterruptURB
= usb_alloc_urb(0, GFP_ATOMIC
);
949 if (pDevice
->pInterruptURB
== NULL
) {
950 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
"Failed to alloc int urb\n");
951 usb_free_urb(pDevice
->pControlURB
);
955 pDevice
->intBuf
.pDataBuf
= kmalloc(MAX_INTERRUPT_SIZE
, GFP_KERNEL
);
956 if (pDevice
->intBuf
.pDataBuf
== NULL
) {
957 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
"Failed to alloc int buf\n");
958 usb_free_urb(pDevice
->pControlURB
);
959 usb_free_urb(pDevice
->pInterruptURB
);
966 device_free_rx_bufs(pDevice
);
969 device_free_tx_bufs(pDevice
);
977 static BOOL
device_init_defrag_cb(PSDevice pDevice
) {
979 PSDeFragControlBlock pDeF
;
981 /* Init the fragment ctl entries */
982 for (i
= 0; i
< CB_MAX_RX_FRAG
; i
++) {
983 pDeF
= &(pDevice
->sRxDFCB
[i
]);
984 if (!device_alloc_frag_buf(pDevice
, pDeF
)) {
985 DBG_PRT(MSG_LEVEL_ERR
,KERN_ERR
"%s: can not alloc frag bufs\n",
990 pDevice
->cbDFCB
= CB_MAX_RX_FRAG
;
991 pDevice
->cbFreeDFCB
= pDevice
->cbDFCB
;
995 device_free_frag_bufs(pDevice
);
1001 static void device_free_frag_bufs(PSDevice pDevice
) {
1002 PSDeFragControlBlock pDeF
;
1005 for (i
= 0; i
< CB_MAX_RX_FRAG
; i
++) {
1007 pDeF
= &(pDevice
->sRxDFCB
[i
]);
1010 dev_kfree_skb(pDeF
->skb
);
1016 BOOL
device_alloc_frag_buf(PSDevice pDevice
, PSDeFragControlBlock pDeF
) {
1018 pDeF
->skb
= dev_alloc_skb((int)pDevice
->rx_buf_sz
);
1019 if (pDeF
->skb
== NULL
)
1022 pDeF
->skb
->dev
= pDevice
->dev
;
1028 /*-----------------------------------------------------------------*/
1030 static int device_open(struct net_device
*dev
) {
1031 PSDevice pDevice
=(PSDevice
) netdev_priv(dev
);
1033 extern SWPAResult wpa_Result
;
1034 memset(wpa_Result
.ifname
,0,sizeof(wpa_Result
.ifname
));
1035 wpa_Result
.proto
= 0;
1036 wpa_Result
.key_mgmt
= 0;
1037 wpa_Result
.eap_type
= 0;
1038 wpa_Result
.authenticated
= FALSE
;
1039 pDevice
->fWPA_Authened
= FALSE
;
1041 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" device_open...\n");
1044 pDevice
->rx_buf_sz
= MAX_TOTAL_SIZE_WITH_ALL_HEADERS
;
1046 if (device_alloc_bufs(pDevice
) == FALSE
) {
1047 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" device_alloc_bufs fail... \n");
1051 if (device_init_defrag_cb(pDevice
)== FALSE
) {
1052 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" Initial defragement cb fail \n");
1056 MP_CLEAR_FLAG(pDevice
, fMP_DISCONNECTED
);
1057 MP_CLEAR_FLAG(pDevice
, fMP_CONTROL_READS
);
1058 MP_CLEAR_FLAG(pDevice
, fMP_CONTROL_WRITES
);
1059 MP_SET_FLAG(pDevice
, fMP_POST_READS
);
1060 MP_SET_FLAG(pDevice
, fMP_POST_WRITES
);
1063 Read_config_file(pDevice
);
1065 if (device_init_registers(pDevice
, DEVICE_INIT_COLD
) == FALSE
) {
1066 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" init register fail\n");
1070 device_set_multi(pDevice
->dev
);
1071 // Init for Key Management
1073 KeyvInitTable(pDevice
,&pDevice
->sKey
);
1074 memcpy(pDevice
->sMgmtObj
.abyMACAddr
, pDevice
->abyCurrentNetAddr
, ETH_ALEN
);
1075 memcpy(pDevice
->dev
->dev_addr
, pDevice
->abyCurrentNetAddr
, ETH_ALEN
);
1076 pDevice
->bStopTx0Pkt
= FALSE
;
1077 pDevice
->bStopDataPkt
= FALSE
;
1078 pDevice
->bRoaming
= FALSE
;
1079 pDevice
->bIsRoaming
= FALSE
;
1080 pDevice
->bEnableRoaming
= FALSE
;
1081 if (pDevice
->bDiversityRegCtlON
) {
1082 device_init_diversity_timer(pDevice
);
1085 vMgrObjectInit(pDevice
);
1086 tasklet_init(&pDevice
->RxMngWorkItem
, (void *)RXvMngWorkItem
, (unsigned long)pDevice
);
1087 tasklet_init(&pDevice
->ReadWorkItem
, (void *)RXvWorkItem
, (unsigned long)pDevice
);
1088 tasklet_init(&pDevice
->EventWorkItem
, (void *)INTvWorkItem
, (unsigned long)pDevice
);
1089 add_timer(&(pDevice
->sMgmtObj
.sTimerSecondCallback
));
1090 pDevice
->int_interval
= 100; //Max 100 microframes.
1091 pDevice
->eEncryptionStatus
= Ndis802_11EncryptionDisabled
;
1093 pDevice
->bIsRxWorkItemQueued
= TRUE
;
1094 pDevice
->fKillEventPollingThread
= FALSE
;
1095 pDevice
->bEventAvailable
= FALSE
;
1097 pDevice
->bWPADEVUp
= FALSE
;
1098 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1099 pDevice
->bwextstep0
= FALSE
;
1100 pDevice
->bwextstep1
= FALSE
;
1101 pDevice
->bwextstep2
= FALSE
;
1102 pDevice
->bwextstep3
= FALSE
;
1103 pDevice
->bWPASuppWextEnabled
= FALSE
;
1105 pDevice
->byReAssocCount
= 0;
1107 RXvWorkItem(pDevice
);
1108 INTvWorkItem(pDevice
);
1110 // Patch: if WEP key already set by iwconfig but device not yet open
1111 if ((pDevice
->bEncryptionEnable
== TRUE
) && (pDevice
->bTransmitKey
== TRUE
)) {
1112 spin_lock_irq(&pDevice
->lock
);
1113 KeybSetDefaultKey( pDevice
,
1115 pDevice
->byKeyIndex
| (1 << 31),
1116 pDevice
->uKeyLength
,
1121 spin_unlock_irq(&pDevice
->lock
);
1122 pDevice
->eEncryptionStatus
= Ndis802_11Encryption1Enabled
;
1125 if (pDevice
->sMgmtObj
.eConfigMode
== WMAC_CONFIG_AP
) {
1126 bScheduleCommand((void *) pDevice
, WLAN_CMD_RUN_AP
, NULL
);
1129 //mike:mark@2008-11-10
1130 bScheduleCommand((void *) pDevice
, WLAN_CMD_BSSID_SCAN
, NULL
);
1131 /* bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL); */
1135 netif_stop_queue(pDevice
->dev
);
1136 pDevice
->flags
|= DEVICE_FLAGS_OPENED
;
1139 union iwreq_data wrqu
;
1140 memset(&wrqu
, 0, sizeof(wrqu
));
1141 wrqu
.data
.flags
= RT_UPDEV_EVENT_FLAG
;
1142 wireless_send_event(pDevice
->dev
, IWEVCUSTOM
, &wrqu
, NULL
);
1145 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"device_open success.. \n");
1149 device_free_frag_bufs(pDevice
);
1151 device_free_rx_bufs(pDevice
);
1152 device_free_tx_bufs(pDevice
);
1153 device_free_int_bufs(pDevice
);
1154 usb_kill_urb(pDevice
->pControlURB
);
1155 usb_kill_urb(pDevice
->pInterruptURB
);
1156 usb_free_urb(pDevice
->pControlURB
);
1157 usb_free_urb(pDevice
->pInterruptURB
);
1159 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"device_open fail.. \n");
1165 static int device_close(struct net_device
*dev
) {
1166 PSDevice pDevice
=(PSDevice
) netdev_priv(dev
);
1167 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
1171 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"device_close1 \n");
1172 if (pDevice
== NULL
)
1176 union iwreq_data wrqu
;
1177 memset(&wrqu
, 0, sizeof(wrqu
));
1178 wrqu
.data
.flags
= RT_DOWNDEV_EVENT_FLAG
;
1179 wireless_send_event(pDevice
->dev
, IWEVCUSTOM
, &wrqu
, NULL
);
1182 if (pDevice
->bLinkPass
) {
1183 bScheduleCommand((void *) pDevice
, WLAN_CMD_DISASSOCIATE
, NULL
);
1187 device_release_WPADEV(pDevice
);
1189 memset(pMgmt
->abyDesireSSID
, 0, WLAN_IEHDR_LEN
+ WLAN_SSID_MAXLEN
+ 1);
1190 pMgmt
->bShareKeyAlgorithm
= FALSE
;
1191 pDevice
->bEncryptionEnable
= FALSE
;
1192 pDevice
->eEncryptionStatus
= Ndis802_11EncryptionDisabled
;
1193 spin_lock_irq(&pDevice
->lock
);
1194 for (uu
= 0; uu
< MAX_KEY_TABLE
; uu
++)
1195 MACvDisableKeyEntry(pDevice
,uu
);
1196 spin_unlock_irq(&pDevice
->lock
);
1198 if ((pDevice
->flags
& DEVICE_FLAGS_UNPLUG
) == FALSE
) {
1199 MACbShutdown(pDevice
);
1201 netif_stop_queue(pDevice
->dev
);
1202 MP_SET_FLAG(pDevice
, fMP_DISCONNECTED
);
1203 MP_CLEAR_FLAG(pDevice
, fMP_POST_WRITES
);
1204 MP_CLEAR_FLAG(pDevice
, fMP_POST_READS
);
1205 pDevice
->fKillEventPollingThread
= TRUE
;
1206 del_timer(&pDevice
->sTimerCommand
);
1207 del_timer(&pMgmt
->sTimerSecondCallback
);
1209 del_timer(&pDevice
->sTimerTxData
);
1211 if (pDevice
->bDiversityRegCtlON
) {
1212 del_timer(&pDevice
->TimerSQ3Tmax1
);
1213 del_timer(&pDevice
->TimerSQ3Tmax2
);
1214 del_timer(&pDevice
->TimerSQ3Tmax3
);
1216 tasklet_kill(&pDevice
->RxMngWorkItem
);
1217 tasklet_kill(&pDevice
->ReadWorkItem
);
1218 tasklet_kill(&pDevice
->EventWorkItem
);
1220 pDevice
->bRoaming
= FALSE
;
1221 pDevice
->bIsRoaming
= FALSE
;
1222 pDevice
->bEnableRoaming
= FALSE
;
1223 pDevice
->bCmdRunning
= FALSE
;
1224 pDevice
->bLinkPass
= FALSE
;
1225 memset(pMgmt
->abyCurrBSSID
, 0, 6);
1226 pMgmt
->eCurrState
= WMAC_STATE_IDLE
;
1228 device_free_tx_bufs(pDevice
);
1229 device_free_rx_bufs(pDevice
);
1230 device_free_int_bufs(pDevice
);
1231 device_free_frag_bufs(pDevice
);
1233 usb_kill_urb(pDevice
->pControlURB
);
1234 usb_kill_urb(pDevice
->pInterruptURB
);
1235 usb_free_urb(pDevice
->pControlURB
);
1236 usb_free_urb(pDevice
->pInterruptURB
);
1238 BSSvClearNodeDBTable(pDevice
, 0);
1239 pDevice
->flags
&=(~DEVICE_FLAGS_OPENED
);
1241 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"device_close2 \n");
1246 static void __devexit
vt6656_disconnect(struct usb_interface
*intf
)
1248 PSDevice device
= usb_get_intfdata(intf
);
1254 union iwreq_data req
;
1255 memset(&req
, 0, sizeof(req
));
1256 req
.data
.flags
= RT_RMMOD_EVENT_FLAG
;
1257 wireless_send_event(device
->dev
, IWEVCUSTOM
, &req
, NULL
);
1260 device_release_WPADEV(device
);
1262 if (device
->firmware
)
1263 release_firmware(device
->firmware
);
1265 usb_set_intfdata(intf
, NULL
);
1266 usb_put_dev(interface_to_usbdev(intf
));
1268 device
->flags
|= DEVICE_FLAGS_UNPLUG
;
1271 unregister_netdev(device
->dev
);
1272 wpa_set_wpadev(device
, 0);
1273 free_netdev(device
->dev
);
1277 static int device_dma0_tx_80211(struct sk_buff
*skb
, struct net_device
*dev
)
1279 PSDevice pDevice
= netdev_priv(dev
);
1281 spin_lock_irq(&pDevice
->lock
);
1283 if (unlikely(pDevice
->bStopTx0Pkt
))
1284 dev_kfree_skb_irq(skb
);
1286 vDMA0_tx_80211(pDevice
, skb
);
1288 spin_unlock_irq(&pDevice
->lock
);
1290 return NETDEV_TX_OK
;
1293 static int device_xmit(struct sk_buff
*skb
, struct net_device
*dev
)
1295 PSDevice pDevice
= netdev_priv(dev
);
1296 struct net_device_stats
*stats
= &pDevice
->stats
;
1298 spin_lock_irq(&pDevice
->lock
);
1300 netif_stop_queue(dev
);
1302 if (!pDevice
->bLinkPass
) {
1303 dev_kfree_skb_irq(skb
);
1307 if (pDevice
->bStopDataPkt
) {
1308 dev_kfree_skb_irq(skb
);
1309 stats
->tx_dropped
++;
1313 if (nsDMA_tx_packet(pDevice
, TYPE_AC0DMA
, skb
)) {
1314 if (netif_queue_stopped(dev
))
1315 netif_wake_queue(dev
);
1319 spin_unlock_irq(&pDevice
->lock
);
1321 return NETDEV_TX_OK
;
1324 static unsigned const ethernet_polynomial
= 0x04c11db7U
;
1325 static inline u32
ether_crc(int length
, unsigned char *data
)
1329 while(--length
>= 0) {
1330 unsigned char current_octet
= *data
++;
1332 for (bit
= 0; bit
< 8; bit
++, current_octet
>>= 1) {
1334 ((crc
< 0) ^ (current_octet
& 1) ? ethernet_polynomial
: 0);
1340 //find out the start position of str2 from str1
1341 static unsigned char *kstrstr(const unsigned char *str1
,
1342 const unsigned char *str2
) {
1343 int str1_len
= strlen(str1
);
1344 int str2_len
= strlen(str2
);
1346 while (str1_len
>= str2_len
) {
1348 if(memcmp(str1
,str2
,str2_len
)==0)
1349 return (unsigned char *) str1
;
1355 static int Config_FileGetParameter(unsigned char *string
,
1356 unsigned char *dest
,
1357 unsigned char *source
)
1359 unsigned char buf1
[100];
1360 unsigned char buf2
[100];
1361 unsigned char *start_p
= NULL
, *end_p
= NULL
, *tmp_p
= NULL
;
1365 strcat(buf1
, string
);
1367 source
+=strlen(buf1
);
1369 //find target string start point
1370 start_p
= kstrstr(source
,buf1
);
1371 if (start_p
== NULL
)
1374 //check if current config line is marked by "#" ??
1375 for (ii
= 1; ; ii
++) {
1376 if (memcmp(start_p
- ii
, "\n", 1) == 0)
1378 if (memcmp(start_p
- ii
, "#", 1) == 0)
1382 //find target string end point
1383 end_p
= kstrstr(start_p
,"\n");
1384 if (end_p
== NULL
) { //can't find "\n",but don't care
1385 end_p
=start_p
+strlen(start_p
); //no include "\n"
1389 memcpy(buf2
,start_p
,end_p
-start_p
); //get the tartget line
1390 buf2
[end_p
-start_p
]='\0';
1393 start_p
= kstrstr(buf2
,"=");
1394 if (start_p
== NULL
)
1397 strcpy(buf1
,start_p
+1);
1401 while(*tmp_p
!= 0x00) {
1408 memcpy(dest
,tmp_p
,strlen(tmp_p
));
1412 //if read fail,return NULL,or return data pointer;
1413 static unsigned char *Config_FileOperation(PSDevice pDevice
)
1415 unsigned char *config_path
= CONFIG_PATH
;
1416 unsigned char *buffer
= NULL
;
1417 struct file
*filp
=NULL
;
1418 mm_segment_t old_fs
= get_fs();
1419 //int oldfsuid=0,oldfsgid=0;
1423 /* Can't do this anymore, so we rely on correct filesystem permissions:
1424 //Make sure a caller can read or write power as root
1425 oldfsuid=current->fsuid;
1426 oldfsgid=current->fsgid;
1432 filp
= filp_open(config_path
, O_RDWR
, 0);
1434 printk("Config_FileOperation file Not exist\n");
1439 if(!(filp
->f_op
) || !(filp
->f_op
->read
) ||!(filp
->f_op
->write
)) {
1440 printk("file %s cann't readable or writable?\n",config_path
);
1445 buffer
= kmalloc(1024, GFP_KERNEL
);
1447 printk("allocate mem for file fail?\n");
1452 if(filp
->f_op
->read(filp
, buffer
, 1024, &filp
->f_pos
)<0) {
1453 printk("read file error?\n");
1458 if(filp_close(filp
,NULL
))
1459 printk("Config_FileOperation:close file fail\n");
1465 current->fsuid=oldfsuid;
1466 current->fsgid=oldfsgid;
1476 //return --->-1:fail; >=0:successful
1477 static int Read_config_file(PSDevice pDevice
) {
1479 unsigned char tmpbuffer
[100];
1480 unsigned char *buffer
= NULL
;
1482 //init config setting
1483 pDevice
->config_file
.ZoneType
= -1;
1484 pDevice
->config_file
.eAuthenMode
= -1;
1485 pDevice
->config_file
.eEncryptionStatus
= -1;
1487 buffer
= Config_FileOperation(pDevice
);
1488 if (buffer
== NULL
) {
1495 memset(tmpbuffer
,0,sizeof(tmpbuffer
));
1496 if(Config_FileGetParameter("ZONETYPE",tmpbuffer
,buffer
) ==TRUE
) {
1497 if(memcmp(tmpbuffer
,"USA",3)==0) {
1498 pDevice
->config_file
.ZoneType
=ZoneType_USA
;
1500 else if(memcmp(tmpbuffer
,"JAPAN",5)==0) {
1501 pDevice
->config_file
.ZoneType
=ZoneType_Japan
;
1503 else if(memcmp(tmpbuffer
,"EUROPE",6)==0) {
1504 pDevice
->config_file
.ZoneType
=ZoneType_Europe
;
1507 printk("Unknown Zonetype[%s]?\n",tmpbuffer
);
1512 //get other parameter
1514 memset(tmpbuffer
,0,sizeof(tmpbuffer
));
1515 if(Config_FileGetParameter("AUTHENMODE",tmpbuffer
,buffer
)==TRUE
) {
1516 pDevice
->config_file
.eAuthenMode
= (int) simple_strtol(tmpbuffer
, NULL
, 10);
1519 memset(tmpbuffer
,0,sizeof(tmpbuffer
));
1520 if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer
,buffer
)==TRUE
) {
1521 pDevice
->config_file
.eEncryptionStatus
= (int) simple_strtol(tmpbuffer
, NULL
, 10);
1529 static void device_set_multi(struct net_device
*dev
) {
1530 PSDevice pDevice
= (PSDevice
) netdev_priv(dev
);
1531 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
1534 struct netdev_hw_addr
*ha
;
1535 BYTE pbyData
[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
1540 spin_lock_irq(&pDevice
->lock
);
1541 rc
= CONTROLnsRequestIn(pDevice
,
1544 MESSAGE_REQUEST_MACREG
,
1548 if (rc
== 0) pDevice
->byRxMode
= byTmpMode
;
1550 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"pDevice->byRxMode in= %x\n", pDevice
->byRxMode
);
1552 if (dev
->flags
& IFF_PROMISC
) { // Set promiscuous.
1553 DBG_PRT(MSG_LEVEL_ERR
,KERN_NOTICE
"%s: Promiscuous mode enabled.\n", dev
->name
);
1554 // Unconditionally log net taps.
1555 pDevice
->byRxMode
|= (RCR_MULTICAST
|RCR_BROADCAST
|RCR_UNICAST
);
1557 else if ((netdev_mc_count(dev
) > pDevice
->multicast_limit
) ||
1558 (dev
->flags
& IFF_ALLMULTI
)) {
1559 CONTROLnsRequestOut(pDevice
,
1562 MESSAGE_REQUEST_MACREG
,
1566 pDevice
->byRxMode
|= (RCR_MULTICAST
|RCR_BROADCAST
);
1569 memset(mc_filter
, 0, sizeof(mc_filter
));
1570 netdev_for_each_mc_addr(ha
, dev
) {
1571 int bit_nr
= ether_crc(ETH_ALEN
, ha
->addr
) >> 26;
1572 mc_filter
[bit_nr
>> 5] |= cpu_to_le32(1 << (bit_nr
& 31));
1574 for (ii
= 0; ii
< 4; ii
++) {
1575 MACvWriteMultiAddr(pDevice
, ii
, *((PBYTE
)&mc_filter
[0] + ii
));
1576 MACvWriteMultiAddr(pDevice
, ii
+ 4, *((PBYTE
)&mc_filter
[1] + ii
));
1578 pDevice
->byRxMode
&= ~(RCR_UNICAST
);
1579 pDevice
->byRxMode
|= (RCR_MULTICAST
|RCR_BROADCAST
);
1582 if (pMgmt
->eConfigMode
== WMAC_CONFIG_AP
) {
1583 // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
1584 pDevice
->byRxMode
|= (RCR_MULTICAST
|RCR_BROADCAST
);
1585 pDevice
->byRxMode
&= ~(RCR_UNICAST
);
1587 ControlvWriteByte(pDevice
, MESSAGE_REQUEST_MACREG
, MAC_REG_RCR
, pDevice
->byRxMode
);
1588 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"pDevice->byRxMode out= %x\n", pDevice
->byRxMode
);
1589 spin_unlock_irq(&pDevice
->lock
);
1594 static struct net_device_stats
*device_get_stats(struct net_device
*dev
) {
1595 PSDevice pDevice
=(PSDevice
) netdev_priv(dev
);
1597 return &pDevice
->stats
;
1601 static int device_ioctl(struct net_device
*dev
, struct ifreq
*rq
, int cmd
) {
1602 PSDevice pDevice
= (PSDevice
)netdev_priv(dev
);
1603 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
1605 //BOOL bCommit = FALSE;
1606 struct iwreq
*wrq
= (struct iwreq
*) rq
;
1609 if (pMgmt
== NULL
) {
1617 rc
= iwctl_giwname(dev
, NULL
, (char *)&(wrq
->u
.name
), NULL
);
1624 case SIOCGIWNWID
: //0x8b03 support
1625 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1626 rc
= iwctl_giwnwid(dev
, NULL
, &(wrq
->u
.nwid
), NULL
);
1632 // Set frequency/channel
1634 rc
= iwctl_siwfreq(dev
, NULL
, &(wrq
->u
.freq
), NULL
);
1637 // Get frequency/channel
1639 rc
= iwctl_giwfreq(dev
, NULL
, &(wrq
->u
.freq
), NULL
);
1642 // Set desired network name (ESSID)
1646 char essid
[IW_ESSID_MAX_SIZE
+1];
1647 if (wrq
->u
.essid
.length
> IW_ESSID_MAX_SIZE
) {
1651 if (copy_from_user(essid
, wrq
->u
.essid
.pointer
,
1652 wrq
->u
.essid
.length
)) {
1656 rc
= iwctl_siwessid(dev
, NULL
,
1657 &(wrq
->u
.essid
), essid
);
1662 // Get current network name (ESSID)
1666 char essid
[IW_ESSID_MAX_SIZE
+1];
1667 if (wrq
->u
.essid
.pointer
) {
1668 rc
= iwctl_giwessid(dev
, NULL
,
1669 &(wrq
->u
.essid
), essid
);
1670 if (copy_to_user(wrq
->u
.essid
.pointer
,
1672 wrq
->u
.essid
.length
) )
1680 rc
= iwctl_siwap(dev
, NULL
, &(wrq
->u
.ap_addr
), NULL
);
1684 // Get current Access Point (BSSID)
1686 rc
= iwctl_giwap(dev
, NULL
, &(wrq
->u
.ap_addr
), NULL
);
1690 // Set desired station name
1692 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWNICKN \n");
1696 // Get current station name
1698 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCGIWNICKN \n");
1702 // Set the desired bit-rate
1704 rc
= iwctl_siwrate(dev
, NULL
, &(wrq
->u
.bitrate
), NULL
);
1707 // Get the current bit-rate
1710 rc
= iwctl_giwrate(dev
, NULL
, &(wrq
->u
.bitrate
), NULL
);
1713 // Set the desired RTS threshold
1716 rc
= iwctl_siwrts(dev
, NULL
, &(wrq
->u
.rts
), NULL
);
1719 // Get the current RTS threshold
1722 rc
= iwctl_giwrts(dev
, NULL
, &(wrq
->u
.rts
), NULL
);
1725 // Set the desired fragmentation threshold
1728 rc
= iwctl_siwfrag(dev
, NULL
, &(wrq
->u
.frag
), NULL
);
1731 // Get the current fragmentation threshold
1734 rc
= iwctl_giwfrag(dev
, NULL
, &(wrq
->u
.frag
), NULL
);
1737 // Set mode of operation
1739 rc
= iwctl_siwmode(dev
, NULL
, &(wrq
->u
.mode
), NULL
);
1742 // Get mode of operation
1744 rc
= iwctl_giwmode(dev
, NULL
, &(wrq
->u
.mode
), NULL
);
1747 // Set WEP keys and mode
1750 char abyKey
[WLAN_WEP232_KEYLEN
];
1752 if (wrq
->u
.encoding
.pointer
) {
1755 if (wrq
->u
.encoding
.length
> WLAN_WEP232_KEYLEN
) {
1759 memset(abyKey
, 0, WLAN_WEP232_KEYLEN
);
1760 if (copy_from_user(abyKey
,
1761 wrq
->u
.encoding
.pointer
,
1762 wrq
->u
.encoding
.length
)) {
1766 } else if (wrq
->u
.encoding
.length
!= 0) {
1770 rc
= iwctl_siwencode(dev
, NULL
, &(wrq
->u
.encoding
), abyKey
);
1774 // Get the WEP keys and mode
1777 if (!capable(CAP_NET_ADMIN
)) {
1782 char abyKey
[WLAN_WEP232_KEYLEN
];
1784 rc
= iwctl_giwencode(dev
, NULL
, &(wrq
->u
.encoding
), abyKey
);
1786 if (wrq
->u
.encoding
.pointer
) {
1787 if (copy_to_user(wrq
->u
.encoding
.pointer
,
1789 wrq
->u
.encoding
.length
))
1795 // Get the current Tx-Power
1797 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCGIWTXPOW \n");
1802 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCGIWTXPOW \n");
1808 rc
= iwctl_siwretry(dev
, NULL
, &(wrq
->u
.retry
), NULL
);
1813 rc
= iwctl_giwretry(dev
, NULL
, &(wrq
->u
.retry
), NULL
);
1816 // Get range of parameters
1820 struct iw_range range
;
1822 rc
= iwctl_giwrange(dev
, NULL
, &(wrq
->u
.data
), (char *) &range
);
1823 if (copy_to_user(wrq
->u
.data
.pointer
, &range
, sizeof(struct iw_range
)))
1831 rc
= iwctl_giwpower(dev
, NULL
, &(wrq
->u
.power
), NULL
);
1837 rc
= iwctl_siwpower(dev
, NULL
, &(wrq
->u
.power
), NULL
);
1843 rc
= iwctl_giwsens(dev
, NULL
, &(wrq
->u
.sens
), NULL
);
1847 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWSENS \n");
1853 char buffer
[IW_MAX_AP
* (sizeof(struct sockaddr
) + sizeof(struct iw_quality
))];
1855 if (wrq
->u
.data
.pointer
) {
1856 rc
= iwctl_giwaplist(dev
, NULL
, &(wrq
->u
.data
), buffer
);
1858 if (copy_to_user(wrq
->u
.data
.pointer
,
1860 (wrq
->u
.data
.length
* (sizeof(struct sockaddr
) + sizeof(struct iw_quality
)))
1873 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWSPY \n");
1880 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWSPY \n");
1884 #endif // WIRELESS_SPY
1887 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCGIWPRIV \n");
1890 if(wrq->u.data.pointer) {
1891 wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
1893 if(copy_to_user(wrq->u.data.pointer,
1894 (u_char *) iwctl_private_args,
1895 sizeof(iwctl_private_args)))
1901 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1903 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWAUTH\n");
1904 rc
= iwctl_siwauth(dev
, NULL
, &(wrq
->u
.param
), NULL
);
1908 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCGIWAUTH \n");
1909 rc
= iwctl_giwauth(dev
, NULL
, &(wrq
->u
.param
), NULL
);
1913 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWGENIE \n");
1914 rc
= iwctl_siwgenie(dev
, NULL
, &(wrq
->u
.data
), wrq
->u
.data
.pointer
);
1918 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCGIWGENIE \n");
1919 rc
= iwctl_giwgenie(dev
, NULL
, &(wrq
->u
.data
), wrq
->u
.data
.pointer
);
1922 case SIOCSIWENCODEEXT
:
1924 char extra
[sizeof(struct iw_encode_ext
)+MAX_KEY_LEN
+1];
1925 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWENCODEEXT \n");
1926 if(wrq
->u
.encoding
.pointer
){
1927 memset(extra
, 0, sizeof(struct iw_encode_ext
)+MAX_KEY_LEN
+1);
1928 if(wrq
->u
.encoding
.length
> (sizeof(struct iw_encode_ext
)+ MAX_KEY_LEN
)){
1932 if(copy_from_user(extra
, wrq
->u
.encoding
.pointer
,wrq
->u
.encoding
.length
)){
1936 }else if(wrq
->u
.encoding
.length
!= 0){
1940 rc
= iwctl_siwencodeext(dev
, NULL
, &(wrq
->u
.encoding
), extra
);
1944 case SIOCGIWENCODEEXT
:
1945 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCGIWENCODEEXT \n");
1946 rc
= iwctl_giwencodeext(dev
, NULL
, &(wrq
->u
.encoding
), NULL
);
1950 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
" SIOCSIWMLME \n");
1951 rc
= iwctl_siwmlme(dev
, NULL
, &(wrq
->u
.data
), wrq
->u
.data
.pointer
);
1954 #endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1956 case IOCTL_CMD_TEST
:
1958 if (!(pDevice
->flags
& DEVICE_FLAGS_OPENED
)) {
1964 pReq
= (PSCmdRequest
)rq
;
1966 //20080130-01,<Remark> by Mike Liu
1967 // if(pDevice->bLinkPass==TRUE)
1968 pReq
->wResult
= MAGIC_CODE
; //Linking status:0x3142
1969 //20080130-02,<Remark> by Mike Liu
1971 // pReq->wResult = MAGIC_CODE+1; //disconnect status:0x3143
1975 if (!(pDevice
->flags
& DEVICE_FLAGS_OPENED
) &&
1976 (((PSCmdRequest
)rq
)->wCmdCode
!=WLAN_CMD_SET_WPA
))
1984 if (test_and_set_bit( 0, (void*)&(pMgmt
->uCmdBusy
))) {
1987 rc
= private_ioctl(pDevice
, rq
);
1988 clear_bit( 0, (void*)&(pMgmt
->uCmdBusy
));
1991 case IOCTL_CMD_HOSTAPD
:
1993 if (!(pDevice
->flags
& DEVICE_FLAGS_OPENED
)) {
2000 rc
= vt6656_hostap_ioctl(pDevice
, &wrq
->u
.data
);
2005 if (!(pDevice
->flags
& DEVICE_FLAGS_OPENED
)) {
2012 rc
= wpa_ioctl(pDevice
, &wrq
->u
.data
);
2016 return ethtool_ioctl(dev
, (void *) rq
->ifr_data
);
2017 // All other calls are currently unsupported
2021 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Ioctl command not support..%x\n", cmd
);
2026 if (pDevice
->bCommit
) {
2027 if (pMgmt
->eConfigMode
== WMAC_CONFIG_AP
) {
2028 netif_stop_queue(pDevice
->dev
);
2029 spin_lock_irq(&pDevice
->lock
);
2030 bScheduleCommand((void *) pDevice
, WLAN_CMD_RUN_AP
, NULL
);
2031 spin_unlock_irq(&pDevice
->lock
);
2034 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Commit the settings\n");
2035 spin_lock_irq(&pDevice
->lock
);
2036 //2007-1121-01<Modify>by EinsnLiu
2037 if (pDevice
->bLinkPass
&&
2038 memcmp(pMgmt
->abyCurrSSID
,pMgmt
->abyDesireSSID
,WLAN_IEHDR_LEN
+ WLAN_SSID_MAXLEN
)) {
2039 bScheduleCommand((void *) pDevice
, WLAN_CMD_DISASSOCIATE
, NULL
);
2041 pDevice
->bLinkPass
= FALSE
;
2042 pMgmt
->eCurrState
= WMAC_STATE_IDLE
;
2043 memset(pMgmt
->abyCurrBSSID
, 0, 6);
2045 ControlvMaskByte(pDevice
,MESSAGE_REQUEST_MACREG
,MAC_REG_PAPEDELAY
,LEDSTS_STS
,LEDSTS_SLOW
);
2047 netif_stop_queue(pDevice
->dev
);
2048 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2049 pMgmt
->eScanType
= WMAC_SCAN_ACTIVE
;
2050 if (!pDevice
->bWPASuppWextEnabled
)
2052 bScheduleCommand((void *) pDevice
,
2053 WLAN_CMD_BSSID_SCAN
,
2054 pMgmt
->abyDesireSSID
);
2055 bScheduleCommand((void *) pDevice
,
2058 spin_unlock_irq(&pDevice
->lock
);
2060 pDevice
->bCommit
= FALSE
;
2068 static int ethtool_ioctl(struct net_device
*dev
, void *useraddr
)
2072 if (copy_from_user(ðcmd
, useraddr
, sizeof(ethcmd
)))
2076 case ETHTOOL_GDRVINFO
: {
2077 struct ethtool_drvinfo info
= {ETHTOOL_GDRVINFO
};
2078 strncpy(info
.driver
, DEVICE_NAME
, sizeof(info
.driver
)-1);
2079 strncpy(info
.version
, DEVICE_VERSION
, sizeof(info
.version
)-1);
2080 if (copy_to_user(useraddr
, &info
, sizeof(info
)))
2091 /*------------------------------------------------------------------*/
2093 MODULE_DEVICE_TABLE(usb
, vt6656_table
);
2095 static struct usb_driver vt6656_driver
= {
2096 .name
= DEVICE_NAME
,
2097 .probe
= vt6656_probe
,
2098 .disconnect
= vt6656_disconnect
,
2099 .id_table
= vt6656_table
,
2101 .suspend
= vt6656_suspend
,
2102 .resume
= vt6656_resume
,
2103 #endif /* CONFIG_PM */
2106 module_usb_driver(vt6656_driver
);