2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
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.
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.
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.
21 * Purpose: driver entry for initial, open, close, tx and rx.
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
49 #include <linux/file.h>
76 /* static int msglevel = MSG_LEVEL_DEBUG; */
77 static int msglevel =MSG_LEVEL_INFO;
80 * define module options
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);
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);
95 #define RX_DESC_DEF0 64
96 DEVICE_PARAM(RxDescriptors0,"Number of receive usb desc buffer");
98 #define TX_DESC_DEF0 64
99 DEVICE_PARAM(TxDescriptors0,"Number of transmit usb desc buffer");
101 #define CHANNEL_DEF 6
102 DEVICE_PARAM(Channel, "Channel number");
104 /* PreambleType[] is the preamble length used for transmit.
105 0: indicate allows long preamble type
106 1: indicate allows short preamble type
109 #define PREAMBLE_TYPE_DEF 1
111 DEVICE_PARAM(PreambleType, "Preamble Type");
113 #define RTS_THRESH_DEF 2347
114 DEVICE_PARAM(RTSThreshold, "RTS threshold");
116 #define FRAG_THRESH_DEF 2346
117 DEVICE_PARAM(FragThreshold, "Fragmentation threshold");
119 #define DATA_RATE_DEF 13
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
137 DEVICE_PARAM(ConnectionRate, "Connection data rate");
139 #define OP_MODE_DEF 0
140 DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode ");
142 /* OpMode[] is used for transmit.
143 0: indicate infrastruct mode used
144 1: indicate adhoc mode used
145 2: indicate AP mode used
149 0: indicate disable power saving mode
150 1: indicate enable power saving mode
153 #define PS_MODE_DEF 0
154 DEVICE_PARAM(PSMode, "Power saving mode");
156 #define SHORT_RETRY_DEF 8
157 DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");
159 #define LONG_RETRY_DEF 4
160 DEVICE_PARAM(LongRetryLimit, "long frame retry limits");
162 /* BasebandType[] baseband type selected
163 0: indicate 802.11a type
164 1: indicate 802.11b type
165 2: indicate 802.11g type
168 #define BBP_TYPE_DEF 2
169 DEVICE_PARAM(BasebandType, "baseband type");
172 0: indicate disable 802.11h
173 1: indicate enable 802.11h
176 #define X80211h_MODE_DEF 0
178 DEVICE_PARAM(b80211hEnable, "802.11h mode");
181 * Static vars definitions
184 static struct usb_device_id vt6656_table[] = {
185 {USB_DEVICE(VNT_USB_VENDOR_ID, VNT_USB_PRODUCT_ID)},
189 /* frequency list (map channels to frequencies) */
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
199 static const struct iw_handler_def iwctl_handler_def;
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);
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 */
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);
218 static int device_init_registers(struct vnt_private *pDevice);
219 static bool device_init_defrag_cb(struct vnt_private *pDevice);
220 static void device_init_diversity_timer(struct vnt_private *pDevice);
221 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev);
223 static int ethtool_ioctl(struct net_device *dev, void *useraddr);
224 static void device_free_tx_bufs(struct vnt_private *pDevice);
225 static void device_free_rx_bufs(struct vnt_private *pDevice);
226 static void device_free_int_bufs(struct vnt_private *pDevice);
227 static void device_free_frag_bufs(struct vnt_private *pDevice);
228 static bool device_alloc_bufs(struct vnt_private *pDevice);
230 static int Read_config_file(struct vnt_private *pDevice);
231 static unsigned char *Config_FileOperation(struct vnt_private *pDevice);
232 static int Config_FileGetParameter(unsigned char *string,
234 unsigned char *source);
236 static void usb_device_reset(struct vnt_private *pDevice);
239 device_set_options(struct vnt_private *pDevice) {
241 u8 abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
242 u8 abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
243 u8 abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
245 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
246 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
247 memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, ETH_ALEN);
249 pDevice->cbTD = TX_DESC_DEF0;
250 pDevice->cbRD = RX_DESC_DEF0;
251 pDevice->uChannel = CHANNEL_DEF;
252 pDevice->wRTSThreshold = RTS_THRESH_DEF;
253 pDevice->wFragmentationThreshold = FRAG_THRESH_DEF;
254 pDevice->byShortRetryLimit = SHORT_RETRY_DEF;
255 pDevice->byLongRetryLimit = LONG_RETRY_DEF;
256 pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME;
257 pDevice->byShortPreamble = PREAMBLE_TYPE_DEF;
258 pDevice->ePSMode = PS_MODE_DEF;
259 pDevice->b11hEnable = X80211h_MODE_DEF;
260 pDevice->eOPMode = OP_MODE_DEF;
261 pDevice->uConnectionRate = DATA_RATE_DEF;
262 if (pDevice->uConnectionRate < RATE_AUTO) pDevice->bFixRate = true;
263 pDevice->byBBType = BBP_TYPE_DEF;
264 pDevice->byPacketType = pDevice->byBBType;
265 pDevice->byAutoFBCtrl = AUTO_FB_0;
266 pDevice->bUpdateBBVGA = true;
267 pDevice->byFOETuning = 0;
268 pDevice->byAutoPwrTunning = 0;
269 pDevice->byPreambleType = 0;
270 pDevice->bExistSWNetAddr = false;
271 /* pDevice->bDiversityRegCtlON = true; */
272 pDevice->bDiversityRegCtlON = false;
275 static void device_init_diversity_timer(struct vnt_private *pDevice)
277 init_timer(&pDevice->TimerSQ3Tmax1);
278 pDevice->TimerSQ3Tmax1.data = (unsigned long)pDevice;
279 pDevice->TimerSQ3Tmax1.function = (TimerFunction)TimerSQ3CallBack;
280 pDevice->TimerSQ3Tmax1.expires = RUN_AT(HZ);
282 init_timer(&pDevice->TimerSQ3Tmax2);
283 pDevice->TimerSQ3Tmax2.data = (unsigned long)pDevice;
284 pDevice->TimerSQ3Tmax2.function = (TimerFunction)TimerSQ3CallBack;
285 pDevice->TimerSQ3Tmax2.expires = RUN_AT(HZ);
287 init_timer(&pDevice->TimerSQ3Tmax3);
288 pDevice->TimerSQ3Tmax3.data = (unsigned long)pDevice;
289 pDevice->TimerSQ3Tmax3.function = (TimerFunction)TimerSQ3Tmax3CallBack;
290 pDevice->TimerSQ3Tmax3.expires = RUN_AT(HZ);
296 * initialization of MAC & BBP registers
299 static int device_init_registers(struct vnt_private *pDevice)
301 struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
302 u8 abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
303 u8 abySNAP_RFC1042[ETH_ALEN] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00};
304 u8 abySNAP_Bridgetunnel[ETH_ALEN]
305 = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8};
308 CMD_CARD_INIT sInitCmd;
309 int ntStatus = STATUS_SUCCESS;
310 RSP_CARD_INIT sInitRsp;
312 u8 byCalibTXIQ = 0, byCalibTXDC = 0, byCalibRXIQ = 0;
314 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "---->INIbInitAdapter. [%d][%d]\n",
315 DEVICE_INIT_COLD, pDevice->byPacketType);
317 spin_lock_irq(&pDevice->lock);
319 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
320 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
321 memcpy(pDevice->abySNAP_Bridgetunnel,
322 abySNAP_Bridgetunnel,
325 if ( !FIRMWAREbCheckVersion(pDevice) ) {
326 if (FIRMWAREbDownload(pDevice) == true) {
327 if (FIRMWAREbBrach2Sram(pDevice) == false) {
328 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbBrach2Sram fail \n");
329 spin_unlock_irq(&pDevice->lock);
334 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" FIRMWAREbDownload fail \n");
335 spin_unlock_irq(&pDevice->lock);
340 if ( !BBbVT3184Init(pDevice) ) {
341 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" BBbVT3184Init fail \n");
342 spin_unlock_irq(&pDevice->lock);
346 sInitCmd.byInitClass = DEVICE_INIT_COLD;
347 sInitCmd.bExistSWNetAddr = (u8) pDevice->bExistSWNetAddr;
348 for (ii = 0; ii < 6; ii++)
349 sInitCmd.bySWNetAddr[ii] = pDevice->abyCurrentNetAddr[ii];
350 sInitCmd.byShortRetryLimit = pDevice->byShortRetryLimit;
351 sInitCmd.byLongRetryLimit = pDevice->byLongRetryLimit;
353 /* issue card_init command to device */
354 ntStatus = CONTROLnsRequestOut(pDevice,
355 MESSAGE_TYPE_CARDINIT,
358 sizeof(CMD_CARD_INIT),
361 if ( ntStatus != STATUS_SUCCESS ) {
362 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Issue Card init fail \n");
363 spin_unlock_irq(&pDevice->lock);
367 ntStatus = CONTROLnsRequestIn(pDevice, MESSAGE_TYPE_INIT_RSP, 0, 0,
368 sizeof(RSP_CARD_INIT), (u8 *) &(sInitRsp));
369 if (ntStatus != STATUS_SUCCESS) {
370 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
371 "Cardinit request in status fail!\n");
372 spin_unlock_irq(&pDevice->lock);
376 /* local ID for AES functions */
377 ntStatus = CONTROLnsRequestIn(pDevice, MESSAGE_TYPE_READ,
378 MAC_REG_LOCALID, MESSAGE_REQUEST_MACREG, 1,
379 &pDevice->byLocalID);
380 if (ntStatus != STATUS_SUCCESS) {
381 spin_unlock_irq(&pDevice->lock);
385 /* do MACbSoftwareReset in MACvInitialize */
388 pDevice->bCCK = true;
389 pDevice->bProtectMode = false;
390 /* only used in 11g type, sync with ERP IE */
391 pDevice->bNonERPPresent = false;
392 pDevice->bBarkerPreambleMd = false;
393 if (pDevice->bFixRate) {
394 pDevice->wCurrentRate = (u16)pDevice->uConnectionRate;
396 if (pDevice->byBBType == BB_TYPE_11B)
397 pDevice->wCurrentRate = RATE_11M;
399 pDevice->wCurrentRate = RATE_54M;
402 CHvInitChannelTable(pDevice);
404 pDevice->byTopOFDMBasicRate = RATE_24M;
405 pDevice->byTopCCKBasicRate = RATE_1M;
406 pDevice->byRevId = 0;
407 /* target to IF pin while programming to RF chip */
408 pDevice->byCurPwr = 0xFF;
410 pDevice->byCCKPwr = pDevice->abyEEPROM[EEP_OFS_PWR_CCK];
411 pDevice->byOFDMPwrG = pDevice->abyEEPROM[EEP_OFS_PWR_OFDMG];
412 /* load power table */
413 for (ii = 0; ii < 14; ii++) {
414 pDevice->abyCCKPwrTbl[ii] =
415 pDevice->abyEEPROM[ii + EEP_OFS_CCK_PWR_TBL];
417 if (pDevice->abyCCKPwrTbl[ii] == 0)
418 pDevice->abyCCKPwrTbl[ii] = pDevice->byCCKPwr;
419 pDevice->abyOFDMPwrTbl[ii] =
420 pDevice->abyEEPROM[ii + EEP_OFS_OFDM_PWR_TBL];
421 if (pDevice->abyOFDMPwrTbl[ii] == 0)
422 pDevice->abyOFDMPwrTbl[ii] = pDevice->byOFDMPwrG;
426 * original zonetype is USA, but custom zonetype is Europe,
427 * then need to recover 12, 13, 14 channels with 11 channel
429 if (((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) ||
430 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe)) &&
431 (pDevice->byOriginalZonetype == ZoneType_USA)) {
432 for (ii = 11; ii < 14; ii++) {
433 pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
434 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];
438 pDevice->byOFDMPwrA = 0x34; /* same as RFbMA2829SelectChannel */
440 /* load OFDM A power table */
441 for (ii = 0; ii < CB_MAX_CHANNEL_5G; ii++) {
442 pDevice->abyOFDMAPwrTbl[ii] =
443 pDevice->abyEEPROM[ii + EEP_OFS_OFDMA_PWR_TBL];
445 if (pDevice->abyOFDMAPwrTbl[ii] == 0)
446 pDevice->abyOFDMAPwrTbl[ii] = pDevice->byOFDMPwrA;
449 byAntenna = pDevice->abyEEPROM[EEP_OFS_ANTENNA];
451 if (byAntenna & EEP_ANTINV)
452 pDevice->bTxRxAntInv = true;
454 pDevice->bTxRxAntInv = false;
456 byAntenna &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
458 if (byAntenna == 0) /* if not set default is both */
459 byAntenna = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
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;
467 if (pDevice->bTxRxAntInv == true)
468 pDevice->byRxAntennaMode = ANT_A;
470 pDevice->byRxAntennaMode = ANT_B;
472 if (pDevice->bDiversityRegCtlON)
473 pDevice->bDiversityEnable = true;
475 pDevice->bDiversityEnable = false;
477 pDevice->bDiversityEnable = false;
478 pDevice->byAntennaCount = 1;
479 pDevice->dwTxAntennaSel = 0;
480 pDevice->dwRxAntennaSel = 0;
482 if (byAntenna & EEP_ANTENNA_AUX) {
483 pDevice->byTxAntennaMode = ANT_A;
485 if (pDevice->bTxRxAntInv == true)
486 pDevice->byRxAntennaMode = ANT_B;
488 pDevice->byRxAntennaMode = ANT_A;
490 pDevice->byTxAntennaMode = ANT_B;
492 if (pDevice->bTxRxAntInv == true)
493 pDevice->byRxAntennaMode = ANT_A;
495 pDevice->byRxAntennaMode = ANT_B;
499 pDevice->ulDiversityNValue = 100 * 255;
500 pDevice->ulDiversityMValue = 100 * 16;
502 pDevice->byTMax2 = 4;
503 pDevice->ulSQ3TH = 0;
504 pDevice->byTMax3 = 64;
506 /* get Auto Fall Back type */
507 pDevice->byAutoFBCtrl = AUTO_FB_0;
510 pDevice->uScanTime = WLAN_SCAN_MINITIME;
512 /* default Auto Mode */
513 /* pDevice->NetworkType = Ndis802_11Automode; */
514 pDevice->eConfigPHYMode = PHY_TYPE_AUTO;
515 pDevice->byBBType = BB_TYPE_11G;
517 /* initialize BBP registers */
518 pDevice->ulTxPower = 25;
520 /* get channel range */
521 pDevice->byMinChannel = 1;
522 pDevice->byMaxChannel = CB_MAX_CHANNEL;
525 pDevice->byRFType = sInitRsp.byRFType;
527 if ((pDevice->byRFType & RF_EMU) != 0) {
528 /* force change RevID for VT3253 emu */
529 pDevice->byRevId = 0x80;
532 /* load vt3266 calibration parameters in EEPROM */
533 if (pDevice->byRFType == RF_VT3226D0) {
534 if ((pDevice->abyEEPROM[EEP_OFS_MAJOR_VER] == 0x1) &&
535 (pDevice->abyEEPROM[EEP_OFS_MINOR_VER] >= 0x4)) {
537 byCalibTXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_IQ];
538 byCalibTXDC = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_DC];
539 byCalibRXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_RX_IQ];
540 if (byCalibTXIQ || byCalibTXDC || byCalibRXIQ) {
541 /* CR255, enable TX/RX IQ and DC compensation mode */
542 ControlvWriteByte(pDevice,
543 MESSAGE_REQUEST_BBREG,
546 /* CR251, TX I/Q Imbalance Calibration */
547 ControlvWriteByte(pDevice,
548 MESSAGE_REQUEST_BBREG,
551 /* CR252, TX DC-Offset Calibration */
552 ControlvWriteByte(pDevice,
553 MESSAGE_REQUEST_BBREG,
556 /* CR253, RX I/Q Imbalance Calibration */
557 ControlvWriteByte(pDevice,
558 MESSAGE_REQUEST_BBREG,
562 /* CR255, turn off BB Calibration compensation */
563 ControlvWriteByte(pDevice,
564 MESSAGE_REQUEST_BBREG,
570 pMgmt->eScanType = WMAC_SCAN_PASSIVE;
571 pMgmt->uCurrChannel = pDevice->uChannel;
572 pMgmt->uIBSSChannel = pDevice->uChannel;
573 CARDbSetMediaChannel(pDevice, pMgmt->uCurrChannel);
575 /* get permanent network address */
576 memcpy(pDevice->abyPermanentNetAddr, &sInitRsp.byNetAddr[0], 6);
577 memcpy(pDevice->abyCurrentNetAddr,
578 pDevice->abyPermanentNetAddr,
581 /* if exist SW network address, use it */
582 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Network address = %pM\n",
583 pDevice->abyCurrentNetAddr);
586 * set BB and packet type at the same time
587 * set Short Slot Time, xIFS, and RSPINF
589 if (pDevice->byBBType == BB_TYPE_11A) {
590 CARDbAddBasicRate(pDevice, RATE_6M);
591 pDevice->bShortSlotTime = true;
593 CARDbAddBasicRate(pDevice, RATE_1M);
594 pDevice->bShortSlotTime = false;
596 BBvSetShortSlotTime(pDevice);
597 CARDvSetBSSMode(pDevice);
599 if (pDevice->bUpdateBBVGA) {
600 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
601 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
602 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
605 pDevice->byRadioCtl = pDevice->abyEEPROM[EEP_OFS_RADIOCTL];
606 pDevice->bHWRadioOff = false;
607 if ( (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) != 0 ) {
608 ntStatus = CONTROLnsRequestIn(pDevice,
611 MESSAGE_REQUEST_MACREG,
615 if ( ntStatus != STATUS_SUCCESS ) {
616 spin_unlock_irq(&pDevice->lock);
619 if ( (byTmp & GPIO3_DATA) == 0 ) {
620 pDevice->bHWRadioOff = true;
621 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
623 MACvRegBitsOff(pDevice,MAC_REG_GPIOCTL1,GPIO3_INTMD);
624 pDevice->bHWRadioOff = false;
629 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_TMLEN,0x38);
630 ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
631 MACvRegBitsOn(pDevice,MAC_REG_GPIOCTL0,0x01);
633 if ((pDevice->bHWRadioOff == true) || (pDevice->bRadioControlOff == true)) {
634 CARDbRadioPowerOff(pDevice);
636 CARDbRadioPowerOn(pDevice);
639 spin_unlock_irq(&pDevice->lock);
640 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"<----INIbInitAdapter Exit\n");
644 #ifdef CONFIG_PM /* Minimal support for suspend and resume */
646 static int vt6656_suspend(struct usb_interface *intf, pm_message_t message)
648 struct vnt_private *device = usb_get_intfdata(intf);
650 if (!device || !device->dev)
653 if (device->flags & DEVICE_FLAGS_OPENED)
654 device_close(device->dev);
659 static int vt6656_resume(struct usb_interface *intf)
661 struct vnt_private *device = usb_get_intfdata(intf);
663 if (!device || !device->dev)
666 if (!(device->flags & DEVICE_FLAGS_OPENED))
667 device_open(device->dev);
672 #endif /* CONFIG_PM */
674 static const struct net_device_ops device_netdev_ops = {
675 .ndo_open = device_open,
676 .ndo_stop = device_close,
677 .ndo_do_ioctl = device_ioctl,
678 .ndo_get_stats = device_get_stats,
679 .ndo_start_xmit = device_xmit,
680 .ndo_set_rx_mode = device_set_multi,
684 vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id)
686 u8 fake_mac[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
687 struct usb_device *udev = interface_to_usbdev(intf);
689 struct net_device *netdev = NULL;
690 struct vnt_private *pDevice;
692 printk(KERN_NOTICE "%s Ver. %s\n", DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
693 printk(KERN_NOTICE "Copyright (c) 2004 VIA Networking Technologies, Inc.\n");
695 udev = usb_get_dev(udev);
696 netdev = alloc_etherdev(sizeof(struct vnt_private));
698 printk(KERN_ERR DEVICE_NAME ": allocate net device failed\n");
703 pDevice = netdev_priv(netdev);
704 memset(pDevice, 0, sizeof(struct vnt_private));
706 pDevice->dev = netdev;
709 device_set_options(pDevice);
710 spin_lock_init(&pDevice->lock);
711 INIT_DELAYED_WORK(&pDevice->run_command_work, vRunCommand);
712 INIT_DELAYED_WORK(&pDevice->second_callback_work, BSSvSecondCallBack);
713 INIT_WORK(&pDevice->read_work_item, RXvWorkItem);
714 INIT_WORK(&pDevice->rx_mng_work_item, RXvMngWorkItem);
716 pDevice->pControlURB = usb_alloc_urb(0, GFP_ATOMIC);
717 if (!pDevice->pControlURB) {
718 DBG_PRT(MSG_LEVEL_ERR, KERN_ERR"Failed to alloc control urb\n");
722 pDevice->tx_80211 = device_dma0_tx_80211;
723 pDevice->vnt_mgmt.pAdapter = (void *) pDevice;
725 netdev->netdev_ops = &device_netdev_ops;
726 netdev->wireless_handlers =
727 (struct iw_handler_def *) &iwctl_handler_def;
729 usb_set_intfdata(intf, pDevice);
730 SET_NETDEV_DEV(netdev, &intf->dev);
731 memcpy(pDevice->dev->dev_addr, fake_mac, ETH_ALEN);
733 usb_device_reset(pDevice);
735 rc = register_netdev(netdev);
737 printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
751 static void device_free_tx_bufs(struct vnt_private *pDevice)
753 struct vnt_usb_send_context *pTxContext;
756 for (ii = 0; ii < pDevice->cbTD; ii++) {
758 pTxContext = pDevice->apTD[ii];
759 /* deallocate URBs */
760 if (pTxContext->pUrb) {
761 usb_kill_urb(pTxContext->pUrb);
762 usb_free_urb(pTxContext->pUrb);
769 static void device_free_rx_bufs(struct vnt_private *pDevice)
771 struct vnt_rcb *pRCB;
774 for (ii = 0; ii < pDevice->cbRD; ii++) {
776 pRCB = pDevice->apRCB[ii];
777 /* deallocate URBs */
779 usb_kill_urb(pRCB->pUrb);
780 usb_free_urb(pRCB->pUrb);
784 dev_kfree_skb(pRCB->skb);
786 kfree(pDevice->pRCBMem);
791 static void usb_device_reset(struct vnt_private *pDevice)
794 status = usb_reset_device(pDevice->usb);
796 printk("usb_device_reset fail status=%d\n",status);
800 static void device_free_int_bufs(struct vnt_private *pDevice)
802 kfree(pDevice->intBuf.pDataBuf);
806 static bool device_alloc_bufs(struct vnt_private *pDevice)
808 struct vnt_usb_send_context *pTxContext;
809 struct vnt_rcb *pRCB;
812 for (ii = 0; ii < pDevice->cbTD; ii++) {
814 pTxContext = kmalloc(sizeof(struct vnt_usb_send_context), GFP_KERNEL);
815 if (pTxContext == NULL) {
816 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate tx usb context failed\n", pDevice->dev->name);
819 pDevice->apTD[ii] = pTxContext;
820 pTxContext->pDevice = (void *) pDevice;
822 pTxContext->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
823 if (pTxContext->pUrb == NULL) {
824 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "alloc tx urb failed\n");
827 pTxContext->bBoolInUse = false;
830 /* allocate RCB mem */
831 pDevice->pRCBMem = kzalloc((sizeof(struct vnt_rcb) * pDevice->cbRD),
833 if (pDevice->pRCBMem == NULL) {
834 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : alloc rx usb context failed\n", pDevice->dev->name);
838 pDevice->FirstRecvFreeList = NULL;
839 pDevice->LastRecvFreeList = NULL;
840 pDevice->FirstRecvMngList = NULL;
841 pDevice->LastRecvMngList = NULL;
842 pDevice->NumRecvFreeList = 0;
844 pRCB = (struct vnt_rcb *)pDevice->pRCBMem;
846 for (ii = 0; ii < pDevice->cbRD; ii++) {
848 pDevice->apRCB[ii] = pRCB;
849 pRCB->pDevice = (void *) pDevice;
851 pRCB->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
853 if (pRCB->pUrb == NULL) {
854 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx urb\n");
857 pRCB->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
858 if (pRCB->skb == NULL) {
859 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx skb\n");
862 pRCB->skb->dev = pDevice->dev;
863 pRCB->bBoolInUse = false;
864 EnqueueRCB(pDevice->FirstRecvFreeList, pDevice->LastRecvFreeList, pRCB);
865 pDevice->NumRecvFreeList++;
869 pDevice->pInterruptURB = usb_alloc_urb(0, GFP_ATOMIC);
870 if (pDevice->pInterruptURB == NULL) {
871 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int urb\n");
875 pDevice->intBuf.pDataBuf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL);
876 if (pDevice->intBuf.pDataBuf == NULL) {
877 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int buf\n");
878 usb_free_urb(pDevice->pInterruptURB);
885 device_free_rx_bufs(pDevice);
888 device_free_tx_bufs(pDevice);
893 static bool device_init_defrag_cb(struct vnt_private *pDevice)
896 PSDeFragControlBlock pDeF;
898 /* Init the fragment ctl entries */
899 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
900 pDeF = &(pDevice->sRxDFCB[i]);
901 if (!device_alloc_frag_buf(pDevice, pDeF)) {
902 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
907 pDevice->cbDFCB = CB_MAX_RX_FRAG;
908 pDevice->cbFreeDFCB = pDevice->cbDFCB;
912 device_free_frag_bufs(pDevice);
916 static void device_free_frag_bufs(struct vnt_private *pDevice)
918 PSDeFragControlBlock pDeF;
921 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
923 pDeF = &(pDevice->sRxDFCB[i]);
926 dev_kfree_skb(pDeF->skb);
930 int device_alloc_frag_buf(struct vnt_private *pDevice,
931 PSDeFragControlBlock pDeF)
934 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
935 if (pDeF->skb == NULL)
937 pDeF->skb->dev = pDevice->dev;
942 static int device_open(struct net_device *dev)
944 struct vnt_private *pDevice = netdev_priv(dev);
946 pDevice->fWPA_Authened = false;
948 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_open...\n");
950 pDevice->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS;
952 if (device_alloc_bufs(pDevice) == false) {
953 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_alloc_bufs fail... \n");
957 if (device_init_defrag_cb(pDevice)== false) {
958 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Initial defragment cb fail \n");
962 MP_CLEAR_FLAG(pDevice, fMP_DISCONNECTED);
963 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
964 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
965 MP_SET_FLAG(pDevice, fMP_POST_READS);
966 MP_SET_FLAG(pDevice, fMP_POST_WRITES);
968 /* read config file */
969 Read_config_file(pDevice);
971 if (device_init_registers(pDevice) == false) {
972 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " init register fail\n");
976 device_set_multi(pDevice->dev);
978 /* init for key management */
979 KeyvInitTable(pDevice,&pDevice->sKey);
980 memcpy(pDevice->vnt_mgmt.abyMACAddr,
981 pDevice->abyCurrentNetAddr, ETH_ALEN);
982 memcpy(pDevice->dev->dev_addr, pDevice->abyCurrentNetAddr, ETH_ALEN);
983 pDevice->bStopTx0Pkt = false;
984 pDevice->bStopDataPkt = false;
985 pDevice->bRoaming = false;
986 pDevice->bIsRoaming = false;
987 pDevice->bEnableRoaming = false;
988 if (pDevice->bDiversityRegCtlON) {
989 device_init_diversity_timer(pDevice);
992 vMgrObjectInit(pDevice);
994 tasklet_init(&pDevice->EventWorkItem, (void *)INTvWorkItem, (unsigned long)pDevice);
996 schedule_delayed_work(&pDevice->second_callback_work, HZ);
998 pDevice->int_interval = 100; /* max 100 microframes */
999 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1001 pDevice->bIsRxWorkItemQueued = true;
1002 pDevice->fKillEventPollingThread = false;
1003 pDevice->bEventAvailable = false;
1005 pDevice->bWPADEVUp = false;
1006 pDevice->bwextstep0 = false;
1007 pDevice->bwextstep1 = false;
1008 pDevice->bwextstep2 = false;
1009 pDevice->bwextstep3 = false;
1010 pDevice->bWPASuppWextEnabled = false;
1011 pDevice->byReAssocCount = 0;
1013 schedule_work(&pDevice->read_work_item);
1014 INTvWorkItem(pDevice);
1016 /* if WEP key already set by iwconfig but device not yet open */
1017 if ((pDevice->bEncryptionEnable == true) && (pDevice->bTransmitKey == true)) {
1018 spin_lock_irq(&pDevice->lock);
1019 KeybSetDefaultKey( pDevice,
1021 pDevice->byKeyIndex | (1 << 31),
1022 pDevice->uKeyLength,
1027 spin_unlock_irq(&pDevice->lock);
1028 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1031 if (pDevice->vnt_mgmt.eConfigMode == WMAC_CONFIG_AP)
1032 bScheduleCommand((void *) pDevice, WLAN_CMD_RUN_AP, NULL);
1034 bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1036 netif_stop_queue(pDevice->dev);
1037 pDevice->flags |= DEVICE_FLAGS_OPENED;
1039 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success..\n");
1043 device_free_frag_bufs(pDevice);
1045 device_free_rx_bufs(pDevice);
1046 device_free_tx_bufs(pDevice);
1047 device_free_int_bufs(pDevice);
1048 usb_kill_urb(pDevice->pInterruptURB);
1049 usb_free_urb(pDevice->pInterruptURB);
1051 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open fail.. \n");
1055 static int device_close(struct net_device *dev)
1057 struct vnt_private *pDevice = netdev_priv(dev);
1058 struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
1061 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close1\n");
1062 if (pDevice == NULL)
1065 if (pDevice->bLinkPass) {
1066 bScheduleCommand((void *) pDevice, WLAN_CMD_DISASSOCIATE, NULL);
1070 memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
1071 pMgmt->bShareKeyAlgorithm = false;
1072 pDevice->bEncryptionEnable = false;
1073 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1074 spin_lock_irq(&pDevice->lock);
1075 for (uu = 0; uu < MAX_KEY_TABLE; uu++)
1076 MACvDisableKeyEntry(pDevice,uu);
1077 spin_unlock_irq(&pDevice->lock);
1079 if ((pDevice->flags & DEVICE_FLAGS_UNPLUG) == false) {
1080 MACbShutdown(pDevice);
1082 netif_stop_queue(pDevice->dev);
1083 MP_SET_FLAG(pDevice, fMP_DISCONNECTED);
1084 MP_CLEAR_FLAG(pDevice, fMP_POST_WRITES);
1085 MP_CLEAR_FLAG(pDevice, fMP_POST_READS);
1086 pDevice->fKillEventPollingThread = true;
1088 cancel_delayed_work_sync(&pDevice->run_command_work);
1089 cancel_delayed_work_sync(&pDevice->second_callback_work);
1091 if (pDevice->bDiversityRegCtlON) {
1092 del_timer(&pDevice->TimerSQ3Tmax1);
1093 del_timer(&pDevice->TimerSQ3Tmax2);
1094 del_timer(&pDevice->TimerSQ3Tmax3);
1097 cancel_work_sync(&pDevice->rx_mng_work_item);
1098 cancel_work_sync(&pDevice->read_work_item);
1100 tasklet_kill(&pDevice->EventWorkItem);
1102 pDevice->bRoaming = false;
1103 pDevice->bIsRoaming = false;
1104 pDevice->bEnableRoaming = false;
1105 pDevice->bCmdRunning = false;
1106 pDevice->bLinkPass = false;
1107 memset(pMgmt->abyCurrBSSID, 0, 6);
1108 pMgmt->eCurrState = WMAC_STATE_IDLE;
1110 pDevice->flags &= ~DEVICE_FLAGS_OPENED;
1112 device_free_tx_bufs(pDevice);
1113 device_free_rx_bufs(pDevice);
1114 device_free_int_bufs(pDevice);
1115 device_free_frag_bufs(pDevice);
1117 usb_kill_urb(pDevice->pInterruptURB);
1118 usb_free_urb(pDevice->pInterruptURB);
1120 BSSvClearNodeDBTable(pDevice, 0);
1122 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n");
1127 static void vt6656_disconnect(struct usb_interface *intf)
1129 struct vnt_private *device = usb_get_intfdata(intf);
1134 usb_set_intfdata(intf, NULL);
1135 usb_put_dev(interface_to_usbdev(intf));
1137 device->flags |= DEVICE_FLAGS_UNPLUG;
1140 unregister_netdev(device->dev);
1142 usb_kill_urb(device->pControlURB);
1143 usb_free_urb(device->pControlURB);
1145 free_netdev(device->dev);
1149 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev)
1151 struct vnt_private *pDevice = netdev_priv(dev);
1153 spin_lock_irq(&pDevice->lock);
1155 if (unlikely(pDevice->bStopTx0Pkt))
1156 dev_kfree_skb_irq(skb);
1158 vDMA0_tx_80211(pDevice, skb);
1160 spin_unlock_irq(&pDevice->lock);
1162 return NETDEV_TX_OK;
1165 static int device_xmit(struct sk_buff *skb, struct net_device *dev)
1167 struct vnt_private *pDevice = netdev_priv(dev);
1168 struct net_device_stats *stats = &pDevice->stats;
1170 spin_lock_irq(&pDevice->lock);
1172 netif_stop_queue(dev);
1174 if (!pDevice->bLinkPass) {
1175 dev_kfree_skb_irq(skb);
1179 if (pDevice->bStopDataPkt) {
1180 dev_kfree_skb_irq(skb);
1181 stats->tx_dropped++;
1185 if (nsDMA_tx_packet(pDevice, TYPE_AC0DMA, skb)) {
1186 if (netif_queue_stopped(dev))
1187 netif_wake_queue(dev);
1191 spin_unlock_irq(&pDevice->lock);
1193 return NETDEV_TX_OK;
1196 static unsigned const ethernet_polynomial = 0x04c11db7U;
1197 static inline u32 ether_crc(int length, unsigned char *data)
1201 while(--length >= 0) {
1202 unsigned char current_octet = *data++;
1204 for (bit = 0; bit < 8; bit++, current_octet >>= 1) {
1206 ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
1212 /* find out the start position of str2 from str1 */
1213 static unsigned char *kstrstr(const unsigned char *str1,
1214 const unsigned char *str2) {
1215 int str1_len = strlen(str1);
1216 int str2_len = strlen(str2);
1218 while (str1_len >= str2_len) {
1220 if(memcmp(str1,str2,str2_len)==0)
1221 return (unsigned char *) str1;
1227 static int Config_FileGetParameter(unsigned char *string,
1228 unsigned char *dest,
1229 unsigned char *source)
1231 unsigned char buf1[100];
1232 unsigned char buf2[100];
1233 unsigned char *start_p = NULL, *end_p = NULL, *tmp_p = NULL;
1237 strcat(buf1, string);
1239 source+=strlen(buf1);
1241 /* find target string start point */
1242 start_p = kstrstr(source,buf1);
1243 if (start_p == NULL)
1246 /* check if current config line is marked by "#" */
1247 for (ii = 1; ; ii++) {
1248 if (memcmp(start_p - ii, "\n", 1) == 0)
1250 if (memcmp(start_p - ii, "#", 1) == 0)
1254 /* find target string end point */
1255 end_p = kstrstr(start_p,"\n");
1256 if (end_p == NULL) { /* can't find "\n", but don't care */
1257 end_p = start_p + strlen(start_p); /* no include "\n" */
1261 memcpy(buf2, start_p, end_p-start_p); /* get the target line */
1262 buf2[end_p-start_p]='\0';
1265 start_p = kstrstr(buf2,"=");
1266 if (start_p == NULL)
1269 strcpy(buf1,start_p+1);
1273 while(*tmp_p != 0x00) {
1280 memcpy(dest,tmp_p,strlen(tmp_p));
1284 /* if read fails, return NULL, or return data pointer */
1285 static unsigned char *Config_FileOperation(struct vnt_private *pDevice)
1287 unsigned char *buffer = kmalloc(1024, GFP_KERNEL);
1291 printk("allocate mem for file fail?\n");
1295 file = filp_open(CONFIG_PATH, O_RDONLY, 0);
1298 printk("Config_FileOperation file Not exist\n");
1302 if (kernel_read(file, 0, buffer, 1024) < 0) {
1303 printk("read file error?\n");
1312 /* return --->-1:fail; >=0:successful */
1313 static int Read_config_file(struct vnt_private *pDevice)
1316 unsigned char tmpbuffer[100];
1317 unsigned char *buffer = NULL;
1319 /* init config setting */
1320 pDevice->config_file.ZoneType = -1;
1321 pDevice->config_file.eAuthenMode = -1;
1322 pDevice->config_file.eEncryptionStatus = -1;
1324 buffer = Config_FileOperation(pDevice);
1325 if (buffer == NULL) {
1332 memset(tmpbuffer,0,sizeof(tmpbuffer));
1333 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer) ==true) {
1334 if(memcmp(tmpbuffer,"USA",3)==0) {
1335 pDevice->config_file.ZoneType=ZoneType_USA;
1337 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
1338 pDevice->config_file.ZoneType=ZoneType_Japan;
1340 else if(memcmp(tmpbuffer,"EUROPE",6)==0) {
1341 pDevice->config_file.ZoneType=ZoneType_Europe;
1344 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
1349 /* get other parameter */
1351 memset(tmpbuffer,0,sizeof(tmpbuffer));
1352 if(Config_FileGetParameter("AUTHENMODE",tmpbuffer,buffer)==true) {
1353 pDevice->config_file.eAuthenMode = (int) simple_strtol(tmpbuffer, NULL, 10);
1356 memset(tmpbuffer,0,sizeof(tmpbuffer));
1357 if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer,buffer)==true) {
1358 pDevice->config_file.eEncryptionStatus= (int) simple_strtol(tmpbuffer, NULL, 10);
1366 static void device_set_multi(struct net_device *dev)
1368 struct vnt_private *pDevice = netdev_priv(dev);
1369 struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
1370 struct netdev_hw_addr *ha;
1373 u8 pbyData[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1377 spin_lock_irq(&pDevice->lock);
1378 rc = CONTROLnsRequestIn(pDevice,
1381 MESSAGE_REQUEST_MACREG,
1385 if (rc == 0) pDevice->byRxMode = byTmpMode;
1387 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode in= %x\n", pDevice->byRxMode);
1389 if (dev->flags & IFF_PROMISC) { /* set promiscuous mode */
1390 DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
1391 /* unconditionally log net taps */
1392 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
1394 else if ((netdev_mc_count(dev) > pDevice->multicast_limit) ||
1395 (dev->flags & IFF_ALLMULTI)) {
1396 CONTROLnsRequestOut(pDevice,
1399 MESSAGE_REQUEST_MACREG,
1403 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1406 memset(mc_filter, 0, sizeof(mc_filter));
1407 netdev_for_each_mc_addr(ha, dev) {
1408 int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
1409 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
1411 for (ii = 0; ii < 4; ii++) {
1412 MACvWriteMultiAddr(pDevice, ii, *((u8 *)&mc_filter[0] + ii));
1413 MACvWriteMultiAddr(pDevice, ii+ 4, *((u8 *)&mc_filter[1] + ii));
1415 pDevice->byRxMode &= ~(RCR_UNICAST);
1416 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1419 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1421 * If AP mode, don't enable RCR_UNICAST since HW only compares
1422 * addr1 with local MAC
1424 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1425 pDevice->byRxMode &= ~(RCR_UNICAST);
1427 ControlvWriteByte(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_RCR, pDevice->byRxMode);
1428 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode out= %x\n", pDevice->byRxMode);
1429 spin_unlock_irq(&pDevice->lock);
1433 static struct net_device_stats *device_get_stats(struct net_device *dev)
1435 struct vnt_private *pDevice = netdev_priv(dev);
1437 return &pDevice->stats;
1440 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1442 struct vnt_private *pDevice = netdev_priv(dev);
1443 struct iwreq *wrq = (struct iwreq *) rq;
1448 case IOCTL_CMD_HOSTAPD:
1450 if (!(pDevice->flags & DEVICE_FLAGS_OPENED))
1453 rc = vt6656_hostap_ioctl(pDevice, &wrq->u.data);
1457 return ethtool_ioctl(dev, (void *) rq->ifr_data);
1464 static int ethtool_ioctl(struct net_device *dev, void *useraddr)
1468 if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd)))
1472 case ETHTOOL_GDRVINFO: {
1473 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
1474 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
1475 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
1476 if (copy_to_user(useraddr, &info, sizeof(info)))
1486 MODULE_DEVICE_TABLE(usb, vt6656_table);
1488 static struct usb_driver vt6656_driver = {
1489 .name = DEVICE_NAME,
1490 .probe = vt6656_probe,
1491 .disconnect = vt6656_disconnect,
1492 .id_table = vt6656_table,
1494 .suspend = vt6656_suspend,
1495 .resume = vt6656_resume,
1496 #endif /* CONFIG_PM */
1499 module_usb_driver(vt6656_driver);