blob: 3368e8354fe532363b17c9a664ae7a72b37367c5 [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
869 pDevice = kmalloc(sizeof(DEVICE_INFO), GFP_KERNEL);
870 if (pDevice == NULL) {
871 printk(KERN_ERR DEVICE_NAME ": allocate usb device failed \n");
872 goto err_nomem;
873 }
874 memset(pDevice, 0, sizeof(DEVICE_INFO));
875
876#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
877 netdev = alloc_etherdev(0);
878#else
879 netdev = init_etherdev(netdev, 0);
880#endif
881
882 if (netdev == NULL) {
883 printk(KERN_ERR DEVICE_NAME ": allocate net device failed \n");
884 kfree(pDevice);
885 goto err_nomem;
886 }
887 pDevice->dev = netdev;
888 pDevice->usb = udev;
889
890 // Chain it all together
891#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
892 SET_MODULE_OWNER(netdev);
893#endif
894
895 // Set initial settings
896 device_set_options(pDevice);
897 spin_lock_init(&pDevice->lock);
898
899 pDevice->tx_80211 = device_dma0_tx_80211;
900 pDevice->sMgmtObj.pAdapter = (PVOID)pDevice;
901
902 netdev->priv = pDevice;
903 netdev->open = device_open;
904 netdev->hard_start_xmit = device_xmit;
905 netdev->stop = device_close;
906 netdev->get_stats = device_get_stats;
907 netdev->set_multicast_list = device_set_multi;
908 netdev->do_ioctl = device_ioctl;
909#ifdef WIRELESS_EXT
910
911//2007-0508-01<Add>by MikeLiu
912 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
913 netdev->get_wireless_stats = iwctl_get_wireless_stats;
914 #endif
915
916#if WIRELESS_EXT > 12
917 netdev->wireless_handlers = (struct iw_handler_def *)&iwctl_handler_def;
918// netdev->wireless_handlers = NULL;
919#endif /* WIRELESS_EXT > 12 */
920#endif /* WIRELESS_EXT */
921
922#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
923
924 //2008-0623-01<Remark>by MikeLiu
925 //2007-0821-01<Add>by MikeLiu
926 // #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
927 usb_set_intfdata(intf, pDevice);
928 SET_NETDEV_DEV(netdev, &intf->dev);
929 //#endif
930 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
931 memcpy(pDevice->dev->dev_addr, fake_mac, U_ETHER_ADDR_LEN); //use fake mac address
932 #endif
933 rc = register_netdev(netdev);
934 if (rc != 0) {
935 printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
936 free_netdev(netdev);
937 kfree(pDevice);
938 return -ENODEV;
939 }
940 //2008-0623-02<Remark>by MikeLiu
941 //2007-0821-01<Add>by MikeLiu
942 //#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)
943 //usb_set_intfdata(intf, pDevice);
944 //SET_NETDEV_DEV(netdev, &intf->dev);
945 //#endif
946
947//2008-07-21-01<Add>by MikeLiu
948//register wpadev
949 if(wpa_set_wpadev(pDevice, 1)!=0) {
950 printk("Fail to Register WPADEV?\n");
951 unregister_netdev(pDevice->dev);
952 free_netdev(netdev);
953 kfree(pDevice);
954 }
955
956//2007-1107-03<Add>by MikeLiu
957 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
958 usb_device_reset(pDevice);
959 #endif
960
961#ifdef SndEvt_ToAPI
962{
963 union iwreq_data wrqu;
964 memset(&wrqu, 0, sizeof(wrqu));
965 wrqu.data.flags = RT_INSMOD_EVENT_FLAG;
966 wrqu.data.length =IFNAMSIZ;
967 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, pDevice->dev->name);
968}
969#endif
970
971 return 0;
972#else
973 return pDevice;
974#endif
975
976
977err_nomem:
978#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
979
980 //2008-0922-01<Add>by MikeLiu, decrease usb counter.
981 usb_put_dev(udev);
982
983 return -ENOMEM;
984#else
985 return NULL;
986#endif
987}
988
989
990static VOID device_free_tx_bufs(PSDevice pDevice) {
991 PUSB_SEND_CONTEXT pTxContext;
992 int ii;
993
994 for (ii = 0; ii < pDevice->cbTD; ii++) {
995
996 pTxContext = pDevice->apTD[ii];
997 //de-allocate URBs
998 if (pTxContext->pUrb) {
999 vntwusb_unlink_urb(pTxContext->pUrb);
1000 usb_free_urb(pTxContext->pUrb);
1001 }
1002 if (pTxContext)
1003 kfree(pTxContext);
1004 }
1005 return;
1006}
1007
1008
1009static VOID device_free_rx_bufs(PSDevice pDevice) {
1010 PRCB pRCB;
1011 int ii;
1012
1013 for (ii = 0; ii < pDevice->cbRD; ii++) {
1014
1015 pRCB = pDevice->apRCB[ii];
1016 //de-allocate URBs
1017 if (pRCB->pUrb) {
1018 vntwusb_unlink_urb(pRCB->pUrb);
1019 usb_free_urb(pRCB->pUrb);
1020 }
1021 //de-allocate skb
1022 if (pRCB->skb)
1023 dev_kfree_skb(pRCB->skb);
1024 }
1025 if (pDevice->pRCBMem)
1026 kfree(pDevice->pRCBMem);
1027
1028 return;
1029}
1030
1031//2007-1107-02<Add>by MikeLiu
1032#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
1033static void usb_device_reset(PSDevice pDevice)
1034{
1035 int status;
1036 status = usb_reset_device(pDevice->usb);
1037 if (status)
1038 printk("usb_device_reset fail status=%d\n",status);
1039 return ;
1040}
1041#endif
1042
1043static VOID device_free_int_bufs(PSDevice pDevice) {
1044
1045 if (pDevice->intBuf.pDataBuf != NULL)
1046 kfree(pDevice->intBuf.pDataBuf);
1047 return;
1048}
1049
1050
1051static BOOL device_alloc_bufs(PSDevice pDevice) {
1052
1053 PUSB_SEND_CONTEXT pTxContext;
1054 PRCB pRCB;
1055 int ii;
1056
1057
1058 for (ii = 0; ii < pDevice->cbTD; ii++) {
1059
1060 pTxContext = kmalloc(sizeof(USB_SEND_CONTEXT), GFP_KERNEL);
1061 if (pTxContext == NULL) {
1062 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate tx usb context failed\n", pDevice->dev->name);
1063 goto free_tx;
1064 }
1065 pDevice->apTD[ii] = pTxContext;
1066 pTxContext->pDevice = (PVOID) pDevice;
1067 //allocate URBs
1068 pTxContext->pUrb = vntwusb_alloc_urb(0);;
1069 if (pTxContext->pUrb == NULL) {
1070 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "alloc tx urb failed\n");
1071 goto free_tx;
1072 }
1073 pTxContext->bBoolInUse = FALSE;
1074 }
1075
1076 // allocate rcb mem
1077 pDevice->pRCBMem = kmalloc((sizeof(RCB) * pDevice->cbRD), GFP_KERNEL);
1078 if (pDevice->pRCBMem == NULL) {
1079 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : alloc rx usb context failed\n", pDevice->dev->name);
1080 goto free_tx;
1081 }
1082
1083
1084 pDevice->FirstRecvFreeList = NULL;
1085 pDevice->LastRecvFreeList = NULL;
1086 pDevice->FirstRecvMngList = NULL;
1087 pDevice->LastRecvMngList = NULL;
1088 pDevice->NumRecvFreeList = 0;
1089 memset(pDevice->pRCBMem, 0, (sizeof(RCB) * pDevice->cbRD));
1090 pRCB = (PRCB) pDevice->pRCBMem;
1091
1092 for (ii = 0; ii < pDevice->cbRD; ii++) {
1093
1094 pDevice->apRCB[ii] = pRCB;
1095 pRCB->pDevice = (PVOID) pDevice;
1096 //allocate URBs
1097 pRCB->pUrb = vntwusb_alloc_urb(0);
1098
1099 if (pRCB->pUrb == NULL) {
1100 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx urb\n");
1101 goto free_rx_tx;
1102 }
1103 pRCB->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1104 if (pRCB->skb == NULL) {
1105 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx skb\n");
1106 goto free_rx_tx;
1107 }
1108 pRCB->skb->dev = pDevice->dev;
1109 pRCB->bBoolInUse = FALSE;
1110 EnqueueRCB(pDevice->FirstRecvFreeList, pDevice->LastRecvFreeList, pRCB);
1111 pDevice->NumRecvFreeList++;
1112 pRCB++;
1113 }
1114
1115
1116 pDevice->pControlURB = vntwusb_alloc_urb(0);
1117 if (pDevice->pControlURB == NULL) {
1118 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc control urb\n");
1119 goto free_rx_tx;
1120 }
1121
1122 pDevice->pInterruptURB = vntwusb_alloc_urb(0);
1123 if (pDevice->pInterruptURB == NULL) {
1124 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int urb\n");
1125 vntwusb_unlink_urb(pDevice->pControlURB);
1126 usb_free_urb(pDevice->pControlURB);
1127 goto free_rx_tx;
1128 }
1129
1130 pDevice->intBuf.pDataBuf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL);
1131 if (pDevice->intBuf.pDataBuf == NULL) {
1132 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int buf\n");
1133 vntwusb_unlink_urb(pDevice->pControlURB);
1134 vntwusb_unlink_urb(pDevice->pInterruptURB);
1135 usb_free_urb(pDevice->pControlURB);
1136 usb_free_urb(pDevice->pInterruptURB);
1137 goto free_rx_tx;
1138 }
1139
1140 return TRUE;
1141
1142free_rx_tx:
1143 device_free_rx_bufs(pDevice);
1144
1145free_tx:
1146 device_free_tx_bufs(pDevice);
1147
1148 return FALSE;
1149}
1150
1151
1152
1153
1154static BOOL device_init_defrag_cb(PSDevice pDevice) {
1155 int i;
1156 PSDeFragControlBlock pDeF;
1157
1158 /* Init the fragment ctl entries */
1159 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1160 pDeF = &(pDevice->sRxDFCB[i]);
1161 if (!device_alloc_frag_buf(pDevice, pDeF)) {
1162 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
1163 pDevice->dev->name);
1164 goto free_frag;
1165 };
1166 }
1167 pDevice->cbDFCB = CB_MAX_RX_FRAG;
1168 pDevice->cbFreeDFCB = pDevice->cbDFCB;
1169 return TRUE;
1170
1171free_frag:
1172 device_free_frag_bufs(pDevice);
1173 return FALSE;
1174}
1175
1176
1177
1178static void device_free_frag_bufs(PSDevice pDevice) {
1179 PSDeFragControlBlock pDeF;
1180 int i;
1181
1182 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
1183
1184 pDeF = &(pDevice->sRxDFCB[i]);
1185
1186 if (pDeF->skb)
1187 dev_kfree_skb(pDeF->skb);
1188 }
1189}
1190
1191
1192
1193BOOL device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {
1194
1195 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1196 if (pDeF->skb == NULL)
1197 return FALSE;
1198 ASSERT(pDeF->skb);
1199 pDeF->skb->dev = pDevice->dev;
1200
1201 return TRUE;
1202}
1203
1204
1205/*-----------------------------------------------------------------*/
1206
1207static int device_open(struct net_device *dev) {
1208 PSDevice pDevice=(PSDevice) dev->priv;
1209
1210#ifdef WPA_SM_Transtatus
1211 extern SWPAResult wpa_Result;
1212 memset(wpa_Result.ifname,0,sizeof(wpa_Result.ifname));
1213 wpa_Result.proto = 0;
1214 wpa_Result.key_mgmt = 0;
1215 wpa_Result.eap_type = 0;
1216 wpa_Result.authenticated = FALSE;
1217 pDevice->fWPA_Authened = FALSE;
1218#endif
1219
1220 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_open...\n");
1221
1222
1223 pDevice->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS;
1224
1225 if (device_alloc_bufs(pDevice) == FALSE) {
1226 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_alloc_bufs fail... \n");
1227 return -ENOMEM;
1228 }
1229
1230 if (device_init_defrag_cb(pDevice)== FALSE) {
1231 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Initial defragement cb fail \n");
1232 goto free_rx_tx;
1233 }
1234
1235 MP_CLEAR_FLAG(pDevice, fMP_DISCONNECTED);
1236 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
1237 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
1238 MP_SET_FLAG(pDevice, fMP_POST_READS);
1239 MP_SET_FLAG(pDevice, fMP_POST_WRITES);
1240
1241 //read config file
1242 Read_config_file(pDevice);
1243
1244 if (device_init_registers(pDevice, DEVICE_INIT_COLD) == FALSE) {
1245 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " init register fail\n");
1246 goto free_all;
1247 }
1248
1249 device_set_multi(pDevice->dev);
1250 // Init for Key Management
1251
1252 KeyvInitTable(pDevice,&pDevice->sKey);
1253 memcpy(pDevice->sMgmtObj.abyMACAddr, pDevice->abyCurrentNetAddr, U_ETHER_ADDR_LEN);
1254 memcpy(pDevice->dev->dev_addr, pDevice->abyCurrentNetAddr, U_ETHER_ADDR_LEN);
1255 pDevice->bStopTx0Pkt = FALSE;
1256 pDevice->bStopDataPkt = FALSE;
1257 pDevice->bRoaming = FALSE; //DavidWang
1258 pDevice->bIsRoaming = FALSE;//DavidWang
1259 pDevice->bEnableRoaming = FALSE;
1260 if (pDevice->bDiversityRegCtlON) {
1261 device_init_diversity_timer(pDevice);
1262 }
1263
1264 vMgrObjectInit(pDevice);
1265 tasklet_init(&pDevice->RxMngWorkItem, (void *)RXvMngWorkItem, (unsigned long)pDevice);
1266 tasklet_init(&pDevice->ReadWorkItem, (void *)RXvWorkItem, (unsigned long)pDevice);
1267 tasklet_init(&pDevice->EventWorkItem, (void *)INTvWorkItem, (unsigned long)pDevice);
1268 add_timer(&(pDevice->sMgmtObj.sTimerSecondCallback));
1269#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
1270 pDevice->int_interval = 100; //Max 100 microframes.
1271#else
1272 pDevice->int_interval = 0x10; //16 microframes interval(~2ms) for usb 2.0
1273#endif
1274 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1275
1276 pDevice->bIsRxWorkItemQueued = TRUE;
1277 pDevice->fKillEventPollingThread = FALSE;
1278 pDevice->bEventAvailable = FALSE;
1279
1280 pDevice->bWPADEVUp = FALSE;
1281#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1282 pDevice->bwextstep0 = FALSE;
1283 pDevice->bwextstep1 = FALSE;
1284 pDevice->bwextstep2 = FALSE;
1285 pDevice->bwextstep3 = FALSE;
1286 pDevice->bWPASuppWextEnabled = FALSE;
1287#endif
1288 pDevice->byReAssocCount = 0;
1289
1290 RXvWorkItem(pDevice);
1291 INTvWorkItem(pDevice);
1292
1293 // Patch: if WEP key already set by iwconfig but device not yet open
1294 if ((pDevice->bEncryptionEnable == TRUE) && (pDevice->bTransmitKey == TRUE)) {
1295 spin_lock_irq(&pDevice->lock);
1296 KeybSetDefaultKey( pDevice,
1297 &(pDevice->sKey),
1298 pDevice->byKeyIndex | (1 << 31),
1299 pDevice->uKeyLength,
1300 NULL,
1301 pDevice->abyKey,
1302 KEY_CTL_WEP
1303 );
1304 spin_unlock_irq(&pDevice->lock);
1305 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1306 }
1307
1308 if (pDevice->sMgmtObj.eConfigMode == WMAC_CONFIG_AP) {
1309 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RUN_AP, NULL);
1310 }
1311 else {
1312 //mike:mark@2008-11-10
1313 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1314 //bScheduleCommand((HANDLE)pDevice, WLAN_CMD_SSID, NULL);
1315 }
1316
1317
1318 netif_stop_queue(pDevice->dev);
1319 pDevice->flags |= DEVICE_FLAGS_OPENED;
1320
1321#ifdef SndEvt_ToAPI
1322{
1323 union iwreq_data wrqu;
1324 memset(&wrqu, 0, sizeof(wrqu));
1325 wrqu.data.flags = RT_UPDEV_EVENT_FLAG;
1326 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1327}
1328#endif
1329
1330 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
1331 return 0;
1332
1333free_all:
1334 device_free_frag_bufs(pDevice);
1335free_rx_tx:
1336 device_free_rx_bufs(pDevice);
1337 device_free_tx_bufs(pDevice);
1338 device_free_int_bufs(pDevice);
1339 vntwusb_unlink_urb(pDevice->pControlURB);
1340 vntwusb_unlink_urb(pDevice->pInterruptURB);
1341 usb_free_urb(pDevice->pControlURB);
1342 usb_free_urb(pDevice->pInterruptURB);
1343
1344 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open fail.. \n");
1345 return -ENOMEM;
1346}
1347
1348
1349
1350static int device_close(struct net_device *dev) {
1351 PSDevice pDevice=(PSDevice) dev->priv;
1352 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1353
1354 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
1355 int uu;
1356 #endif
1357
1358 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close1 \n");
1359 if (pDevice == NULL)
1360 return -ENODEV;
1361
1362#ifdef SndEvt_ToAPI
1363{
1364 union iwreq_data wrqu;
1365 memset(&wrqu, 0, sizeof(wrqu));
1366 wrqu.data.flags = RT_DOWNDEV_EVENT_FLAG;
1367 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1368}
1369#endif
1370
1371//2007-1121-02<Add>by EinsnLiu
1372 if (pDevice->bLinkPass) {
1373 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
1374 mdelay(30);
1375 }
1376//End Add
1377
1378//2008-0714-01<Add>by MikeLiu
1379device_release_WPADEV(pDevice);
1380
1381 //2007-0821-01<Add>by MikeLiu
1382 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
1383 memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
1384 pMgmt->bShareKeyAlgorithm = FALSE;
1385 pDevice->bEncryptionEnable = FALSE;
1386 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1387 spin_lock_irq(&pDevice->lock);
1388 for(uu=0;uu<MAX_KEY_TABLE;uu++)
1389 MACvDisableKeyEntry(pDevice,uu);
1390 spin_unlock_irq(&pDevice->lock);
1391 #endif
1392
1393 if ((pDevice->flags & DEVICE_FLAGS_UNPLUG) == FALSE) {
1394 MACbShutdown(pDevice);
1395 }
1396 netif_stop_queue(pDevice->dev);
1397 MP_SET_FLAG(pDevice, fMP_DISCONNECTED);
1398 MP_CLEAR_FLAG(pDevice, fMP_POST_WRITES);
1399 MP_CLEAR_FLAG(pDevice, fMP_POST_READS);
1400 pDevice->fKillEventPollingThread = TRUE;
1401 del_timer(&pDevice->sTimerCommand);
1402 del_timer(&pMgmt->sTimerSecondCallback);
1403
1404//2007-0115-02<Add>by MikeLiu
1405#ifdef TxInSleep
1406 del_timer(&pDevice->sTimerTxData);
1407#endif
1408
1409 if (pDevice->bDiversityRegCtlON) {
1410 del_timer(&pDevice->TimerSQ3Tmax1);
1411 del_timer(&pDevice->TimerSQ3Tmax2);
1412 del_timer(&pDevice->TimerSQ3Tmax3);
1413 }
1414 tasklet_kill(&pDevice->RxMngWorkItem);
1415 tasklet_kill(&pDevice->ReadWorkItem);
1416 tasklet_kill(&pDevice->EventWorkItem);
1417
1418 pDevice->bRoaming = FALSE; //DavidWang
1419 pDevice->bIsRoaming = FALSE;//DavidWang
1420 pDevice->bEnableRoaming = FALSE;
1421 pDevice->bCmdRunning = FALSE;
1422 pDevice->bLinkPass = FALSE;
1423 memset(pMgmt->abyCurrBSSID, 0, 6);
1424 pMgmt->eCurrState = WMAC_STATE_IDLE;
1425
1426 device_free_tx_bufs(pDevice);
1427 device_free_rx_bufs(pDevice);
1428 device_free_int_bufs(pDevice);
1429 device_free_frag_bufs(pDevice);
1430
1431 vntwusb_unlink_urb(pDevice->pControlURB);
1432 vntwusb_unlink_urb(pDevice->pInterruptURB);
1433 usb_free_urb(pDevice->pControlURB);
1434 usb_free_urb(pDevice->pInterruptURB);
1435
1436 BSSvClearNodeDBTable(pDevice, 0);
1437 pDevice->flags &=(~DEVICE_FLAGS_OPENED);
1438
1439 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n");
1440
1441 return 0;
1442}
1443
1444#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
1445
1446static void vntwusb_disconnect(struct usb_interface *intf)
1447
1448#else
1449
1450static void vntwusb_disconnect(struct usb_device *udev, void *ptr)
1451#endif
1452{
1453#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
1454
1455 PSDevice pDevice = usb_get_intfdata(intf);
1456#else
1457 PSDevice pDevice = (PSDevice)ptr;
1458#endif
1459
1460
1461 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_disconnect1.. \n");
1462 if (pDevice == NULL)
1463 return;
1464
1465#ifdef SndEvt_ToAPI
1466{
1467 union iwreq_data wrqu;
1468 memset(&wrqu, 0, sizeof(wrqu));
1469 wrqu.data.flags = RT_RMMOD_EVENT_FLAG;
1470 wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, NULL);
1471}
1472#endif
1473
1474//2008-0714-01<Add>by MikeLiu
1475device_release_WPADEV(pDevice);
1476
1477#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
1478
1479 usb_set_intfdata(intf, NULL);
1480//2008-0922-01<Add>by MikeLiu, decrease usb counter.
1481 usb_put_dev(interface_to_usbdev(intf));
1482
1483#endif
1484
1485 pDevice->flags |= DEVICE_FLAGS_UNPLUG;
1486 if (pDevice->dev != NULL) {
1487 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "unregister_netdev..\n");
1488 unregister_netdev(pDevice->dev);
1489
1490//2008-07-21-01<Add>by MikeLiu
1491//unregister wpadev
1492 if(wpa_set_wpadev(pDevice, 0)!=0)
1493 printk("unregister wpadev fail?\n");
1494
1495#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
1496 free_netdev(pDevice->dev);
1497#else
1498 kfree(pDevice->dev);
1499#endif
1500 }
1501
1502 kfree(pDevice);
1503 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_disconnect3.. \n");
1504}
1505
1506
1507
1508
1509static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev) {
1510 PSDevice pDevice=dev->priv;
1511 PBYTE pbMPDU;
1512 UINT cbMPDULen = 0;
1513
1514
1515 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_dma0_tx_80211\n");
1516 spin_lock_irq(&pDevice->lock);
1517
1518 if (pDevice->bStopTx0Pkt == TRUE) {
1519 dev_kfree_skb_irq(skb);
1520 spin_unlock_irq(&pDevice->lock);
1521 return 0;
1522 };
1523
1524
1525 cbMPDULen = skb->len;
1526 pbMPDU = skb->data;
1527
1528 vDMA0_tx_80211(pDevice, skb);
1529
1530 spin_unlock_irq(&pDevice->lock);
1531
1532 return 0;
1533
1534}
1535
1536
1537static int device_xmit(struct sk_buff *skb, struct net_device *dev) {
1538 PSDevice pDevice=dev->priv;
1539 struct net_device_stats* pStats = &pDevice->stats;
1540
1541
1542 spin_lock_irq(&pDevice->lock);
1543
1544 netif_stop_queue(pDevice->dev);
1545
1546 if (pDevice->bLinkPass == FALSE) {
1547 dev_kfree_skb_irq(skb);
1548 spin_unlock_irq(&pDevice->lock);
1549 return 0;
1550 }
1551 if (pDevice->bStopDataPkt == TRUE) {
1552 dev_kfree_skb_irq(skb);
1553 pStats->tx_dropped++;
1554 spin_unlock_irq(&pDevice->lock);
1555 return 0;
1556 }
1557
1558 if(nsDMA_tx_packet(pDevice, TYPE_AC0DMA, skb) !=0) { //mike add:xmit fail!
1559 if (netif_queue_stopped(pDevice->dev))
1560 netif_wake_queue(pDevice->dev);
1561 }
1562
1563 spin_unlock_irq(&pDevice->lock);
1564
1565 return 0;
1566}
1567
1568
1569
1570static unsigned const ethernet_polynomial = 0x04c11db7U;
1571static inline u32 ether_crc(int length, unsigned char *data)
1572{
1573 int crc = -1;
1574
1575 while(--length >= 0) {
1576 unsigned char current_octet = *data++;
1577 int bit;
1578 for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
1579 crc = (crc << 1) ^
1580 ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
1581 }
1582 }
1583 return crc;
1584}
1585
1586//find out the start position of str2 from str1
1587static UCHAR *kstrstr(const UCHAR *str1,const UCHAR *str2) {
1588 int str1_len=strlen(str1);
1589 int str2_len=strlen(str2);
1590
1591 while (str1_len >= str2_len) {
1592 str1_len--;
1593 if(memcmp(str1,str2,str2_len)==0)
1594 return (UCHAR *)str1;
1595 str1++;
1596 }
1597 return NULL;
1598}
1599
1600static int Config_FileGetParameter(UCHAR *string, UCHAR *dest,UCHAR *source)
1601{
1602 UCHAR buf1[100];
1603 UCHAR buf2[100];
1604 UCHAR *start_p=NULL,*end_p=NULL,*tmp_p=NULL;
1605 int ii;
1606
1607 memset(buf1,0,100);
1608 strcat(buf1, string);
1609 strcat(buf1, "=");
1610 source+=strlen(buf1);
1611
1612//find target string start point
1613 if((start_p = kstrstr(source,buf1))==NULL)
1614 return FALSE;
1615
1616//check if current config line is marked by "#" ??
1617for(ii=1;;ii++) {
1618 if(memcmp(start_p-ii,"\n",1)==0)
1619 break;
1620 if(memcmp(start_p-ii,"#",1)==0)
1621 return FALSE;
1622}
1623
1624//find target string end point
1625 if((end_p = kstrstr(start_p,"\n"))==NULL) { //cann't find "\n",but don't care
1626 end_p=start_p+strlen(start_p); //no include "\n"
1627 }
1628
1629 memset(buf2,0,100);
1630 memcpy(buf2,start_p,end_p-start_p); //get the tartget line
1631 buf2[end_p-start_p]='\0';
1632
1633 //find value
1634 if((start_p = kstrstr(buf2,"="))==NULL)
1635 return FALSE;
1636 memset(buf1,0,100);
1637 strcpy(buf1,start_p+1);
1638
1639 //except space
1640 tmp_p = buf1;
1641 while(*tmp_p != 0x00) {
1642 if(*tmp_p==' ')
1643 tmp_p++;
1644 else
1645 break;
1646 }
1647
1648 memcpy(dest,tmp_p,strlen(tmp_p));
1649 return TRUE;
1650}
1651
1652//if read fail,return NULL,or return data pointer;
1653static UCHAR *Config_FileOperation(PSDevice pDevice) {
1654 UCHAR *config_path=CONFIG_PATH;
1655 UCHAR *buffer=NULL;
1656 struct file *filp=NULL;
1657 mm_segment_t old_fs = get_fs();
1658 int oldfsuid=0,oldfsgid=0;
1659 int result=0;
1660
1661 set_fs (KERNEL_DS);
1662//Make sure a caller can read or write power as root
1663 oldfsuid=current->fsuid;
1664 oldfsgid=current->fsgid;
1665 current->fsuid = 0;
1666 current->fsgid = 0;
1667
1668 //open file
1669 filp = filp_open(config_path, O_RDWR, 0);
1670 if (IS_ERR(filp)) {
1671 printk("Config_FileOperation file Not exist\n");
1672 result=-1;
1673 goto error2;
1674 }
1675
1676 if(!(filp->f_op) || !(filp->f_op->read) ||!(filp->f_op->write)) {
1677 printk("file %s cann't readable or writable?\n",config_path);
1678 result = -1;
1679 goto error1;
1680 }
1681
1682 buffer = (UCHAR *)kmalloc(1024, GFP_KERNEL);
1683 if(buffer==NULL) {
1684 printk("alllocate mem for file fail?\n");
1685 result = -1;
1686 goto error1;
1687 }
1688
1689 if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
1690 printk("read file error?\n");
1691 result = -1;
1692 }
1693
1694error1:
1695 if(filp_close(filp,NULL))
1696 printk("Config_FileOperation:close file fail\n");
1697
1698error2:
1699 set_fs (old_fs);
1700 current->fsuid=oldfsuid;
1701 current->fsgid=oldfsgid;
1702
1703if(result!=0) {
1704 if(buffer)
1705 kfree(buffer);
1706 buffer=NULL;
1707}
1708 return buffer;
1709}
1710
1711//return --->-1:fail; >=0:sucessful
1712static int Read_config_file(PSDevice pDevice) {
1713 int result=0;
1714 UCHAR tmpbuffer[100];
1715 UCHAR *buffer=NULL;
1716
1717 //init config setting
1718 pDevice->config_file.ZoneType = -1;
1719 pDevice->config_file.eAuthenMode = -1;
1720 pDevice->config_file.eEncryptionStatus = -1;
1721
1722 if((buffer=Config_FileOperation(pDevice)) ==NULL) {
1723 result =-1;
1724 return result;
1725 }
1726
1727//get zonetype
1728{
1729 memset(tmpbuffer,0,sizeof(tmpbuffer));
1730 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer) ==TRUE) {
1731 if(memcmp(tmpbuffer,"USA",3)==0) {
1732 pDevice->config_file.ZoneType=ZoneType_USA;
1733 }
1734 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
1735 pDevice->config_file.ZoneType=ZoneType_Japan;
1736 }
1737 else if(memcmp(tmpbuffer,"EUROPE",6)==0) {
1738 pDevice->config_file.ZoneType=ZoneType_Europe;
1739 }
1740 else {
1741 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
1742 }
1743 }
1744}
1745
1746#if 1
1747//get other parameter
1748 {
1749 memset(tmpbuffer,0,sizeof(tmpbuffer));
1750 if(Config_FileGetParameter("AUTHENMODE",tmpbuffer,buffer)==TRUE) {
1751 pDevice->config_file.eAuthenMode = (int) simple_strtol(tmpbuffer, NULL, 10);
1752 }
1753
1754 memset(tmpbuffer,0,sizeof(tmpbuffer));
1755 if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer,buffer)==TRUE) {
1756 pDevice->config_file.eEncryptionStatus= (int) simple_strtol(tmpbuffer, NULL, 10);
1757 }
1758 }
1759#endif
1760
1761 kfree(buffer);
1762 return result;
1763}
1764
1765static void device_set_multi(struct net_device *dev) {
1766 PSDevice pDevice = (PSDevice) dev->priv;
1767 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1768 u32 mc_filter[2];
1769 int ii;
1770 struct dev_mc_list *mclist;
1771 BYTE pbyData[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
1772 BYTE byTmpMode = 0;
1773 int rc;
1774
1775
1776 spin_lock_irq(&pDevice->lock);
1777 rc = CONTROLnsRequestIn(pDevice,
1778 MESSAGE_TYPE_READ,
1779 MAC_REG_RCR,
1780 MESSAGE_REQUEST_MACREG,
1781 1,
1782 &byTmpMode
1783 );
1784 if (rc == 0) pDevice->byRxMode = byTmpMode;
1785
1786 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode in= %x\n", pDevice->byRxMode);
1787
1788 if (dev->flags & IFF_PROMISC) { // Set promiscuous.
1789 DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
1790 // Unconditionally log net taps.
1791 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
1792 }
1793 else if ((dev->mc_count > pDevice->multicast_limit) || (dev->flags & IFF_ALLMULTI)) {
1794 CONTROLnsRequestOut(pDevice,
1795 MESSAGE_TYPE_WRITE,
1796 MAC_REG_MAR0,
1797 MESSAGE_REQUEST_MACREG,
1798 8,
1799 pbyData
1800 );
1801 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1802 }
1803 else {
1804 memset(mc_filter, 0, sizeof(mc_filter));
1805 for (ii = 0, mclist = dev->mc_list; mclist && ii < dev->mc_count;
1806 ii++, mclist = mclist->next) {
1807 int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
1808 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
1809 }
1810 for (ii = 0; ii < 4; ii++) {
1811 MACvWriteMultiAddr(pDevice, ii, *((PBYTE)&mc_filter[0] + ii));
1812 MACvWriteMultiAddr(pDevice, ii+ 4, *((PBYTE)&mc_filter[1] + ii));
1813 }
1814 pDevice->byRxMode &= ~(RCR_UNICAST);
1815 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1816 }
1817
1818 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1819 // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
1820 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1821 pDevice->byRxMode &= ~(RCR_UNICAST);
1822 }
1823 ControlvWriteByte(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_RCR, pDevice->byRxMode);
1824 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode out= %x\n", pDevice->byRxMode);
1825 spin_unlock_irq(&pDevice->lock);
1826
1827}
1828
1829
1830static struct net_device_stats *device_get_stats(struct net_device *dev) {
1831 PSDevice pDevice=(PSDevice) dev->priv;
1832
1833 return &pDevice->stats;
1834}
1835
1836
1837static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
1838 PSDevice pDevice = (PSDevice)dev->priv;
1839 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1840 PSCmdRequest pReq;
1841 //BOOL bCommit = FALSE;
1842#ifdef WIRELESS_EXT
1843 struct iwreq *wrq = (struct iwreq *) rq;
1844 int rc =0;
1845#endif //WIRELESS_EXT
1846
1847
1848 if (pMgmt == NULL) {
1849 rc = -EFAULT;
1850 return rc;
1851 }
1852
1853 switch(cmd) {
1854
1855#ifdef WIRELESS_EXT
1856//#if WIRELESS_EXT < 13
1857
1858 case SIOCGIWNAME:
1859 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
1860 break;
1861
1862 case SIOCSIWNWID:
1863 rc = -EOPNOTSUPP;
1864 break;
1865
1866 case SIOCGIWNWID: //0x8b03 support
1867 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1868 rc = iwctl_giwnwid(dev, NULL, &(wrq->u.nwid), NULL);
1869 #else
1870 rc = -EOPNOTSUPP;
1871 #endif
1872 break;
1873
1874 // Set frequency/channel
1875 case SIOCSIWFREQ:
1876 rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
1877 break;
1878
1879 // Get frequency/channel
1880 case SIOCGIWFREQ:
1881 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
1882 break;
1883
1884 // Set desired network name (ESSID)
1885 case SIOCSIWESSID:
1886
1887 {
1888 char essid[IW_ESSID_MAX_SIZE+1];
1889 if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
1890 rc = -E2BIG;
1891 break;
1892 }
1893 if (copy_from_user(essid, wrq->u.essid.pointer,
1894 wrq->u.essid.length)) {
1895 rc = -EFAULT;
1896 break;
1897 }
1898 rc = iwctl_siwessid(dev, NULL,
1899 &(wrq->u.essid), essid);
1900 }
1901 break;
1902
1903
1904 // Get current network name (ESSID)
1905 case SIOCGIWESSID:
1906
1907 {
1908 char essid[IW_ESSID_MAX_SIZE+1];
1909 if (wrq->u.essid.pointer)
1910 rc = iwctl_giwessid(dev, NULL,
1911 &(wrq->u.essid), essid);
1912 if (copy_to_user(wrq->u.essid.pointer,
1913 essid,
1914 wrq->u.essid.length) )
1915 rc = -EFAULT;
1916 }
1917 break;
1918
1919 case SIOCSIWAP:
1920
1921 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1922 break;
1923
1924
1925 // Get current Access Point (BSSID)
1926 case SIOCGIWAP:
1927 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1928 break;
1929
1930
1931 // Set desired station name
1932 case SIOCSIWNICKN:
1933 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
1934 rc = -EOPNOTSUPP;
1935 break;
1936
1937 // Get current station name
1938 case SIOCGIWNICKN:
1939 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
1940 rc = -EOPNOTSUPP;
1941 break;
1942
1943 // Set the desired bit-rate
1944 case SIOCSIWRATE:
1945 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1946 break;
1947
1948 // Get the current bit-rate
1949 case SIOCGIWRATE:
1950
1951 rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1952 break;
1953
1954 // Set the desired RTS threshold
1955 case SIOCSIWRTS:
1956
1957 rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
1958 break;
1959
1960 // Get the current RTS threshold
1961 case SIOCGIWRTS:
1962
1963 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
1964 break;
1965
1966 // Set the desired fragmentation threshold
1967 case SIOCSIWFRAG:
1968
1969 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
1970 break;
1971
1972 // Get the current fragmentation threshold
1973 case SIOCGIWFRAG:
1974
1975 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
1976 break;
1977
1978 // Set mode of operation
1979 case SIOCSIWMODE:
1980 rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
1981 break;
1982
1983 // Get mode of operation
1984 case SIOCGIWMODE:
1985 rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
1986 break;
1987
1988 // Set WEP keys and mode
1989 case SIOCSIWENCODE:
1990 {
1991 char abyKey[WLAN_WEP232_KEYLEN];
1992
1993 if (wrq->u.encoding.pointer) {
1994
1995
1996 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
1997 rc = -E2BIG;
1998 break;
1999 }
2000 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
2001 if (copy_from_user(abyKey,
2002 wrq->u.encoding.pointer,
2003 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_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
2012 }
2013 break;
2014
2015 // Get the WEP keys and mode
2016 case SIOCGIWENCODE:
2017
2018 if (!capable(CAP_NET_ADMIN)) {
2019 rc = -EPERM;
2020 break;
2021 }
2022 {
2023 char abyKey[WLAN_WEP232_KEYLEN];
2024
2025 rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
2026 if (rc != 0) break;
2027 if (wrq->u.encoding.pointer) {
2028 if (copy_to_user(wrq->u.encoding.pointer,
2029 abyKey,
2030 wrq->u.encoding.length))
2031 rc = -EFAULT;
2032 }
2033 }
2034 break;
2035
2036#if WIRELESS_EXT > 9
2037 // Get the current Tx-Power
2038 case SIOCGIWTXPOW:
2039 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
2040 rc = -EOPNOTSUPP;
2041 break;
2042
2043 case SIOCSIWTXPOW:
2044 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
2045 rc = -EOPNOTSUPP;
2046 break;
2047
2048#endif // WIRELESS_EXT > 9
2049
2050#if WIRELESS_EXT > 10
2051 case SIOCSIWRETRY:
2052
2053 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
2054 break;
2055
2056 case SIOCGIWRETRY:
2057
2058 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
2059 break;
2060
2061#endif // WIRELESS_EXT > 10
2062
2063 // Get range of parameters
2064 case SIOCGIWRANGE:
2065
2066 {
2067 struct iw_range range;
2068
2069 rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *) &range);
2070 if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
2071 rc = -EFAULT;
2072 }
2073
2074 break;
2075
2076 case SIOCGIWPOWER:
2077
2078 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
2079 break;
2080
2081
2082 case SIOCSIWPOWER:
2083
2084 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
2085 break;
2086
2087
2088 case SIOCGIWSENS:
2089
2090 rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
2091 break;
2092
2093 case SIOCSIWSENS:
2094 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
2095 rc = -EOPNOTSUPP;
2096 break;
2097
2098 case SIOCGIWAPLIST:
2099 {
2100 char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
2101
2102 if (wrq->u.data.pointer) {
2103 rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
2104 if (rc == 0) {
2105 if (copy_to_user(wrq->u.data.pointer,
2106 buffer,
2107 (wrq->u.data.length * (sizeof(struct sockaddr) + sizeof(struct iw_quality)))
2108 ))
2109 rc = -EFAULT;
2110 }
2111 }
2112 }
2113 break;
2114
2115
2116#ifdef WIRELESS_SPY
2117 // Set the spy list
2118 case SIOCSIWSPY:
2119
2120 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
2121 rc = -EOPNOTSUPP;
2122 break;
2123
2124 // Get the spy list
2125 case SIOCGIWSPY:
2126
2127 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
2128 rc = -EOPNOTSUPP;
2129 break;
2130
2131#endif // WIRELESS_SPY
2132
2133 case SIOCGIWPRIV:
2134 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
2135 rc = -EOPNOTSUPP;
2136/*
2137 if(wrq->u.data.pointer) {
2138 wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
2139
2140 if(copy_to_user(wrq->u.data.pointer,
2141 (u_char *) iwctl_private_args,
2142 sizeof(iwctl_private_args)))
2143 rc = -EFAULT;
2144 }
2145*/
2146 break;
2147
2148
2149//#endif // WIRELESS_EXT < 13
2150
2151//2008-0409-07, <Add> by Einsn Liu
2152#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2153 case SIOCSIWAUTH:
2154 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH \n");
2155 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
2156 break;
2157
2158 case SIOCGIWAUTH:
2159 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
2160 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
2161 break;
2162
2163 case SIOCSIWGENIE:
2164 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
2165 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2166 break;
2167
2168 case SIOCGIWGENIE:
2169 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
2170 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2171 break;
2172
2173 case SIOCSIWENCODEEXT:
2174 {
2175 char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
2176 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
2177 if(wrq->u.encoding.pointer){
2178 memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1);
2179 if(wrq->u.encoding.length > (sizeof(struct iw_encode_ext)+ MAX_KEY_LEN)){
2180 rc = -E2BIG;
2181 break;
2182 }
2183 if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
2184 rc = -EFAULT;
2185 break;
2186 }
2187 }else if(wrq->u.encoding.length != 0){
2188 rc = -EINVAL;
2189 break;
2190 }
2191 rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
2192 }
2193 break;
2194
2195 case SIOCGIWENCODEEXT:
2196 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
2197 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
2198 break;
2199
2200 case SIOCSIWMLME:
2201 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
2202 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2203 break;
2204
2205#endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2206//End Add -- //2008-0409-07, <Add> by Einsn Liu
2207
2208#endif // WIRELESS_EXT
2209
2210 case IOCTL_CMD_TEST:
2211
2212 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2213 rc = -EFAULT;
2214 break;
2215 } else {
2216 rc = 0;
2217 }
2218 pReq = (PSCmdRequest)rq;
2219
2220 //20080130-01,<Remark> by Mike Liu
2221 // if(pDevice->bLinkPass==TRUE)
2222 pReq->wResult = MAGIC_CODE; //Linking status:0x3142
2223 //20080130-02,<Remark> by Mike Liu
2224 // else
2225 // pReq->wResult = MAGIC_CODE+1; //disconnect status:0x3143
2226 break;
2227
2228 case IOCTL_CMD_SET:
2229 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
2230 (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
2231 {
2232 rc = -EFAULT;
2233 break;
2234 } else {
2235 rc = 0;
2236 }
2237
2238 if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
2239 return -EBUSY;
2240 }
2241 rc = private_ioctl(pDevice, rq);
2242 clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
2243 break;
2244
2245 case IOCTL_CMD_HOSTAPD:
2246
2247 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2248 rc = -EFAULT;
2249 break;
2250 } else {
2251 rc = 0;
2252 }
2253
2254#if WIRELESS_EXT > 8
2255 rc = hostap_ioctl(pDevice, &wrq->u.data);
2256#else // WIRELESS_EXT > 8
2257 rc = hostap_ioctl(pDevice, (struct iw_point *) &wrq->u.data);
2258#endif // WIRELESS_EXT > 8
2259 break;
2260
2261 case IOCTL_CMD_WPA:
2262
2263 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2264 rc = -EFAULT;
2265 break;
2266 } else {
2267 rc = 0;
2268 }
2269
2270#if WIRELESS_EXT > 8
2271 rc = wpa_ioctl(pDevice, &wrq->u.data);
2272#else // WIRELESS_EXT > 8
2273 rc = wpa_ioctl(pDevice, (struct iw_point *) &wrq->u.data);
2274#endif // WIRELESS_EXT > 8
2275 break;
2276
2277 case SIOCETHTOOL:
2278 return ethtool_ioctl(dev, (void *) rq->ifr_data);
2279 // All other calls are currently unsupported
2280
2281 default:
2282 rc = -EOPNOTSUPP;
2283 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
2284
2285
2286 }
2287
2288 if (pDevice->bCommit) {
2289 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2290 netif_stop_queue(pDevice->dev);
2291 spin_lock_irq(&pDevice->lock);
2292 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RUN_AP, NULL);
2293 spin_unlock_irq(&pDevice->lock);
2294 }
2295 else {
2296 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
2297 spin_lock_irq(&pDevice->lock);
2298//2007-1121-01<Modify>by EinsnLiu
2299 if (pDevice->bLinkPass&&
2300 memcmp(pMgmt->abyCurrSSID,pMgmt->abyDesireSSID,WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN)) {
2301 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
2302 } else {
2303 pDevice->bLinkPass = FALSE;
2304 pMgmt->eCurrState = WMAC_STATE_IDLE;
2305 memset(pMgmt->abyCurrBSSID, 0, 6);
2306 }
2307 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
2308//End Modify
2309 netif_stop_queue(pDevice->dev);
2310#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2311 pMgmt->eScanType = WMAC_SCAN_ACTIVE;
2312 if(pDevice->bWPASuppWextEnabled !=TRUE)
2313#endif
2314 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
2315 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, NULL);
2316 spin_unlock_irq(&pDevice->lock);
2317 }
2318 pDevice->bCommit = FALSE;
2319 }
2320
2321
2322 return rc;
2323}
2324
2325
2326static int ethtool_ioctl(struct net_device *dev, void *useraddr)
2327{
2328 u32 ethcmd;
2329
2330 if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
2331 return -EFAULT;
2332
2333 switch (ethcmd) {
2334 case ETHTOOL_GDRVINFO: {
2335 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
2336 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
2337 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
2338 if (copy_to_user(useraddr, &info, sizeof(info)))
2339 return -EFAULT;
2340 return 0;
2341 }
2342
2343 }
2344
2345 return -EOPNOTSUPP;
2346}
2347
2348
2349/*------------------------------------------------------------------*/
2350
2351
2352MODULE_DEVICE_TABLE(usb, vntwusb_table);
2353
2354
2355#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
2356
2357static struct usb_driver vntwusb_driver = {
2358#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
2359 .owner = THIS_MODULE,
2360#endif
2361 .name = DEVICE_NAME,
2362 .probe = vntwusb_found1,
2363 .disconnect = vntwusb_disconnect,
2364 .id_table = vntwusb_table,
2365
2366//2008-0920-01<Add>by MikeLiu
2367//for supporting S3 & S4 function
2368#ifdef CONFIG_PM
2369 .suspend = vntwusb_suspend,
2370 .resume = vntwusb_resume,
2371#endif
2372};
2373
2374#else
2375
2376static struct usb_driver vntwusb_driver = {
2377 name: DEVICE_NAME,
2378 probe: vntwusb_found1,
2379 disconnect: vntwusb_disconnect,
2380 id_table: vntwusb_table,
2381};
2382
2383#endif
2384
2385static int __init vntwusb_init_module(void)
2386{
2387 info(DEVICE_FULL_DRV_NAM " " DEVICE_VERSION);
2388 return usb_register(&vntwusb_driver);
2389}
2390
2391static void __exit vntwusb_cleanup_module(void)
2392{
2393 usb_deregister(&vntwusb_driver);
2394}
2395
2396module_init(vntwusb_init_module);
2397module_exit(vntwusb_cleanup_module);
2398