OSDN Git Service

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