blob: ebd7a1ebce8c1fc870ae26b2bedcab99ca05c2c4 [file] [log] [blame]
Forest Bond92b96792009-06-13 07:38:31 -04001/*
2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3 * All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * File: main_usb.c
20 *
21 * Purpose: driver entry for initial, open, close, tx and rx.
22 *
23 * Author: Lyndon Chen
24 *
25 * Date: Dec 8, 2005
26 *
27 * Functions:
28 *
Andres More26e5b652010-04-13 19:43:07 -030029 * vt6656_probe - module initial (insmod) driver entry
Forest Bond92b96792009-06-13 07:38:31 -040030 * device_remove1 - module remove entry
31 * device_open - allocate dma/descripter resource & initial mac/bbp function
32 * device_xmit - asynchrous data tx function
33 * device_set_multi - set mac filter
34 * device_ioctl - ioctl entry
35 * device_close - shutdown mac/bbp & free dma/descripter resource
36 * device_alloc_frag_buf - rx fragement pre-allocated function
37 * device_free_tx_bufs - free tx buffer function
38 * device_dma0_tx_80211- tx 802.11 frame via dma0
39 * device_dma0_xmit- tx PS bufferred frame via dma0
40 * device_init_registers- initial MAC & BBP & RF internal registers.
41 * device_init_rings- initial tx/rx ring buffer
42 * device_init_defrag_cb- initial & allocate de-fragement buffer.
43 * device_tx_srv- tx interrupt service function
44 *
45 * Revision History:
46 */
47#undef __NO_VERSION__
48
Forest Bond92b96792009-06-13 07:38:31 -040049#include "device.h"
Forest Bond92b96792009-06-13 07:38:31 -040050#include "card.h"
Forest Bond92b96792009-06-13 07:38:31 -040051#include "baseband.h"
Forest Bond92b96792009-06-13 07:38:31 -040052#include "mac.h"
Forest Bond92b96792009-06-13 07:38:31 -040053#include "tether.h"
Forest Bond92b96792009-06-13 07:38:31 -040054#include "wmgr.h"
Forest Bond92b96792009-06-13 07:38:31 -040055#include "wctl.h"
Forest Bond92b96792009-06-13 07:38:31 -040056#include "power.h"
Forest Bond92b96792009-06-13 07:38:31 -040057#include "wcmd.h"
Forest Bond92b96792009-06-13 07:38:31 -040058#include "iocmd.h"
Forest Bond92b96792009-06-13 07:38:31 -040059#include "tcrc.h"
Forest Bond92b96792009-06-13 07:38:31 -040060#include "rxtx.h"
Forest Bond92b96792009-06-13 07:38:31 -040061#include "bssdb.h"
Forest Bond92b96792009-06-13 07:38:31 -040062#include "hostap.h"
Forest Bond92b96792009-06-13 07:38:31 -040063#include "wpactl.h"
Forest Bond92b96792009-06-13 07:38:31 -040064#include "ioctl.h"
Forest Bond92b96792009-06-13 07:38:31 -040065#include "iwctl.h"
Forest Bond92b96792009-06-13 07:38:31 -040066#include "dpc.h"
Forest Bond92b96792009-06-13 07:38:31 -040067#include "datarate.h"
Forest Bond92b96792009-06-13 07:38:31 -040068#include "rf.h"
Forest Bond92b96792009-06-13 07:38:31 -040069#include "firmware.h"
Forest Bond92b96792009-06-13 07:38:31 -040070#include "rndis.h"
Forest Bond92b96792009-06-13 07:38:31 -040071#include "control.h"
Forest Bond92b96792009-06-13 07:38:31 -040072#include "channel.h"
Forest Bond92b96792009-06-13 07:38:31 -040073#include "int.h"
Forest Bond92b96792009-06-13 07:38:31 -040074#include "iowpa.h"
Forest Bond92b96792009-06-13 07:38:31 -040075
76/*--------------------- Static Definitions -------------------------*/
77//static int msglevel =MSG_LEVEL_DEBUG;
78static int msglevel =MSG_LEVEL_INFO;
79
80//
81// Define module options
82//
83
84// Version Information
85#define DRIVER_AUTHOR "VIA Networking Technologies, Inc., <lyndonchen@vntek.com.tw>"
86MODULE_AUTHOR(DRIVER_AUTHOR);
87MODULE_LICENSE("GPL");
88MODULE_DESCRIPTION(DEVICE_FULL_DRV_NAM);
89
Forest Bond92b96792009-06-13 07:38:31 -040090#define DEVICE_PARAM(N,D) \
91 static int N[MAX_UINTS]=OPTION_DEFAULT;\
92 module_param_array(N, int, NULL, 0);\
93 MODULE_PARM_DESC(N, D);
94
Forest Bond92b96792009-06-13 07:38:31 -040095#define RX_DESC_MIN0 16
96#define RX_DESC_MAX0 128
97#define RX_DESC_DEF0 64
98DEVICE_PARAM(RxDescriptors0,"Number of receive usb desc buffer");
99
100
101#define TX_DESC_MIN0 16
102#define TX_DESC_MAX0 128
103#define TX_DESC_DEF0 64
104DEVICE_PARAM(TxDescriptors0,"Number of transmit usb desc buffer");
105
106
107#define CHANNEL_MIN 1
108#define CHANNEL_MAX 14
109#define CHANNEL_DEF 6
110
111DEVICE_PARAM(Channel, "Channel number");
112
113
114/* PreambleType[] is the preamble length used for transmit.
115 0: indicate allows long preamble type
116 1: indicate allows short preamble type
117*/
118
119#define PREAMBLE_TYPE_DEF 1
120
121DEVICE_PARAM(PreambleType, "Preamble Type");
122
123
124#define RTS_THRESH_MIN 512
125#define RTS_THRESH_MAX 2347
126#define RTS_THRESH_DEF 2347
127
128DEVICE_PARAM(RTSThreshold, "RTS threshold");
129
130
131#define FRAG_THRESH_MIN 256
132#define FRAG_THRESH_MAX 2346
133#define FRAG_THRESH_DEF 2346
134
135DEVICE_PARAM(FragThreshold, "Fragmentation threshold");
136
137
138#define DATA_RATE_MIN 0
139#define DATA_RATE_MAX 13
140#define DATA_RATE_DEF 13
141/* datarate[] index
142 0: indicate 1 Mbps 0x02
143 1: indicate 2 Mbps 0x04
144 2: indicate 5.5 Mbps 0x0B
145 3: indicate 11 Mbps 0x16
146 4: indicate 6 Mbps 0x0c
147 5: indicate 9 Mbps 0x12
148 6: indicate 12 Mbps 0x18
149 7: indicate 18 Mbps 0x24
150 8: indicate 24 Mbps 0x30
151 9: indicate 36 Mbps 0x48
152 10: indicate 48 Mbps 0x60
153 11: indicate 54 Mbps 0x6c
154 12: indicate 72 Mbps 0x90
155 13: indicate auto rate
156*/
157
158DEVICE_PARAM(ConnectionRate, "Connection data rate");
159
160#define OP_MODE_MAX 2
161#define OP_MODE_DEF 0
162#define OP_MODE_MIN 0
163
164DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode ");
165
166/* OpMode[] is used for transmit.
167 0: indicate infrastruct mode used
168 1: indicate adhoc mode used
169 2: indicate AP mode used
170*/
171
172
173/* PSMode[]
174 0: indicate disable power saving mode
175 1: indicate enable power saving mode
176*/
177
178#define PS_MODE_DEF 0
179
180DEVICE_PARAM(PSMode, "Power saving mode");
181
182
183#define SHORT_RETRY_MIN 0
184#define SHORT_RETRY_MAX 31
185#define SHORT_RETRY_DEF 8
186
187
188DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");
189
190#define LONG_RETRY_MIN 0
191#define LONG_RETRY_MAX 15
192#define LONG_RETRY_DEF 4
193
194
195DEVICE_PARAM(LongRetryLimit, "long frame retry limits");
196
197
198/* BasebandType[] baseband type selected
199 0: indicate 802.11a type
200 1: indicate 802.11b type
201 2: indicate 802.11g type
202*/
203#define BBP_TYPE_MIN 0
204#define BBP_TYPE_MAX 2
205#define BBP_TYPE_DEF 2
206
207DEVICE_PARAM(BasebandType, "baseband type");
208
209
210
211/* 80211hEnable[]
212 0: indicate disable 802.11h
213 1: indicate enable 802.11h
214*/
215
216#define X80211h_MODE_DEF 0
217
218DEVICE_PARAM(b80211hEnable, "802.11h mode");
219
220
221//
222// Static vars definitions
223//
224
Andres More26e5b652010-04-13 19:43:07 -0300225static struct usb_device_id vt6656_table[] __devinitdata = {
Forest Bond92b96792009-06-13 07:38:31 -0400226 {USB_DEVICE(VNT_USB_VENDOR_ID, VNT_USB_PRODUCT_ID)},
227 {}
228};
229
Forest Bond92b96792009-06-13 07:38:31 -0400230// Frequency list (map channels to frequencies)
231/*
232static const long frequency_list[] = {
233 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 2484,
234 4915, 4920, 4925, 4935, 4940, 4945, 4960, 4980,
235 5035, 5040, 5045, 5055, 5060, 5080, 5170, 5180, 5190, 5200, 5210, 5220, 5230, 5240,
236 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640, 5660, 5680,
237 5700, 5745, 5765, 5785, 5805, 5825
238 };
239
240
241#ifndef IW_ENCODE_NOKEY
242#define IW_ENCODE_NOKEY 0x0800
243#define IW_ENCODE_MODE (IW_ENCODE_DISABLED | IW_ENCODE_RESTRICTED | IW_ENCODE_OPEN)
244#endif
245
Forest Bond92b96792009-06-13 07:38:31 -0400246static const struct iw_handler_def iwctl_handler_def;
Forest Bond92b96792009-06-13 07:38:31 -0400247*/
248
Forest Bond92b96792009-06-13 07:38:31 -0400249/*--------------------- Static Functions --------------------------*/
Andres More26e5b652010-04-13 19:43:07 -0300250
251static int vt6656_probe(struct usb_interface *intf,
252 const struct usb_device_id *id);
253static void vt6656_disconnect(struct usb_interface *intf);
254
Forest Bond92b96792009-06-13 07:38:31 -0400255#ifdef CONFIG_PM /* Minimal support for suspend and resume */
Andres More26e5b652010-04-13 19:43:07 -0300256static int vt6656_suspend(struct usb_interface *intf, pm_message_t message);
257static int vt6656_resume(struct usb_interface *intf);
258#endif /* CONFIG_PM */
259
Forest Bond92b96792009-06-13 07:38:31 -0400260static struct net_device_stats *device_get_stats(struct net_device *dev);
261static int device_open(struct net_device *dev);
262static int device_xmit(struct sk_buff *skb, struct net_device *dev);
263static void device_set_multi(struct net_device *dev);
264static int device_close(struct net_device *dev);
265static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
266
267static BOOL device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType);
268static BOOL device_init_defrag_cb(PSDevice pDevice);
269static void device_init_diversity_timer(PSDevice pDevice);
270static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev);
271
272static int ethtool_ioctl(struct net_device *dev, void *useraddr);
273static void device_free_tx_bufs(PSDevice pDevice);
274static void device_free_rx_bufs(PSDevice pDevice);
275static void device_free_int_bufs(PSDevice pDevice);
276static void device_free_frag_bufs(PSDevice pDevice);
277static BOOL device_alloc_bufs(PSDevice pDevice);
278
279static int Read_config_file(PSDevice pDevice);
280static UCHAR *Config_FileOperation(PSDevice pDevice);
281static int Config_FileGetParameter(UCHAR *string, UCHAR *dest,UCHAR *source);
282
283//2008-0714<Add>by Mike Liu
284static BOOL device_release_WPADEV(PSDevice pDevice);
285
Forest Bond92b96792009-06-13 07:38:31 -0400286static void usb_device_reset(PSDevice pDevice);
Forest Bond92b96792009-06-13 07:38:31 -0400287
288
289
290/*--------------------- Export Variables --------------------------*/
291
292/*--------------------- Export Functions --------------------------*/
293
294
295static void
296device_set_options(PSDevice pDevice) {
297
Andres More9a0e7562010-04-13 21:54:48 -0300298 BYTE abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
299 BYTE abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
300 u8 abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
Forest Bond92b96792009-06-13 07:38:31 -0400301
Andres More9a0e7562010-04-13 21:54:48 -0300302 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
303 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
304 memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -0400305
306 pDevice->cbTD = TX_DESC_DEF0;
307 pDevice->cbRD = RX_DESC_DEF0;
308 pDevice->uChannel = CHANNEL_DEF;
309 pDevice->wRTSThreshold = RTS_THRESH_DEF;
310 pDevice->wFragmentationThreshold = FRAG_THRESH_DEF;
311 pDevice->byShortRetryLimit = SHORT_RETRY_DEF;
312 pDevice->byLongRetryLimit = LONG_RETRY_DEF;
313 pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME;
314 pDevice->byShortPreamble = PREAMBLE_TYPE_DEF;
315 pDevice->ePSMode = PS_MODE_DEF;
316 pDevice->b11hEnable = X80211h_MODE_DEF;
317 pDevice->eOPMode = OP_MODE_DEF;
318 pDevice->uConnectionRate = DATA_RATE_DEF;
319 if (pDevice->uConnectionRate < RATE_AUTO) pDevice->bFixRate = TRUE;
320 pDevice->byBBType = BBP_TYPE_DEF;
321 pDevice->byPacketType = pDevice->byBBType;
322 pDevice->byAutoFBCtrl = AUTO_FB_0;
323 pDevice->bUpdateBBVGA = TRUE;
324 pDevice->byFOETuning = 0;
325 pDevice->byAutoPwrTunning = 0;
326 pDevice->wCTSDuration = 0;
327 pDevice->byPreambleType = 0;
328 pDevice->bExistSWNetAddr = FALSE;
329// pDevice->bDiversityRegCtlON = TRUE;
330 pDevice->bDiversityRegCtlON = FALSE;
331}
332
333
334static VOID device_init_diversity_timer(PSDevice pDevice) {
335
336 init_timer(&pDevice->TimerSQ3Tmax1);
337 pDevice->TimerSQ3Tmax1.data = (ULONG)pDevice;
338 pDevice->TimerSQ3Tmax1.function = (TimerFunction)TimerSQ3CallBack;
339 pDevice->TimerSQ3Tmax1.expires = RUN_AT(HZ);
340
341 init_timer(&pDevice->TimerSQ3Tmax2);
342 pDevice->TimerSQ3Tmax2.data = (ULONG)pDevice;
343 pDevice->TimerSQ3Tmax2.function = (TimerFunction)TimerSQ3CallBack;
344 pDevice->TimerSQ3Tmax2.expires = RUN_AT(HZ);
345
346 init_timer(&pDevice->TimerSQ3Tmax3);
347 pDevice->TimerSQ3Tmax3.data = (ULONG)pDevice;
348 pDevice->TimerSQ3Tmax3.function = (TimerFunction)TimerSQ3Tmax3CallBack;
349 pDevice->TimerSQ3Tmax3.expires = RUN_AT(HZ);
350
351 return;
352}
353
354
355//
356// Initialiation of MAC & BBP registers
357//
358
359static BOOL device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType)
360{
Andres More9a0e7562010-04-13 21:54:48 -0300361 u8 abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
362 u8 abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
363 u8 abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
Forest Bond92b96792009-06-13 07:38:31 -0400364 BYTE byAntenna;
365 UINT ii;
366 CMD_CARD_INIT sInitCmd;
367 NTSTATUS ntStatus = STATUS_SUCCESS;
368 RSP_CARD_INIT sInitRsp;
369 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
370 BYTE byTmp;
371 BYTE byCalibTXIQ = 0;
372 BYTE byCalibTXDC = 0;
373 BYTE byCalibRXIQ = 0;
374
375 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "---->INIbInitAdapter. [%d][%d]\n", InitType, pDevice->byPacketType);
376 spin_lock_irq(&pDevice->lock);
Andres More9a0e7562010-04-13 21:54:48 -0300377 if (InitType == DEVICE_INIT_COLD) {
378 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
379 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
380 memcpy(pDevice->abySNAP_Bridgetunnel,
381 abySNAP_Bridgetunnel,
382 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -0400383
384 if ( !FIRMWAREbCheckVersion(pDevice) ) {
385 if (FIRMWAREbDownload(pDevice) == TRUE) {
386 if (FIRMWAREbBrach2Sram(pDevice) == FALSE) {
387 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbBrach2Sram fail \n");
388 spin_unlock_irq(&pDevice->lock);
389 return FALSE;
390 }
391 } else {
392
393 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbDownload fail \n");
394 spin_unlock_irq(&pDevice->lock);
395 return FALSE;
396 }
397 }
398
399 if ( !BBbVT3184Init(pDevice) ) {
400 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" BBbVT3184Init fail \n");
401 spin_unlock_irq(&pDevice->lock);
402 return FALSE;
403 }
404 }
405
406 sInitCmd.byInitClass = (BYTE)InitType;
407 sInitCmd.bExistSWNetAddr = (BYTE) pDevice->bExistSWNetAddr;
408 for(ii=0;ii<6;ii++)
409 sInitCmd.bySWNetAddr[ii] = pDevice->abyCurrentNetAddr[ii];
410 sInitCmd.byShortRetryLimit = pDevice->byShortRetryLimit;
411 sInitCmd.byLongRetryLimit = pDevice->byLongRetryLimit;
412
413 //issue Card_init command to device
414 ntStatus = CONTROLnsRequestOut(pDevice,
415 MESSAGE_TYPE_CARDINIT,
416 0,
417 0,
418 sizeof(CMD_CARD_INIT),
419 (PBYTE) &(sInitCmd));
420
421 if ( ntStatus != STATUS_SUCCESS ) {
422 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Issue Card init fail \n");
423 spin_unlock_irq(&pDevice->lock);
424 return FALSE;
425 }
426 if (InitType == DEVICE_INIT_COLD) {
427
428 ntStatus = CONTROLnsRequestIn(pDevice,MESSAGE_TYPE_INIT_RSP,0,0,sizeof(RSP_CARD_INIT), (PBYTE) &(sInitRsp));
429
430 if (ntStatus != STATUS_SUCCESS) {
431 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Cardinit request in status fail!\n");
432 spin_unlock_irq(&pDevice->lock);
433 return FALSE;
434 }
435
436 //Local ID for AES functions
437 ntStatus = CONTROLnsRequestIn(pDevice,
438 MESSAGE_TYPE_READ,
439 MAC_REG_LOCALID,
440 MESSAGE_REQUEST_MACREG,
441 1,
442 &pDevice->byLocalID);
443
444 if ( ntStatus != STATUS_SUCCESS ) {
445 spin_unlock_irq(&pDevice->lock);
446 return FALSE;
447 }
448
449 // Do MACbSoftwareReset in MACvInitialize
450 // force CCK
451 pDevice->bCCK = TRUE;
452 pDevice->bProtectMode = FALSE; //Only used in 11g type, sync with ERP IE
453 pDevice->bNonERPPresent = FALSE;
454 pDevice->bBarkerPreambleMd = FALSE;
455 if ( pDevice->bFixRate ) {
456 pDevice->wCurrentRate = (WORD) pDevice->uConnectionRate;
457 } else {
458 if ( pDevice->byBBType == BB_TYPE_11B )
459 pDevice->wCurrentRate = RATE_11M;
460 else
461 pDevice->wCurrentRate = RATE_54M;
462 }
463
464 CHvInitChannelTable(pDevice);
465
466 pDevice->byTopOFDMBasicRate = RATE_24M;
467 pDevice->byTopCCKBasicRate = RATE_1M;
468 pDevice->byRevId = 0; //Target to IF pin while programming to RF chip.
469 pDevice->byCurPwr = 0xFF;
470
471 pDevice->byCCKPwr = pDevice->abyEEPROM[EEP_OFS_PWR_CCK];
472 pDevice->byOFDMPwrG = pDevice->abyEEPROM[EEP_OFS_PWR_OFDMG];
473 // Load power Table
474 for (ii=0;ii<14;ii++) {
475 pDevice->abyCCKPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_CCK_PWR_TBL];
476 if (pDevice->abyCCKPwrTbl[ii] == 0)
477 pDevice->abyCCKPwrTbl[ii] = pDevice->byCCKPwr;
478 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_OFDM_PWR_TBL];
479 if (pDevice->abyOFDMPwrTbl[ii] == 0)
480 pDevice->abyOFDMPwrTbl[ii] = pDevice->byOFDMPwrG;
481 }
482
483 //original zonetype is USA,but customize zonetype is europe,
484 // then need recover 12,13 ,14 channel with 11 channel
485 if(((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) ||
486 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe))&&
487 (pDevice->byOriginalZonetype == ZoneType_USA)) {
488 for(ii=11;ii<14;ii++) {
489 pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
490 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];
491 }
492 }
493
494 //{{ RobertYu: 20041124
495 pDevice->byOFDMPwrA = 0x34; // same as RFbMA2829SelectChannel
496 // Load OFDM A Power Table
497 for (ii=0;ii<CB_MAX_CHANNEL_5G;ii++) { //RobertYu:20041224, bug using CB_MAX_CHANNEL
498 pDevice->abyOFDMAPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_OFDMA_PWR_TBL];
499 if (pDevice->abyOFDMAPwrTbl[ii] == 0)
500 pDevice->abyOFDMAPwrTbl[ii] = pDevice->byOFDMPwrA;
501 }
502 //}} RobertYu
503
504 byAntenna = pDevice->abyEEPROM[EEP_OFS_ANTENNA];
505 if (byAntenna & EEP_ANTINV)
506 pDevice->bTxRxAntInv = TRUE;
507 else
508 pDevice->bTxRxAntInv = FALSE;
509
510 byAntenna &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
511
512 if (byAntenna == 0) // if not set default is All
513 byAntenna = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
514
515 if (byAntenna == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
516 pDevice->byAntennaCount = 2;
517 pDevice->byTxAntennaMode = ANT_B;
518 pDevice->dwTxAntennaSel = 1;
519 pDevice->dwRxAntennaSel = 1;
520 if (pDevice->bTxRxAntInv == TRUE)
521 pDevice->byRxAntennaMode = ANT_A;
522 else
523 pDevice->byRxAntennaMode = ANT_B;
524
525 if (pDevice->bDiversityRegCtlON)
526 pDevice->bDiversityEnable = TRUE;
527 else
528 pDevice->bDiversityEnable = FALSE;
529 } else {
530 pDevice->bDiversityEnable = FALSE;
531 pDevice->byAntennaCount = 1;
532 pDevice->dwTxAntennaSel = 0;
533 pDevice->dwRxAntennaSel = 0;
534 if (byAntenna & EEP_ANTENNA_AUX) {
535 pDevice->byTxAntennaMode = ANT_A;
536 if (pDevice->bTxRxAntInv == TRUE)
537 pDevice->byRxAntennaMode = ANT_B;
538 else
539 pDevice->byRxAntennaMode = ANT_A;
540 } else {
541 pDevice->byTxAntennaMode = ANT_B;
542 if (pDevice->bTxRxAntInv == TRUE)
543 pDevice->byRxAntennaMode = ANT_A;
544 else
545 pDevice->byRxAntennaMode = ANT_B;
546 }
547 }
548 pDevice->ulDiversityNValue = 100*255;
549 pDevice->ulDiversityMValue = 100*16;
550 pDevice->byTMax = 1;
551 pDevice->byTMax2 = 4;
552 pDevice->ulSQ3TH = 0;
553 pDevice->byTMax3 = 64;
554 // -----------------------------------------------------------------
555
556 //Get Auto Fall Back Type
557 pDevice->byAutoFBCtrl = AUTO_FB_0;
558
559 // Set SCAN Time
560 pDevice->uScanTime = WLAN_SCAN_MINITIME;
561
562 // default Auto Mode
563 //pDevice->NetworkType = Ndis802_11Automode;
564 pDevice->eConfigPHYMode = PHY_TYPE_AUTO;
565 pDevice->byBBType = BB_TYPE_11G;
566
567 // initialize BBP registers
568 pDevice->ulTxPower = 25;
569
570 // Get Channel range
571 pDevice->byMinChannel = 1;
572 pDevice->byMaxChannel = CB_MAX_CHANNEL;
573
574 // Get RFType
575 pDevice->byRFType = sInitRsp.byRFType;
576
577 if ((pDevice->byRFType & RF_EMU) != 0) {
578 // force change RevID for VT3253 emu
579 pDevice->byRevId = 0x80;
580 }
581
582 // Load EEPROM calibrated vt3266 parameters
583 if (pDevice->byRFType == RF_VT3226D0) {
584 if((pDevice->abyEEPROM[EEP_OFS_MAJOR_VER] == 0x1) &&
585 (pDevice->abyEEPROM[EEP_OFS_MINOR_VER] >= 0x4)) {
586 byCalibTXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_IQ];
587 byCalibTXDC = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_DC];
588 byCalibRXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_RX_IQ];
589 if( (byCalibTXIQ || byCalibTXDC || byCalibRXIQ) ) {
590 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFF, 0x03); // CR255, Set BB to support TX/RX IQ and DC compensation Mode
591 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFB, byCalibTXIQ); // CR251, TX I/Q Imbalance Calibration
592 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFC, byCalibTXDC); // CR252, TX DC-Offset Calibration
593 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFD, byCalibRXIQ); // CR253, RX I/Q Imbalance Calibration
594 } else {
595 // turn off BB Calibration compensation
596 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFF, 0x0); // CR255
597 }
598 }
599 }
600 pMgmt->eScanType = WMAC_SCAN_PASSIVE;
601 pMgmt->uCurrChannel = pDevice->uChannel;
602 pMgmt->uIBSSChannel = pDevice->uChannel;
603 CARDbSetMediaChannel(pDevice, pMgmt->uCurrChannel);
604
605 // get Permanent network address
Jim Lieb3e362592009-08-12 14:54:11 -0700606 memcpy(pDevice->abyPermanentNetAddr,&(sInitRsp.byNetAddr[0]),6);
Andres More9a0e7562010-04-13 21:54:48 -0300607 memcpy(pDevice->abyCurrentNetAddr,
608 pDevice->abyPermanentNetAddr,
609 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -0400610
611 // if exist SW network address, use SW network address.
612
613 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Network address = %02x-%02x-%02x=%02x-%02x-%02x\n",
614 pDevice->abyCurrentNetAddr[0],
615 pDevice->abyCurrentNetAddr[1],
616 pDevice->abyCurrentNetAddr[2],
617 pDevice->abyCurrentNetAddr[3],
618 pDevice->abyCurrentNetAddr[4],
619 pDevice->abyCurrentNetAddr[5]);
620 }
621
622
623
624 // Set BB and packet type at the same time.
625 // Set Short Slot Time, xIFS, and RSPINF.
626 if (pDevice->byBBType == BB_TYPE_11A) {
627 CARDbAddBasicRate(pDevice, RATE_6M);
628 pDevice->bShortSlotTime = TRUE;
629 } else {
630 CARDbAddBasicRate(pDevice, RATE_1M);
631 pDevice->bShortSlotTime = FALSE;
632 }
633 BBvSetShortSlotTime(pDevice);
634 CARDvSetBSSMode(pDevice);
635
636 if (pDevice->bUpdateBBVGA) {
637 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
638 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
639 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
640 }
641
642 pDevice->byRadioCtl = pDevice->abyEEPROM[EEP_OFS_RADIOCTL];
643 pDevice->bHWRadioOff = FALSE;
644 if ( (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) != 0 ) {
645 ntStatus = CONTROLnsRequestIn(pDevice,
646 MESSAGE_TYPE_READ,
647 MAC_REG_GPIOCTL1,
648 MESSAGE_REQUEST_MACREG,
649 1,
650 &byTmp);
651
652 if ( ntStatus != STATUS_SUCCESS ) {
653 spin_unlock_irq(&pDevice->lock);
654 return FALSE;
655 }
656 if ( (byTmp & GPIO3_DATA) == 0 ) {
657 pDevice->bHWRadioOff = TRUE;
658 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
659 } else {
660 MACvRegBitsOff(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
661 pDevice->bHWRadioOff = FALSE;
662 }
663
664 } //EEP_RADIOCTL_ENABLE
665
666 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_TMLEN,0x38);
667 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
668 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL0,0x01);
669
670 if ((pDevice->bHWRadioOff == TRUE) || (pDevice->bRadioControlOff == TRUE)) {
671 CARDbRadioPowerOff(pDevice);
672 } else {
673 CARDbRadioPowerOn(pDevice);
674 }
675
676 spin_unlock_irq(&pDevice->lock);
677 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"<----INIbInitAdapter Exit\n");
678 return TRUE;
679}
680
681static BOOL device_release_WPADEV(PSDevice pDevice)
682{
683 viawget_wpa_header *wpahdr;
684 int ii=0;
685 // wait_queue_head_t Set_wait;
686 //send device close to wpa_supplicnat layer
687 if (pDevice->bWPADEVUp==TRUE) {
688 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
689 wpahdr->type = VIAWGET_DEVICECLOSE_MSG;
690 wpahdr->resp_ie_len = 0;
691 wpahdr->req_ie_len = 0;
692 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
693 pDevice->skb->dev = pDevice->wpadev;
Jim Liebd899d4032009-07-23 17:22:42 -0700694 skb_reset_mac_header(pDevice->skb);
Forest Bond92b96792009-06-13 07:38:31 -0400695 pDevice->skb->pkt_type = PACKET_HOST;
696 pDevice->skb->protocol = htons(ETH_P_802_2);
697 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
698 netif_rx(pDevice->skb);
699 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
700
701 //wait release WPADEV
702 // init_waitqueue_head(&Set_wait);
703 // wait_event_timeout(Set_wait, ((pDevice->wpadev==NULL)&&(pDevice->skb == NULL)),5*HZ); //1s wait
704 while(pDevice->bWPADEVUp==TRUE) {
705 set_current_state(TASK_UNINTERRUPTIBLE);
706 schedule_timeout (HZ/20); //wait 50ms
707 ii++;
708 if(ii>20)
709 break;
710 }
711 };
712 return TRUE;
713}
714
715#ifdef CONFIG_PM /* Minimal support for suspend and resume */
Andres More26e5b652010-04-13 19:43:07 -0300716
717static int vt6656_suspend(struct usb_interface *intf, pm_message_t message)
Forest Bond92b96792009-06-13 07:38:31 -0400718{
719 PSDevice pDevice = usb_get_intfdata(intf);
720 struct net_device *dev = pDevice->dev;
721
722 printk("VNTWUSB Suspend Start======>\n");
723if(dev != NULL) {
724 if(pDevice->flags & DEVICE_FLAGS_OPENED)
725 device_close(dev);
726}
727
728 usb_put_dev(interface_to_usbdev(intf));
729 return 0;
730}
731
Andres More26e5b652010-04-13 19:43:07 -0300732static int vt6656_resume(struct usb_interface *intf)
Forest Bond92b96792009-06-13 07:38:31 -0400733{
734 PSDevice pDevice = usb_get_intfdata(intf);
735 struct net_device *dev = pDevice->dev;
736
737 printk("VNTWUSB Resume Start======>\n");
738 if(dev != NULL) {
739 usb_get_dev(interface_to_usbdev(intf));
740 if(!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
741 if(device_open(dev)!=0)
742 printk("VNTWUSB Resume Start======>open fail\n");
743 }
744 }
745 return 0;
746}
Forest Bond92b96792009-06-13 07:38:31 -0400747
Andres More26e5b652010-04-13 19:43:07 -0300748#endif /* CONFIG_PM */
Forest Bonddd8db702009-06-13 07:38:54 -0400749
750static const struct net_device_ops device_netdev_ops = {
751 .ndo_open = device_open,
752 .ndo_stop = device_close,
753 .ndo_do_ioctl = device_ioctl,
754 .ndo_get_stats = device_get_stats,
755 .ndo_start_xmit = device_xmit,
756 .ndo_set_multicast_list = device_set_multi,
757};
758
759
Andres More26e5b652010-04-13 19:43:07 -0300760static int __devinit
761vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id)
Forest Bond92b96792009-06-13 07:38:31 -0400762{
Andres More9a0e7562010-04-13 21:54:48 -0300763 u8 fake_mac[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
Forest Bond92b96792009-06-13 07:38:31 -0400764 struct usb_device *udev = interface_to_usbdev(intf);
765 int rc = 0;
Forest Bond92b96792009-06-13 07:38:31 -0400766 struct net_device *netdev = NULL;
767 PSDevice pDevice = NULL;
768
769
770 printk(KERN_NOTICE "%s Ver. %s\n",DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
771 printk(KERN_NOTICE "Copyright (c) 2004 VIA Networking Technologies, Inc.\n");
772
Forest Bond92b96792009-06-13 07:38:31 -0400773 udev = usb_get_dev(udev);
Forest Bond92b96792009-06-13 07:38:31 -0400774
Forest Bond1e28efa2009-06-13 07:38:50 -0400775 netdev = alloc_etherdev(sizeof(DEVICE_INFO));
Forest Bond92b96792009-06-13 07:38:31 -0400776
777 if (netdev == NULL) {
778 printk(KERN_ERR DEVICE_NAME ": allocate net device failed \n");
779 kfree(pDevice);
780 goto err_nomem;
781 }
Forest Bond1e28efa2009-06-13 07:38:50 -0400782
783 pDevice = netdev_priv(netdev);
784 memset(pDevice, 0, sizeof(DEVICE_INFO));
785
Forest Bond92b96792009-06-13 07:38:31 -0400786 pDevice->dev = netdev;
787 pDevice->usb = udev;
788
Forest Bond92b96792009-06-13 07:38:31 -0400789 // Set initial settings
790 device_set_options(pDevice);
791 spin_lock_init(&pDevice->lock);
792
793 pDevice->tx_80211 = device_dma0_tx_80211;
794 pDevice->sMgmtObj.pAdapter = (PVOID)pDevice;
795
Forest Bonddd8db702009-06-13 07:38:54 -0400796 netdev->netdev_ops = &device_netdev_ops;
797
Forest Bond92b96792009-06-13 07:38:31 -0400798 netdev->wireless_handlers = (struct iw_handler_def *)&iwctl_handler_def;
Forest Bond92b96792009-06-13 07:38:31 -0400799
Forest Bond92b96792009-06-13 07:38:31 -0400800 //2008-0623-01<Remark>by MikeLiu
801 //2007-0821-01<Add>by MikeLiu
Forest Bond92b96792009-06-13 07:38:31 -0400802 usb_set_intfdata(intf, pDevice);
803 SET_NETDEV_DEV(netdev, &intf->dev);
Andres More9a0e7562010-04-13 21:54:48 -0300804 memcpy(pDevice->dev->dev_addr, fake_mac, ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -0400805 rc = register_netdev(netdev);
806 if (rc != 0) {
807 printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
808 free_netdev(netdev);
809 kfree(pDevice);
810 return -ENODEV;
811 }
Forest Bond92b96792009-06-13 07:38:31 -0400812
813//2008-07-21-01<Add>by MikeLiu
814//register wpadev
miaofngdda79402009-07-15 10:33:35 -0400815#if 0
Forest Bond92b96792009-06-13 07:38:31 -0400816 if(wpa_set_wpadev(pDevice, 1)!=0) {
817 printk("Fail to Register WPADEV?\n");
818 unregister_netdev(pDevice->dev);
819 free_netdev(netdev);
820 kfree(pDevice);
821 }
miaofngdda79402009-07-15 10:33:35 -0400822#endif
Forest Bond92b96792009-06-13 07:38:31 -0400823 usb_device_reset(pDevice);
Forest Bond92b96792009-06-13 07:38:31 -0400824
825#ifdef SndEvt_ToAPI
826{
827 union iwreq_data wrqu;
828 memset(&wrqu, 0, sizeof(wrqu));
829 wrqu.data.flags = RT_INSMOD_EVENT_FLAG;
830 wrqu.data.length =IFNAMSIZ;
831 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, pDevice->dev->name);
832}
833#endif
834
835 return 0;
Forest Bond92b96792009-06-13 07:38:31 -0400836
837
838err_nomem:
Forest Bond92b96792009-06-13 07:38:31 -0400839 //2008-0922-01<Add>by MikeLiu, decrease usb counter.
840 usb_put_dev(udev);
841
842 return -ENOMEM;
Forest Bond92b96792009-06-13 07:38:31 -0400843}
844
845
846static VOID device_free_tx_bufs(PSDevice pDevice) {
847 PUSB_SEND_CONTEXT pTxContext;
848 int ii;
849
850 for (ii = 0; ii < pDevice->cbTD; ii++) {
851
852 pTxContext = pDevice->apTD[ii];
853 //de-allocate URBs
854 if (pTxContext->pUrb) {
Jim Liebdad72fe2009-08-12 14:54:14 -0700855 usb_kill_urb(pTxContext->pUrb);
Forest Bond92b96792009-06-13 07:38:31 -0400856 usb_free_urb(pTxContext->pUrb);
857 }
858 if (pTxContext)
859 kfree(pTxContext);
860 }
861 return;
862}
863
864
865static VOID device_free_rx_bufs(PSDevice pDevice) {
866 PRCB pRCB;
867 int ii;
868
869 for (ii = 0; ii < pDevice->cbRD; ii++) {
870
871 pRCB = pDevice->apRCB[ii];
872 //de-allocate URBs
873 if (pRCB->pUrb) {
Jim Liebdad72fe2009-08-12 14:54:14 -0700874 usb_kill_urb(pRCB->pUrb);
Forest Bond92b96792009-06-13 07:38:31 -0400875 usb_free_urb(pRCB->pUrb);
876 }
877 //de-allocate skb
878 if (pRCB->skb)
879 dev_kfree_skb(pRCB->skb);
880 }
881 if (pDevice->pRCBMem)
882 kfree(pDevice->pRCBMem);
883
884 return;
885}
886
887//2007-1107-02<Add>by MikeLiu
Forest Bond92b96792009-06-13 07:38:31 -0400888static void usb_device_reset(PSDevice pDevice)
889{
890 int status;
891 status = usb_reset_device(pDevice->usb);
892 if (status)
893 printk("usb_device_reset fail status=%d\n",status);
894 return ;
895}
Forest Bond92b96792009-06-13 07:38:31 -0400896
897static VOID device_free_int_bufs(PSDevice pDevice) {
898
899 if (pDevice->intBuf.pDataBuf != NULL)
900 kfree(pDevice->intBuf.pDataBuf);
901 return;
902}
903
904
905static BOOL device_alloc_bufs(PSDevice pDevice) {
906
907 PUSB_SEND_CONTEXT pTxContext;
908 PRCB pRCB;
909 int ii;
910
911
912 for (ii = 0; ii < pDevice->cbTD; ii++) {
913
914 pTxContext = kmalloc(sizeof(USB_SEND_CONTEXT), GFP_KERNEL);
915 if (pTxContext == NULL) {
916 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate tx usb context failed\n", pDevice->dev->name);
917 goto free_tx;
918 }
919 pDevice->apTD[ii] = pTxContext;
920 pTxContext->pDevice = (PVOID) pDevice;
921 //allocate URBs
Jim Liebdad72fe2009-08-12 14:54:14 -0700922 pTxContext->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
Forest Bond92b96792009-06-13 07:38:31 -0400923 if (pTxContext->pUrb == NULL) {
924 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "alloc tx urb failed\n");
925 goto free_tx;
926 }
927 pTxContext->bBoolInUse = FALSE;
928 }
929
930 // allocate rcb mem
931 pDevice->pRCBMem = kmalloc((sizeof(RCB) * pDevice->cbRD), GFP_KERNEL);
932 if (pDevice->pRCBMem == NULL) {
933 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : alloc rx usb context failed\n", pDevice->dev->name);
934 goto free_tx;
935 }
936
937
938 pDevice->FirstRecvFreeList = NULL;
939 pDevice->LastRecvFreeList = NULL;
940 pDevice->FirstRecvMngList = NULL;
941 pDevice->LastRecvMngList = NULL;
942 pDevice->NumRecvFreeList = 0;
943 memset(pDevice->pRCBMem, 0, (sizeof(RCB) * pDevice->cbRD));
944 pRCB = (PRCB) pDevice->pRCBMem;
945
946 for (ii = 0; ii < pDevice->cbRD; ii++) {
947
948 pDevice->apRCB[ii] = pRCB;
949 pRCB->pDevice = (PVOID) pDevice;
950 //allocate URBs
Jim Liebdad72fe2009-08-12 14:54:14 -0700951 pRCB->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
Forest Bond92b96792009-06-13 07:38:31 -0400952
953 if (pRCB->pUrb == NULL) {
954 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx urb\n");
955 goto free_rx_tx;
956 }
957 pRCB->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
958 if (pRCB->skb == NULL) {
959 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx skb\n");
960 goto free_rx_tx;
961 }
962 pRCB->skb->dev = pDevice->dev;
963 pRCB->bBoolInUse = FALSE;
964 EnqueueRCB(pDevice->FirstRecvFreeList, pDevice->LastRecvFreeList, pRCB);
965 pDevice->NumRecvFreeList++;
966 pRCB++;
967 }
968
969
Jim Liebdad72fe2009-08-12 14:54:14 -0700970 pDevice->pControlURB = usb_alloc_urb(0, GFP_ATOMIC);
Forest Bond92b96792009-06-13 07:38:31 -0400971 if (pDevice->pControlURB == NULL) {
972 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc control urb\n");
973 goto free_rx_tx;
974 }
975
Jim Liebdad72fe2009-08-12 14:54:14 -0700976 pDevice->pInterruptURB = usb_alloc_urb(0, GFP_ATOMIC);
Forest Bond92b96792009-06-13 07:38:31 -0400977 if (pDevice->pInterruptURB == NULL) {
978 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int urb\n");
Jim Liebdad72fe2009-08-12 14:54:14 -0700979 usb_kill_urb(pDevice->pControlURB);
Forest Bond92b96792009-06-13 07:38:31 -0400980 usb_free_urb(pDevice->pControlURB);
981 goto free_rx_tx;
982 }
983
984 pDevice->intBuf.pDataBuf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL);
985 if (pDevice->intBuf.pDataBuf == NULL) {
986 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int buf\n");
Jim Liebdad72fe2009-08-12 14:54:14 -0700987 usb_kill_urb(pDevice->pControlURB);
988 usb_kill_urb(pDevice->pInterruptURB);
Forest Bond92b96792009-06-13 07:38:31 -0400989 usb_free_urb(pDevice->pControlURB);
990 usb_free_urb(pDevice->pInterruptURB);
991 goto free_rx_tx;
992 }
993
994 return TRUE;
995
996free_rx_tx:
997 device_free_rx_bufs(pDevice);
998
999free_tx:
1000 device_free_tx_bufs(pDevice);
1001
1002 return FALSE;
1003}
1004
1005
1006
1007
1008static BOOL device_init_defrag_cb(PSDevice pDevice) {
1009 int i;
1010 PSDeFragControlBlock pDeF;
1011
1012 /* Init the fragment ctl entries */
1013 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1014 pDeF = &(pDevice->sRxDFCB[i]);
1015 if (!device_alloc_frag_buf(pDevice, pDeF)) {
1016 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
1017 pDevice->dev->name);
1018 goto free_frag;
1019 };
1020 }
1021 pDevice->cbDFCB = CB_MAX_RX_FRAG;
1022 pDevice->cbFreeDFCB = pDevice->cbDFCB;
1023 return TRUE;
1024
1025free_frag:
1026 device_free_frag_bufs(pDevice);
1027 return FALSE;
1028}
1029
1030
1031
1032static void device_free_frag_bufs(PSDevice pDevice) {
1033 PSDeFragControlBlock pDeF;
1034 int i;
1035
1036 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1037
1038 pDeF = &(pDevice->sRxDFCB[i]);
1039
1040 if (pDeF->skb)
1041 dev_kfree_skb(pDeF->skb);
1042 }
1043}
1044
1045
1046
1047BOOL device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {
1048
1049 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1050 if (pDeF->skb == NULL)
1051 return FALSE;
1052 ASSERT(pDeF->skb);
1053 pDeF->skb->dev = pDevice->dev;
1054
1055 return TRUE;
1056}
1057
1058
1059/*-----------------------------------------------------------------*/
1060
1061static int device_open(struct net_device *dev) {
Forest Bond1e28efa2009-06-13 07:38:50 -04001062 PSDevice pDevice=(PSDevice) netdev_priv(dev);
Forest Bond92b96792009-06-13 07:38:31 -04001063
1064#ifdef WPA_SM_Transtatus
1065 extern SWPAResult wpa_Result;
1066 memset(wpa_Result.ifname,0,sizeof(wpa_Result.ifname));
1067 wpa_Result.proto = 0;
1068 wpa_Result.key_mgmt = 0;
1069 wpa_Result.eap_type = 0;
1070 wpa_Result.authenticated = FALSE;
1071 pDevice->fWPA_Authened = FALSE;
1072#endif
1073
1074 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_open...\n");
1075
1076
1077 pDevice->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS;
1078
1079 if (device_alloc_bufs(pDevice) == FALSE) {
1080 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_alloc_bufs fail... \n");
1081 return -ENOMEM;
1082 }
1083
1084 if (device_init_defrag_cb(pDevice)== FALSE) {
1085 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Initial defragement cb fail \n");
1086 goto free_rx_tx;
1087 }
1088
1089 MP_CLEAR_FLAG(pDevice, fMP_DISCONNECTED);
1090 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
1091 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
1092 MP_SET_FLAG(pDevice, fMP_POST_READS);
1093 MP_SET_FLAG(pDevice, fMP_POST_WRITES);
1094
1095 //read config file
1096 Read_config_file(pDevice);
1097
1098 if (device_init_registers(pDevice, DEVICE_INIT_COLD) == FALSE) {
1099 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " init register fail\n");
1100 goto free_all;
1101 }
1102
1103 device_set_multi(pDevice->dev);
1104 // Init for Key Management
1105
1106 KeyvInitTable(pDevice,&pDevice->sKey);
Andres More9a0e7562010-04-13 21:54:48 -03001107 memcpy(pDevice->sMgmtObj.abyMACAddr, pDevice->abyCurrentNetAddr, ETH_ALEN);
1108 memcpy(pDevice->dev->dev_addr, pDevice->abyCurrentNetAddr, ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001109 pDevice->bStopTx0Pkt = FALSE;
1110 pDevice->bStopDataPkt = FALSE;
1111 pDevice->bRoaming = FALSE; //DavidWang
1112 pDevice->bIsRoaming = FALSE;//DavidWang
1113 pDevice->bEnableRoaming = FALSE;
1114 if (pDevice->bDiversityRegCtlON) {
1115 device_init_diversity_timer(pDevice);
1116 }
1117
1118 vMgrObjectInit(pDevice);
1119 tasklet_init(&pDevice->RxMngWorkItem, (void *)RXvMngWorkItem, (unsigned long)pDevice);
1120 tasklet_init(&pDevice->ReadWorkItem, (void *)RXvWorkItem, (unsigned long)pDevice);
1121 tasklet_init(&pDevice->EventWorkItem, (void *)INTvWorkItem, (unsigned long)pDevice);
1122 add_timer(&(pDevice->sMgmtObj.sTimerSecondCallback));
Forest Bond92b96792009-06-13 07:38:31 -04001123 pDevice->int_interval = 100; //Max 100 microframes.
Forest Bond92b96792009-06-13 07:38:31 -04001124 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1125
1126 pDevice->bIsRxWorkItemQueued = TRUE;
1127 pDevice->fKillEventPollingThread = FALSE;
1128 pDevice->bEventAvailable = FALSE;
1129
1130 pDevice->bWPADEVUp = FALSE;
1131#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1132 pDevice->bwextstep0 = FALSE;
1133 pDevice->bwextstep1 = FALSE;
1134 pDevice->bwextstep2 = FALSE;
1135 pDevice->bwextstep3 = FALSE;
1136 pDevice->bWPASuppWextEnabled = FALSE;
1137#endif
1138 pDevice->byReAssocCount = 0;
1139
1140 RXvWorkItem(pDevice);
1141 INTvWorkItem(pDevice);
1142
1143 // Patch: if WEP key already set by iwconfig but device not yet open
1144 if ((pDevice->bEncryptionEnable == TRUE) && (pDevice->bTransmitKey == TRUE)) {
1145 spin_lock_irq(&pDevice->lock);
1146 KeybSetDefaultKey( pDevice,
1147 &(pDevice->sKey),
1148 pDevice->byKeyIndex | (1 << 31),
1149 pDevice->uKeyLength,
1150 NULL,
1151 pDevice->abyKey,
1152 KEY_CTL_WEP
1153 );
1154 spin_unlock_irq(&pDevice->lock);
1155 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1156 }
1157
1158 if (pDevice->sMgmtObj.eConfigMode == WMAC_CONFIG_AP) {
1159 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RUN_AP, NULL);
1160 }
1161 else {
1162 //mike:mark@2008-11-10
1163 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1164 //bScheduleCommand((HANDLE)pDevice, WLAN_CMD_SSID, NULL);
1165 }
1166
1167
1168 netif_stop_queue(pDevice->dev);
1169 pDevice->flags |= DEVICE_FLAGS_OPENED;
1170
1171#ifdef SndEvt_ToAPI
1172{
1173 union iwreq_data wrqu;
1174 memset(&wrqu, 0, sizeof(wrqu));
1175 wrqu.data.flags = RT_UPDEV_EVENT_FLAG;
1176 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1177}
1178#endif
1179
1180 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
1181 return 0;
1182
1183free_all:
1184 device_free_frag_bufs(pDevice);
1185free_rx_tx:
1186 device_free_rx_bufs(pDevice);
1187 device_free_tx_bufs(pDevice);
1188 device_free_int_bufs(pDevice);
Jim Liebdad72fe2009-08-12 14:54:14 -07001189 usb_kill_urb(pDevice->pControlURB);
1190 usb_kill_urb(pDevice->pInterruptURB);
Forest Bond92b96792009-06-13 07:38:31 -04001191 usb_free_urb(pDevice->pControlURB);
1192 usb_free_urb(pDevice->pInterruptURB);
1193
1194 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open fail.. \n");
1195 return -ENOMEM;
1196}
1197
1198
1199
1200static int device_close(struct net_device *dev) {
Forest Bond1e28efa2009-06-13 07:38:50 -04001201 PSDevice pDevice=(PSDevice) netdev_priv(dev);
Forest Bond92b96792009-06-13 07:38:31 -04001202 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1203
Forest Bond92b96792009-06-13 07:38:31 -04001204 int uu;
Forest Bond92b96792009-06-13 07:38:31 -04001205
1206 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close1 \n");
1207 if (pDevice == NULL)
1208 return -ENODEV;
1209
1210#ifdef SndEvt_ToAPI
1211{
1212 union iwreq_data wrqu;
1213 memset(&wrqu, 0, sizeof(wrqu));
1214 wrqu.data.flags = RT_DOWNDEV_EVENT_FLAG;
1215 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1216}
1217#endif
1218
1219//2007-1121-02<Add>by EinsnLiu
1220 if (pDevice->bLinkPass) {
1221 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
1222 mdelay(30);
1223 }
1224//End Add
1225
1226//2008-0714-01<Add>by MikeLiu
1227device_release_WPADEV(pDevice);
1228
Forest Bond92b96792009-06-13 07:38:31 -04001229 memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
1230 pMgmt->bShareKeyAlgorithm = FALSE;
1231 pDevice->bEncryptionEnable = FALSE;
1232 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1233 spin_lock_irq(&pDevice->lock);
1234 for(uu=0;uu<MAX_KEY_TABLE;uu++)
1235 MACvDisableKeyEntry(pDevice,uu);
1236 spin_unlock_irq(&pDevice->lock);
Forest Bond92b96792009-06-13 07:38:31 -04001237
1238 if ((pDevice->flags & DEVICE_FLAGS_UNPLUG) == FALSE) {
1239 MACbShutdown(pDevice);
1240 }
1241 netif_stop_queue(pDevice->dev);
1242 MP_SET_FLAG(pDevice, fMP_DISCONNECTED);
1243 MP_CLEAR_FLAG(pDevice, fMP_POST_WRITES);
1244 MP_CLEAR_FLAG(pDevice, fMP_POST_READS);
1245 pDevice->fKillEventPollingThread = TRUE;
1246 del_timer(&pDevice->sTimerCommand);
1247 del_timer(&pMgmt->sTimerSecondCallback);
1248
1249//2007-0115-02<Add>by MikeLiu
1250#ifdef TxInSleep
1251 del_timer(&pDevice->sTimerTxData);
1252#endif
1253
1254 if (pDevice->bDiversityRegCtlON) {
1255 del_timer(&pDevice->TimerSQ3Tmax1);
1256 del_timer(&pDevice->TimerSQ3Tmax2);
1257 del_timer(&pDevice->TimerSQ3Tmax3);
1258 }
1259 tasklet_kill(&pDevice->RxMngWorkItem);
1260 tasklet_kill(&pDevice->ReadWorkItem);
1261 tasklet_kill(&pDevice->EventWorkItem);
1262
1263 pDevice->bRoaming = FALSE; //DavidWang
1264 pDevice->bIsRoaming = FALSE;//DavidWang
1265 pDevice->bEnableRoaming = FALSE;
1266 pDevice->bCmdRunning = FALSE;
1267 pDevice->bLinkPass = FALSE;
1268 memset(pMgmt->abyCurrBSSID, 0, 6);
1269 pMgmt->eCurrState = WMAC_STATE_IDLE;
1270
1271 device_free_tx_bufs(pDevice);
1272 device_free_rx_bufs(pDevice);
1273 device_free_int_bufs(pDevice);
1274 device_free_frag_bufs(pDevice);
1275
Jim Liebdad72fe2009-08-12 14:54:14 -07001276 usb_kill_urb(pDevice->pControlURB);
1277 usb_kill_urb(pDevice->pInterruptURB);
Forest Bond92b96792009-06-13 07:38:31 -04001278 usb_free_urb(pDevice->pControlURB);
1279 usb_free_urb(pDevice->pInterruptURB);
1280
1281 BSSvClearNodeDBTable(pDevice, 0);
1282 pDevice->flags &=(~DEVICE_FLAGS_OPENED);
1283
1284 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n");
1285
1286 return 0;
1287}
1288
Forest Bond92b96792009-06-13 07:38:31 -04001289
Andres More26e5b652010-04-13 19:43:07 -03001290static void __devexit vt6656_disconnect(struct usb_interface *intf)
Forest Bond92b96792009-06-13 07:38:31 -04001291{
Forest Bond92b96792009-06-13 07:38:31 -04001292
1293 PSDevice pDevice = usb_get_intfdata(intf);
Forest Bond92b96792009-06-13 07:38:31 -04001294
1295 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_disconnect1.. \n");
1296 if (pDevice == NULL)
1297 return;
1298
1299#ifdef SndEvt_ToAPI
1300{
1301 union iwreq_data wrqu;
1302 memset(&wrqu, 0, sizeof(wrqu));
1303 wrqu.data.flags = RT_RMMOD_EVENT_FLAG;
1304 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1305}
1306#endif
1307
1308//2008-0714-01<Add>by MikeLiu
1309device_release_WPADEV(pDevice);
1310
Forest Bond92b96792009-06-13 07:38:31 -04001311 usb_set_intfdata(intf, NULL);
1312//2008-0922-01<Add>by MikeLiu, decrease usb counter.
1313 usb_put_dev(interface_to_usbdev(intf));
1314
Forest Bond92b96792009-06-13 07:38:31 -04001315 pDevice->flags |= DEVICE_FLAGS_UNPLUG;
1316 if (pDevice->dev != NULL) {
1317 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "unregister_netdev..\n");
1318 unregister_netdev(pDevice->dev);
1319
1320//2008-07-21-01<Add>by MikeLiu
1321//unregister wpadev
1322 if(wpa_set_wpadev(pDevice, 0)!=0)
1323 printk("unregister wpadev fail?\n");
1324
Forest Bond92b96792009-06-13 07:38:31 -04001325 free_netdev(pDevice->dev);
Forest Bond92b96792009-06-13 07:38:31 -04001326 }
1327
Forest Bond92b96792009-06-13 07:38:31 -04001328 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_disconnect3.. \n");
1329}
1330
1331
1332
1333
1334static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev) {
Forest Bond1e28efa2009-06-13 07:38:50 -04001335 PSDevice pDevice=netdev_priv(dev);
Forest Bond92b96792009-06-13 07:38:31 -04001336 PBYTE pbMPDU;
1337 UINT cbMPDULen = 0;
1338
1339
1340 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211\n");
1341 spin_lock_irq(&pDevice->lock);
1342
1343 if (pDevice->bStopTx0Pkt == TRUE) {
1344 dev_kfree_skb_irq(skb);
1345 spin_unlock_irq(&pDevice->lock);
1346 return 0;
1347 };
1348
1349
1350 cbMPDULen = skb->len;
1351 pbMPDU = skb->data;
1352
1353 vDMA0_tx_80211(pDevice, skb);
1354
1355 spin_unlock_irq(&pDevice->lock);
1356
1357 return 0;
1358
1359}
1360
1361
1362static int device_xmit(struct sk_buff *skb, struct net_device *dev) {
Forest Bond1e28efa2009-06-13 07:38:50 -04001363 PSDevice pDevice=netdev_priv(dev);
Forest Bond92b96792009-06-13 07:38:31 -04001364 struct net_device_stats* pStats = &pDevice->stats;
1365
1366
1367 spin_lock_irq(&pDevice->lock);
1368
1369 netif_stop_queue(pDevice->dev);
1370
1371 if (pDevice->bLinkPass == FALSE) {
1372 dev_kfree_skb_irq(skb);
1373 spin_unlock_irq(&pDevice->lock);
1374 return 0;
1375 }
1376 if (pDevice->bStopDataPkt == TRUE) {
1377 dev_kfree_skb_irq(skb);
1378 pStats->tx_dropped++;
1379 spin_unlock_irq(&pDevice->lock);
1380 return 0;
1381 }
1382
1383 if(nsDMA_tx_packet(pDevice, TYPE_AC0DMA, skb) !=0) { //mike add:xmit fail!
1384 if (netif_queue_stopped(pDevice->dev))
1385 netif_wake_queue(pDevice->dev);
1386 }
1387
1388 spin_unlock_irq(&pDevice->lock);
1389
1390 return 0;
1391}
1392
1393
1394
1395static unsigned const ethernet_polynomial = 0x04c11db7U;
1396static inline u32 ether_crc(int length, unsigned char *data)
1397{
1398 int crc = -1;
1399
1400 while(--length >= 0) {
1401 unsigned char current_octet = *data++;
1402 int bit;
1403 for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
1404 crc = (crc << 1) ^
1405 ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
1406 }
1407 }
1408 return crc;
1409}
1410
1411//find out the start position of str2 from str1
1412static UCHAR *kstrstr(const UCHAR *str1,const UCHAR *str2) {
1413 int str1_len=strlen(str1);
1414 int str2_len=strlen(str2);
1415
1416 while (str1_len >= str2_len) {
1417 str1_len--;
1418 if(memcmp(str1,str2,str2_len)==0)
1419 return (UCHAR *)str1;
1420 str1++;
1421 }
1422 return NULL;
1423}
1424
1425static int Config_FileGetParameter(UCHAR *string, UCHAR *dest,UCHAR *source)
1426{
1427 UCHAR buf1[100];
1428 UCHAR buf2[100];
1429 UCHAR *start_p=NULL,*end_p=NULL,*tmp_p=NULL;
1430 int ii;
1431
1432 memset(buf1,0,100);
1433 strcat(buf1, string);
1434 strcat(buf1, "=");
1435 source+=strlen(buf1);
1436
1437//find target string start point
Joe Perchesbfbfeec2010-03-24 22:17:06 -07001438 start_p = kstrstr(source,buf1);
1439 if (start_p == NULL)
Forest Bond92b96792009-06-13 07:38:31 -04001440 return FALSE;
1441
1442//check if current config line is marked by "#" ??
1443for(ii=1;;ii++) {
1444 if(memcmp(start_p-ii,"\n",1)==0)
1445 break;
1446 if(memcmp(start_p-ii,"#",1)==0)
1447 return FALSE;
1448}
1449
1450//find target string end point
Joe Perchesbfbfeec2010-03-24 22:17:06 -07001451 end_p = kstrstr(start_p,"\n");
1452 if (end_p == NULL) { //can't find "\n",but don't care
Forest Bond92b96792009-06-13 07:38:31 -04001453 end_p=start_p+strlen(start_p); //no include "\n"
1454 }
1455
1456 memset(buf2,0,100);
1457 memcpy(buf2,start_p,end_p-start_p); //get the tartget line
1458 buf2[end_p-start_p]='\0';
1459
1460 //find value
Joe Perchesbfbfeec2010-03-24 22:17:06 -07001461 start_p = kstrstr(buf2,"=");
1462 if (start_p == NULL)
Forest Bond92b96792009-06-13 07:38:31 -04001463 return FALSE;
1464 memset(buf1,0,100);
1465 strcpy(buf1,start_p+1);
1466
1467 //except space
1468 tmp_p = buf1;
1469 while(*tmp_p != 0x00) {
1470 if(*tmp_p==' ')
1471 tmp_p++;
1472 else
1473 break;
1474 }
1475
1476 memcpy(dest,tmp_p,strlen(tmp_p));
1477 return TRUE;
1478}
1479
1480//if read fail,return NULL,or return data pointer;
1481static UCHAR *Config_FileOperation(PSDevice pDevice) {
1482 UCHAR *config_path=CONFIG_PATH;
1483 UCHAR *buffer=NULL;
1484 struct file *filp=NULL;
1485 mm_segment_t old_fs = get_fs();
Forest Bond8f9c4662009-06-13 07:38:47 -04001486 //int oldfsuid=0,oldfsgid=0;
Forest Bond92b96792009-06-13 07:38:31 -04001487 int result=0;
1488
1489 set_fs (KERNEL_DS);
Forest Bond8f9c4662009-06-13 07:38:47 -04001490 /* Can't do this anymore, so we rely on correct filesystem permissions:
1491 //Make sure a caller can read or write power as root
1492 oldfsuid=current->fsuid;
1493 oldfsgid=current->fsgid;
Forest Bond92b96792009-06-13 07:38:31 -04001494 current->fsuid = 0;
1495 current->fsgid = 0;
Forest Bond8f9c4662009-06-13 07:38:47 -04001496 */
Forest Bond92b96792009-06-13 07:38:31 -04001497
1498 //open file
1499 filp = filp_open(config_path, O_RDWR, 0);
1500 if (IS_ERR(filp)) {
1501 printk("Config_FileOperation file Not exist\n");
1502 result=-1;
1503 goto error2;
1504 }
1505
1506 if(!(filp->f_op) || !(filp->f_op->read) ||!(filp->f_op->write)) {
1507 printk("file %s cann't readable or writable?\n",config_path);
1508 result = -1;
1509 goto error1;
1510 }
1511
1512 buffer = (UCHAR *)kmalloc(1024, GFP_KERNEL);
1513 if(buffer==NULL) {
1514 printk("alllocate mem for file fail?\n");
1515 result = -1;
1516 goto error1;
1517 }
1518
1519 if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
1520 printk("read file error?\n");
1521 result = -1;
1522 }
1523
1524error1:
1525 if(filp_close(filp,NULL))
1526 printk("Config_FileOperation:close file fail\n");
1527
1528error2:
1529 set_fs (old_fs);
Forest Bond8f9c4662009-06-13 07:38:47 -04001530
1531 /*
Forest Bond92b96792009-06-13 07:38:31 -04001532 current->fsuid=oldfsuid;
1533 current->fsgid=oldfsgid;
Forest Bond8f9c4662009-06-13 07:38:47 -04001534 */
Forest Bond92b96792009-06-13 07:38:31 -04001535
1536if(result!=0) {
1537 if(buffer)
1538 kfree(buffer);
1539 buffer=NULL;
1540}
1541 return buffer;
1542}
1543
André Goddard Rosabbc9a992009-11-14 13:09:06 -02001544//return --->-1:fail; >=0:successful
Forest Bond92b96792009-06-13 07:38:31 -04001545static int Read_config_file(PSDevice pDevice) {
1546 int result=0;
1547 UCHAR tmpbuffer[100];
1548 UCHAR *buffer=NULL;
1549
1550 //init config setting
1551 pDevice->config_file.ZoneType = -1;
1552 pDevice->config_file.eAuthenMode = -1;
1553 pDevice->config_file.eEncryptionStatus = -1;
1554
Joe Perchesbfbfeec2010-03-24 22:17:06 -07001555 buffer = Config_FileOperation(pDevice);
1556 if (buffer == NULL) {
Forest Bond92b96792009-06-13 07:38:31 -04001557 result =-1;
1558 return result;
1559 }
1560
1561//get zonetype
1562{
1563 memset(tmpbuffer,0,sizeof(tmpbuffer));
1564 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer) ==TRUE) {
1565 if(memcmp(tmpbuffer,"USA",3)==0) {
1566 pDevice->config_file.ZoneType=ZoneType_USA;
1567 }
1568 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
1569 pDevice->config_file.ZoneType=ZoneType_Japan;
1570 }
1571 else if(memcmp(tmpbuffer,"EUROPE",6)==0) {
1572 pDevice->config_file.ZoneType=ZoneType_Europe;
1573 }
1574 else {
1575 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
1576 }
1577 }
1578}
1579
1580#if 1
1581//get other parameter
1582 {
1583 memset(tmpbuffer,0,sizeof(tmpbuffer));
1584 if(Config_FileGetParameter("AUTHENMODE",tmpbuffer,buffer)==TRUE) {
1585 pDevice->config_file.eAuthenMode = (int) simple_strtol(tmpbuffer, NULL, 10);
1586 }
1587
1588 memset(tmpbuffer,0,sizeof(tmpbuffer));
1589 if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer,buffer)==TRUE) {
1590 pDevice->config_file.eEncryptionStatus= (int) simple_strtol(tmpbuffer, NULL, 10);
1591 }
1592 }
1593#endif
1594
1595 kfree(buffer);
1596 return result;
1597}
1598
1599static void device_set_multi(struct net_device *dev) {
Forest Bond1e28efa2009-06-13 07:38:50 -04001600 PSDevice pDevice = (PSDevice) netdev_priv(dev);
Forest Bond92b96792009-06-13 07:38:31 -04001601 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1602 u32 mc_filter[2];
1603 int ii;
Jiri Pirkod5907942010-02-18 05:10:14 +00001604 struct dev_mc_list *mclist;
Forest Bond92b96792009-06-13 07:38:31 -04001605 BYTE pbyData[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
1606 BYTE byTmpMode = 0;
1607 int rc;
1608
1609
1610 spin_lock_irq(&pDevice->lock);
1611 rc = CONTROLnsRequestIn(pDevice,
1612 MESSAGE_TYPE_READ,
1613 MAC_REG_RCR,
1614 MESSAGE_REQUEST_MACREG,
1615 1,
1616 &byTmpMode
1617 );
1618 if (rc == 0) pDevice->byRxMode = byTmpMode;
1619
1620 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode in= %x\n", pDevice->byRxMode);
1621
1622 if (dev->flags & IFF_PROMISC) { // Set promiscuous.
1623 DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
1624 // Unconditionally log net taps.
1625 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
1626 }
Jiri Pirko4cd24ea2010-02-08 04:30:35 +00001627 else if ((netdev_mc_count(dev) > pDevice->multicast_limit) ||
1628 (dev->flags & IFF_ALLMULTI)) {
Forest Bond92b96792009-06-13 07:38:31 -04001629 CONTROLnsRequestOut(pDevice,
1630 MESSAGE_TYPE_WRITE,
1631 MAC_REG_MAR0,
1632 MESSAGE_REQUEST_MACREG,
1633 8,
1634 pbyData
1635 );
1636 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1637 }
1638 else {
1639 memset(mc_filter, 0, sizeof(mc_filter));
Jiri Pirkod5907942010-02-18 05:10:14 +00001640 netdev_for_each_mc_addr(mclist, dev) {
Forest Bond92b96792009-06-13 07:38:31 -04001641 int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
1642 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
1643 }
1644 for (ii = 0; ii < 4; ii++) {
1645 MACvWriteMultiAddr(pDevice, ii, *((PBYTE)&mc_filter[0] + ii));
1646 MACvWriteMultiAddr(pDevice, ii+ 4, *((PBYTE)&mc_filter[1] + ii));
1647 }
1648 pDevice->byRxMode &= ~(RCR_UNICAST);
1649 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1650 }
1651
1652 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1653 // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
1654 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1655 pDevice->byRxMode &= ~(RCR_UNICAST);
1656 }
1657 ControlvWriteByte(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_RCR, pDevice->byRxMode);
1658 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode out= %x\n", pDevice->byRxMode);
1659 spin_unlock_irq(&pDevice->lock);
1660
1661}
1662
1663
1664static struct net_device_stats *device_get_stats(struct net_device *dev) {
Forest Bond1e28efa2009-06-13 07:38:50 -04001665 PSDevice pDevice=(PSDevice) netdev_priv(dev);
Forest Bond92b96792009-06-13 07:38:31 -04001666
1667 return &pDevice->stats;
1668}
1669
1670
1671static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
Forest Bond1e28efa2009-06-13 07:38:50 -04001672 PSDevice pDevice = (PSDevice)netdev_priv(dev);
Forest Bond92b96792009-06-13 07:38:31 -04001673 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1674 PSCmdRequest pReq;
1675 //BOOL bCommit = FALSE;
Forest Bond92b96792009-06-13 07:38:31 -04001676 struct iwreq *wrq = (struct iwreq *) rq;
1677 int rc =0;
Forest Bond92b96792009-06-13 07:38:31 -04001678
1679 if (pMgmt == NULL) {
1680 rc = -EFAULT;
1681 return rc;
1682 }
1683
1684 switch(cmd) {
1685
Forest Bond92b96792009-06-13 07:38:31 -04001686 case SIOCGIWNAME:
1687 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
1688 break;
1689
1690 case SIOCSIWNWID:
1691 rc = -EOPNOTSUPP;
1692 break;
1693
1694 case SIOCGIWNWID: //0x8b03 support
1695 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1696 rc = iwctl_giwnwid(dev, NULL, &(wrq->u.nwid), NULL);
1697 #else
1698 rc = -EOPNOTSUPP;
1699 #endif
1700 break;
1701
1702 // Set frequency/channel
1703 case SIOCSIWFREQ:
1704 rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
1705 break;
1706
1707 // Get frequency/channel
1708 case SIOCGIWFREQ:
1709 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
1710 break;
1711
1712 // Set desired network name (ESSID)
1713 case SIOCSIWESSID:
1714
1715 {
1716 char essid[IW_ESSID_MAX_SIZE+1];
1717 if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
1718 rc = -E2BIG;
1719 break;
1720 }
1721 if (copy_from_user(essid, wrq->u.essid.pointer,
1722 wrq->u.essid.length)) {
1723 rc = -EFAULT;
1724 break;
1725 }
1726 rc = iwctl_siwessid(dev, NULL,
1727 &(wrq->u.essid), essid);
1728 }
1729 break;
1730
1731
1732 // Get current network name (ESSID)
1733 case SIOCGIWESSID:
1734
1735 {
1736 char essid[IW_ESSID_MAX_SIZE+1];
1737 if (wrq->u.essid.pointer)
1738 rc = iwctl_giwessid(dev, NULL,
1739 &(wrq->u.essid), essid);
1740 if (copy_to_user(wrq->u.essid.pointer,
1741 essid,
1742 wrq->u.essid.length) )
1743 rc = -EFAULT;
1744 }
1745 break;
1746
1747 case SIOCSIWAP:
1748
1749 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1750 break;
1751
1752
1753 // Get current Access Point (BSSID)
1754 case SIOCGIWAP:
1755 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1756 break;
1757
1758
1759 // Set desired station name
1760 case SIOCSIWNICKN:
1761 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
1762 rc = -EOPNOTSUPP;
1763 break;
1764
1765 // Get current station name
1766 case SIOCGIWNICKN:
1767 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
1768 rc = -EOPNOTSUPP;
1769 break;
1770
1771 // Set the desired bit-rate
1772 case SIOCSIWRATE:
1773 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1774 break;
1775
1776 // Get the current bit-rate
1777 case SIOCGIWRATE:
1778
1779 rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1780 break;
1781
1782 // Set the desired RTS threshold
1783 case SIOCSIWRTS:
1784
1785 rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
1786 break;
1787
1788 // Get the current RTS threshold
1789 case SIOCGIWRTS:
1790
1791 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
1792 break;
1793
1794 // Set the desired fragmentation threshold
1795 case SIOCSIWFRAG:
1796
1797 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
1798 break;
1799
1800 // Get the current fragmentation threshold
1801 case SIOCGIWFRAG:
1802
1803 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
1804 break;
1805
1806 // Set mode of operation
1807 case SIOCSIWMODE:
1808 rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
1809 break;
1810
1811 // Get mode of operation
1812 case SIOCGIWMODE:
1813 rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
1814 break;
1815
1816 // Set WEP keys and mode
1817 case SIOCSIWENCODE:
1818 {
1819 char abyKey[WLAN_WEP232_KEYLEN];
1820
1821 if (wrq->u.encoding.pointer) {
1822
1823
1824 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
1825 rc = -E2BIG;
1826 break;
1827 }
1828 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
1829 if (copy_from_user(abyKey,
1830 wrq->u.encoding.pointer,
1831 wrq->u.encoding.length)) {
1832 rc = -EFAULT;
1833 break;
1834 }
1835 } else if (wrq->u.encoding.length != 0) {
1836 rc = -EINVAL;
1837 break;
1838 }
1839 rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
1840 }
1841 break;
1842
1843 // Get the WEP keys and mode
1844 case SIOCGIWENCODE:
1845
1846 if (!capable(CAP_NET_ADMIN)) {
1847 rc = -EPERM;
1848 break;
1849 }
1850 {
1851 char abyKey[WLAN_WEP232_KEYLEN];
1852
1853 rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
1854 if (rc != 0) break;
1855 if (wrq->u.encoding.pointer) {
1856 if (copy_to_user(wrq->u.encoding.pointer,
1857 abyKey,
1858 wrq->u.encoding.length))
1859 rc = -EFAULT;
1860 }
1861 }
1862 break;
1863
Forest Bond92b96792009-06-13 07:38:31 -04001864 // Get the current Tx-Power
1865 case SIOCGIWTXPOW:
1866 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
1867 rc = -EOPNOTSUPP;
1868 break;
1869
1870 case SIOCSIWTXPOW:
1871 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
1872 rc = -EOPNOTSUPP;
1873 break;
1874
Forest Bond92b96792009-06-13 07:38:31 -04001875 case SIOCSIWRETRY:
1876
1877 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
1878 break;
1879
1880 case SIOCGIWRETRY:
1881
1882 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
1883 break;
1884
Forest Bond92b96792009-06-13 07:38:31 -04001885 // Get range of parameters
1886 case SIOCGIWRANGE:
1887
1888 {
1889 struct iw_range range;
1890
1891 rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *) &range);
1892 if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
1893 rc = -EFAULT;
1894 }
1895
1896 break;
1897
1898 case SIOCGIWPOWER:
1899
1900 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
1901 break;
1902
1903
1904 case SIOCSIWPOWER:
1905
1906 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
1907 break;
1908
1909
1910 case SIOCGIWSENS:
1911
1912 rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
1913 break;
1914
1915 case SIOCSIWSENS:
1916 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
1917 rc = -EOPNOTSUPP;
1918 break;
1919
1920 case SIOCGIWAPLIST:
1921 {
1922 char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
1923
1924 if (wrq->u.data.pointer) {
1925 rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
1926 if (rc == 0) {
1927 if (copy_to_user(wrq->u.data.pointer,
1928 buffer,
1929 (wrq->u.data.length * (sizeof(struct sockaddr) + sizeof(struct iw_quality)))
1930 ))
1931 rc = -EFAULT;
1932 }
1933 }
1934 }
1935 break;
1936
1937
1938#ifdef WIRELESS_SPY
1939 // Set the spy list
1940 case SIOCSIWSPY:
1941
1942 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
1943 rc = -EOPNOTSUPP;
1944 break;
1945
1946 // Get the spy list
1947 case SIOCGIWSPY:
1948
1949 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
1950 rc = -EOPNOTSUPP;
1951 break;
1952
1953#endif // WIRELESS_SPY
1954
1955 case SIOCGIWPRIV:
1956 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
1957 rc = -EOPNOTSUPP;
1958/*
1959 if(wrq->u.data.pointer) {
1960 wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
1961
1962 if(copy_to_user(wrq->u.data.pointer,
1963 (u_char *) iwctl_private_args,
1964 sizeof(iwctl_private_args)))
1965 rc = -EFAULT;
1966 }
1967*/
1968 break;
1969
1970
Forest Bond92b96792009-06-13 07:38:31 -04001971//2008-0409-07, <Add> by Einsn Liu
1972#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1973 case SIOCSIWAUTH:
1974 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH \n");
1975 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
1976 break;
1977
1978 case SIOCGIWAUTH:
1979 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
1980 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
1981 break;
1982
1983 case SIOCSIWGENIE:
1984 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
1985 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1986 break;
1987
1988 case SIOCGIWGENIE:
1989 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
1990 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
1991 break;
1992
1993 case SIOCSIWENCODEEXT:
1994 {
1995 char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
1996 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
1997 if(wrq->u.encoding.pointer){
1998 memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1);
1999 if(wrq->u.encoding.length > (sizeof(struct iw_encode_ext)+ MAX_KEY_LEN)){
2000 rc = -E2BIG;
2001 break;
2002 }
2003 if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
2004 rc = -EFAULT;
2005 break;
2006 }
2007 }else if(wrq->u.encoding.length != 0){
2008 rc = -EINVAL;
2009 break;
2010 }
2011 rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
2012 }
2013 break;
2014
2015 case SIOCGIWENCODEEXT:
2016 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
2017 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
2018 break;
2019
2020 case SIOCSIWMLME:
2021 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
2022 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2023 break;
2024
2025#endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2026//End Add -- //2008-0409-07, <Add> by Einsn Liu
2027
Forest Bond92b96792009-06-13 07:38:31 -04002028 case IOCTL_CMD_TEST:
2029
2030 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2031 rc = -EFAULT;
2032 break;
2033 } else {
2034 rc = 0;
2035 }
2036 pReq = (PSCmdRequest)rq;
2037
2038 //20080130-01,<Remark> by Mike Liu
2039 // if(pDevice->bLinkPass==TRUE)
2040 pReq->wResult = MAGIC_CODE; //Linking status:0x3142
2041 //20080130-02,<Remark> by Mike Liu
2042 // else
2043 // pReq->wResult = MAGIC_CODE+1; //disconnect status:0x3143
2044 break;
2045
2046 case IOCTL_CMD_SET:
2047 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
2048 (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
2049 {
2050 rc = -EFAULT;
2051 break;
2052 } else {
2053 rc = 0;
2054 }
2055
2056 if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
2057 return -EBUSY;
2058 }
2059 rc = private_ioctl(pDevice, rq);
2060 clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
2061 break;
2062
2063 case IOCTL_CMD_HOSTAPD:
2064
2065 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2066 rc = -EFAULT;
2067 break;
2068 } else {
2069 rc = 0;
2070 }
2071
Forest Bondc30d7972010-04-17 11:03:38 -04002072 rc = vt6656_hostap_ioctl(pDevice, &wrq->u.data);
Forest Bond92b96792009-06-13 07:38:31 -04002073 break;
2074
2075 case IOCTL_CMD_WPA:
2076
2077 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2078 rc = -EFAULT;
2079 break;
2080 } else {
2081 rc = 0;
2082 }
2083
Forest Bond92b96792009-06-13 07:38:31 -04002084 rc = wpa_ioctl(pDevice, &wrq->u.data);
Forest Bond92b96792009-06-13 07:38:31 -04002085 break;
2086
2087 case SIOCETHTOOL:
2088 return ethtool_ioctl(dev, (void *) rq->ifr_data);
2089 // All other calls are currently unsupported
2090
2091 default:
2092 rc = -EOPNOTSUPP;
2093 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
2094
2095
2096 }
2097
2098 if (pDevice->bCommit) {
2099 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2100 netif_stop_queue(pDevice->dev);
2101 spin_lock_irq(&pDevice->lock);
2102 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RUN_AP, NULL);
2103 spin_unlock_irq(&pDevice->lock);
2104 }
2105 else {
2106 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
2107 spin_lock_irq(&pDevice->lock);
2108//2007-1121-01<Modify>by EinsnLiu
2109 if (pDevice->bLinkPass&&
2110 memcmp(pMgmt->abyCurrSSID,pMgmt->abyDesireSSID,WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN)) {
2111 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
2112 } else {
2113 pDevice->bLinkPass = FALSE;
2114 pMgmt->eCurrState = WMAC_STATE_IDLE;
2115 memset(pMgmt->abyCurrBSSID, 0, 6);
2116 }
2117 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
2118//End Modify
2119 netif_stop_queue(pDevice->dev);
2120#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2121 pMgmt->eScanType = WMAC_SCAN_ACTIVE;
2122 if(pDevice->bWPASuppWextEnabled !=TRUE)
2123#endif
2124 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
2125 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, NULL);
2126 spin_unlock_irq(&pDevice->lock);
2127 }
2128 pDevice->bCommit = FALSE;
2129 }
2130
2131
2132 return rc;
2133}
2134
2135
2136static int ethtool_ioctl(struct net_device *dev, void *useraddr)
2137{
2138 u32 ethcmd;
2139
2140 if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
2141 return -EFAULT;
2142
2143 switch (ethcmd) {
2144 case ETHTOOL_GDRVINFO: {
2145 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
2146 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
2147 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
2148 if (copy_to_user(useraddr, &info, sizeof(info)))
2149 return -EFAULT;
2150 return 0;
2151 }
2152
2153 }
2154
2155 return -EOPNOTSUPP;
2156}
2157
2158
2159/*------------------------------------------------------------------*/
2160
Andres More26e5b652010-04-13 19:43:07 -03002161MODULE_DEVICE_TABLE(usb, vt6656_table);
Forest Bond92b96792009-06-13 07:38:31 -04002162
Andres More26e5b652010-04-13 19:43:07 -03002163static struct usb_driver vt6656_driver = {
2164 .name = DEVICE_NAME,
2165 .probe = vt6656_probe,
2166 .disconnect = vt6656_disconnect,
2167 .id_table = vt6656_table,
Forest Bond92b96792009-06-13 07:38:31 -04002168#ifdef CONFIG_PM
Andres More26e5b652010-04-13 19:43:07 -03002169 .suspend = vt6656_suspend,
2170 .resume = vt6656_resume,
2171#endif /* CONFIG_PM */
Forest Bond92b96792009-06-13 07:38:31 -04002172};
2173
Andres More26e5b652010-04-13 19:43:07 -03002174static int __init vt6656_init_module(void)
Forest Bond92b96792009-06-13 07:38:31 -04002175{
Forest Bondf4a8df92009-06-13 07:38:56 -04002176 printk(KERN_NOTICE DEVICE_FULL_DRV_NAM " " DEVICE_VERSION);
Andres More26e5b652010-04-13 19:43:07 -03002177 return usb_register(&vt6656_driver);
Forest Bond92b96792009-06-13 07:38:31 -04002178}
2179
Andres More26e5b652010-04-13 19:43:07 -03002180static void __exit vt6656_cleanup_module(void)
Forest Bond92b96792009-06-13 07:38:31 -04002181{
Andres More26e5b652010-04-13 19:43:07 -03002182 usb_deregister(&vt6656_driver);
Forest Bond92b96792009-06-13 07:38:31 -04002183}
2184
Andres More26e5b652010-04-13 19:43:07 -03002185module_init(vt6656_init_module);
2186module_exit(vt6656_cleanup_module);