blob: f181d237e9efa7369ee420c66ffa0410aa65d5dd [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();
Forest Bond8f9c4662009-06-13 07:38:47 -04001658 //int oldfsuid=0,oldfsgid=0;
Forest Bond92b96792009-06-13 07:38:31 -04001659 int result=0;
1660
1661 set_fs (KERNEL_DS);
Forest Bond8f9c4662009-06-13 07:38:47 -04001662 /* Can't do this anymore, so we rely on correct filesystem permissions:
1663 //Make sure a caller can read or write power as root
1664 oldfsuid=current->fsuid;
1665 oldfsgid=current->fsgid;
Forest Bond92b96792009-06-13 07:38:31 -04001666 current->fsuid = 0;
1667 current->fsgid = 0;
Forest Bond8f9c4662009-06-13 07:38:47 -04001668 */
Forest Bond92b96792009-06-13 07:38:31 -04001669
1670 //open file
1671 filp = filp_open(config_path, O_RDWR, 0);
1672 if (IS_ERR(filp)) {
1673 printk("Config_FileOperation file Not exist\n");
1674 result=-1;
1675 goto error2;
1676 }
1677
1678 if(!(filp->f_op) || !(filp->f_op->read) ||!(filp->f_op->write)) {
1679 printk("file %s cann't readable or writable?\n",config_path);
1680 result = -1;
1681 goto error1;
1682 }
1683
1684 buffer = (UCHAR *)kmalloc(1024, GFP_KERNEL);
1685 if(buffer==NULL) {
1686 printk("alllocate mem for file fail?\n");
1687 result = -1;
1688 goto error1;
1689 }
1690
1691 if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
1692 printk("read file error?\n");
1693 result = -1;
1694 }
1695
1696error1:
1697 if(filp_close(filp,NULL))
1698 printk("Config_FileOperation:close file fail\n");
1699
1700error2:
1701 set_fs (old_fs);
Forest Bond8f9c4662009-06-13 07:38:47 -04001702
1703 /*
Forest Bond92b96792009-06-13 07:38:31 -04001704 current->fsuid=oldfsuid;
1705 current->fsgid=oldfsgid;
Forest Bond8f9c4662009-06-13 07:38:47 -04001706 */
Forest Bond92b96792009-06-13 07:38:31 -04001707
1708if(result!=0) {
1709 if(buffer)
1710 kfree(buffer);
1711 buffer=NULL;
1712}
1713 return buffer;
1714}
1715
1716//return --->-1:fail; >=0:sucessful
1717static int Read_config_file(PSDevice pDevice) {
1718 int result=0;
1719 UCHAR tmpbuffer[100];
1720 UCHAR *buffer=NULL;
1721
1722 //init config setting
1723 pDevice->config_file.ZoneType = -1;
1724 pDevice->config_file.eAuthenMode = -1;
1725 pDevice->config_file.eEncryptionStatus = -1;
1726
1727 if((buffer=Config_FileOperation(pDevice)) ==NULL) {
1728 result =-1;
1729 return result;
1730 }
1731
1732//get zonetype
1733{
1734 memset(tmpbuffer,0,sizeof(tmpbuffer));
1735 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer) ==TRUE) {
1736 if(memcmp(tmpbuffer,"USA",3)==0) {
1737 pDevice->config_file.ZoneType=ZoneType_USA;
1738 }
1739 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
1740 pDevice->config_file.ZoneType=ZoneType_Japan;
1741 }
1742 else if(memcmp(tmpbuffer,"EUROPE",6)==0) {
1743 pDevice->config_file.ZoneType=ZoneType_Europe;
1744 }
1745 else {
1746 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
1747 }
1748 }
1749}
1750
1751#if 1
1752//get other parameter
1753 {
1754 memset(tmpbuffer,0,sizeof(tmpbuffer));
1755 if(Config_FileGetParameter("AUTHENMODE",tmpbuffer,buffer)==TRUE) {
1756 pDevice->config_file.eAuthenMode = (int) simple_strtol(tmpbuffer, NULL, 10);
1757 }
1758
1759 memset(tmpbuffer,0,sizeof(tmpbuffer));
1760 if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer,buffer)==TRUE) {
1761 pDevice->config_file.eEncryptionStatus= (int) simple_strtol(tmpbuffer, NULL, 10);
1762 }
1763 }
1764#endif
1765
1766 kfree(buffer);
1767 return result;
1768}
1769
1770static void device_set_multi(struct net_device *dev) {
1771 PSDevice pDevice = (PSDevice) dev->priv;
1772 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1773 u32 mc_filter[2];
1774 int ii;
1775 struct dev_mc_list *mclist;
1776 BYTE pbyData[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
1777 BYTE byTmpMode = 0;
1778 int rc;
1779
1780
1781 spin_lock_irq(&pDevice->lock);
1782 rc = CONTROLnsRequestIn(pDevice,
1783 MESSAGE_TYPE_READ,
1784 MAC_REG_RCR,
1785 MESSAGE_REQUEST_MACREG,
1786 1,
1787 &byTmpMode
1788 );
1789 if (rc == 0) pDevice->byRxMode = byTmpMode;
1790
1791 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode in= %x\n", pDevice->byRxMode);
1792
1793 if (dev->flags & IFF_PROMISC) { // Set promiscuous.
1794 DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
1795 // Unconditionally log net taps.
1796 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
1797 }
1798 else if ((dev->mc_count > pDevice->multicast_limit) || (dev->flags & IFF_ALLMULTI)) {
1799 CONTROLnsRequestOut(pDevice,
1800 MESSAGE_TYPE_WRITE,
1801 MAC_REG_MAR0,
1802 MESSAGE_REQUEST_MACREG,
1803 8,
1804 pbyData
1805 );
1806 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1807 }
1808 else {
1809 memset(mc_filter, 0, sizeof(mc_filter));
1810 for (ii = 0, mclist = dev->mc_list; mclist && ii < dev->mc_count;
1811 ii++, mclist = mclist->next) {
1812 int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
1813 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
1814 }
1815 for (ii = 0; ii < 4; ii++) {
1816 MACvWriteMultiAddr(pDevice, ii, *((PBYTE)&mc_filter[0] + ii));
1817 MACvWriteMultiAddr(pDevice, ii+ 4, *((PBYTE)&mc_filter[1] + ii));
1818 }
1819 pDevice->byRxMode &= ~(RCR_UNICAST);
1820 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1821 }
1822
1823 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1824 // If AP mode, don't enable RCR_UNICAST. Since hw only compare addr1 with local mac.
1825 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1826 pDevice->byRxMode &= ~(RCR_UNICAST);
1827 }
1828 ControlvWriteByte(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_RCR, pDevice->byRxMode);
1829 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode out= %x\n", pDevice->byRxMode);
1830 spin_unlock_irq(&pDevice->lock);
1831
1832}
1833
1834
1835static struct net_device_stats *device_get_stats(struct net_device *dev) {
1836 PSDevice pDevice=(PSDevice) dev->priv;
1837
1838 return &pDevice->stats;
1839}
1840
1841
1842static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) {
1843 PSDevice pDevice = (PSDevice)dev->priv;
1844 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1845 PSCmdRequest pReq;
1846 //BOOL bCommit = FALSE;
1847#ifdef WIRELESS_EXT
1848 struct iwreq *wrq = (struct iwreq *) rq;
1849 int rc =0;
1850#endif //WIRELESS_EXT
1851
1852
1853 if (pMgmt == NULL) {
1854 rc = -EFAULT;
1855 return rc;
1856 }
1857
1858 switch(cmd) {
1859
1860#ifdef WIRELESS_EXT
1861//#if WIRELESS_EXT < 13
1862
1863 case SIOCGIWNAME:
1864 rc = iwctl_giwname(dev, NULL, (char *)&(wrq->u.name), NULL);
1865 break;
1866
1867 case SIOCSIWNWID:
1868 rc = -EOPNOTSUPP;
1869 break;
1870
1871 case SIOCGIWNWID: //0x8b03 support
1872 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1873 rc = iwctl_giwnwid(dev, NULL, &(wrq->u.nwid), NULL);
1874 #else
1875 rc = -EOPNOTSUPP;
1876 #endif
1877 break;
1878
1879 // Set frequency/channel
1880 case SIOCSIWFREQ:
1881 rc = iwctl_siwfreq(dev, NULL, &(wrq->u.freq), NULL);
1882 break;
1883
1884 // Get frequency/channel
1885 case SIOCGIWFREQ:
1886 rc = iwctl_giwfreq(dev, NULL, &(wrq->u.freq), NULL);
1887 break;
1888
1889 // Set desired network name (ESSID)
1890 case SIOCSIWESSID:
1891
1892 {
1893 char essid[IW_ESSID_MAX_SIZE+1];
1894 if (wrq->u.essid.length > IW_ESSID_MAX_SIZE) {
1895 rc = -E2BIG;
1896 break;
1897 }
1898 if (copy_from_user(essid, wrq->u.essid.pointer,
1899 wrq->u.essid.length)) {
1900 rc = -EFAULT;
1901 break;
1902 }
1903 rc = iwctl_siwessid(dev, NULL,
1904 &(wrq->u.essid), essid);
1905 }
1906 break;
1907
1908
1909 // Get current network name (ESSID)
1910 case SIOCGIWESSID:
1911
1912 {
1913 char essid[IW_ESSID_MAX_SIZE+1];
1914 if (wrq->u.essid.pointer)
1915 rc = iwctl_giwessid(dev, NULL,
1916 &(wrq->u.essid), essid);
1917 if (copy_to_user(wrq->u.essid.pointer,
1918 essid,
1919 wrq->u.essid.length) )
1920 rc = -EFAULT;
1921 }
1922 break;
1923
1924 case SIOCSIWAP:
1925
1926 rc = iwctl_siwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1927 break;
1928
1929
1930 // Get current Access Point (BSSID)
1931 case SIOCGIWAP:
1932 rc = iwctl_giwap(dev, NULL, &(wrq->u.ap_addr), NULL);
1933 break;
1934
1935
1936 // Set desired station name
1937 case SIOCSIWNICKN:
1938 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWNICKN \n");
1939 rc = -EOPNOTSUPP;
1940 break;
1941
1942 // Get current station name
1943 case SIOCGIWNICKN:
1944 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWNICKN \n");
1945 rc = -EOPNOTSUPP;
1946 break;
1947
1948 // Set the desired bit-rate
1949 case SIOCSIWRATE:
1950 rc = iwctl_siwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1951 break;
1952
1953 // Get the current bit-rate
1954 case SIOCGIWRATE:
1955
1956 rc = iwctl_giwrate(dev, NULL, &(wrq->u.bitrate), NULL);
1957 break;
1958
1959 // Set the desired RTS threshold
1960 case SIOCSIWRTS:
1961
1962 rc = iwctl_siwrts(dev, NULL, &(wrq->u.rts), NULL);
1963 break;
1964
1965 // Get the current RTS threshold
1966 case SIOCGIWRTS:
1967
1968 rc = iwctl_giwrts(dev, NULL, &(wrq->u.rts), NULL);
1969 break;
1970
1971 // Set the desired fragmentation threshold
1972 case SIOCSIWFRAG:
1973
1974 rc = iwctl_siwfrag(dev, NULL, &(wrq->u.frag), NULL);
1975 break;
1976
1977 // Get the current fragmentation threshold
1978 case SIOCGIWFRAG:
1979
1980 rc = iwctl_giwfrag(dev, NULL, &(wrq->u.frag), NULL);
1981 break;
1982
1983 // Set mode of operation
1984 case SIOCSIWMODE:
1985 rc = iwctl_siwmode(dev, NULL, &(wrq->u.mode), NULL);
1986 break;
1987
1988 // Get mode of operation
1989 case SIOCGIWMODE:
1990 rc = iwctl_giwmode(dev, NULL, &(wrq->u.mode), NULL);
1991 break;
1992
1993 // Set WEP keys and mode
1994 case SIOCSIWENCODE:
1995 {
1996 char abyKey[WLAN_WEP232_KEYLEN];
1997
1998 if (wrq->u.encoding.pointer) {
1999
2000
2001 if (wrq->u.encoding.length > WLAN_WEP232_KEYLEN) {
2002 rc = -E2BIG;
2003 break;
2004 }
2005 memset(abyKey, 0, WLAN_WEP232_KEYLEN);
2006 if (copy_from_user(abyKey,
2007 wrq->u.encoding.pointer,
2008 wrq->u.encoding.length)) {
2009 rc = -EFAULT;
2010 break;
2011 }
2012 } else if (wrq->u.encoding.length != 0) {
2013 rc = -EINVAL;
2014 break;
2015 }
2016 rc = iwctl_siwencode(dev, NULL, &(wrq->u.encoding), abyKey);
2017 }
2018 break;
2019
2020 // Get the WEP keys and mode
2021 case SIOCGIWENCODE:
2022
2023 if (!capable(CAP_NET_ADMIN)) {
2024 rc = -EPERM;
2025 break;
2026 }
2027 {
2028 char abyKey[WLAN_WEP232_KEYLEN];
2029
2030 rc = iwctl_giwencode(dev, NULL, &(wrq->u.encoding), abyKey);
2031 if (rc != 0) break;
2032 if (wrq->u.encoding.pointer) {
2033 if (copy_to_user(wrq->u.encoding.pointer,
2034 abyKey,
2035 wrq->u.encoding.length))
2036 rc = -EFAULT;
2037 }
2038 }
2039 break;
2040
2041#if WIRELESS_EXT > 9
2042 // Get the current Tx-Power
2043 case SIOCGIWTXPOW:
2044 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
2045 rc = -EOPNOTSUPP;
2046 break;
2047
2048 case SIOCSIWTXPOW:
2049 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWTXPOW \n");
2050 rc = -EOPNOTSUPP;
2051 break;
2052
2053#endif // WIRELESS_EXT > 9
2054
2055#if WIRELESS_EXT > 10
2056 case SIOCSIWRETRY:
2057
2058 rc = iwctl_siwretry(dev, NULL, &(wrq->u.retry), NULL);
2059 break;
2060
2061 case SIOCGIWRETRY:
2062
2063 rc = iwctl_giwretry(dev, NULL, &(wrq->u.retry), NULL);
2064 break;
2065
2066#endif // WIRELESS_EXT > 10
2067
2068 // Get range of parameters
2069 case SIOCGIWRANGE:
2070
2071 {
2072 struct iw_range range;
2073
2074 rc = iwctl_giwrange(dev, NULL, &(wrq->u.data), (char *) &range);
2075 if (copy_to_user(wrq->u.data.pointer, &range, sizeof(struct iw_range)))
2076 rc = -EFAULT;
2077 }
2078
2079 break;
2080
2081 case SIOCGIWPOWER:
2082
2083 rc = iwctl_giwpower(dev, NULL, &(wrq->u.power), NULL);
2084 break;
2085
2086
2087 case SIOCSIWPOWER:
2088
2089 rc = iwctl_siwpower(dev, NULL, &(wrq->u.power), NULL);
2090 break;
2091
2092
2093 case SIOCGIWSENS:
2094
2095 rc = iwctl_giwsens(dev, NULL, &(wrq->u.sens), NULL);
2096 break;
2097
2098 case SIOCSIWSENS:
2099 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSENS \n");
2100 rc = -EOPNOTSUPP;
2101 break;
2102
2103 case SIOCGIWAPLIST:
2104 {
2105 char buffer[IW_MAX_AP * (sizeof(struct sockaddr) + sizeof(struct iw_quality))];
2106
2107 if (wrq->u.data.pointer) {
2108 rc = iwctl_giwaplist(dev, NULL, &(wrq->u.data), buffer);
2109 if (rc == 0) {
2110 if (copy_to_user(wrq->u.data.pointer,
2111 buffer,
2112 (wrq->u.data.length * (sizeof(struct sockaddr) + sizeof(struct iw_quality)))
2113 ))
2114 rc = -EFAULT;
2115 }
2116 }
2117 }
2118 break;
2119
2120
2121#ifdef WIRELESS_SPY
2122 // Set the spy list
2123 case SIOCSIWSPY:
2124
2125 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
2126 rc = -EOPNOTSUPP;
2127 break;
2128
2129 // Get the spy list
2130 case SIOCGIWSPY:
2131
2132 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWSPY \n");
2133 rc = -EOPNOTSUPP;
2134 break;
2135
2136#endif // WIRELESS_SPY
2137
2138 case SIOCGIWPRIV:
2139 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPRIV \n");
2140 rc = -EOPNOTSUPP;
2141/*
2142 if(wrq->u.data.pointer) {
2143 wrq->u.data.length = sizeof(iwctl_private_args) / sizeof( iwctl_private_args[0]);
2144
2145 if(copy_to_user(wrq->u.data.pointer,
2146 (u_char *) iwctl_private_args,
2147 sizeof(iwctl_private_args)))
2148 rc = -EFAULT;
2149 }
2150*/
2151 break;
2152
2153
2154//#endif // WIRELESS_EXT < 13
2155
2156//2008-0409-07, <Add> by Einsn Liu
2157#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2158 case SIOCSIWAUTH:
2159 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH \n");
2160 rc = iwctl_siwauth(dev, NULL, &(wrq->u.param), NULL);
2161 break;
2162
2163 case SIOCGIWAUTH:
2164 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAUTH \n");
2165 rc = iwctl_giwauth(dev, NULL, &(wrq->u.param), NULL);
2166 break;
2167
2168 case SIOCSIWGENIE:
2169 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWGENIE \n");
2170 rc = iwctl_siwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2171 break;
2172
2173 case SIOCGIWGENIE:
2174 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWGENIE \n");
2175 rc = iwctl_giwgenie(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2176 break;
2177
2178 case SIOCSIWENCODEEXT:
2179 {
2180 char extra[sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1];
2181 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODEEXT \n");
2182 if(wrq->u.encoding.pointer){
2183 memset(extra, 0, sizeof(struct iw_encode_ext)+MAX_KEY_LEN+1);
2184 if(wrq->u.encoding.length > (sizeof(struct iw_encode_ext)+ MAX_KEY_LEN)){
2185 rc = -E2BIG;
2186 break;
2187 }
2188 if(copy_from_user(extra, wrq->u.encoding.pointer,wrq->u.encoding.length)){
2189 rc = -EFAULT;
2190 break;
2191 }
2192 }else if(wrq->u.encoding.length != 0){
2193 rc = -EINVAL;
2194 break;
2195 }
2196 rc = iwctl_siwencodeext(dev, NULL, &(wrq->u.encoding), extra);
2197 }
2198 break;
2199
2200 case SIOCGIWENCODEEXT:
2201 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODEEXT \n");
2202 rc = iwctl_giwencodeext(dev, NULL, &(wrq->u.encoding), NULL);
2203 break;
2204
2205 case SIOCSIWMLME:
2206 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME \n");
2207 rc = iwctl_siwmlme(dev, NULL, &(wrq->u.data), wrq->u.data.pointer);
2208 break;
2209
2210#endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2211//End Add -- //2008-0409-07, <Add> by Einsn Liu
2212
2213#endif // WIRELESS_EXT
2214
2215 case IOCTL_CMD_TEST:
2216
2217 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2218 rc = -EFAULT;
2219 break;
2220 } else {
2221 rc = 0;
2222 }
2223 pReq = (PSCmdRequest)rq;
2224
2225 //20080130-01,<Remark> by Mike Liu
2226 // if(pDevice->bLinkPass==TRUE)
2227 pReq->wResult = MAGIC_CODE; //Linking status:0x3142
2228 //20080130-02,<Remark> by Mike Liu
2229 // else
2230 // pReq->wResult = MAGIC_CODE+1; //disconnect status:0x3143
2231 break;
2232
2233 case IOCTL_CMD_SET:
2234 if (!(pDevice->flags & DEVICE_FLAGS_OPENED) &&
2235 (((PSCmdRequest)rq)->wCmdCode !=WLAN_CMD_SET_WPA))
2236 {
2237 rc = -EFAULT;
2238 break;
2239 } else {
2240 rc = 0;
2241 }
2242
2243 if (test_and_set_bit( 0, (void*)&(pMgmt->uCmdBusy))) {
2244 return -EBUSY;
2245 }
2246 rc = private_ioctl(pDevice, rq);
2247 clear_bit( 0, (void*)&(pMgmt->uCmdBusy));
2248 break;
2249
2250 case IOCTL_CMD_HOSTAPD:
2251
2252 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2253 rc = -EFAULT;
2254 break;
2255 } else {
2256 rc = 0;
2257 }
2258
2259#if WIRELESS_EXT > 8
2260 rc = hostap_ioctl(pDevice, &wrq->u.data);
2261#else // WIRELESS_EXT > 8
2262 rc = hostap_ioctl(pDevice, (struct iw_point *) &wrq->u.data);
2263#endif // WIRELESS_EXT > 8
2264 break;
2265
2266 case IOCTL_CMD_WPA:
2267
2268 if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
2269 rc = -EFAULT;
2270 break;
2271 } else {
2272 rc = 0;
2273 }
2274
2275#if WIRELESS_EXT > 8
2276 rc = wpa_ioctl(pDevice, &wrq->u.data);
2277#else // WIRELESS_EXT > 8
2278 rc = wpa_ioctl(pDevice, (struct iw_point *) &wrq->u.data);
2279#endif // WIRELESS_EXT > 8
2280 break;
2281
2282 case SIOCETHTOOL:
2283 return ethtool_ioctl(dev, (void *) rq->ifr_data);
2284 // All other calls are currently unsupported
2285
2286 default:
2287 rc = -EOPNOTSUPP;
2288 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Ioctl command not support..%x\n", cmd);
2289
2290
2291 }
2292
2293 if (pDevice->bCommit) {
2294 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
2295 netif_stop_queue(pDevice->dev);
2296 spin_lock_irq(&pDevice->lock);
2297 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RUN_AP, NULL);
2298 spin_unlock_irq(&pDevice->lock);
2299 }
2300 else {
2301 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Commit the settings\n");
2302 spin_lock_irq(&pDevice->lock);
2303//2007-1121-01<Modify>by EinsnLiu
2304 if (pDevice->bLinkPass&&
2305 memcmp(pMgmt->abyCurrSSID,pMgmt->abyDesireSSID,WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN)) {
2306 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_DISASSOCIATE, NULL);
2307 } else {
2308 pDevice->bLinkPass = FALSE;
2309 pMgmt->eCurrState = WMAC_STATE_IDLE;
2310 memset(pMgmt->abyCurrBSSID, 0, 6);
2311 }
2312 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
2313//End Modify
2314 netif_stop_queue(pDevice->dev);
2315#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
2316 pMgmt->eScanType = WMAC_SCAN_ACTIVE;
2317 if(pDevice->bWPASuppWextEnabled !=TRUE)
2318#endif
2319 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
2320 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, NULL);
2321 spin_unlock_irq(&pDevice->lock);
2322 }
2323 pDevice->bCommit = FALSE;
2324 }
2325
2326
2327 return rc;
2328}
2329
2330
2331static int ethtool_ioctl(struct net_device *dev, void *useraddr)
2332{
2333 u32 ethcmd;
2334
2335 if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
2336 return -EFAULT;
2337
2338 switch (ethcmd) {
2339 case ETHTOOL_GDRVINFO: {
2340 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
2341 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
2342 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
2343 if (copy_to_user(useraddr, &info, sizeof(info)))
2344 return -EFAULT;
2345 return 0;
2346 }
2347
2348 }
2349
2350 return -EOPNOTSUPP;
2351}
2352
2353
2354/*------------------------------------------------------------------*/
2355
2356
2357MODULE_DEVICE_TABLE(usb, vntwusb_table);
2358
2359
2360#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
2361
2362static struct usb_driver vntwusb_driver = {
2363#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
2364 .owner = THIS_MODULE,
2365#endif
2366 .name = DEVICE_NAME,
2367 .probe = vntwusb_found1,
2368 .disconnect = vntwusb_disconnect,
2369 .id_table = vntwusb_table,
2370
2371//2008-0920-01<Add>by MikeLiu
2372//for supporting S3 & S4 function
2373#ifdef CONFIG_PM
2374 .suspend = vntwusb_suspend,
2375 .resume = vntwusb_resume,
2376#endif
2377};
2378
2379#else
2380
2381static struct usb_driver vntwusb_driver = {
2382 name: DEVICE_NAME,
2383 probe: vntwusb_found1,
2384 disconnect: vntwusb_disconnect,
2385 id_table: vntwusb_table,
2386};
2387
2388#endif
2389
2390static int __init vntwusb_init_module(void)
2391{
2392 info(DEVICE_FULL_DRV_NAM " " DEVICE_VERSION);
2393 return usb_register(&vntwusb_driver);
2394}
2395
2396static void __exit vntwusb_cleanup_module(void)
2397{
2398 usb_deregister(&vntwusb_driver);
2399}
2400
2401module_init(vntwusb_init_module);
2402module_exit(vntwusb_cleanup_module);
2403