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

📄 ks_table.c

📁 MICREL 网卡驱动 FOR CE 5.0
💻 C
📖 第 1 页 / 共 3 页
字号:
    PUSHORT   pwVID,
    PUCHAR    pbFID,
    PUCHAR    pbMember )
{
    ULONG dwData;

    ASSERT( pHardware->m_bAcquire );

#ifdef KS_ISA_BUS
#ifdef KS_PCI
    if ( !pHardware->m_fPCI )
#endif
    {
        SwitchReadTable_ISA( pHardware, TABLE_VLAN, wAddr, &dwData );
    }

#ifdef KS_PCI
    else
#endif
#endif

#ifdef KS_PCI
    {
        SwitchReadTable_PCI( pHardware, TABLE_VLAN, wAddr, &dwData );
    }
#endif
    if ( ( dwData & VLAN_TABLE_VALID ) )
    {
        *pwVID = ( USHORT )( dwData & VLAN_TABLE_VID );
        *pbFID = ( UCHAR )(( dwData & VLAN_TABLE_FID ) >>
            VLAN_TABLE_FID_SHIFT );
        *pbMember = ( UCHAR )(( dwData & VLAN_TABLE_MEMBERSHIP ) >>
            VLAN_TABLE_MEMBERSHIP_SHIFT );
        return TRUE;
    }
    return FALSE;
}  /* SwitchReadVlanTable */


/*
    SwitchWriteVlanTable

    Description:
        This routine writes an entry of the VLAN table of the switch.  It calls
        SwitchWriteTable() to write the data.

    Parameters:
        PHARDWARE pHardware
            Pointer to hardware instance.

        USHORT wAddr
            The address of the entry.

        USHORT wVID
            The VID value.

        UCHAR bFID
            The FID value.

        UCHAR bMember
            The port membership.

        BOOLEAN fValid
            The valid flag to indicate entry is valid.

    Return (None):
*/

void SwitchWriteVlanTable (
    PHARDWARE pHardware,
    USHORT    wAddr,
    USHORT    wVID,
    UCHAR     bFID,
    UCHAR     bMember,
    BOOLEAN   fValid )
{
    ULONG dwData;

    ASSERT( pHardware->m_bAcquire );

    dwData = wVID;
    dwData |= ( ULONG ) bFID << VLAN_TABLE_FID_SHIFT;
    dwData |= ( ULONG ) bMember << VLAN_TABLE_MEMBERSHIP_SHIFT;
    if ( fValid )
        dwData |= VLAN_TABLE_VALID;

#ifdef KS_ISA_BUS
#ifdef KS_PCI
    if ( !pHardware->m_fPCI )
#endif
    {
        /* v1.0.5 deleted.
        dwData = SwapBytes( dwData );
        */
        SwitchWriteTable_ISA( pHardware, TABLE_VLAN, wAddr, dwData );
    }

#ifdef KS_PCI
    else
#endif
#endif

#ifdef KS_PCI
    {
        SwitchWriteTable_PCI( pHardware, TABLE_VLAN, wAddr, dwData );
    }
#endif
}  /* SwitchWriteVlanTable */
#endif

/* -------------------------------------------------------------------------- */

#define MIB_COUNTER_PACKET_DROPPED_TX_0  0x100
#define MIB_COUNTER_PACKET_DROPPED_TX_1  0x101
#define MIB_COUNTER_PACKET_DROPPED_TX_2  0x102
#define MIB_COUNTER_PACKET_DROPPED_RX_0  0x103
#define MIB_COUNTER_PACKET_DROPPED_RX_1  0x104
#define MIB_COUNTER_PACKET_DROPPED_RX_2  0x105


/*
    PortReadMIBCounter

    Description:
        This routine reads a MIB counter of the port.
        Hardware interrupts are disabled to minimize corruption of read data.

    Parameters:
        PHARDWARE pHardware
            Pointer to hardware instance.

        UCHAR bPort
            The port index.

        USHORT wAddr
            The address of the counter.

        PULONGLONG pqData
            Buffer to store the counter.

    Return (None):
*/

