⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fltr.c

📁 PXA255/270平台的 CS8900网卡驱动程序
💻 C
字号:
//---------------------------------------------------------------------------
//
//  Copyright (C) 1996-1997. Unpublished Work of Crystal Semiconductor Corp.
//  All Rights Reserved.
//
//  THIS WORK IS AN UNPUBLISHED WORK AND CONTAINS CONFIDENTIAL,
//  PROPRIETARY AND TRADE SECRET INFORMATION OF CRYSTAL SEMICONDUCTOR.
//  ACCESS TO THIS WORK IS RESTRICTED TO (I) CRYSTAL SEMICONDUCTOR EMPLOYEES
//  WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF THEIR
//  ASSIGNMENTS  AND (II) ENTITIES OTHER THAN CRYSTAL SEMICONDUCTOR WHO
//  HAVE ENTERED INTO  APPROPRIATE LICENSE AGREEMENTS.  NO PART OF THIS
//  WORK MAY BE USED, PRACTICED, PERFORMED, COPIED, DISTRIBUTED, REVISED,
//  MODIFIED, TRANSLATED, ABRIDGED, CONDENSED, EXPANDED, COLLECTED,
//  COMPILED,LINKED,RECAST, TRANSFORMED, ADAPTED IN ANY FORM OR BY ANY
//  MEANS,MANUAL, MECHANICAL, CHEMICAL, ELECTRICAL, ELECTRONIC, OPTICAL,
//  BIOLOGICAL, OR OTHERWISE WITHOUT THE PRIOR WRITTEN PERMISSION AND
//  CONSENT OF CRYSTAL SEMICONDUCTOR . ANY USE OR EXPLOITATION OF THIS WORK
//  WITHOUT THE PRIOR WRITTEN CONSENT OF CRYSTAL SEMICONDUCTOR  COULD
//  SUBJECT THE PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY.
//
//---------------------------------------------------------------------------

/* vc20fltr.c  -  CS8900 VChip filtering */

#include "cs8900a.h"
#include "cshrd.h"


/* External Prototypes */

WORD ReadPacketPage( WORD Offset );
void WritePacketPage( WORD Offset, WORD Value );


/******************************************************************************
*
* CalculateHashIndex()
*
******************************************************************************/

BYTE CalculateHashIndex( BYTE  *pMulticastAddr )
{
    DWORD CRC;
    BYTE  HashIndex;
    BYTE  AddrByte;
    DWORD HighBit;
    int   Byte;
    int   Bit;

    PRINTDEBUGMSG(1, (TEXT("==>CS8900:CalculateHashIndex\r\n")));   
    /* Prime the CRC */
    CRC = CRC_PRIME;

    /* For each of the six bytes of the multicast address */
    for ( Byte=0; Byte<6; Byte++ )
    {
        AddrByte = *pMulticastAddr++;

        /* For each bit of the byte */
        for ( Bit=8; Bit>0; Bit-- )
        {
            HighBit = CRC >> 31;
            CRC <<= 1;

            if ( HighBit ^ (AddrByte & 1) )
            {
                CRC ^= CRC_POLYNOMIAL;
                CRC |= 1;
            }

            AddrByte >>= 1;
        }
    }

    /* Take the least significant six bits of the CRC and copy them */
    /* to the HashIndex in reverse order.                           */
    for( Bit=0,HashIndex=0; Bit<6; Bit++ )
    {
        HashIndex <<= 1;
        HashIndex |= (BYTE)(CRC & 1);
        CRC >>= 1;
    }

    PRINTDEBUGMSG(1, (TEXT("<==CS8900:CalculateHashIndex\r\n")));   
    return HashIndex;
}

/******************************************************************************
*
* SetMulticastTable()
*
******************************************************************************/

