📄 swmodl.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: swmodl.c
*
* Purpose: Module card detecting and setting functions
*
* Author: Tevin Chen
*
* Date: Jan 08, 2002
*
* Functions:
*
* Revision History:
*
*/
#if !defined(__PLATFORM_H__)
#include "platform.h"
#endif
#if !defined(__SWCFG_H__)
#include "swcfg.h"
#endif
#if !defined(__SWITCH_H__)
#include "switch.h"
#endif
#if !defined(__SWREG_H__)
#include "swreg.h"
#endif
#if !defined(__SWEEP_H__)
#include "sweep.h"
#endif
#if !defined(__SWMII_H__)
#include "swmii.h"
#endif
#if !defined(__SWMODL_H__)
#include "swmodl.h"
#endif
/*--------------------- Static Definitions ------------------------*/
#define PIN_DEFINE_NC 0x0F
/*--------------------- Static Types ------------------------------*/
/*--------------------- Static Macros -----------------------------*/
/*--------------------- Static Classes ----------------------------*/
/*--------------------- Static Variables --------------------------*/
volatile UINT8 *sg_pioModuleAddr = (volatile UINT8 *)PLAT_ASIC_MODULE_BASE_ADDR;
/*--------------------- Static Functions --------------------------*/
static UINT8 s_byGetTypeFromModlEeprom(UINT8 byModuleCardId);
static UINT8 s_byGetTypeFromMoldPinDef(UINT8 byModuleCardId);
static UINT8 s_byGetTypeFromStrapping(UINT8 byModuleCardId);
static BOOL s_bIsModulePresent (UINT8 byModuleCardId);
/*--------------------- Export Variables --------------------------*/
UINT8 SWMODL_byDetectModuleType (UINT8 byModuleCardId)
{
UINT8 byModuleType;
// Check module card present
if (!s_bIsModulePresent(byModuleCardId) )
return MOD_CARD_NA;
byModuleType = MOD_CARD_NA;
// If Module card on board i2c eeprom exist, read from i2c eeprom
byModuleType = s_byGetTypeFromModlEeprom(byModuleCardId);
// 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_byGetTypeFromMoldPinDef(byModuleCardId);
// If pin define NC, read switch strapping information
if (byModuleType == MOD_CARD_NA)
byModuleType = s_byGetTypeFromStrapping(byModuleCardId);
return byModuleType;
}
void SWMODL_vEEPCalCheckSum (UINT8 u8ModId, UINT16 wCksumSize)
{
UINT8 bySromPtr;
UINT8 byCheckSum = 0;
UINT16 ii, wStartAddr = MOD_CARD0_EEP_ADDR_SIGNATURE + u8ModId * MOD_CARD_EEP_SIZE;
for (ii = 0; ii < (wCksumSize - 1); ii++) {
SWEEP_bReadU8(wStartAddr + ii, &bySromPtr);
byCheckSum ^= bySromPtr;
}
SWEEP_bWriteU8((UINT16)(MOD_CARD0_EEP_ADDR_CHECKSUM + u8ModId * MOD_CARD_EEP_SIZE), byCheckSum);
}
static UINT8 s_byGetTypeFromModlEeprom(UINT8 byModuleCardId)
{
UINT8 byData = 0;
UINT8 byChecksum = 0;
UINT16 ui, u16CksumSize;
UINT16 byStartAddr = MOD_CARD0_EEP_BASE_ADDR + MOD_CARD_EEP_SIZE * byModuleCardId;
// If on baord i2c eeprom exist, check module card signature
SWEEP_bReadU8(MOD_CARD0_EEP_ADDR_SIGNATURE + byModuleCardId * MOD_CARD_EEP_SIZE, &byData);
if (byData != MOD_CARD_SIGNATURE)
return MOD_CARD_NA;
SWEEP_bReadU8(MOD_CARD0_EEP_ADDR_CKSUMSIZE + byModuleCardId * MOD_CARD_EEP_SIZE, &byData);
u16CksumSize = byData * CHECKSUM_SIZE_UNIT;
// Check Module Card Checksum value to varify eeprom value correct.
for (ui = 0; ui < u16CksumSize; ui++) {
SWEEP_bReadU8(byStartAddr + ui, &byData);
byChecksum ^= byData;
}
if (byChecksum != 0)
return MOD_CARD_NA;
// Check module card type
SWEEP_bReadU8(MOD_CARD0_EEP_ADDR_TYPE + byModuleCardId * MOD_CARD_EEP_SIZE, &byData);
return byData;
}
static UINT8 s_byGetTypeFromMoldPinDef(UINT8 byModuleCardId)
{
UINT8 byPinDefineData = 0;
#if defined(__SWITCH_CPUIF_PCI) || defined(__CPU_S3C2510A)
//S3C2510A
byPinDefineData = (ASIC_IOP_DATA1 >> 5);
#else
byPinDefineData = *sg_pioModuleAddr;
#endif
if (byModuleCardId)
byPinDefineData >>= 0x04;
else
byPinDefineData &= 0x0F;
if (byPinDefineData == PIN_DEFINE_NC)
return MOD_CARD_NA;
return byPinDefineData;
}
static UINT8 s_byGetTypeFromStrapping(UINT8 byModuleCardId)
{
UINT16 u16GigaStrapping;
// Get giga port strapping value
SWREG_vReadU16(INITCTL_CHIP_STRAP_CFG, &u16GigaStrapping);
if (((byModuleCardId == 0) && (u16GigaStrapping & CHIP_CFG_GIGA0_GMII))
|| ((byModuleCardId == 1) && (u16GigaStrapping & CHIP_CFG_GIGA1_GMII)) ) {
// GMII mode
return MOD_CARD_1000TX;
}
else {
// If TBI, it must be 1000FX(single) mode.
return MOD_CARD_1000FX_SIGMODE;
}
}
static BOOL s_bIsModulePresent (UINT8 byModuleCardId)
{
if (SWREG_bIsBitsOnU8(PHYCTL_PORT24_TBI_MODE + (byModuleCardId*2), MODULE_CARD_PRESENT) )
return TRUE;
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -