📄 pimod.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 + -