void SetMulticastTable( PCHIP pChip, PWORD McastHashTable )
{
    WORD  i;

    PRINTDEBUGMSG(1, (TEXT("==>CS8900:SetMulticastTable\r\n")));   
    for(i=0; i < 4; i++)
    {
        WritePacketPage(CRYSTAL_LOGICAL_ADDRESS_FILTER+i*2, *McastHashTable);
        McastHashTable++;
    }
    PRINTDEBUGMSG(1, (TEXT("<==CS8900:SetMulticastTable\r\n")));   
}

/******************************************************************************
*
* GetMulticastTable()
*
******************************************************************************/
void GetMulticastTable( PCHIP pChip, WORD *McastHashTable )
{
    WORD  i;

    PRINTDEBUGMSG(1, (TEXT("==>CS8900:GetMulticastTable\r\n")));   
    for(i=0; i < 4; i++)
    {
        *McastHashTable = ReadPacketPage(CRYSTAL_LOGICAL_ADDRESS_FILTER+i*2);
        McastHashTable++;
    }
    PRINTDEBUGMSG(1, (TEXT("<==CS8900:GetMulticastTable\r\n")));   
}

/******************************************************************************
*
* VchipMulticastDeleteAll()
*
******************************************************************************/
void VchipMulticastDeleteAll( PCHIP pChip )
{
    WORD  McastHashTable[4] = {0,0,0,0};
    WORD  LineControl;

    PRINTDEBUGMSG(1, (TEXT("==>CS8900:VchipMulticastDeleteAll\r\n")));   
    /* Turn the receiver off while changing filtering criteria */
    LineControl = ReadPacketPage( CRYSTAL_LINE_CONTROL_REGISTER );
    WritePacketPage( CRYSTAL_LINE_CONTROL_REGISTER, (WORD)(LineControl & ~CRYSTAL_LCR_SERIAL_RX_ON) );

    SetMulticastTable( pChip, McastHashTable );

    /* Turn the receiver back on */
    WritePacketPage( CRYSTAL_LINE_CONTROL_REGISTER, LineControl );
    PRINTDEBUGMSG(1, (TEXT("<==CS8900:VchipMulticastDeleteAll\r\n")));   
};


/******************************************************************************
*
* VchipMulticastAdd()
*
******************************************************************************/
void VchipMulticastAdd( PCHIP pChip, PEA pMulticastAddr )
{
    WORD  McastHashTable[4];
    WORD  LineControl;
    BYTE  HashIndex;

    PRINTDEBUGMSG(1, (TEXT("==>CS8900:VchipMulticastAdd\r\n")));   
    /* Turn the receiver off while changing filtering criteria */
    LineControl = ReadPacketPage( CRYSTAL_LINE_CONTROL_REGISTER );
    WritePacketPage( CRYSTAL_LINE_CONTROL_REGISTER, (WORD)(LineControl & ~CRYSTAL_LCR_SERIAL_RX_ON) );

    GetMulticastTable( pChip, (PWORD)&McastHashTable );

    HashIndex  =  CalculateHashIndex((PBYTE)pMulticastAddr);
    McastHashTable[HashIndex/16]  |=  1 << (HashIndex%16);

    SetMulticastTable( pChip, McastHashTable );

    /* Turn the receiver back on */
    WritePacketPage( CRYSTAL_LINE_CONTROL_REGISTER, LineControl );
    PRINTDEBUGMSG(1, (TEXT("<==CS8900:VchipMulticastAdd\r\n")));   
};

/******************************************************************************
*
* VchipMulticastDelete()
*
******************************************************************************/
void VchipMulticastDelete( PCHIP pChip, PEA pMulticastAddr )
{
    WORD  McastHashTable[4];
    WORD  LineControl;
    BYTE  HashIndex;

    PRINTDEBUGMSG(1, (TEXT("==>CS8900:VchipMulticastDelete\r\n")));   
    /* Turn the receiver off while changing filtering criteria */
    LineControl = ReadPacketPage( CRYSTAL_LINE_CONTROL_REGISTER );
    WritePacketPage( CRYSTAL_LINE_CONTROL_REGISTER,(WORD)(LineControl & ~CRYSTAL_LCR_SERIAL_RX_ON) );

    GetMulticastTable( pChip, (PWORD)&McastHashTable );

    HashIndex  =  CalculateHashIndex((PBYTE)pMulticastAddr);
    McastHashTable[HashIndex/16]  &=  (~(1 << (HashIndex%16)));

    SetMulticastTable( pChip, McastHashTable );

    /* Turn the receiver back on */
    WritePacketPage( CRYSTAL_LINE_CONTROL_REGISTER, LineControl );
    PRINTDEBUGMSG(1, (TEXT("<==CS8900:VchipMulticastDelete\r\n")));   
};

