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
;
244 MACvSelectPage1(io_base
);
246 memcpy_toio(io_base
, cxt_buf
+ MAC_MAX_CONTEXT_SIZE_PAGE0
,
247 MAC_MAX_CONTEXT_SIZE_PAGE1
);
249 MACvSelectPage0(io_base
);
251 /* restore RCR,TCR,IMR... */
252 memcpy_toio(io_base
+ MAC_REG_RCR
, cxt_buf
+ MAC_REG_RCR
,
253 MAC_REG_ISR
- MAC_REG_RCR
);
255 /* restore MAC Config. */
256 memcpy_toio(io_base
+ MAC_REG_LRT
, cxt_buf
+ MAC_REG_LRT
,
257 MAC_REG_PAGE1SEL
- MAC_REG_LRT
);
259 VNSvOutPortB(io_base
+ MAC_REG_CFG
, *(cxt_buf
+ MAC_REG_CFG
));
261 /* restore PS Config. */
262 memcpy_toio(io_base
+ MAC_REG_PSCFG
, cxt_buf
+ MAC_REG_PSCFG
,
263 MAC_REG_BBREGCTL
- MAC_REG_PSCFG
);
265 /* restore CURR_RX_DESC_ADDR, CURR_TX_DESC_ADDR */
266 iowrite32(*(u32
*)(cxt_buf
+ MAC_REG_TXDMAPTR0
),
267 io_base
+ MAC_REG_TXDMAPTR0
);
268 iowrite32(*(u32
*)(cxt_buf
+ MAC_REG_AC0DMAPTR
),
269 io_base
+ MAC_REG_AC0DMAPTR
);
270 iowrite32(*(u32
*)(cxt_buf
+ MAC_REG_BCNDMAPTR
),
271 io_base
+ MAC_REG_BCNDMAPTR
);
272 iowrite32(*(u32
*)(cxt_buf
+ MAC_REG_RXDMAPTR0
),
273 io_base
+ MAC_REG_RXDMAPTR0
);
274 iowrite32(*(u32
*)(cxt_buf
+ MAC_REG_RXDMAPTR1
),
275 io_base
+ MAC_REG_RXDMAPTR1
);
284 * io_base - Base Address for MAC
288 * Return Value: true if Reset Success; otherwise false
291 bool MACbSoftwareReset(struct vnt_private
*priv
)
293 void __iomem
*io_base
= priv
->PortOffset
;
296 /* turn on HOSTCR_SOFTRST, just write 0x01 to reset */
297 VNSvOutPortB(io_base
+ MAC_REG_HOSTCR
, 0x01);
299 for (ww
= 0; ww
< W_MAX_TIMEOUT
; ww
++) {
300 if (!(ioread8(io_base
+ MAC_REG_HOSTCR
) & HOSTCR_SOFTRST
))
303 if (ww
== W_MAX_TIMEOUT
)
310 * save some important register's value, then do reset, then restore register's value
314 * io_base - Base Address for MAC
318 * Return Value: true if success; otherwise false
321 bool MACbSafeSoftwareReset(struct vnt_private
*priv
)
323 unsigned char abyTmpRegData
[MAC_MAX_CONTEXT_SIZE_PAGE0
+MAC_MAX_CONTEXT_SIZE_PAGE1
];
327 * save some important register's value, then do
328 * reset, then restore register's value
330 /* save MAC context */
331 MACvSaveContext(priv
, abyTmpRegData
);
333 bRetVal
= MACbSoftwareReset(priv
);
334 /* restore MAC context, except CR0 */
335 MACvRestoreContext(priv
, abyTmpRegData
);
346 * io_base - Base Address for MAC
350 * Return Value: true if success; otherwise false
353 bool MACbSafeRxOff(struct vnt_private
*priv
)
355 void __iomem
*io_base
= priv
->PortOffset
;
358 /* turn off wow temp for turn off Rx safely */
360 /* Clear RX DMA0,1 */
361 iowrite32(DMACTL_CLRRUN
, io_base
+ MAC_REG_RXDMACTL0
);
362 iowrite32(DMACTL_CLRRUN
, io_base
+ MAC_REG_RXDMACTL1
);
363 for (ww
= 0; ww
< W_MAX_TIMEOUT
; ww
++) {
364 if (!(ioread32(io_base
+ MAC_REG_RXDMACTL0
) & DMACTL_RUN
))
367 if (ww
== W_MAX_TIMEOUT
) {
368 pr_debug(" DBG_PORT80(0x10)\n");
371 for (ww
= 0; ww
< W_MAX_TIMEOUT
; ww
++) {
372 if (!(ioread32(io_base
+ MAC_REG_RXDMACTL1
) & DMACTL_RUN
))
375 if (ww
== W_MAX_TIMEOUT
) {
376 pr_debug(" DBG_PORT80(0x11)\n");
380 /* try to safe shutdown RX */
381 MACvRegBitsOff(io_base
, MAC_REG_HOSTCR
, HOSTCR_RXON
);
382 /* W_MAX_TIMEOUT is the timeout period */
383 for (ww
= 0; ww
< W_MAX_TIMEOUT
; ww
++) {
384 if (!(ioread8(io_base
+ MAC_REG_HOSTCR
) & HOSTCR_RXONST
))
387 if (ww
== W_MAX_TIMEOUT
) {
388 pr_debug(" DBG_PORT80(0x12)\n");
400 * io_base - Base Address for MAC
404 * Return Value: true if success; otherwise false
407 bool MACbSafeTxOff(struct vnt_private
*priv
)
409 void __iomem
*io_base
= priv
->PortOffset
;
414 iowrite32(DMACTL_CLRRUN
, io_base
+ MAC_REG_TXDMACTL0
);
416 iowrite32(DMACTL_CLRRUN
, io_base
+ MAC_REG_AC0DMACTL
);
418 for (ww
= 0; ww
< W_MAX_TIMEOUT
; ww
++) {
419 if (!(ioread32(io_base
+ MAC_REG_TXDMACTL0
) & DMACTL_RUN
))
422 if (ww
== W_MAX_TIMEOUT
) {
423 pr_debug(" DBG_PORT80(0x20)\n");
426 for (ww
= 0; ww
< W_MAX_TIMEOUT
; ww
++) {
427 if (!(ioread32(io_base
+ MAC_REG_AC0DMACTL
) & DMACTL_RUN
))
430 if (ww
== W_MAX_TIMEOUT
) {
431 pr_debug(" DBG_PORT80(0x21)\n");
435 /* try to safe shutdown TX */
436 MACvRegBitsOff(io_base
, MAC_REG_HOSTCR
, HOSTCR_TXON
);
438 /* W_MAX_TIMEOUT is the timeout period */
439 for (ww
= 0; ww
< W_MAX_TIMEOUT
; ww
++) {
440 if (!(ioread8(io_base
+ MAC_REG_HOSTCR
) & HOSTCR_TXONST
))
443 if (ww
== W_MAX_TIMEOUT
) {
444 pr_debug(" DBG_PORT80(0x24)\n");
456 * io_base - Base Address for MAC
460 * Return Value: true if success; otherwise false
463 bool MACbSafeStop(struct vnt_private
*priv
)
465 void __iomem
*io_base
= priv
->PortOffset
;
467 MACvRegBitsOff(io_base
, MAC_REG_TCR
, TCR_AUTOBCNTX
);
469 if (!MACbSafeRxOff(priv
)) {
470 pr_debug(" MACbSafeRxOff == false)\n");
471 MACbSafeSoftwareReset(priv
);
474 if (!MACbSafeTxOff(priv
)) {
475 pr_debug(" MACbSafeTxOff == false)\n");
476 MACbSafeSoftwareReset(priv
);
480 MACvRegBitsOff(io_base
, MAC_REG_HOSTCR
, HOSTCR_MACEN
);
491 * io_base - Base Address for MAC
495 * Return Value: true if success; otherwise false
498 bool MACbShutdown(struct vnt_private
*priv
)
500 void __iomem
*io_base
= priv
->PortOffset
;
501 /* disable MAC IMR */
502 MACvIntDisable(io_base
);
503 MACvSetLoopbackMode(priv
, MAC_LB_INTERNAL
);
504 /* stop the adapter */
505 if (!MACbSafeStop(priv
)) {
506 MACvSetLoopbackMode(priv
, MAC_LB_NONE
);
509 MACvSetLoopbackMode(priv
, MAC_LB_NONE
);
519 * io_base - Base Address for MAC
526 void MACvInitialize(struct vnt_private
*priv
)
528 void __iomem
*io_base
= priv
->PortOffset
;
529 /* clear sticky bits */
530 MACvClearStckDS(io_base
);
531 /* disable force PME-enable */
532 VNSvOutPortB(io_base
+ MAC_REG_PMC1
, PME_OVR
);
536 MACbSoftwareReset(priv
);
538 /* reset TSF counter */
539 VNSvOutPortB(io_base
+ MAC_REG_TFTCTL
, TFTCTL_TSFCNTRST
);
540 /* enable TSF counter */
541 VNSvOutPortB(io_base
+ MAC_REG_TFTCTL
, TFTCTL_TSFCNTREN
);
546 * Set the chip with current rx descriptor address
550 * io_base - Base Address for MAC
551 * dwCurrDescAddr - Descriptor Address
558 void MACvSetCurrRx0DescAddr(struct vnt_private
*priv
, u32 dwCurrDescAddr
)
560 void __iomem
*io_base
= priv
->PortOffset
;
562 unsigned char byOrgDMACtl
;
564 VNSvInPortB(io_base
+ MAC_REG_RXDMACTL0
, &byOrgDMACtl
);
565 if (byOrgDMACtl
& DMACTL_RUN
)
566 VNSvOutPortB(io_base
+ MAC_REG_RXDMACTL0
+2, DMACTL_RUN
);
568 for (ww
= 0; ww
< W_MAX_TIMEOUT
; ww
++) {
569 if (!(ioread8(io_base
+ MAC_REG_RXDMACTL0
) & DMACTL_RUN
))
573 iowrite32(dwCurrDescAddr
, io_base
+ MAC_REG_RXDMAPTR0
);
574 if (byOrgDMACtl
& DMACTL_RUN
)
575 VNSvOutPortB(io_base
+ MAC_REG_RXDMACTL0
, DMACTL_RUN
);
580 * Set the chip with current rx descriptor address
584 * io_base - Base Address for MAC
585 * dwCurrDescAddr - Descriptor Address
592 void MACvSetCurrRx1DescAddr(struct vnt_private
*priv
, u32 dwCurrDescAddr
)
594 void __iomem
*io_base
= priv
->PortOffset
;
596 unsigned char byOrgDMACtl
;
598 VNSvInPortB(io_base
+ MAC_REG_RXDMACTL1
, &byOrgDMACtl
);
599 if (byOrgDMACtl
& DMACTL_RUN
)
600 VNSvOutPortB(io_base
+ MAC_REG_RXDMACTL1
+2, DMACTL_RUN
);
602 for (ww
= 0; ww
< W_MAX_TIMEOUT
; ww
++) {
603 if (!(ioread8(io_base
+ MAC_REG_RXDMACTL1
) & DMACTL_RUN
))
607 iowrite32(dwCurrDescAddr
, io_base
+ MAC_REG_RXDMAPTR1
);
608 if (byOrgDMACtl
& DMACTL_RUN
)
609 VNSvOutPortB(io_base
+ MAC_REG_RXDMACTL1
, DMACTL_RUN
);
615 * Set the chip with current tx0 descriptor address
619 * io_base - Base Address for MAC
620 * dwCurrDescAddr - Descriptor Address
627 void MACvSetCurrTx0DescAddrEx(struct vnt_private
*priv
,
630 void __iomem
*io_base
= priv
->PortOffset
;
632 unsigned char byOrgDMACtl
;
634 VNSvInPortB(io_base
+ MAC_REG_TXDMACTL0
, &byOrgDMACtl
);
635 if (byOrgDMACtl
& DMACTL_RUN
)
636 VNSvOutPortB(io_base
+ MAC_REG_TXDMACTL0
+2, DMACTL_RUN
);
638 for (ww
= 0; ww
< W_MAX_TIMEOUT
; ww
++) {
639 if (!(ioread8(io_base
+ MAC_REG_TXDMACTL0
) & DMACTL_RUN
))
643 iowrite32(dwCurrDescAddr
, io_base
+ MAC_REG_TXDMAPTR0
);
644 if (byOrgDMACtl
& DMACTL_RUN
)
645 VNSvOutPortB(io_base
+ MAC_REG_TXDMACTL0
, DMACTL_RUN
);
650 * Set the chip with current AC0 descriptor address
654 * io_base - Base Address for MAC
655 * dwCurrDescAddr - Descriptor Address
662 /* TxDMA1 = AC0DMA */
663 void MACvSetCurrAC0DescAddrEx(struct vnt_private
*priv
,
666 void __iomem
*io_base
= priv
->PortOffset
;
668 unsigned char byOrgDMACtl
;
670 VNSvInPortB(io_base
+ MAC_REG_AC0DMACTL
, &byOrgDMACtl
);
671 if (byOrgDMACtl
& DMACTL_RUN
)
672 VNSvOutPortB(io_base
+ MAC_REG_AC0DMACTL
+2, DMACTL_RUN
);
674 for (ww
= 0; ww
< W_MAX_TIMEOUT
; ww
++) {
675 if (!(ioread8(io_base
+ MAC_REG_AC0DMACTL
) & DMACTL_RUN
))
678 if (ww
== W_MAX_TIMEOUT
)
679 pr_debug(" DBG_PORT80(0x26)\n");
680 iowrite32(dwCurrDescAddr
, io_base
+ MAC_REG_AC0DMAPTR
);
681 if (byOrgDMACtl
& DMACTL_RUN
)
682 VNSvOutPortB(io_base
+ MAC_REG_AC0DMACTL
, DMACTL_RUN
);
685 void MACvSetCurrTXDescAddr(int iTxType
, struct vnt_private
*priv
,
688 if (iTxType
== TYPE_AC0DMA
)
689 MACvSetCurrAC0DescAddrEx(priv
, dwCurrDescAddr
);
690 else if (iTxType
== TYPE_TXDMA0
)
691 MACvSetCurrTx0DescAddrEx(priv
, dwCurrDescAddr
);
696 * Micro Second Delay via MAC
700 * io_base - Base Address for MAC
701 * uDelay - Delay time (timer resolution is 4 us)
708 void MACvTimer0MicroSDelay(struct vnt_private
*priv
, unsigned int uDelay
)
710 void __iomem
*io_base
= priv
->PortOffset
;
711 unsigned char byValue
;
714 VNSvOutPortB(io_base
+ MAC_REG_TMCTL0
, 0);
715 iowrite32(uDelay
, io_base
+ MAC_REG_TMDATA0
);
716 VNSvOutPortB(io_base
+ MAC_REG_TMCTL0
, (TMCTL_TMD
| TMCTL_TE
));
717 for (ii
= 0; ii
< 66; ii
++) { /* assume max PCI clock is 66Mhz */
718 for (uu
= 0; uu
< uDelay
; uu
++) {
719 VNSvInPortB(io_base
+ MAC_REG_TMCTL0
, &byValue
);
720 if ((byValue
== 0) ||
721 (byValue
& TMCTL_TSUSP
)) {
722 VNSvOutPortB(io_base
+ MAC_REG_TMCTL0
, 0);
727 VNSvOutPortB(io_base
+ MAC_REG_TMCTL0
, 0);
732 * Micro Second One shot timer via MAC
736 * io_base - Base Address for MAC
737 * uDelay - Delay time
744 void MACvOneShotTimer1MicroSec(struct vnt_private
*priv
, unsigned int uDelayTime
)
746 void __iomem
*io_base
= priv
->PortOffset
;
748 VNSvOutPortB(io_base
+ MAC_REG_TMCTL1
, 0);
749 iowrite32(uDelayTime
, io_base
+ MAC_REG_TMDATA1
);
750 VNSvOutPortB(io_base
+ MAC_REG_TMCTL1
, (TMCTL_TMD
| TMCTL_TE
));
753 void MACvSetMISCFifo(struct vnt_private
*priv
, unsigned short wOffset
,
756 void __iomem
*io_base
= priv
->PortOffset
;
760 iowrite16(wOffset
, io_base
+ MAC_REG_MISCFFNDEX
);
761 iowrite32(dwData
, io_base
+ MAC_REG_MISCFFDATA
);
762 iowrite16(MISCFFCTL_WRITE
, io_base
+ MAC_REG_MISCFFCTL
);
765 bool MACbPSWakeup(struct vnt_private
*priv
)
767 void __iomem
*io_base
= priv
->PortOffset
;
768 unsigned char byOrgValue
;
771 if (MACbIsRegBitsOff(priv
, MAC_REG_PSCTL
, PSCTL_PS
))
775 MACvRegBitsOff(io_base
, MAC_REG_PSCTL
, PSCTL_PSEN
);
777 /* Check if SyncFlushOK */
778 for (ww
= 0; ww
< W_MAX_TIMEOUT
; ww
++) {
779 VNSvInPortB(io_base
+ MAC_REG_PSCTL
, &byOrgValue
);
780 if (byOrgValue
& PSCTL_WAKEDONE
)
783 if (ww
== W_MAX_TIMEOUT
) {
784 pr_debug(" DBG_PORT80(0x33)\n");
792 * Set the Key by MISCFIFO
796 * io_base - Base Address for MAC
805 void MACvSetKeyEntry(struct vnt_private
*priv
, unsigned short wKeyCtl
,
806 unsigned int uEntryIdx
, unsigned int uKeyIdx
,
807 unsigned char *pbyAddr
, u32
*pdwKey
,
808 unsigned char byLocalID
)
810 void __iomem
*io_base
= priv
->PortOffset
;
811 unsigned short wOffset
;
818 pr_debug("MACvSetKeyEntry\n");
819 wOffset
= MISCFIFO_KEYETRY0
;
820 wOffset
+= (uEntryIdx
* MISCFIFO_KEYENTRYSIZE
);
825 dwData
|= MAKEWORD(*(pbyAddr
+4), *(pbyAddr
+5));
826 pr_debug("1. wOffset: %d, Data: %X, KeyCtl:%X\n",
827 wOffset
, dwData
, wKeyCtl
);
829 iowrite16(wOffset
, io_base
+ MAC_REG_MISCFFNDEX
);
830 iowrite32(dwData
, io_base
+ MAC_REG_MISCFFDATA
);
831 iowrite16(MISCFFCTL_WRITE
, io_base
+ MAC_REG_MISCFFCTL
);
835 dwData
|= *(pbyAddr
+3);
837 dwData
|= *(pbyAddr
+2);
839 dwData
|= *(pbyAddr
+1);
841 dwData
|= *(pbyAddr
+0);
842 pr_debug("2. wOffset: %d, Data: %X\n", wOffset
, dwData
);
844 iowrite16(wOffset
, io_base
+ MAC_REG_MISCFFNDEX
);
845 iowrite32(dwData
, io_base
+ MAC_REG_MISCFFDATA
);
846 iowrite16(MISCFFCTL_WRITE
, io_base
+ MAC_REG_MISCFFCTL
);
849 wOffset
+= (uKeyIdx
* 4);
850 for (ii
= 0; ii
< 4; ii
++) {
851 /* always push 128 bits */
852 pr_debug("3.(%d) wOffset: %d, Data: %X\n",
853 ii
, wOffset
+ii
, *pdwKey
);
854 iowrite16(wOffset
+ ii
, io_base
+ MAC_REG_MISCFFNDEX
);
855 iowrite32(*pdwKey
++, io_base
+ MAC_REG_MISCFFDATA
);
856 iowrite16(MISCFFCTL_WRITE
, io_base
+ MAC_REG_MISCFFCTL
);
862 * Disable the Key Entry by MISCFIFO
866 * io_base - Base Address for MAC
874 void MACvDisableKeyEntry(struct vnt_private
*priv
, unsigned int uEntryIdx
)
876 void __iomem
*io_base
= priv
->PortOffset
;
877 unsigned short wOffset
;
879 wOffset
= MISCFIFO_KEYETRY0
;
880 wOffset
+= (uEntryIdx
* MISCFIFO_KEYENTRYSIZE
);
882 iowrite16(wOffset
, io_base
+ MAC_REG_MISCFFNDEX
);
883 iowrite32(0, io_base
+ MAC_REG_MISCFFDATA
);
884 iowrite16(MISCFFCTL_WRITE
, io_base
+ MAC_REG_MISCFFCTL
);