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 - asynchronous data tx function
33 * device_set_multi - set mac filter
34 * device_ioctl - ioctl entry
35 * device_close - shutdown mac/bbp & free dma/descriptor 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 buffered 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 <linux/file.h>
50 #include "device.h"
51 #include "card.h"
52 #include "baseband.h"
53 #include "mac.h"
54 #include "tether.h"
55 #include "wmgr.h"
56 #include "wctl.h"
57 #include "power.h"
58 #include "wcmd.h"
59 #include "iocmd.h"
60 #include "tcrc.h"
61 #include "rxtx.h"
62 #include "bssdb.h"
63 #include "hostap.h"
64 #include "wpactl.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 int msglevel = MSG_LEVEL_DEBUG; */
77 static int msglevel =MSG_LEVEL_INFO;
78
79 /*
80 * define module options
81 */
82
83 /* version information */
84 #define DRIVER_AUTHOR \
85 "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_DEF0 64
96 DEVICE_PARAM(RxDescriptors0,"Number of receive usb desc buffer");
97
98 #define TX_DESC_DEF0 64
99 DEVICE_PARAM(TxDescriptors0,"Number of transmit usb desc buffer");
100
101 #define CHANNEL_DEF 6
102 DEVICE_PARAM(Channel, "Channel number");
103
104 /* PreambleType[] is the preamble length used for transmit.
105 0: indicate allows long preamble type
106 1: indicate allows short preamble type
107 */
108
109 #define PREAMBLE_TYPE_DEF 1
110
111 DEVICE_PARAM(PreambleType, "Preamble Type");
112
113 #define RTS_THRESH_DEF 2347
114 DEVICE_PARAM(RTSThreshold, "RTS threshold");
115
116 #define FRAG_THRESH_DEF 2346
117 DEVICE_PARAM(FragThreshold, "Fragmentation threshold");
118
119 #define DATA_RATE_DEF 13
120 /* datarate[] index
121 0: indicate 1 Mbps 0x02
122 1: indicate 2 Mbps 0x04
123 2: indicate 5.5 Mbps 0x0B
124 3: indicate 11 Mbps 0x16
125 4: indicate 6 Mbps 0x0c
126 5: indicate 9 Mbps 0x12
127 6: indicate 12 Mbps 0x18
128 7: indicate 18 Mbps 0x24
129 8: indicate 24 Mbps 0x30
130 9: indicate 36 Mbps 0x48
131 10: indicate 48 Mbps 0x60
132 11: indicate 54 Mbps 0x6c
133 12: indicate 72 Mbps 0x90
134 13: indicate auto rate
135 */
136
137 DEVICE_PARAM(ConnectionRate, "Connection data rate");
138
139 #define OP_MODE_DEF 0
140 DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode ");
141
142 /* OpMode[] is used for transmit.
143 0: indicate infrastruct mode used
144 1: indicate adhoc mode used
145 2: indicate AP mode used
146 */
147
148 /* PSMode[]
149 0: indicate disable power saving mode
150 1: indicate enable power saving mode
151 */
152
153 #define PS_MODE_DEF 0
154 DEVICE_PARAM(PSMode, "Power saving mode");
155
156 #define SHORT_RETRY_DEF 8
157 DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");
158
159 #define LONG_RETRY_DEF 4
160 DEVICE_PARAM(LongRetryLimit, "long frame retry limits");
161
162 /* BasebandType[] baseband type selected
163 0: indicate 802.11a type
164 1: indicate 802.11b type
165 2: indicate 802.11g type
166 */
167
168 #define BBP_TYPE_DEF 2
169 DEVICE_PARAM(BasebandType, "baseband type");
170
171 /* 80211hEnable[]
172 0: indicate disable 802.11h
173 1: indicate enable 802.11h
174 */
175
176 #define X80211h_MODE_DEF 0
177
178 DEVICE_PARAM(b80211hEnable, "802.11h mode");
179
180 /*
181 * Static vars definitions
182 */
183
184 static struct usb_device_id vt6656_table[] = {
185 {USB_DEVICE(VNT_USB_VENDOR_ID, VNT_USB_PRODUCT_ID)},
186 {}
187 };
188
189 /* frequency list (map channels to frequencies) */
190 /*
191 static const long frequency_list[] = {
192 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 2484,
193 4915, 4920, 4925, 4935, 4940, 4945, 4960, 4980,
194 5035, 5040, 5045, 5055, 5060, 5080, 5170, 5180, 5190, 5200, 5210, 5220, 5230, 5240,
195 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640, 5660, 5680,
196 5700, 5745, 5765, 5785, 5805, 5825
197 };
198
199 static const struct iw_handler_def iwctl_handler_def;
200 */
201
202 static int vt6656_probe(struct usb_interface *intf,
203 const struct usb_device_id *id);
204 static void vt6656_disconnect(struct usb_interface *intf);
205
206 #ifdef CONFIG_PM /* Minimal support for suspend and resume */
207 static int vt6656_suspend(struct usb_interface *intf, pm_message_t message);
208 static int vt6656_resume(struct usb_interface *intf);
209 #endif /* CONFIG_PM */
210
211 static struct net_device_stats *device_get_stats(struct net_device *dev);
212 static int device_open(struct net_device *dev);
213 static int device_xmit(struct sk_buff *skb, struct net_device *dev);
214 static void device_set_multi(struct net_device *dev);
215 static int device_close(struct net_device *dev);
216 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
217
218 static int device_init_registers(struct vnt_private *pDevice,
219 DEVICE_INIT_TYPE InitType);
220 static bool device_init_defrag_cb(struct vnt_private *pDevice);
221 static void device_init_diversity_timer(struct vnt_private *pDevice);
222 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev);
223
224 static int ethtool_ioctl(struct net_device *dev, void *useraddr);
225 static void device_free_tx_bufs(struct vnt_private *pDevice);
226 static void device_free_rx_bufs(struct vnt_private *pDevice);
227 static void device_free_int_bufs(struct vnt_private *pDevice);
228 static void device_free_frag_bufs(struct vnt_private *pDevice);
229 static bool device_alloc_bufs(struct vnt_private *pDevice);
230
231 static int Read_config_file(struct vnt_private *pDevice);
232 static unsigned char *Config_FileOperation(struct vnt_private *pDevice);
233 static int Config_FileGetParameter(unsigned char *string,
234 unsigned char *dest,
235 unsigned char *source);
236
237 static void usb_device_reset(struct vnt_private *pDevice);
238
239 static void
device_set_options(struct vnt_private * pDevice)240 device_set_options(struct vnt_private *pDevice) {
241
242 u8 abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
243 u8 abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
244 u8 abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
245
246 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
247 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
248 memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, ETH_ALEN);
249
250 pDevice->cbTD = TX_DESC_DEF0;
251 pDevice->cbRD = RX_DESC_DEF0;
252 pDevice->uChannel = CHANNEL_DEF;
253 pDevice->wRTSThreshold = RTS_THRESH_DEF;
254 pDevice->wFragmentationThreshold = FRAG_THRESH_DEF;
255 pDevice->byShortRetryLimit = SHORT_RETRY_DEF;
256 pDevice->byLongRetryLimit = LONG_RETRY_DEF;
257 pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME;
258 pDevice->byShortPreamble = PREAMBLE_TYPE_DEF;
259 pDevice->ePSMode = PS_MODE_DEF;
260 pDevice->b11hEnable = X80211h_MODE_DEF;
261 pDevice->eOPMode = OP_MODE_DEF;
262 pDevice->uConnectionRate = DATA_RATE_DEF;
263 if (pDevice->uConnectionRate < RATE_AUTO) pDevice->bFixRate = true;
264 pDevice->byBBType = BBP_TYPE_DEF;
265 pDevice->byPacketType = pDevice->byBBType;
266 pDevice->byAutoFBCtrl = AUTO_FB_0;
267 pDevice->bUpdateBBVGA = true;
268 pDevice->byFOETuning = 0;
269 pDevice->byAutoPwrTunning = 0;
270 pDevice->wCTSDuration = 0;
271 pDevice->byPreambleType = 0;
272 pDevice->bExistSWNetAddr = false;
273 /* pDevice->bDiversityRegCtlON = true; */
274 pDevice->bDiversityRegCtlON = false;
275 }
276
device_init_diversity_timer(struct vnt_private * pDevice)277 static void device_init_diversity_timer(struct vnt_private *pDevice)
278 {
279 init_timer(&pDevice->TimerSQ3Tmax1);
280 pDevice->TimerSQ3Tmax1.data = (unsigned long)pDevice;
281 pDevice->TimerSQ3Tmax1.function = (TimerFunction)TimerSQ3CallBack;
282 pDevice->TimerSQ3Tmax1.expires = RUN_AT(HZ);
283
284 init_timer(&pDevice->TimerSQ3Tmax2);
285 pDevice->TimerSQ3Tmax2.data = (unsigned long)pDevice;
286 pDevice->TimerSQ3Tmax2.function = (TimerFunction)TimerSQ3CallBack;
287 pDevice->TimerSQ3Tmax2.expires = RUN_AT(HZ);
288
289 init_timer(&pDevice->TimerSQ3Tmax3);
290 pDevice->TimerSQ3Tmax3.data = (unsigned long)pDevice;
291 pDevice->TimerSQ3Tmax3.function = (TimerFunction)TimerSQ3Tmax3CallBack;
292 pDevice->TimerSQ3Tmax3.expires = RUN_AT(HZ);
293
294 return;
295 }
296
297 /*
298 * initialization of MAC & BBP registers
299 */
300
device_init_registers(struct vnt_private * pDevice,DEVICE_INIT_TYPE InitType)301 static int device_init_registers(struct vnt_private *pDevice,
302 DEVICE_INIT_TYPE InitType)
303 {
304 struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
305 u8 abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
306 u8 abySNAP_RFC1042[ETH_ALEN] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00};
307 u8 abySNAP_Bridgetunnel[ETH_ALEN]
308 = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8};
309 u8 byAntenna;
310 int ii;
311 CMD_CARD_INIT sInitCmd;
312 int ntStatus = STATUS_SUCCESS;
313 RSP_CARD_INIT sInitRsp;
314 u8 byTmp;
315 u8 byCalibTXIQ = 0, byCalibTXDC = 0, byCalibRXIQ = 0;
316
317 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "---->INIbInitAdapter. [%d][%d]\n", InitType, pDevice->byPacketType);
318 spin_lock_irq(&pDevice->lock);
319 if (InitType == DEVICE_INIT_COLD) {
320 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
321 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
322 memcpy(pDevice->abySNAP_Bridgetunnel,
323 abySNAP_Bridgetunnel,
324 ETH_ALEN);
325
326 if ( !FIRMWAREbCheckVersion(pDevice) ) {
327 if (FIRMWAREbDownload(pDevice) == true) {
328 if (FIRMWAREbBrach2Sram(pDevice) == false) {
329 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbBrach2Sram fail \n");
330 spin_unlock_irq(&pDevice->lock);
331 return false;
332 }
333 } else {
334
335 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbDownload fail \n");
336 spin_unlock_irq(&pDevice->lock);
337 return false;
338 }
339 }
340
341 if ( !BBbVT3184Init(pDevice) ) {
342 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" BBbVT3184Init fail \n");
343 spin_unlock_irq(&pDevice->lock);
344 return false;
345 }
346 }
347
348 sInitCmd.byInitClass = (u8)InitType;
349 sInitCmd.bExistSWNetAddr = (u8) pDevice->bExistSWNetAddr;
350 for (ii = 0; ii < 6; ii++)
351 sInitCmd.bySWNetAddr[ii] = pDevice->abyCurrentNetAddr[ii];
352 sInitCmd.byShortRetryLimit = pDevice->byShortRetryLimit;
353 sInitCmd.byLongRetryLimit = pDevice->byLongRetryLimit;
354
355 /* issue card_init command to device */
356 ntStatus = CONTROLnsRequestOut(pDevice,
357 MESSAGE_TYPE_CARDINIT,
358 0,
359 0,
360 sizeof(CMD_CARD_INIT),
361 (u8 *) &(sInitCmd));
362
363 if ( ntStatus != STATUS_SUCCESS ) {
364 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Issue Card init fail \n");
365 spin_unlock_irq(&pDevice->lock);
366 return false;
367 }
368 if (InitType == DEVICE_INIT_COLD) {
369
370 ntStatus = CONTROLnsRequestIn(pDevice,MESSAGE_TYPE_INIT_RSP,0,0,sizeof(RSP_CARD_INIT), (u8 *) &(sInitRsp));
371
372 if (ntStatus != STATUS_SUCCESS) {
373 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Cardinit request in status fail!\n");
374 spin_unlock_irq(&pDevice->lock);
375 return false;
376 }
377
378 /* local ID for AES functions */
379 ntStatus = CONTROLnsRequestIn(pDevice,
380 MESSAGE_TYPE_READ,
381 MAC_REG_LOCALID,
382 MESSAGE_REQUEST_MACREG,
383 1,
384 &pDevice->byLocalID);
385
386 if ( ntStatus != STATUS_SUCCESS ) {
387 spin_unlock_irq(&pDevice->lock);
388 return false;
389 }
390
391 /* do MACbSoftwareReset in MACvInitialize */
392
393 /* force CCK */
394 pDevice->bCCK = true;
395 pDevice->bProtectMode = false;
396 /* only used in 11g type, sync with ERP IE */
397 pDevice->bNonERPPresent = false;
398 pDevice->bBarkerPreambleMd = false;
399 if ( pDevice->bFixRate ) {
400 pDevice->wCurrentRate = (u16) pDevice->uConnectionRate;
401 } else {
402 if ( pDevice->byBBType == BB_TYPE_11B )
403 pDevice->wCurrentRate = RATE_11M;
404 else
405 pDevice->wCurrentRate = RATE_54M;
406 }
407
408 CHvInitChannelTable(pDevice);
409
410 pDevice->byTopOFDMBasicRate = RATE_24M;
411 pDevice->byTopCCKBasicRate = RATE_1M;
412 pDevice->byRevId = 0;
413 /* target to IF pin while programming to RF chip */
414 pDevice->byCurPwr = 0xFF;
415
416 pDevice->byCCKPwr = pDevice->abyEEPROM[EEP_OFS_PWR_CCK];
417 pDevice->byOFDMPwrG = pDevice->abyEEPROM[EEP_OFS_PWR_OFDMG];
418 /* load power table */
419 for (ii = 0; ii < 14; ii++) {
420 pDevice->abyCCKPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_CCK_PWR_TBL];
421 if (pDevice->abyCCKPwrTbl[ii] == 0)
422 pDevice->abyCCKPwrTbl[ii] = pDevice->byCCKPwr;
423 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_OFDM_PWR_TBL];
424 if (pDevice->abyOFDMPwrTbl[ii] == 0)
425 pDevice->abyOFDMPwrTbl[ii] = pDevice->byOFDMPwrG;
426 }
427
428 /*
429 * original zonetype is USA, but custom zonetype is Europe,
430 * then need to recover 12, 13, 14 channels with 11 channel
431 */
432 if(((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) ||
433 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe))&&
434 (pDevice->byOriginalZonetype == ZoneType_USA)) {
435 for (ii = 11; ii < 14; ii++) {
436 pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
437 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];
438 }
439 }
440
441 pDevice->byOFDMPwrA = 0x34; /* same as RFbMA2829SelectChannel */
442
443 /* load OFDM A power table */
444 for (ii = 0; ii < CB_MAX_CHANNEL_5G; ii++) {
445 pDevice->abyOFDMAPwrTbl[ii] = pDevice->abyEEPROM[ii + EEP_OFS_OFDMA_PWR_TBL];
446 if (pDevice->abyOFDMAPwrTbl[ii] == 0)
447 pDevice->abyOFDMAPwrTbl[ii] = pDevice->byOFDMPwrA;
448 }
449
450 byAntenna = pDevice->abyEEPROM[EEP_OFS_ANTENNA];
451 if (byAntenna & EEP_ANTINV)
452 pDevice->bTxRxAntInv = true;
453 else
454 pDevice->bTxRxAntInv = false;
455
456 byAntenna &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
457
458 if (byAntenna == 0) /* if not set default is both */
459 byAntenna = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
460
461 if (byAntenna == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
462 pDevice->byAntennaCount = 2;
463 pDevice->byTxAntennaMode = ANT_B;
464 pDevice->dwTxAntennaSel = 1;
465 pDevice->dwRxAntennaSel = 1;
466 if (pDevice->bTxRxAntInv == true)
467 pDevice->byRxAntennaMode = ANT_A;
468 else
469 pDevice->byRxAntennaMode = ANT_B;
470
471 if (pDevice->bDiversityRegCtlON)
472 pDevice->bDiversityEnable = true;
473 else
474 pDevice->bDiversityEnable = false;
475 } else {
476 pDevice->bDiversityEnable = false;
477 pDevice->byAntennaCount = 1;
478 pDevice->dwTxAntennaSel = 0;
479 pDevice->dwRxAntennaSel = 0;
480 if (byAntenna & EEP_ANTENNA_AUX) {
481 pDevice->byTxAntennaMode = ANT_A;
482 if (pDevice->bTxRxAntInv == true)
483 pDevice->byRxAntennaMode = ANT_B;
484 else
485 pDevice->byRxAntennaMode = ANT_A;
486 } else {
487 pDevice->byTxAntennaMode = ANT_B;
488 if (pDevice->bTxRxAntInv == true)
489 pDevice->byRxAntennaMode = ANT_A;
490 else
491 pDevice->byRxAntennaMode = ANT_B;
492 }
493 }
494 pDevice->ulDiversityNValue = 100*255;
495 pDevice->ulDiversityMValue = 100*16;
496 pDevice->byTMax = 1;
497 pDevice->byTMax2 = 4;
498 pDevice->ulSQ3TH = 0;
499 pDevice->byTMax3 = 64;
500
501 /* get Auto Fall Back type */
502 pDevice->byAutoFBCtrl = AUTO_FB_0;
503
504 /* set SCAN Time */
505 pDevice->uScanTime = WLAN_SCAN_MINITIME;
506
507 /* default Auto Mode */
508 /* pDevice->NetworkType = Ndis802_11Automode; */
509 pDevice->eConfigPHYMode = PHY_TYPE_AUTO;
510 pDevice->byBBType = BB_TYPE_11G;
511
512 /* initialize BBP registers */
513 pDevice->ulTxPower = 25;
514
515 /* get channel range */
516 pDevice->byMinChannel = 1;
517 pDevice->byMaxChannel = CB_MAX_CHANNEL;
518
519 /* get RFType */
520 pDevice->byRFType = sInitRsp.byRFType;
521
522 if ((pDevice->byRFType & RF_EMU) != 0) {
523 /* force change RevID for VT3253 emu */
524 pDevice->byRevId = 0x80;
525 }
526
527 /* load vt3266 calibration parameters in EEPROM */
528 if (pDevice->byRFType == RF_VT3226D0) {
529 if((pDevice->abyEEPROM[EEP_OFS_MAJOR_VER] == 0x1) &&
530 (pDevice->abyEEPROM[EEP_OFS_MINOR_VER] >= 0x4)) {
531 byCalibTXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_IQ];
532 byCalibTXDC = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_DC];
533 byCalibRXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_RX_IQ];
534 if( (byCalibTXIQ || byCalibTXDC || byCalibRXIQ) ) {
535 /* CR255, enable TX/RX IQ and DC compensation mode */
536 ControlvWriteByte(pDevice,
537 MESSAGE_REQUEST_BBREG,
538 0xFF,
539 0x03);
540 /* CR251, TX I/Q Imbalance Calibration */
541 ControlvWriteByte(pDevice,
542 MESSAGE_REQUEST_BBREG,
543 0xFB,
544 byCalibTXIQ);
545 /* CR252, TX DC-Offset Calibration */
546 ControlvWriteByte(pDevice,
547 MESSAGE_REQUEST_BBREG,
548 0xFC,
549 byCalibTXDC);
550 /* CR253, RX I/Q Imbalance Calibration */
551 ControlvWriteByte(pDevice,
552 MESSAGE_REQUEST_BBREG,
553 0xFD,
554 byCalibRXIQ);
555 } else {
556 /* CR255, turn off BB Calibration compensation */
557 ControlvWriteByte(pDevice,
558 MESSAGE_REQUEST_BBREG,
559 0xFF,
560 0x0);
561 }
562 }
563 }
564 pMgmt->eScanType = WMAC_SCAN_PASSIVE;
565 pMgmt->uCurrChannel = pDevice->uChannel;
566 pMgmt->uIBSSChannel = pDevice->uChannel;
567 CARDbSetMediaChannel(pDevice, pMgmt->uCurrChannel);
568
569 /* get permanent network address */
570 memcpy(pDevice->abyPermanentNetAddr,&(sInitRsp.byNetAddr[0]),6);
571 memcpy(pDevice->abyCurrentNetAddr,
572 pDevice->abyPermanentNetAddr,
573 ETH_ALEN);
574
575 /* if exist SW network address, use it */
576 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Network address = %pM\n",
577 pDevice->abyCurrentNetAddr);
578 }
579
580 /*
581 * set BB and packet type at the same time
582 * set Short Slot Time, xIFS, and RSPINF
583 */
584 if (pDevice->byBBType == BB_TYPE_11A) {
585 CARDbAddBasicRate(pDevice, RATE_6M);
586 pDevice->bShortSlotTime = true;
587 } else {
588 CARDbAddBasicRate(pDevice, RATE_1M);
589 pDevice->bShortSlotTime = false;
590 }
591 BBvSetShortSlotTime(pDevice);
592 CARDvSetBSSMode(pDevice);
593
594 if (pDevice->bUpdateBBVGA) {
595 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
596 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
597 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
598 }
599
600 pDevice->byRadioCtl = pDevice->abyEEPROM[EEP_OFS_RADIOCTL];
601 pDevice->bHWRadioOff = false;
602 if ( (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) != 0 ) {
603 ntStatus = CONTROLnsRequestIn(pDevice,
604 MESSAGE_TYPE_READ,
605 MAC_REG_GPIOCTL1,
606 MESSAGE_REQUEST_MACREG,
607 1,
608 &byTmp);
609
610 if ( ntStatus != STATUS_SUCCESS ) {
611 spin_unlock_irq(&pDevice->lock);
612 return false;
613 }
614 if ( (byTmp & GPIO3_DATA) == 0 ) {
615 pDevice->bHWRadioOff = true;
616 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
617 } else {
618 MACvRegBitsOff(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
619 pDevice->bHWRadioOff = false;
620 }
621
622 }
623
624 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_TMLEN,0x38);
625 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
626 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL0,0x01);
627
628 if ((pDevice->bHWRadioOff == true) || (pDevice->bRadioControlOff == true)) {
629 CARDbRadioPowerOff(pDevice);
630 } else {
631 CARDbRadioPowerOn(pDevice);
632 }
633
634 spin_unlock_irq(&pDevice->lock);
635 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"<----INIbInitAdapter Exit\n");
636 return true;
637 }
638
639 #ifdef CONFIG_PM /* Minimal support for suspend and resume */
640
vt6656_suspend(struct usb_interface * intf,pm_message_t message)641 static int vt6656_suspend(struct usb_interface *intf, pm_message_t message)
642 {
643 struct vnt_private *device = usb_get_intfdata(intf);
644
645 if (!device || !device->dev)
646 return -ENODEV;
647
648 if (device->flags & DEVICE_FLAGS_OPENED)
649 device_close(device->dev);
650
651 return 0;
652 }
653
vt6656_resume(struct usb_interface * intf)654 static int vt6656_resume(struct usb_interface *intf)
655 {
656 struct vnt_private *device = usb_get_intfdata(intf);
657
658 if (!device || !device->dev)
659 return -ENODEV;
660
661 if (!(device->flags & DEVICE_FLAGS_OPENED))
662 device_open(device->dev);
663
664 return 0;
665 }
666
667 #endif /* CONFIG_PM */
668
669 static const struct net_device_ops device_netdev_ops = {
670 .ndo_open = device_open,
671 .ndo_stop = device_close,
672 .ndo_do_ioctl = device_ioctl,
673 .ndo_get_stats = device_get_stats,
674 .ndo_start_xmit = device_xmit,
675 .ndo_set_rx_mode = device_set_multi,
676 };
677
678 static int
vt6656_probe(struct usb_interface * intf,const struct usb_device_id * id)679 vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id)
680 {
681 u8 fake_mac[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
682 struct usb_device *udev = interface_to_usbdev(intf);
683 int rc = 0;
684 struct net_device *netdev = NULL;
685 struct vnt_private *pDevice;
686
687 printk(KERN_NOTICE "%s Ver. %s\n", DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
688 printk(KERN_NOTICE "Copyright (c) 2004 VIA Networking Technologies, Inc.\n");
689
690 udev = usb_get_dev(udev);
691 netdev = alloc_etherdev(sizeof(struct vnt_private));
692 if (!netdev) {
693 printk(KERN_ERR DEVICE_NAME ": allocate net device failed\n");
694 rc = -ENOMEM;
695 goto err_nomem;
696 }
697
698 pDevice = netdev_priv(netdev);
699 memset(pDevice, 0, sizeof(struct vnt_private));
700
701 pDevice->dev = netdev;
702 pDevice->usb = udev;
703
704 device_set_options(pDevice);
705 spin_lock_init(&pDevice->lock);
706
707 pDevice->tx_80211 = device_dma0_tx_80211;
708 pDevice->vnt_mgmt.pAdapter = (void *) pDevice;
709
710 netdev->netdev_ops = &device_netdev_ops;
711 netdev->wireless_handlers =
712 (struct iw_handler_def *) &iwctl_handler_def;
713
714 usb_set_intfdata(intf, pDevice);
715 SET_NETDEV_DEV(netdev, &intf->dev);
716 memcpy(pDevice->dev->dev_addr, fake_mac, ETH_ALEN);
717 rc = register_netdev(netdev);
718 if (rc) {
719 printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
720 goto err_netdev;
721 }
722
723 usb_device_reset(pDevice);
724
725 return 0;
726
727 err_netdev:
728 free_netdev(netdev);
729 err_nomem:
730 usb_put_dev(udev);
731
732 return rc;
733 }
734
device_free_tx_bufs(struct vnt_private * pDevice)735 static void device_free_tx_bufs(struct vnt_private *pDevice)
736 {
737 PUSB_SEND_CONTEXT pTxContext;
738 int ii;
739
740 for (ii = 0; ii < pDevice->cbTD; ii++) {
741
742 pTxContext = pDevice->apTD[ii];
743 /* deallocate URBs */
744 if (pTxContext->pUrb) {
745 usb_kill_urb(pTxContext->pUrb);
746 usb_free_urb(pTxContext->pUrb);
747 }
748 kfree(pTxContext);
749 }
750 return;
751 }
752
device_free_rx_bufs(struct vnt_private * pDevice)753 static void device_free_rx_bufs(struct vnt_private *pDevice)
754 {
755 PRCB pRCB;
756 int ii;
757
758 for (ii = 0; ii < pDevice->cbRD; ii++) {
759
760 pRCB = pDevice->apRCB[ii];
761 /* deallocate URBs */
762 if (pRCB->pUrb) {
763 usb_kill_urb(pRCB->pUrb);
764 usb_free_urb(pRCB->pUrb);
765 }
766 /* deallocate skb */
767 if (pRCB->skb)
768 dev_kfree_skb(pRCB->skb);
769 }
770 kfree(pDevice->pRCBMem);
771
772 return;
773 }
774
usb_device_reset(struct vnt_private * pDevice)775 static void usb_device_reset(struct vnt_private *pDevice)
776 {
777 int status;
778 status = usb_reset_device(pDevice->usb);
779 if (status)
780 printk("usb_device_reset fail status=%d\n",status);
781 return ;
782 }
783
device_free_int_bufs(struct vnt_private * pDevice)784 static void device_free_int_bufs(struct vnt_private *pDevice)
785 {
786 kfree(pDevice->intBuf.pDataBuf);
787 return;
788 }
789
device_alloc_bufs(struct vnt_private * pDevice)790 static bool device_alloc_bufs(struct vnt_private *pDevice)
791 {
792
793 PUSB_SEND_CONTEXT pTxContext;
794 PRCB pRCB;
795 int ii;
796
797 for (ii = 0; ii < pDevice->cbTD; ii++) {
798
799 pTxContext = kmalloc(sizeof(USB_SEND_CONTEXT), GFP_KERNEL);
800 if (pTxContext == NULL) {
801 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate tx usb context failed\n", pDevice->dev->name);
802 goto free_tx;
803 }
804 pDevice->apTD[ii] = pTxContext;
805 pTxContext->pDevice = (void *) pDevice;
806 /* allocate URBs */
807 pTxContext->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
808 if (pTxContext->pUrb == NULL) {
809 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "alloc tx urb failed\n");
810 goto free_tx;
811 }
812 pTxContext->bBoolInUse = false;
813 }
814
815 /* allocate RCB mem */
816 pDevice->pRCBMem = kzalloc((sizeof(RCB) * pDevice->cbRD), GFP_KERNEL);
817 if (pDevice->pRCBMem == NULL) {
818 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : alloc rx usb context failed\n", pDevice->dev->name);
819 goto free_tx;
820 }
821
822 pDevice->FirstRecvFreeList = NULL;
823 pDevice->LastRecvFreeList = NULL;
824 pDevice->FirstRecvMngList = NULL;
825 pDevice->LastRecvMngList = NULL;
826 pDevice->NumRecvFreeList = 0;
827 pRCB = (PRCB) pDevice->pRCBMem;
828
829 for (ii = 0; ii < pDevice->cbRD; ii++) {
830
831 pDevice->apRCB[ii] = pRCB;
832 pRCB->pDevice = (void *) pDevice;
833 /* allocate URBs */
834 pRCB->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
835
836 if (pRCB->pUrb == NULL) {
837 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx urb\n");
838 goto free_rx_tx;
839 }
840 pRCB->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
841 if (pRCB->skb == NULL) {
842 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx skb\n");
843 goto free_rx_tx;
844 }
845 pRCB->skb->dev = pDevice->dev;
846 pRCB->bBoolInUse = false;
847 EnqueueRCB(pDevice->FirstRecvFreeList, pDevice->LastRecvFreeList, pRCB);
848 pDevice->NumRecvFreeList++;
849 pRCB++;
850 }
851
852 pDevice->pControlURB = usb_alloc_urb(0, GFP_ATOMIC);
853 if (pDevice->pControlURB == NULL) {
854 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc control urb\n");
855 goto free_rx_tx;
856 }
857
858 pDevice->pInterruptURB = usb_alloc_urb(0, GFP_ATOMIC);
859 if (pDevice->pInterruptURB == NULL) {
860 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int urb\n");
861 usb_free_urb(pDevice->pControlURB);
862 goto free_rx_tx;
863 }
864
865 pDevice->intBuf.pDataBuf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL);
866 if (pDevice->intBuf.pDataBuf == NULL) {
867 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int buf\n");
868 usb_free_urb(pDevice->pControlURB);
869 usb_free_urb(pDevice->pInterruptURB);
870 goto free_rx_tx;
871 }
872
873 return true;
874
875 free_rx_tx:
876 device_free_rx_bufs(pDevice);
877
878 free_tx:
879 device_free_tx_bufs(pDevice);
880
881 return false;
882 }
883
device_init_defrag_cb(struct vnt_private * pDevice)884 static bool device_init_defrag_cb(struct vnt_private *pDevice)
885 {
886 int i;
887 PSDeFragControlBlock pDeF;
888
889 /* Init the fragment ctl entries */
890 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
891 pDeF = &(pDevice->sRxDFCB[i]);
892 if (!device_alloc_frag_buf(pDevice, pDeF)) {
893 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
894 pDevice->dev->name);
895 goto free_frag;
896 }
897 }
898 pDevice->cbDFCB = CB_MAX_RX_FRAG;
899 pDevice->cbFreeDFCB = pDevice->cbDFCB;
900 return true;
901
902 free_frag:
903 device_free_frag_bufs(pDevice);
904 return false;
905 }
906
device_free_frag_bufs(struct vnt_private * pDevice)907 static void device_free_frag_bufs(struct vnt_private *pDevice)
908 {
909 PSDeFragControlBlock pDeF;
910 int i;
911
912 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
913
914 pDeF = &(pDevice->sRxDFCB[i]);
915
916 if (pDeF->skb)
917 dev_kfree_skb(pDeF->skb);
918 }
919 }
920
device_alloc_frag_buf(struct vnt_private * pDevice,PSDeFragControlBlock pDeF)921 int device_alloc_frag_buf(struct vnt_private *pDevice,
922 PSDeFragControlBlock pDeF)
923 {
924
925 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
926 if (pDeF->skb == NULL)
927 return false;
928 ASSERT(pDeF->skb);
929 pDeF->skb->dev = pDevice->dev;
930
931 return true;
932 }
933
device_open(struct net_device * dev)934 static int device_open(struct net_device *dev)
935 {
936 struct vnt_private *pDevice = netdev_priv(dev);
937
938 pDevice->fWPA_Authened = false;
939
940 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_open...\n");
941
942 pDevice->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS;
943
944 if (device_alloc_bufs(pDevice) == false) {
945 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_alloc_bufs fail... \n");
946 return -ENOMEM;
947 }
948
949 if (device_init_defrag_cb(pDevice)== false) {
950 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Initial defragment cb fail \n");
951 goto free_rx_tx;
952 }
953
954 MP_CLEAR_FLAG(pDevice, fMP_DISCONNECTED);
955 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
956 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
957 MP_SET_FLAG(pDevice, fMP_POST_READS);
958 MP_SET_FLAG(pDevice, fMP_POST_WRITES);
959
960 /* read config file */
961 Read_config_file(pDevice);
962
963 if (device_init_registers(pDevice, DEVICE_INIT_COLD) == false) {
964 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " init register fail\n");
965 goto free_all;
966 }
967
968 device_set_multi(pDevice->dev);
969
970 /* init for key management */
971 KeyvInitTable(pDevice,&pDevice->sKey);
972 memcpy(pDevice->vnt_mgmt.abyMACAddr,
973 pDevice->abyCurrentNetAddr, ETH_ALEN);
974 memcpy(pDevice->dev->dev_addr, pDevice->abyCurrentNetAddr, ETH_ALEN);
975 pDevice->bStopTx0Pkt = false;
976 pDevice->bStopDataPkt = false;
977 pDevice->bRoaming = false;
978 pDevice->bIsRoaming = false;
979 pDevice->bEnableRoaming = false;
980 if (pDevice->bDiversityRegCtlON) {
981 device_init_diversity_timer(pDevice);
982 }
983
984 vMgrObjectInit(pDevice);
985 tasklet_init(&pDevice->RxMngWorkItem, (void *)RXvMngWorkItem, (unsigned long)pDevice);
986 tasklet_init(&pDevice->ReadWorkItem, (void *)RXvWorkItem, (unsigned long)pDevice);
987 tasklet_init(&pDevice->EventWorkItem, (void *)INTvWorkItem, (unsigned long)pDevice);
988 add_timer(&pDevice->vnt_mgmt.sTimerSecondCallback);
989 pDevice->int_interval = 100; /* max 100 microframes */
990 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
991
992 pDevice->bIsRxWorkItemQueued = true;
993 pDevice->fKillEventPollingThread = false;
994 pDevice->bEventAvailable = false;
995
996 pDevice->bWPADEVUp = false;
997 pDevice->bwextstep0 = false;
998 pDevice->bwextstep1 = false;
999 pDevice->bwextstep2 = false;
1000 pDevice->bwextstep3 = false;
1001 pDevice->bWPASuppWextEnabled = false;
1002 pDevice->byReAssocCount = 0;
1003
1004 RXvWorkItem(pDevice);
1005 INTvWorkItem(pDevice);
1006
1007 /* if WEP key already set by iwconfig but device not yet open */
1008 if ((pDevice->bEncryptionEnable == true) && (pDevice->bTransmitKey == true)) {
1009 spin_lock_irq(&pDevice->lock);
1010 KeybSetDefaultKey( pDevice,
1011 &(pDevice->sKey),
1012 pDevice->byKeyIndex | (1 << 31),
1013 pDevice->uKeyLength,
1014 NULL,
1015 pDevice->abyKey,
1016 KEY_CTL_WEP
1017 );
1018 spin_unlock_irq(&pDevice->lock);
1019 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1020 }
1021
1022 if (pDevice->vnt_mgmt.eConfigMode == WMAC_CONFIG_AP)
1023 bScheduleCommand((void *) pDevice, WLAN_CMD_RUN_AP, NULL);
1024 else
1025 bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1026
1027 netif_stop_queue(pDevice->dev);
1028 pDevice->flags |= DEVICE_FLAGS_OPENED;
1029
1030 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success..\n");
1031 return 0;
1032
1033 free_all:
1034 device_free_frag_bufs(pDevice);
1035 free_rx_tx:
1036 device_free_rx_bufs(pDevice);
1037 device_free_tx_bufs(pDevice);
1038 device_free_int_bufs(pDevice);
1039 usb_kill_urb(pDevice->pControlURB);
1040 usb_kill_urb(pDevice->pInterruptURB);
1041 usb_free_urb(pDevice->pControlURB);
1042 usb_free_urb(pDevice->pInterruptURB);
1043
1044 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open fail.. \n");
1045 return -ENOMEM;
1046 }
1047
device_close(struct net_device * dev)1048 static int device_close(struct net_device *dev)
1049 {
1050 struct vnt_private *pDevice = netdev_priv(dev);
1051 struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
1052 int uu;
1053
1054 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close1\n");
1055 if (pDevice == NULL)
1056 return -ENODEV;
1057
1058 if (pDevice->bLinkPass) {
1059 bScheduleCommand((void *) pDevice, WLAN_CMD_DISASSOCIATE, NULL);
1060 mdelay(30);
1061 }
1062
1063 memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
1064 pMgmt->bShareKeyAlgorithm = false;
1065 pDevice->bEncryptionEnable = false;
1066 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1067 spin_lock_irq(&pDevice->lock);
1068 for (uu = 0; uu < MAX_KEY_TABLE; uu++)
1069 MACvDisableKeyEntry(pDevice,uu);
1070 spin_unlock_irq(&pDevice->lock);
1071
1072 if ((pDevice->flags & DEVICE_FLAGS_UNPLUG) == false) {
1073 MACbShutdown(pDevice);
1074 }
1075 netif_stop_queue(pDevice->dev);
1076 MP_SET_FLAG(pDevice, fMP_DISCONNECTED);
1077 MP_CLEAR_FLAG(pDevice, fMP_POST_WRITES);
1078 MP_CLEAR_FLAG(pDevice, fMP_POST_READS);
1079 pDevice->fKillEventPollingThread = true;
1080 del_timer(&pDevice->sTimerCommand);
1081 del_timer(&pMgmt->sTimerSecondCallback);
1082
1083 del_timer(&pDevice->sTimerTxData);
1084
1085 if (pDevice->bDiversityRegCtlON) {
1086 del_timer(&pDevice->TimerSQ3Tmax1);
1087 del_timer(&pDevice->TimerSQ3Tmax2);
1088 del_timer(&pDevice->TimerSQ3Tmax3);
1089 }
1090 tasklet_kill(&pDevice->RxMngWorkItem);
1091 tasklet_kill(&pDevice->ReadWorkItem);
1092 tasklet_kill(&pDevice->EventWorkItem);
1093
1094 pDevice->bRoaming = false;
1095 pDevice->bIsRoaming = false;
1096 pDevice->bEnableRoaming = false;
1097 pDevice->bCmdRunning = false;
1098 pDevice->bLinkPass = false;
1099 memset(pMgmt->abyCurrBSSID, 0, 6);
1100 pMgmt->eCurrState = WMAC_STATE_IDLE;
1101
1102 device_free_tx_bufs(pDevice);
1103 device_free_rx_bufs(pDevice);
1104 device_free_int_bufs(pDevice);
1105 device_free_frag_bufs(pDevice);
1106
1107 usb_kill_urb(pDevice->pControlURB);
1108 usb_kill_urb(pDevice->pInterruptURB);
1109 usb_free_urb(pDevice->pControlURB);
1110 usb_free_urb(pDevice->pInterruptURB);
1111
1112 BSSvClearNodeDBTable(pDevice, 0);
1113 pDevice->flags &=(~DEVICE_FLAGS_OPENED);
1114
1115 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n");
1116
1117 return 0;
1118 }
1119
vt6656_disconnect(struct usb_interface * intf)1120 static void vt6656_disconnect(struct usb_interface *intf)
1121 {
1122 struct vnt_private *device = usb_get_intfdata(intf);
1123
1124 if (!device)
1125 return;
1126
1127 usb_set_intfdata(intf, NULL);
1128 usb_put_dev(interface_to_usbdev(intf));
1129
1130 device->flags |= DEVICE_FLAGS_UNPLUG;
1131
1132 if (device->dev) {
1133 unregister_netdev(device->dev);
1134 free_netdev(device->dev);
1135 }
1136
1137 }
1138
device_dma0_tx_80211(struct sk_buff * skb,struct net_device * dev)1139 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev)
1140 {
1141 struct vnt_private *pDevice = netdev_priv(dev);
1142
1143 spin_lock_irq(&pDevice->lock);
1144
1145 if (unlikely(pDevice->bStopTx0Pkt))
1146 dev_kfree_skb_irq(skb);
1147 else
1148 vDMA0_tx_80211(pDevice, skb);
1149
1150 spin_unlock_irq(&pDevice->lock);
1151
1152 return NETDEV_TX_OK;
1153 }
1154
device_xmit(struct sk_buff * skb,struct net_device * dev)1155 static int device_xmit(struct sk_buff *skb, struct net_device *dev)
1156 {
1157 struct vnt_private *pDevice = netdev_priv(dev);
1158 struct net_device_stats *stats = &pDevice->stats;
1159
1160 spin_lock_irq(&pDevice->lock);
1161
1162 netif_stop_queue(dev);
1163
1164 if (!pDevice->bLinkPass) {
1165 dev_kfree_skb_irq(skb);
1166 goto out;
1167 }
1168
1169 if (pDevice->bStopDataPkt) {
1170 dev_kfree_skb_irq(skb);
1171 stats->tx_dropped++;
1172 goto out;
1173 }
1174
1175 if (nsDMA_tx_packet(pDevice, TYPE_AC0DMA, skb)) {
1176 if (netif_queue_stopped(dev))
1177 netif_wake_queue(dev);
1178 }
1179
1180 out:
1181 spin_unlock_irq(&pDevice->lock);
1182
1183 return NETDEV_TX_OK;
1184 }
1185
1186 static unsigned const ethernet_polynomial = 0x04c11db7U;
ether_crc(int length,unsigned char * data)1187 static inline u32 ether_crc(int length, unsigned char *data)
1188 {
1189 int crc = -1;
1190
1191 while(--length >= 0) {
1192 unsigned char current_octet = *data++;
1193 int bit;
1194 for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
1195 crc = (crc << 1) ^
1196 ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
1197 }
1198 }
1199 return crc;
1200 }
1201
1202 /* find out the start position of str2 from str1 */
kstrstr(const unsigned char * str1,const unsigned char * str2)1203 static unsigned char *kstrstr(const unsigned char *str1,
1204 const unsigned char *str2) {
1205 int str1_len = strlen(str1);
1206 int str2_len = strlen(str2);
1207
1208 while (str1_len >= str2_len) {
1209 str1_len--;
1210 if(memcmp(str1,str2,str2_len)==0)
1211 return (unsigned char *) str1;
1212 str1++;
1213 }
1214 return NULL;
1215 }
1216
Config_FileGetParameter(unsigned char * string,unsigned char * dest,unsigned char * source)1217 static int Config_FileGetParameter(unsigned char *string,
1218 unsigned char *dest,
1219 unsigned char *source)
1220 {
1221 unsigned char buf1[100];
1222 unsigned char buf2[100];
1223 unsigned char *start_p = NULL, *end_p = NULL, *tmp_p = NULL;
1224 int ii;
1225
1226 memset(buf1,0,100);
1227 strcat(buf1, string);
1228 strcat(buf1, "=");
1229 source+=strlen(buf1);
1230
1231 /* find target string start point */
1232 start_p = kstrstr(source,buf1);
1233 if (start_p == NULL)
1234 return false;
1235
1236 /* check if current config line is marked by "#" */
1237 for (ii = 1; ; ii++) {
1238 if (memcmp(start_p - ii, "\n", 1) == 0)
1239 break;
1240 if (memcmp(start_p - ii, "#", 1) == 0)
1241 return false;
1242 }
1243
1244 /* find target string end point */
1245 end_p = kstrstr(start_p,"\n");
1246 if (end_p == NULL) { /* can't find "\n", but don't care */
1247 end_p = start_p + strlen(start_p); /* no include "\n" */
1248 }
1249
1250 memset(buf2,0,100);
1251 memcpy(buf2, start_p, end_p-start_p); /* get the target line */
1252 buf2[end_p-start_p]='\0';
1253
1254 /* find value */
1255 start_p = kstrstr(buf2,"=");
1256 if (start_p == NULL)
1257 return false;
1258 memset(buf1,0,100);
1259 strcpy(buf1,start_p+1);
1260
1261 /* except space */
1262 tmp_p = buf1;
1263 while(*tmp_p != 0x00) {
1264 if(*tmp_p==' ')
1265 tmp_p++;
1266 else
1267 break;
1268 }
1269
1270 memcpy(dest,tmp_p,strlen(tmp_p));
1271 return true;
1272 }
1273
1274 /* if read fails, return NULL, or return data pointer */
Config_FileOperation(struct vnt_private * pDevice)1275 static unsigned char *Config_FileOperation(struct vnt_private *pDevice)
1276 {
1277 unsigned char *buffer = kmalloc(1024, GFP_KERNEL);
1278 struct file *file;
1279
1280 if (!buffer) {
1281 printk("allocate mem for file fail?\n");
1282 return NULL;
1283 }
1284
1285 file = filp_open(CONFIG_PATH, O_RDONLY, 0);
1286 if (IS_ERR(file)) {
1287 kfree(buffer);
1288 printk("Config_FileOperation file Not exist\n");
1289 return NULL;
1290 }
1291
1292 if (kernel_read(file, 0, buffer, 1024) < 0) {
1293 printk("read file error?\n");
1294 kfree(buffer);
1295 buffer = NULL;
1296 }
1297
1298 fput(file);
1299 return buffer;
1300 }
1301
1302 /* return --->-1:fail; >=0:successful */
Read_config_file(struct vnt_private * pDevice)1303 static int Read_config_file(struct vnt_private *pDevice)
1304 {
1305 int result = 0;
1306 unsigned char tmpbuffer[100];
1307 unsigned char *buffer = NULL;
1308
1309 /* init config setting */
1310 pDevice->config_file.ZoneType = -1;
1311 pDevice->config_file.eAuthenMode = -1;
1312 pDevice->config_file.eEncryptionStatus = -1;
1313
1314 buffer = Config_FileOperation(pDevice);
1315 if (buffer == NULL) {
1316 result =-1;
1317 return result;
1318 }
1319
1320 /* get zonetype */
1321 {
1322 memset(tmpbuffer,0,sizeof(tmpbuffer));
1323 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer) ==true) {
1324 if(memcmp(tmpbuffer,"USA",3)==0) {
1325 pDevice->config_file.ZoneType=ZoneType_USA;
1326 }
1327 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
1328 pDevice->config_file.ZoneType=ZoneType_Japan;
1329 }
1330 else if(memcmp(tmpbuffer,"EUROPE",6)==0) {
1331 pDevice->config_file.ZoneType=ZoneType_Europe;
1332 }
1333 else {
1334 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
1335 }
1336 }
1337 }
1338
1339 /* get other parameter */
1340 {
1341 memset(tmpbuffer,0,sizeof(tmpbuffer));
1342 if(Config_FileGetParameter("AUTHENMODE",tmpbuffer,buffer)==true) {
1343 pDevice->config_file.eAuthenMode = (int) simple_strtol(tmpbuffer, NULL, 10);
1344 }
1345
1346 memset(tmpbuffer,0,sizeof(tmpbuffer));
1347 if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer,buffer)==true) {
1348 pDevice->config_file.eEncryptionStatus= (int) simple_strtol(tmpbuffer, NULL, 10);
1349 }
1350 }
1351
1352 kfree(buffer);
1353 return result;
1354 }
1355
device_set_multi(struct net_device * dev)1356 static void device_set_multi(struct net_device *dev)
1357 {
1358 struct vnt_private *pDevice = netdev_priv(dev);
1359 struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
1360 struct netdev_hw_addr *ha;
1361 u32 mc_filter[2];
1362 int ii;
1363 u8 pbyData[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1364 u8 byTmpMode = 0;
1365 int rc;
1366
1367 spin_lock_irq(&pDevice->lock);
1368 rc = CONTROLnsRequestIn(pDevice,
1369 MESSAGE_TYPE_READ,
1370 MAC_REG_RCR,
1371 MESSAGE_REQUEST_MACREG,
1372 1,
1373 &byTmpMode
1374 );
1375 if (rc == 0) pDevice->byRxMode = byTmpMode;
1376
1377 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode in= %x\n", pDevice->byRxMode);
1378
1379 if (dev->flags & IFF_PROMISC) { /* set promiscuous mode */
1380 DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
1381 /* unconditionally log net taps */
1382 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
1383 }
1384 else if ((netdev_mc_count(dev) > pDevice->multicast_limit) ||
1385 (dev->flags & IFF_ALLMULTI)) {
1386 CONTROLnsRequestOut(pDevice,
1387 MESSAGE_TYPE_WRITE,
1388 MAC_REG_MAR0,
1389 MESSAGE_REQUEST_MACREG,
1390 8,
1391 pbyData
1392 );
1393 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1394 }
1395 else {
1396 memset(mc_filter, 0, sizeof(mc_filter));
1397 netdev_for_each_mc_addr(ha, dev) {
1398 int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
1399 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
1400 }
1401 for (ii = 0; ii < 4; ii++) {
1402 MACvWriteMultiAddr(pDevice, ii, *((u8 *)&mc_filter[0] + ii));
1403 MACvWriteMultiAddr(pDevice, ii+ 4, *((u8 *)&mc_filter[1] + ii));
1404 }
1405 pDevice->byRxMode &= ~(RCR_UNICAST);
1406 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1407 }
1408
1409 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1410 /*
1411 * If AP mode, don't enable RCR_UNICAST since HW only compares
1412 * addr1 with local MAC
1413 */
1414 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1415 pDevice->byRxMode &= ~(RCR_UNICAST);
1416 }
1417 ControlvWriteByte(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_RCR, pDevice->byRxMode);
1418 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode out= %x\n", pDevice->byRxMode);
1419 spin_unlock_irq(&pDevice->lock);
1420
1421 }
1422
device_get_stats(struct net_device * dev)1423 static struct net_device_stats *device_get_stats(struct net_device *dev)
1424 {
1425 struct vnt_private *pDevice = netdev_priv(dev);
1426
1427 return &pDevice->stats;
1428 }
1429
device_ioctl(struct net_device * dev,struct ifreq * rq,int cmd)1430 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1431 {
1432 struct vnt_private *pDevice = netdev_priv(dev);
1433 struct iwreq *wrq = (struct iwreq *) rq;
1434 int rc = 0;
1435
1436 switch (cmd) {
1437
1438 case IOCTL_CMD_HOSTAPD:
1439
1440 if (!(pDevice->flags & DEVICE_FLAGS_OPENED))
1441 rc = -EFAULT;
1442
1443 rc = vt6656_hostap_ioctl(pDevice, &wrq->u.data);
1444 break;
1445
1446 case SIOCETHTOOL:
1447 return ethtool_ioctl(dev, (void *) rq->ifr_data);
1448
1449 }
1450
1451 return rc;
1452 }
1453
ethtool_ioctl(struct net_device * dev,void * useraddr)1454 static int ethtool_ioctl(struct net_device *dev, void *useraddr)
1455 {
1456 u32 ethcmd;
1457
1458 if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd)))
1459 return -EFAULT;
1460
1461 switch (ethcmd) {
1462 case ETHTOOL_GDRVINFO: {
1463 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
1464 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
1465 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
1466 if (copy_to_user(useraddr, &info, sizeof(info)))
1467 return -EFAULT;
1468 return 0;
1469 }
1470
1471 }
1472
1473 return -EOPNOTSUPP;
1474 }
1475
1476 MODULE_DEVICE_TABLE(usb, vt6656_table);
1477
1478 static struct usb_driver vt6656_driver = {
1479 .name = DEVICE_NAME,
1480 .probe = vt6656_probe,
1481 .disconnect = vt6656_disconnect,
1482 .id_table = vt6656_table,
1483 #ifdef CONFIG_PM
1484 .suspend = vt6656_suspend,
1485 .resume = vt6656_resume,
1486 #endif /* CONFIG_PM */
1487 };
1488
1489 module_usb_driver(vt6656_driver);
1490