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