/******************************************************************************
*
* VchipChangeFiltering()
*
******************************************************************************/
void VchipChangeFiltering( PCHIP pChip )
{
    WORD LineControl;
    WORD RxControl;

    PRINTDEBUGMSG(1, (TEXT("==>CS8900:VchipChangeFiltering\r\n")));
    /* Turn the receiver off while changing filtering criteria */
    LineControl = ReadPacketPage( CRYSTAL_LINE_CONTROL_REGISTER );
    WritePacketPage( CRYSTAL_LINE_CONTROL_REGISTER, (WORD)(LineControl & ~CRYSTAL_LCR_SERIAL_RX_ON) );

    /* Get the current setting of the receiver control register */
    RxControl = ReadPacketPage( CRYSTAL_RX_CONTROL_REGISTER );

    /* Clear the broadcast, multicast and promiscuous bits */
    RxControl &= ~(CRYSTAL_RCR_RX_BROADCAST_ACCEPT | CRYSTAL_RCR_RX_IA_ACCEPT |
                   CRYSTAL_RCR_RX_MULTICAST_ACCEPT | CRYSTAL_RCR_RX_PROM_ACCEPT);

    /* Set the specified filtering bits */
    if ( pChip->Config.Filtering & FILTER_INDIVIDUAL_ACCEPT )
        RxControl |= CRYSTAL_RCR_RX_IA_ACCEPT;
    if ( pChip->Config.Filtering & FILTER_BROADCAST_ACCEPT )
        RxControl |= CRYSTAL_RCR_RX_BROADCAST_ACCEPT;
    if ( pChip->Config.Filtering & FILTER_MULTICAST_ACCEPT )
        RxControl |= CRYSTAL_RCR_RX_MULTICAST_ACCEPT;
    if ( pChip->Config.Filtering & FILTER_PROMISCUOUS_ACCEPT )
        RxControl |= CRYSTAL_RCR_RX_PROM_ACCEPT;

    /* Write the new filtering criteria to the receiver control register */
    WritePacketPage( CRYSTAL_RX_CONTROL_REGISTER, RxControl );

    /* Turn the receiver back on */
    WritePacketPage( CRYSTAL_LINE_CONTROL_REGISTER, LineControl );
    PRINTDEBUGMSG(1, (TEXT("<==CS8900:VchipChangeFiltering\r\n")));
}


/******************************************************************************
*
* VchipMulticastAddAll()
*
******************************************************************************/
void VchipMulticastAddAll( PCHIP pChip )
{
    WORD  McastHashTable[4] = {0xffff,0xffff,0xffff,0xffff};
    WORD  LineControl;

    PRINTDEBUGMSG(1, (TEXT("==>CS8900:VchipMulticastAddAll\r\n")));   
    /* Turn the receiver off while changing filtering criteria */
    LineControl = ReadPacketPage( CRYSTAL_LINE_CONTROL_REGISTER );
    WritePacketPage( CRYSTAL_LINE_CONTROL_REGISTER, (WORD)(LineControl & ~CRYSTAL_LCR_SERIAL_RX_ON) );

    SetMulticastTable( pChip, McastHashTable );

    /* Turn the receiver back on */
    WritePacketPage( CRYSTAL_LINE_CONTROL_REGISTER, LineControl );
    PRINTDEBUGMSG(1, (TEXT("<==CS8900:VchipMulticastAddAll\r\n")));   
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -