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
vt6655_remove(struct pci_dev * pcid)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
device_get_options(struct vnt_private * priv)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
device_set_options(struct vnt_private * priv)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
device_init_registers(struct vnt_private * priv)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->PortOffset);
215 BBvSoftwareReset(priv);
216
217 /* Do MACbSoftwareReset in MACvInitialize */
218 MACbSoftwareReset(priv->PortOffset);
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->PortOffset);
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->PortOffset, priv->byShortRetryLimit);
361 MACvSetLongRetryLimit(priv->PortOffset, 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
device_print_info(struct vnt_private * priv)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
device_free_info(struct vnt_private * priv)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
device_init_rings(struct vnt_private * priv)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 == NULL) {
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
device_free_rings(struct vnt_private * priv)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
device_init_rd0_ring(struct vnt_private * priv)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
device_init_rd1_ring(struct vnt_private * priv)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
device_free_rd0_ring(struct vnt_private * priv)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
device_free_rd1_ring(struct vnt_private * priv)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
device_init_td0_ring(struct vnt_private * priv)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
device_init_td1_ring(struct vnt_private * priv)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
device_free_td0_ring(struct vnt_private * priv)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
device_free_td1_ring(struct vnt_private * priv)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
device_rx_srv(struct vnt_private * priv,unsigned int idx)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
device_alloc_rx_buf(struct vnt_private * priv,struct vnt_rx_desc * rd)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 == NULL)
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
746 *((unsigned int *)&rd->rd0) = 0; /* FIX cast */
747
748 rd->rd0.res_count = cpu_to_le16(priv->rx_buf_sz);
749 rd->rd0.owner = OWNED_BY_NIC;
750 rd->rd1.req_count = cpu_to_le16(priv->rx_buf_sz);
751 rd->buff_addr = cpu_to_le32(rd_info->skb_dma);
752
753 return true;
754 }
755
756 static const u8 fallback_rate0[5][5] = {
757 {RATE_18M, RATE_18M, RATE_12M, RATE_12M, RATE_12M},
758 {RATE_24M, RATE_24M, RATE_18M, RATE_12M, RATE_12M},
759 {RATE_36M, RATE_36M, RATE_24M, RATE_18M, RATE_18M},
760 {RATE_48M, RATE_48M, RATE_36M, RATE_24M, RATE_24M},
761 {RATE_54M, RATE_54M, RATE_48M, RATE_36M, RATE_36M}
762 };
763
764 static const u8 fallback_rate1[5][5] = {
765 {RATE_18M, RATE_18M, RATE_12M, RATE_6M, RATE_6M},
766 {RATE_24M, RATE_24M, RATE_18M, RATE_6M, RATE_6M},
767 {RATE_36M, RATE_36M, RATE_24M, RATE_12M, RATE_12M},
768 {RATE_48M, RATE_48M, RATE_24M, RATE_12M, RATE_12M},
769 {RATE_54M, RATE_54M, RATE_36M, RATE_18M, RATE_18M}
770 };
771
vnt_int_report_rate(struct vnt_private * priv,struct vnt_td_info * context,u8 tsr0,u8 tsr1)772 static int vnt_int_report_rate(struct vnt_private *priv,
773 struct vnt_td_info *context, u8 tsr0, u8 tsr1)
774 {
775 struct vnt_tx_fifo_head *fifo_head;
776 struct ieee80211_tx_info *info;
777 struct ieee80211_rate *rate;
778 u16 fb_option;
779 u8 tx_retry = (tsr0 & TSR0_NCR);
780 s8 idx;
781
782 if (!context)
783 return -ENOMEM;
784
785 if (!context->skb)
786 return -EINVAL;
787
788 fifo_head = (struct vnt_tx_fifo_head *)context->buf;
789 fb_option = (le16_to_cpu(fifo_head->fifo_ctl) &
790 (FIFOCTL_AUTO_FB_0 | FIFOCTL_AUTO_FB_1));
791
792 info = IEEE80211_SKB_CB(context->skb);
793 idx = info->control.rates[0].idx;
794
795 if (fb_option && !(tsr1 & TSR1_TERR)) {
796 u8 tx_rate;
797 u8 retry = tx_retry;
798
799 rate = ieee80211_get_tx_rate(priv->hw, info);
800 tx_rate = rate->hw_value - RATE_18M;
801
802 if (retry > 4)
803 retry = 4;
804
805 if (fb_option & FIFOCTL_AUTO_FB_0)
806 tx_rate = fallback_rate0[tx_rate][retry];
807 else if (fb_option & FIFOCTL_AUTO_FB_1)
808 tx_rate = fallback_rate1[tx_rate][retry];
809
810 if (info->band == IEEE80211_BAND_5GHZ)
811 idx = tx_rate - RATE_6M;
812 else
813 idx = tx_rate;
814 }
815
816 ieee80211_tx_info_clear_status(info);
817
818 info->status.rates[0].count = tx_retry;
819
820 if (!(tsr1 & TSR1_TERR)) {
821 info->status.rates[0].idx = idx;
822
823 if (info->flags & IEEE80211_TX_CTL_NO_ACK)
824 info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
825 else
826 info->flags |= IEEE80211_TX_STAT_ACK;
827 }
828
829 return 0;
830 }
831
device_tx_srv(struct vnt_private * priv,unsigned int idx)832 static int device_tx_srv(struct vnt_private *priv, unsigned int idx)
833 {
834 struct vnt_tx_desc *desc;
835 int works = 0;
836 unsigned char byTsr0;
837 unsigned char byTsr1;
838
839 for (desc = priv->apTailTD[idx]; priv->iTDUsed[idx] > 0; desc = desc->next) {
840 if (desc->td0.owner == OWNED_BY_NIC)
841 break;
842 if (works++ > 15)
843 break;
844
845 byTsr0 = desc->td0.tsr0;
846 byTsr1 = desc->td0.tsr1;
847
848 /* Only the status of first TD in the chain is correct */
849 if (desc->td1.tcr & TCR_STP) {
850 if ((desc->td_info->flags & TD_FLAGS_NETIF_SKB) != 0) {
851 if (!(byTsr1 & TSR1_TERR)) {
852 if (byTsr0 != 0) {
853 pr_debug(" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X]\n",
854 (int)idx, byTsr1,
855 byTsr0);
856 }
857 } else {
858 pr_debug(" Tx[%d] dropped & tsr1[%02X] tsr0[%02X]\n",
859 (int)idx, byTsr1, byTsr0);
860 }
861 }
862
863 if (byTsr1 & TSR1_TERR) {
864 if ((desc->td_info->flags & TD_FLAGS_PRIV_SKB) != 0) {
865 pr_debug(" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X]\n",
866 (int)idx, byTsr1, byTsr0);
867 }
868 }
869
870 vnt_int_report_rate(priv, desc->td_info, byTsr0, byTsr1);
871
872 device_free_tx_buf(priv, desc);
873 priv->iTDUsed[idx]--;
874 }
875 }
876
877 priv->apTailTD[idx] = desc;
878
879 return works;
880 }
881
device_error(struct vnt_private * priv,unsigned short status)882 static void device_error(struct vnt_private *priv, unsigned short status)
883 {
884 if (status & ISR_FETALERR) {
885 dev_err(&priv->pcid->dev, "Hardware fatal error\n");
886
887 MACbShutdown(priv->PortOffset);
888 return;
889 }
890 }
891
device_free_tx_buf(struct vnt_private * priv,struct vnt_tx_desc * desc)892 static void device_free_tx_buf(struct vnt_private *priv,
893 struct vnt_tx_desc *desc)
894 {
895 struct vnt_td_info *td_info = desc->td_info;
896 struct sk_buff *skb = td_info->skb;
897
898 if (skb)
899 ieee80211_tx_status_irqsafe(priv->hw, skb);
900
901 td_info->skb = NULL;
902 td_info->flags = 0;
903 }
904
vnt_check_bb_vga(struct vnt_private * priv)905 static void vnt_check_bb_vga(struct vnt_private *priv)
906 {
907 long dbm;
908 int i;
909
910 if (!priv->bUpdateBBVGA)
911 return;
912
913 if (priv->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
914 return;
915
916 if (!(priv->vif->bss_conf.assoc && priv->uCurrRSSI))
917 return;
918
919 RFvRSSITodBm(priv, (u8)priv->uCurrRSSI, &dbm);
920
921 for (i = 0; i < BB_VGA_LEVEL; i++) {
922 if (dbm < priv->ldBmThreshold[i]) {
923 priv->byBBVGANew = priv->abyBBVGA[i];
924 break;
925 }
926 }
927
928 if (priv->byBBVGANew == priv->byBBVGACurrent) {
929 priv->uBBVGADiffCount = 1;
930 return;
931 }
932
933 priv->uBBVGADiffCount++;
934
935 if (priv->uBBVGADiffCount == 1) {
936 /* first VGA diff gain */
937 BBvSetVGAGainOffset(priv, priv->byBBVGANew);
938
939 dev_dbg(&priv->pcid->dev,
940 "First RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
941 (int)dbm, priv->byBBVGANew,
942 priv->byBBVGACurrent,
943 (int)priv->uBBVGADiffCount);
944 }
945
946 if (priv->uBBVGADiffCount >= BB_VGA_CHANGE_THRESHOLD) {
947 dev_dbg(&priv->pcid->dev,
948 "RSSI[%d] NewGain[%d] OldGain[%d] Count[%d]\n",
949 (int)dbm, priv->byBBVGANew,
950 priv->byBBVGACurrent,
951 (int)priv->uBBVGADiffCount);
952
953 BBvSetVGAGainOffset(priv, priv->byBBVGANew);
954 }
955 }
956
vnt_interrupt_process(struct vnt_private * priv)957 static void vnt_interrupt_process(struct vnt_private *priv)
958 {
959 struct ieee80211_low_level_stats *low_stats = &priv->low_stats;
960 int max_count = 0;
961 u32 mib_counter;
962 u32 isr;
963 unsigned long flags;
964
965 MACvReadISR(priv->PortOffset, &isr);
966
967 if (isr == 0)
968 return;
969
970 if (isr == 0xffffffff) {
971 pr_debug("isr = 0xffff\n");
972 return;
973 }
974
975 spin_lock_irqsave(&priv->lock, flags);
976
977 /* Read low level stats */
978 MACvReadMIBCounter(priv->PortOffset, &mib_counter);
979
980 low_stats->dot11RTSSuccessCount += mib_counter & 0xff;
981 low_stats->dot11RTSFailureCount += (mib_counter >> 8) & 0xff;
982 low_stats->dot11ACKFailureCount += (mib_counter >> 16) & 0xff;
983 low_stats->dot11FCSErrorCount += (mib_counter >> 24) & 0xff;
984
985 /*
986 * TBD....
987 * Must do this after doing rx/tx, cause ISR bit is slow
988 * than RD/TD write back
989 * update ISR counter
990 */
991 while (isr && priv->vif) {
992 MACvWriteISR(priv->PortOffset, isr);
993
994 if (isr & ISR_FETALERR) {
995 pr_debug(" ISR_FETALERR\n");
996 VNSvOutPortB(priv->PortOffset + MAC_REG_SOFTPWRCTL, 0);
997 VNSvOutPortW(priv->PortOffset +
998 MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPECTI);
999 device_error(priv, isr);
1000 }
1001
1002 if (isr & ISR_TBTT) {
1003 if (priv->op_mode != NL80211_IFTYPE_ADHOC)
1004 vnt_check_bb_vga(priv);
1005
1006 priv->bBeaconSent = false;
1007 if (priv->bEnablePSMode)
1008 PSbIsNextTBTTWakeUp((void *)priv);
1009
1010 if ((priv->op_mode == NL80211_IFTYPE_AP ||
1011 priv->op_mode == NL80211_IFTYPE_ADHOC) &&
1012 priv->vif->bss_conf.enable_beacon) {
1013 MACvOneShotTimer1MicroSec(priv->PortOffset,
1014 (priv->vif->bss_conf.beacon_int - MAKE_BEACON_RESERVED) << 10);
1015 }
1016
1017 /* TODO: adhoc PS mode */
1018
1019 }
1020
1021 if (isr & ISR_BNTX) {
1022 if (priv->op_mode == NL80211_IFTYPE_ADHOC) {
1023 priv->bIsBeaconBufReadySet = false;
1024 priv->cbBeaconBufReadySetCnt = 0;
1025 }
1026
1027 priv->bBeaconSent = true;
1028 }
1029
1030 if (isr & ISR_RXDMA0)
1031 max_count += device_rx_srv(priv, TYPE_RXDMA0);
1032
1033 if (isr & ISR_RXDMA1)
1034 max_count += device_rx_srv(priv, TYPE_RXDMA1);
1035
1036 if (isr & ISR_TXDMA0)
1037 max_count += device_tx_srv(priv, TYPE_TXDMA0);
1038
1039 if (isr & ISR_AC0DMA)
1040 max_count += device_tx_srv(priv, TYPE_AC0DMA);
1041
1042 if (isr & ISR_SOFTTIMER1) {
1043 if (priv->vif->bss_conf.enable_beacon)
1044 vnt_beacon_make(priv, priv->vif);
1045 }
1046
1047 /* If both buffers available wake the queue */
1048 if (AVAIL_TD(priv, TYPE_TXDMA0) &&
1049 AVAIL_TD(priv, TYPE_AC0DMA) &&
1050 ieee80211_queue_stopped(priv->hw, 0))
1051 ieee80211_wake_queues(priv->hw);
1052
1053 MACvReadISR(priv->PortOffset, &isr);
1054
1055 MACvReceive0(priv->PortOffset);
1056 MACvReceive1(priv->PortOffset);
1057
1058 if (max_count > priv->opts.int_works)
1059 break;
1060 }
1061
1062 spin_unlock_irqrestore(&priv->lock, flags);
1063 }
1064
vnt_interrupt_work(struct work_struct * work)1065 static void vnt_interrupt_work(struct work_struct *work)
1066 {
1067 struct vnt_private *priv =
1068 container_of(work, struct vnt_private, interrupt_work);
1069
1070 if (priv->vif)
1071 vnt_interrupt_process(priv);
1072
1073 MACvIntEnable(priv->PortOffset, IMR_MASK_VALUE);
1074 }
1075
vnt_interrupt(int irq,void * arg)1076 static irqreturn_t vnt_interrupt(int irq, void *arg)
1077 {
1078 struct vnt_private *priv = arg;
1079
1080 schedule_work(&priv->interrupt_work);
1081
1082 MACvIntDisable(priv->PortOffset);
1083
1084 return IRQ_HANDLED;
1085 }
1086
vnt_tx_packet(struct vnt_private * priv,struct sk_buff * skb)1087 static int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb)
1088 {
1089 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1090 struct vnt_tx_desc *head_td;
1091 u32 dma_idx;
1092 unsigned long flags;
1093
1094 spin_lock_irqsave(&priv->lock, flags);
1095
1096 if (ieee80211_is_data(hdr->frame_control))
1097 dma_idx = TYPE_AC0DMA;
1098 else
1099 dma_idx = TYPE_TXDMA0;
1100
1101 if (AVAIL_TD(priv, dma_idx) < 1) {
1102 spin_unlock_irqrestore(&priv->lock, flags);
1103 ieee80211_stop_queues(priv->hw);
1104 return -ENOMEM;
1105 }
1106
1107 head_td = priv->apCurrTD[dma_idx];
1108
1109 head_td->td1.tcr = 0;
1110
1111 head_td->td_info->skb = skb;
1112
1113 if (dma_idx == TYPE_AC0DMA)
1114 head_td->td_info->flags = TD_FLAGS_NETIF_SKB;
1115
1116 priv->apCurrTD[dma_idx] = head_td->next;
1117
1118 spin_unlock_irqrestore(&priv->lock, flags);
1119
1120 vnt_generate_fifo_header(priv, dma_idx, head_td, skb);
1121
1122 spin_lock_irqsave(&priv->lock, flags);
1123
1124 priv->bPWBitOn = false;
1125
1126 /* Set TSR1 & ReqCount in TxDescHead */
1127 head_td->td1.tcr |= (TCR_STP | TCR_EDP | EDMSDU);
1128 head_td->td1.req_count = cpu_to_le16(head_td->td_info->req_count);
1129
1130 head_td->buff_addr = cpu_to_le32(head_td->td_info->buf_dma);
1131
1132 /* Poll Transmit the adapter */
1133 wmb();
1134 head_td->td0.owner = OWNED_BY_NIC;
1135 wmb(); /* second memory barrier */
1136
1137 if (head_td->td_info->flags & TD_FLAGS_NETIF_SKB)
1138 MACvTransmitAC0(priv->PortOffset);
1139 else
1140 MACvTransmit0(priv->PortOffset);
1141
1142 priv->iTDUsed[dma_idx]++;
1143
1144 spin_unlock_irqrestore(&priv->lock, flags);
1145
1146 return 0;
1147 }
1148
vnt_tx_80211(struct ieee80211_hw * hw,struct ieee80211_tx_control * control,struct sk_buff * skb)1149 static void vnt_tx_80211(struct ieee80211_hw *hw,
1150 struct ieee80211_tx_control *control,
1151 struct sk_buff *skb)
1152 {
1153 struct vnt_private *priv = hw->priv;
1154
1155 if (vnt_tx_packet(priv, skb))
1156 ieee80211_free_txskb(hw, skb);
1157 }
1158
vnt_start(struct ieee80211_hw * hw)1159 static int vnt_start(struct ieee80211_hw *hw)
1160 {
1161 struct vnt_private *priv = hw->priv;
1162 int ret;
1163
1164 priv->rx_buf_sz = PKT_BUF_SZ;
1165 if (!device_init_rings(priv))
1166 return -ENOMEM;
1167
1168 ret = request_irq(priv->pcid->irq, &vnt_interrupt,
1169 IRQF_SHARED, "vt6655", priv);
1170 if (ret) {
1171 dev_dbg(&priv->pcid->dev, "failed to start irq\n");
1172 return ret;
1173 }
1174
1175 dev_dbg(&priv->pcid->dev, "call device init rd0 ring\n");
1176 device_init_rd0_ring(priv);
1177 device_init_rd1_ring(priv);
1178 device_init_td0_ring(priv);
1179 device_init_td1_ring(priv);
1180
1181 device_init_registers(priv);
1182
1183 dev_dbg(&priv->pcid->dev, "call MACvIntEnable\n");
1184 MACvIntEnable(priv->PortOffset, IMR_MASK_VALUE);
1185
1186 ieee80211_wake_queues(hw);
1187
1188 return 0;
1189 }
1190
vnt_stop(struct ieee80211_hw * hw)1191 static void vnt_stop(struct ieee80211_hw *hw)
1192 {
1193 struct vnt_private *priv = hw->priv;
1194
1195 ieee80211_stop_queues(hw);
1196
1197 cancel_work_sync(&priv->interrupt_work);
1198
1199 MACbShutdown(priv->PortOffset);
1200 MACbSoftwareReset(priv->PortOffset);
1201 CARDbRadioPowerOff(priv);
1202
1203 device_free_td0_ring(priv);
1204 device_free_td1_ring(priv);
1205 device_free_rd0_ring(priv);
1206 device_free_rd1_ring(priv);
1207 device_free_rings(priv);
1208
1209 free_irq(priv->pcid->irq, priv);
1210 }
1211
vnt_add_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)1212 static int vnt_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1213 {
1214 struct vnt_private *priv = hw->priv;
1215
1216 priv->vif = vif;
1217
1218 switch (vif->type) {
1219 case NL80211_IFTYPE_STATION:
1220 break;
1221 case NL80211_IFTYPE_ADHOC:
1222 MACvRegBitsOff(priv->PortOffset, MAC_REG_RCR, RCR_UNICAST);
1223
1224 MACvRegBitsOn(priv->PortOffset, MAC_REG_HOSTCR, HOSTCR_ADHOC);
1225
1226 break;
1227 case NL80211_IFTYPE_AP:
1228 MACvRegBitsOff(priv->PortOffset, MAC_REG_RCR, RCR_UNICAST);
1229
1230 MACvRegBitsOn(priv->PortOffset, MAC_REG_HOSTCR, HOSTCR_AP);
1231
1232 break;
1233 default:
1234 return -EOPNOTSUPP;
1235 }
1236
1237 priv->op_mode = vif->type;
1238
1239 return 0;
1240 }
1241
vnt_remove_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)1242 static void vnt_remove_interface(struct ieee80211_hw *hw,
1243 struct ieee80211_vif *vif)
1244 {
1245 struct vnt_private *priv = hw->priv;
1246
1247 switch (vif->type) {
1248 case NL80211_IFTYPE_STATION:
1249 break;
1250 case NL80211_IFTYPE_ADHOC:
1251 MACvRegBitsOff(priv->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
1252 MACvRegBitsOff(priv->PortOffset,
1253 MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
1254 MACvRegBitsOff(priv->PortOffset, MAC_REG_HOSTCR, HOSTCR_ADHOC);
1255 break;
1256 case NL80211_IFTYPE_AP:
1257 MACvRegBitsOff(priv->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
1258 MACvRegBitsOff(priv->PortOffset,
1259 MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
1260 MACvRegBitsOff(priv->PortOffset, MAC_REG_HOSTCR, HOSTCR_AP);
1261 break;
1262 default:
1263 break;
1264 }
1265
1266 priv->op_mode = NL80211_IFTYPE_UNSPECIFIED;
1267 }
1268
1269
vnt_config(struct ieee80211_hw * hw,u32 changed)1270 static int vnt_config(struct ieee80211_hw *hw, u32 changed)
1271 {
1272 struct vnt_private *priv = hw->priv;
1273 struct ieee80211_conf *conf = &hw->conf;
1274 u8 bb_type;
1275
1276 if (changed & IEEE80211_CONF_CHANGE_PS) {
1277 if (conf->flags & IEEE80211_CONF_PS)
1278 PSvEnablePowerSaving(priv, conf->listen_interval);
1279 else
1280 PSvDisablePowerSaving(priv);
1281 }
1282
1283 if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) ||
1284 (conf->flags & IEEE80211_CONF_OFFCHANNEL)) {
1285 set_channel(priv, conf->chandef.chan);
1286
1287 if (conf->chandef.chan->band == IEEE80211_BAND_5GHZ)
1288 bb_type = BB_TYPE_11A;
1289 else
1290 bb_type = BB_TYPE_11G;
1291
1292 if (priv->byBBType != bb_type) {
1293 priv->byBBType = bb_type;
1294
1295 CARDbSetPhyParameter(priv, priv->byBBType);
1296 }
1297 }
1298
1299 if (changed & IEEE80211_CONF_CHANGE_POWER) {
1300 if (priv->byBBType == BB_TYPE_11B)
1301 priv->wCurrentRate = RATE_1M;
1302 else
1303 priv->wCurrentRate = RATE_54M;
1304
1305 RFbSetPower(priv, priv->wCurrentRate,
1306 conf->chandef.chan->hw_value);
1307 }
1308
1309 return 0;
1310 }
1311
vnt_bss_info_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * conf,u32 changed)1312 static void vnt_bss_info_changed(struct ieee80211_hw *hw,
1313 struct ieee80211_vif *vif, struct ieee80211_bss_conf *conf,
1314 u32 changed)
1315 {
1316 struct vnt_private *priv = hw->priv;
1317
1318 priv->current_aid = conf->aid;
1319
1320 if (changed & BSS_CHANGED_BSSID && conf->bssid) {
1321 unsigned long flags;
1322
1323 spin_lock_irqsave(&priv->lock, flags);
1324
1325 MACvWriteBSSIDAddress(priv->PortOffset, (u8 *)conf->bssid);
1326
1327 spin_unlock_irqrestore(&priv->lock, flags);
1328 }
1329
1330 if (changed & BSS_CHANGED_BASIC_RATES) {
1331 priv->basic_rates = conf->basic_rates;
1332
1333 CARDvUpdateBasicTopRate(priv);
1334
1335 dev_dbg(&priv->pcid->dev,
1336 "basic rates %x\n", conf->basic_rates);
1337 }
1338
1339 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
1340 if (conf->use_short_preamble) {
1341 MACvEnableBarkerPreambleMd(priv->PortOffset);
1342 priv->byPreambleType = true;
1343 } else {
1344 MACvDisableBarkerPreambleMd(priv->PortOffset);
1345 priv->byPreambleType = false;
1346 }
1347 }
1348
1349 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
1350 if (conf->use_cts_prot)
1351 MACvEnableProtectMD(priv->PortOffset);
1352 else
1353 MACvDisableProtectMD(priv->PortOffset);
1354 }
1355
1356 if (changed & BSS_CHANGED_ERP_SLOT) {
1357 if (conf->use_short_slot)
1358 priv->bShortSlotTime = true;
1359 else
1360 priv->bShortSlotTime = false;
1361
1362 CARDbSetPhyParameter(priv, priv->byBBType);
1363 BBvSetVGAGainOffset(priv, priv->abyBBVGA[0]);
1364 }
1365
1366 if (changed & BSS_CHANGED_TXPOWER)
1367 RFbSetPower(priv, priv->wCurrentRate,
1368 conf->chandef.chan->hw_value);
1369
1370 if (changed & BSS_CHANGED_BEACON_ENABLED) {
1371 dev_dbg(&priv->pcid->dev,
1372 "Beacon enable %d\n", conf->enable_beacon);
1373
1374 if (conf->enable_beacon) {
1375 vnt_beacon_enable(priv, vif, conf);
1376
1377 MACvRegBitsOn(priv->PortOffset, MAC_REG_TCR,
1378 TCR_AUTOBCNTX);
1379 } else {
1380 MACvRegBitsOff(priv->PortOffset, MAC_REG_TCR,
1381 TCR_AUTOBCNTX);
1382 }
1383 }
1384
1385 if (changed & (BSS_CHANGED_ASSOC | BSS_CHANGED_BEACON_INFO) &&
1386 priv->op_mode != NL80211_IFTYPE_AP) {
1387 if (conf->assoc && conf->beacon_rate) {
1388 CARDbUpdateTSF(priv, conf->beacon_rate->hw_value,
1389 conf->sync_tsf);
1390
1391 CARDbSetBeaconPeriod(priv, conf->beacon_int);
1392
1393 CARDvSetFirstNextTBTT(priv, conf->beacon_int);
1394 } else {
1395 VNSvOutPortB(priv->PortOffset + MAC_REG_TFTCTL,
1396 TFTCTL_TSFCNTRST);
1397 VNSvOutPortB(priv->PortOffset + MAC_REG_TFTCTL,
1398 TFTCTL_TSFCNTREN);
1399 }
1400 }
1401 }
1402
vnt_prepare_multicast(struct ieee80211_hw * hw,struct netdev_hw_addr_list * mc_list)1403 static u64 vnt_prepare_multicast(struct ieee80211_hw *hw,
1404 struct netdev_hw_addr_list *mc_list)
1405 {
1406 struct vnt_private *priv = hw->priv;
1407 struct netdev_hw_addr *ha;
1408 u64 mc_filter = 0;
1409 u32 bit_nr = 0;
1410
1411 netdev_hw_addr_list_for_each(ha, mc_list) {
1412 bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
1413
1414 mc_filter |= 1ULL << (bit_nr & 0x3f);
1415 }
1416
1417 priv->mc_list_count = mc_list->count;
1418
1419 return mc_filter;
1420 }
1421
vnt_configure(struct ieee80211_hw * hw,unsigned int changed_flags,unsigned int * total_flags,u64 multicast)1422 static void vnt_configure(struct ieee80211_hw *hw,
1423 unsigned int changed_flags, unsigned int *total_flags, u64 multicast)
1424 {
1425 struct vnt_private *priv = hw->priv;
1426 u8 rx_mode = 0;
1427
1428 *total_flags &= FIF_ALLMULTI | FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC;
1429
1430 VNSvInPortB(priv->PortOffset + MAC_REG_RCR, &rx_mode);
1431
1432 dev_dbg(&priv->pcid->dev, "rx mode in = %x\n", rx_mode);
1433
1434 if (changed_flags & FIF_ALLMULTI) {
1435 if (*total_flags & FIF_ALLMULTI) {
1436 unsigned long flags;
1437
1438 spin_lock_irqsave(&priv->lock, flags);
1439
1440 if (priv->mc_list_count > 2) {
1441 MACvSelectPage1(priv->PortOffset);
1442
1443 VNSvOutPortD(priv->PortOffset +
1444 MAC_REG_MAR0, 0xffffffff);
1445 VNSvOutPortD(priv->PortOffset +
1446 MAC_REG_MAR0 + 4, 0xffffffff);
1447
1448 MACvSelectPage0(priv->PortOffset);
1449 } else {
1450 MACvSelectPage1(priv->PortOffset);
1451
1452 VNSvOutPortD(priv->PortOffset +
1453 MAC_REG_MAR0, (u32)multicast);
1454 VNSvOutPortD(priv->PortOffset +
1455 MAC_REG_MAR0 + 4,
1456 (u32)(multicast >> 32));
1457
1458 MACvSelectPage0(priv->PortOffset);
1459 }
1460
1461 spin_unlock_irqrestore(&priv->lock, flags);
1462
1463 rx_mode |= RCR_MULTICAST | RCR_BROADCAST;
1464 } else {
1465 rx_mode &= ~(RCR_MULTICAST | RCR_BROADCAST);
1466 }
1467 }
1468
1469 if (changed_flags & (FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC)) {
1470 rx_mode |= RCR_MULTICAST | RCR_BROADCAST;
1471
1472 if (*total_flags & (FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC))
1473 rx_mode &= ~RCR_BSSID;
1474 else
1475 rx_mode |= RCR_BSSID;
1476 }
1477
1478 VNSvOutPortB(priv->PortOffset + MAC_REG_RCR, rx_mode);
1479
1480 dev_dbg(&priv->pcid->dev, "rx mode out= %x\n", rx_mode);
1481 }
1482
vnt_set_key(struct ieee80211_hw * hw,enum set_key_cmd cmd,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)1483 static int vnt_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1484 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
1485 struct ieee80211_key_conf *key)
1486 {
1487 struct vnt_private *priv = hw->priv;
1488
1489 switch (cmd) {
1490 case SET_KEY:
1491 if (vnt_set_keys(hw, sta, vif, key))
1492 return -EOPNOTSUPP;
1493 break;
1494 case DISABLE_KEY:
1495 if (test_bit(key->hw_key_idx, &priv->key_entry_inuse))
1496 clear_bit(key->hw_key_idx, &priv->key_entry_inuse);
1497 default:
1498 break;
1499 }
1500
1501 return 0;
1502 }
1503
vnt_get_stats(struct ieee80211_hw * hw,struct ieee80211_low_level_stats * stats)1504 static int vnt_get_stats(struct ieee80211_hw *hw,
1505 struct ieee80211_low_level_stats *stats)
1506 {
1507 struct vnt_private *priv = hw->priv;
1508
1509 memcpy(stats, &priv->low_stats, sizeof(*stats));
1510
1511 return 0;
1512 }
1513
vnt_get_tsf(struct ieee80211_hw * hw,struct ieee80211_vif * vif)1514 static u64 vnt_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1515 {
1516 struct vnt_private *priv = hw->priv;
1517 u64 tsf;
1518
1519 CARDbGetCurrentTSF(priv, &tsf);
1520
1521 return tsf;
1522 }
1523
vnt_set_tsf(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u64 tsf)1524 static void vnt_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1525 u64 tsf)
1526 {
1527 struct vnt_private *priv = hw->priv;
1528
1529 CARDvUpdateNextTBTT(priv, tsf, vif->bss_conf.beacon_int);
1530 }
1531
vnt_reset_tsf(struct ieee80211_hw * hw,struct ieee80211_vif * vif)1532 static void vnt_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1533 {
1534 struct vnt_private *priv = hw->priv;
1535
1536 /* reset TSF counter */
1537 VNSvOutPortB(priv->PortOffset + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
1538 }
1539
1540 static const struct ieee80211_ops vnt_mac_ops = {
1541 .tx = vnt_tx_80211,
1542 .start = vnt_start,
1543 .stop = vnt_stop,
1544 .add_interface = vnt_add_interface,
1545 .remove_interface = vnt_remove_interface,
1546 .config = vnt_config,
1547 .bss_info_changed = vnt_bss_info_changed,
1548 .prepare_multicast = vnt_prepare_multicast,
1549 .configure_filter = vnt_configure,
1550 .set_key = vnt_set_key,
1551 .get_stats = vnt_get_stats,
1552 .get_tsf = vnt_get_tsf,
1553 .set_tsf = vnt_set_tsf,
1554 .reset_tsf = vnt_reset_tsf,
1555 };
1556
vnt_init(struct vnt_private * priv)1557 static int vnt_init(struct vnt_private *priv)
1558 {
1559 SET_IEEE80211_PERM_ADDR(priv->hw, priv->abyCurrentNetAddr);
1560
1561 vnt_init_bands(priv);
1562
1563 if (ieee80211_register_hw(priv->hw))
1564 return -ENODEV;
1565
1566 priv->mac_hw = true;
1567
1568 CARDbRadioPowerOff(priv);
1569
1570 return 0;
1571 }
1572
1573 static int
vt6655_probe(struct pci_dev * pcid,const struct pci_device_id * ent)1574 vt6655_probe(struct pci_dev *pcid, const struct pci_device_id *ent)
1575 {
1576 struct vnt_private *priv;
1577 struct ieee80211_hw *hw;
1578 struct wiphy *wiphy;
1579 int rc;
1580
1581 dev_notice(&pcid->dev,
1582 "%s Ver. %s\n", DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
1583
1584 dev_notice(&pcid->dev,
1585 "Copyright (c) 2003 VIA Networking Technologies, Inc.\n");
1586
1587 hw = ieee80211_alloc_hw(sizeof(*priv), &vnt_mac_ops);
1588 if (!hw) {
1589 dev_err(&pcid->dev, "could not register ieee80211_hw\n");
1590 return -ENOMEM;
1591 }
1592
1593 priv = hw->priv;
1594 priv->pcid = pcid;
1595
1596 spin_lock_init(&priv->lock);
1597
1598 priv->hw = hw;
1599
1600 SET_IEEE80211_DEV(priv->hw, &pcid->dev);
1601
1602 if (pci_enable_device(pcid)) {
1603 device_free_info(priv);
1604 return -ENODEV;
1605 }
1606
1607 dev_dbg(&pcid->dev,
1608 "Before get pci_info memaddr is %x\n", priv->memaddr);
1609
1610 pci_set_master(pcid);
1611
1612 priv->memaddr = pci_resource_start(pcid, 0);
1613 priv->ioaddr = pci_resource_start(pcid, 1);
1614 priv->PortOffset = ioremap(priv->memaddr & PCI_BASE_ADDRESS_MEM_MASK,
1615 256);
1616 if (!priv->PortOffset) {
1617 dev_err(&pcid->dev, ": Failed to IO remapping ..\n");
1618 device_free_info(priv);
1619 return -ENODEV;
1620 }
1621
1622 rc = pci_request_regions(pcid, DEVICE_NAME);
1623 if (rc) {
1624 dev_err(&pcid->dev, ": Failed to find PCI device\n");
1625 device_free_info(priv);
1626 return -ENODEV;
1627 }
1628
1629 if (dma_set_mask(&pcid->dev, DMA_BIT_MASK(32))) {
1630 dev_err(&pcid->dev, ": Failed to set dma 32 bit mask\n");
1631 device_free_info(priv);
1632 return -ENODEV;
1633 }
1634
1635 INIT_WORK(&priv->interrupt_work, vnt_interrupt_work);
1636
1637 /* do reset */
1638 if (!MACbSoftwareReset(priv->PortOffset)) {
1639 dev_err(&pcid->dev, ": Failed to access MAC hardware..\n");
1640 device_free_info(priv);
1641 return -ENODEV;
1642 }
1643 /* initial to reload eeprom */
1644 MACvInitialize(priv->PortOffset);
1645 MACvReadEtherAddress(priv->PortOffset, priv->abyCurrentNetAddr);
1646
1647 /* Get RFType */
1648 priv->byRFType = SROMbyReadEmbedded(priv->PortOffset, EEP_OFS_RFTYPE);
1649 priv->byRFType &= RF_MASK;
1650
1651 dev_dbg(&pcid->dev, "RF Type = %x\n", priv->byRFType);
1652
1653 device_get_options(priv);
1654 device_set_options(priv);
1655
1656 wiphy = priv->hw->wiphy;
1657
1658 wiphy->frag_threshold = FRAG_THRESH_DEF;
1659 wiphy->rts_threshold = RTS_THRESH_DEF;
1660 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
1661 BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP);
1662
1663 ieee80211_hw_set(priv->hw, TIMING_BEACON_ONLY);
1664 ieee80211_hw_set(priv->hw, SIGNAL_DBM);
1665 ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS);
1666 ieee80211_hw_set(priv->hw, REPORTS_TX_ACK_STATUS);
1667 ieee80211_hw_set(priv->hw, SUPPORTS_PS);
1668
1669 priv->hw->max_signal = 100;
1670
1671 if (vnt_init(priv)) {
1672 device_free_info(priv);
1673 return -ENODEV;
1674 }
1675
1676 device_print_info(priv);
1677 pci_set_drvdata(pcid, priv);
1678
1679 return 0;
1680 }
1681
1682 /*------------------------------------------------------------------*/
1683
1684 #ifdef CONFIG_PM
vt6655_suspend(struct pci_dev * pcid,pm_message_t state)1685 static int vt6655_suspend(struct pci_dev *pcid, pm_message_t state)
1686 {
1687 struct vnt_private *priv = pci_get_drvdata(pcid);
1688 unsigned long flags;
1689
1690 spin_lock_irqsave(&priv->lock, flags);
1691
1692 pci_save_state(pcid);
1693
1694 MACbShutdown(priv->PortOffset);
1695
1696 pci_disable_device(pcid);
1697
1698 spin_unlock_irqrestore(&priv->lock, flags);
1699
1700 pci_set_power_state(pcid, pci_choose_state(pcid, state));
1701
1702 return 0;
1703 }
1704
vt6655_resume(struct pci_dev * pcid)1705 static int vt6655_resume(struct pci_dev *pcid)
1706 {
1707
1708 pci_set_power_state(pcid, PCI_D0);
1709 pci_enable_wake(pcid, PCI_D0, 0);
1710 pci_restore_state(pcid);
1711
1712 return 0;
1713 }
1714 #endif
1715
1716 MODULE_DEVICE_TABLE(pci, vt6655_pci_id_table);
1717
1718 static struct pci_driver device_driver = {
1719 .name = DEVICE_NAME,
1720 .id_table = vt6655_pci_id_table,
1721 .probe = vt6655_probe,
1722 .remove = vt6655_remove,
1723 #ifdef CONFIG_PM
1724 .suspend = vt6655_suspend,
1725 .resume = vt6655_resume,
1726 #endif
1727 };
1728
1729 module_pci_driver(device_driver);
1730