Linux 4.15-rc3
[linux/fpc-iii.git] / drivers / staging / vt6655 / mac.c
blobf7550b215f72d11d40c7129dda653945eb788cdf
1 /*
2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3 * All rights reserved.
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 * File: mac.c
17 * Purpose: MAC routines
19 * Author: Tevin Chen
21 * Date: May 21, 1996
23 * Functions:
24 * MACbIsRegBitsOn - Test if All test Bits On
25 * MACbIsRegBitsOff - Test if All test Bits Off
26 * MACbIsIntDisable - Test if MAC interrupt disable
27 * MACvSetShortRetryLimit - Set 802.11 Short Retry limit
28 * MACvSetLongRetryLimit - Set 802.11 Long Retry limit
29 * MACvSetLoopbackMode - Set MAC Loopback Mode
30 * MACvSaveContext - Save Context of MAC Registers
31 * MACvRestoreContext - Restore Context of MAC Registers
32 * MACbSoftwareReset - Software Reset MAC
33 * MACbSafeRxOff - Turn Off MAC Rx
34 * MACbSafeTxOff - Turn Off MAC Tx
35 * MACbSafeStop - Stop MAC function
36 * MACbShutdown - Shut down MAC
37 * MACvInitialize - Initialize MAC
38 * MACvSetCurrRxDescAddr - Set Rx Descriptors Address
39 * MACvSetCurrTx0DescAddr - Set Tx0 Descriptors Address
40 * MACvSetCurrTx1DescAddr - Set Tx1 Descriptors Address
41 * MACvTimer0MicroSDelay - Micro Second Delay Loop by MAC
43 * Revision History:
44 * 08-22-2003 Kyle Hsu : Porting MAC functions from sim53
45 * 09-03-2003 Bryan YC Fan : Add MACvClearBusSusInd()&
46 * MACvEnableBusSusEn()
47 * 09-18-2003 Jerry Chen : Add MACvSetKeyEntry & MACvDisableKeyEntry
51 #include "tmacro.h"
52 #include "mac.h"
55 * Description:
56 * Test if all test bits on
58 * Parameters:
59 * In:
60 * io_base - Base Address for MAC
61 * byRegOfs - Offset of MAC Register
62 * byTestBits - Test bits
63 * Out:
64 * none
66 * Return Value: true if all test bits On; otherwise false
69 bool MACbIsRegBitsOn(struct vnt_private *priv, unsigned char byRegOfs,
70 unsigned char byTestBits)
72 void __iomem *io_base = priv->PortOffset;
74 return (ioread8(io_base + byRegOfs) & byTestBits) == byTestBits;
78 * Description:
79 * Test if all test bits off
81 * Parameters:
82 * In:
83 * io_base - Base Address for MAC
84 * byRegOfs - Offset of MAC Register
85 * byTestBits - Test bits
86 * Out:
87 * none
89 * Return Value: true if all test bits Off; otherwise false
92 bool MACbIsRegBitsOff(struct vnt_private *priv, unsigned char byRegOfs,
93 unsigned char byTestBits)
95 void __iomem *io_base = priv->PortOffset;
97 return !(ioread8(io_base + byRegOfs) & byTestBits);
101 * Description:
102 * Test if MAC interrupt disable
104 * Parameters:
105 * In:
106 * io_base - Base Address for MAC
107 * Out:
108 * none
110 * Return Value: true if interrupt is disable; otherwise false
113 bool MACbIsIntDisable(struct vnt_private *priv)
115 void __iomem *io_base = priv->PortOffset;
117 if (ioread32(io_base + MAC_REG_IMR))
118 return false;
120 return true;
124 * Description:
125 * Set 802.11 Short Retry Limit
127 * Parameters:
128 * In:
129 * io_base - Base Address for MAC
130 * byRetryLimit- Retry Limit
131 * Out:
132 * none
134 * Return Value: none
137 void MACvSetShortRetryLimit(struct vnt_private *priv,
138 unsigned char byRetryLimit)
140 void __iomem *io_base = priv->PortOffset;
141 /* set SRT */
142 iowrite8(byRetryLimit, io_base + MAC_REG_SRT);
146 * Description:
147 * Set 802.11 Long Retry Limit
149 * Parameters:
150 * In:
151 * io_base - Base Address for MAC
152 * byRetryLimit- Retry Limit
153 * Out:
154 * none
156 * Return Value: none
159 void MACvSetLongRetryLimit(struct vnt_private *priv,
160 unsigned char byRetryLimit)
162 void __iomem *io_base = priv->PortOffset;
163 /* set LRT */
164 iowrite8(byRetryLimit, io_base + MAC_REG_LRT);
168 * Description:
169 * Set MAC Loopback mode
171 * Parameters:
172 * In:
173 * io_base - Base Address for MAC
174 * byLoopbackMode - Loopback Mode
175 * Out:
176 * none
178 * Return Value: none
181 void MACvSetLoopbackMode(struct vnt_private *priv, unsigned char byLoopbackMode)
183 void __iomem *io_base = priv->PortOffset;
185 byLoopbackMode <<= 6;
186 /* set TCR */
187 iowrite8((ioread8(io_base + MAC_REG_TEST) & 0x3f) | byLoopbackMode,
188 io_base + MAC_REG_TEST);
192 * Description:
193 * Save MAC registers to context buffer
195 * Parameters:
196 * In:
197 * io_base - Base Address for MAC
198 * Out:
199 * cxt_buf - Context buffer
201 * Return Value: none
204 void MACvSaveContext(struct vnt_private *priv, unsigned char *cxt_buf)
206 void __iomem *io_base = priv->PortOffset;
208 /* read page0 register */
209 memcpy_fromio(cxt_buf, io_base, MAC_MAX_CONTEXT_SIZE_PAGE0);
211 MACvSelectPage1(io_base);
213 /* read page1 register */
214 memcpy_fromio(cxt_buf + MAC_MAX_CONTEXT_SIZE_PAGE0, io_base,
215 MAC_MAX_CONTEXT_SIZE_PAGE1);
217 MACvSelectPage0(io_base);
221 * Description:
222 * Restore MAC registers from context buffer
224 * Parameters:
225 * In:
226 * io_base - Base Address for MAC
227 * cxt_buf - Context buffer
228 * Out:
229 * none
231 * Return Value: none
234 void MACvRestoreContext(struct vnt_private *priv, unsigned char *cxt_buf)
236 void __iomem *io_base = priv->PortOffset;
238 MACvSelectPage1(io_base);
239 /* restore page1 */
240 memcpy_toio(io_base, cxt_buf + MAC_MAX_CONTEXT_SIZE_PAGE0,
241 MAC_MAX_CONTEXT_SIZE_PAGE1);
243 MACvSelectPage0(io_base);
245 /* restore RCR,TCR,IMR... */
246 memcpy_toio(io_base + MAC_REG_RCR, cxt_buf + MAC_REG_RCR,
247 MAC_REG_ISR - MAC_REG_RCR);
249 /* restore MAC Config. */
250 memcpy_toio(io_base + MAC_REG_LRT, cxt_buf + MAC_REG_LRT,
251 MAC_REG_PAGE1SEL - MAC_REG_LRT);
253 iowrite8(*(cxt_buf + MAC_REG_CFG), io_base + MAC_REG_CFG);
255 /* restore PS Config. */
256 memcpy_toio(io_base + MAC_REG_PSCFG, cxt_buf + MAC_REG_PSCFG,
257 MAC_REG_BBREGCTL - MAC_REG_PSCFG);
259 /* restore CURR_RX_DESC_ADDR, CURR_TX_DESC_ADDR */
260 iowrite32(*(u32 *)(cxt_buf + MAC_REG_TXDMAPTR0),
261 io_base + MAC_REG_TXDMAPTR0);
262 iowrite32(*(u32 *)(cxt_buf + MAC_REG_AC0DMAPTR),
263 io_base + MAC_REG_AC0DMAPTR);
264 iowrite32(*(u32 *)(cxt_buf + MAC_REG_BCNDMAPTR),
265 io_base + MAC_REG_BCNDMAPTR);
266 iowrite32(*(u32 *)(cxt_buf + MAC_REG_RXDMAPTR0),
267 io_base + MAC_REG_RXDMAPTR0);
268 iowrite32(*(u32 *)(cxt_buf + MAC_REG_RXDMAPTR1),
269 io_base + MAC_REG_RXDMAPTR1);
273 * Description:
274 * Software Reset MAC
276 * Parameters:
277 * In:
278 * io_base - Base Address for MAC
279 * Out:
280 * none
282 * Return Value: true if Reset Success; otherwise false
285 bool MACbSoftwareReset(struct vnt_private *priv)
287 void __iomem *io_base = priv->PortOffset;
288 unsigned short ww;
290 /* turn on HOSTCR_SOFTRST, just write 0x01 to reset */
291 iowrite8(0x01, io_base + MAC_REG_HOSTCR);
293 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
294 if (!(ioread8(io_base + MAC_REG_HOSTCR) & HOSTCR_SOFTRST))
295 break;
297 if (ww == W_MAX_TIMEOUT)
298 return false;
299 return true;
303 * Description:
304 * save some important register's value, then do reset, then restore
305 * register's value
307 * Parameters:
308 * In:
309 * io_base - Base Address for MAC
310 * Out:
311 * none
313 * Return Value: true if success; otherwise false
316 bool MACbSafeSoftwareReset(struct vnt_private *priv)
318 unsigned char abyTmpRegData[MAC_MAX_CONTEXT_SIZE_PAGE0 + MAC_MAX_CONTEXT_SIZE_PAGE1];
319 bool bRetVal;
321 /* PATCH....
322 * save some important register's value, then do
323 * reset, then restore register's value
325 /* save MAC context */
326 MACvSaveContext(priv, abyTmpRegData);
327 /* do reset */
328 bRetVal = MACbSoftwareReset(priv);
329 /* restore MAC context, except CR0 */
330 MACvRestoreContext(priv, abyTmpRegData);
332 return bRetVal;
336 * Description:
337 * Turn Off MAC Rx
339 * Parameters:
340 * In:
341 * io_base - Base Address for MAC
342 * Out:
343 * none
345 * Return Value: true if success; otherwise false
348 bool MACbSafeRxOff(struct vnt_private *priv)
350 void __iomem *io_base = priv->PortOffset;
351 unsigned short ww;
353 /* turn off wow temp for turn off Rx safely */
355 /* Clear RX DMA0,1 */
356 iowrite32(DMACTL_CLRRUN, io_base + MAC_REG_RXDMACTL0);
357 iowrite32(DMACTL_CLRRUN, io_base + MAC_REG_RXDMACTL1);
358 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
359 if (!(ioread32(io_base + MAC_REG_RXDMACTL0) & DMACTL_RUN))
360 break;
362 if (ww == W_MAX_TIMEOUT) {
363 pr_debug(" DBG_PORT80(0x10)\n");
364 return false;
366 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
367 if (!(ioread32(io_base + MAC_REG_RXDMACTL1) & DMACTL_RUN))
368 break;
370 if (ww == W_MAX_TIMEOUT) {
371 pr_debug(" DBG_PORT80(0x11)\n");
372 return false;
375 /* try to safe shutdown RX */
376 MACvRegBitsOff(io_base, MAC_REG_HOSTCR, HOSTCR_RXON);
377 /* W_MAX_TIMEOUT is the timeout period */
378 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
379 if (!(ioread8(io_base + MAC_REG_HOSTCR) & HOSTCR_RXONST))
380 break;
382 if (ww == W_MAX_TIMEOUT) {
383 pr_debug(" DBG_PORT80(0x12)\n");
384 return false;
386 return true;
390 * Description:
391 * Turn Off MAC Tx
393 * Parameters:
394 * In:
395 * io_base - Base Address for MAC
396 * Out:
397 * none
399 * Return Value: true if success; otherwise false
402 bool MACbSafeTxOff(struct vnt_private *priv)
404 void __iomem *io_base = priv->PortOffset;
405 unsigned short ww;
407 /* Clear TX DMA */
408 /* Tx0 */
409 iowrite32(DMACTL_CLRRUN, io_base + MAC_REG_TXDMACTL0);
410 /* AC0 */
411 iowrite32(DMACTL_CLRRUN, io_base + MAC_REG_AC0DMACTL);
413 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
414 if (!(ioread32(io_base + MAC_REG_TXDMACTL0) & DMACTL_RUN))
415 break;
417 if (ww == W_MAX_TIMEOUT) {
418 pr_debug(" DBG_PORT80(0x20)\n");
419 return false;
421 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
422 if (!(ioread32(io_base + MAC_REG_AC0DMACTL) & DMACTL_RUN))
423 break;
425 if (ww == W_MAX_TIMEOUT) {
426 pr_debug(" DBG_PORT80(0x21)\n");
427 return false;
430 /* try to safe shutdown TX */
431 MACvRegBitsOff(io_base, MAC_REG_HOSTCR, HOSTCR_TXON);
433 /* W_MAX_TIMEOUT is the timeout period */
434 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
435 if (!(ioread8(io_base + MAC_REG_HOSTCR) & HOSTCR_TXONST))
436 break;
438 if (ww == W_MAX_TIMEOUT) {
439 pr_debug(" DBG_PORT80(0x24)\n");
440 return false;
442 return true;
446 * Description:
447 * Stop MAC function
449 * Parameters:
450 * In:
451 * io_base - Base Address for MAC
452 * Out:
453 * none
455 * Return Value: true if success; otherwise false
458 bool MACbSafeStop(struct vnt_private *priv)
460 void __iomem *io_base = priv->PortOffset;
462 MACvRegBitsOff(io_base, MAC_REG_TCR, TCR_AUTOBCNTX);
464 if (!MACbSafeRxOff(priv)) {
465 pr_debug(" MACbSafeRxOff == false)\n");
466 MACbSafeSoftwareReset(priv);
467 return false;
469 if (!MACbSafeTxOff(priv)) {
470 pr_debug(" MACbSafeTxOff == false)\n");
471 MACbSafeSoftwareReset(priv);
472 return false;
475 MACvRegBitsOff(io_base, MAC_REG_HOSTCR, HOSTCR_MACEN);
477 return true;
481 * Description:
482 * Shut Down MAC
484 * Parameters:
485 * In:
486 * io_base - Base Address for MAC
487 * Out:
488 * none
490 * Return Value: true if success; otherwise false
493 bool MACbShutdown(struct vnt_private *priv)
495 void __iomem *io_base = priv->PortOffset;
496 /* disable MAC IMR */
497 MACvIntDisable(io_base);
498 MACvSetLoopbackMode(priv, MAC_LB_INTERNAL);
499 /* stop the adapter */
500 if (!MACbSafeStop(priv)) {
501 MACvSetLoopbackMode(priv, MAC_LB_NONE);
502 return false;
504 MACvSetLoopbackMode(priv, MAC_LB_NONE);
505 return true;
509 * Description:
510 * Initialize MAC
512 * Parameters:
513 * In:
514 * io_base - Base Address for MAC
515 * Out:
516 * none
518 * Return Value: none
521 void MACvInitialize(struct vnt_private *priv)
523 void __iomem *io_base = priv->PortOffset;
524 /* clear sticky bits */
525 MACvClearStckDS(io_base);
526 /* disable force PME-enable */
527 iowrite8(PME_OVR, io_base + MAC_REG_PMC1);
528 /* only 3253 A */
530 /* do reset */
531 MACbSoftwareReset(priv);
533 /* reset TSF counter */
534 iowrite8(TFTCTL_TSFCNTRST, io_base + MAC_REG_TFTCTL);
535 /* enable TSF counter */
536 iowrite8(TFTCTL_TSFCNTREN, io_base + MAC_REG_TFTCTL);
540 * Description:
541 * Set the chip with current rx descriptor address
543 * Parameters:
544 * In:
545 * io_base - Base Address for MAC
546 * curr_desc_addr - Descriptor Address
547 * Out:
548 * none
550 * Return Value: none
553 void MACvSetCurrRx0DescAddr(struct vnt_private *priv, u32 curr_desc_addr)
555 void __iomem *io_base = priv->PortOffset;
556 unsigned short ww;
557 unsigned char org_dma_ctl;
559 org_dma_ctl = ioread8(io_base + MAC_REG_RXDMACTL0);
560 if (org_dma_ctl & DMACTL_RUN)
561 iowrite8(DMACTL_RUN, io_base + MAC_REG_RXDMACTL0 + 2);
563 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
564 if (!(ioread8(io_base + MAC_REG_RXDMACTL0) & DMACTL_RUN))
565 break;
568 iowrite32(curr_desc_addr, io_base + MAC_REG_RXDMAPTR0);
569 if (org_dma_ctl & DMACTL_RUN)
570 iowrite8(DMACTL_RUN, io_base + MAC_REG_RXDMACTL0);
574 * Description:
575 * Set the chip with current rx descriptor address
577 * Parameters:
578 * In:
579 * io_base - Base Address for MAC
580 * curr_desc_addr - Descriptor Address
581 * Out:
582 * none
584 * Return Value: none
587 void MACvSetCurrRx1DescAddr(struct vnt_private *priv, u32 curr_desc_addr)
589 void __iomem *io_base = priv->PortOffset;
590 unsigned short ww;
591 unsigned char org_dma_ctl;
593 org_dma_ctl = ioread8(io_base + MAC_REG_RXDMACTL1);
594 if (org_dma_ctl & DMACTL_RUN)
595 iowrite8(DMACTL_RUN, io_base + MAC_REG_RXDMACTL1 + 2);
597 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
598 if (!(ioread8(io_base + MAC_REG_RXDMACTL1) & DMACTL_RUN))
599 break;
602 iowrite32(curr_desc_addr, io_base + MAC_REG_RXDMAPTR1);
603 if (org_dma_ctl & DMACTL_RUN)
604 iowrite8(DMACTL_RUN, io_base + MAC_REG_RXDMACTL1);
609 * Description:
610 * Set the chip with current tx0 descriptor address
612 * Parameters:
613 * In:
614 * io_base - Base Address for MAC
615 * curr_desc_addr - Descriptor Address
616 * Out:
617 * none
619 * Return Value: none
622 void MACvSetCurrTx0DescAddrEx(struct vnt_private *priv,
623 u32 curr_desc_addr)
625 void __iomem *io_base = priv->PortOffset;
626 unsigned short ww;
627 unsigned char org_dma_ctl;
629 org_dma_ctl = ioread8(io_base + MAC_REG_TXDMACTL0);
630 if (org_dma_ctl & DMACTL_RUN)
631 iowrite8(DMACTL_RUN, io_base + MAC_REG_TXDMACTL0 + 2);
633 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
634 if (!(ioread8(io_base + MAC_REG_TXDMACTL0) & DMACTL_RUN))
635 break;
638 iowrite32(curr_desc_addr, io_base + MAC_REG_TXDMAPTR0);
639 if (org_dma_ctl & DMACTL_RUN)
640 iowrite8(DMACTL_RUN, io_base + MAC_REG_TXDMACTL0);
644 * Description:
645 * Set the chip with current AC0 descriptor address
647 * Parameters:
648 * In:
649 * io_base - Base Address for MAC
650 * curr_desc_addr - Descriptor Address
651 * Out:
652 * none
654 * Return Value: none
657 /* TxDMA1 = AC0DMA */
658 void MACvSetCurrAC0DescAddrEx(struct vnt_private *priv,
659 u32 curr_desc_addr)
661 void __iomem *io_base = priv->PortOffset;
662 unsigned short ww;
663 unsigned char org_dma_ctl;
665 org_dma_ctl = ioread8(io_base + MAC_REG_AC0DMACTL);
666 if (org_dma_ctl & DMACTL_RUN)
667 iowrite8(DMACTL_RUN, io_base + MAC_REG_AC0DMACTL + 2);
669 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
670 if (!(ioread8(io_base + MAC_REG_AC0DMACTL) & DMACTL_RUN))
671 break;
673 if (ww == W_MAX_TIMEOUT)
674 pr_debug(" DBG_PORT80(0x26)\n");
675 iowrite32(curr_desc_addr, io_base + MAC_REG_AC0DMAPTR);
676 if (org_dma_ctl & DMACTL_RUN)
677 iowrite8(DMACTL_RUN, io_base + MAC_REG_AC0DMACTL);
680 void MACvSetCurrTXDescAddr(int iTxType, struct vnt_private *priv,
681 u32 curr_desc_addr)
683 if (iTxType == TYPE_AC0DMA)
684 MACvSetCurrAC0DescAddrEx(priv, curr_desc_addr);
685 else if (iTxType == TYPE_TXDMA0)
686 MACvSetCurrTx0DescAddrEx(priv, curr_desc_addr);
690 * Description:
691 * Micro Second Delay via MAC
693 * Parameters:
694 * In:
695 * io_base - Base Address for MAC
696 * uDelay - Delay time (timer resolution is 4 us)
697 * Out:
698 * none
700 * Return Value: none
703 void MACvTimer0MicroSDelay(struct vnt_private *priv, unsigned int uDelay)
705 void __iomem *io_base = priv->PortOffset;
706 unsigned char byValue;
707 unsigned int uu, ii;
709 iowrite8(0, io_base + MAC_REG_TMCTL0);
710 iowrite32(uDelay, io_base + MAC_REG_TMDATA0);
711 iowrite8((TMCTL_TMD | TMCTL_TE), io_base + MAC_REG_TMCTL0);
712 for (ii = 0; ii < 66; ii++) { /* assume max PCI clock is 66Mhz */
713 for (uu = 0; uu < uDelay; uu++) {
714 byValue = ioread8(io_base + MAC_REG_TMCTL0);
715 if ((byValue == 0) ||
716 (byValue & TMCTL_TSUSP)) {
717 iowrite8(0, io_base + MAC_REG_TMCTL0);
718 return;
722 iowrite8(0, io_base + MAC_REG_TMCTL0);
726 * Description:
727 * Micro Second One shot timer via MAC
729 * Parameters:
730 * In:
731 * io_base - Base Address for MAC
732 * uDelay - Delay time
733 * Out:
734 * none
736 * Return Value: none
739 void MACvOneShotTimer1MicroSec(struct vnt_private *priv,
740 unsigned int uDelayTime)
742 void __iomem *io_base = priv->PortOffset;
744 iowrite8(0, io_base + MAC_REG_TMCTL1);
745 iowrite32(uDelayTime, io_base + MAC_REG_TMDATA1);
746 iowrite8((TMCTL_TMD | TMCTL_TE), io_base + MAC_REG_TMCTL1);
749 void MACvSetMISCFifo(struct vnt_private *priv, unsigned short offset,
750 u32 data)
752 void __iomem *io_base = priv->PortOffset;
754 if (offset > 273)
755 return;
756 iowrite16(offset, io_base + MAC_REG_MISCFFNDEX);
757 iowrite32(data, io_base + MAC_REG_MISCFFDATA);
758 iowrite16(MISCFFCTL_WRITE, io_base + MAC_REG_MISCFFCTL);
761 bool MACbPSWakeup(struct vnt_private *priv)
763 void __iomem *io_base = priv->PortOffset;
764 unsigned int ww;
765 /* Read PSCTL */
766 if (MACbIsRegBitsOff(priv, MAC_REG_PSCTL, PSCTL_PS))
767 return true;
769 /* Disable PS */
770 MACvRegBitsOff(io_base, MAC_REG_PSCTL, PSCTL_PSEN);
772 /* Check if SyncFlushOK */
773 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
774 if (ioread8(io_base + MAC_REG_PSCTL) & PSCTL_WAKEDONE)
775 break;
777 if (ww == W_MAX_TIMEOUT) {
778 pr_debug(" DBG_PORT80(0x33)\n");
779 return false;
781 return true;
785 * Description:
786 * Set the Key by MISCFIFO
788 * Parameters:
789 * In:
790 * io_base - Base Address for MAC
792 * Out:
793 * none
795 * Return Value: none
799 void MACvSetKeyEntry(struct vnt_private *priv, unsigned short wKeyCtl,
800 unsigned int uEntryIdx, unsigned int uKeyIdx,
801 unsigned char *pbyAddr, u32 *pdwKey,
802 unsigned char byLocalID)
804 void __iomem *io_base = priv->PortOffset;
805 unsigned short offset;
806 u32 data;
807 int ii;
809 if (byLocalID <= 1)
810 return;
812 pr_debug("%s\n", __func__);
813 offset = MISCFIFO_KEYETRY0;
814 offset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
816 data = 0;
817 data |= wKeyCtl;
818 data <<= 16;
819 data |= MAKEWORD(*(pbyAddr + 4), *(pbyAddr + 5));
820 pr_debug("1. offset: %d, Data: %X, KeyCtl:%X\n",
821 offset, data, wKeyCtl);
823 iowrite16(offset, io_base + MAC_REG_MISCFFNDEX);
824 iowrite32(data, io_base + MAC_REG_MISCFFDATA);
825 iowrite16(MISCFFCTL_WRITE, io_base + MAC_REG_MISCFFCTL);
826 offset++;
828 data = 0;
829 data |= *(pbyAddr + 3);
830 data <<= 8;
831 data |= *(pbyAddr + 2);
832 data <<= 8;
833 data |= *(pbyAddr + 1);
834 data <<= 8;
835 data |= *pbyAddr;
836 pr_debug("2. offset: %d, Data: %X\n", offset, data);
838 iowrite16(offset, io_base + MAC_REG_MISCFFNDEX);
839 iowrite32(data, io_base + MAC_REG_MISCFFDATA);
840 iowrite16(MISCFFCTL_WRITE, io_base + MAC_REG_MISCFFCTL);
841 offset++;
843 offset += (uKeyIdx * 4);
844 for (ii = 0; ii < 4; ii++) {
845 /* always push 128 bits */
846 pr_debug("3.(%d) offset: %d, Data: %X\n",
847 ii, offset + ii, *pdwKey);
848 iowrite16(offset + ii, io_base + MAC_REG_MISCFFNDEX);
849 iowrite32(*pdwKey++, io_base + MAC_REG_MISCFFDATA);
850 iowrite16(MISCFFCTL_WRITE, io_base + MAC_REG_MISCFFCTL);
855 * Description:
856 * Disable the Key Entry by MISCFIFO
858 * Parameters:
859 * In:
860 * io_base - Base Address for MAC
862 * Out:
863 * none
865 * Return Value: none
868 void MACvDisableKeyEntry(struct vnt_private *priv, unsigned int uEntryIdx)
870 void __iomem *io_base = priv->PortOffset;
871 unsigned short offset;
873 offset = MISCFIFO_KEYETRY0;
874 offset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
876 iowrite16(offset, io_base + MAC_REG_MISCFFNDEX);
877 iowrite32(0, io_base + MAC_REG_MISCFFDATA);
878 iowrite16(MISCFFCTL_WRITE, io_base + MAC_REG_MISCFFCTL);