2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
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.
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.
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.
22 * Purpose: MAC routines
29 * MACbIsRegBitsOn - Test if All test Bits On
30 * MACbIsRegBitsOff - Test if All test Bits Off
31 * MACbIsIntDisable - Test if MAC interrupt disable
32 * MACvSetShortRetryLimit - Set 802.11 Short Retry limit
33 * MACvSetLongRetryLimit - Set 802.11 Long Retry limit
34 * MACvSetLoopbackMode - Set MAC Loopback Mode
35 * MACvSaveContext - Save Context of MAC Registers
36 * MACvRestoreContext - Restore Context of MAC Registers
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
43 * MACvSetCurrRxDescAddr - Set Rx Descriptors Address
44 * MACvSetCurrTx0DescAddr - Set Tx0 Descriptors Address
45 * MACvSetCurrTx1DescAddr - Set Tx1 Descriptors Address
46 * MACvTimer0MicroSDelay - Micro Second Delay Loop by MAC
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
60 * Test if all test bits on
64 * io_base - Base Address for MAC
65 * byRegOfs - Offset of MAC Register
66 * byTestBits - Test bits
70 * Return Value: true if all test bits On; otherwise false
73 bool MACbIsRegBitsOn(struct vnt_private *priv, unsigned char byRegOfs,
74 unsigned char byTestBits)
76 void __iomem *io_base = priv->PortOffset;
78 return (ioread8(io_base + byRegOfs) & byTestBits) == byTestBits;
83 * Test if all test bits off
87 * io_base - Base Address for MAC
88 * byRegOfs - Offset of MAC Register
89 * byTestBits - Test bits
93 * Return Value: true if all test bits Off; otherwise false
96 bool MACbIsRegBitsOff(struct vnt_private *priv, unsigned char byRegOfs,
97 unsigned char byTestBits)
99 void __iomem *io_base = priv->PortOffset;
101 return !(ioread8(io_base + byRegOfs) & byTestBits);
106 * Test if MAC interrupt disable
110 * io_base - Base Address for MAC
114 * Return Value: true if interrupt is disable; otherwise false
117 bool MACbIsIntDisable(struct vnt_private *priv)
119 void __iomem *io_base = priv->PortOffset;
121 if (ioread32(io_base + MAC_REG_IMR))
129 * Set 802.11 Short Retry Limit
133 * io_base - Base Address for MAC
134 * byRetryLimit- Retry Limit
141 void MACvSetShortRetryLimit(struct vnt_private *priv, unsigned char byRetryLimit)
143 void __iomem *io_base = priv->PortOffset;
145 VNSvOutPortB(io_base + MAC_REG_SRT, byRetryLimit);
151 * Set 802.11 Long Retry Limit
155 * io_base - Base Address for MAC
156 * byRetryLimit- Retry Limit
163 void MACvSetLongRetryLimit(struct vnt_private *priv, unsigned char byRetryLimit)
165 void __iomem *io_base = priv->PortOffset;
167 VNSvOutPortB(io_base + MAC_REG_LRT, byRetryLimit);
172 * Set MAC Loopback mode
176 * io_base - Base Address for MAC
177 * byLoopbackMode - Loopback Mode
184 void MACvSetLoopbackMode(struct vnt_private *priv, unsigned char byLoopbackMode)
186 void __iomem *io_base = priv->PortOffset;
187 unsigned char byOrgValue;
189 byLoopbackMode <<= 6;
191 VNSvInPortB(io_base + MAC_REG_TEST, &byOrgValue);
192 byOrgValue = byOrgValue & 0x3F;
193 byOrgValue = byOrgValue | byLoopbackMode;
194 VNSvOutPortB(io_base + MAC_REG_TEST, byOrgValue);
199 * Save MAC registers to context buffer
203 * io_base - Base Address for MAC
205 * cxt_buf - Context buffer
210 void MACvSaveContext(struct vnt_private *priv, unsigned char *cxt_buf)
212 void __iomem *io_base = priv->PortOffset;
214 /* read page0 register */
215 memcpy_fromio(cxt_buf, io_base, MAC_MAX_CONTEXT_SIZE_PAGE0);
217 MACvSelectPage1(io_base);
219 /* read page1 register */
220 memcpy_fromio(cxt_buf + MAC_MAX_CONTEXT_SIZE_PAGE0, io_base,
221 MAC_MAX_CONTEXT_SIZE_PAGE1);
223 MACvSelectPage0(io_base);
228 * Restore MAC registers from context buffer
232 * io_base - Base Address for MAC
233 * cxt_buf - Context buffer
240 void MACvRestoreContext(struct vnt_private *priv, unsigned char *cxt_buf)
242 void __iomem *io_base = priv->PortOffset;
245 MACvSelectPage1(io_base);
247 for (ii = 0; ii < MAC_MAX_CONTEXT_SIZE_PAGE1; ii++)
248 VNSvOutPortB((io_base + ii),
249 *(cxt_buf + MAC_MAX_CONTEXT_SIZE_PAGE0 + ii));
251 MACvSelectPage0(io_base);
253 /* restore RCR,TCR,IMR... */
254 for (ii = MAC_REG_RCR; ii < MAC_REG_ISR; ii++)
255 VNSvOutPortB(io_base + ii, *(cxt_buf + ii));
257 /* restore MAC Config. */
258 for (ii = MAC_REG_LRT; ii < MAC_REG_PAGE1SEL; ii++)
259 VNSvOutPortB(io_base + ii, *(cxt_buf + ii));
261 VNSvOutPortB(io_base + MAC_REG_CFG, *(cxt_buf + MAC_REG_CFG));
263 /* restore PS Config. */
264 for (ii = MAC_REG_PSCFG; ii < MAC_REG_BBREGCTL; ii++)
265 VNSvOutPortB(io_base + ii, *(cxt_buf + ii));
267 /* restore CURR_RX_DESC_ADDR, CURR_TX_DESC_ADDR */
268 VNSvOutPortD(io_base + MAC_REG_TXDMAPTR0,
269 *(unsigned long *)(cxt_buf + MAC_REG_TXDMAPTR0));
270 VNSvOutPortD(io_base + MAC_REG_AC0DMAPTR,
271 *(unsigned long *)(cxt_buf + MAC_REG_AC0DMAPTR));
272 VNSvOutPortD(io_base + MAC_REG_BCNDMAPTR,
273 *(unsigned long *)(cxt_buf + MAC_REG_BCNDMAPTR));
275 VNSvOutPortD(io_base + MAC_REG_RXDMAPTR0,
276 *(unsigned long *)(cxt_buf + MAC_REG_RXDMAPTR0));
278 VNSvOutPortD(io_base + MAC_REG_RXDMAPTR1,
279 *(unsigned long *)(cxt_buf + MAC_REG_RXDMAPTR1));
288 * io_base - Base Address for MAC
292 * Return Value: true if Reset Success; otherwise false
295 bool MACbSoftwareReset(struct vnt_private *priv)
297 void __iomem *io_base = priv->PortOffset;
300 /* turn on HOSTCR_SOFTRST, just write 0x01 to reset */
301 VNSvOutPortB(io_base + MAC_REG_HOSTCR, 0x01);
303 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
304 if (!(ioread8(io_base + MAC_REG_HOSTCR) & HOSTCR_SOFTRST))
307 if (ww == W_MAX_TIMEOUT)
314 * save some important register's value, then do reset, then restore register's value
318 * io_base - Base Address for MAC
322 * Return Value: true if success; otherwise false
325 bool MACbSafeSoftwareReset(struct vnt_private *priv)
327 unsigned char abyTmpRegData[MAC_MAX_CONTEXT_SIZE_PAGE0+MAC_MAX_CONTEXT_SIZE_PAGE1];
331 * save some important register's value, then do
332 * reset, then restore register's value
334 /* save MAC context */
335 MACvSaveContext(priv, abyTmpRegData);
337 bRetVal = MACbSoftwareReset(priv);
338 /* restore MAC context, except CR0 */
339 MACvRestoreContext(priv, abyTmpRegData);
350 * io_base - Base Address for MAC
354 * Return Value: true if success; otherwise false
357 bool MACbSafeRxOff(struct vnt_private *priv)
359 void __iomem *io_base = priv->PortOffset;
362 /* turn off wow temp for turn off Rx safely */
364 /* Clear RX DMA0,1 */
365 VNSvOutPortD(io_base + MAC_REG_RXDMACTL0, DMACTL_CLRRUN);
366 VNSvOutPortD(io_base + MAC_REG_RXDMACTL1, DMACTL_CLRRUN);
367 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
368 if (!(ioread32(io_base + MAC_REG_RXDMACTL0) & DMACTL_RUN))
371 if (ww == W_MAX_TIMEOUT) {
372 pr_debug(" DBG_PORT80(0x10)\n");
375 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
376 if (!(ioread32(io_base + MAC_REG_RXDMACTL1) & DMACTL_RUN))
379 if (ww == W_MAX_TIMEOUT) {
380 pr_debug(" DBG_PORT80(0x11)\n");
384 /* try to safe shutdown RX */
385 MACvRegBitsOff(io_base, MAC_REG_HOSTCR, HOSTCR_RXON);
386 /* W_MAX_TIMEOUT is the timeout period */
387 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
388 if (!(ioread8(io_base + MAC_REG_HOSTCR) & HOSTCR_RXONST))
391 if (ww == W_MAX_TIMEOUT) {
392 pr_debug(" DBG_PORT80(0x12)\n");
404 * io_base - Base Address for MAC
408 * Return Value: true if success; otherwise false
411 bool MACbSafeTxOff(struct vnt_private *priv)
413 void __iomem *io_base = priv->PortOffset;
418 VNSvOutPortD(io_base + MAC_REG_TXDMACTL0, DMACTL_CLRRUN);
420 VNSvOutPortD(io_base + MAC_REG_AC0DMACTL, DMACTL_CLRRUN);
422 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
423 if (!(ioread32(io_base + MAC_REG_TXDMACTL0) & DMACTL_RUN))
426 if (ww == W_MAX_TIMEOUT) {
427 pr_debug(" DBG_PORT80(0x20)\n");
430 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
431 if (!(ioread32(io_base + MAC_REG_AC0DMACTL) & DMACTL_RUN))
434 if (ww == W_MAX_TIMEOUT) {
435 pr_debug(" DBG_PORT80(0x21)\n");
439 /* try to safe shutdown TX */
440 MACvRegBitsOff(io_base, MAC_REG_HOSTCR, HOSTCR_TXON);
442 /* W_MAX_TIMEOUT is the timeout period */
443 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
444 if (!(ioread8(io_base + MAC_REG_HOSTCR) & HOSTCR_TXONST))
447 if (ww == W_MAX_TIMEOUT) {
448 pr_debug(" DBG_PORT80(0x24)\n");
460 * io_base - Base Address for MAC
464 * Return Value: true if success; otherwise false
467 bool MACbSafeStop(struct vnt_private *priv)
469 void __iomem *io_base = priv->PortOffset;
471 MACvRegBitsOff(io_base, MAC_REG_TCR, TCR_AUTOBCNTX);
473 if (!MACbSafeRxOff(priv)) {
474 pr_debug(" MACbSafeRxOff == false)\n");
475 MACbSafeSoftwareReset(priv);
478 if (!MACbSafeTxOff(priv)) {
479 pr_debug(" MACbSafeTxOff == false)\n");
480 MACbSafeSoftwareReset(priv);
484 MACvRegBitsOff(io_base, MAC_REG_HOSTCR, HOSTCR_MACEN);
495 * io_base - Base Address for MAC
499 * Return Value: true if success; otherwise false
502 bool MACbShutdown(struct vnt_private *priv)
504 void __iomem *io_base = priv->PortOffset;
505 /* disable MAC IMR */
506 MACvIntDisable(io_base);
507 MACvSetLoopbackMode(priv, MAC_LB_INTERNAL);
508 /* stop the adapter */
509 if (!MACbSafeStop(priv)) {
510 MACvSetLoopbackMode(priv, MAC_LB_NONE);
513 MACvSetLoopbackMode(priv, MAC_LB_NONE);
523 * io_base - Base Address for MAC
530 void MACvInitialize(struct vnt_private *priv)
532 void __iomem *io_base = priv->PortOffset;
533 /* clear sticky bits */
534 MACvClearStckDS(io_base);
535 /* disable force PME-enable */
536 VNSvOutPortB(io_base + MAC_REG_PMC1, PME_OVR);
540 MACbSoftwareReset(priv);
542 /* reset TSF counter */
543 VNSvOutPortB(io_base + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
544 /* enable TSF counter */
545 VNSvOutPortB(io_base + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
550 * Set the chip with current rx descriptor address
554 * io_base - Base Address for MAC
555 * dwCurrDescAddr - Descriptor Address
562 void MACvSetCurrRx0DescAddr(struct vnt_private *priv, unsigned long dwCurrDescAddr)
564 void __iomem *io_base = priv->PortOffset;
566 unsigned char byOrgDMACtl;
568 VNSvInPortB(io_base + MAC_REG_RXDMACTL0, &byOrgDMACtl);
569 if (byOrgDMACtl & DMACTL_RUN)
570 VNSvOutPortB(io_base + MAC_REG_RXDMACTL0+2, DMACTL_RUN);
572 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
573 if (!(ioread8(io_base + MAC_REG_RXDMACTL0) & DMACTL_RUN))
577 VNSvOutPortD(io_base + MAC_REG_RXDMAPTR0, dwCurrDescAddr);
578 if (byOrgDMACtl & DMACTL_RUN)
579 VNSvOutPortB(io_base + MAC_REG_RXDMACTL0, DMACTL_RUN);
584 * Set the chip with current rx descriptor address
588 * io_base - Base Address for MAC
589 * dwCurrDescAddr - Descriptor Address
596 void MACvSetCurrRx1DescAddr(struct vnt_private *priv, unsigned long dwCurrDescAddr)
598 void __iomem *io_base = priv->PortOffset;
600 unsigned char byOrgDMACtl;
602 VNSvInPortB(io_base + MAC_REG_RXDMACTL1, &byOrgDMACtl);
603 if (byOrgDMACtl & DMACTL_RUN)
604 VNSvOutPortB(io_base + MAC_REG_RXDMACTL1+2, DMACTL_RUN);
606 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
607 if (!(ioread8(io_base + MAC_REG_RXDMACTL1) & DMACTL_RUN))
611 VNSvOutPortD(io_base + MAC_REG_RXDMAPTR1, dwCurrDescAddr);
612 if (byOrgDMACtl & DMACTL_RUN)
613 VNSvOutPortB(io_base + MAC_REG_RXDMACTL1, DMACTL_RUN);
619 * Set the chip with current tx0 descriptor address
623 * io_base - Base Address for MAC
624 * dwCurrDescAddr - Descriptor Address
631 void MACvSetCurrTx0DescAddrEx(struct vnt_private *priv,
632 unsigned long dwCurrDescAddr)
634 void __iomem *io_base = priv->PortOffset;
636 unsigned char byOrgDMACtl;
638 VNSvInPortB(io_base + MAC_REG_TXDMACTL0, &byOrgDMACtl);
639 if (byOrgDMACtl & DMACTL_RUN)
640 VNSvOutPortB(io_base + MAC_REG_TXDMACTL0+2, DMACTL_RUN);
642 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
643 if (!(ioread8(io_base + MAC_REG_TXDMACTL0) & DMACTL_RUN))
647 VNSvOutPortD(io_base + MAC_REG_TXDMAPTR0, dwCurrDescAddr);
648 if (byOrgDMACtl & DMACTL_RUN)
649 VNSvOutPortB(io_base + MAC_REG_TXDMACTL0, DMACTL_RUN);
654 * Set the chip with current AC0 descriptor address
658 * io_base - Base Address for MAC
659 * dwCurrDescAddr - Descriptor Address
666 /* TxDMA1 = AC0DMA */
667 void MACvSetCurrAC0DescAddrEx(struct vnt_private *priv,
668 unsigned long dwCurrDescAddr)
670 void __iomem *io_base = priv->PortOffset;
672 unsigned char byOrgDMACtl;
674 VNSvInPortB(io_base + MAC_REG_AC0DMACTL, &byOrgDMACtl);
675 if (byOrgDMACtl & DMACTL_RUN)
676 VNSvOutPortB(io_base + MAC_REG_AC0DMACTL+2, DMACTL_RUN);
678 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
679 if (!(ioread8(io_base + MAC_REG_AC0DMACTL) & DMACTL_RUN))
682 if (ww == W_MAX_TIMEOUT)
683 pr_debug(" DBG_PORT80(0x26)\n");
684 VNSvOutPortD(io_base + MAC_REG_AC0DMAPTR, dwCurrDescAddr);
685 if (byOrgDMACtl & DMACTL_RUN)
686 VNSvOutPortB(io_base + MAC_REG_AC0DMACTL, DMACTL_RUN);
689 void MACvSetCurrTXDescAddr(int iTxType, struct vnt_private *priv,
690 unsigned long dwCurrDescAddr)
692 if (iTxType == TYPE_AC0DMA)
693 MACvSetCurrAC0DescAddrEx(priv, dwCurrDescAddr);
694 else if (iTxType == TYPE_TXDMA0)
695 MACvSetCurrTx0DescAddrEx(priv, dwCurrDescAddr);
700 * Micro Second Delay via MAC
704 * io_base - Base Address for MAC
705 * uDelay - Delay time (timer resolution is 4 us)
712 void MACvTimer0MicroSDelay(struct vnt_private *priv, unsigned int uDelay)
714 void __iomem *io_base = priv->PortOffset;
715 unsigned char byValue;
718 VNSvOutPortB(io_base + MAC_REG_TMCTL0, 0);
719 VNSvOutPortD(io_base + MAC_REG_TMDATA0, uDelay);
720 VNSvOutPortB(io_base + MAC_REG_TMCTL0, (TMCTL_TMD | TMCTL_TE));
721 for (ii = 0; ii < 66; ii++) { /* assume max PCI clock is 66Mhz */
722 for (uu = 0; uu < uDelay; uu++) {
723 VNSvInPortB(io_base + MAC_REG_TMCTL0, &byValue);
724 if ((byValue == 0) ||
725 (byValue & TMCTL_TSUSP)) {
726 VNSvOutPortB(io_base + MAC_REG_TMCTL0, 0);
731 VNSvOutPortB(io_base + MAC_REG_TMCTL0, 0);
736 * Micro Second One shot timer via MAC
740 * io_base - Base Address for MAC
741 * uDelay - Delay time
748 void MACvOneShotTimer1MicroSec(struct vnt_private *priv, unsigned int uDelayTime)
750 void __iomem *io_base = priv->PortOffset;
752 VNSvOutPortB(io_base + MAC_REG_TMCTL1, 0);
753 VNSvOutPortD(io_base + MAC_REG_TMDATA1, uDelayTime);
754 VNSvOutPortB(io_base + MAC_REG_TMCTL1, (TMCTL_TMD | TMCTL_TE));
757 void MACvSetMISCFifo(struct vnt_private *priv, unsigned short wOffset,
758 unsigned long dwData)
760 void __iomem *io_base = priv->PortOffset;
764 VNSvOutPortW(io_base + MAC_REG_MISCFFNDEX, wOffset);
765 VNSvOutPortD(io_base + MAC_REG_MISCFFDATA, dwData);
766 VNSvOutPortW(io_base + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
769 bool MACbPSWakeup(struct vnt_private *priv)
771 void __iomem *io_base = priv->PortOffset;
772 unsigned char byOrgValue;
775 if (MACbIsRegBitsOff(priv, MAC_REG_PSCTL, PSCTL_PS))
779 MACvRegBitsOff(io_base, MAC_REG_PSCTL, PSCTL_PSEN);
781 /* Check if SyncFlushOK */
782 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
783 VNSvInPortB(io_base + MAC_REG_PSCTL, &byOrgValue);
784 if (byOrgValue & PSCTL_WAKEDONE)
787 if (ww == W_MAX_TIMEOUT) {
788 pr_debug(" DBG_PORT80(0x33)\n");
796 * Set the Key by MISCFIFO
800 * io_base - Base Address for MAC
809 void MACvSetKeyEntry(struct vnt_private *priv, unsigned short wKeyCtl,
810 unsigned int uEntryIdx, unsigned int uKeyIdx,
811 unsigned char *pbyAddr, u32 *pdwKey,
812 unsigned char byLocalID)
814 void __iomem *io_base = priv->PortOffset;
815 unsigned short wOffset;
822 pr_debug("MACvSetKeyEntry\n");
823 wOffset = MISCFIFO_KEYETRY0;
824 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
829 dwData |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5));
830 pr_debug("1. wOffset: %d, Data: %X, KeyCtl:%X\n",
831 wOffset, dwData, wKeyCtl);
833 VNSvOutPortW(io_base + MAC_REG_MISCFFNDEX, wOffset);
834 VNSvOutPortD(io_base + MAC_REG_MISCFFDATA, dwData);
835 VNSvOutPortW(io_base + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
839 dwData |= *(pbyAddr+3);
841 dwData |= *(pbyAddr+2);
843 dwData |= *(pbyAddr+1);
845 dwData |= *(pbyAddr+0);
846 pr_debug("2. wOffset: %d, Data: %X\n", wOffset, dwData);
848 VNSvOutPortW(io_base + MAC_REG_MISCFFNDEX, wOffset);
849 VNSvOutPortD(io_base + MAC_REG_MISCFFDATA, dwData);
850 VNSvOutPortW(io_base + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
853 wOffset += (uKeyIdx * 4);
854 for (ii = 0; ii < 4; ii++) {
855 /* always push 128 bits */
856 pr_debug("3.(%d) wOffset: %d, Data: %X\n",
857 ii, wOffset+ii, *pdwKey);
858 VNSvOutPortW(io_base + MAC_REG_MISCFFNDEX, wOffset+ii);
859 VNSvOutPortD(io_base + MAC_REG_MISCFFDATA, *pdwKey++);
860 VNSvOutPortW(io_base + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
866 * Disable the Key Entry by MISCFIFO
870 * io_base - Base Address for MAC
878 void MACvDisableKeyEntry(struct vnt_private *priv, unsigned int uEntryIdx)
880 void __iomem *io_base = priv->PortOffset;
881 unsigned short wOffset;
883 wOffset = MISCFIFO_KEYETRY0;
884 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
886 VNSvOutPortW(io_base + MAC_REG_MISCFFNDEX, wOffset);
887 VNSvOutPortD(io_base + MAC_REG_MISCFFDATA, 0);
888 VNSvOutPortW(io_base + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);