blob: 12a9ae08789e554da2e0932be6b96ceae4117207 [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 *
29 * vntwusb_found1 - module initial (insmod) driver entry
30 * device_remove1 - module remove entry
31 * device_open - allocate dma/descripter resource & initial mac/bbp function
32 * device_xmit - asynchrous data tx function
33 * device_set_multi - set mac filter
34 * device_ioctl - ioctl entry
35 * device_close - shutdown mac/bbp & free dma/descripter resource
36 * device_alloc_frag_buf - rx fragement pre-allocated function
37 * device_free_tx_bufs - free tx buffer function
38 * device_dma0_tx_80211- tx 802.11 frame via dma0
39 * device_dma0_xmit- tx PS bufferred frame via dma0
40 * device_init_registers- initial MAC & BBP & RF internal registers.
41 * device_init_rings- initial tx/rx ring buffer
42 * device_init_defrag_cb- initial & allocate de-fragement buffer.
43 * device_tx_srv- tx interrupt service function
44 *
45 * Revision History:
46 */
47#undef __NO_VERSION__
48
49#if !defined(__DEVICE_H__)
50#include "device.h"
51#endif
52#if !defined(__CARD_H__)
53#include "card.h"
54#endif
55#if !defined(__TBIT_H__)
56#include "tbit.h"
57#endif
58#if !defined(__BASEBAND_H__)
59#include "baseband.h"
60#endif
61#if !defined(__MAC_H__)
62#include "mac.h"
63#endif
64#if !defined(__TETHER_H__)
65#include "tether.h"
66#endif
67#if !defined(__WMGR_H__)
68#include "wmgr.h"
69#endif
70#if !defined(__WCTL_H__)
71#include "wctl.h"
72#endif
73#if !defined(__POWER_H__)
74#include "power.h"
75#endif
76#if !defined(__WCMD_H__)
77#include "wcmd.h"
78#endif
79#if !defined(__IOCMD_H__)
80#include "iocmd.h"
81#endif
82#if !defined(__TCRC_H__)
83#include "tcrc.h"
84#endif
85#if !defined(__RXTX_H__)
86#include "rxtx.h"
87#endif
88#if !defined(__BSSDB_H__)
89#include "bssdb.h"
90#endif
91#if !defined(__HOSTAP_H__)
92#include "hostap.h"
93#endif
94#if !defined(__WPACTL_H__)
95#include "wpactl.h"
96#endif
97#if !defined(__IOCTL_H__)
98#include "ioctl.h"
99#endif
100#if !defined(__IWCTL_H__)
101#include "iwctl.h"
102#endif
103#if !defined(__DPC_H__)
104#include "dpc.h"
105#endif
106#if !defined(__IOCMD_H__)
107#include "iocmd.h"
108#endif
109#if !defined(__DATARATE_H__)
110#include "datarate.h"
111#endif
112#if !defined(__RF_H__)
113#include "rf.h"
114#endif
115#if !defined(__FIRMWARE_H__)
116#include "firmware.h"
117#endif
118
119#if !defined(__MAC_H__)
120#include "mac.h"
121#endif
122
123#if !defined(__RNDIS_H__)
124#include "rndis.h"
125#endif
126#if !defined(__CONTROL_H__)
127#include "control.h"
128#endif
129#if !defined (_CHANNEL_H_)
130#include "channel.h"
131#endif
132#if !defined(__INT_H__)
133#include "int.h"
134#endif
135#if !defined(__IOWPA_H__)
136#include "iowpa.h"
137#endif
138
139/*--------------------- Static Definitions -------------------------*/
140//static int msglevel =MSG_LEVEL_DEBUG;
141static int msglevel =MSG_LEVEL_INFO;
142
143//
144// Define module options
145//
146
147// Version Information
148#define DRIVER_AUTHOR "VIA Networking Technologies, Inc., <lyndonchen@vntek.com.tw>"
149MODULE_AUTHOR(DRIVER_AUTHOR);
150MODULE_LICENSE("GPL");
151MODULE_DESCRIPTION(DEVICE_FULL_DRV_NAM);
152
153#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15)
154#define DEVICE_PARAM(N,D) \
155 static int N[MAX_UINTS]=OPTION_DEFAULT;\
156 module_param_array(N, int, NULL, 0);\
157 MODULE_PARM_DESC(N, D);
158
159#else
160#define DEVICE_PARAM(N,D) \
161 static const int N[MAX_UINTS]=OPTION_DEFAULT;\
162 MODULE_PARM(N, "1-" __MODULE_STRING(MAX_UINTS) "i");\
163 MODULE_PARM_DESC(N, D);
164#endif
165
166#define RX_DESC_MIN0 16
167#define RX_DESC_MAX0 128
168#define RX_DESC_DEF0 64
169DEVICE_PARAM(RxDescriptors0,"Number of receive usb desc buffer");
170
171
172#define TX_DESC_MIN0 16
173#define TX_DESC_MAX0 128
174#define TX_DESC_DEF0 64
175DEVICE_PARAM(TxDescriptors0,"Number of transmit usb desc buffer");
176
177
178#define CHANNEL_MIN 1
179#define CHANNEL_MAX 14
180#define CHANNEL_DEF 6
181
182DEVICE_PARAM(Channel, "Channel number");
183
184
185/* PreambleType[] is the preamble length used for transmit.
186 0: indicate allows long preamble type
187 1: indicate allows short preamble type
188*/
189
190#define PREAMBLE_TYPE_DEF 1
191
192DEVICE_PARAM(PreambleType, "Preamble Type");
193
194
195#define RTS_THRESH_MIN 512
196#define RTS_THRESH_MAX 2347
197#define RTS_THRESH_DEF 2347
198
199DEVICE_PARAM(RTSThreshold, "RTS threshold");
200
201
202#define FRAG_THRESH_MIN 256
203#define FRAG_THRESH_MAX 2346
204#define FRAG_THRESH_DEF 2346
205
206DEVICE_PARAM(FragThreshold, "Fragmentation threshold");
207
208
209#define DATA_RATE_MIN 0
210#define DATA_RATE_MAX 13
211#define DATA_RATE_DEF 13
212/* datarate[] index
213 0: indicate 1 Mbps 0x02
214 1: indicate 2 Mbps 0x04
215 2: indicate 5.5 Mbps 0x0B
216 3: indicate 11 Mbps 0x16
217 4: indicate 6 Mbps 0x0c
218 5: indicate 9 Mbps 0x12
219 6: indicate 12 Mbps 0x18
220 7: indicate 18 Mbps 0x24
221 8: indicate 24 Mbps 0x30
222 9: indicate 36 Mbps 0x48
223 10: indicate 48 Mbps 0x60
224 11: indicate 54 Mbps 0x6c
225 12: indicate 72 Mbps 0x90
226 13: indicate auto rate
227*/
228
229DEVICE_PARAM(ConnectionRate, "Connection data rate");
230
231#define OP_MODE_MAX 2
232#define OP_MODE_DEF 0
233#define OP_MODE_MIN 0
234
235DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode ");
236
237/* OpMode[] is used for transmit.
238 0: indicate infrastruct mode used
239 1: indicate adhoc mode used
240 2: indicate AP mode used
241*/
242
243
244/* PSMode[]
245 0: indicate disable power saving mode
246 1: indicate enable power saving mode
247*/
248
249#define PS_MODE_DEF 0
250
251DEVICE_PARAM(PSMode, "Power saving mode");
252
253
254#define SHORT_RETRY_MIN 0
255#define SHORT_RETRY_MAX 31
256#define SHORT_RETRY_DEF 8
257
258
259DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");
260
261#define LONG_RETRY_MIN 0
262#define LONG_RETRY_MAX 15
263#define LONG_RETRY_DEF 4
264
265
266DEVICE_PARAM(LongRetryLimit, "long frame retry limits");
267
268
269/* BasebandType[] baseband type selected
270 0: indicate 802.11a type
271 1: indicate 802.11b type
272 2: indicate 802.11g type
273*/
274#define BBP_TYPE_MIN 0
275#define BBP_TYPE_MAX 2
276#define BBP_TYPE_DEF 2
277
278DEVICE_PARAM(BasebandType, "baseband type");
279
280
281
282/* 80211hEnable[]
283 0: indicate disable 802.11h
284 1: indicate enable 802.11h
285*/
286
287#define X80211h_MODE_DEF 0
288
289DEVICE_PARAM(b80211hEnable, "802.11h mode");
290
291
292//
293// Static vars definitions
294//
295
296
297
298static struct usb_device_id vntwusb_table[] = {
299 {USB_DEVICE(VNT_USB_VENDOR_ID, VNT_USB_PRODUCT_ID)},
300 {}
301};
302
303
304
305#ifdef WIRELESS_EXT
306// Frequency list (map channels to frequencies)
307/*
308static const long frequency_list[] = {
309 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 2484,
310 4915, 4920, 4925, 4935, 4940, 4945, 4960, 4980,
311 5035, 5040, 5045, 5055, 5060, 5080, 5170, 5180, 5190, 5200, 5210, 5220, 5230, 5240,
312 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640, 5660, 5680,
313 5700, 5745, 5765, 5785, 5805, 5825
314 };
315
316
317#ifndef IW_ENCODE_NOKEY
318#define IW_ENCODE_NOKEY 0x0800
319#define IW_ENCODE_MODE (IW_ENCODE_DISABLED | IW_ENCODE_RESTRICTED | IW_ENCODE_OPEN)
320#endif
321
322#if WIRELESS_EXT > 12
323static const struct iw_handler_def iwctl_handler_def;
324#else
325struct iw_request_info {};
326#endif //WIRELESS_EXT > 12
327*/
328
329#endif /* WIRELESS_EXT */
330
331
332
333/*--------------------- Static Functions --------------------------*/
334#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
335
336static int vntwusb_found1(struct usb_interface *intf, const struct usb_device_id *id);
337static void vntwusb_disconnect(struct usb_interface *intf);
338#ifdef CONFIG_PM /* Minimal support for suspend and resume */
339static int vntwusb_suspend(struct usb_interface *intf, pm_message_t message);
340static int vntwusb_resume(struct usb_interface *intf);
341#endif
342#else
343
344static void* vntwusb_found1(struct usb_device *udev, UINT interface, const struct usb_device_id *id);
345static void vntwusb_disconnect(struct usb_device *udev, void *ptr);
346#endif
347static struct net_device_stats *device_get_stats(struct net_device *dev);
348static int device_open(struct net_device *dev);
349static int device_xmit(struct sk_buff *skb, struct net_device *dev);
350static void device_set_multi(struct net_device *dev);
351static int device_close(struct net_device *dev);
352static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
353
354static BOOL device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType);
355static BOOL device_init_defrag_cb(PSDevice pDevice);
356static void device_init_diversity_timer(PSDevice pDevice);
357static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev);
358
359static int ethtool_ioctl(struct net_device *dev, void *useraddr);
360static void device_free_tx_bufs(PSDevice pDevice);
361static void device_free_rx_bufs(PSDevice pDevice);
362static void device_free_int_bufs(PSDevice pDevice);
363static void device_free_frag_bufs(PSDevice pDevice);
364static BOOL device_alloc_bufs(PSDevice pDevice);
365
366static int Read_config_file(PSDevice pDevice);
367static UCHAR *Config_FileOperation(PSDevice pDevice);
368static int Config_FileGetParameter(UCHAR *string, UCHAR *dest,UCHAR *source);
369
370//2008-0714<Add>by Mike Liu
371static BOOL device_release_WPADEV(PSDevice pDevice);
372
373//2007-1107-01<Add>by MikeLiu
374#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
375static void usb_device_reset(PSDevice pDevice);
376#endif
377
378
379
380/*--------------------- Export Variables --------------------------*/
381
382/*--------------------- Export Functions --------------------------*/
383
384
385static void
386device_set_options(PSDevice pDevice) {
387
388 BYTE abyBroadcastAddr[U_ETHER_ADDR_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
389 BYTE abySNAP_RFC1042[U_ETHER_ADDR_LEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
390 BYTE abySNAP_Bridgetunnel[U_ETHER_ADDR_LEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
391
392
393 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, U_ETHER_ADDR_LEN);
394 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, U_ETHER_ADDR_LEN);
395 memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, U_ETHER_ADDR_LEN);
396
397 pDevice->cbTD = TX_DESC_DEF0;
398 pDevice->cbRD = RX_DESC_DEF0;
399 pDevice->uChannel = CHANNEL_DEF;
400 pDevice->wRTSThreshold = RTS_THRESH_DEF;
401 pDevice->wFragmentationThreshold = FRAG_THRESH_DEF;
402 pDevice->byShortRetryLimit = SHORT_RETRY_DEF;
403 pDevice->byLongRetryLimit = LONG_RETRY_DEF;
404 pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME;
405 pDevice->byShortPreamble = PREAMBLE_TYPE_DEF;
406 pDevice->ePSMode = PS_MODE_DEF;
407 pDevice->b11hEnable = X80211h_MODE_DEF;
408 pDevice->eOPMode = OP_MODE_DEF;
409 pDevice->uConnectionRate = DATA_RATE_DEF;
410 if (pDevice->uConnectionRate < RATE_AUTO) pDevice->bFixRate = TRUE;
411 pDevice->byBBType = BBP_TYPE_DEF;
412 pDevice->byPacketType = pDevice->byBBType;
413 pDevice->byAutoFBCtrl = AUTO_FB_0;
414 pDevice->bUpdateBBVGA = TRUE;
415 pDevice->byFOETuning = 0;
416 pDevice->byAutoPwrTunning = 0;
417 pDevice->wCTSDuration = 0;
418 pDevice->byPreambleType = 0;
419 pDevice->bExistSWNetAddr = FALSE;
420// pDevice->bDiversityRegCtlON = TRUE;
421 pDevice->bDiversityRegCtlON = FALSE;
422}
423
424
425static VOID device_init_diversity_timer(PSDevice pDevice) {
426
427 init_timer(&pDevice->TimerSQ3Tmax1);
428 pDevice->TimerSQ3Tmax1.data = (ULONG)pDevice;
429 pDevice->TimerSQ3Tmax1.function = (TimerFunction)TimerSQ3CallBack;
430 pDevice->TimerSQ3Tmax1.expires = RUN_AT(HZ);
431
432 init_timer(&pDevice->TimerSQ3Tmax2);
433 pDevice->TimerSQ3Tmax2.data = (ULONG)pDevice;
434 pDevice->TimerSQ3Tmax2.function = (TimerFunction)TimerSQ3CallBack;
435 pDevice->TimerSQ3Tmax2.expires = RUN_AT(HZ);
436
437 init_timer(&pDevice->TimerSQ3Tmax3);
438 pDevice->TimerSQ3Tmax3.data = (ULONG)pDevice;
439 pDevice->TimerSQ3Tmax3.function = (TimerFunction)TimerSQ3Tmax3CallBack;
440 pDevice->TimerSQ3Tmax3.expires = RUN_AT(HZ);
441
442 return;
443}
444
445
446//
447// Initialiation of MAC & BBP registers
448//
449
450static BOOL device_init_registers(PSDevice pDevice, DEVICE_INIT_TYPE InitType)
451{
452 BYTE abyBroadcastAddr[U_ETHER_ADDR_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
453 BYTE abySNAP_RFC1042[U_ETHER_ADDR_LEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
454 BYTE abySNAP_Bridgetunnel[U_ETHER_ADDR_LEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
455 BYTE byAntenna;
456 UINT ii;
457 CMD_CARD_INIT sInitCmd;
458 NTSTATUS ntStatus = STATUS_SUCCESS;
459 RSP_CARD_INIT sInitRsp;
460 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
461 BYTE byTmp;
462 BYTE byCalibTXIQ = 0;
463 BYTE byCalibTXDC = 0;
464 BYTE byCalibRXIQ = 0;
465
466 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "---->INIbInitAdapter. [%d][%d]\n", InitType, pDevice->byPacketType);
467 spin_lock_irq(&pDevice->lock);
468 if (InitType == DEVICE_INIT_COLD) {
469 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, U_ETHER_ADDR_LEN);
470 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, U_ETHER_ADDR_LEN);
471 memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, U_ETHER_ADDR_LEN);
472
473 if ( !FIRMWAREbCheckVersion(pDevice) ) {
474 if (FIRMWAREbDownload(pDevice) == TRUE) {
475 if (FIRMWAREbBrach2Sram(pDevice) == FALSE) {
476 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbBrach2Sram fail \n");
477 spin_unlock_irq(&pDevice->lock);
478 return FALSE;
479 }
480 } else {
481
482 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbDownload fail \n");
483 spin_unlock_irq(&pDevice->lock);
484 return FALSE;
485 }
486 }
487
488 if ( !BBbVT3184Init(pDevice) ) {
489 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" BBbVT3184Init fail \n");
490 spin_unlock_irq(&pDevice->lock);
491 return FALSE;
492 }
493 }
494
495 sInitCmd.byInitClass = (BYTE)InitType;
496 sInitCmd.bExistSWNetAddr = (BYTE) pDevice->bExistSWNetAddr;
497 for(ii=0;ii<6;ii++)
498 sInitCmd.bySWNetAddr[ii] = pDevice->abyCurrentNetAddr[ii];
499 sInitCmd.byShortRetryLimit = pDevice->byShortRetryLimit;
500 sInitCmd.byLongRetryLimit = pDevice->byLongRetryLimit;
501
502 //issue Card_init command to device
503 ntStatus = CONTROLnsRequestOut(pDevice,
504 MESSAGE_TYPE_CARDINIT,
505 0,
506 0,
507 sizeof(CMD_CARD_INIT),
508 (PBYTE) &(sInitCmd));
509
510 if ( ntStatus != STATUS_SUCCESS ) {
511 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Issue Card init fail \n");
512 spin_unlock_irq(&pDevice->lock);
513 return FALSE;
514 }
515 if (InitType == DEVICE_INIT_COLD) {
516
517 ntStatus = CONTROLnsRequestIn(pDevice,MESSAGE_TYPE_INIT_RSP,0,0,sizeof(RSP_CARD_INIT), (PBYTE) &(sInitRsp));
518
519 if (ntStatus != STATUS_SUCCESS) {
520 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Cardinit request in status fail!\n");
521 spin_unlock_irq(&pDevice->lock);
522 return FALSE;
523 }
524
525 //Local ID for AES functions
526 ntStatus = CONTROLnsRequestIn(pDevice,
527 MESSAGE_TYPE_READ,
528 MAC_REG_LOCALID,
529 MESSAGE_REQUEST_MACREG,
530 1,
531 &pDevice->byLocalID);
532
533 if ( ntStatus != STATUS_SUCCESS ) {
534 spin_unlock_irq(&pDevice->lock);
535 return FALSE;
536 }
537
538 // Do MACbSoftwareReset in MACvInitialize
539 // force CCK
540 pDevice->bCCK = TRUE;
541 pDevice->bProtectMode = FALSE; //Only used in 11g type, sync with ERP IE
542 pDevice->bNonERPPresent = FALSE;
543 pDevice->bBarkerPreambleMd = FALSE;
544 if ( pDevice->bFixRate ) {
545 pDevice->wCurrentRate = (WORD) pDevice->uConnectionRate;
546 } else {
547 if ( pDevice->byBBType == BB_TYPE_11B )
548 pDevice->wCurrentRate = RATE_11M;
549 else
550 pDevice->wCurrentRate = RATE_54M;
551 }
552
553 CHvInitChannelTable(pDevice);
554
555 pDevice->byTopOFDMBasicRate = RATE_24M;
556 pDevice->byTopCCKBasicRate = RATE_1M;
557 pDevice->byRevId = 0; //Target to IF pin while programming to RF chip.
558 pDevice->byCurPwr = 0xFF;
559
560 pDevice->byCCKPwr = pDevice->abyEEPROM[EEP_OFS_PWR_CCK];
561 pDevice->byOFDMPwrG = pDevice->abyEEPROM[EEP_OFS_PWR_OFDMG];
562 // Load power Table
563 for (ii=0;ii<14;ii++) {
564 pDevice->abyCCKPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_CCK_PWR_TBL];
565 if (pDevice->abyCCKPwrTbl[ii] == 0)
566 pDevice->abyCCKPwrTbl[ii] = pDevice->byCCKPwr;
567 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_OFDM_PWR_TBL];
568 if (pDevice->abyOFDMPwrTbl[ii] == 0)
569 pDevice->abyOFDMPwrTbl[ii] = pDevice->byOFDMPwrG;
570 }
571
572 //original zonetype is USA,but customize zonetype is europe,
573 // then need recover 12,13 ,14 channel with 11 channel
574 if(((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) ||
575 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe))&&
576 (pDevice->byOriginalZonetype == ZoneType_USA)) {
577 for(ii=11;ii<14;ii++) {
578 pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
579 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];
580 }
581 }
582
583 //{{ RobertYu: 20041124
584 pDevice->byOFDMPwrA = 0x34; // same as RFbMA2829SelectChannel
585 // Load OFDM A Power Table
586 for (ii=0;ii<CB_MAX_CHANNEL_5G;ii++) { //RobertYu:20041224, bug using CB_MAX_CHANNEL
587 pDevice->abyOFDMAPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_OFDMA_PWR_TBL];
588 if (pDevice->abyOFDMAPwrTbl[ii] == 0)
589 pDevice->abyOFDMAPwrTbl[ii] = pDevice->byOFDMPwrA;
590 }
591 //}} RobertYu
592
593 byAntenna = pDevice->abyEEPROM[EEP_OFS_ANTENNA];
594 if (byAntenna & EEP_ANTINV)
595 pDevice->bTxRxAntInv = TRUE;
596 else
597 pDevice->bTxRxAntInv = FALSE;
598
599 byAntenna &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
600
601 if (byAntenna == 0) // if not set default is All
602 byAntenna = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
603
604 if (byAntenna == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
605 pDevice->byAntennaCount = 2;
606 pDevice->byTxAntennaMode = ANT_B;
607 pDevice->dwTxAntennaSel = 1;
608 pDevice->dwRxAntennaSel = 1;
609 if (pDevice->bTxRxAntInv == TRUE)
610 pDevice->byRxAntennaMode = ANT_A;
611 else
612 pDevice->byRxAntennaMode = ANT_B;
613
614 if (pDevice->bDiversityRegCtlON)
615 pDevice->bDiversityEnable = TRUE;
616 else
617 pDevice->bDiversityEnable = FALSE;
618 } else {
619 pDevice->bDiversityEnable = FALSE;
620 pDevice->byAntennaCount = 1;
621 pDevice->dwTxAntennaSel = 0;
622 pDevice->dwRxAntennaSel = 0;
623 if (byAntenna & EEP_ANTENNA_AUX) {
624 pDevice->byTxAntennaMode = ANT_A;
625 if (pDevice->bTxRxAntInv == TRUE)
626 pDevice->byRxAntennaMode = ANT_B;
627 else
628 pDevice->byRxAntennaMode = ANT_A;
629 } else {
630 pDevice->byTxAntennaMode = ANT_B;
631 if (pDevice->bTxRxAntInv == TRUE)
632 pDevice->byRxAntennaMode = ANT_A;
633 else
634 pDevice->byRxAntennaMode = ANT_B;
635 }
636 }
637 pDevice->ulDiversityNValue = 100*255;
638 pDevice->ulDiversityMValue = 100*16;
639 pDevice->byTMax = 1;
640 pDevice->byTMax2 = 4;
641 pDevice->ulSQ3TH = 0;
642 pDevice->byTMax3 = 64;
643 // -----------------------------------------------------------------
644
645 //Get Auto Fall Back Type
646 pDevice->byAutoFBCtrl = AUTO_FB_0;
647
648 // Set SCAN Time
649 pDevice->uScanTime = WLAN_SCAN_MINITIME;
650
651 // default Auto Mode
652 //pDevice->NetworkType = Ndis802_11Automode;
653 pDevice->eConfigPHYMode = PHY_TYPE_AUTO;
654 pDevice->byBBType = BB_TYPE_11G;
655
656 // initialize BBP registers
657 pDevice->ulTxPower = 25;
658
659 // Get Channel range
660 pDevice->byMinChannel = 1;
661 pDevice->byMaxChannel = CB_MAX_CHANNEL;
662
663 // Get RFType
664 pDevice->byRFType = sInitRsp.byRFType;
665
666 if ((pDevice->byRFType & RF_EMU) != 0) {
667 // force change RevID for VT3253 emu
668 pDevice->byRevId = 0x80;
669 }
670
671 // Load EEPROM calibrated vt3266 parameters
672 if (pDevice->byRFType == RF_VT3226D0) {
673 if((pDevice->abyEEPROM[EEP_OFS_MAJOR_VER] == 0x1) &&
674 (pDevice->abyEEPROM[EEP_OFS_MINOR_VER] >= 0x4)) {
675 byCalibTXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_IQ];
676 byCalibTXDC = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_DC];
677 byCalibRXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_RX_IQ];
678 if( (byCalibTXIQ || byCalibTXDC || byCalibRXIQ) ) {
679 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFF, 0x03); // CR255, Set BB to support TX/RX IQ and DC compensation Mode
680 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFB, byCalibTXIQ); // CR251, TX I/Q Imbalance Calibration
681 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFC, byCalibTXDC); // CR252, TX DC-Offset Calibration
682 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFD, byCalibRXIQ); // CR253, RX I/Q Imbalance Calibration
683 } else {
684 // turn off BB Calibration compensation
685 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xFF, 0x0); // CR255
686 }
687 }
688 }
689 pMgmt->eScanType = WMAC_SCAN_PASSIVE;
690 pMgmt->uCurrChannel = pDevice->uChannel;
691 pMgmt->uIBSSChannel = pDevice->uChannel;
692 CARDbSetMediaChannel(pDevice, pMgmt->uCurrChannel);
693
694 // get Permanent network address
695 MEMvCopy(pDevice->abyPermanentNetAddr,&(sInitRsp.byNetAddr[0]),6)
696 MEMvCopy(pDevice->abyCurrentNetAddr, pDevice->abyPermanentNetAddr, U_ETHER_ADDR_LEN);
697
698 // if exist SW network address, use SW network address.
699
700 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Network address = %02x-%02x-%02x=%02x-%02x-%02x\n",
701 pDevice->abyCurrentNetAddr[0],
702 pDevice->abyCurrentNetAddr[1],
703 pDevice->abyCurrentNetAddr[2],
704 pDevice->abyCurrentNetAddr[3],
705 pDevice->abyCurrentNetAddr[4],
706 pDevice->abyCurrentNetAddr[5]);
707 }
708
709
710
711 // Set BB and packet type at the same time.
712 // Set Short Slot Time, xIFS, and RSPINF.
713 if (pDevice->byBBType == BB_TYPE_11A) {
714 CARDbAddBasicRate(pDevice, RATE_6M);
715 pDevice->bShortSlotTime = TRUE;
716 } else {
717 CARDbAddBasicRate(pDevice, RATE_1M);
718 pDevice->bShortSlotTime = FALSE;
719 }
720 BBvSetShortSlotTime(pDevice);
721 CARDvSetBSSMode(pDevice);
722
723 if (pDevice->bUpdateBBVGA) {
724 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
725 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
726 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
727 }
728
729 pDevice->byRadioCtl = pDevice->abyEEPROM[EEP_OFS_RADIOCTL];
730 pDevice->bHWRadioOff = FALSE;
731 if ( (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) != 0 ) {
732 ntStatus = CONTROLnsRequestIn(pDevice,
733 MESSAGE_TYPE_READ,
734 MAC_REG_GPIOCTL1,
735 MESSAGE_REQUEST_MACREG,
736 1,
737 &byTmp);
738
739 if ( ntStatus != STATUS_SUCCESS ) {
740 spin_unlock_irq(&pDevice->lock);
741 return FALSE;
742 }
743 if ( (byTmp & GPIO3_DATA) == 0 ) {
744 pDevice->bHWRadioOff = TRUE;
745 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
746 } else {
747 MACvRegBitsOff(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
748 pDevice->bHWRadioOff = FALSE;
749 }
750
751 } //EEP_RADIOCTL_ENABLE
752
753 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_TMLEN,0x38);
754 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
755 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL0,0x01);
756
757 if ((pDevice->bHWRadioOff == TRUE) || (pDevice->bRadioControlOff == TRUE)) {
758 CARDbRadioPowerOff(pDevice);
759 } else {
760 CARDbRadioPowerOn(pDevice);
761 }
762
763 spin_unlock_irq(&pDevice->lock);
764 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"<----INIbInitAdapter Exit\n");
765 return TRUE;
766}
767
768static BOOL device_release_WPADEV(PSDevice pDevice)
769{
770 viawget_wpa_header *wpahdr;
771 int ii=0;
772 // wait_queue_head_t Set_wait;
773 //send device close to wpa_supplicnat layer
774 if (pDevice->bWPADEVUp==TRUE) {
775 wpahdr = (viawget_wpa_header *)pDevice->skb->data;
776 wpahdr->type = VIAWGET_DEVICECLOSE_MSG;
777 wpahdr->resp_ie_len = 0;
778 wpahdr->req_ie_len = 0;
779 skb_put(pDevice->skb, sizeof(viawget_wpa_header));
780 pDevice->skb->dev = pDevice->wpadev;
781//2008-4-3 modify by Chester for wpa
782#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
783 pDevice->skb->mac_header = pDevice->skb->data;
784#else
785 pDevice->skb->mac.raw = pDevice->skb->data;
786#endif
787 pDevice->skb->pkt_type = PACKET_HOST;
788 pDevice->skb->protocol = htons(ETH_P_802_2);
789 memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
790 netif_rx(pDevice->skb);
791 pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
792
793 //wait release WPADEV
794 // init_waitqueue_head(&Set_wait);
795 // wait_event_timeout(Set_wait, ((pDevice->wpadev==NULL)&&(pDevice->skb == NULL)),5*HZ); //1s wait
796 while(pDevice->bWPADEVUp==TRUE) {
797 set_current_state(TASK_UNINTERRUPTIBLE);
798 schedule_timeout (HZ/20); //wait 50ms
799 ii++;
800 if(ii>20)
801 break;
802 }
803 };
804 return TRUE;
805}
806
807#ifdef CONFIG_PM /* Minimal support for suspend and resume */
808static int vntwusb_suspend(struct usb_interface *intf, pm_message_t message)
809{
810 PSDevice pDevice = usb_get_intfdata(intf);
811 struct net_device *dev = pDevice->dev;
812
813 printk("VNTWUSB Suspend Start======>\n");
814if(dev != NULL) {
815 if(pDevice->flags & DEVICE_FLAGS_OPENED)
816 device_close(dev);
817}
818
819 usb_put_dev(interface_to_usbdev(intf));
820 return 0;
821}
822
823static int vntwusb_resume(struct usb_interface *intf)
824{
825 PSDevice pDevice = usb_get_intfdata(intf);
826 struct net_device *dev = pDevice->dev;
827
828 printk("VNTWUSB Resume Start======>\n");
829 if(dev != NULL) {
830 usb_get_dev(interface_to_usbdev(intf));
831 if(!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
832 if(device_open(dev)!=0)
833 printk("VNTWUSB Resume Start======>open fail\n");
834 }
835 }
836 return 0;
837}
838#endif
839
840#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
841
842static int
843vntwusb_found1(struct usb_interface *intf, const struct usb_device_id *id)
844#else
845
846static void *
847vntwusb_found1(struct usb_device *udev, UINT interface, const struct usb_device_id *id)
848#endif
849{
850#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
851 BYTE fake_mac[U_ETHER_ADDR_LEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01};//fake MAC address
852#endif
853#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
854 struct usb_device *udev = interface_to_usbdev(intf);
855 int rc = 0;
856#endif
857 struct net_device *netdev = NULL;
858 PSDevice pDevice = NULL;
859
860
861 printk(KERN_NOTICE "%s Ver. %s\n",DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
862 printk(KERN_NOTICE "Copyright (c) 2004 VIA Networking Technologies, Inc.\n");
863
864//2008-0922-01<Add>by MikeLiu, add usb counter.
865#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
866 udev = usb_get_dev(udev);
867#endif
868
Forest Bond92b96792009-06-13 07:38:31 -0400869#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
Forest Bond1e28efa2009-06-13 07:38:50 -0400870 netdev = alloc_etherdev(sizeof(DEVICE_INFO));
Forest Bond92b96792009-06-13 07:38:31 -0400871#else
872 netdev = init_etherdev(netdev, 0);
873#endif
874
875 if (netdev == NULL) {
876 printk(KERN_ERR DEVICE_NAME ": allocate net device failed \n");
877 kfree(pDevice);
878 goto err_nomem;
879 }
Forest Bond1e28efa2009-06-13 07:38:50 -0400880
881 pDevice = netdev_priv(netdev);
882 memset(pDevice, 0, sizeof(DEVICE_INFO));
883
Forest Bond92b96792009-06-13 07:38:31 -0400884 pDevice->dev = netdev;
885 pDevice->usb = udev;
886
887 // Chain it all together
888#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
889 SET_MODULE_OWNER(netdev);
890#endif
891
892 // Set initial settings
893 device_set_options(pDevice);
894 spin_lock_init(&pDevice->lock);
895
896 pDevice->tx_80211 = device_dma0_tx_80211;
897 pDevice->sMgmtObj.pAdapter = (PVOID)pDevice;
898
Forest Bond92b96792009-06-13 07:38:31 -0400899 netdev->open = device_open;
900 netdev->hard_start_xmit = device_xmit;
901 netdev->stop = device_close;
902 netdev->get_stats = device_get_stats;
903 netdev->set_multicast_list = device_set_multi;
904 netdev->do_ioctl = device_ioctl;
905#ifdef WIRELESS_EXT
906
907//2007-0508-01<Add>by MikeLiu
908 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
909 netdev->get_wireless_stats = iwctl_get_wireless_stats;
910 #endif
911
912#if WIRELESS_EXT > 12
913 netdev->wireless_handlers = (struct iw_handler_def *)&iwctl_handler_def;
914// netdev->wireless_handlers = NULL;
915#endif /* WIRELESS_EXT > 12 */
916#endif /* WIRELESS_EXT */
917
918#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
919
920 //2008-0623-01<Remark>by MikeLiu
921 //2007-0821-01<Add>by MikeLiu
922 // #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
923 usb_set_intfdata(intf, pDevice);
924 SET_NETDEV_DEV(netdev, &intf->dev);
925 //#endif
926 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
927 memcpy(pDevice->dev->dev_addr, fake_mac, U_ETHER_ADDR_LEN); //use fake mac address
928 #endif
929 rc = register_netdev(netdev);
930 if (rc != 0) {
931 printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
932 free_netdev(netdev);
933 kfree(pDevice);
934 return -ENODEV;
935 }
936 //2008-0623-02<Remark>by MikeLiu
937 //2007-0821-01<Add>by MikeLiu
938 //#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)
939 //usb_set_intfdata(intf, pDevice);
940 //SET_NETDEV_DEV(netdev, &intf->dev);
941 //#endif
942
943//2008-07-21-01<Add>by MikeLiu
944//register wpadev
945 if(wpa_set_wpadev(pDevice, 1)!=0) {
946 printk("Fail to Register WPADEV?\n");
947 unregister_netdev(pDevice->dev);
948 free_netdev(netdev);
949 kfree(pDevice);
950 }
951
952//2007-1107-03<Add>by MikeLiu
953 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
954 usb_device_reset(pDevice);
955 #endif
956
957#ifdef SndEvt_ToAPI
958{
959 union iwreq_data wrqu;
960 memset(&wrqu, 0, sizeof(wrqu));
961 wrqu.data.flags = RT_INSMOD_EVENT_FLAG;
962 wrqu.data.length =IFNAMSIZ;
963 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, pDevice->dev->name);
964}
965#endif
966
967 return 0;
968#else
969 return pDevice;
970#endif
971
972
973err_nomem:
974#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
975
976 //2008-0922-01<Add>by MikeLiu, decrease usb counter.
977 usb_put_dev(udev);
978
979 return -ENOMEM;
980#else
981 return NULL;
982#endif
983}
984
985
986static VOID device_free_tx_bufs(PSDevice pDevice) {
987 PUSB_SEND_CONTEXT pTxContext;
988 int ii;
989
990 for (ii = 0; ii < pDevice->cbTD; ii++) {
991
992 pTxContext = pDevice->apTD[ii];
993 //de-allocate URBs
994 if (pTxContext->pUrb) {
995 vntwusb_unlink_urb(pTxContext->pUrb);
996 usb_free_urb(pTxContext->pUrb);
997 }
998 if (pTxContext)
999 kfree(pTxContext);
1000 }
1001 return;
1002}
1003
1004
1005static VOID device_free_rx_bufs(PSDevice pDevice) {
1006 PRCB pRCB;
1007 int ii;
1008
1009 for (ii = 0; ii < pDevice->cbRD; ii++) {
1010
1011 pRCB = pDevice->apRCB[ii];
1012 //de-allocate URBs
1013 if (pRCB->pUrb) {
1014 vntwusb_unlink_urb(pRCB->pUrb);
1015 usb_free_urb(pRCB->pUrb);
1016 }
1017 //de-allocate skb
1018 if (pRCB->skb)
1019 dev_kfree_skb(pRCB->skb);
1020 }
1021 if (pDevice->pRCBMem)
1022 kfree(pDevice->pRCBMem);
1023
1024 return;
1025}
1026
1027//2007-1107-02<Add>by MikeLiu
1028#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
1029static void usb_device_reset(PSDevice pDevice)
1030{
1031 int status;
1032 status = usb_reset_device(pDevice->usb);
1033 if (status)
1034 printk("usb_device_reset fail status=%d\n",status);
1035 return ;
1036}
1037#endif
1038
1039static VOID device_free_int_bufs(PSDevice pDevice) {
1040
1041 if (pDevice->intBuf.pDataBuf != NULL)
1042 kfree(pDevice->intBuf.pDataBuf);
1043 return;
1044}
1045
1046
1047static BOOL device_alloc_bufs(PSDevice pDevice) {
1048
1049 PUSB_SEND_CONTEXT pTxContext;
1050 PRCB pRCB;
1051 int ii;
1052
1053
1054 for (ii = 0; ii < pDevice->cbTD; ii++) {
1055
1056 pTxContext = kmalloc(sizeof(USB_SEND_CONTEXT), GFP_KERNEL);
1057 if (pTxContext == NULL) {
1058 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate tx usb context failed\n", pDevice->dev->name);
1059 goto free_tx;
1060 }
1061 pDevice->apTD[ii] = pTxContext;
1062 pTxContext->pDevice = (PVOID) pDevice;
1063 //allocate URBs
1064 pTxContext->pUrb = vntwusb_alloc_urb(0);;
1065 if (pTxContext->pUrb == NULL) {
1066 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "alloc tx urb failed\n");
1067 goto free_tx;
1068 }
1069 pTxContext->bBoolInUse = FALSE;
1070 }
1071
1072 // allocate rcb mem
1073 pDevice->pRCBMem = kmalloc((sizeof(RCB) * pDevice->cbRD), GFP_KERNEL);
1074 if (pDevice->pRCBMem == NULL) {
1075 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : alloc rx usb context failed\n", pDevice->dev->name);
1076 goto free_tx;
1077 }
1078
1079
1080 pDevice->FirstRecvFreeList = NULL;
1081 pDevice->LastRecvFreeList = NULL;
1082 pDevice->FirstRecvMngList = NULL;
1083 pDevice->LastRecvMngList = NULL;
1084 pDevice->NumRecvFreeList = 0;
1085 memset(pDevice->pRCBMem, 0, (sizeof(RCB) * pDevice->cbRD));
1086 pRCB = (PRCB) pDevice->pRCBMem;
1087
1088 for (ii = 0; ii < pDevice->cbRD; ii++) {
1089
1090 pDevice->apRCB[ii] = pRCB;
1091 pRCB->pDevice = (PVOID) pDevice;
1092 //allocate URBs
1093 pRCB->pUrb = vntwusb_alloc_urb(0);
1094
1095 if (pRCB->pUrb == NULL) {
1096 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx urb\n");
1097 goto free_rx_tx;
1098 }
1099 pRCB->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1100 if (pRCB->skb == NULL) {
1101 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx skb\n");
1102 goto free_rx_tx;
1103 }
1104 pRCB->skb->dev = pDevice->dev;
1105 pRCB->bBoolInUse = FALSE;
1106 EnqueueRCB(pDevice->FirstRecvFreeList, pDevice->LastRecvFreeList, pRCB);
1107 pDevice->NumRecvFreeList++;
1108 pRCB++;
1109 }
1110
1111
1112 pDevice->pControlURB = vntwusb_alloc_urb(0);
1113 if (pDevice->pControlURB == NULL) {
1114 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc control urb\n");
1115 goto free_rx_tx;
1116 }
1117
1118 pDevice->pInterruptURB = vntwusb_alloc_urb(0);
1119 if (pDevice->pInterruptURB == NULL) {
1120 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int urb\n");
1121 vntwusb_unlink_urb(pDevice->pControlURB);
1122 usb_free_urb(pDevice->pControlURB);
1123 goto free_rx_tx;
1124 }
1125
1126 pDevice->intBuf.pDataBuf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL);
1127 if (pDevice->intBuf.pDataBuf == NULL) {
1128 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int buf\n");
1129 vntwusb_unlink_urb(pDevice->pControlURB);
1130 vntwusb_unlink_urb(pDevice->pInterruptURB);
1131 usb_free_urb(pDevice->pControlURB);
1132 usb_free_urb(pDevice->pInterruptURB);
1133 goto free_rx_tx;
1134 }
1135
1136 return TRUE;
1137
1138free_rx_tx:
1139 device_free_rx_bufs(pDevice);
1140
1141free_tx:
1142 device_free_tx_bufs(pDevice);
1143
1144 return FALSE;
1145}
1146
1147
1148
1149
1150static BOOL device_init_defrag_cb(PSDevice pDevice) {
1151 int i;
1152 PSDeFragControlBlock pDeF;
1153
1154 /* Init the fragment ctl entries */
1155 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1156 pDeF = &(pDevice->sRxDFCB[i]);
1157 if (!device_alloc_frag_buf(pDevice, pDeF)) {
1158 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
1159 pDevice->dev->name);
1160 goto free_frag;
1161 };
1162 }
1163 pDevice->cbDFCB = CB_MAX_RX_FRAG;
1164 pDevice->cbFreeDFCB = pDevice->cbDFCB;
1165 return TRUE;
1166
1167free_frag:
1168 device_free_frag_bufs(pDevice);
1169 return FALSE;
1170}
1171
1172
1173
1174static void device_free_frag_bufs(PSDevice pDevice) {
1175 PSDeFragControlBlock pDeF;
1176 int i;
1177
1178 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1179
1180 pDeF = &(pDevice->sRxDFCB[i]);
1181
1182 if (pDeF->skb)
1183 dev_kfree_skb(pDeF->skb);
1184 }
1185}
1186
1187
1188
1189BOOL device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {
1190
1191 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1192 if (pDeF->skb == NULL)
1193 return FALSE;
1194 ASSERT(pDeF->skb);
1195 pDeF->skb->dev = pDevice->dev;
1196
1197 return TRUE;
1198}
1199
1200
1201/*-----------------------------------------------------------------*/
1202
1203static int device_open(struct net_device *dev) {
Forest Bond1e28efa2009-06-13 07:38:50 -04001204 PSDevice pDevice=(PSDevice) netdev_priv(dev);
Forest Bond92b96792009-06-13 07:38:31 -04001205
1206#ifdef WPA_SM_Transtatus
1207 extern SWPAResult wpa_Result;
1208 memset(wpa_Result.ifname,0,sizeof(wpa_Result.ifname));
1209 wpa_Result.proto = 0;
1210 wpa_Result.key_mgmt = 0;
1211 wpa_Result.eap_type = 0;
1212 wpa_Result.authenticated = FALSE;
1213 pDevice->fWPA_Authened = FALSE;
1214#endif
1215
1216 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_open...\n");
1217
1218
1219 pDevice->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS;
1220
1221 if (device_alloc_bufs(pDevice) == FALSE) {
1222 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_alloc_bufs fail... \n");
1223 return -ENOMEM;
1224 }
1225
1226 if (device_init_defrag_cb(pDevice)== FALSE) {
1227 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Initial defragement cb fail \n");
1228 goto free_rx_tx;
1229 }
1230
1231 MP_CLEAR_FLAG(pDevice, fMP_DISCONNECTED);
1232 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
1233 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
1234 MP_SET_FLAG(pDevice, fMP_POST_READS);
1235 MP_SET_FLAG(pDevice, fMP_POST_WRITES);
1236
1237 //read config file
1238 Read_config_file(pDevice);
1239
1240 if (device_init_registers(pDevice, DEVICE_INIT_COLD) == FALSE) {
1241 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " init register fail\n");
1242 goto free_all;
1243 }
1244
1245 device_set_multi(pDevice->dev);
1246 // Init for Key Management
1247
1248 KeyvInitTable(pDevice,&pDevice->sKey);
1249 memcpy(pDevice->sMgmtObj.abyMACAddr, pDevice->abyCurrentNetAddr, U_ETHER_ADDR_LEN);
1250 memcpy(pDevice->dev->dev_addr, pDevice->abyCurrentNetAddr, U_ETHER_ADDR_LEN);
1251 pDevice->bStopTx0Pkt = FALSE;
1252 pDevice->bStopDataPkt = FALSE;
1253 pDevice->bRoaming = FALSE; //DavidWang
1254 pDevice->bIsRoaming = FALSE;//DavidWang
1255 pDevice->bEnableRoaming = FALSE;
1256 if (pDevice->bDiversityRegCtlON) {
1257 device_init_diversity_timer(pDevice);
1258 }
1259
1260 vMgrObjectInit(pDevice);
1261 tasklet_init(&pDevice->RxMngWorkItem, (void *)RXvMngWorkItem, (unsigned long)pDevice);
1262 tasklet_init(&pDevice->ReadWorkItem, (void *)RXvWorkItem, (unsigned long)pDevice);
1263 tasklet_init(&pDevice->EventWorkItem, (void *)INTvWorkItem, (unsigned long)pDevice);
1264 add_timer(&(pDevice->sMgmtObj.sTimerSecondCallback));
1265#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
1266 pDevice->int_interval = 100; //Max 100 microframes.
1267#else
1268 pDevice->int_interval = 0x10; //16 microframes interval(~2ms) for usb 2.0
1269#endif
1270 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1271
1272 pDevice->bIsRxWorkItemQueued = TRUE;
1273 pDevice->fKillEventPollingThread = FALSE;
1274 pDevice->bEventAvailable = FALSE;
1275
1276 pDevice->bWPADEVUp = FALSE;
1277#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1278 pDevice->bwextstep0 = FALSE;
1279 pDevice->bwextstep1 = FALSE;
1280 pDevice->bwextstep2 = FALSE;
1281 pDevice->bwextstep3 = FALSE;
1282 pDevice->bWPASuppWextEnabled = FALSE;
1283#endif
1284 pDevice->byReAssocCount = 0;
1285
1286 RXvWorkItem(pDevice);
1287 INTvWorkItem(pDevice);
1288
1289 // Patch: if WEP key already set by iwconfig but device not yet open
1290 if ((pDevice->bEncryptionEnable == TRUE) && (pDevice->bTransmitKey == TRUE)) {
1291 spin_lock_irq(&pDevice->lock);
1292 KeybSetDefaultKey( pDevice,
1293 &(pDevice->sKey),
1294 pDevice->byKeyIndex | (1 << 31),
1295 pDevice->uKeyLength,
1296 NULL,
1297 pDevice->abyKey,
1298 KEY_CTL_WEP
1299 );
1300 spin_unlock_irq(&pDevice->lock);
1301 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1302 }
1303
1304 if (pDevice->sMgmtObj.eConfigMode == WMAC_CONFIG_AP) {
1305 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RUN_AP, NULL);
1306 }
1307 else {
1308 //mike:mark@2008-11-10
1309 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1310 //bScheduleCommand((HANDLE)pDevice, WLAN_CMD_SSID, NULL);
1311 }
1312
1313
1314 netif_stop_queue(pDevice->dev);
1315 pDevice->flags |= DEVICE_FLAGS_OPENED;
1316
1317#ifdef SndEvt_ToAPI
1318{
1319 union iwreq_data wrqu;
1320 memset(&wrqu, 0, sizeof(wrqu));
1321 wrqu.data.flags = RT_UPDEV_EVENT_FLAG;
1322 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1323}
1324#endif
1325
1326 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
1327 return 0;
1328
1329free_all:
1330 device_free_frag_bufs(pDevice);
1331free_rx_tx:
1332 device_free_rx_bufs(pDevice);
1333 device_free_tx_bufs(pDevice);
1334 device_free_int_bufs(pDevice);
1335 vntwusb_unlink_urb(pDevice->pControlURB);
1336 vntwusb_unlink_urb(pDevice->pInterruptURB);
1337 usb_free_urb(pDevice->pControlURB);
1338 usb_free_urb(pDevice->pInterruptURB);
1339
1340 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open fail.. \n");
1341 return -ENOMEM;
1342}
1343
1344
1345
1346static int device_close(struct net_device *dev) {
Forest Bond1e28efa2009-06-13 07:38:50 -04001347 PSDevice pDevice=(PSDevice) netdev_priv(dev);
Forest Bond92b96792009-06-13 07:38:31 -04001348 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1349
1350 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
1351 int uu;
1352 #endif
1353
1354 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close1 \n");
1355 if (pDevice == NULL)
1356 return -ENODEV;
1357
1358#ifdef SndEvt_ToAPI
1359{
1360 union iwreq_data wrqu;
1361 memset(&wrqu, 0, sizeof(wrqu));
1362 wrqu.data.flags = RT_DOWNDEV_EVENT_FLAG;
1363 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1364}
1365#endif
1366
1367//2007-1121-02<Add>by EinsnLiu
1368 if (pDevice->bLinkPass) {
1369 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
1370 mdelay(30);
1371 }
1372//End Add
1373
1374//2008-0714-01<Add>by MikeLiu
1375device_release_WPADEV(pDevice);
1376
1377 //2007-0821-01<Add>by MikeLiu
1378 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
1379 memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
1380 pMgmt->bShareKeyAlgorithm = FALSE;
1381 pDevice->bEncryptionEnable = FALSE;
1382 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1383 spin_lock_irq(&pDevice->lock);
1384 for(uu=0;uu<MAX_KEY_TABLE;uu++)
1385 MACvDisableKeyEntry(pDevice,uu);
1386 spin_unlock_irq(&pDevice->lock);
1387 #endif
1388
1389 if ((pDevice->flags & DEVICE_FLAGS_UNPLUG) == FALSE) {
1390 MACbShutdown(pDevice);
1391 }
1392 netif_stop_queue(pDevice->dev);
1393 MP_SET_FLAG(pDevice, fMP_DISCONNECTED);
1394 MP_CLEAR_FLAG(pDevice, fMP_POST_WRITES);
1395 MP_CLEAR_FLAG(pDevice, fMP_POST_READS);
1396 pDevice->fKillEventPollingThread = TRUE;
1397 del_timer(&pDevice->sTimerCommand);
1398 del_timer(&pMgmt->sTimerSecondCallback);
1399
1400//2007-0115-02<Add>by MikeLiu
1401#ifdef TxInSleep
1402 del_timer(&pDevice->sTimerTxData);
1403#endif
1404
1405 if (pDevice->bDiversityRegCtlON) {
1406 del_timer(&pDevice->TimerSQ3Tmax1);
1407 del_timer(&pDevice->TimerSQ3Tmax2);
1408 del_timer(&pDevice->TimerSQ3Tmax3);
1409 }
1410 tasklet_kill(&pDevice->RxMngWorkItem);
1411 tasklet_kill(&pDevice->ReadWorkItem);
1412 tasklet_kill(&pDevice->EventWorkItem);
1413
1414 pDevice->bRoaming = FALSE; //DavidWang
1415 pDevice->bIsRoaming = FALSE;//DavidWang
1416 pDevice->bEnableRoaming = FALSE;
1417 pDevice->bCmdRunning = FALSE;
1418 pDevice->bLinkPass = FALSE;
1419 memset(pMgmt->abyCurrBSSID, 0, 6);
1420 pMgmt->eCurrState = WMAC_STATE_IDLE;
1421
1422 device_free_tx_bufs(pDevice);
1423 device_free_rx_bufs(pDevice);
1424 device_free_int_bufs(pDevice);
1425 device_free_frag_bufs(pDevice);
1426
1427 vntwusb_unlink_urb(pDevice->pControlURB);
1428 vntwusb_unlink_urb(pDevice->pInterruptURB);
1429 usb_free_urb(pDevice->pControlURB);
1430 usb_free_urb(pDevice->pInterruptURB);
1431
1432 BSSvClearNodeDBTable(pDevice, 0);
1433 pDevice->flags &=(~DEVICE_FLAGS_OPENED);
1434
1435 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n");
1436
1437 return 0;
1438}
1439
1440#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
1441
1442static void vntwusb_disconnect(struct usb_interface *intf)
1443
1444#else
1445
1446static void vntwusb_disconnect(struct usb_device *udev, void *ptr)
1447#endif
1448{
1449#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
1450
1451 PSDevice pDevice = usb_get_intfdata(intf);
1452#else
1453 PSDevice pDevice = (PSDevice)ptr;
1454#endif
1455
1456
1457 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_disconnect1.. \n");
1458 if (pDevice == NULL)
1459 return;
1460
1461#ifdef SndEvt_ToAPI
1462{
1463 union iwreq_data wrqu;
1464 memset(&wrqu, 0, sizeof(wrqu));
1465 wrqu.data.flags = RT_RMMOD_EVENT_FLAG;
1466 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1467}
1468#endif
1469
1470//2008-0714-01<Add>by MikeLiu
1471device_release_WPADEV(pDevice);
1472
1473#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
1474
1475 usb_set_intfdata(intf, NULL);
1476//2008-0922-01<Add>by MikeLiu, decrease usb counter.
1477 usb_put_dev(interface_to_usbdev(intf));
1478
1479#endif
1480
1481 pDevice->flags |= DEVICE_FLAGS_UNPLUG;
1482 if (pDevice->dev != NULL) {
1483 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "unregister_netdev..\n");
1484 unregister_netdev(pDevice->dev);
1485
1486//2008-07-21-01<Add>by MikeLiu
1487//unregister wpadev
1488 if(wpa_set_wpadev(pDevice, 0)!=0)
1489 printk("unregister wpadev fail?\n");
1490
1491#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
1492 free_netdev(pDevice->dev);
1493#else
1494 kfree(pDevice->dev);
1495#endif
1496 }
1497
1498 kfree(pDevice);
1499 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_disconnect3.. \n");
1500}
1501
1502
1503
1504
1505static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev) {
Forest Bond1e28efa2009-06-13 07:38:50 -04001506 PSDevice pDevice=netdev_priv(dev);
Forest Bond92b96792009-06-13 07:38:31 -04001507 PBYTE pbMPDU;
1508 UINT cbMPDULen = 0;
1509
1510
1511 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211\n");
1512 spin_lock_irq(&pDevice->lock);
1513
1514 if (pDevice->bStopTx0Pkt == TRUE) {
1515 dev_kfree_skb_irq(skb);
1516 spin_unlock_irq(&pDevice->lock);
1517 return 0;
1518 };
1519
1520
1521 cbMPDULen = skb->len;
1522 pbMPDU = skb->data;
1523
1524 vDMA0_tx_80211(pDevice, skb);
1525
1526 spin_unlock_irq(&pDevice->lock);
1527
1528 return 0;
1529
1530}
1531
1532
1533static int device_xmit(struct sk_buff *skb, struct net_device *dev) {
Forest Bond1e28efa2009-06-13 07:38:50 -04001534 PSDevice pDevice=netdev_priv(dev);
Forest Bond92b96792009-06-13 07:38:31 -04001535 struct net_device_stats* pStats = &pDevice->stats;
1536
1537
1538 spin_lock_irq(&pDevice->lock);
1539
1540 netif_stop_queue(pDevice->dev);
1541
1542 if (pDevice->bLinkPass == FALSE) {
1543 dev_kfree_skb_irq(skb);
1544 spin_unlock_irq(&pDevice->lock);
1545 return 0;
1546 }
1547 if (pDevice->bStopDataPkt == TRUE) {
1548 dev_kfree_skb_irq(skb);
1549 pStats->tx_dropped++;
1550 spin_unlock_irq(&pDevice->lock);
1551 return 0;
1552 }
1553
1554 if(nsDMA_tx_packet(pDevice, TYPE_AC0DMA, skb) !=0) { //mike add:xmit fail!
1555 if (netif_queue_stopped(pDevice->dev))
1556 netif_wake_queue(pDevice->dev);
1557 }
1558
1559 spin_unlock_irq(&pDevice->lock);
1560
1561 return 0;
1562}
1563
1564
1565
1566static unsigned const ethernet_polynomial = 0x04c11db7U;
1567static inline u32 ether_crc(int length, unsigned char *data)
1568{
1569 int crc = -1;
1570
1571 while(--length >= 0) {
1572 unsigned char current_octet = *data++;
1573 int bit;
1574 for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
1575 crc = (crc << 1) ^
1576 ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
1577 }
1578 }
1579 return crc;
1580}
1581
1582//find out the start position of str2 from str1
1583static UCHAR *kstrstr(const UCHAR *str1,const UCHAR *str2) {
1584 int str1_len=strlen(str1);
1585 int str2_len=strlen(str2);
1586
1587 while (str1_len >= str2_len) {
1588 str1_len--;
1589 if(memcmp(str1,str2,str2_len)==0)
1590 return (UCHAR *)str1;
1591 str1++;
1592 }
1593 return NULL;
1594}
1595
1596static int Config_FileGetParameter(UCHAR *string, UCHAR *dest,UCHAR *source)
1597{
1598 UCHAR buf1[100];
1599 UCHAR buf2[100];
1600 UCHAR *start_p=NULL,*end_p=NULL,*tmp_p=NULL;
1601 int ii;
1602
1603 memset(buf1,0,100);
1604 strcat(buf1, string);
1605 strcat(buf1, "=");
1606 source+=strlen(buf1);
1607
1608//find target string start point
1609 if((start_p = kstrstr(source,buf1))==NULL)
1610 return FALSE;
1611
1612//check if current config line is marked by "#" ??
1613for(ii=1;;ii++) {
1614 if(memcmp(start_p-ii,"\n",1)==0)
1615 break;
1616 if(memcmp(start_p-ii,"#",1)==0)
1617 return FALSE;
1618}
1619
1620//find target string end point
1621 if((end_p = kstrstr(start_p,"\n"))==NULL) { //cann't find "\n",but don't care
1622 end_p=start_p+strlen(start_p); //no include "\n"
1623 }
1624
1625 memset(buf2,0,100);
1626 memcpy(buf2,start_p,end_p-start_p); //get the tartget line
1627 buf2[end_p-start_p]='\0';
1628
1629 //find value
1630 if((start_p = kstrstr(buf2,"="))==NULL)
1631 return FALSE;
1632 memset(buf1,0,100);
1633 strcpy(buf1,start_p+1);
1634
1635 //except space
1636 tmp_p = buf1;
1637 while(*tmp_p != 0x00) {
1638 if(*tmp_p==' ')
1639 tmp_p++;
1640 else
1641 break;
1642 }
1643
1644 memcpy(dest,tmp_p,strlen(tmp_p));
1645 return TRUE;
1646}
1647
1648//if read fail,return NULL,or return data pointer;
1649static UCHAR *Config_FileOperation(PSDevice pDevice) {
1650 UCHAR *config_path=CONFIG_PATH;
1651 UCHAR *buffer=NULL;
1652 struct file *filp=NULL;
1653 mm_segment_t old_fs = get_fs();
Forest Bond8f9c4662009-06-13 07:38:47 -04001654 //int oldfsuid=0,oldfsgid=0;
Forest Bond92b96792009-06-13 07:38:31 -04001655 int result=0;
1656
1657 set_fs (KERNEL_DS);
Forest Bond8f9c4662009-06-13 07:38:47 -04001658 /* Can't do this anymore, so we rely on correct filesystem permissions:
1659 //Make sure a caller can read or write power as root
1660 oldfsuid=current->fsuid;
1661 oldfsgid=current->fsgid;
Forest Bond92b96792009-06-13 07:38:31 -04001662 current->fsuid = 0;
1663 current->fsgid = 0;
Forest Bond8f9c4662009-06-13 07:38:47 -04001664 */
Forest Bond92b96792009-06-13 07:38:31 -04001665
1666 //open file
1667 filp = filp_open(config_path, O_RDWR, 0);
1668 if (IS_ERR(filp)) {
1669 printk("Config_FileOperation file Not exist\n");
1670 result=-1;
1671 goto error2;
1672 }
1673
1674 if(!(filp->f_op) || !(filp->f_op->read) ||!(filp->f_op->write)) {
1675 printk("file %s cann't readable or writable?\n",config_path);
1676 result = -1;
1677 goto error1;
1678 }
1679
1680 buffer = (UCHAR *)kmalloc(1024, GFP_KERNEL);
1681 if(buffer==NULL) {
1682 printk("alllocate mem for file fail?\n");
1683 result = -1;
1684 goto error1;
1685 }
1686
1687 if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
1688 printk("read file error?\n");
1689 result = -1;
1690 }
1691
1692error1:
1693 if(filp_close(filp,NULL))
1694 printk("Config_FileOperation:close file fail\n");
1695
1696error2:
1697 set_fs (old_fs);
Forest Bond8f9c4662009-06-13 07:38:47 -04001698
1699 /*
Forest Bond92b96792009-06-13 07:38:31 -04001700 current->fsuid=oldfsuid;
1701 current->fsgid=oldfsgid;
Forest Bond8f9c4662009-06-13 07:38:47 -04001702 */
Forest Bond92b96792009-06-13 07:38:31 -04001703
1704if(result!=0) {
1705 if(buffer)
1706 kfree(buffer);
1707 buffer=NULL;
1708}
1709 return buffer;
1710}
1711
1712//return --->-1:fail; >=0:sucessful
1713static int Read_config_file(PSDevice pDevice) {
1714 int result=0;
1715 UCHAR tmpbuffer[100];
1716 UCHAR *buffer=NULL;
1717
1718 //init config setting
1719 pDevice->config_file.ZoneType = -1;
1720 pDevice->config_file.eAuthenMode = -1;
1721 pDevice->config_file.eEncryptionStatus = -1;
1722
1723 if((buffer=Config_FileOperation(pDevice)) ==NULL) {
1724 result =-1;
1725 return result;
1726 }
1727
1728//get zonetype
1729{
1730 memset(tmpbuffer,0,sizeof(tmpbuffer));
1731 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer) ==TRUE) {
1732 if(memcmp(tmpbuffer,"USA",3)==0) {
1733 pDevice->config_file.ZoneType=ZoneType_USA;
1734 }
1735 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
1736 pDevice->config_file.ZoneType=ZoneType_Japan;
1737 }
1738 else if(memcmp(tmpbuffer,"EUROPE",6)==0) {
1739 pDevice->config_file.ZoneType=ZoneType_Europe;
1740 }
1741 else {
1742 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
1743 }
1744 }
1745}
1746
1747#if 1
1748//get other parameter
1749 {
1750 memset(tmpbuffer,0,sizeof(tmpbuffer));
1751 if(Config_FileGetParameter("AUTHENMODE",tmpbuffer,buffer)==TRUE) {
1752 pDevice->config_file.eAuthenMode = (int) simple_strtol(tmpbuffer, NULL, 10);
1753 }
1754
1755 memset(tmpbuffer,0,sizeof(tmpbuffer));
1756 if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer,buffer)==TRUE) {
1757 pDevice->config_file.eEncryptionStatus= (int) simple_strtol(tmpbuffer, NULL, 10);
1758 }
1759 }
1760#endif
1761
1762 kfree(buffer);
1763 return result;
1764}
1765
1766static void device_set_multi(struct net_device *dev) {
Forest Bond1e28efa2009-06-13 07:38:50 -04001767 PSDevice pDevice = (PSDevice) netdev_priv(dev);
Forest Bond92b96792009-06-13 07:38:31 -04001768 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1769 u32 mc_filter[2];
1770 int ii;
1771 struct dev_mc_list *mclist;
1772 BYTE pbyData[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
1773 BYTE byTmpMode = 0;
1774 int rc;
1775
1776
1777 spin_lock_irq(&pDevice->lock);
1778 rc = CONTROLnsRequestIn(pDevice,
1779 MESSAGE_TYPE_READ,
1780 MAC_REG_RCR,
1781 MESSAGE_REQUEST_MACREG,
1782 1,
1783 &byTmpMode
1784 );
1785 if (rc == 0) pDevice->byRxMode = byTmpMode;
1786
1787 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode in= %x\n", pDevice->byRxMode);
1788
1789 if (dev->flags & IFF_PROMISC) { // Set promiscuous.
1790 DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
1791 // Unconditionally log net taps.
1792 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
1793 }
1794 else if ((dev->mc_count > pDevice->multicast_limit) || (dev->flags & IFF_ALLMULTI)) {
1795 CONTROLnsRequestOut(pDevice,
1796 MESSAGE_TYPE_WRITE,
1797 MAC_REG_MAR0,
1798 MESSAGE_REQUEST_MACREG,
1799 8,
1800 pbyData
1801 );
1802 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1803 }
1804 else {
1805 memset(mc_filter, 0, sizeof(mc_filter));
1806 for (ii = 0, mclist = dev->mc_list; mclist && ii < dev->mc_count;
1807 ii++, mclist = mclist->next) {
1808 int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
1809 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
1810 }
1811 for (ii = 0; ii < 4; ii++) {
1812 MACvWriteMultiAddr(pDevice, ii, *((PBYTE)&mc_filter[0] + ii));
1813 MACvWriteMultiAddr(pDevice, ii+ 4, *((PBYTE)&mc_filter[1] + ii));
1814 }
1815 pDevice->byRxMode &= ~(RCR_UNICAST);
1816 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1817 }
1818
1819 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1820 // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
1821 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1822 pDevice->byRxMode &= ~(RCR_UNICAST);
1823 }
1824 ControlvWriteByte(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_RCR, pDevice->byRxMode);
1825 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode out= %x\n", pDevice->byRxMode);
1826 spin_unlock_irq(&pDevice->lock);
1827
1828}
1829
1830
1831static struct net_device_stats *device_get_stats(struct net_device *dev) {
Forest Bond1e28efa2009-06-13 07:38:50 -04001832 PSDevice pDevice=(PSDevice) netdev_priv(dev);
Forest Bond92b96792009-06-13 07:38:31 -04001833
1834 return &pDevice->stats;
1835}
1836
1837
1838static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
Forest Bond1e28efa2009-06-13 07:38:50 -04001839 PSDevice pDevice = (PSDevice)netdev_priv(dev);
Forest Bond92b96792009-06-13 07:38:31 -04001840 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1841 PSCmdRequest pReq;
1842 //BOOL bCommit = FALSE;
1843#ifdef WIRELESS_EXT
1844 struct iwreq *wrq = (struct iwreq *) rq;
1845 int rc =0;
1846#endif //WIRELESS_EXT
1847
1848
1849 if (pMgmt == NULL) {
1850 rc = -EFAULT;
1851 return rc;
1852 }
1853
1854 switch(cmd) {
1855
1856#ifdef WIRELESS_EXT
1857//#if WIRELESS_EXT < 13
1858
1859 case SIOCGIWNAME:
1860 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
1861 break;
1862
1863 case SIOCSIWNWID:
1864 rc = -EOPNOTSUPP;
1865 break;
1866
1867 case SIOCGIWNWID: //0x8b03 support
1868 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1869 rc = iwctl_giwnwid(dev, NULL, &(wrq->u.nwid), NULL);
1870 #else
1871 rc = -EOPNOTSUPP;
1872 #endif
1873 break;
1874
1875 // Set frequency/channel
1876 case SIOCSIWFREQ:
1877 rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
1878 break;
1879
1880 // Get frequency/channel
1881 case SIOCGIWFREQ:
1882 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
1883 break;
1884
1885 // Set desired network name (ESSID)
1886 case SIOCSIWESSID:
1887
1888 {
1889 char essid[IW_ESSID_MAX_SIZE+1];
1890 if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
1891 rc = -E2BIG;
1892 break;
1893 }
1894 if (copy_from_user(essid, wrq->u.essid.pointer,
1895 wrq->u.essid.length)) {
1896 rc = -EFAULT;
1897 break;
1898 }
1899 rc = iwctl_siwessid(dev, NULL,
1900 &(wrq->u.essid), essid);
1901 }
1902 break;
1903
1904
1905 // Get current network name (ESSID)
1906 case SIOCGIWESSID:
1907
1908 {
1909 char essid[IW_ESSID_MAX_SIZE+1];
1910 if (wrq->u.essid.pointer)
1911 rc = iwctl_giwessid(dev, NULL,
1912 &(wrq->u.essid), essid);
1913 if (copy_to_user(wrq->u.essid.pointer,
1914 essid,
1915 wrq->u.essid.length) )
1916 rc = -EFAULT;
1917 }
1918 break;
1919
1920 case SIOCSIWAP:
1921
1922 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1923 break;
1924
1925
1926 // Get current Access Point (BSSID)
1927 case SIOCGIWAP:
1928 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1929 break;
1930
1931
1932 // Set desired station name
1933 case SIOCSIWNICKN:
1934 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
1935 rc = -EOPNOTSUPP;
1936 break;
1937
1938 // Get current station name
1939 case SIOCGIWNICKN:
1940 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
1941 rc = -EOPNOTSUPP;
1942 break;
1943
1944 // Set the desired bit-rate
1945 case SIOCSIWRATE:
1946 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1947 break;
1948
1949 // Get the current bit-rate
1950 case SIOCGIWRATE:
1951
1952 rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1953 break;
1954
1955 // Set the desired RTS threshold
1956 case SIOCSIWRTS:
1957
1958 rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
1959 break;
1960
1961 // Get the current RTS threshold
1962 case SIOCGIWRTS:
1963
1964 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
1965 break;
1966
1967 // Set the desired fragmentation threshold
1968 case SIOCSIWFRAG:
1969
1970 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
1971 break;
1972
1973 // Get the current fragmentation threshold
1974 case SIOCGIWFRAG:
1975
1976 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
1977 break;
1978
1979 // Set mode of operation
1980 case SIOCSIWMODE:
1981 rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
1982 break;
1983
1984 // Get mode of operation
1985 case SIOCGIWMODE:
1986 rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
1987 break;
1988
1989 // Set WEP keys and mode
1990 case SIOCSIWENCODE:
1991 {
1992 char abyKey[WLAN_WEP232_KEYLEN];
1993
1994 if (wrq->u.encoding.pointer) {
1995
1996
1997 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
1998 rc = -E2BIG;
1999 break;
2000 }
2001 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
2002 if (copy_from_user(abyKey,
2003 wrq->u.encoding.pointer,
2004 wrq->u.encoding.length)) {
2005 rc = -EFAULT;
2006 break;
2007 }
2008 } else if (wrq->u.encoding.length != 0) {
2009 rc = -EINVAL;
2010 break;
2011 }
2012 rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
2013 }
2014 break;
2015
2016 // Get the WEP keys and mode
2017 case SIOCGIWENCODE:
2018
2019 if (!capable(CAP_NET_ADMIN)) {
2020 rc = -EPERM;
2021 break;
2022 }
2023 {
2024 char abyKey[WLAN_WEP232_KEYLEN];
2025
2026 rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
2027 if (rc != 0) break;
2028 if (wrq->u.encoding.pointer) {
2029 if (copy_to_user(wrq->u.encoding.pointer,
2030 abyKey,
2031 wrq->u.encoding.length))
2032 rc = -EFAULT;
2033 }
2034 }
2035 break;
2036
2037#if WIRELESS_EXT > 9
2038 // Get the current Tx-Power
2039 case SIOCGIWTXPOW:
2040 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
2041 rc = -EOPNOTSUPP;
2042 break;
2043
2044 case SIOCSIWTXPOW:
2045 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
2046 rc = -EOPNOTSUPP;
2047 break;
2048
2049#endif // WIRELESS_EXT > 9
2050
2051#if WIRELESS_EXT > 10
2052 case SIOCSIWRETRY:
2053
2054 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
2055 break;
2056
2057 case SIOCGIWRETRY:
2058
2059 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
2060 break;
2061
2062#endif // WIRELESS_EXT > 10
2063
2064 // Get range of parameters
2065 case SIOCGIWRANGE:
2066
2067 {
2068 struct iw_range range;
2069
2070 rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *) &range);
2071 if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
2072 rc = -EFAULT;
2073 }
2074
2075 break;
2076
2077 case SIOCGIWPOWER:
2078
2079 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
2080 break;
2081
2082
2083 case SIOCSIWPOWER:
2084
2085 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
2086 break;
2087
2088
2089 case SIOCGIWSENS:
2090
2091 rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
2092 break;
2093
2094 case SIOCSIWSENS:
2095 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
2096 rc = -EOPNOTSUPP;
2097 break;
2098
2099 case SIOCGIWAPLIST:
2100 {
2101 char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
2102
2103 if (wrq->u.data.pointer) {
2104 rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
2105 if (rc == 0) {
2106 if (copy_to_user(wrq->u.data.pointer,
2107 buffer,
2108 (wrq->u.data.length * (sizeof(struct sockaddr) + sizeof(struct iw_quality)))
2109 ))
2110 rc = -EFAULT;
2111 }
2112 }
2113 }
2114 break;
2115
2116
2117#ifdef WIRELESS_SPY
2118 // Set the spy list
2119 case SIOCSIWSPY:
2120
2121 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
2122 rc = -EOPNOTSUPP;
2123 break;
2124
2125 // Get the spy list
2126 case SIOCGIWSPY:
2127
2128 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
2129 rc = -EOPNOTSUPP;
2130 break;
2131
2132#endif // WIRELESS_SPY
2133
2134 case SIOCGIWPRIV:
2135 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
2136 rc = -EOPNOTSUPP;
2137/*
2138 if(wrq->u.data.pointer) {
2139 wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
2140
2141 if(copy_to_user(wrq->u.data.pointer,
2142 (u_char *) iwctl_private_args,
2143 sizeof(iwctl_private_args)))
2144 rc = -EFAULT;
2145 }
2146*/
2147 break;
2148
2149
2150//#endif // WIRELESS_EXT < 13
2151
2152//2008-0409-07, <Add> by Einsn Liu
2153#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2154 case SIOCSIWAUTH:
2155 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH \n");
2156 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
2157 break;
2158
2159 case SIOCGIWAUTH:
2160 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
2161 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
2162 break;
2163
2164 case SIOCSIWGENIE:
2165 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
2166 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2167 break;
2168
2169 case SIOCGIWGENIE:
2170 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
2171 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2172 break;
2173
2174 case SIOCSIWENCODEEXT:
2175 {
2176 char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
2177 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
2178 if(wrq->u.encoding.pointer){
2179 memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1);
2180 if(wrq->u.encoding.length > (sizeof(struct iw_encode_ext)+ MAX_KEY_LEN)){
2181 rc = -E2BIG;
2182 break;
2183 }
2184 if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
2185 rc = -EFAULT;
2186 break;
2187 }
2188 }else if(wrq->u.encoding.length != 0){
2189 rc = -EINVAL;
2190 break;
2191 }
2192 rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
2193 }
2194 break;
2195
2196 case SIOCGIWENCODEEXT:
2197 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
2198 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
2199 break;
2200
2201 case SIOCSIWMLME:
2202 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
2203 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2204 break;
2205
2206#endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2207//End Add -- //2008-0409-07, <Add> by Einsn Liu
2208
2209#endif // WIRELESS_EXT
2210
2211 case IOCTL_CMD_TEST:
2212
2213 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2214 rc = -EFAULT;
2215 break;
2216 } else {
2217 rc = 0;
2218 }
2219 pReq = (PSCmdRequest)rq;
2220
2221 //20080130-01,<Remark> by Mike Liu
2222 // if(pDevice->bLinkPass==TRUE)
2223 pReq->wResult = MAGIC_CODE; //Linking status:0x3142
2224 //20080130-02,<Remark> by Mike Liu
2225 // else
2226 // pReq->wResult = MAGIC_CODE+1; //disconnect status:0x3143
2227 break;
2228
2229 case IOCTL_CMD_SET:
2230 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
2231 (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
2232 {
2233 rc = -EFAULT;
2234 break;
2235 } else {
2236 rc = 0;
2237 }
2238
2239 if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
2240 return -EBUSY;
2241 }
2242 rc = private_ioctl(pDevice, rq);
2243 clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
2244 break;
2245
2246 case IOCTL_CMD_HOSTAPD:
2247
2248 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2249 rc = -EFAULT;
2250 break;
2251 } else {
2252 rc = 0;
2253 }
2254
2255#if WIRELESS_EXT > 8
2256 rc = hostap_ioctl(pDevice, &wrq->u.data);
2257#else // WIRELESS_EXT > 8
2258 rc = hostap_ioctl(pDevice, (struct iw_point *) &wrq->u.data);
2259#endif // WIRELESS_EXT > 8
2260 break;
2261
2262 case IOCTL_CMD_WPA:
2263
2264 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2265 rc = -EFAULT;
2266 break;
2267 } else {
2268 rc = 0;
2269 }
2270
2271#if WIRELESS_EXT > 8
2272 rc = wpa_ioctl(pDevice, &wrq->u.data);
2273#else // WIRELESS_EXT > 8
2274 rc = wpa_ioctl(pDevice, (struct iw_point *) &wrq->u.data);
2275#endif // WIRELESS_EXT > 8
2276 break;
2277
2278 case SIOCETHTOOL:
2279 return ethtool_ioctl(dev, (void *) rq->ifr_data);
2280 // All other calls are currently unsupported
2281
2282 default:
2283 rc = -EOPNOTSUPP;
2284 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
2285
2286
2287 }
2288
2289 if (pDevice->bCommit) {
2290 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2291 netif_stop_queue(pDevice->dev);
2292 spin_lock_irq(&pDevice->lock);
2293 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RUN_AP, NULL);
2294 spin_unlock_irq(&pDevice->lock);
2295 }
2296 else {
2297 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
2298 spin_lock_irq(&pDevice->lock);
2299//2007-1121-01<Modify>by EinsnLiu
2300 if (pDevice->bLinkPass&&
2301 memcmp(pMgmt->abyCurrSSID,pMgmt->abyDesireSSID,WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN)) {
2302 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
2303 } else {
2304 pDevice->bLinkPass = FALSE;
2305 pMgmt->eCurrState = WMAC_STATE_IDLE;
2306 memset(pMgmt->abyCurrBSSID, 0, 6);
2307 }
2308 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
2309//End Modify
2310 netif_stop_queue(pDevice->dev);
2311#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2312 pMgmt->eScanType = WMAC_SCAN_ACTIVE;
2313 if(pDevice->bWPASuppWextEnabled !=TRUE)
2314#endif
2315 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
2316 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, NULL);
2317 spin_unlock_irq(&pDevice->lock);
2318 }
2319 pDevice->bCommit = FALSE;
2320 }
2321
2322
2323 return rc;
2324}
2325
2326
2327static int ethtool_ioctl(struct net_device *dev, void *useraddr)
2328{
2329 u32 ethcmd;
2330
2331 if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
2332 return -EFAULT;
2333
2334 switch (ethcmd) {
2335 case ETHTOOL_GDRVINFO: {
2336 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
2337 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
2338 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
2339 if (copy_to_user(useraddr, &info, sizeof(info)))
2340 return -EFAULT;
2341 return 0;
2342 }
2343
2344 }
2345
2346 return -EOPNOTSUPP;
2347}
2348
2349
2350/*------------------------------------------------------------------*/
2351
2352
2353MODULE_DEVICE_TABLE(usb, vntwusb_table);
2354
2355
2356#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
2357
2358static struct usb_driver vntwusb_driver = {
2359#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
2360 .owner = THIS_MODULE,
2361#endif
2362 .name = DEVICE_NAME,
2363 .probe = vntwusb_found1,
2364 .disconnect = vntwusb_disconnect,
2365 .id_table = vntwusb_table,
2366
2367//2008-0920-01<Add>by MikeLiu
2368//for supporting S3 & S4 function
2369#ifdef CONFIG_PM
2370 .suspend = vntwusb_suspend,
2371 .resume = vntwusb_resume,
2372#endif
2373};
2374
2375#else
2376
2377static struct usb_driver vntwusb_driver = {
2378 name: DEVICE_NAME,
2379 probe: vntwusb_found1,
2380 disconnect: vntwusb_disconnect,
2381 id_table: vntwusb_table,
2382};
2383
2384#endif
2385
2386static int __init vntwusb_init_module(void)
2387{
2388 info(DEVICE_FULL_DRV_NAM " " DEVICE_VERSION);
2389 return usb_register(&vntwusb_driver);
2390}
2391
2392static void __exit vntwusb_cleanup_module(void)
2393{
2394 usb_deregister(&vntwusb_driver);
2395}
2396
2397module_init(vntwusb_init_module);
2398module_exit(vntwusb_cleanup_module);
2399