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

📄 pimod.c

📁 VIA VT6524 8口网管交换机源码
💻 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:    pimod.c
 *
 * Purpose: Module card detecting and setting functions
 *
 * Author:  Tevin Chen
 *
 * Date:    Jan 08, 2002
 *
 * Functions:
 *
 * Revision History:
 *
 */


#ifndef __ASIC_VT6524

#include "switch.h"
#include "swreg.h"
#include "sweep.h"
#include "swport.h"
#include "pimod.h"
#include "pidef.h"
#include "pidiag.h"
#include "pieeprom.h"
#include "piport.h"




// spd/dup string map, mapping to g_aszSpdDpxCfg
// the first ability is default value of eeprom
//MOD_CARD_NA
DIRECT_MEMTYPE_CODE BYTE g_abySpdDupStringMap0[] = {0,1,2,3,4,5,6,7};
//MOD_CARD_1000TX
DIRECT_MEMTYPE_CODE BYTE g_abySpdDupStringMap1[] = {PORT_SPDPX_AUTO, PORT_SPDPX_100M_FULL, PORT_SPDPX_100M_HALF, PORT_SPDPX_10M_FULL, PORT_SPDPX_10M_HALF};
//MOD_CARD_1000FX_DULMODE
DIRECT_MEMTYPE_CODE BYTE g_abySpdDupStringMap2[] = {PORT_SPDPX_AUTO, PORT_SPDPX_1000M_FULL, PORT_SPDPX_1000M_HALF};
//MOD_CARD_1000FX_SIGMODE(TBI)
DIRECT_MEMTYPE_CODE BYTE g_abySpdDupStringMap3[] = {PORT_SPDPX_1000M_FULL};
//MOD_CARD_100TX
DIRECT_MEMTYPE_CODE BYTE g_abySpdDupStringMap4[] = {PORT_SPDPX_AUTO, PORT_SPDPX_100M_FULL, PORT_SPDPX_100M_HALF, PORT_SPDPX_10M_FULL, PORT_SPDPX_10M_HALF};
//MOD_CARD_100FX_DULMODE
DIRECT_MEMTYPE_CODE BYTE g_abySpdDupStringMap5[] = {PORT_SPDPX_AUTO, PORT_SPDPX_100M_FULL, PORT_SPDPX_100M_HALF, PORT_SPDPX_10M_FULL, PORT_SPDPX_10M_HALF};
//MOD_CARD_100FX_SIGMODE
DIRECT_MEMTYPE_CODE BYTE g_abySpdDupStringMap6[] = {PORT_SPDPX_100M_FULL};

DIRECT_MEMTYPE_CODE SStringTableMap g_aSStrMapSpdDup[MOD_CARD_TYPE_NUM] = {
    {0, g_abySpdDupStringMap0},
    {sizeof(g_abySpdDupStringMap1), g_abySpdDupStringMap1},
    {sizeof(g_abySpdDupStringMap2), g_abySpdDupStringMap2},
    {sizeof(g_abySpdDupStringMap3), g_abySpdDupStringMap3},
    {sizeof(g_abySpdDupStringMap4), g_abySpdDupStringMap4},
    {sizeof(g_abySpdDupStringMap5), g_abySpdDupStringMap5},
    {sizeof(g_abySpdDupStringMap6), g_abySpdDupStringMap6}
};
DIRECT_MEMTYPE_CODE SGigaPortCfg g_aSPortCfgDefault[MOD_CARD_TYPE_NUM] = {
    {LISTBOX_ENDIS_NA, LISTBOX_ONOFF_NA, LISTBOX_SPDDPX_NA, LISTBOX_ONOFF_NA},    // for N/A
    {DEFAULT_PORT_ENABLE, 1, g_abySpdDupStringMap1, DEFAULT_FLOW_CONTROL},
    {DEFAULT_PORT_ENABLE, 1, g_abySpdDupStringMap2, DEFAULT_FLOW_CONTROL},
    {DEFAULT_PORT_ENABLE, 0, g_abySpdDupStringMap3, DEFAULT_FLOW_CONTROL},
    {DEFAULT_PORT_ENABLE, 1, g_abySpdDupStringMap4, DEFAULT_FLOW_CONTROL},
    {DEFAULT_PORT_ENABLE, 1, g_abySpdDupStringMap5, DEFAULT_FLOW_CONTROL},
    {DEFAULT_PORT_ENABLE, 0, g_abySpdDupStringMap6, DEFAULT_FLOW_CONTROL},
};

/*---------------------  Static Definitions -------------------------*/
#define BITID_GLOBAL_FORCE_MII      0x10
#define BITID_GLOBAL_GIGA1_GMII     0x04
#define BITID_GLOBAL_GIGA2_GMII     0x08

#define PIN_DEFINE_NC               0x0f

#define MOD_CARD_SIGNATURE          0x73

//Define Module on board eeprom address
#define MOD_CARD0_EEP_BASE_ADDR     512
#define MOD_CARD_EEP_SIZE           256
#define DESCRIP_SIZE                32

#define MOD_CARD0_EEP_ADDR_VERSION      MOD_CARD0_EEP_BASE_ADDR + 0x0
#define MOD_CARD0_EEP_ADDR_SIGNATURE    MOD_CARD0_EEP_BASE_ADDR + 0x1
#define MOD_CARD0_EEP_ADDR_MOD_VERSION  MOD_CARD0_EEP_BASE_ADDR + 0x2
#define MOD_CARD0_EEP_ADDR_TYPE         MOD_CARD0_EEP_BASE_ADDR + 0x3
#define MOD_CARD0_EEP_ADDR_DESCRIP      MOD_CARD0_EEP_BASE_ADDR + 0x4

/*---------------------  Static Classes  ----------------------------*/

/*---------------------  Static Variables  --------------------------*/

/*---------------------  Static Functions  --------------------------*/
#define s_vSetModuleType(byModuleCardId, byType) SWEEP_bWriteB(EEP_ADDR_MOD_CARD_TYPE+byModuleCardId, byType)


/*---------------------  Export Variables  --------------------------*/

/*---------------------  Export Functions  --------------------------*/
#ifdef __ASIC_VT6526

#ifdef __DETECT_MOD_CARD_BY_EEPROM
static BYTE s_byGetTypeFromEeprom(UINT8 byModuleCardId) DIRECT_FUNTYPE_REENT
{
    BYTE    byData = 0;
    BYTE    byChecksum = 0;
    UINT16  ui;
    UINT16  byStartAddr = MOD_CARD0_EEP_BASE_ADDR + MOD_CARD_EEP_SIZE * byModuleCardId;

    // If on baord i2c eeprom exist, check module card signature
    SWEEP_bReadB(MOD_CARD0_EEP_ADDR_SIGNATURE + byModuleCardId * MOD_CARD_EEP_SIZE, &byData);
    if (byData != MOD_CARD_SIGNATURE)
        return MOD_CARD_NA;

    // Check Module Card Checksum value to varify eeprom value correct.
    for (ui = 0; ui < MOD_CARD_EEP_SIZE; ui++) {
    	SWEEP_bReadB(byStartAddr + ui, &byData);
        byChecksum ^= byData;
    }

    if (byChecksum != 0)
        return MOD_CARD_NA;

    // Check module card type
    SWEEP_bReadB(MOD_CARD0_EEP_ADDR_TYPE + byModuleCardId * MOD_CARD_EEP_SIZE, &byData);

    return byData;
}
#endif


#ifdef __DETECT_MOD_CARD_BY_PIN_DEF
xdata BYTE x_byModuleAddr _at_ 0xD0FF;

static BYTE s_byGetTypeFromPinDef(UINT8 byModuleCardId) DIRECT_FUNTYPE_REENT
{
    UINT8  byPinDefineData = 0;

    byPinDefineData = x_byModuleAddr;

    if (byModuleCardId)
        byPinDefineData >>= 0x04;
    else
        byPinDefineData &= 0x0F;

    if (byPinDefineData == PIN_DEFINE_NC)
        return MOD_CARD_NA;

    return byPinDefineData;
}
#endif