#ifdef KS_PCI_BUS
void PortReadMIBCounter_PCI
#else
void PortReadMIBCounter_ISA
#endif
(
    PHARDWARE  pHardware,
    UCHAR      bPort,
    USHORT     wAddr,
    PULONGLONG pqData )
{
    ULONG      dwData;
    UCHAR      bAddr;
    UCHAR      bCtrl;
    USHORT     wCtrlAddr;

#ifdef KS_PCI_BUS
    ULONG InterruptMask;

#else
    USHORT InterruptMask;
#endif
    int   cnTimeOut;

    wAddr += PORT_COUNTER_NUM * bPort;
    bAddr = ( UCHAR ) wAddr;
    bCtrl = ( UCHAR )(( TABLE_MIB << TABLE_SEL_SHIFT ) | ( wAddr >> 8 ) |
        TABLE_READ );

    wCtrlAddr = bCtrl;
    wCtrlAddr = (wCtrlAddr << 8) | bAddr ;

    /* Save the current interrupt mask and block all interrupts. */
    InterruptMask = HardwareBlockInterrupt( pHardware );

#ifdef KS_ISA_BUS
    HardwareWriteRegWord( pHardware,
                                  (UCHAR)REG_IND_ACC_CTRL_BANK,
                                  (UCHAR)REG_IACR_OFFSET,
                                  wCtrlAddr
                                );
#else
    HW_WRITE_WORD( pHardware, REG_IACR_OFFSET, wCtrlAddr );
#endif

    for ( cnTimeOut = 100; cnTimeOut > 0; cnTimeOut-- )
    {

#ifdef KS_ISA_BUS
        HardwareSelectBank( pHardware, REG_IND_ACC_CTRL_BANK );
        HardwareReadRegDWord( pHardware,
                                 (UCHAR)REG_IND_ACC_CTRL_BANK,
                                 (UCHAR)REG_ACC_DATA_0_OFFSET,
                                 (PULONG)&dwData
                               );
#else
        HW_READ_DWORD( pHardware, REG_ACC_DATA_0_OFFSET, &dwData );
#endif

        if ( ( dwData & MIB_COUNTER_VALID ) )
        {
            if ( ( dwData & MIB_COUNTER_OVERFLOW ) )
            {
                *pqData += MIB_COUNTER_VALUE + 1;
            }
            *pqData += dwData & MIB_COUNTER_VALUE;
            break;
        }
    }

    /* Restore the interrupt mask. */
    HardwareSetInterrupt( pHardware, InterruptMask );
}  /* PortReadMIBCounter */


/*
    PortReadMIBPacket

    Description:
        This routine reads the dropped packet counts of the port.
        Hardware interrupts are disabled to minimize corruption of read data.

    Parameters:
        PHARDWARE pHardware
            Pointer to hardware instance.

        UCHAR bPort
            The port index.

        PULONGLONG pqData
            Buffer to store the receive and transmit dropped packet counts.

    Return (None):
*/

#ifdef KS_PCI_BUS
void PortReadMIBPacket_PCI
#else
void PortReadMIBPacket_ISA
#endif
(
    PHARDWARE  pHardware,
    UCHAR      bPort,
    PULONG     pdwCurrent,
    PULONGLONG pqData )
{
    ULONG     dwCurrent;
    ULONG     dwData = 0;
    USHORT    wAddr;
    UCHAR     bAddr;
    UCHAR     bCtrl;
    USHORT    wCtrlAddr;

#ifdef KS_PCI_BUS
    ULONG     InterruptMask;

#else
    USHORT    InterruptMask;
#endif


    wAddr = MIB_COUNTER_PACKET_DROPPED_RX_0 + bPort;
    bAddr = ( UCHAR ) wAddr;
    bCtrl = ( UCHAR )(( TABLE_MIB << TABLE_SEL_SHIFT ) | ( wAddr >> 8 ) |
        TABLE_READ );

    wCtrlAddr = bCtrl;
    wCtrlAddr = (wCtrlAddr << 8) | bAddr ;

    /* Save the current interrupt mask and block all interrupts. */
    InterruptMask = HardwareBlockInterrupt( pHardware );

#ifdef KS_ISA_BUS
    HardwareWriteRegWord( pHardware,
                          (UCHAR)REG_IND_ACC_CTRL_BANK,
                          (UCHAR)REG_IACR_OFFSET,
                          wCtrlAddr
                        );
    HardwareReadRegDWord( pHardware,
                          (UCHAR)REG_IND_ACC_CTRL_BANK,
                          (UCHAR)REG_ACC_DATA_0_OFFSET,
                          &dwData
                        );
#else
    HW_WRITE_WORD( pHardware, REG_IACR_OFFSET, wCtrlAddr );
    HW_READ_DWORD( pHardware, REG_ACC_DATA_0_OFFSET, &dwData );

#endif

    dwData &= MIB_COUNTER_PACKET_DROPPED;
    dwCurrent = *pdwCurrent;
    if ( dwData != dwCurrent )
    {
        if ( dwData < dwCurrent )
        {
            dwData += MIB_COUNTER_PACKET_DROPPED + 1;
        }
        dwData -= dwCurrent;
        *pqData += dwData;
        *pdwCurrent = dwCurrent;
    }
    ++pdwCurrent;
    ++pqData;
    wAddr = MIB_COUNTER_PACKET_DROPPED_TX_0 + bPort;
    bAddr = ( UCHAR ) wAddr;

    wCtrlAddr = bCtrl;
    wCtrlAddr = (wCtrlAddr << 8) | bAddr ;

#ifdef KS_ISA_BUS
    HardwareSelectBank( pHardware, REG_IND_ACC_CTRL_BANK );

    HardwareWriteRegWord( pHardware,
                          (UCHAR)REG_IND_ACC_CTRL_BANK,
                          (UCHAR)REG_IACR_OFFSET,
                          wCtrlAddr
                        );
    HardwareReadRegDWord( pHardware,
                          (UCHAR)REG_IND_ACC_CTRL_BANK,
                          (UCHAR)REG_ACC_DATA_0_OFFSET,
                          &dwData
                        );
#else
    HW_WRITE_WORD( pHardware, REG_IACR_OFFSET, wCtrlAddr );
    HW_READ_DWORD( pHardware, REG_ACC_DATA_0_OFFSET, &dwData );
#endif

    dwData &= MIB_COUNTER_PACKET_DROPPED;
    dwCurrent = ( ULONG )( *pqData & MIB_COUNTER_PACKET_DROPPED );
    if ( dwData != dwCurrent )
    {
        if ( dwData < dwCurrent )
        {
            dwData += MIB_COUNTER_PACKET_DROPPED + 1;
        }
        dwData -= dwCurrent;
        *pqData += dwData;
    }

    /* Restore the interrupt mask. */
    HardwareSetInterrupt( pHardware, InterruptMask );
}  /* PortReadMIBPacket */


#if defined( KS_ISA_BUS )  ||  !defined( KS_ISA )

/*
    PortReadCounters

    Description:
        This routine is used to read the counters of the port periodically to
        avoid counter overflow.  The hardware should be acquired first before
        calling this routine.

    Parameters:
        PHARDWARE pHardware
            Pointer to hardware instance.

        UCHAR bPort
            The port index.

    Return (int):
        non-zero when not all counters not read.
*/

int PortReadCounters (
    PHARDWARE pHardware,
    UCHAR     bPort )
{
    PPORT_CONFIG pPort = &pHardware->m_Port[ bPort ];

#ifdef KS_PCI_BUS
    ULONG        IntEnable;
    ULONG        IntMask = pHardware->m_ulInterruptMask;

#else
    USHORT       IntEnable;
    USHORT       IntMask = pHardware->m_wInterruptMask;
#endif

    ASSERT( pHardware->m_bAcquire );

    do
    {
        PortReadMIBCounter( pHardware, bPort, pPort->bCurrentCounter,
            &pPort->cnCounter[ pPort->bCurrentCounter ]);
        ++pPort->bCurrentCounter;

        /* Do table read in stages to allow interrupt processing. */
        HardwareReadInterrupt( pHardware, &IntEnable );
        if ( (( IntMask & IntEnable ) & INT_RX ) )
            return( pPort->bCurrentCounter );

#if (0)
        switch ( pPort->bCurrentCounter )
        {
            case MIB_COUNTER_RX_UNDERSIZE:
                return( pPort->bCurrentCounter );
            case MIB_COUNTER_RX_SYMBOL_ERR:
                return( pPort->bCurrentCounter );
            case MIB_COUNTER_RX_BROADCAST:
                return( pPort->bCurrentCounter );
            case MIB_COUNTER_RX_OCTET_64:
                return( pPort->bCurrentCounter );
            case MIB_COUNTER_TX_LO_PRIORITY:
                return( pPort->bCurrentCounter );
            case MIB_COUNTER_TX_BROADCAST:
                return( pPort->bCurrentCounter );
            case MIB_COUNTER_TX_TOTAL_COLLISION:
                return( pPort->bCurrentCounter );
        }
#endif
    } while ( pPort->bCurrentCounter < PORT_COUNTER_NUM );
    if ( bPort < HOST_PORT )
        PortReadMIBPacket( pHardware, bPort, pPort->cnDropped,
            &pPort->cnCounter[ pPort->bCurrentCounter ]);
    pPort->bCurrentCounter = 0;
    return 0;
}  /* PortReadCounters */


/*
    PortInitCounters

    Description:
        This routine is used to initialize all counters to zero if the hardware
        cannot do it after reset.

    Parameters:
        PHARDWARE pHardware
            Pointer to hardware instance.

        UCHAR bPort
            The port index.

    Return (None):
*/

void PortInitCounters (
    PHARDWARE pHardware,
    UCHAR     bPort )
{
    PPORT_CONFIG pPort = &pHardware->m_Port[ bPort ];


    ASSERT( pHardware->m_bAcquire );

    pPort->bCurrentCounter = 0;
    do
    {
        PortReadMIBCounter( pHardware, bPort, pPort->bCurrentCounter,
            &pPort->cnCounter[ pPort->bCurrentCounter ]);
        ++pPort->bCurrentCounter;
    } while ( pPort->bCurrentCounter < PORT_COUNTER_NUM );

    PortReadMIBPacket( pHardware, bPort, pPort->cnDropped,
        &pPort->cnCounter[ pPort->bCurrentCounter ]);
    memset(( void* ) pPort->cnCounter, 0,
        sizeof( ULONGLONG ) * TOTAL_PORT_COUNTER_NUM );
    pPort->bCurrentCounter = 0;
}  /* PortInitCounters */


#endif

⌨️ 快捷键说明

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