📄 mac.c
字号:
/*
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
* All rights reserved.
*
* This software is copyrighted by and is the sole property of
* VIA Networking Technologies, Inc. This software may only be used
* in accordance with the corresponding license agreement. Any unauthorized
* use, duplication, transmission, distribution, or disclosure of this
* software is expressly forbidden.
*
* This software is provided by VIA Networking Technologies, Inc. "as is"
* and any express or implied warranties, including, but not limited to, the
* implied warranties of merchantability and fitness for a particular purpose
* are disclaimed. In no event shall VIA Networking Technologies, Inc.
* be liable for any direct, indirect, incidental, special, exemplary, or
* consequential damages.
*
* File: mac.c
*
* Purpose: MAC routines
*
* Author: Tevin Chen
*
* Date: May 21, 1996
*
* Functions:
* MACvReadAllRegs - Read All MAC Registers to buffer
* MACbIsRegBitsOn - Test if All test Bits On
* MACbIsRegBitsOff - Test if All test Bits Off
* MACbIsIntDisable - Test if MAC interrupt disable
* MACbyReadMultiAddr - Read Multicast Address Mask Pattern
* MACvWriteMultiAddr - Write Multicast Address Mask Pattern
* MACvSetMultiAddrByHash - Set Multicast Address Mask by Hash value
* MACvResetMultiAddrByHash - Clear Multicast Address Mask by Hash value
* MACvSetRxThreshold - Set Rx Threshold value
* MACvGetRxThreshold - Get Rx Threshold value
* MACvSetTxThreshold - Set Tx Threshold value
* MACvGetTxThreshold - Get Tx Threshold value
* MACvSetDmaLength - Set Dma Length value
* MACvGetDmaLength - Get Dma Length value
* MACvSetShortRetryLimit - Set 802.11 Short Retry limit
* MACvGetShortRetryLimit - Get 802.11 Short Retry limit
* MACvSetLongRetryLimit - Set 802.11 Long Retry limit
* MACvGetLongRetryLimit - Get 802.11 Long Retry limit
* MACvSetLoopbackMode - Set MAC Loopback Mode
* MACbIsInLoopbackMode - Test if MAC in Loopback mode
* MACvSetPacketFilter - Set MAC Address Filter
* MACvSaveContext - Save Context of MAC Registers
* MACvRestoreContext - Restore Context of MAC Registers
* MACbCompareContext - Compare if values of MAC Registers same as Context
* MACbSoftwareReset - Software Reset MAC
* MACbSafeRxOff - Turn Off MAC Rx
* MACbSafeTxOff - Turn Off MAC Tx
* MACbSafeStop - Stop MAC function
* MACbShutdown - Shut down MAC
* MACvInitialize - Initialize MAC
* MACvSetCurrRxDescAddr - Set Rx Descriptos Address
* MACvSetCurrTx0DescAddr - Set Tx0 Descriptos Address
* MACvSetCurrTx1DescAddr - Set Tx1 Descriptos Address
* MACvTimer0MicroSDelay - Micro Second Delay Loop by MAC
*
* Revision History:
* 08-22-2003 Kyle Hsu : Porting MAC functions from sim53
* 09-03-2003 Bryan YC Fan : Add MACvClearBusSusInd()& MACvEnableBusSusEn()
* 09-18-2003 Jerry Chen : Add MACvSetKeyEntry & MACvDisableKeyEntry
*
*/
#if !defined(__TMACRO_H__)
#include "tmacro.h"
#endif
#if !defined(__TBIT_H__)
#include "tbit.h"
#endif
#if !defined(__TETHER_H__)
#include "tether.h"
#endif
#if !defined(__MAC_H__)
#include "mac.h"
#endif
/*--------------------- Static Definitions -------------------------*/
//static int msglevel =MSG_LEVEL_DEBUG;
static int msglevel =MSG_LEVEL_INFO;
/*--------------------- Static Classes ----------------------------*/
/*--------------------- Static Variables --------------------------*/
/*--------------------- Static Functions --------------------------*/
/*--------------------- Export Variables --------------------------*/
/*--------------------- Export Functions --------------------------*/
/*
* Description:
* Read All MAC Registers to buffer
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* Out:
* pbyMacRegs - buffer to read
*
* Return Value: none
*
*/
VOID MACvReadAllRegs (DWORD_PTR dwIoBase, PBYTE pbyMacRegs)
{
int ii;
// read page0 register
for (ii = 0; ii < MAC_MAX_CONTEXT_SIZE_PAGE0; ii++) {
VNSvInPortB(dwIoBase + ii, pbyMacRegs);
pbyMacRegs++;
}
MACvSelectPage1(dwIoBase);
// read page1 register
for (ii = 0; ii < MAC_MAX_CONTEXT_SIZE_PAGE1; ii++) {
VNSvInPortB(dwIoBase + ii, pbyMacRegs);
pbyMacRegs++;
}
MACvSelectPage0(dwIoBase);
}
/*
* Description:
* Test if all test bits on
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* byRegOfs - Offset of MAC Register
* byTestBits - Test bits
* Out:
* none
*
* Return Value: TRUE if all test bits On; otherwise FALSE
*
*/
BOOL MACbIsRegBitsOn (DWORD_PTR dwIoBase, BYTE byRegOfs, BYTE byTestBits)
{
BYTE byData;
VNSvInPortB(dwIoBase + byRegOfs, &byData);
return BITbIsAllBitsOn(byData, byTestBits);
}
/*
* Description:
* Test if all test bits off
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* byRegOfs - Offset of MAC Register
* byTestBits - Test bits
* Out:
* none
*
* Return Value: TRUE if all test bits Off; otherwise FALSE
*
*/
BOOL MACbIsRegBitsOff (DWORD_PTR dwIoBase, BYTE byRegOfs, BYTE byTestBits)
{
BYTE byData;
VNSvInPortB(dwIoBase + byRegOfs, &byData);
return BITbIsAllBitsOff(byData, byTestBits);
}
/*
* Description:
* Test if MAC interrupt disable
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* Out:
* none
*
* Return Value: TRUE if interrupt is disable; otherwise FALSE
*
*/
BOOL MACbIsIntDisable (DWORD_PTR dwIoBase)
{
DWORD dwData;
VNSvInPortD(dwIoBase + MAC_REG_IMR, &dwData);
if (dwData != 0)
return FALSE;
return TRUE;
}
/*
* Description:
* Read MAC Multicast Address Mask
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* uByteidx - Index of Mask
* Out:
* none
*
* Return Value: Mask Value read
*
*/
BYTE MACbyReadMultiAddr (DWORD_PTR dwIoBase, UINT uByteIdx)
{
BYTE byData;
MACvSelectPage1(dwIoBase);
VNSvInPortB(dwIoBase + MAC_REG_MAR0 + uByteIdx, &byData);
MACvSelectPage0(dwIoBase);
return byData;
}
/*
* Description:
* Write MAC Multicast Address Mask
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* uByteidx - Index of Mask
* byData - Mask Value to write
* Out:
* none
*
* Return Value: none
*
*/
VOID MACvWriteMultiAddr (DWORD_PTR dwIoBase, UINT uByteIdx, BYTE byData)
{
MACvSelectPage1(dwIoBase);
VNSvOutPortB(dwIoBase + MAC_REG_MAR0 + uByteIdx, byData);
MACvSelectPage0(dwIoBase);
}
/*
* Description:
* Set this hash index into multicast address register bit
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* byHashIdx - Hash index to set
* Out:
* none
*
* Return Value: none
*
*/
void MACvSetMultiAddrByHash (DWORD_PTR dwIoBase, BYTE byHashIdx)
{
UINT uByteIdx;
BYTE byBitMask;
BYTE byOrgValue;
// calculate byte position
uByteIdx = byHashIdx / 8;
ASSERT(uByteIdx < 8);
// calculate bit position
byBitMask = 1;
byBitMask <<= (byHashIdx % 8);
// turn on the bit
byOrgValue = MACbyReadMultiAddr(dwIoBase, uByteIdx);
MACvWriteMultiAddr(dwIoBase, uByteIdx, (BYTE)(byOrgValue | byBitMask));
}
/*
* Description:
* Reset this hash index into multicast address register bit
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* byHashIdx - Hash index to clear
* Out:
* none
*
* Return Value: none
*
*/
void MACvResetMultiAddrByHash (DWORD_PTR dwIoBase, BYTE byHashIdx)
{
UINT uByteIdx;
BYTE byBitMask;
BYTE byOrgValue;
// calculate byte position
uByteIdx = byHashIdx / 8;
ASSERT(uByteIdx < 8);
// calculate bit position
byBitMask = 1;
byBitMask <<= (byHashIdx % 8);
// turn off the bit
byOrgValue = MACbyReadMultiAddr(dwIoBase, uByteIdx);
MACvWriteMultiAddr(dwIoBase, uByteIdx, (BYTE)(byOrgValue & (~byBitMask)));
}
/*
* Description:
* Set Rx Threshold
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* byThreshold - Threshold Value
* Out:
* none
*
* Return Value: none
*
*/
void MACvSetRxThreshold (DWORD_PTR dwIoBase, BYTE byThreshold)
{
BYTE byOrgValue;
ASSERT(byThreshold < 4);
// set FCR0
VNSvInPortB(dwIoBase + MAC_REG_FCR0, &byOrgValue);
byOrgValue = (byOrgValue & 0xCF) | (byThreshold << 4);
VNSvOutPortB(dwIoBase + MAC_REG_FCR0, byOrgValue);
}
/*
* Description:
* Get Rx Threshold
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* Out:
* pbyThreshold- Threshold Value Get
*
* Return Value: none
*
*/
void MACvGetRxThreshold (DWORD_PTR dwIoBase, PBYTE pbyThreshold)
{
// get FCR0
VNSvInPortB(dwIoBase + MAC_REG_FCR0, pbyThreshold);
*pbyThreshold = (*pbyThreshold >> 4) & 0x03;
}
/*
* Description:
* Set Tx Threshold
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* byThreshold - Threshold Value
* Out:
* none
*
* Return Value: none
*
*/
void MACvSetTxThreshold (DWORD_PTR dwIoBase, BYTE byThreshold)
{
BYTE byOrgValue;
ASSERT(byThreshold < 4);
// set FCR0
VNSvInPortB(dwIoBase + MAC_REG_FCR0, &byOrgValue);
byOrgValue = (byOrgValue & 0xF3) | (byThreshold << 2);
VNSvOutPortB(dwIoBase + MAC_REG_FCR0, byOrgValue);
}
/*
* Description:
* Get Tx Threshold
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* Out:
* pbyThreshold- Threshold Value Get
*
* Return Value: none
*
*/
void MACvGetTxThreshold (DWORD_PTR dwIoBase, PBYTE pbyThreshold)
{
// get FCR0
VNSvInPortB(dwIoBase + MAC_REG_FCR0, pbyThreshold);
*pbyThreshold = (*pbyThreshold >> 2) & 0x03;
}
/*
* Description:
* Set Dma Length
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* byDmaLength - Dma Length Value
* Out:
* none
*
* Return Value: none
*
*/
void MACvSetDmaLength (DWORD_PTR dwIoBase, BYTE byDmaLength)
{
BYTE byOrgValue;
ASSERT(byDmaLength < 4);
// set FCR0
VNSvInPortB(dwIoBase + MAC_REG_FCR0, &byOrgValue);
byOrgValue = (byOrgValue & 0xFC) | byDmaLength;
VNSvOutPortB(dwIoBase + MAC_REG_FCR0, byOrgValue);
}
/*
* Description:
* Get Dma Length
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* Out:
* pbyDmaLength- Dma Length Value Get
*
* Return Value: none
*
*/
void MACvGetDmaLength (DWORD_PTR dwIoBase, PBYTE pbyDmaLength)
{
// get FCR0
VNSvInPortB(dwIoBase + MAC_REG_FCR0, pbyDmaLength);
*pbyDmaLength &= 0x03;
}
/*
* Description:
* Set 802.11 Short Retry Limit
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* byRetryLimit- Retry Limit
* Out:
* none
*
* Return Value: none
*
*/
void MACvSetShortRetryLimit (DWORD_PTR dwIoBase, BYTE byRetryLimit)
{
// set SRT
VNSvOutPortB(dwIoBase + MAC_REG_SRT, byRetryLimit);
}
/*
* Description:
* Get 802.11 Short Retry Limit
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* Out:
* pbyRetryLimit - Retry Limit Get
*
* Return Value: none
*
*/
void MACvGetShortRetryLimit (DWORD_PTR dwIoBase, PBYTE pbyRetryLimit)
{
// get SRT
VNSvInPortB(dwIoBase + MAC_REG_SRT, pbyRetryLimit);
}
/*
* Description:
* Set 802.11 Long Retry Limit
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* byRetryLimit- Retry Limit
* Out:
* none
*
* Return Value: none
*
*/
void MACvSetLongRetryLimit (DWORD_PTR dwIoBase, BYTE byRetryLimit)
{
// set LRT
VNSvOutPortB(dwIoBase + MAC_REG_LRT, byRetryLimit);
}
/*
* Description:
* Get 802.11 Long Retry Limit
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* Out:
* pbyRetryLimit - Retry Limit Get
*
* Return Value: none
*
*/
void MACvGetLongRetryLimit (DWORD_PTR dwIoBase, PBYTE pbyRetryLimit)
{
// get LRT
VNSvInPortB(dwIoBase + MAC_REG_LRT, pbyRetryLimit);
}
/*
* Description:
* Set MAC Loopback mode
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* byLoopbackMode - Loopback Mode
* Out:
* none
*
* Return Value: none
*
*/
void MACvSetLoopbackMode (DWORD_PTR dwIoBase, BYTE byLoopbackMode)
{
BYTE byOrgValue;
ASSERT(byLoopbackMode < 3);
byLoopbackMode <<= 6;
// set TCR
VNSvInPortB(dwIoBase + MAC_REG_TEST, &byOrgValue);
byOrgValue = byOrgValue & 0x3F;
byOrgValue = byOrgValue | byLoopbackMode;
VNSvOutPortB(dwIoBase + MAC_REG_TEST, byOrgValue);
}
/*
* Description:
* Test if MAC in Loopback mode
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* Out:
* none
*
* Return Value: TRUE if in Loopback mode; otherwise FALSE
*
*/
BOOL MACbIsInLoopbackMode (DWORD_PTR dwIoBase)
{
BYTE byOrgValue;
VNSvInPortB(dwIoBase + MAC_REG_TEST, &byOrgValue);
if (BITbIsAnyBitsOn(byOrgValue, (TEST_LBINT | TEST_LBEXT)))
return TRUE;
return FALSE;
}
/*
* Description:
* Set MAC Address filter
*
* Parameters:
* In:
* dwIoBase - Base Address for MAC
* wFilterType - Filter Type
* Out:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -