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