Version:  2.0.40 2.2.26 2.4.37 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1

Linux/drivers/staging/vt6655/device_main.c

  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: device_main.c
 20  *
 21  * Purpose: driver entry for initial, open, close, tx and rx.
 22  *
 23  * Author: Lyndon Chen
 24  *
 25  * Date: Jan 8, 2003
 26  *
 27  * Functions:
 28  *
 29  *   vt6655_probe - module initial (insmod) driver entry
 30  *   vt6655_remove - module remove entry
 31  *   vt6655_init_info - device structure resource allocation function
 32  *   device_free_info - device structure resource free function
 33  *   device_get_pci_info - get allocated pci io/mem resource
 34  *   device_print_info - print out resource
 35  *   device_intr - interrupt handle function
 36  *   device_rx_srv - rx service function
 37  *   device_alloc_rx_buf - rx buffer pre-allocated function
 38  *   device_free_tx_buf - free tx buffer function
 39  *   device_init_rd0_ring- initial rd dma0 ring
 40  *   device_init_rd1_ring- initial rd dma1 ring
 41  *   device_init_td0_ring- initial tx dma0 ring buffer
 42  *   device_init_td1_ring- initial tx dma1 ring buffer
 43  *   device_init_registers- initial MAC & BBP & RF internal registers.
 44  *   device_init_rings- initial tx/rx ring buffer
 45  *   device_free_rings- free all allocated ring buffer
 46  *   device_tx_srv- tx interrupt service function
 47  *
 48  * Revision History:
 49  */
 50 #undef __NO_VERSION__
 51 
 52 #include <linux/file.h>
 53 #include "device.h"
 54 #include "card.h"
 55 #include "channel.h"
 56 #include "baseband.h"
 57 #include "mac.h"
 58 #include "power.h"
 59 #include "rxtx.h"
 60 #include "dpc.h"
 61 #include "rf.h"
 62 #include <linux/delay.h>
 63 #include <linux/kthread.h>
 64 #include <linux/slab.h>
 65 
 66 /*---------------------  Static Definitions -------------------------*/
 67 /*
 68  * Define module options
 69  */
 70 MODULE_AUTHOR("VIA Networking Technologies, Inc., <lyndonchen@vntek.com.tw>");
 71 MODULE_LICENSE("GPL");
 72 MODULE_DESCRIPTION("VIA Networking Solomon-A/B/G Wireless LAN Adapter Driver");
 73 
 74 #define DEVICE_PARAM(N, D)
 75 
 76 #define RX_DESC_MIN0     16
 77 #define RX_DESC_MAX0     128
 78 #define RX_DESC_DEF0     32
 79 DEVICE_PARAM(RxDescriptors0, "Number of receive descriptors0");
 80 
 81 #define RX_DESC_MIN1     16
 82 #define RX_DESC_MAX1     128
 83 #define RX_DESC_DEF1     32
 84 DEVICE_PARAM(RxDescriptors1, "Number of receive descriptors1");
 85 
 86 #define TX_DESC_MIN0     16
 87 #define TX_DESC_MAX0     128
 88 #define TX_DESC_DEF0     32
 89 DEVICE_PARAM(TxDescriptors0, "Number of transmit descriptors0");
 90 
 91 #define TX_DESC_MIN1     16
 92 #define TX_DESC_MAX1     128
 93 #define TX_DESC_DEF1     64
 94 DEVICE_PARAM(TxDescriptors1, "Number of transmit descriptors1");
 95 
 96 #define INT_WORKS_DEF   20
 97 #define INT_WORKS_MIN   10
 98 #define INT_WORKS_MAX   64
 99 