#ifdef __DETECT_MOD_CARD_BY_STRAPPING
static BYTE s_byGetTypeFromStrapping(UINT8 byModuleCardId) DIRECT_FUNTYPE_REENT
{
    UINT8 byGigaStrapping = 0;

    // Get giga port strapping value
    SWREG_vReadB(GLOBAL_CHIP_CFG+1, &byGigaStrapping);

    // If force mii mode, it must both be 100TX mode
    if (!(byGigaStrapping & BITID_GLOBAL_FORCE_MII))
    {
        if (PIDIAG_bMiiReadWriteTest(SWITCH_GIGA_PORT_ID_BASE + byModuleCardId))
            return MOD_CARD_100TX;
        else
            return MOD_CARD_NA;
    }

    if (  ((byModuleCardId==0) && (byGigaStrapping&BITID_GLOBAL_GIGA1_GMII))
       || ((byModuleCardId==1) && (byGigaStrapping&BITID_GLOBAL_GIGA2_GMII)) )
    {
        // If GMII mode , do mii read/write test.
        // If pass, it must be 1000TX, fail must be no connection.
        if (PIDIAG_bMiiReadWriteTest(SWITCH_GIGA_PORT_ID_BASE + byModuleCardId))
            return MOD_CARD_1000TX;
        else
            return MOD_CARD_NA;
    }
    else
    {
        // If TBI, it must be 1000FX(single) mode.
        return MOD_CARD_1000FX_SIGMODE;
    }
}
#endif

#endif


void PIMOD_vDetectModuleCard(void) DIRECT_FUNTYPE_REENT
{
    UINT8 byModuleCardId, byModuleType;
    BOOL bUpdateChecksum = 0;

    // Scan all module card.
    // the order of getting module type = eeprom -> pin define -> strapping
    for (byModuleCardId = 0; byModuleCardId < SWITCH_GIGA_PORT_NUM; byModuleCardId++)
    {
#ifdef __ASIC_VT6526D
        byModuleType = MOD_CARD_100TX;
#else
        byModuleType = MOD_CARD_NA;

#ifdef __DETECT_MOD_CARD_BY_EEPROM
        // If Module card on board i2c eeprom exist, read from i2c eeprom
        byModuleType = s_byGetTypeFromEeprom(byModuleCardId);
#endif

#ifdef __DETECT_MOD_CARD_BY_PIN_DEF
        // If on board i2c eeprom does not exist, judge pin define.
        // If Module card has pin definition, read pin define data
        if (byModuleType == MOD_CARD_NA)
            byModuleType = s_byGetTypeFromPinDef(byModuleCardId);
#endif

#ifdef __DETECT_MOD_CARD_BY_STRAPPING
        // If pin define NC, read switch strapping information
        if (byModuleType == MOD_CARD_NA)
            byModuleType = s_byGetTypeFromStrapping(byModuleCardId);
#endif
#endif

        // According module phisical type, compare if module card change.
        if (PIMOD_byGetModuleType(byModuleCardId) != byModuleType)
        {
            // If Module card change, write back new phisical type value and
            // set port to default by physical type.
            s_vSetModuleType(byModuleCardId, byModuleType);
            PIEEP_vSetCfgIntoEep((PBYTE)(g_aSPortCfgDefault + byModuleType),
                                 EEP_ADDR_GIGA_PORT_CFG + EEP_SIZE_GIGA_PORT_OFFSET * byModuleCardId,
                                 EEP_SIZE_GIGA_PORT_OFFSET);
            bUpdateChecksum = 1;
        }
    }

    if (bUpdateChecksum)
        PIEEP_vUpdateChecksum();
}

BYTE PIMOD_byGetModuleType(BYTE byModuleCardId) DIRECT_FUNTYPE_REENT
{
    BYTE byType = MOD_CARD_NA;
    SWEEP_bReadB(EEP_ADDR_MOD_CARD_TYPE+byModuleCardId, &byType);
    return byType;
}

#endif

⌨️ 快捷键说明

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