• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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