100 DEVICE_PARAM(int_works, "Number of packets per interrupt services");
101 
102 #define RTS_THRESH_DEF     2347
103 
104 #define FRAG_THRESH_DEF     2346
105 
106 #define SHORT_RETRY_MIN     0
107 #define SHORT_RETRY_MAX     31
108 #define SHORT_RETRY_DEF     8
109 
110 DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits");
111 
112 #define LONG_RETRY_MIN     0
113 #define LONG_RETRY_MAX     15
114 #define LONG_RETRY_DEF     4
115 
116 DEVICE_PARAM(LongRetryLimit, "long frame retry limits");
117 
118 /* BasebandType[] baseband type selected
119    0: indicate 802.11a type
120    1: indicate 802.11b type
121    2: indicate 802.11g type
122 */
123 #define BBP_TYPE_MIN     0
124 #define BBP_TYPE_MAX     2
125 #define BBP_TYPE_DEF     2
126 
127 DEVICE_PARAM(BasebandType, "baseband type");
128 
129 /*
130  * Static vars definitions
131  */
132 static CHIP_INFO chip_info_table[] = {
133         { VT3253,       "VIA Networking Solomon-A/B/G Wireless LAN Adapter ",
134           256, 1,     DEVICE_FLAGS_IP_ALIGN|DEVICE_FLAGS_TX_ALIGN },
135         {0, NULL}
136 };
137 
138 static const struct pci_device_id vt6655_pci_id_table[] = {
139         { PCI_VDEVICE(VIA, 0x3253), (kernel_ulong_t)chip_info_table},
140         { 0, }
141 };
142 
143 /*---------------------  Static Functions  --------------------------*/
144 
145 static int  vt6655_probe(struct pci_dev *pcid, const struct pci_device_id *ent);
146 static void vt6655_init_info(struct pci_dev *pcid,
147                              struct vnt_private **ppDevice, PCHIP_INFO);
148 static void device_free_info(struct vnt_private *pDevice);
149 static bool device_get_pci_info(struct vnt_private *, struct pci_dev *pcid);
150 static void device_print_info(struct vnt_private *pDevice);
151 static  irqreturn_t  device_intr(int irq,  void *dev_instance);
152 
153 #ifdef CONFIG_PM
154 static int device_notify_reboot(struct notifier_block *, unsigned long event, void *ptr);
155 static struct notifier_block device_notifier = {
156         .notifier_call = device_notify_reboot,
157         .next = NULL,
158         .priority = 0,
159 };
160 #endif
161 
162 static void device_init_rd0_ring(struct vnt_private *pDevice);
163 static void device_init_rd1_ring(struct vnt_private *pDevice);
164 static void device_init_td0_ring(struct vnt_private *pDevice);
165 static void device_init_td1_ring(struct vnt_private *pDevice);
166 
167 static int  device_rx_srv(struct vnt_private *pDevice, unsigned int uIdx);
168 static int  device_tx_srv(struct vnt_private *pDevice, unsigned int uIdx);
169 static bool device_alloc_rx_buf(struct vnt_private *pDevice, PSRxDesc pDesc);
170 static void device_init_registers(struct vnt_private *pDevice);
171 static void device_free_tx_buf(struct vnt_private *pDevice, PSTxDesc pDesc);
172 static void device_free_td0_ring(struct vnt_private *pDevice);
173 static void device_free_td1_ring(struct vnt_private *pDevice);
174 static void device_free_rd0_ring(struct vnt_private *pDevice);
175 static void device_free_rd1_ring(struct vnt_private *pDevice);
176 static void device_free_rings(struct vnt_private *pDevice);
177 
178 /*---------------------  Export Variables  --------------------------*/
179 
180 /*---------------------  Export Functions  --------------------------*/
181 
182 static char *get_chip_name(int chip_id)
183 {
184         int i;
185 
186         for (i = 0; chip_info_table[i].name != NULL; i++)
187                 if (chip_info_table[i].chip_id == chip_id)
188                         break;
189         return chip_info_table[i].name;
190 }
191 
192 static void vt6655_remove(struct pci_dev *pcid)
193 {
194         struct vnt_private *pDevice = pci_get_drvdata(pcid);
195 
196         if (pDevice == NULL)
197                 return;
198         device_free_info(pDevice);
199 }
200 
201 static void device_get_options(struct vnt_private *pDevice)
202 {
203         POPTIONS pOpts = &(pDevice->sOpts);
204 
205         pOpts->nRxDescs0 = RX_DESC_DEF0;
206         pOpts->nRxDescs1 = RX_DESC_DEF1;
207         pOpts->nTxDescs[0] = TX_DESC_DEF0;
208         pOpts->nTxDescs[1] = TX_DESC_DEF1;
209         pOpts->int_works = INT_WORKS_DEF;
210 
211         pOpts->short_retry = SHORT_RETRY_DEF;
212         pOpts->long_retry = LONG_RETRY_DEF;
213         pOpts->bbp_type = BBP_TYPE_DEF;
214 }
215 
216 static void
217 device_set_options(struct vnt_private *pDevice)
218 {
219         pDevice->byShortRetryLimit = pDevice->sOpts.short_retry;
220         pDevice->byLongRetryLimit = pDevice->sOpts.long_retry;
221         pDevice->byBBType = pDevice->sOpts.bbp_type;
222         pDevice->byPacketType = pDevice->byBBType;
223         pDevice->byAutoFBCtrl = AUTO_FB_0;
224         pDevice->bUpdateBBVGA = true;
225         pDevice->byPreambleType = 0;
226 
227         pr_debug(" byShortRetryLimit= %d\n", (int)pDevice->byShortRetryLimit);
228         pr_debug(" byLongRetryLimit= %d\n", (int)pDevice->byLongRetryLimit);
229         pr_debug(" byPreambleType= %d\n", (int)pDevice->byPreambleType);
230         pr_debug(" byShortPreamble= %d\n", (int)pDevice->byShortPreamble);
231         pr_debug(" byBBType= %d\n", (int)pDevice->byBBType);
232 }
233 
234 /*
235  * Initialisation of MAC & BBP registers
236  */
237 
238 static void device_init_registers(struct vnt_private *pDevice)
239 {
240         unsigned long flags;
241         unsigned int ii;
242         unsigned char byValue;
243         unsigned char byCCKPwrdBm = 0;
244         unsigned char byOFDMPwrdBm = 0;
245 
246         MACbShutdown(pDevice->PortOffset);
247         BBvSoftwareReset(pDevice);
248 
249         /* Do MACbSoftwareReset in MACvInitialize */
250         MACbSoftwareReset(pDevice->PortOffset);
251 
252         pDevice->bAES = false;
253 
254         /* Only used in 11g type, sync with ERP IE */
255         pDevice->bProtectMode = false;
256 
257         pDevice->bNonERPPresent = false;
258         pDevice->bBarkerPreambleMd = false;
259         pDevice->wCurrentRate = RATE_1M;
260         pDevice->byTopOFDMBasicRate = RATE_24M;
261         pDevice->byTopCCKBasicRate = RATE_1M;
262 
263         /* Target to IF pin while programming to RF chip. */
264         pDevice->byRevId = 0;
265 
266         /* init MAC */
267         MACvInitialize(pDevice->PortOffset);
268 
269         /* Get Local ID */
270         VNSvInPortB(pDevice->PortOffset + MAC_REG_LOCALID, &pDevice->byLocalID);
271 
272         spin_lock_irqsave(&pDevice->lock, flags);
273 
274         SROMvReadAllContents(pDevice->PortOffset, pDevice->abyEEPROM);
275 
276         spin_unlock_irqrestore(&pDevice->lock, flags);
277 
278         /* Get Channel range */
279         pDevice->byMinChannel = 1;
280         pDevice->byMaxChannel = CB_MAX_CHANNEL;
281 
282         /* Get Antena */
283         byValue = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_ANTENNA);
284         if (byValue & EEP_ANTINV)
285                 pDevice->bTxRxAntInv = true;
286         else
287                 pDevice->bTxRxAntInv = false;
288 
289         byValue &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
290         /* if not set default is All */
291         if (byValue == 0)
292                 byValue = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
293 
294         if (byValue == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
295                 pDevice->byAntennaCount = 2;
296                 pDevice->byTxAntennaMode = ANT_B;
297                 pDevice->dwTxAntennaSel = 1;
298                 pDevice->dwRxAntennaSel = 1;
299 
300                 if (pDevice->bTxRxAntInv)
301                         pDevice->byRxAntennaMode = ANT_A;
302                 else
303                         pDevice->byRxAntennaMode = ANT_B;
304         } else  {
305                 pDevice->byAntennaCount = 1;
306                 pDevice->dwTxAntennaSel = 0;
307                 pDevice->dwRxAntennaSel = 0;
308 
309                 if (byValue & EEP_ANTENNA_AUX) {
310                         pDevice->byTxAntennaMode = ANT_A;
311 
312                         if (pDevice->bTxRxAntInv)
313                                 pDevice->byRxAntennaMode = ANT_B;
314                         else
315                                 pDevice->byRxAntennaMode = ANT_A;
316                 } else {
317                         pDevice->byTxAntennaMode = ANT_B;
318 
319                         if (pDevice->bTxRxAntInv)
320                                 pDevice->byRxAntennaMode = ANT_A;
321                         else
322                                 pDevice->byRxAntennaMode = ANT_B;
323                 }
324         }
325 
326         /* Set initial antenna mode */
327         BBvSetTxAntennaMode(pDevice, pDevice->byTxAntennaMode);
328         BBvSetRxAntennaMode(pDevice, pDevice->byRxAntennaMode);
329 
330         /* zonetype initial */
331         pDevice->byOriginalZonetype = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
332 
333         if (!pDevice->bZoneRegExist)
334                 pDevice->byZoneType = pDevice->abyEEPROM[EEP_OFS_ZONETYPE];
335 
336         pr_debug("pDevice->byZoneType = %x\n", pDevice->byZoneType);
337 
338         /* Init RF module */
339         RFbInit(pDevice);
340 
341         /* Get Desire Power Value */
342         pDevice->byCurPwr = 0xFF;
343         pDevice->byCCKPwr = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_PWR_CCK);
344         pDevice->byOFDMPwrG = SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_PWR_OFDMG);
345 
346         /* Load power Table */
347         for (ii = 0; ii < CB_MAX_CHANNEL_24G; ii++) {
348                 pDevice->abyCCKPwrTbl[ii + 1] =
349                         SROMbyReadEmbedded(pDevice->PortOffset,
350                                            (unsigned char)(ii + EEP_OFS_CCK_PWR_TBL));
351                 if (pDevice->abyCCKPwrTbl[ii + 1] == 0)
352                         pDevice->abyCCKPwrTbl[ii+1] = pDevice->byCCKPwr;
353 
354                 pDevice->abyOFDMPwrTbl[ii + 1] =
355                         SROMbyReadEmbedded(pDevice->PortOffset,
356                                            (unsigned char)(ii + EEP_OFS_OFDM_PWR_TBL));
357                 if (pDevice->abyOFDMPwrTbl[ii + 1] == 0)
358                         pDevice->abyOFDMPwrTbl[ii + 1] = pDevice->byOFDMPwrG;
359 
360                 pDevice->abyCCKDefaultPwr[ii + 1] = byCCKPwrdBm;
361                 pDevice->abyOFDMDefaultPwr[ii + 1] = byOFDMPwrdBm;
362         }
363 
364         /* recover 12,13 ,14channel for EUROPE by 11 channel */
365         for (ii = 11; ii < 14; ii++) {
366                 pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10];
367                 pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10];
368         }
369 
370         /* Load OFDM A Power Table */
371         for (ii = 0; ii < CB_MAX_CHANNEL_5G; ii++) {
372                 pDevice->abyOFDMPwrTbl[ii + CB_MAX_CHANNEL_24G + 1] =
373                         SROMbyReadEmbedded(pDevice->PortOffset,
374                                            (unsigned char)(ii + EEP_OFS_OFDMA_PWR_TBL));
375 
376                 pDevice->abyOFDMDefaultPwr[ii + CB_MAX_CHANNEL_24G + 1] =
377                         SROMbyReadEmbedded(pDevice->PortOffset,
378                                            (unsigned char)(ii + EEP_OFS_OFDMA_PWR_dBm));
379         }
380 
381         if (pDevice->byLocalID > REV_ID_VT3253_B1) {
382                 MACvSelectPage1(pDevice->PortOffset);
383 
384                 VNSvOutPortB(pDevice->PortOffset + MAC_REG_MSRCTL + 1,
385                              (MSRCTL1_TXPWR | MSRCTL1_CSAPAREN));
386 
387                 MACvSelectPage0(pDevice->PortOffset);
388         }
389 
390         /* use relative tx timeout and 802.11i D4 */
391         MACvWordRegBitsOn(pDevice->PortOffset,
392                           MAC_REG_CFG, (CFG_TKIPOPT | CFG_NOTXTIMEOUT));
393 
394         /* set performance parameter by registry */
395         MACvSetShortRetryLimit(pDevice->PortOffset, pDevice->byShortRetryLimit);
396         MACvSetLongRetryLimit(pDevice->PortOffset, pDevice->byLongRetryLimit);
397 
398         /* reset TSF counter */
399         VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
400         /* enable TSF counter */
401         VNSvOutPortB(pDevice->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
402 
403         /* initialize BBP registers */
404         BBbVT3253Init(pDevice);
405 
406         if (pDevice->bUpdateBBVGA) {
407                 pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
408                 pDevice->byBBVGANew = pDevice->byBBVGACurrent;
409                 BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]);
410         }
411 
412         BBvSetRxAntennaMode(pDevice, pDevice->byRxAntennaMode);
413         BBvSetTxAntennaMode(pDevice, pDevice->byTxAntennaMode);
414 
415         /* Set BB and packet type at the same time. */
416         /* Set Short Slot Time, xIFS, and RSPINF. */
417         pDevice->wCurrentRate = RATE_54M;
418 
419         pDevice->bRadioOff = false;
420 
421         pDevice->byRadioCtl = SROMbyReadEmbedded(pDevice->PortOffset,
422                                                  EEP_OFS_RADIOCTL);
423         pDevice->bHWRadioOff = false;
424 
425         if (pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) {
426                 /* Get GPIO */
427                 MACvGPIOIn(pDevice->PortOffset, &pDevice->byGPIO);
428 
429                 if (((pDevice->byGPIO & GPIO0_DATA) &&
430                      !(pDevice->byRadioCtl & EEP_RADIOCTL_INV)) ||
431                      (!(pDevice->byGPIO & GPIO0_DATA) &&
432                      (pDevice->byRadioCtl & EEP_RADIOCTL_INV)))
433                         pDevice->bHWRadioOff = true;
434         }
435 
436         if (pDevice->bHWRadioOff || pDevice->bRadioControlOff)
437                 CARDbRadioPowerOff(pDevice);
438 
439         /* get Permanent network address */
440         SROMvReadEtherAddress(pDevice->PortOffset, pDevice->abyCurrentNetAddr);
441         pr_debug("Network address = %pM\n", pDevice->abyCurrentNetAddr);
442 
443         /* reset Tx pointer */
444         CARDvSafeResetRx(pDevice);
445         /* reset Rx pointer */
446         CARDvSafeResetTx(pDevice);
447 
448         if (pDevice->byLocalID <= REV_ID_VT3253_A1)
449                 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_RCR, RCR_WPAERR);
450 
451         /* Turn On Rx DMA */
452         MACvReceive0(pDevice->PortOffset);
453         MACvReceive1(pDevice->PortOffset);
454 
455         /* start the adapter */
456         MACvStart(pDevice->PortOffset);
457 }
458 
459 static void device_print_info(struct vnt_private *pDevice)
460 {
461         dev_info(&pDevice->pcid->dev, "%s\n", get_chip_name(pDevice->chip_id));
462 
463         dev_info(&pDevice->pcid->dev, "MAC=%pM IO=0x%lx Mem=0x%lx IRQ=%d\n",
464                  pDevice->abyCurrentNetAddr, (unsigned long)pDevice->ioaddr,
465                  (unsigned long)pDevice->PortOffset, pDevice->pcid->irq);
466 }
467 
468 static void vt6655_init_info(struct pci_dev *pcid,
469                              struct vnt_private **ppDevice,
470                              PCHIP_INFO pChip_info)
471 {
472         memset(*ppDevice, 0, sizeof(**ppDevice));
473 
474         (*ppDevice)->pcid = pcid;
475         (*ppDevice)->chip_id = pChip_info->chip_id;
476         (*ppDevice)->io_size = pChip_info->io_size;
477         (*ppDevice)->nTxQueues = pChip_info->nTxQueue;
478         (*ppDevice)->multicast_limit = 32;
479 
480         spin_lock_init(&((*ppDevice)->lock));
481 }
482 
483 static bool device_get_pci_info(struct vnt_private *pDevice,
484                                 struct pci_dev *pcid)
485 {
486         u16 pci_cmd;
487         u8  b;
488         unsigned int cis_addr;
489 
490         pci_read_config_byte(pcid, PCI_REVISION_ID, &pDevice->byRevId);
491         pci_read_config_word(pcid, PCI_SUBSYSTEM_ID, &pDevice->SubSystemID);
492         pci_read_config_word(pcid, PCI_SUBSYSTEM_VENDOR_ID, &pDevice->SubVendorID);
493         pci_read_config_word(pcid, PCI_COMMAND, (u16 *)&(pci_cmd));
494 
495         pci_set_master(pcid);
496 
497         pDevice->memaddr = pci_resource_start(pcid, 0);
498         pDevice->ioaddr = pci_resource_start(pcid, 1);
499 
500         cis_addr = pci_resource_start(pcid, 2);
501 
502         pDevice->pcid = pcid;
503 
504         pci_read_config_byte(pcid, PCI_COMMAND, &b);
505         pci_write_config_byte(pcid, PCI_COMMAND, (b|PCI_COMMAND_MASTER));
506 
507         return true;
508 }
509 
510 static void device_free_info(struct vnt_private *pDevice)
511 {
512         if (!pDevice)
513                 return;
514 
515         if (pDevice->mac_hw)
516                 ieee80211_unregister_hw(pDevice->hw);
517 
518         if (pDevice->PortOffset)
519                 iounmap(pDevice->PortOffset);
520 
521         if (pDevice->pcid)
522                 pci_release_regions(pDevice->pcid);
523 
524         if (pDevice->hw)
525                 ieee80211_free_hw(pDevice->hw);
526 }
527 
528 static bool device_init_rings(struct vnt_private *pDevice)
529 {
530         void *vir_pool;
531 
532         /*allocate all RD/TD rings a single pool*/
533         vir_pool = dma_zalloc_coherent(&pDevice->pcid->dev,
534                                          pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
535                                          pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
536                                          pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
537                                          pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
538                                          &pDevice->pool_dma, GFP_ATOMIC);
539         if (vir_pool == NULL) {
540                 dev_err(&pDevice->pcid->dev, "allocate desc dma memory failed\n");
541                 return false;
542         }
543 
544         pDevice->aRD0Ring = vir_pool;
545         pDevice->aRD1Ring = vir_pool +
546                 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
547 
548         pDevice->rd0_pool_dma = pDevice->pool_dma;
549         pDevice->rd1_pool_dma = pDevice->rd0_pool_dma +
550                 pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
551 
552         pDevice->tx0_bufs = dma_zalloc_coherent(&pDevice->pcid->dev,
553                                                   pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
554                                                   pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
555                                                   CB_BEACON_BUF_SIZE +
556                                                   CB_MAX_BUF_SIZE,
557                                                   &pDevice->tx_bufs_dma0,
558                                                   GFP_ATOMIC);
559         if (pDevice->tx0_bufs == NULL) {
560                 dev_err(&pDevice->pcid->dev, "allocate buf dma memory failed\n");
561 
562                 dma_free_coherent(&pDevice->pcid->dev,
563                                     pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
564                                     pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
565                                     pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
566                                     pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
567                                     vir_pool, pDevice->pool_dma
568                         );
569                 return false;
570         }
571 
572         pDevice->td0_pool_dma = pDevice->rd1_pool_dma +
573                 pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
574 
575         pDevice->td1_pool_dma = pDevice->td0_pool_dma +
576                 pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
577 
578         /* vir_pool: pvoid type */
579         pDevice->apTD0Rings = vir_pool
580                 + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
581                 + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
582 
583         pDevice->apTD1Rings = vir_pool
584                 + pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
585                 + pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc)
586                 + pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
587 
588         pDevice->tx1_bufs = pDevice->tx0_bufs +
589                 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
590 
591         pDevice->tx_beacon_bufs = pDevice->tx1_bufs +
592                 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
593 
594         pDevice->pbyTmpBuff = pDevice->tx_beacon_bufs +
595                 CB_BEACON_BUF_SIZE;
596 
597         pDevice->tx_bufs_dma1 = pDevice->tx_bufs_dma0 +
598                 pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
599 
600         pDevice->tx_beacon_dma = pDevice->tx_bufs_dma1 +
601                 pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
602 
603         return true;
604 }
605 
606 static void device_free_rings(struct vnt_private *pDevice)
607 {
608         dma_free_coherent(&pDevice->pcid->dev,
609                             pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
610                             pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
611                             pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
612                             pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc)
613                             ,
614                             pDevice->aRD0Ring, pDevice->pool_dma
615                 );
616 
617         if (pDevice->tx0_bufs)
618                 dma_free_coherent(&pDevice->pcid->dev,
619                                     pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
620                                     pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
621                                     CB_BEACON_BUF_SIZE +
622                                     CB_MAX_BUF_SIZE,
623                                     pDevice->tx0_bufs, pDevice->tx_bufs_dma0
624                         );
625 }
626 
627 static void device_init_rd0_ring(struct vnt_private *pDevice)
628 {
629         int i;
630         dma_addr_t      curr = pDevice->rd0_pool_dma;
631         PSRxDesc        pDesc;
632 
633         /* Init the RD0 ring entries */
634         for (i = 0; i < pDevice->sOpts.nRxDescs0; i ++, curr += sizeof(SRxDesc)) {
635                 pDesc = &(pDevice->aRD0Ring[i]);
636                 pDesc->pRDInfo = alloc_rd_info();
637                 ASSERT(pDesc->pRDInfo);
638                 if (!device_alloc_rx_buf(pDevice, pDesc))
639                         dev_err(&pDevice->pcid->dev, "can not alloc rx bufs\n");
640 
641                 pDesc->next = &(pDevice->aRD0Ring[(i+1) % pDevice->sOpts.nRxDescs0]);
642                 pDesc->pRDInfo->curr_desc = cpu_to_le32(curr);
643                 pDesc->next_desc = cpu_to_le32(curr + sizeof(SRxDesc));
644         }
645 
646         if (i > 0)
647                 pDevice->aRD0Ring[i-1].next_desc = cpu_to_le32(pDevice->rd0_pool_dma);
648         pDevice->pCurrRD[0] = &(pDevice->aRD0Ring[0]);
649 }
650 
651 static void device_init_rd1_ring(struct vnt_private *pDevice)
652 {
653         int i;
654         dma_addr_t      curr = pDevice->rd1_pool_dma;
655         PSRxDesc        pDesc;
656 
657         /* Init the RD1 ring entries */
658         for (i = 0; i < pDevice->sOpts.nRxDescs1; i ++, curr += sizeof(SRxDesc)) {
659                 pDesc = &(pDevice->aRD1Ring[i]);
660                 pDesc->pRDInfo = alloc_rd_info();
661                 ASSERT(pDesc->pRDInfo);
662                 if (!device_alloc_rx_buf(pDevice, pDesc))
663                         dev_err(&pDevice->pcid->dev, "can not alloc rx bufs\n");
664 
665                 pDesc->next = &(pDevice->aRD1Ring[(i+1) % pDevice->sOpts.nRxDescs1]);
666                 pDesc->pRDInfo->curr_desc = cpu_to_le32(curr);
667                 pDesc->next_desc = cpu_to_le32(curr + sizeof(SRxDesc));
668         }
669 
670         if (i > 0)
671                 pDevice->aRD1Ring[i-1].next_desc = cpu_to_le32(pDevice->rd1_pool_dma);
672         pDevice->pCurrRD[1] = &(pDevice->aRD1Ring[0]);
673 }
674 
675 static void device_free_rd0_ring(struct vnt_private *pDevice)
676 {
677         int i;
678 
679         for (i = 0; i < pDevice->sOpts.nRxDescs0; i++) {
680                 PSRxDesc        pDesc = &(pDevice->aRD0Ring[i]);
681                 PDEVICE_RD_INFO  pRDInfo = pDesc->pRDInfo;
682 
683                 dma_unmap_single(&pDevice->pcid->dev, pRDInfo->skb_dma,
684                                  pDevice->rx_buf_sz, DMA_FROM_DEVICE);
685 
686                 dev_kfree_skb(pRDInfo->skb);
687 
688                 kfree(pDesc->pRDInfo);
689         }
690 }
691 
692 static void device_free_rd1_ring(struct vnt_private *pDevice)
693 {
694         int i;
695 
696         for (i = 0; i < pDevice->sOpts.nRxDescs1; i++) {
697                 PSRxDesc        pDesc = &(pDevice->aRD1Ring[i]);
698                 PDEVICE_RD_INFO  pRDInfo = pDesc->pRDInfo;
699 
700                 dma_unmap_single(&pDevice->pcid->dev, pRDInfo->skb_dma,
701                                  pDevice->rx_buf_sz, DMA_FROM_DEVICE);
702 
703                 dev_kfree_skb(pRDInfo->skb);
704 
705                 kfree(pDesc->pRDInfo);
706         }
707 }
708 
709 static void device_init_td0_ring(struct vnt_private *pDevice)
710 {
711         int i;
712         dma_addr_t  curr;
713         PSTxDesc        pDesc;
714 
715         curr = pDevice->td0_pool_dma;
716         for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++, curr += sizeof(STxDesc)) {
717                 pDesc = &(pDevice->apTD0Rings[i]);
718                 pDesc->pTDInfo = alloc_td_info();
719                 ASSERT(pDesc->pTDInfo);
720                 if (pDevice->flags & DEVICE_FLAGS_TX_ALIGN) {
721                         pDesc->pTDInfo->buf = pDevice->tx0_bufs + (i)*PKT_BUF_SZ;
722                         pDesc->pTDInfo->buf_dma = pDevice->tx_bufs_dma0 + (i)*PKT_BUF_SZ;
723                 }
724                 pDesc->next = &(pDevice->apTD0Rings[(i+1) % pDevice->sOpts.nTxDescs[0]]);
725                 pDesc->pTDInfo->curr_desc = cpu_to_le32(curr);
726                 pDesc->next_desc = cpu_to_le32(curr+sizeof(STxDesc));
727         }
728 
729         if (i > 0)
730                 pDevice->apTD0Rings[i-1].next_desc = cpu_to_le32(pDevice->td0_pool_dma);
731         pDevice->apTailTD[0] = pDevice->apCurrTD[0] = &(pDevice->apTD0Rings[0]);
732 }
733 
734 static void device_init_td1_ring(struct vnt_private *pDevice)
735 {
736         int i;
737         dma_addr_t  curr;
738         PSTxDesc    pDesc;
739 
740         /* Init the TD ring entries */
741         curr = pDevice->td1_pool_dma;
742         for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++, curr += sizeof(STxDesc)) {
743                 pDesc = &(pDevice->apTD1Rings[i]);
744                 pDesc->pTDInfo = alloc_td_info();
745                 ASSERT(pDesc->pTDInfo);
746                 if (pDevice->flags & DEVICE_FLAGS_TX_ALIGN) {
747                         pDesc->pTDInfo->buf = pDevice->tx1_bufs + (i) * PKT_BUF_SZ;
748                         pDesc->pTDInfo->buf_dma = pDevice->tx_bufs_dma1 + (i) * PKT_BUF_SZ;
749                 }
750                 pDesc->next = &(pDevice->apTD1Rings[(i + 1) % pDevice->sOpts.nTxDescs[1]]);
751                 pDesc->pTDInfo->curr_desc = cpu_to_le32(curr);
752                 pDesc->next_desc = cpu_to_le32(curr+sizeof(STxDesc));
753         }
754 
755         if (i > 0)
756                 pDevice->apTD1Rings[i-1].next_desc = cpu_to_le32(pDevice->td1_pool_dma);
757         pDevice->apTailTD[1] = pDevice->apCurrTD[1] = &(pDevice->apTD1Rings[0]);
758 }
759 
760 static void device_free_td0_ring(struct vnt_private *pDevice)
761 {
762         int i;
763 
764         for (i = 0; i < pDevice->sOpts.nTxDescs[0]; i++) {
765                 PSTxDesc        pDesc = &(pDevice->apTD0Rings[i]);
766                 PDEVICE_TD_INFO  pTDInfo = pDesc->pTDInfo;
767 
768                 if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma))
769                         dma_unmap_single(&pDevice->pcid->dev, pTDInfo->skb_dma,
770                                          pTDInfo->skb->len, DMA_TO_DEVICE);
771 
772                 if (pTDInfo->skb)
773                         dev_kfree_skb(pTDInfo->skb);
774 
775                 kfree(pDesc->pTDInfo);
776         }
777 }
778 
779 static void device_free_td1_ring(struct vnt_private *pDevice)
780 {
781         int i;
782 
783         for (i = 0; i < pDevice->sOpts.nTxDescs[1]; i++) {
784                 PSTxDesc        pDesc = &(pDevice->apTD1Rings[i]);
785                 PDEVICE_TD_INFO  pTDInfo = pDesc->pTDInfo;
786 
787                 if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma))
788                         dma_unmap_single(&pDevice->pcid->dev, pTDInfo->skb_dma,
789                                          pTDInfo->skb->len, DMA_TO_DEVICE);
790 
791                 if (pTDInfo->skb)
792                         dev_kfree_skb(pTDInfo->skb);
793 
794                 kfree(pDesc->pTDInfo);
795         }
796 }
797 
798 /*-----------------------------------------------------------------*/
799 
800 static int device_rx_srv(struct vnt_private *pDevice, unsigned int uIdx)
801 {
802         PSRxDesc    pRD;
803         int works = 0;
804 
805         for (pRD = pDevice->pCurrRD[uIdx];
806              pRD->m_rd0RD0.f1Owner == OWNED_BY_HOST;
807              pRD = pRD->next) {
808                 if (works++ > 15)
809                         break;
810                 if (vnt_receive_frame(pDevice, pRD)) {
811                         if (!device_alloc_rx_buf(pDevice, pRD)) {
812                                 dev_err(&pDevice->pcid->dev,
813                                         "can not allocate rx buf\n");
814                                 break;
815                         }
816                 }
817                 pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
818         }
819 
820         pDevice->pCurrRD[uIdx] = pRD;
821 
822         return works;
823 }
824 
825 static bool device_alloc_rx_buf(struct vnt_private *pDevice, PSRxDesc pRD)
826 {
827         PDEVICE_RD_INFO pRDInfo = pRD->pRDInfo;
828 
829         pRDInfo->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
830         if (pRDInfo->skb == NULL)
831                 return false;
832         ASSERT(pRDInfo->skb);
833 
834         pRDInfo->skb_dma =
835                 dma_map_single(&pDevice->pcid->dev,
836                                skb_put(pRDInfo->skb, skb_tailroom(pRDInfo->skb)),
837                                pDevice->rx_buf_sz, DMA_FROM_DEVICE);
838 
839         *((unsigned int *)&(pRD->m_rd0RD0)) = 0; /* FIX cast */
840 
841         pRD->m_rd0RD0.wResCount = cpu_to_le16(pDevice->rx_buf_sz);
842         pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
843         pRD->m_rd1RD1.wReqCount = cpu_to_le16(pDevice->rx_buf_sz);
844         pRD->buff_addr = cpu_to_le32(pRDInfo->skb_dma);
845 
846         return true;
847 }
848 
849 static const u8 fallback_rate0[5][5] = {
850         {RATE_18M, RATE_18M, RATE_12M, RATE_12M, RATE_12M},
851         {RATE_24M, RATE_24M, RATE_18M, RATE_12M, RATE_12M},
852         {RATE_36M, RATE_36M, RATE_24M, RATE_18M, RATE_18M},
853         {RATE_48M, RATE_48M, RATE_36M, RATE_24M, RATE_24M},
854         {RATE_54M, RATE_54M, RATE_48M, RATE_36M, RATE_36M}
855 };
856 
857 static const u8 fallback_rate1[5][5] = {
858         {RATE_18M, RATE_18M, RATE_12M, RATE_6M, RATE_6M},
859         {RATE_24M, RATE_24M, RATE_18M, RATE_6M, RATE_6M},
860         {RATE_36M, RATE_36M, RATE_24M, RATE_12M, RATE_12M},
861         {RATE_48M, RATE_48M, RATE_24M, RATE_12M, RATE_12M},
862         {RATE_54M, RATE_54M, RATE_36M, RATE_18M, RATE_18M}
863 };
864 
865 static int vnt_int_report_rate(struct vnt_private *priv,
866                                PDEVICE_TD_INFO context, u8 tsr0, u8 tsr1)
867 {
868         struct vnt_tx_fifo_head *fifo_head;
869         struct ieee80211_tx_info *info;
870         struct ieee80211_rate *rate;
871         u16 fb_option;
872         u8 tx_retry = (tsr0 & TSR0_NCR);
873         s8 idx;
874 
875         if (!context)
876                 return -ENOMEM;
877 
878         if (!context->skb)
879                 return -EINVAL;
880 
881         fifo_head = (struct vnt_tx_fifo_head *)context->buf;
882         fb_option = (le16_to_cpu(fifo_head->fifo_ctl) &
883                         (FIFOCTL_AUTO_FB_0 | FIFOCTL_AUTO_FB_1));
884 
885         info = IEEE80211_SKB_CB(context->skb);
886         idx = info->control.rates[0].idx;
887 
888         if (fb_option && !(tsr1 & TSR1_TERR)) {
889                 u8 tx_rate;
890                 u8 retry = tx_retry;
891 
892                 rate = ieee80211_get_tx_rate(priv->hw, info);
893                 tx_rate = rate->hw_value - RATE_18M;
894 
895                 if (retry > 4)
896                         retry = 4;
897 
898                 if (fb_option & FIFOCTL_AUTO_FB_0)
899                         tx_rate = fallback_rate0[tx_rate][retry];
900                 else if (fb_option & FIFOCTL_AUTO_FB_1)
901                         tx_rate = fallback_rate1[tx_rate][retry];
902 
903                 if (info->band == IEEE80211_BAND_5GHZ)
904                         idx = tx_rate - RATE_6M;
905                 else
906                         idx = tx_rate;
907         }
908 
909         ieee80211_tx_info_clear_status(info);
910 
911         info->status.rates[0].count = tx_retry;
912 
913         if (!(tsr1 & TSR1_TERR)) {
914                 info->status.rates[0].idx = idx;
915 
916                 if (info->flags & IEEE80211_TX_CTL_NO_ACK)
917                         info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
918                 else
919                         info->flags |= IEEE80211_TX_STAT_ACK;
920         }
921 
922         return 0;
923 }
924 
925 static int device_tx_srv(struct vnt_private *pDevice, unsigned int uIdx)
926 {
927         PSTxDesc                 pTD;
928         int                      works = 0;
929         unsigned char byTsr0;
930         unsigned char byTsr1;
931 
932         for (pTD = pDevice->apTailTD[uIdx]; pDevice->iTDUsed[uIdx] > 0; pTD = pTD->next) {
933                 if (pTD->m_td0TD0.f1Owner == OWNED_BY_NIC)
934                         break;
935                 if (works++ > 15)
936                         break;
937 
938                 byTsr0 = pTD->m_td0TD0.byTSR0;
939                 byTsr1 = pTD->m_td0TD0.byTSR1;
940 
941                 /* Only the status of first TD in the chain is correct */
942                 if (pTD->m_td1TD1.byTCR & TCR_STP) {
943                         if ((pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0) {
944                                 if (!(byTsr1 & TSR1_TERR)) {
945                                         if (byTsr0 != 0) {
946                                                 pr_debug(" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X]\n",
947                                                          (int)uIdx, byTsr1,
948                                                          byTsr0);
949                                         }
950                                 } else {
951                                         pr_debug(" Tx[%d] dropped & tsr1[%02X] tsr0[%02X]\n",
952                                                  (int)uIdx, byTsr1, byTsr0);
953                                 }
954                         }
955 
956                         if (byTsr1 & TSR1_TERR) {
957                                 if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
958                                         pr_debug(" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X]\n",
959                                                  (int)uIdx, byTsr1, byTsr0);
960                                 }
961                         }
962 
963                         vnt_int_report_rate(pDevice, pTD->pTDInfo, byTsr0, byTsr1);
964 
965                         device_free_tx_buf(pDevice, pTD);
966                         pDevice->iTDUsed[uIdx]--;
967                 }
968         }
969 
970         pDevice->apTailTD[uIdx] = pTD;
971 
972         return works;
973 }
974 
975 static void device_error(struct vnt_private *pDevice, unsigned short status)
976 {
977         if (status & ISR_FETALERR) {
978                 dev_err(&pDevice->pcid->dev, "Hardware fatal error\n");
979 
980                 MACbShutdown(pDevice->PortOffset);
981                 return;
982         }
983 }
984 
985 static void device_free_tx_buf(struct vnt_private *pDevice, PSTxDesc pDesc)
986 {
987         PDEVICE_TD_INFO  pTDInfo = pDesc->pTDInfo;
988         struct sk_buff *skb = pTDInfo->skb;
989 
990         /* pre-allocated buf_dma can't be unmapped. */
991         if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma)) {
992                 dma_unmap_single(&pDevice->pcid->dev, pTDInfo->skb_dma,
993                                  skb->len, DMA_TO_DEVICE);
994         }
995 
996         if (skb)
997                 ieee80211_tx_status_irqsafe(pDevice->hw, skb);
998 
999         pTDInfo->skb_dma = 0;
1000         pTDInfo->skb = NULL;
1001         pTDInfo->byFlags = 0;
1002 }
1003 
1004 static void vnt_check_bb_vga(struct vnt_private *priv)
1005 {
1006         long dbm;
1007         int i;
1008 
1009         if (!priv->bUpdateBBVGA)
1010                 return;
1011 
1012         if (priv->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
1013                 return;
1014 
1015         if (!(priv->vif->bss_conf.assoc && priv->uCurrRSSI))
1016                 return;
1017 
1018         RFvRSSITodBm(priv, (u8)priv->uCurrRSSI, &dbm);
1019 
1020         for (i = 0; i < BB_VGA_LEVEL; i++) {
1021                 if (dbm < priv->ldBmThreshold[i]) {
1022                         priv->byBBVGANew = priv->abyBBVGA[i];
1023                         break;
1024                 }
1025         }
1026 
1027         if (priv->byBBVGANew == priv->byBBVGACurrent) {
1028                 priv->uBBVGADiffCount = 1;
1029                 return;
1030         }
1031 
1032         priv->uBBVGADiffCount++;
1033 
1034         if (priv->uBBVGADiffCount == 1) {
1035                 /* first VGA diff gain */
1036                 BBvSetVGAGainOffset(priv, priv->byBBVGANew);
1037 
1038                 dev_dbg(&priv->pcid->dev,
1039                         "First RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
1040                         (int)dbm, priv->byBBVGANew,
1041                         priv->byBBVGACurrent,
1042                         (int)priv->uBBVGADiffCount);
1043         }
1044 
1045         if (priv->uBBVGADiffCount >= BB_VGA_CHANGE_THRESHOLD) {
1046                 dev_dbg(&priv->pcid->dev,
1047                         "RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
1048                         (int)dbm, priv->byBBVGANew,
1049                         priv->byBBVGACurrent,
1050                         (int)priv->uBBVGADiffCount);
1051 
1052                 BBvSetVGAGainOffset(priv, priv->byBBVGANew);
1053         }
1054 }
1055 
1056 static  irqreturn_t  device_intr(int irq,  void *dev_instance)
1057 {
1058         struct vnt_private *pDevice = dev_instance;
1059         int             max_count = 0;
1060         unsigned long dwMIBCounter = 0;
1061         unsigned char byOrgPageSel = 0;
1062         int             handled = 0;
1063         unsigned long flags;
1064 
1065         MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
1066 
1067         if (pDevice->dwIsr == 0)
1068                 return IRQ_RETVAL(handled);
1069 
1070         if (pDevice->dwIsr == 0xffffffff) {
1071                 pr_debug("dwIsr = 0xffff\n");
1072                 return IRQ_RETVAL(handled);
1073         }
1074 
1075         handled = 1;
1076         MACvIntDisable(pDevice->PortOffset);
1077 
1078         spin_lock_irqsave(&pDevice->lock, flags);
1079 
1080         /* Make sure current page is 0 */
1081         VNSvInPortB(pDevice->PortOffset + MAC_REG_PAGE1SEL, &byOrgPageSel);
1082         if (byOrgPageSel == 1)
1083                 MACvSelectPage0(pDevice->PortOffset);
1084         else
1085                 byOrgPageSel = 0;
1086 
1087         MACvReadMIBCounter(pDevice->PortOffset, &dwMIBCounter);
1088         /*
1089          * TBD....
1090          * Must do this after doing rx/tx, cause ISR bit is slow
1091          * than RD/TD write back
1092          * update ISR counter
1093          */
1094         STAvUpdate802_11Counter(&pDevice->s802_11Counter, &pDevice->scStatistic, dwMIBCounter);
1095         while (pDevice->dwIsr != 0) {
1096                 STAvUpdateIsrStatCounter(&pDevice->scStatistic, pDevice->dwIsr);
1097                 MACvWriteISR(pDevice->PortOffset, pDevice->dwIsr);
1098 
1099                 if (pDevice->dwIsr & ISR_FETALERR) {
1100                         pr_debug(" ISR_FETALERR\n");
1101                         VNSvOutPortB(pDevice->PortOffset + MAC_REG_SOFTPWRCTL, 0);
1102                         VNSvOutPortW(pDevice->PortOffset + MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPECTI);
1103                         device_error(pDevice, pDevice->dwIsr);
1104                 }
1105 
1106                 if (pDevice->dwIsr & ISR_TBTT) {
1107                         if (pDevice->vif &&
1108                             pDevice->op_mode != NL80211_IFTYPE_ADHOC)
1109                                 vnt_check_bb_vga(pDevice);
1110 
1111                         pDevice->bBeaconSent = false;
1112                         if (pDevice->bEnablePSMode)
1113                                 PSbIsNextTBTTWakeUp((void *)pDevice);
1114 
1115                         if ((pDevice->op_mode == NL80211_IFTYPE_AP ||
1116                             pDevice->op_mode == NL80211_IFTYPE_ADHOC) &&
1117                             pDevice->vif->bss_conf.enable_beacon) {
1118                                 MACvOneShotTimer1MicroSec(pDevice->PortOffset,
1119                                                           (pDevice->vif->bss_conf.beacon_int - MAKE_BEACON_RESERVED) << 10);
1120                         }
1121 
1122                         /* TODO: adhoc PS mode */
1123 
1124                 }
1125 
1126                 if (pDevice->dwIsr & ISR_BNTX) {
1127                         if (pDevice->op_mode == NL80211_IFTYPE_ADHOC) {
1128                                 pDevice->bIsBeaconBufReadySet = false;
1129                                 pDevice->cbBeaconBufReadySetCnt = 0;
1130                         }
1131 
1132                         pDevice->bBeaconSent = true;
1133                 }
1134 
1135                 if (pDevice->dwIsr & ISR_RXDMA0)
1136                         max_count += device_rx_srv(pDevice, TYPE_RXDMA0);
1137 
1138                 if (pDevice->dwIsr & ISR_RXDMA1)
1139                         max_count += device_rx_srv(pDevice, TYPE_RXDMA1);
1140 
1141                 if (pDevice->dwIsr & ISR_TXDMA0)
1142                         max_count += device_tx_srv(pDevice, TYPE_TXDMA0);
1143 
1144                 if (pDevice->dwIsr & ISR_AC0DMA)
1145                         max_count += device_tx_srv(pDevice, TYPE_AC0DMA);
1146 
1147                 if (pDevice->dwIsr & ISR_SOFTTIMER1) {
1148                         if (pDevice->vif) {
1149                                 if (pDevice->vif->bss_conf.enable_beacon)
1150                                         vnt_beacon_make(pDevice, pDevice->vif);
1151                         }
1152                 }
1153 
1154                 /* If both buffers available wake the queue */
1155                 if (pDevice->vif) {
1156                         if (AVAIL_TD(pDevice, TYPE_TXDMA0) &&
1157                             AVAIL_TD(pDevice, TYPE_AC0DMA) &&
1158                             ieee80211_queue_stopped(pDevice->hw, 0))
1159                                 ieee80211_wake_queues(pDevice->hw);
1160                 }
1161 
1162                 MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
1163 
1164                 MACvReceive0(pDevice->PortOffset);
1165                 MACvReceive1(pDevice->PortOffset);
1166 
1167                 if (max_count > pDevice->sOpts.int_works)
1168                         break;
1169         }
1170 
1171         if (byOrgPageSel == 1)
1172                 MACvSelectPage1(pDevice->PortOffset);
1173 
1174         spin_unlock_irqrestore(&pDevice->lock, flags);
1175 
1176         MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);
1177 
1178         return IRQ_RETVAL(handled);
1179 }
1180 
1181 static int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb)
1182 {
1183         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1184         PSTxDesc head_td;
1185         u32 dma_idx;
1186         unsigned long flags;
1187 
1188         spin_lock_irqsave(&priv->lock, flags);
1189 
1190         if (ieee80211_is_data(hdr->frame_control))
1191                 dma_idx = TYPE_AC0DMA;
1192         else
1193                 dma_idx = TYPE_TXDMA0;
1194 
1195         if (AVAIL_TD(priv, dma_idx) < 1) {
1196                 spin_unlock_irqrestore(&priv->lock, flags);
1197                 return -ENOMEM;
1198         }
1199 
1200         head_td = priv->apCurrTD[dma_idx];
1201 
1202         head_td->m_td1TD1.byTCR = 0;
1203 
1204         head_td->pTDInfo->skb = skb;
1205 
1206         if (dma_idx == TYPE_AC0DMA)
1207                 head_td->pTDInfo->byFlags = TD_FLAGS_NETIF_SKB;
1208 
1209         priv->apCurrTD[dma_idx] = head_td->next;
1210 
1211         spin_unlock_irqrestore(&priv->lock, flags);
1212 
1213         vnt_generate_fifo_header(priv, dma_idx, head_td, skb);
1214 
1215         if (MACbIsRegBitsOn(priv->PortOffset, MAC_REG_PSCTL, PSCTL_PS))
1216                 MACbPSWakeup(priv->PortOffset);
1217 
1218         spin_lock_irqsave(&priv->lock, flags);
1219 
1220         priv->bPWBitOn = false;
1221 
1222         /* Set TSR1 & ReqCount in TxDescHead */
1223         head_td->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU);
1224         head_td->m_td1TD1.wReqCount =
1225                         cpu_to_le16((u16)head_td->pTDInfo->dwReqCount);
1226 
1227         head_td->buff_addr = cpu_to_le32(head_td->pTDInfo->skb_dma);
1228 
1229         /* Poll Transmit the adapter */
1230         wmb();
1231         head_td->m_td0TD0.f1Owner = OWNED_BY_NIC;
1232         wmb(); /* second memory barrier */
1233 
1234         if (head_td->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB)
1235                 MACvTransmitAC0(priv->PortOffset);
1236         else
1237                 MACvTransmit0(priv->PortOffset);
1238 
1239         priv->iTDUsed[dma_idx]++;
1240 
1241         spin_unlock_irqrestore(&priv->lock, flags);
1242 
1243         return 0;
1244 }
1245 
1246 static void vnt_tx_80211(struct ieee80211_hw *hw,
1247                          struct ieee80211_tx_control *control,
1248                          struct sk_buff *skb)
1249 {
1250         struct vnt_private *priv = hw->priv;
1251 
1252         ieee80211_stop_queues(hw);
1253 
1254         if (vnt_tx_packet(priv, skb)) {
1255                 ieee80211_free_txskb(hw, skb);
1256 
1257                 ieee80211_wake_queues(hw);
1258         }
1259 }
1260 
1261 static int vnt_start(struct ieee80211_hw *hw)
1262 {
1263         struct vnt_private *priv = hw->priv;
1264         int ret;
1265 
1266         priv->rx_buf_sz = PKT_BUF_SZ;
1267         if (!device_init_rings(priv))
1268                 return -ENOMEM;
1269 
1270         ret = request_irq(priv->pcid->irq, &device_intr,
1271                           IRQF_SHARED, "vt6655", priv);
1272         if (ret) {
1273                 dev_dbg(&priv->pcid->dev, "failed to start irq\n");
1274                 return ret;
1275         }
1276 
1277         dev_dbg(&priv->pcid->dev, "call device init rd0 ring\n");
1278         device_init_rd0_ring(priv);
1279         device_init_rd1_ring(priv);
1280         device_init_td0_ring(priv);
1281         device_init_td1_ring(priv);
1282 
1283         device_init_registers(priv);
1284 
1285         dev_dbg(&priv->pcid->dev, "call MACvIntEnable\n");
1286         MACvIntEnable(priv->PortOffset, IMR_MASK_VALUE);
1287 
1288         ieee80211_wake_queues(hw);
1289 
1290         return 0;
1291 }
1292 
1293 static void vnt_stop(struct ieee80211_hw *hw)
1294 {
1295         struct vnt_private *priv = hw->priv;
1296 
1297         ieee80211_stop_queues(hw);
1298 
1299         MACbShutdown(priv->PortOffset);
1300         MACbSoftwareReset(priv->PortOffset);
1301         CARDbRadioPowerOff(priv);
1302 
1303         device_free_td0_ring(priv);
1304         device_free_td1_ring(priv);
1305         device_free_rd0_ring(priv);
1306         device_free_rd1_ring(priv);
1307         device_free_rings(priv);
1308 
1309         free_irq(priv->pcid->irq, priv);
1310 }
1311 
1312 static int vnt_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1313 {
1314         struct vnt_private *priv = hw->priv;
1315 
1316         priv->vif = vif;
1317 
1318         switch (vif->type) {
1319         case NL80211_IFTYPE_STATION:
1320                 break;
1321         case NL80211_IFTYPE_ADHOC:
1322                 MACvRegBitsOff(priv->PortOffset, MAC_REG_RCR, RCR_UNICAST);
1323 
1324                 MACvRegBitsOn(priv->PortOffset, MAC_REG_HOSTCR, HOSTCR_ADHOC);
1325 
1326                 break;
1327         case NL80211_IFTYPE_AP:
1328                 MACvRegBitsOff(priv->PortOffset, MAC_REG_RCR, RCR_UNICAST);
1329 
1330                 MACvRegBitsOn(priv->PortOffset, MAC_REG_HOSTCR, HOSTCR_AP);
1331 
1332                 break;
1333         default:
1334                 return -EOPNOTSUPP;
1335         }
1336 
1337         priv->op_mode = vif->type;
1338 
1339         return 0;
1340 }
1341 
1342 static void vnt_remove_interface(struct ieee80211_hw *hw,
1343                                  struct ieee80211_vif *vif)
1344 {
1345         struct vnt_private *priv = hw->priv;
1346 
1347         switch (vif->type) {
1348         case NL80211_IFTYPE_STATION:
1349                 break;
1350         case NL80211_IFTYPE_ADHOC:
1351                 MACvRegBitsOff(priv->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
1352                 MACvRegBitsOff(priv->PortOffset,
1353                                MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
1354                 MACvRegBitsOff(priv->PortOffset, MAC_REG_HOSTCR, HOSTCR_ADHOC);
1355                 break;
1356         case NL80211_IFTYPE_AP:
1357                 MACvRegBitsOff(priv->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
1358                 MACvRegBitsOff(priv->PortOffset,
1359                                MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
1360                 MACvRegBitsOff(priv->PortOffset, MAC_REG_HOSTCR, HOSTCR_AP);
1361                 break;
1362         default:
1363                 break;
1364         }
1365 
1366         priv->op_mode = NL80211_IFTYPE_UNSPECIFIED;
1367 }
1368 
1369 
1370 static int vnt_config(struct ieee80211_hw *hw, u32 changed)
1371 {
1372         struct vnt_private *priv = hw->priv;
1373         struct ieee80211_conf *conf = &hw->conf;
1374         u8 bb_type;
1375 
1376         if (changed & IEEE80211_CONF_CHANGE_PS) {
1377                 if (conf->flags & IEEE80211_CONF_PS)
1378                         PSvEnablePowerSaving(priv, conf->listen_interval);
1379                 else
1380                         PSvDisablePowerSaving(priv);
1381         }
1382 
1383         if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) ||
1384             (conf->flags & IEEE80211_CONF_OFFCHANNEL)) {
1385                 set_channel(priv, conf->chandef.chan);
1386 
1387                 if (conf->chandef.chan->band == IEEE80211_BAND_5GHZ)
1388                         bb_type = BB_TYPE_11A;
1389                 else
1390                         bb_type = BB_TYPE_11G;
1391 
1392                 if (priv->byBBType != bb_type) {
1393                         priv->byBBType = bb_type;
1394 
1395                         CARDbSetPhyParameter(priv, priv->byBBType);
1396                 }
1397         }
1398 
1399         if (changed & IEEE80211_CONF_CHANGE_POWER) {
1400                 if (priv->byBBType == BB_TYPE_11B)
1401                         priv->wCurrentRate = RATE_1M;
1402                 else
1403                         priv->wCurrentRate = RATE_54M;
1404 
1405                 RFbSetPower(priv, priv->wCurrentRate,
1406                             conf->chandef.chan->hw_value);
1407         }
1408 
1409         return 0;
1410 }
1411 
1412 static void vnt_bss_info_changed(struct ieee80211_hw *hw,
1413                 struct ieee80211_vif *vif, struct ieee80211_bss_conf *conf,
1414                 u32 changed)
1415 {
1416         struct vnt_private *priv = hw->priv;
1417 
1418         priv->current_aid = conf->aid;
1419 
1420         if (changed & BSS_CHANGED_BSSID) {
1421                 unsigned long flags;
1422 
1423                 spin_lock_irqsave(&priv->lock, flags);
1424 
1425                 MACvWriteBSSIDAddress(priv->PortOffset, (u8 *)conf->bssid);
1426 
1427                 spin_unlock_irqrestore(&priv->lock, flags);
1428         }
1429 
1430         if (changed & BSS_CHANGED_BASIC_RATES) {
1431                 priv->basic_rates = conf->basic_rates;
1432 
1433                 CARDvUpdateBasicTopRate(priv);
1434 
1435                 dev_dbg(&priv->pcid->dev,
1436                         "basic rates %x\n", conf->basic_rates);
1437         }
1438 
1439         if (changed & BSS_CHANGED_ERP_PREAMBLE) {
1440                 if (conf->use_short_preamble) {
1441                         MACvEnableBarkerPreambleMd(priv->PortOffset);
1442                         priv->byPreambleType = true;
1443                 } else {
1444                         MACvDisableBarkerPreambleMd(priv->PortOffset);
1445                         priv->byPreambleType = false;
1446                 }
1447         }
1448 
1449         if (changed & BSS_CHANGED_ERP_CTS_PROT) {
1450                 if (conf->use_cts_prot)
1451                         MACvEnableProtectMD(priv->PortOffset);
1452                 else
1453                         MACvDisableProtectMD(priv->PortOffset);
1454         }
1455 
1456         if (changed & BSS_CHANGED_ERP_SLOT) {
1457                 if (conf->use_short_slot)
1458                         priv->bShortSlotTime = true;
1459                 else
1460                         priv->bShortSlotTime = false;
1461 
1462                 CARDbSetPhyParameter(priv, priv->byBBType);
1463                 BBvSetVGAGainOffset(priv, priv->abyBBVGA[0]);
1464         }
1465 
1466         if (changed & BSS_CHANGED_TXPOWER)
1467                 RFbSetPower(priv, priv->wCurrentRate,
1468                             conf->chandef.chan->hw_value);
1469 
1470         if (changed & BSS_CHANGED_BEACON_ENABLED) {
1471                 dev_dbg(&priv->pcid->dev,
1472                         "Beacon enable %d\n", conf->enable_beacon);
1473 
1474                 if (conf->enable_beacon) {
1475                         vnt_beacon_enable(priv, vif, conf);
1476 
1477                         MACvRegBitsOn(priv->PortOffset, MAC_REG_TCR,
1478                                       TCR_AUTOBCNTX);
1479                 } else {
1480                         MACvRegBitsOff(priv->PortOffset, MAC_REG_TCR,
1481                                        TCR_AUTOBCNTX);
1482                 }
1483         }
1484 
1485         if (changed & BSS_CHANGED_ASSOC && priv->op_mode != NL80211_IFTYPE_AP) {
1486                 if (conf->assoc) {
1487                         CARDbUpdateTSF(priv, conf->beacon_rate->hw_value,
1488                                        conf->sync_tsf);
1489 
1490                         CARDbSetBeaconPeriod(priv, conf->beacon_int);
1491 
1492                         CARDvSetFirstNextTBTT(priv, conf->beacon_int);
1493                 } else {
1494                         VNSvOutPortB(priv->PortOffset + MAC_REG_TFTCTL,
1495                                      TFTCTL_TSFCNTRST);
1496                         VNSvOutPortB(priv->PortOffset + MAC_REG_TFTCTL,
1497                                      TFTCTL_TSFCNTREN);
1498                 }
1499         }
1500 }
1501 
1502 static u64 vnt_prepare_multicast(struct ieee80211_hw *hw,
1503         struct netdev_hw_addr_list *mc_list)
1504 {
1505         struct vnt_private *priv = hw->priv;
1506         struct netdev_hw_addr *ha;
1507         u64 mc_filter = 0;
1508         u32 bit_nr = 0;
1509 
1510         netdev_hw_addr_list_for_each(ha, mc_list) {
1511                 bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
1512 
1513                 mc_filter |= 1ULL << (bit_nr & 0x3f);
1514         }
1515 
1516         priv->mc_list_count = mc_list->count;
1517 
1518         return mc_filter;
1519 }
1520 
1521 static void vnt_configure(struct ieee80211_hw *hw,
1522         unsigned int changed_flags, unsigned int *total_flags, u64 multicast)
1523 {
1524         struct vnt_private *priv = hw->priv;
1525         u8 rx_mode = 0;
1526 
1527         *total_flags &= FIF_ALLMULTI | FIF_OTHER_BSS | FIF_PROMISC_IN_BSS |
1528                 FIF_BCN_PRBRESP_PROMISC;
1529 
1530         VNSvInPortB(priv->PortOffset + MAC_REG_RCR, &rx_mode);
1531 
1532         dev_dbg(&priv->pcid->dev, "rx mode in = %x\n", rx_mode);
1533 
1534         if (changed_flags & FIF_PROMISC_IN_BSS) {
1535                 /* unconditionally log net taps */
1536                 if (*total_flags & FIF_PROMISC_IN_BSS)
1537                         rx_mode |= RCR_UNICAST;
1538                 else
1539                         rx_mode &= ~RCR_UNICAST;
1540         }
1541 
1542         if (changed_flags & FIF_ALLMULTI) {
1543                 if (*total_flags & FIF_ALLMULTI) {
1544                         unsigned long flags;
1545 
1546                         spin_lock_irqsave(&priv->lock, flags);
1547 
1548                         if (priv->mc_list_count > 2) {
1549                                 MACvSelectPage1(priv->PortOffset);
1550 
1551                                 VNSvOutPortD(priv->PortOffset +
1552                                              MAC_REG_MAR0, 0xffffffff);
1553                                 VNSvOutPortD(priv->PortOffset +
1554                                             MAC_REG_MAR0 + 4, 0xffffffff);
1555 
1556                                 MACvSelectPage0(priv->PortOffset);
1557                         } else {
1558                                 MACvSelectPage1(priv->PortOffset);
1559 
1560                                 VNSvOutPortD(priv->PortOffset +
1561                                              MAC_REG_MAR0, (u32)multicast);
1562                                 VNSvOutPortD(priv->PortOffset +
1563                                              MAC_REG_MAR0 + 4,
1564                                              (u32)(multicast >> 32));
1565 
1566                                 MACvSelectPage0(priv->PortOffset);
1567                         }
1568 
1569                         spin_unlock_irqrestore(&priv->lock, flags);
1570 
1571                         rx_mode |= RCR_MULTICAST | RCR_BROADCAST;
1572                 } else {
1573                         rx_mode &= ~(RCR_MULTICAST | RCR_BROADCAST);
1574                 }
1575         }
1576 
1577         if (changed_flags & (FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC)) {
1578                 rx_mode |= RCR_MULTICAST | RCR_BROADCAST;
1579 
1580                 if (*total_flags & (FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC))
1581                         rx_mode &= ~RCR_BSSID;
1582                 else
1583                         rx_mode |= RCR_BSSID;
1584         }
1585 
1586         VNSvOutPortB(priv->PortOffset + MAC_REG_RCR, rx_mode);
1587 
1588         dev_dbg(&priv->pcid->dev, "rx mode out= %x\n", rx_mode);
1589 }
1590 
1591 static int vnt_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1592         struct ieee80211_vif *vif, struct ieee80211_sta *sta,
1593                 struct ieee80211_key_conf *key)
1594 {
1595         struct vnt_private *priv = hw->priv;
1596 
1597         switch (cmd) {
1598         case SET_KEY:
1599                 if (vnt_set_keys(hw, sta, vif, key))
1600                         return -EOPNOTSUPP;
1601                 break;
1602         case DISABLE_KEY:
1603                 if (test_bit(key->hw_key_idx, &priv->key_entry_inuse))
1604                         clear_bit(key->hw_key_idx, &priv->key_entry_inuse);
1605         default:
1606                 break;
1607         }
1608 
1609         return 0;
1610 }
1611 
1612 static u64 vnt_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1613 {
1614         struct vnt_private *priv = hw->priv;
1615         u64 tsf;
1616 
1617         CARDbGetCurrentTSF(priv, &tsf);
1618 
1619         return tsf;
1620 }
1621 
1622 static void vnt_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1623                         u64 tsf)
1624 {
1625         struct vnt_private *priv = hw->priv;
1626 
1627         CARDvUpdateNextTBTT(priv, tsf, vif->bss_conf.beacon_int);
1628 }
1629 
1630 static void vnt_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1631 {
1632         struct vnt_private *priv = hw->priv;
1633 
1634         /* reset TSF counter */
1635         VNSvOutPortB(priv->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
1636 }
1637 
1638 static const struct ieee80211_ops vnt_mac_ops = {
1639         .tx                     = vnt_tx_80211,
1640         .start                  = vnt_start,
1641         .stop                   = vnt_stop,
1642         .add_interface          = vnt_add_interface,
1643         .remove_interface       = vnt_remove_interface,
1644         .config                 = vnt_config,
1645         .bss_info_changed       = vnt_bss_info_changed,
1646         .prepare_multicast      = vnt_prepare_multicast,
1647         .configure_filter       = vnt_configure,
1648         .set_key                = vnt_set_key,
1649         .get_tsf                = vnt_get_tsf,
1650         .set_tsf                = vnt_set_tsf,
1651         .reset_tsf              = vnt_reset_tsf,
1652 };
1653 
1654 static int vnt_init(struct vnt_private *priv)
1655 {
1656         SET_IEEE80211_PERM_ADDR(priv->hw, priv->abyCurrentNetAddr);
1657 
1658         vnt_init_bands(priv);
1659 
1660         if (ieee80211_register_hw(priv->hw))
1661                 return -ENODEV;
1662 
1663         priv->mac_hw = true;
1664 
1665         CARDbRadioPowerOff(priv);
1666 
1667         return 0;
1668 }
1669 
1670 static int
1671 vt6655_probe(struct pci_dev *pcid, const struct pci_device_id *ent)
1672 {
1673         PCHIP_INFO  pChip_info = (PCHIP_INFO)ent->driver_data;
1674         struct vnt_private *priv;
1675         struct ieee80211_hw *hw;
1676         struct wiphy *wiphy;
1677         int         rc;
1678 
1679         dev_notice(&pcid->dev,
1680                    "%s Ver. %s\n", DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
1681 
1682         dev_notice(&pcid->dev,
1683                    "Copyright (c) 2003 VIA Networking Technologies, Inc.\n");
1684 
1685         hw = ieee80211_alloc_hw(sizeof(*priv), &vnt_mac_ops);
1686         if (!hw) {
1687                 dev_err(&pcid->dev, "could not register ieee80211_hw\n");
1688                 return -ENOMEM;
1689         }
1690 
1691         priv = hw->priv;
1692 
1693         vt6655_init_info(pcid, &priv, pChip_info);
1694 
1695         priv->hw = hw;
1696 
1697         SET_IEEE80211_DEV(priv->hw, &pcid->dev);
1698 
1699         if (pci_enable_device(pcid)) {
1700                 device_free_info(priv);
1701                 return -ENODEV;
1702         }
1703 
1704         dev_dbg(&pcid->dev,
1705                 "Before get pci_info memaddr is %x\n", priv->memaddr);
1706 
1707         if (!device_get_pci_info(priv, pcid)) {
1708                 dev_err(&pcid->dev, ": Failed to find PCI device.\n");
1709                 device_free_info(priv);
1710                 return -ENODEV;
1711         }
1712 
1713 #ifdef  DEBUG
1714         dev_dbg(&pcid->dev,
1715                 "after get pci_info memaddr is %x, io addr is %x,io_size is %d\n",
1716                 priv->memaddr, priv->ioaddr, priv->io_size);
1717         {
1718                 int i;
1719                 u32 bar, len;
1720                 u32 address[] = {
1721                         PCI_BASE_ADDRESS_0,
1722                         PCI_BASE_ADDRESS_1,
1723                         PCI_BASE_ADDRESS_2,
1724                         PCI_BASE_ADDRESS_3,
1725                         PCI_BASE_ADDRESS_4,
1726                         PCI_BASE_ADDRESS_5,
1727                         0};
1728                 for (i = 0; address[i]; i++) {
1729                         pci_read_config_dword(pcid, address[i], &bar);
1730 
1731                         dev_dbg(&pcid->dev, "bar %d is %x\n", i, bar);
1732 
1733                         if (!bar) {
1734                                 dev_dbg(&pcid->dev,
1735                                         "bar %d not implemented\n", i);
1736                                 continue;
1737                         }
1738 
1739                         if (bar & PCI_BASE_ADDRESS_SPACE_IO) {
1740                                 /* This is IO */
1741 
1742                                 len = bar & (PCI_BASE_ADDRESS_IO_MASK & 0xffff);
1743                                 len = len & ~(len - 1);
1744 
1745                                 dev_dbg(&pcid->dev,
1746                                         "IO space:  len in IO %x, BAR %d\n",
1747                                         len, i);
1748                         } else {
1749                                 len = bar & 0xfffffff0;
1750                                 len = ~len + 1;
1751 
1752                                 dev_dbg(&pcid->dev,
1753                                         "len in MEM %x, BAR %d\n", len, i);
1754                         }
1755                 }
1756         }
1757 #endif
1758 
1759         priv->PortOffset = ioremap(priv->memaddr & PCI_BASE_ADDRESS_MEM_MASK,
1760                                    priv->io_size);
1761         if (!priv->PortOffset) {
1762                 dev_err(&pcid->dev, ": Failed to IO remapping ..\n");
1763                 device_free_info(priv);
1764                 return -ENODEV;
1765         }
1766 
1767         rc = pci_request_regions(pcid, DEVICE_NAME);
1768         if (rc) {
1769                 dev_err(&pcid->dev, ": Failed to find PCI device\n");
1770                 device_free_info(priv);
1771                 return -ENODEV;
1772         }
1773 
1774         /* do reset */
1775         if (!MACbSoftwareReset(priv->PortOffset)) {
1776                 dev_err(&pcid->dev, ": Failed to access MAC hardware..\n");
1777                 device_free_info(priv);
1778                 return -ENODEV;
1779         }
1780         /* initial to reload eeprom */
1781         MACvInitialize(priv->PortOffset);
1782         MACvReadEtherAddress(priv->PortOffset, priv->abyCurrentNetAddr);
1783 
1784         /* Get RFType */
1785         priv->byRFType = SROMbyReadEmbedded(priv->PortOffset, EEP_OFS_RFTYPE);
1786         priv->byRFType &= RF_MASK;
1787 
1788         dev_dbg(&pcid->dev, "RF Type = %x\n", priv->byRFType);
1789 
1790         device_get_options(priv);
1791         device_set_options(priv);
1792         /* Mask out the options cannot be set to the chip */
1793         priv->sOpts.flags &= pChip_info->flags;
1794 
1795         /* Enable the chip specified capabilities */
1796         priv->flags = priv->sOpts.flags | (pChip_info->flags & 0xff000000UL);
1797 
1798         wiphy = priv->hw->wiphy;
1799 
1800         wiphy->frag_threshold = FRAG_THRESH_DEF;
1801         wiphy->rts_threshold = RTS_THRESH_DEF;
1802         wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
1803                 BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP);
1804 
1805         priv->hw->flags = IEEE80211_HW_RX_INCLUDES_FCS |
1806                 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
1807                 IEEE80211_HW_SIGNAL_DBM |
1808                 IEEE80211_HW_TIMING_BEACON_ONLY;
1809 
1810         priv->hw->max_signal = 100;
1811 
1812         if (vnt_init(priv))
1813                 return -ENODEV;
1814 
1815         device_print_info(priv);
1816         pci_set_drvdata(pcid, priv);
1817 
1818         return 0;
1819 }
1820 
1821 /*------------------------------------------------------------------*/
1822 
1823 #ifdef CONFIG_PM
1824 static int vt6655_suspend(struct pci_dev *pcid, pm_message_t state)
1825 {
1826         struct vnt_private *priv = pci_get_drvdata(pcid);
1827         unsigned long flags;
1828 
1829         spin_lock_irqsave(&priv->lock, flags);
1830 
1831         pci_save_state(pcid);
1832 
1833         MACbShutdown(priv->PortOffset);
1834 
1835         pci_disable_device(pcid);
1836         pci_set_power_state(pcid, pci_choose_state(pcid, state));
1837 
1838         spin_unlock_irqrestore(&priv->lock, flags);
1839 
1840         return 0;
1841 }
1842 
1843 static int vt6655_resume(struct pci_dev *pcid)
1844 {
1845 
1846         pci_set_power_state(pcid, PCI_D0);
1847         pci_enable_wake(pcid, PCI_D0, 0);
1848         pci_restore_state(pcid);
1849 
1850         return 0;
1851 }
1852 #endif
1853 
1854 MODULE_DEVICE_TABLE(pci, vt6655_pci_id_table);
1855 
1856 static struct pci_driver device_driver = {
1857         .name = DEVICE_NAME,
1858         .id_table = vt6655_pci_id_table,
1859         .probe = vt6655_probe,
1860         .remove = vt6655_remove,
1861 #ifdef CONFIG_PM
1862         .suspend = vt6655_suspend,
1863         .resume = vt6655_resume,
1864 #endif
1865 };
1866 
1867 static int __init vt6655_init_module(void)
1868 {
1869         int ret;
1870 
1871         ret = pci_register_driver(&device_driver);
1872 #ifdef CONFIG_PM
1873         if (ret >= 0)
1874                 register_reboot_notifier(&device_notifier);
1875 #endif
1876 
1877         return ret;
1878 }
1879 
1880 static void __exit vt6655_cleanup_module(void)
1881 {
1882 #ifdef CONFIG_PM
1883         unregister_reboot_notifier(&device_notifier);
1884 #endif
1885         pci_unregister_driver(&device_driver);
1886 }
1887 
1888 module_init(vt6655_init_module);
1889 module_exit(vt6655_cleanup_module);
1890 
1891 #ifdef CONFIG_PM
1892 static int
1893 device_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
1894 {
1895         struct pci_dev *pdev = NULL;
1896 
1897         switch (event) {
1898         case SYS_DOWN:
1899         case SYS_HALT:
1900         case SYS_POWER_OFF:
1901                 for_each_pci_dev(pdev) {
1902                         if (pci_dev_driver(pdev) == &device_driver) {
1903                                 if (pci_get_drvdata(pdev))
1904                                         vt6655_suspend(pdev, PMSG_HIBERNATE);
1905                         }
1906                 }
1907         }
1908         return NOTIFY_DONE;
1909 }
1910 #endif
1911 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us