Version:  2.0.40 2.2.26 2.4.37 3.3 3.4 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

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

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