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>
75 /* static int msglevel = MSG_LEVEL_DEBUG; */
76 static int msglevel =MSG_LEVEL_INFO;
79 * define module options
82 /* version information */
83 #define DRIVER_AUTHOR \
85 MODULE_AUTHOR(DRIVER_AUTHOR);
86 MODULE_LICENSE("GPL");
87 MODULE_DESCRIPTION(DEVICE_FULL_DRV_NAM);
89 #define DEVICE_PARAM(N,D) \
90 static int N[MAX_UINTS]=OPTION_DEFAULT;\
91 module_param_array(N, int, NULL, 0);\
92 MODULE_PARM_DESC(N, D);
94 #define RX_DESC_DEF0 64
95 DEVICE_PARAM(RxDescriptors0,"Number of receive usb desc buffer");
97 #define TX_DESC_DEF0 64
98 DEVICE_PARAM(TxDescriptors0,"Number of transmit usb desc buffer");
100 #define CHANNEL_DEF 6
101 DEVICE_PARAM(Channel, "Channel number");
103 /* PreambleType[] is the preamble length used for transmit.
104 0: indicate allows long preamble type
105 1: indicate allows short preamble type
108 #define PREAMBLE_TYPE_DEF 1
110 DEVICE_PARAM(PreambleType, "Preamble Type");
112 #define RTS_THRESH_DEF 2347
113 DEVICE_PARAM(RTSThreshold, "RTS threshold");
115 #define FRAG_THRESH_DEF 2346
116 DEVICE_PARAM(FragThreshold, "Fragmentation threshold");
118 #define DATA_RATE_DEF 13
120 0: indicate 1 Mbps 0x02
121 1: indicate 2 Mbps 0x04
122 2: indicate 5.5 Mbps 0x0B
123 3: indicate 11 Mbps 0x16
124 4: indicate 6 Mbps 0x0c
125 5: indicate 9 Mbps 0x12
126 6: indicate 12 Mbps 0x18
127 7: indicate 18 Mbps 0x24
128 8: indicate 24 Mbps 0x30
129 9: indicate 36 Mbps 0x48
130 10: indicate 48 Mbps 0x60
131 11: indicate 54 Mbps 0x6c
132 12: indicate 72 Mbps 0x90
133 13: indicate auto rate
136 DEVICE_PARAM(ConnectionRate, "Connection data rate");
138 #define OP_MODE_DEF 0
139 DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode ");
141 /* OpMode[] is used for transmit.
142 0: indicate infrastruct mode used
143 1: indicate adhoc mode used
144 2: indicate AP mode used
148 0: indicate disable power saving mode
149 1: indicate enable power saving mode
152 #define PS_MODE_DEF 0
153 DEVICE_PARAM(PSMode, "Power saving mode");
155 #define SHORT_RETRY_DEF 8
156 DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");
158 #define LONG_RETRY_DEF 4
159 DEVICE_PARAM(LongRetryLimit, "long frame retry limits");
161 /* BasebandType[] baseband type selected
162 0: indicate 802.11a type
163 1: indicate 802.11b type
164 2: indicate 802.11g type
167 #define BBP_TYPE_DEF 2
168 DEVICE_PARAM(BasebandType, "baseband type");
171 0: indicate disable 802.11h
172 1: indicate enable 802.11h
175 #define X80211h_MODE_DEF 0
177 DEVICE_PARAM(b80211hEnable, "802.11h mode");
180 * Static vars definitions
183 static struct usb_device_id vt6656_table[] = {
184 {USB_DEVICE(VNT_USB_VENDOR_ID, VNT_USB_PRODUCT_ID)},
188 /* frequency list (map channels to frequencies) */
190 static const long frequency_list[] = {
191 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 2484,
192 4915, 4920, 4925, 4935, 4940, 4945, 4960, 4980,
193 5035, 5040, 5045, 5055, 5060, 5080, 5170, 5180, 5190, 5200, 5210, 5220, 5230, 5240,
194 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640, 5660, 5680,
195 5700, 5745, 5765, 5785, 5805, 5825
198 static const struct iw_handler_def iwctl_handler_def;
201 static int vt6656_probe(struct usb_interface *intf,
202 const struct usb_device_id *id);
203 static void vt6656_disconnect(struct usb_interface *intf);
205 #ifdef CONFIG_PM /* Minimal support for suspend and resume */
206 static int vt6656_suspend(struct usb_interface *intf, pm_message_t message);
207 static int vt6656_resume(struct usb_interface *intf);
208 #endif /* CONFIG_PM */
210 static struct net_device_stats *device_get_stats(struct net_device *dev);
211 static int device_open(struct net_device *dev);
212 static int device_xmit(struct sk_buff *skb, struct net_device *dev);
213 static void device_set_multi(struct net_device *dev);
214 static int device_close(struct net_device *dev);
215 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
217 static int device_init_registers(struct vnt_private *pDevice);
218 static bool device_init_defrag_cb(struct vnt_private *pDevice);
219 static void device_init_diversity_timer(struct vnt_private *pDevice);
220 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev);
222 static int ethtool_ioctl(struct net_device *dev, struct ifreq *);
223 static void device_free_tx_bufs(struct vnt_private *pDevice);
224 static void device_free_rx_bufs(struct vnt_private *pDevice);
225 static void device_free_int_bufs(struct vnt_private *pDevice);
226 static void device_free_frag_bufs(struct vnt_private *pDevice);
227 static bool device_alloc_bufs(struct vnt_private *pDevice);
229 static int Read_config_file(struct vnt_private *pDevice);
230 static unsigned char *Config_FileOperation(struct vnt_private *pDevice);
231 static int Config_FileGetParameter(unsigned char *string,
233 unsigned char *source);
235 static void usb_device_reset(struct vnt_private *pDevice);
238 device_set_options(struct vnt_private *pDevice) {
240 u8 abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
241 u8 abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
242 u8 abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
244 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
245 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
246 memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, ETH_ALEN);
248 pDevice->cbTD = TX_DESC_DEF0;
249 pDevice->cbRD = RX_DESC_DEF0;
250 pDevice->uChannel = CHANNEL_DEF;
251 pDevice->wRTSThreshold = RTS_THRESH_DEF;
252 pDevice->wFragmentationThreshold = FRAG_THRESH_DEF;
253 pDevice->byShortRetryLimit = SHORT_RETRY_DEF;
254 pDevice->byLongRetryLimit = LONG_RETRY_DEF;
255 pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME;
256 pDevice->byShortPreamble = PREAMBLE_TYPE_DEF;
257 pDevice->ePSMode = PS_MODE_DEF;
258 pDevice->b11hEnable = X80211h_MODE_DEF;
259 pDevice->eOPMode = OP_MODE_DEF;
260 pDevice->uConnectionRate = DATA_RATE_DEF;
261 if (pDevice->uConnectionRate < RATE_AUTO) pDevice->bFixRate = true;
262 pDevice->byBBType = BBP_TYPE_DEF;
263 pDevice->byPacketType = pDevice->byBBType;
264 pDevice->byAutoFBCtrl = AUTO_FB_0;
265 pDevice->bUpdateBBVGA = true;
266 pDevice->byFOETuning = 0;
267 pDevice->byAutoPwrTunning = 0;
268 pDevice->byPreambleType = 0;
269 pDevice->bExistSWNetAddr = false;
270 /* pDevice->bDiversityRegCtlON = true; */
271 pDevice->bDiversityRegCtlON = false;
274 static void device_init_diversity_timer(struct vnt_private *pDevice)
276 init_timer(&pDevice->TimerSQ3Tmax1);
277 pDevice->TimerSQ3Tmax1.data = (unsigned long)pDevice;
278 pDevice->TimerSQ3Tmax1.function = (TimerFunction)TimerSQ3CallBack;
279 pDevice->TimerSQ3Tmax1.expires = RUN_AT(HZ);
281 init_timer(&pDevice->TimerSQ3Tmax2);
282 pDevice->TimerSQ3Tmax2.data = (unsigned long)pDevice;
283 pDevice->TimerSQ3Tmax2.function = (TimerFunction)TimerSQ3CallBack;
284 pDevice->TimerSQ3Tmax2.expires = RUN_AT(HZ);
286 init_timer(&pDevice->TimerSQ3Tmax3);
287 pDevice->TimerSQ3Tmax3.data = (unsigned long)pDevice;
288 pDevice->TimerSQ3Tmax3.function = (TimerFunction)TimerSQ3Tmax3CallBack;
289 pDevice->TimerSQ3Tmax3.expires = RUN_AT(HZ);
295 * initialization of MAC & BBP registers
297 static int device_init_registers(struct vnt_private *pDevice)
299 struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
300 struct vnt_cmd_card_init *init_cmd = &pDevice->init_command;
301 struct vnt_rsp_card_init *init_rsp = &pDevice->init_response;
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 int ntStatus = STATUS_SUCCESS;
310 u8 byCalibTXIQ = 0, byCalibTXDC = 0, byCalibRXIQ = 0;
312 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "---->INIbInitAdapter. [%d][%d]\n",
313 DEVICE_INIT_COLD, pDevice->byPacketType);
315 spin_lock_irq(&pDevice->lock);
317 memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN);
318 memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN);
319 memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, ETH_ALEN);
321 if (!FIRMWAREbCheckVersion(pDevice)) {
322 if (FIRMWAREbDownload(pDevice) == true) {
323 if (FIRMWAREbBrach2Sram(pDevice) == false) {
324 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
325 " FIRMWAREbBrach2Sram fail\n");
326 spin_unlock_irq(&pDevice->lock);
330 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
331 " FIRMWAREbDownload fail\n");
332 spin_unlock_irq(&pDevice->lock);
337 if (!BBbVT3184Init(pDevice)) {
338 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" BBbVT3184Init fail\n");
339 spin_unlock_irq(&pDevice->lock);
343 init_cmd->init_class = DEVICE_INIT_COLD;
344 init_cmd->exist_sw_net_addr = (u8) pDevice->bExistSWNetAddr;
345 for (ii = 0; ii < 6; ii++)
346 init_cmd->sw_net_addr[ii] = pDevice->abyCurrentNetAddr[ii];
347 init_cmd->short_retry_limit = pDevice->byShortRetryLimit;
348 init_cmd->long_retry_limit = pDevice->byLongRetryLimit;
350 /* issue card_init command to device */
351 ntStatus = CONTROLnsRequestOut(pDevice,
352 MESSAGE_TYPE_CARDINIT, 0, 0,
353 sizeof(struct vnt_cmd_card_init), (u8 *)init_cmd);
354 if (ntStatus != STATUS_SUCCESS) {
355 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Issue Card init fail\n");
356 spin_unlock_irq(&pDevice->lock);
360 ntStatus = CONTROLnsRequestIn(pDevice, MESSAGE_TYPE_INIT_RSP, 0, 0,
361 sizeof(struct vnt_rsp_card_init), (u8 *)init_rsp);
362 if (ntStatus != STATUS_SUCCESS) {
363 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
364 "Cardinit request in status fail!\n");
365 spin_unlock_irq(&pDevice->lock);
369 /* local ID for AES functions */
370 ntStatus = CONTROLnsRequestIn(pDevice, MESSAGE_TYPE_READ,
371 MAC_REG_LOCALID, MESSAGE_REQUEST_MACREG, 1,
372 &pDevice->byLocalID);
373 if (ntStatus != STATUS_SUCCESS) {
374 spin_unlock_irq(&pDevice->lock);
378 /* do MACbSoftwareReset in MACvInitialize */
381 pDevice->bCCK = true;
382 pDevice->bProtectMode = false;
383 /* only used in 11g type, sync with ERP IE */
384 pDevice->bNonERPPresent = false;
385 pDevice->bBarkerPreambleMd = false;
386 if (pDevice->bFixRate) {
387 pDevice->wCurrentRate = (u16)pDevice->uConnectionRate;
389 if (pDevice->byBBType == BB_TYPE_11B)
390 pDevice->wCurrentRate = RATE_11M;
392 pDevice->wCurrentRate = RATE_54M;
395 CHvInitChannelTable(pDevice);
397 pDevice->byTopOFDMBasicRate = RATE_24M;
398 pDevice->byTopCCKBasicRate = RATE_1M;
399 pDevice->byRevId = 0;
400 /* target to IF pin while programming to RF chip */
401 pDevice->byCurPwr = 0xFF;
403 pDevice->byCCKPwr = pDevice->abyEEPROM[EEP_OFS_PWR_CCK];
404 pDevice->byOFDMPwrG = pDevice->abyEEPROM[EEP_OFS_PWR_OFDMG];
405 /* load power table */
406 for (ii = 0; ii < 14; ii++) {
407 pDevice->abyCCKPwrTbl[ii] =
408 pDevice->abyEEPROM[ii + EEP_OFS_CCK_PWR_TBL];
410 if (pDevice->abyCCKPwrTbl[ii] == 0)
411 pDevice->abyCCKPwrTbl[ii] = pDevice->byCCKPwr;
412 pDevice->abyOFDMPwrTbl[ii] =
413 pDevice->abyEEPROM[ii + EEP_OFS_OFDM_PWR_TBL];
414 if (pDevice->abyOFDMPwrTbl[ii] == 0)
415 pDevice->abyOFDMPwrTbl[ii] = pDevice->byOFDMPwrG;
419 * original zonetype is USA, but custom zonetype is Europe,
420 * then need to recover 12, 13, 14 channels with 11 channel
422 if (((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) ||
423 (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe)) &&
424 (pDevice->byOriginalZonetype == ZoneType_USA)) {
425 for (ii = 11; ii < 14; ii++) {
426 pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
427 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];
431 pDevice->byOFDMPwrA = 0x34; /* same as RFbMA2829SelectChannel */
433 /* load OFDM A power table */
434 for (ii = 0; ii < CB_MAX_CHANNEL_5G; ii++) {
435 pDevice->abyOFDMAPwrTbl[ii] =
436 pDevice->abyEEPROM[ii + EEP_OFS_OFDMA_PWR_TBL];
438 if (pDevice->abyOFDMAPwrTbl[ii] == 0)
439 pDevice->abyOFDMAPwrTbl[ii] = pDevice->byOFDMPwrA;
442 byAntenna = pDevice->abyEEPROM[EEP_OFS_ANTENNA];
444 if (byAntenna & EEP_ANTINV)
445 pDevice->bTxRxAntInv = true;
447 pDevice->bTxRxAntInv = false;
449 byAntenna &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
451 if (byAntenna == 0) /* if not set default is both */
452 byAntenna = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
454 if (byAntenna == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
455 pDevice->byAntennaCount = 2;
456 pDevice->byTxAntennaMode = ANT_B;
457 pDevice->dwTxAntennaSel = 1;
458 pDevice->dwRxAntennaSel = 1;
460 if (pDevice->bTxRxAntInv == true)
461 pDevice->byRxAntennaMode = ANT_A;
463 pDevice->byRxAntennaMode = ANT_B;
465 if (pDevice->bDiversityRegCtlON)
466 pDevice->bDiversityEnable = true;
468 pDevice->bDiversityEnable = false;
470 pDevice->bDiversityEnable = false;
471 pDevice->byAntennaCount = 1;
472 pDevice->dwTxAntennaSel = 0;
473 pDevice->dwRxAntennaSel = 0;
475 if (byAntenna & EEP_ANTENNA_AUX) {
476 pDevice->byTxAntennaMode = ANT_A;
478 if (pDevice->bTxRxAntInv == true)
479 pDevice->byRxAntennaMode = ANT_B;
481 pDevice->byRxAntennaMode = ANT_A;
483 pDevice->byTxAntennaMode = ANT_B;
485 if (pDevice->bTxRxAntInv == true)
486 pDevice->byRxAntennaMode = ANT_A;
488 pDevice->byRxAntennaMode = ANT_B;
492 pDevice->ulDiversityNValue = 100 * 255;
493 pDevice->ulDiversityMValue = 100 * 16;
495 pDevice->byTMax2 = 4;
496 pDevice->ulSQ3TH = 0;
497 pDevice->byTMax3 = 64;
499 /* get Auto Fall Back type */
500 pDevice->byAutoFBCtrl = AUTO_FB_0;
503 pDevice->uScanTime = WLAN_SCAN_MINITIME;
505 /* default Auto Mode */
506 /* pDevice->NetworkType = Ndis802_11Automode; */
507 pDevice->eConfigPHYMode = PHY_TYPE_AUTO;
508 pDevice->byBBType = BB_TYPE_11G;
510 /* initialize BBP registers */
511 pDevice->ulTxPower = 25;
513 /* get channel range */
514 pDevice->byMinChannel = 1;
515 pDevice->byMaxChannel = CB_MAX_CHANNEL;
518 pDevice->byRFType = init_rsp->rf_type;
520 if ((pDevice->byRFType & RF_EMU) != 0) {
521 /* force change RevID for VT3253 emu */
522 pDevice->byRevId = 0x80;
525 /* load vt3266 calibration parameters in EEPROM */
526 if (pDevice->byRFType == RF_VT3226D0) {
527 if ((pDevice->abyEEPROM[EEP_OFS_MAJOR_VER] == 0x1) &&
528 (pDevice->abyEEPROM[EEP_OFS_MINOR_VER] >= 0x4)) {
530 byCalibTXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_IQ];
531 byCalibTXDC = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_DC];
532 byCalibRXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_RX_IQ];
533 if (byCalibTXIQ || byCalibTXDC || byCalibRXIQ) {
534 /* CR255, enable TX/RX IQ and DC compensation mode */
535 ControlvWriteByte(pDevice,
536 MESSAGE_REQUEST_BBREG,
539 /* CR251, TX I/Q Imbalance Calibration */
540 ControlvWriteByte(pDevice,
541 MESSAGE_REQUEST_BBREG,
544 /* CR252, TX DC-Offset Calibration */
545 ControlvWriteByte(pDevice,
546 MESSAGE_REQUEST_BBREG,
549 /* CR253, RX I/Q Imbalance Calibration */
550 ControlvWriteByte(pDevice,
551 MESSAGE_REQUEST_BBREG,
555 /* CR255, turn off BB Calibration compensation */
556 ControlvWriteByte(pDevice,
557 MESSAGE_REQUEST_BBREG,
564 pMgmt->eScanType = WMAC_SCAN_PASSIVE;
565 pMgmt->uCurrChannel = pDevice->uChannel;
566 pMgmt->uIBSSChannel = pDevice->uChannel;
567 CARDbSetMediaChannel(pDevice, pMgmt->uCurrChannel);
569 /* get permanent network address */
570 memcpy(pDevice->abyPermanentNetAddr, init_rsp->net_addr, 6);
571 memcpy(pDevice->abyCurrentNetAddr,
572 pDevice->abyPermanentNetAddr, ETH_ALEN);
574 /* if exist SW network address, use it */
575 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Network address = %pM\n",
576 pDevice->abyCurrentNetAddr);
579 * set BB and packet type at the same time
580 * set Short Slot Time, xIFS, and RSPINF
582 if (pDevice->byBBType == BB_TYPE_11A) {
583 CARDbAddBasicRate(pDevice, RATE_6M);
584 pDevice->bShortSlotTime = true;
586 CARDbAddBasicRate(pDevice, RATE_1M);
587 pDevice->bShortSlotTime = false;
590 BBvSetShortSlotTime(pDevice);
591 CARDvSetBSSMode(pDevice);
593 if (pDevice->bUpdateBBVGA) {
594 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
595 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
597 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
600 pDevice->byRadioCtl = pDevice->abyEEPROM[EEP_OFS_RADIOCTL];
601 pDevice->bHWRadioOff = false;
603 if ((pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) != 0) {
604 ntStatus = CONTROLnsRequestIn(pDevice, MESSAGE_TYPE_READ,
605 MAC_REG_GPIOCTL1, MESSAGE_REQUEST_MACREG, 1, &byTmp);
607 if (ntStatus != STATUS_SUCCESS) {
608 spin_unlock_irq(&pDevice->lock);
612 if ((byTmp & GPIO3_DATA) == 0) {
613 pDevice->bHWRadioOff = true;
614 MACvRegBitsOn(pDevice, MAC_REG_GPIOCTL1, GPIO3_INTMD);
616 MACvRegBitsOff(pDevice, MAC_REG_GPIOCTL1, GPIO3_INTMD);
617 pDevice->bHWRadioOff = false;
622 ControlvMaskByte(pDevice, MESSAGE_REQUEST_MACREG,
623 MAC_REG_PAPEDELAY, LEDSTS_TMLEN, 0x38);
625 ControlvMaskByte(pDevice, MESSAGE_REQUEST_MACREG,
626 MAC_REG_PAPEDELAY, LEDSTS_STS, LEDSTS_SLOW);
628 MACvRegBitsOn(pDevice, MAC_REG_GPIOCTL0, 0x01);
630 if ((pDevice->bHWRadioOff == true) ||
631 (pDevice->bRadioControlOff == true)) {
632 CARDbRadioPowerOff(pDevice);
634 CARDbRadioPowerOn(pDevice);
638 spin_unlock_irq(&pDevice->lock);
640 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"<----INIbInitAdapter Exit\n");
645 #ifdef CONFIG_PM /* Minimal support for suspend and resume */
647 static int vt6656_suspend(struct usb_interface *intf, pm_message_t message)
649 struct vnt_private *device = usb_get_intfdata(intf);
651 if (!device || !device->dev)
654 if (device->flags & DEVICE_FLAGS_OPENED)
655 device_close(device->dev);
660 static int vt6656_resume(struct usb_interface *intf)
662 struct vnt_private *device = usb_get_intfdata(intf);
664 if (!device || !device->dev)
667 if (!(device->flags & DEVICE_FLAGS_OPENED))
668 device_open(device->dev);
673 #endif /* CONFIG_PM */
675 static const struct net_device_ops device_netdev_ops = {
676 .ndo_open = device_open,
677 .ndo_stop = device_close,
678 .ndo_do_ioctl = device_ioctl,
679 .ndo_get_stats = device_get_stats,
680 .ndo_start_xmit = device_xmit,
681 .ndo_set_rx_mode = device_set_multi,
685 vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id)
687 u8 fake_mac[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
688 struct usb_device *udev = interface_to_usbdev(intf);
690 struct net_device *netdev = NULL;
691 struct vnt_private *pDevice;
693 printk(KERN_NOTICE "%s Ver. %s\n", DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
694 printk(KERN_NOTICE "Copyright (c) 2004 VIA Networking Technologies, Inc.\n");
696 udev = usb_get_dev(udev);
697 netdev = alloc_etherdev(sizeof(struct vnt_private));
699 printk(KERN_ERR DEVICE_NAME ": allocate net device failed\n");
704 pDevice = netdev_priv(netdev);
705 memset(pDevice, 0, sizeof(struct vnt_private));
707 pDevice->dev = netdev;
710 device_set_options(pDevice);
711 spin_lock_init(&pDevice->lock);
712 INIT_DELAYED_WORK(&pDevice->run_command_work, vRunCommand);
713 INIT_DELAYED_WORK(&pDevice->second_callback_work, BSSvSecondCallBack);
714 INIT_WORK(&pDevice->read_work_item, RXvWorkItem);
715 INIT_WORK(&pDevice->rx_mng_work_item, RXvMngWorkItem);
717 pDevice->pControlURB = usb_alloc_urb(0, GFP_ATOMIC);
718 if (!pDevice->pControlURB) {
719 DBG_PRT(MSG_LEVEL_ERR, KERN_ERR"Failed to alloc control urb\n");
723 pDevice->tx_80211 = device_dma0_tx_80211;
724 pDevice->vnt_mgmt.pAdapter = (void *) pDevice;
726 netdev->netdev_ops = &device_netdev_ops;
727 netdev->wireless_handlers =
728 (struct iw_handler_def *) &iwctl_handler_def;
730 usb_set_intfdata(intf, pDevice);
731 SET_NETDEV_DEV(netdev, &intf->dev);
732 memcpy(pDevice->dev->dev_addr, fake_mac, ETH_ALEN);
734 usb_device_reset(pDevice);
736 rc = register_netdev(netdev);
738 printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n");
752 static void device_free_tx_bufs(struct vnt_private *pDevice)
754 struct vnt_usb_send_context *pTxContext;
757 for (ii = 0; ii < pDevice->cbTD; ii++) {
759 pTxContext = pDevice->apTD[ii];
760 /* deallocate URBs */
761 if (pTxContext->pUrb) {
762 usb_kill_urb(pTxContext->pUrb);
763 usb_free_urb(pTxContext->pUrb);
770 static void device_free_rx_bufs(struct vnt_private *pDevice)
772 struct vnt_rcb *pRCB;
775 for (ii = 0; ii < pDevice->cbRD; ii++) {
777 pRCB = pDevice->apRCB[ii];
778 /* deallocate URBs */
780 usb_kill_urb(pRCB->pUrb);
781 usb_free_urb(pRCB->pUrb);
785 dev_kfree_skb(pRCB->skb);
787 kfree(pDevice->pRCBMem);
792 static void usb_device_reset(struct vnt_private *pDevice)
795 status = usb_reset_device(pDevice->usb);
797 printk("usb_device_reset fail status=%d\n",status);
801 static void device_free_int_bufs(struct vnt_private *pDevice)
803 kfree(pDevice->intBuf.pDataBuf);
807 static bool device_alloc_bufs(struct vnt_private *pDevice)
809 struct vnt_usb_send_context *pTxContext;
810 struct vnt_rcb *pRCB;
813 for (ii = 0; ii < pDevice->cbTD; ii++) {
815 pTxContext = kmalloc(sizeof(struct vnt_usb_send_context), GFP_KERNEL);
816 if (pTxContext == NULL) {
817 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : allocate tx usb context failed\n", pDevice->dev->name);
820 pDevice->apTD[ii] = pTxContext;
821 pTxContext->pDevice = (void *) pDevice;
823 pTxContext->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
824 if (pTxContext->pUrb == NULL) {
825 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "alloc tx urb failed\n");
828 pTxContext->bBoolInUse = false;
831 /* allocate RCB mem */
832 pDevice->pRCBMem = kzalloc((sizeof(struct vnt_rcb) * pDevice->cbRD),
834 if (pDevice->pRCBMem == NULL) {
835 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s : alloc rx usb context failed\n", pDevice->dev->name);
839 pDevice->FirstRecvFreeList = NULL;
840 pDevice->LastRecvFreeList = NULL;
841 pDevice->FirstRecvMngList = NULL;
842 pDevice->LastRecvMngList = NULL;
843 pDevice->NumRecvFreeList = 0;
845 pRCB = (struct vnt_rcb *)pDevice->pRCBMem;
847 for (ii = 0; ii < pDevice->cbRD; ii++) {
849 pDevice->apRCB[ii] = pRCB;
850 pRCB->pDevice = (void *) pDevice;
852 pRCB->pUrb = usb_alloc_urb(0, GFP_ATOMIC);
854 if (pRCB->pUrb == NULL) {
855 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx urb\n");
858 pRCB->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
859 if (pRCB->skb == NULL) {
860 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to alloc rx skb\n");
863 pRCB->skb->dev = pDevice->dev;
864 pRCB->bBoolInUse = false;
865 EnqueueRCB(pDevice->FirstRecvFreeList, pDevice->LastRecvFreeList, pRCB);
866 pDevice->NumRecvFreeList++;
870 pDevice->pInterruptURB = usb_alloc_urb(0, GFP_ATOMIC);
871 if (pDevice->pInterruptURB == NULL) {
872 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int urb\n");
876 pDevice->intBuf.pDataBuf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL);
877 if (pDevice->intBuf.pDataBuf == NULL) {
878 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR"Failed to alloc int buf\n");
879 usb_free_urb(pDevice->pInterruptURB);
886 device_free_rx_bufs(pDevice);
889 device_free_tx_bufs(pDevice);
894 static bool device_init_defrag_cb(struct vnt_private *pDevice)
897 PSDeFragControlBlock pDeF;
899 /* Init the fragment ctl entries */
900 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
901 pDeF = &(pDevice->sRxDFCB[i]);
902 if (!device_alloc_frag_buf(pDevice, pDeF)) {
903 DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n",
908 pDevice->cbDFCB = CB_MAX_RX_FRAG;
909 pDevice->cbFreeDFCB = pDevice->cbDFCB;
913 device_free_frag_bufs(pDevice);
917 static void device_free_frag_bufs(struct vnt_private *pDevice)
919 PSDeFragControlBlock pDeF;
922 for (i = 0; i < CB_MAX_RX_FRAG; i++) {
924 pDeF = &(pDevice->sRxDFCB[i]);
927 dev_kfree_skb(pDeF->skb);
931 int device_alloc_frag_buf(struct vnt_private *pDevice,
932 PSDeFragControlBlock pDeF)
935 pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
936 if (pDeF->skb == NULL)
938 pDeF->skb->dev = pDevice->dev;
943 static int device_open(struct net_device *dev)
945 struct vnt_private *pDevice = netdev_priv(dev);
947 pDevice->fWPA_Authened = false;
949 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_open...\n");
951 pDevice->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS;
953 if (device_alloc_bufs(pDevice) == false) {
954 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_alloc_bufs fail... \n");
958 if (device_init_defrag_cb(pDevice)== false) {
959 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Initial defragment cb fail \n");
963 MP_CLEAR_FLAG(pDevice, fMP_DISCONNECTED);
964 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
965 MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
966 MP_SET_FLAG(pDevice, fMP_POST_READS);
967 MP_SET_FLAG(pDevice, fMP_POST_WRITES);
969 /* read config file */
970 Read_config_file(pDevice);
972 if (device_init_registers(pDevice) == false) {
973 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " init register fail\n");
977 device_set_multi(pDevice->dev);
979 /* init for key management */
980 KeyvInitTable(pDevice,&pDevice->sKey);
981 memcpy(pDevice->vnt_mgmt.abyMACAddr,
982 pDevice->abyCurrentNetAddr, ETH_ALEN);
983 memcpy(pDevice->dev->dev_addr, pDevice->abyCurrentNetAddr, ETH_ALEN);
984 pDevice->bStopTx0Pkt = false;
985 pDevice->bStopDataPkt = false;
986 pDevice->bRoaming = false;
987 pDevice->bIsRoaming = false;
988 pDevice->bEnableRoaming = false;
989 if (pDevice->bDiversityRegCtlON) {
990 device_init_diversity_timer(pDevice);
993 vMgrObjectInit(pDevice);
995 tasklet_init(&pDevice->EventWorkItem, (void *)INTvWorkItem, (unsigned long)pDevice);
997 schedule_delayed_work(&pDevice->second_callback_work, HZ);
999 pDevice->int_interval = 100; /* max 100 microframes */
1000 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1002 pDevice->bIsRxWorkItemQueued = true;
1003 pDevice->fKillEventPollingThread = false;
1004 pDevice->bEventAvailable = false;
1006 pDevice->bWPADEVUp = false;
1007 pDevice->bwextstep0 = false;
1008 pDevice->bwextstep1 = false;
1009 pDevice->bwextstep2 = false;
1010 pDevice->bwextstep3 = false;
1011 pDevice->bWPASuppWextEnabled = false;
1012 pDevice->byReAssocCount = 0;
1014 schedule_work(&pDevice->read_work_item);
1015 INTvWorkItem(pDevice);
1017 /* if WEP key already set by iwconfig but device not yet open */
1018 if ((pDevice->bEncryptionEnable == true) && (pDevice->bTransmitKey == true)) {
1019 spin_lock_irq(&pDevice->lock);
1020 KeybSetDefaultKey( pDevice,
1022 pDevice->byKeyIndex | (1 << 31),
1023 pDevice->uKeyLength,
1028 spin_unlock_irq(&pDevice->lock);
1029 pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
1032 if (pDevice->vnt_mgmt.eConfigMode == WMAC_CONFIG_AP)
1033 bScheduleCommand((void *) pDevice, WLAN_CMD_RUN_AP, NULL);
1035 bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1037 netif_stop_queue(pDevice->dev);
1038 pDevice->flags |= DEVICE_FLAGS_OPENED;
1040 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success..\n");
1044 device_free_frag_bufs(pDevice);
1046 device_free_rx_bufs(pDevice);
1047 device_free_tx_bufs(pDevice);
1048 device_free_int_bufs(pDevice);
1049 usb_kill_urb(pDevice->pInterruptURB);
1050 usb_free_urb(pDevice->pInterruptURB);
1052 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open fail.. \n");
1056 static int device_close(struct net_device *dev)
1058 struct vnt_private *pDevice = netdev_priv(dev);
1059 struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
1062 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close1\n");
1063 if (pDevice == NULL)
1066 if (pDevice->bLinkPass) {
1067 bScheduleCommand((void *) pDevice, WLAN_CMD_DISASSOCIATE, NULL);
1071 memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
1072 pMgmt->bShareKeyAlgorithm = false;
1073 pDevice->bEncryptionEnable = false;
1074 pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
1075 spin_lock_irq(&pDevice->lock);
1076 for (uu = 0; uu < MAX_KEY_TABLE; uu++)
1077 MACvDisableKeyEntry(pDevice,uu);
1078 spin_unlock_irq(&pDevice->lock);
1080 if ((pDevice->flags & DEVICE_FLAGS_UNPLUG) == false) {
1081 MACbShutdown(pDevice);
1083 netif_stop_queue(pDevice->dev);
1084 MP_SET_FLAG(pDevice, fMP_DISCONNECTED);
1085 MP_CLEAR_FLAG(pDevice, fMP_POST_WRITES);
1086 MP_CLEAR_FLAG(pDevice, fMP_POST_READS);
1087 pDevice->fKillEventPollingThread = true;
1089 cancel_delayed_work_sync(&pDevice->run_command_work);
1090 cancel_delayed_work_sync(&pDevice->second_callback_work);
1092 if (pDevice->bDiversityRegCtlON) {
1093 del_timer(&pDevice->TimerSQ3Tmax1);
1094 del_timer(&pDevice->TimerSQ3Tmax2);
1095 del_timer(&pDevice->TimerSQ3Tmax3);
1098 cancel_work_sync(&pDevice->rx_mng_work_item);
1099 cancel_work_sync(&pDevice->read_work_item);
1101 tasklet_kill(&pDevice->EventWorkItem);
1103 pDevice->bRoaming = false;
1104 pDevice->bIsRoaming = false;
1105 pDevice->bEnableRoaming = false;
1106 pDevice->bCmdRunning = false;
1107 pDevice->bLinkPass = false;
1108 memset(pMgmt->abyCurrBSSID, 0, 6);
1109 pMgmt->eCurrState = WMAC_STATE_IDLE;
1111 pDevice->flags &= ~DEVICE_FLAGS_OPENED;
1113 device_free_tx_bufs(pDevice);
1114 device_free_rx_bufs(pDevice);
1115 device_free_int_bufs(pDevice);
1116 device_free_frag_bufs(pDevice);
1118 usb_kill_urb(pDevice->pInterruptURB);
1119 usb_free_urb(pDevice->pInterruptURB);
1121 BSSvClearNodeDBTable(pDevice, 0);
1123 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n");
1128 static void vt6656_disconnect(struct usb_interface *intf)
1130 struct vnt_private *device = usb_get_intfdata(intf);
1135 usb_set_intfdata(intf, NULL);
1136 usb_put_dev(interface_to_usbdev(intf));
1138 device->flags |= DEVICE_FLAGS_UNPLUG;
1141 unregister_netdev(device->dev);
1143 usb_kill_urb(device->pControlURB);
1144 usb_free_urb(device->pControlURB);
1146 free_netdev(device->dev);
1150 static int device_dma0_tx_80211(struct sk_buff *skb, struct net_device *dev)
1152 struct vnt_private *pDevice = netdev_priv(dev);
1154 spin_lock_irq(&pDevice->lock);
1156 if (unlikely(pDevice->bStopTx0Pkt))
1157 dev_kfree_skb_irq(skb);
1159 vDMA0_tx_80211(pDevice, skb);
1161 spin_unlock_irq(&pDevice->lock);
1163 return NETDEV_TX_OK;
1166 static int device_xmit(struct sk_buff *skb, struct net_device *dev)
1168 struct vnt_private *pDevice = netdev_priv(dev);
1169 struct net_device_stats *stats = &pDevice->stats;
1171 spin_lock_irq(&pDevice->lock);
1173 netif_stop_queue(dev);
1175 if (!pDevice->bLinkPass) {
1176 dev_kfree_skb_irq(skb);
1180 if (pDevice->bStopDataPkt) {
1181 dev_kfree_skb_irq(skb);
1182 stats->tx_dropped++;
1186 if (nsDMA_tx_packet(pDevice, TYPE_AC0DMA, skb)) {
1187 if (netif_queue_stopped(dev))
1188 netif_wake_queue(dev);
1192 spin_unlock_irq(&pDevice->lock);
1194 return NETDEV_TX_OK;
1197 /* find out the start position of str2 from str1 */
1198 static unsigned char *kstrstr(const unsigned char *str1,
1199 const unsigned char *str2) {
1200 int str1_len = strlen(str1);
1201 int str2_len = strlen(str2);
1203 while (str1_len >= str2_len) {
1205 if(memcmp(str1,str2,str2_len)==0)
1206 return (unsigned char *) str1;
1212 static int Config_FileGetParameter(unsigned char *string,
1213 unsigned char *dest,
1214 unsigned char *source)
1216 unsigned char buf1[100];
1217 unsigned char buf2[100];
1218 unsigned char *start_p = NULL, *end_p = NULL, *tmp_p = NULL;
1222 strcat(buf1, string);
1224 source+=strlen(buf1);
1226 /* find target string start point */
1227 start_p = kstrstr(source,buf1);
1228 if (start_p == NULL)
1231 /* check if current config line is marked by "#" */
1232 for (ii = 1; ; ii++) {
1233 if (memcmp(start_p - ii, "\n", 1) == 0)
1235 if (memcmp(start_p - ii, "#", 1) == 0)
1239 /* find target string end point */
1240 end_p = kstrstr(start_p,"\n");
1241 if (end_p == NULL) { /* can't find "\n", but don't care */
1242 end_p = start_p + strlen(start_p); /* no include "\n" */
1246 memcpy(buf2, start_p, end_p-start_p); /* get the target line */
1247 buf2[end_p-start_p]='\0';
1250 start_p = kstrstr(buf2,"=");
1251 if (start_p == NULL)
1254 strcpy(buf1,start_p+1);
1258 while(*tmp_p != 0x00) {
1265 memcpy(dest,tmp_p,strlen(tmp_p));
1269 /* if read fails, return NULL, or return data pointer */
1270 static unsigned char *Config_FileOperation(struct vnt_private *pDevice)
1272 unsigned char *buffer = kmalloc(1024, GFP_KERNEL);
1276 printk("allocate mem for file fail?\n");
1280 file = filp_open(CONFIG_PATH, O_RDONLY, 0);
1283 printk("Config_FileOperation file Not exist\n");
1287 if (kernel_read(file, 0, buffer, 1024) < 0) {
1288 printk("read file error?\n");
1297 /* return --->-1:fail; >=0:successful */
1298 static int Read_config_file(struct vnt_private *pDevice)
1301 unsigned char tmpbuffer[100];
1302 unsigned char *buffer = NULL;
1304 /* init config setting */
1305 pDevice->config_file.ZoneType = -1;
1306 pDevice->config_file.eAuthenMode = -1;
1307 pDevice->config_file.eEncryptionStatus = -1;
1309 buffer = Config_FileOperation(pDevice);
1310 if (buffer == NULL) {
1317 memset(tmpbuffer,0,sizeof(tmpbuffer));
1318 if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer) ==true) {
1319 if(memcmp(tmpbuffer,"USA",3)==0) {
1320 pDevice->config_file.ZoneType=ZoneType_USA;
1322 else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
1323 pDevice->config_file.ZoneType=ZoneType_Japan;
1325 else if(memcmp(tmpbuffer,"EUROPE",6)==0) {
1326 pDevice->config_file.ZoneType=ZoneType_Europe;
1329 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
1334 /* get other parameter */
1336 memset(tmpbuffer,0,sizeof(tmpbuffer));
1337 if(Config_FileGetParameter("AUTHENMODE",tmpbuffer,buffer)==true) {
1338 pDevice->config_file.eAuthenMode = (int) simple_strtol(tmpbuffer, NULL, 10);
1341 memset(tmpbuffer,0,sizeof(tmpbuffer));
1342 if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer,buffer)==true) {
1343 pDevice->config_file.eEncryptionStatus= (int) simple_strtol(tmpbuffer, NULL, 10);
1351 static void device_set_multi(struct net_device *dev)
1353 struct vnt_private *pDevice = netdev_priv(dev);
1354 struct vnt_manager *pMgmt = &pDevice->vnt_mgmt;
1355 struct netdev_hw_addr *ha;
1358 u8 pbyData[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1362 spin_lock_irq(&pDevice->lock);
1363 rc = CONTROLnsRequestIn(pDevice,
1366 MESSAGE_REQUEST_MACREG,
1370 if (rc == 0) pDevice->byRxMode = byTmpMode;
1372 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode in= %x\n", pDevice->byRxMode);
1374 if (dev->flags & IFF_PROMISC) { /* set promiscuous mode */
1375 DBG_PRT(MSG_LEVEL_ERR,KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
1376 /* unconditionally log net taps */
1377 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST);
1379 else if ((netdev_mc_count(dev) > pDevice->multicast_limit) ||
1380 (dev->flags & IFF_ALLMULTI)) {
1381 CONTROLnsRequestOut(pDevice,
1384 MESSAGE_REQUEST_MACREG,
1388 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1391 memset(mc_filter, 0, sizeof(mc_filter));
1392 netdev_for_each_mc_addr(ha, dev) {
1393 int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
1394 mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31));
1396 for (ii = 0; ii < 4; ii++) {
1397 MACvWriteMultiAddr(pDevice, ii, *((u8 *)&mc_filter[0] + ii));
1398 MACvWriteMultiAddr(pDevice, ii+ 4, *((u8 *)&mc_filter[1] + ii));
1400 pDevice->byRxMode &= ~(RCR_UNICAST);
1401 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1404 if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
1406 * If AP mode, don't enable RCR_UNICAST since HW only compares
1407 * addr1 with local MAC
1409 pDevice->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST);
1410 pDevice->byRxMode &= ~(RCR_UNICAST);
1412 ControlvWriteByte(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_RCR, pDevice->byRxMode);
1413 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pDevice->byRxMode out= %x\n", pDevice->byRxMode);
1414 spin_unlock_irq(&pDevice->lock);
1418 static struct net_device_stats *device_get_stats(struct net_device *dev)
1420 struct vnt_private *pDevice = netdev_priv(dev);
1422 return &pDevice->stats;
1425 static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1427 struct vnt_private *pDevice = netdev_priv(dev);
1428 struct iwreq *wrq = (struct iwreq *) rq;
1433 case IOCTL_CMD_HOSTAPD:
1435 if (!(pDevice->flags & DEVICE_FLAGS_OPENED))
1438 rc = vt6656_hostap_ioctl(pDevice, &wrq->u.data);
1442 return ethtool_ioctl(dev, rq);
1449 static int ethtool_ioctl(struct net_device *dev, struct ifreq *rq)
1453 if (copy_from_user(ðcmd, rq->ifr_data, sizeof(ethcmd)))
1457 case ETHTOOL_GDRVINFO: {
1458 struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
1459 strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1);
1460 strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1);
1461 if (copy_to_user(rq->ifr_data, &info, sizeof(info)))
1471 MODULE_DEVICE_TABLE(usb, vt6656_table);
1473 static struct usb_driver vt6656_driver = {
1474 .name = DEVICE_NAME,
1475 .probe = vt6656_probe,
1476 .disconnect = vt6656_disconnect,
1477 .id_table = vt6656_table,
1479 .suspend = vt6656_suspend,
1480 .resume = vt6656_resume,
1481 #endif /* CONFIG_PM */
1484 module_usb_driver(vt6656_driver);