]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - drivers/staging/vt6655/mac.c
staging: vt6655: mac.c replace void __iomem * with struct vnt_private
[mirror_ubuntu-zesty-kernel.git] / drivers / staging / vt6655 / mac.c
CommitLineData
5449c685
FB
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 *
612822f5 19 *
5449c685
FB
20 * File: mac.c
21 *
22 * Purpose: MAC routines
23 *
24 * Author: Tevin Chen
25 *
26 * Date: May 21, 1996
27 *
28 * Functions:
5449c685
FB
29 * MACbIsRegBitsOn - Test if All test Bits On
30 * MACbIsRegBitsOff - Test if All test Bits Off
31 * MACbIsIntDisable - Test if MAC interrupt disable
5449c685 32 * MACvSetShortRetryLimit - Set 802.11 Short Retry limit
5449c685 33 * MACvSetLongRetryLimit - Set 802.11 Long Retry limit
5449c685 34 * MACvSetLoopbackMode - Set MAC Loopback Mode
5449c685
FB
35 * MACvSaveContext - Save Context of MAC Registers
36 * MACvRestoreContext - Restore Context of MAC Registers
5449c685
FB
37 * MACbSoftwareReset - Software Reset MAC
38 * MACbSafeRxOff - Turn Off MAC Rx
39 * MACbSafeTxOff - Turn Off MAC Tx
40 * MACbSafeStop - Stop MAC function
41 * MACbShutdown - Shut down MAC
42 * MACvInitialize - Initialize MAC
789d1aef
JM
43 * MACvSetCurrRxDescAddr - Set Rx Descriptors Address
44 * MACvSetCurrTx0DescAddr - Set Tx0 Descriptors Address
45 * MACvSetCurrTx1DescAddr - Set Tx1 Descriptors Address
5449c685
FB
46 * MACvTimer0MicroSDelay - Micro Second Delay Loop by MAC
47 *
48 * Revision History:
49 * 08-22-2003 Kyle Hsu : Porting MAC functions from sim53
50 * 09-03-2003 Bryan YC Fan : Add MACvClearBusSusInd()& MACvEnableBusSusEn()
51 * 09-18-2003 Jerry Chen : Add MACvSetKeyEntry & MACvDisableKeyEntry
52 *
53 */
54
5449c685 55#include "tmacro.h"
5449c685 56#include "mac.h"
5449c685 57
5449c685
FB
58/*
59 * Description:
60 * Test if all test bits on
61 *
62 * Parameters:
63 * In:
64 * dwIoBase - Base Address for MAC
65 * byRegOfs - Offset of MAC Register
66 * byTestBits - Test bits
67 * Out:
68 * none
69 *
5a5a2a6a 70 * Return Value: true if all test bits On; otherwise false
5449c685
FB
71 *
72 */
f9f853af 73bool MACbIsRegBitsOn(struct vnt_private *priv, unsigned char byRegOfs,
d4855fe1 74 unsigned char byTestBits)
5449c685 75{
f9f853af 76 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd 77 unsigned char byData;
5449c685 78
c3504bfd
JP
79 VNSvInPortB(dwIoBase + byRegOfs, &byData);
80 return (byData & byTestBits) == byTestBits;
5449c685
FB
81}
82
83/*
84 * Description:
85 * Test if all test bits off
86 *
87 * Parameters:
88 * In:
89 * dwIoBase - Base Address for MAC
90 * byRegOfs - Offset of MAC Register
91 * byTestBits - Test bits
92 * Out:
93 * none
94 *
5a5a2a6a 95 * Return Value: true if all test bits Off; otherwise false
5449c685
FB
96 *
97 */
f9f853af 98bool MACbIsRegBitsOff(struct vnt_private *priv, unsigned char byRegOfs,
d4855fe1 99 unsigned char byTestBits)
5449c685 100{
f9f853af 101 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd 102 unsigned char byData;
5449c685 103
c3504bfd
JP
104 VNSvInPortB(dwIoBase + byRegOfs, &byData);
105 return !(byData & byTestBits);
5449c685
FB
106}
107
108/*
109 * Description:
110 * Test if MAC interrupt disable
111 *
112 * Parameters:
113 * In:
114 * dwIoBase - Base Address for MAC
115 * Out:
116 * none
117 *
5a5a2a6a 118 * Return Value: true if interrupt is disable; otherwise false
5449c685
FB
119 *
120 */
f9f853af 121bool MACbIsIntDisable(struct vnt_private *priv)
5449c685 122{
f9f853af 123 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd 124 unsigned long dwData;
5449c685 125
c3504bfd
JP
126 VNSvInPortD(dwIoBase + MAC_REG_IMR, &dwData);
127 if (dwData != 0)
128 return false;
5449c685 129
c3504bfd 130 return true;
5449c685
FB
131}
132
5449c685
FB
133/*
134 * Description:
135 * Set 802.11 Short Retry Limit
136 *
137 * Parameters:
138 * In:
139 * dwIoBase - Base Address for MAC
140 * byRetryLimit- Retry Limit
141 * Out:
142 * none
143 *
144 * Return Value: none
145 *
146 */
f9f853af 147void MACvSetShortRetryLimit(struct vnt_private *priv, unsigned char byRetryLimit)
5449c685 148{
f9f853af 149 void __iomem *dwIoBase = priv->PortOffset;
9ab81fb7 150 /* set SRT */
c3504bfd 151 VNSvOutPortB(dwIoBase + MAC_REG_SRT, byRetryLimit);
5449c685
FB
152}
153
5449c685
FB
154
155/*
156 * Description:
157 * Set 802.11 Long Retry Limit
158 *
159 * Parameters:
160 * In:
161 * dwIoBase - Base Address for MAC
162 * byRetryLimit- Retry Limit
163 * Out:
164 * none
165 *
166 * Return Value: none
167 *
168 */
f9f853af 169void MACvSetLongRetryLimit(struct vnt_private *priv, unsigned char byRetryLimit)
5449c685 170{
f9f853af 171 void __iomem *dwIoBase = priv->PortOffset;
9ab81fb7 172 /* set LRT */
c3504bfd 173 VNSvOutPortB(dwIoBase + MAC_REG_LRT, byRetryLimit);
5449c685
FB
174}
175
5449c685
FB
176/*
177 * Description:
178 * Set MAC Loopback mode
179 *
180 * Parameters:
181 * In:
182 * dwIoBase - Base Address for MAC
183 * byLoopbackMode - Loopback Mode
184 * Out:
185 * none
186 *
187 * Return Value: none
188 *
189 */
f9f853af 190void MACvSetLoopbackMode(struct vnt_private *priv, unsigned char byLoopbackMode)
5449c685 191{
f9f853af 192 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd
JP
193 unsigned char byOrgValue;
194
c3504bfd 195 byLoopbackMode <<= 6;
9ab81fb7 196 /* set TCR */
c3504bfd
JP
197 VNSvInPortB(dwIoBase + MAC_REG_TEST, &byOrgValue);
198 byOrgValue = byOrgValue & 0x3F;
199 byOrgValue = byOrgValue | byLoopbackMode;
200 VNSvOutPortB(dwIoBase + MAC_REG_TEST, byOrgValue);
5449c685
FB
201}
202
5449c685
FB
203/*
204 * Description:
205 * Save MAC registers to context buffer
206 *
207 * Parameters:
208 * In:
209 * dwIoBase - Base Address for MAC
210 * Out:
211 * pbyCxtBuf - Context buffer
212 *
213 * Return Value: none
214 *
215 */
f9f853af 216void MACvSaveContext(struct vnt_private *priv, unsigned char *pbyCxtBuf)
5449c685 217{
f9f853af 218 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd 219 int ii;
5449c685 220
9ab81fb7 221 /* read page0 register */
bc5cf656 222 for (ii = 0; ii < MAC_MAX_CONTEXT_SIZE_PAGE0; ii++)
c3504bfd 223 VNSvInPortB((dwIoBase + ii), (pbyCxtBuf + ii));
5449c685 224
c3504bfd 225 MACvSelectPage1(dwIoBase);
5449c685 226
9ab81fb7 227 /* read page1 register */
bc5cf656 228 for (ii = 0; ii < MAC_MAX_CONTEXT_SIZE_PAGE1; ii++)
d4855fe1
GB
229 VNSvInPortB((dwIoBase + ii),
230 (pbyCxtBuf + MAC_MAX_CONTEXT_SIZE_PAGE0 + ii));
5449c685 231
c3504bfd 232 MACvSelectPage0(dwIoBase);
5449c685
FB
233}
234
235/*
236 * Description:
237 * Restore MAC registers from context buffer
238 *
239 * Parameters:
240 * In:
241 * dwIoBase - Base Address for MAC
242 * pbyCxtBuf - Context buffer
243 * Out:
244 * none
245 *
246 * Return Value: none
247 *
248 */
f9f853af 249void MACvRestoreContext(struct vnt_private *priv, unsigned char *pbyCxtBuf)
5449c685 250{
f9f853af 251 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd 252 int ii;
5449c685 253
c3504bfd 254 MACvSelectPage1(dwIoBase);
9ab81fb7 255 /* restore page1 */
bc5cf656 256 for (ii = 0; ii < MAC_MAX_CONTEXT_SIZE_PAGE1; ii++)
d4855fe1
GB
257 VNSvOutPortB((dwIoBase + ii),
258 *(pbyCxtBuf + MAC_MAX_CONTEXT_SIZE_PAGE0 + ii));
bc5cf656 259
c3504bfd 260 MACvSelectPage0(dwIoBase);
5449c685 261
9ab81fb7 262 /* restore RCR,TCR,IMR... */
bc5cf656 263 for (ii = MAC_REG_RCR; ii < MAC_REG_ISR; ii++)
c3504bfd 264 VNSvOutPortB(dwIoBase + ii, *(pbyCxtBuf + ii));
bc5cf656 265
9ab81fb7 266 /* restore MAC Config. */
bc5cf656 267 for (ii = MAC_REG_LRT; ii < MAC_REG_PAGE1SEL; ii++)
c3504bfd 268 VNSvOutPortB(dwIoBase + ii, *(pbyCxtBuf + ii));
bc5cf656 269
c3504bfd 270 VNSvOutPortB(dwIoBase + MAC_REG_CFG, *(pbyCxtBuf + MAC_REG_CFG));
5449c685 271
9ab81fb7 272 /* restore PS Config. */
bc5cf656 273 for (ii = MAC_REG_PSCFG; ii < MAC_REG_BBREGCTL; ii++)
c3504bfd 274 VNSvOutPortB(dwIoBase + ii, *(pbyCxtBuf + ii));
5449c685 275
9ab81fb7 276 /* restore CURR_RX_DESC_ADDR, CURR_TX_DESC_ADDR */
d4855fe1
GB
277 VNSvOutPortD(dwIoBase + MAC_REG_TXDMAPTR0,
278 *(unsigned long *)(pbyCxtBuf + MAC_REG_TXDMAPTR0));
279 VNSvOutPortD(dwIoBase + MAC_REG_AC0DMAPTR,
280 *(unsigned long *)(pbyCxtBuf + MAC_REG_AC0DMAPTR));
281 VNSvOutPortD(dwIoBase + MAC_REG_BCNDMAPTR,
282 *(unsigned long *)(pbyCxtBuf + MAC_REG_BCNDMAPTR));
283
284 VNSvOutPortD(dwIoBase + MAC_REG_RXDMAPTR0,
285 *(unsigned long *)(pbyCxtBuf + MAC_REG_RXDMAPTR0));
286
287 VNSvOutPortD(dwIoBase + MAC_REG_RXDMAPTR1,
288 *(unsigned long *)(pbyCxtBuf + MAC_REG_RXDMAPTR1));
5449c685
FB
289}
290
5449c685
FB
291/*
292 * Description:
293 * Software Reset MAC
294 *
295 * Parameters:
296 * In:
297 * dwIoBase - Base Address for MAC
298 * Out:
299 * none
300 *
5a5a2a6a 301 * Return Value: true if Reset Success; otherwise false
5449c685
FB
302 *
303 */
f9f853af 304bool MACbSoftwareReset(struct vnt_private *priv)
5449c685 305{
f9f853af 306 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd
JP
307 unsigned char byData;
308 unsigned short ww;
309
9ab81fb7 310 /* turn on HOSTCR_SOFTRST, just write 0x01 to reset */
c3504bfd
JP
311 VNSvOutPortB(dwIoBase + MAC_REG_HOSTCR, 0x01);
312
313 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
314 VNSvInPortB(dwIoBase + MAC_REG_HOSTCR, &byData);
315 if (!(byData & HOSTCR_SOFTRST))
316 break;
317 }
318 if (ww == W_MAX_TIMEOUT)
319 return false;
320 return true;
5449c685
FB
321}
322
323/*
324 * Description:
325 * save some important register's value, then do reset, then restore register's value
326 *
327 * Parameters:
328 * In:
329 * dwIoBase - Base Address for MAC
330 * Out:
331 * none
332 *
5a5a2a6a 333 * Return Value: true if success; otherwise false
5449c685
FB
334 *
335 */
f9f853af 336bool MACbSafeSoftwareReset(struct vnt_private *priv)
5449c685 337{
c3504bfd
JP
338 unsigned char abyTmpRegData[MAC_MAX_CONTEXT_SIZE_PAGE0+MAC_MAX_CONTEXT_SIZE_PAGE1];
339 bool bRetVal;
340
9ab81fb7
MS
341 /* PATCH....
342 * save some important register's value, then do
343 * reset, then restore register's value
344 */
345 /* save MAC context */
f9f853af 346 MACvSaveContext(priv, abyTmpRegData);
9ab81fb7 347 /* do reset */
f9f853af 348 bRetVal = MACbSoftwareReset(priv);
9ab81fb7 349 /* restore MAC context, except CR0 */
f9f853af 350 MACvRestoreContext(priv, abyTmpRegData);
c3504bfd
JP
351
352 return bRetVal;
5449c685
FB
353}
354
355/*
356 * Description:
b1797dfd 357 * Turn Off MAC Rx
5449c685
FB
358 *
359 * Parameters:
360 * In:
361 * dwIoBase - Base Address for MAC
362 * Out:
363 * none
364 *
5a5a2a6a 365 * Return Value: true if success; otherwise false
5449c685
FB
366 *
367 */
f9f853af 368bool MACbSafeRxOff(struct vnt_private *priv)
5449c685 369{
f9f853af 370 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd
JP
371 unsigned short ww;
372 unsigned long dwData;
373 unsigned char byData;
374
9ab81fb7 375 /* turn off wow temp for turn off Rx safely */
c3504bfd 376
9ab81fb7 377 /* Clear RX DMA0,1 */
c3504bfd
JP
378 VNSvOutPortD(dwIoBase + MAC_REG_RXDMACTL0, DMACTL_CLRRUN);
379 VNSvOutPortD(dwIoBase + MAC_REG_RXDMACTL1, DMACTL_CLRRUN);
380 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
381 VNSvInPortD(dwIoBase + MAC_REG_RXDMACTL0, &dwData);
382 if (!(dwData & DMACTL_RUN))
383 break;
384 }
385 if (ww == W_MAX_TIMEOUT) {
48caf5a0 386 pr_debug(" DBG_PORT80(0x10)\n");
a4ef27ad 387 return false;
c3504bfd
JP
388 }
389 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
390 VNSvInPortD(dwIoBase + MAC_REG_RXDMACTL1, &dwData);
391 if (!(dwData & DMACTL_RUN))
392 break;
393 }
394 if (ww == W_MAX_TIMEOUT) {
48caf5a0 395 pr_debug(" DBG_PORT80(0x11)\n");
a4ef27ad 396 return false;
c3504bfd
JP
397 }
398
9ab81fb7 399 /* try to safe shutdown RX */
c3504bfd 400 MACvRegBitsOff(dwIoBase, MAC_REG_HOSTCR, HOSTCR_RXON);
9ab81fb7 401 /* W_MAX_TIMEOUT is the timeout period */
c3504bfd
JP
402 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
403 VNSvInPortB(dwIoBase + MAC_REG_HOSTCR, &byData);
404 if (!(byData & HOSTCR_RXONST))
405 break;
406 }
407 if (ww == W_MAX_TIMEOUT) {
48caf5a0 408 pr_debug(" DBG_PORT80(0x12)\n");
a4ef27ad 409 return false;
c3504bfd
JP
410 }
411 return true;
5449c685
FB
412}
413
414/*
415 * Description:
b1797dfd 416 * Turn Off MAC Tx
5449c685
FB
417 *
418 * Parameters:
419 * In:
420 * dwIoBase - Base Address for MAC
421 * Out:
422 * none
423 *
5a5a2a6a 424 * Return Value: true if success; otherwise false
5449c685
FB
425 *
426 */
f9f853af 427bool MACbSafeTxOff(struct vnt_private *priv)
5449c685 428{
f9f853af 429 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd
JP
430 unsigned short ww;
431 unsigned long dwData;
432 unsigned char byData;
433
9ab81fb7
MS
434 /* Clear TX DMA */
435 /* Tx0 */
c3504bfd 436 VNSvOutPortD(dwIoBase + MAC_REG_TXDMACTL0, DMACTL_CLRRUN);
9ab81fb7 437 /* AC0 */
c3504bfd
JP
438 VNSvOutPortD(dwIoBase + MAC_REG_AC0DMACTL, DMACTL_CLRRUN);
439
c3504bfd
JP
440 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
441 VNSvInPortD(dwIoBase + MAC_REG_TXDMACTL0, &dwData);
442 if (!(dwData & DMACTL_RUN))
443 break;
444 }
445 if (ww == W_MAX_TIMEOUT) {
48caf5a0 446 pr_debug(" DBG_PORT80(0x20)\n");
a4ef27ad 447 return false;
c3504bfd
JP
448 }
449 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
450 VNSvInPortD(dwIoBase + MAC_REG_AC0DMACTL, &dwData);
451 if (!(dwData & DMACTL_RUN))
452 break;
453 }
454 if (ww == W_MAX_TIMEOUT) {
48caf5a0 455 pr_debug(" DBG_PORT80(0x21)\n");
a4ef27ad 456 return false;
c3504bfd
JP
457 }
458
9ab81fb7 459 /* try to safe shutdown TX */
c3504bfd
JP
460 MACvRegBitsOff(dwIoBase, MAC_REG_HOSTCR, HOSTCR_TXON);
461
9ab81fb7 462 /* W_MAX_TIMEOUT is the timeout period */
c3504bfd
JP
463 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
464 VNSvInPortB(dwIoBase + MAC_REG_HOSTCR, &byData);
465 if (!(byData & HOSTCR_TXONST))
466 break;
467 }
468 if (ww == W_MAX_TIMEOUT) {
48caf5a0 469 pr_debug(" DBG_PORT80(0x24)\n");
a4ef27ad 470 return false;
c3504bfd
JP
471 }
472 return true;
5449c685
FB
473}
474
475/*
476 * Description:
477 * Stop MAC function
478 *
479 * Parameters:
480 * In:
481 * dwIoBase - Base Address for MAC
482 * Out:
483 * none
484 *
5a5a2a6a 485 * Return Value: true if success; otherwise false
5449c685
FB
486 *
487 */
f9f853af 488bool MACbSafeStop(struct vnt_private *priv)
5449c685 489{
f9f853af 490 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd
JP
491 MACvRegBitsOff(dwIoBase, MAC_REG_TCR, TCR_AUTOBCNTX);
492
f9f853af 493 if (!MACbSafeRxOff(priv)) {
48caf5a0 494 pr_debug(" MACbSafeRxOff == false)\n");
f9f853af 495 MACbSafeSoftwareReset(priv);
c3504bfd
JP
496 return false;
497 }
f9f853af 498 if (!MACbSafeTxOff(priv)) {
48caf5a0 499 pr_debug(" MACbSafeTxOff == false)\n");
f9f853af 500 MACbSafeSoftwareReset(priv);
c3504bfd
JP
501 return false;
502 }
503
504 MACvRegBitsOff(dwIoBase, MAC_REG_HOSTCR, HOSTCR_MACEN);
505
506 return true;
5449c685
FB
507}
508
509/*
510 * Description:
511 * Shut Down MAC
512 *
513 * Parameters:
514 * In:
515 * dwIoBase - Base Address for MAC
516 * Out:
517 * none
518 *
5a5a2a6a 519 * Return Value: true if success; otherwise false
5449c685
FB
520 *
521 */
f9f853af 522bool MACbShutdown(struct vnt_private *priv)
5449c685 523{
f9f853af 524 void __iomem *dwIoBase = priv->PortOffset;
9ab81fb7 525 /* disable MAC IMR */
c3504bfd 526 MACvIntDisable(dwIoBase);
f9f853af 527 MACvSetLoopbackMode(priv, MAC_LB_INTERNAL);
9ab81fb7 528 /* stop the adapter */
f9f853af
MP
529 if (!MACbSafeStop(priv)) {
530 MACvSetLoopbackMode(priv, MAC_LB_NONE);
c3504bfd
JP
531 return false;
532 }
f9f853af 533 MACvSetLoopbackMode(priv, MAC_LB_NONE);
c3504bfd 534 return true;
5449c685
FB
535}
536
537/*
538 * Description:
539 * Initialize MAC
540 *
541 * Parameters:
542 * In:
543 * dwIoBase - Base Address for MAC
544 * Out:
545 * none
546 *
547 * Return Value: none
548 *
549 */
f9f853af 550void MACvInitialize(struct vnt_private *priv)
5449c685 551{
f9f853af 552 void __iomem *dwIoBase = priv->PortOffset;
9ab81fb7 553 /* clear sticky bits */
c3504bfd 554 MACvClearStckDS(dwIoBase);
9ab81fb7 555 /* disable force PME-enable */
c3504bfd 556 VNSvOutPortB(dwIoBase + MAC_REG_PMC1, PME_OVR);
9ab81fb7 557 /* only 3253 A */
c3504bfd 558
9ab81fb7 559 /* do reset */
f9f853af 560 MACbSoftwareReset(priv);
c3504bfd 561
9ab81fb7 562 /* reset TSF counter */
c3504bfd 563 VNSvOutPortB(dwIoBase + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
9ab81fb7 564 /* enable TSF counter */
c3504bfd 565 VNSvOutPortB(dwIoBase + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
5449c685
FB
566}
567
568/*
569 * Description:
570 * Set the chip with current rx descriptor address
571 *
572 * Parameters:
573 * In:
574 * dwIoBase - Base Address for MAC
575 * dwCurrDescAddr - Descriptor Address
576 * Out:
577 * none
578 *
579 * Return Value: none
580 *
581 */
f9f853af 582void MACvSetCurrRx0DescAddr(struct vnt_private *priv, unsigned long dwCurrDescAddr)
5449c685 583{
f9f853af 584 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd
JP
585 unsigned short ww;
586 unsigned char byData;
587 unsigned char byOrgDMACtl;
588
589 VNSvInPortB(dwIoBase + MAC_REG_RXDMACTL0, &byOrgDMACtl);
bc5cf656 590 if (byOrgDMACtl & DMACTL_RUN)
c3504bfd 591 VNSvOutPortB(dwIoBase + MAC_REG_RXDMACTL0+2, DMACTL_RUN);
bc5cf656 592
c3504bfd
JP
593 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
594 VNSvInPortB(dwIoBase + MAC_REG_RXDMACTL0, &byData);
595 if (!(byData & DMACTL_RUN))
596 break;
597 }
bc5cf656 598
c3504bfd 599 VNSvOutPortD(dwIoBase + MAC_REG_RXDMAPTR0, dwCurrDescAddr);
bc5cf656 600 if (byOrgDMACtl & DMACTL_RUN)
c3504bfd 601 VNSvOutPortB(dwIoBase + MAC_REG_RXDMACTL0, DMACTL_RUN);
5449c685
FB
602}
603
604/*
605 * Description:
606 * Set the chip with current rx descriptor address
607 *
608 * Parameters:
609 * In:
610 * dwIoBase - Base Address for MAC
611 * dwCurrDescAddr - Descriptor Address
612 * Out:
613 * none
614 *
615 * Return Value: none
616 *
617 */
f9f853af 618void MACvSetCurrRx1DescAddr(struct vnt_private *priv, unsigned long dwCurrDescAddr)
5449c685 619{
f9f853af 620 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd
JP
621 unsigned short ww;
622 unsigned char byData;
623 unsigned char byOrgDMACtl;
624
625 VNSvInPortB(dwIoBase + MAC_REG_RXDMACTL1, &byOrgDMACtl);
bc5cf656 626 if (byOrgDMACtl & DMACTL_RUN)
c3504bfd 627 VNSvOutPortB(dwIoBase + MAC_REG_RXDMACTL1+2, DMACTL_RUN);
bc5cf656 628
c3504bfd
JP
629 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
630 VNSvInPortB(dwIoBase + MAC_REG_RXDMACTL1, &byData);
631 if (!(byData & DMACTL_RUN))
632 break;
633 }
bc5cf656 634
c3504bfd 635 VNSvOutPortD(dwIoBase + MAC_REG_RXDMAPTR1, dwCurrDescAddr);
bc5cf656 636 if (byOrgDMACtl & DMACTL_RUN)
c3504bfd 637 VNSvOutPortB(dwIoBase + MAC_REG_RXDMACTL1, DMACTL_RUN);
bc5cf656 638
5449c685
FB
639}
640
641/*
642 * Description:
643 * Set the chip with current tx0 descriptor address
644 *
645 * Parameters:
646 * In:
647 * dwIoBase - Base Address for MAC
648 * dwCurrDescAddr - Descriptor Address
649 * Out:
650 * none
651 *
652 * Return Value: none
653 *
654 */
f9f853af 655void MACvSetCurrTx0DescAddrEx(struct vnt_private *priv,
d4855fe1 656 unsigned long dwCurrDescAddr)
5449c685 657{
f9f853af 658 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd
JP
659 unsigned short ww;
660 unsigned char byData;
661 unsigned char byOrgDMACtl;
662
663 VNSvInPortB(dwIoBase + MAC_REG_TXDMACTL0, &byOrgDMACtl);
bc5cf656 664 if (byOrgDMACtl & DMACTL_RUN)
c3504bfd 665 VNSvOutPortB(dwIoBase + MAC_REG_TXDMACTL0+2, DMACTL_RUN);
bc5cf656 666
c3504bfd
JP
667 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
668 VNSvInPortB(dwIoBase + MAC_REG_TXDMACTL0, &byData);
669 if (!(byData & DMACTL_RUN))
670 break;
671 }
bc5cf656 672
c3504bfd 673 VNSvOutPortD(dwIoBase + MAC_REG_TXDMAPTR0, dwCurrDescAddr);
bc5cf656 674 if (byOrgDMACtl & DMACTL_RUN)
c3504bfd 675 VNSvOutPortB(dwIoBase + MAC_REG_TXDMACTL0, DMACTL_RUN);
5449c685
FB
676}
677
678/*
679 * Description:
680 * Set the chip with current AC0 descriptor address
681 *
682 * Parameters:
683 * In:
684 * dwIoBase - Base Address for MAC
685 * dwCurrDescAddr - Descriptor Address
686 * Out:
687 * none
688 *
689 * Return Value: none
690 *
691 */
9ab81fb7 692/* TxDMA1 = AC0DMA */
f9f853af 693void MACvSetCurrAC0DescAddrEx(struct vnt_private *priv,
d4855fe1 694 unsigned long dwCurrDescAddr)
5449c685 695{
f9f853af 696 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd
JP
697 unsigned short ww;
698 unsigned char byData;
699 unsigned char byOrgDMACtl;
700
701 VNSvInPortB(dwIoBase + MAC_REG_AC0DMACTL, &byOrgDMACtl);
bc5cf656 702 if (byOrgDMACtl & DMACTL_RUN)
c3504bfd 703 VNSvOutPortB(dwIoBase + MAC_REG_AC0DMACTL+2, DMACTL_RUN);
bc5cf656 704
c3504bfd
JP
705 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
706 VNSvInPortB(dwIoBase + MAC_REG_AC0DMACTL, &byData);
707 if (!(byData & DMACTL_RUN))
708 break;
709 }
4188e586 710 if (ww == W_MAX_TIMEOUT)
48caf5a0 711 pr_debug(" DBG_PORT80(0x26)\n");
c3504bfd 712 VNSvOutPortD(dwIoBase + MAC_REG_AC0DMAPTR, dwCurrDescAddr);
bc5cf656 713 if (byOrgDMACtl & DMACTL_RUN)
c3504bfd 714 VNSvOutPortB(dwIoBase + MAC_REG_AC0DMACTL, DMACTL_RUN);
5449c685
FB
715}
716
f9f853af 717void MACvSetCurrTXDescAddr(int iTxType, struct vnt_private *priv,
d4855fe1 718 unsigned long dwCurrDescAddr)
5449c685 719{
bc5cf656 720 if (iTxType == TYPE_AC0DMA)
f9f853af 721 MACvSetCurrAC0DescAddrEx(priv, dwCurrDescAddr);
bc5cf656 722 else if (iTxType == TYPE_TXDMA0)
f9f853af 723 MACvSetCurrTx0DescAddrEx(priv, dwCurrDescAddr);
5449c685
FB
724}
725
726/*
727 * Description:
728 * Micro Second Delay via MAC
729 *
730 * Parameters:
731 * In:
732 * dwIoBase - Base Address for MAC
733 * uDelay - Delay time (timer resolution is 4 us)
734 * Out:
735 * none
736 *
737 * Return Value: none
738 *
739 */
f9f853af 740void MACvTimer0MicroSDelay(struct vnt_private *priv, unsigned int uDelay)
5449c685 741{
f9f853af 742 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd
JP
743 unsigned char byValue;
744 unsigned int uu, ii;
745
746 VNSvOutPortB(dwIoBase + MAC_REG_TMCTL0, 0);
747 VNSvOutPortD(dwIoBase + MAC_REG_TMDATA0, uDelay);
748 VNSvOutPortB(dwIoBase + MAC_REG_TMCTL0, (TMCTL_TMD | TMCTL_TE));
9ab81fb7 749 for (ii = 0; ii < 66; ii++) { /* assume max PCI clock is 66Mhz */
c3504bfd
JP
750 for (uu = 0; uu < uDelay; uu++) {
751 VNSvInPortB(dwIoBase + MAC_REG_TMCTL0, &byValue);
752 if ((byValue == 0) ||
753 (byValue & TMCTL_TSUSP)) {
754 VNSvOutPortB(dwIoBase + MAC_REG_TMCTL0, 0);
755 return;
756 }
757 }
758 }
759 VNSvOutPortB(dwIoBase + MAC_REG_TMCTL0, 0);
5449c685
FB
760}
761
5449c685
FB
762/*
763 * Description:
764 * Micro Second One shot timer via MAC
765 *
766 * Parameters:
767 * In:
768 * dwIoBase - Base Address for MAC
769 * uDelay - Delay time
770 * Out:
771 * none
772 *
773 * Return Value: none
774 *
775 */
f9f853af 776void MACvOneShotTimer1MicroSec(struct vnt_private *priv, unsigned int uDelayTime)
5449c685 777{
f9f853af
MP
778 void __iomem *dwIoBase = priv->PortOffset;
779
c3504bfd
JP
780 VNSvOutPortB(dwIoBase + MAC_REG_TMCTL1, 0);
781 VNSvOutPortD(dwIoBase + MAC_REG_TMDATA1, uDelayTime);
782 VNSvOutPortB(dwIoBase + MAC_REG_TMCTL1, (TMCTL_TMD | TMCTL_TE));
5449c685
FB
783}
784
f9f853af 785void MACvSetMISCFifo(struct vnt_private *priv, unsigned short wOffset,
d4855fe1 786 unsigned long dwData)
5449c685 787{
f9f853af
MP
788 void __iomem *dwIoBase = priv->PortOffset;
789
c3504bfd
JP
790 if (wOffset > 273)
791 return;
792 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
793 VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
794 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
5449c685
FB
795}
796
f9f853af 797bool MACbPSWakeup(struct vnt_private *priv)
5449c685 798{
f9f853af 799 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd
JP
800 unsigned char byOrgValue;
801 unsigned int ww;
9ab81fb7 802 /* Read PSCTL */
f9f853af 803 if (MACbIsRegBitsOff(priv, MAC_REG_PSCTL, PSCTL_PS))
c3504bfd 804 return true;
bc5cf656 805
9ab81fb7 806 /* Disable PS */
c3504bfd
JP
807 MACvRegBitsOff(dwIoBase, MAC_REG_PSCTL, PSCTL_PSEN);
808
9ab81fb7 809 /* Check if SyncFlushOK */
c3504bfd 810 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
75b4d52b 811 VNSvInPortB(dwIoBase + MAC_REG_PSCTL, &byOrgValue);
c3504bfd
JP
812 if (byOrgValue & PSCTL_WAKEDONE)
813 break;
814 }
815 if (ww == W_MAX_TIMEOUT) {
48caf5a0 816 pr_debug(" DBG_PORT80(0x33)\n");
c3504bfd
JP
817 return false;
818 }
819 return true;
5449c685
FB
820}
821
822/*
823 * Description:
824 * Set the Key by MISCFIFO
825 *
826 * Parameters:
827 * In:
828 * dwIoBase - Base Address for MAC
829 *
830 * Out:
831 * none
832 *
833 * Return Value: none
834 *
835 */
836
f9f853af 837void MACvSetKeyEntry(struct vnt_private *priv, unsigned short wKeyCtl,
d4855fe1
GB
838 unsigned int uEntryIdx, unsigned int uKeyIdx,
839 unsigned char *pbyAddr, u32 *pdwKey,
840 unsigned char byLocalID)
5449c685 841{
f9f853af 842 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd 843 unsigned short wOffset;
4dbc77c0 844 u32 dwData;
c3504bfd
JP
845 int ii;
846
847 if (byLocalID <= 1)
848 return;
849
48caf5a0 850 pr_debug("MACvSetKeyEntry\n");
c3504bfd
JP
851 wOffset = MISCFIFO_KEYETRY0;
852 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
853
854 dwData = 0;
855 dwData |= wKeyCtl;
856 dwData <<= 16;
857 dwData |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5));
48caf5a0
JP
858 pr_debug("1. wOffset: %d, Data: %X, KeyCtl:%X\n",
859 wOffset, dwData, wKeyCtl);
c3504bfd
JP
860
861 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
862 VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
863 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
864 wOffset++;
865
866 dwData = 0;
867 dwData |= *(pbyAddr+3);
868 dwData <<= 8;
869 dwData |= *(pbyAddr+2);
870 dwData <<= 8;
871 dwData |= *(pbyAddr+1);
872 dwData <<= 8;
873 dwData |= *(pbyAddr+0);
48caf5a0 874 pr_debug("2. wOffset: %d, Data: %X\n", wOffset, dwData);
c3504bfd
JP
875
876 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
877 VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
878 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
879 wOffset++;
880
881 wOffset += (uKeyIdx * 4);
882 for (ii = 0; ii < 4; ii++) {
9ab81fb7 883 /* always push 128 bits */
48caf5a0
JP
884 pr_debug("3.(%d) wOffset: %d, Data: %X\n",
885 ii, wOffset+ii, *pdwKey);
c3504bfd
JP
886 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset+ii);
887 VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, *pdwKey++);
888 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
889 }
5449c685
FB
890}
891
5449c685
FB
892/*
893 * Description:
894 * Disable the Key Entry by MISCFIFO
895 *
896 * Parameters:
897 * In:
898 * dwIoBase - Base Address for MAC
899 *
900 * Out:
901 * none
902 *
903 * Return Value: none
904 *
905 */
f9f853af 906void MACvDisableKeyEntry(struct vnt_private *priv, unsigned int uEntryIdx)
5449c685 907{
f9f853af 908 void __iomem *dwIoBase = priv->PortOffset;
c3504bfd 909 unsigned short wOffset;
5449c685 910
c3504bfd
JP
911 wOffset = MISCFIFO_KEYETRY0;
912 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
5449c685 913
c3504bfd
JP
914 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
915 VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, 0);
916 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
5449c685 917}