📄 dm9isa.cpp
字号:
a= b= c= d= WSTR("NA");
if (rData&0x8000) a= WSTR("100FDX");
if (rData&0x4000) b= WSTR("100HALF");
if (rData&0x2000) c= WSTR("10FDX");
if (rData&0x1000) d= WSTR("10HALF");
switch (m_LSMode)
{
case LINKSPEED_AUTO:
WPrintf(WSTR(" -A.N.Done: [%s][%s][%s][%s] 0x%x\r\n"), a,b,c,d, rData);
break;
case LINKSPEED_HALF100BASE:
WPrintf(WSTR(" -100H.Done: [%s][%s][%s][%s] 0x%x\r\n"), a,b,c,d, rData);
break;
case LINKSPEED_HALF10BASE:
WPrintf(WSTR(" -10H.Done: [%s][%s][%s][%s] 0x%x\r\n"), a,b,c,d, rData);
break;
default: // otherwise
WPrintf(WSTR(" -??CkSts??.Done: [%s][%s][%s][%s] 0x%x\r\n"), a,b,c,d, rData);
break;
}
monitor= rData & 0x000f;
//Show_BMCR.
rData= DeviceReadPhy(0, 0);
a= b= c= d= WSTR("NA");
if (rData&0x2000) { // 100M
if (rData&0x0100)
a= WSTR("100MFull");
else
b= WSTR("100MHalf");
}else{ // 10M
if (rData&0x0100)
c= WSTR("10MFull");
else
d= WSTR("10MHalf");
}
WPrintf(WSTR(" -BMCR.Stat: [%s][%s][%s][%s] 0x%x\r\n"), a,b,c,d, rData);
return monitor==0x8;
}
BOOL DM9ISA::OP_ShowLinkMode(int PIndex)
{
WORD rData, monitor;
LPWSTR a,b,c,d;
//Show_A.N.
rData= DeviceReadPhy(PIndex, MIIADDR_SPSTAT); //* 17.[15:12]=
a= b= c= d= WSTR("NA");
if (rData&0x8000) a= WSTR("100FDX");
if (rData&0x4000) b= WSTR("100HALF");
if (rData&0x2000) c= WSTR("10FDX");
if (rData&0x1000) d= WSTR("10HALF");
switch (m_LSMode)
{
case LINKSPEED_AUTO:
WPrintf(WSTR(" -(PHY-%d) A.N.Done: [%s][%s][%s][%s] 0x%x (PHY-%d)\r\n"), PIndex, a,b,c,d, rData );
break;
case LINKSPEED_HALF100BASE:
WPrintf(WSTR(" -(PHY-%d) 100H.Done: [%s][%s][%s][%s] 0x%x (PHY-%d)\r\n"), PIndex, a,b,c,d, rData );
break;
case LINKSPEED_HALF10BASE:
WPrintf(WSTR(" -(PHY-%d) 10H.Done: [%s][%s][%s][%s] 0x%x (PHY-%d)\r\n"), PIndex, a,b,c,d, rData );
break;
default: // otherwise
WPrintf(WSTR(" -(PHY-%d) ??CkSts??.Done: [%s][%s][%s][%s] 0x%x (PHY-%d)\r\n"), PIndex, a,b,c,d, rData );
break;
}
monitor= rData & 0x000f;
//Show_BMCR.
rData= DeviceReadPhy(PIndex, 0);
a= b= c= d= WSTR("NA");
if (rData&0x2000) { // 100M
if (rData&0x0100)
a= WSTR("100MFull");
else
b= WSTR("100MHalf");
}else{ // 10M
if (rData&0x0100)
c= WSTR("10MFull");
else
d= WSTR("10MHalf");
}
WPrintf(WSTR(" -(PHY-%d) BMCR.Stat: [%s][%s][%s][%s] 0x%x \r\n"), PIndex, a,b,c,d, rData );
return monitor==0x8;
}
/************************************************************************
*
* Definition:
* set link mode to NIC.
*
*************************************************************************/
BOOL DM9ISA::LnkStat_SetLinkMode(int linkMode, LPWSTR modename)
{
//( _T("LnkStat_SetLinkMode_"), modename, LinkNameTbl[linkMode] );
int Ret;
OP_SetLinkMode(linkMode);
if (Ret= LnkStat_WaitLinkUp())
WPrintf(_T("Exit: LnkStat_SetLinkMode() \r\n"));
return Ret;
}
BOOL DM9ISA::ISA_LinkUp(void)
{
BYTE Ctl, Mod;
BOOL MYLinkProcess;
if (m_nMaxTxPending==1) //DM9000E
{
WPrintf(_T(" [LinkUp: DM9000E No MDIX_Ctrl] \r\n"));
MYLinkProcess= ISA_LinkUpProcess(PAD_FIX_MODE);
//MYLinkProcess=_ISA_LinkUpProcess(_MDIX_MODE)
//MYLinkProcess=_ISA_LinkUpProcess(_MDI_MODE)
if (MYLinkProcess)
WPrintf(_T(" DM9000= [Link OK] \r\n"));
else
WPrintf(_T(" DM9000= [Un-Link] \r\n"));
}
else
{
int i= MDIX_CNTL_MODE_ENUM;
if (m_auto_mdix_flgb)
i= AUTO_MDIX_MODE;
Ctl= m_btEeprom[7]>>6; // from parent
Mod= (m_btEeprom[15]&0x40)>>6; // from parent
/*
_PSTR(_T(" (EEPROM B07-bit[7:6])= bit[1:0]=0x%02X \r\n"), Ctl);
_PSTR(_T(" (EEPROM B15-bit[6])= bit[0]=%d \r\n"), Mod);
if (Ctl==0x01 && Mod==0)
_PSTR(_T(" [EEPROM_Display: Auto_MDIX Off] \r\n"));
else if (Ctl==0x01 && Mod==1)
_PSTR(_T(" [EEPROM_Display: Auto_MDIX On] \r\n"));
else
_PSTR(_T(" [EEPROM_Invalid_Display: Default Auto_MDIX On] \r\n"));
_PSTR(_T(" [PHY_REG20.4]= 0: En Auto, 1: Dis Auto \r\n"));
if (i==AUTO_MDIX_MODE)
_PSTR(_T(" 0: [Auto_MDIX_MODE twice] \r\n"));
else
_PSTR(_T(" 1: [Enum to MDIX & MDI -Individually] \r\n"));
*/
//Mdix_Ctrl_Enum
if (i==MDIX_CNTL_MODE_ENUM)
{
WPrintf(_T(" [LinkUp: MDIX_Ctrl_Enum] \r\n"));
//WORD rData;
//rData= DeviceReadPhy(0, 1);
//WPrintf(_T("FIX-TXRX:BMSR= %04x for A.N. - LkUp \r\n"), rData);
if ( !(MYLinkProcess=ISA_LinkUpProcess(MDIX_MODE)) ){
_PSTR(_T(" [Restart Auto-Negotiation] \r\n"));
#ifdef IMPL_TST_FORCE_100H
DeviceWritePhy(0, 0, PARAM_100H/*PARAM_10H*/);
#else
DeviceWritePhy(0, 0, DEV_LSMode(LINKSPEED_AUTO)
/*0x3300*//*0x1200*/); //(OP_SetLinkMode()) 1000 or 3100(default) AUTO (N-WAY)+Auto_Restart
#endif
MYLinkProcess= ISA_LinkUpProcess(MDI_MODE);
}
}
//AutoMDIX
if (i==AUTO_MDIX_MODE)
{
WPrintf(_T(" [LinkUp: AUTO_MDIX_MODE] \r\n"));
//rData= DeviceReadPhy(0, 1);
//WPrintf(_T("AUTO-MDIX:BMSR= %04x for A.N. - LkUp \r\n"), rData);
if ( !(MYLinkProcess= ISA_LinkUpProcess(AUTO_MDIX_MODE)) ){
_PSTR(_T(" [Restart Auto-Negotiation] \r\n"));
#ifdef IMPL_TST_FORCE_100H
DeviceWritePhy(0, 0, PARAM_100H/*PARAM_10H*/);
#else
DeviceWritePhy(0, 0, DEV_LSMode(LINKSPEED_AUTO)
/*0x3300*//*0x1200*/); //(OP_SetLinkMode()) 1000 or 3100(default) AUTO (N-WAY)+Auto_Restart
#endif
MYLinkProcess= ISA_LinkUpProcess(AUTO_MDIX_MODE);
}
}
// [Final MDI or MDIX mode! PHY-Reg(20.7) ]
bool mdix_cntl_status_flgb= (DeviceReadPhy(0, MIIADDR_SCFG)&MAKE_MASK1(7))? 1:0;
if (mdix_cntl_status_flgb)
{
WPrintf(_T(" 1= MDIX (readPHY) \r\n"));
DeviceWritePhy(0, MIIADDR_SCFG, 0x0030);
//* 20.5|20.4=11 MDIX mode // force_mdix_fix_to_mdix
if (MYLinkProcess)
WPrintf(_T(" 1 Set MDIX= [Link OK] \r\n"));
else
WPrintf(_T(" 1 Set MDIX= [Un-Link] \r\n"));
}
else
{
WPrintf(_T(" 0= MDI (readPHY) \r\n"));
DeviceWritePhy(0, MIIADDR_SCFG, MAKE_UNMASK1(5)|MAKE_MASK1(4));
//* 20.bit[5:4]= 0x0010= 01 MDI mode //force_mdix_fix_to_mdi
if (MYLinkProcess)
WPrintf(_T(" 0 Set MDI= [Link OK] \r\n"));
else
WPrintf(_T(" 0 Set MDI= [Un-Link] \r\n"));
}
}
return MYLinkProcess; //TRUE;
}
BOOL DM9ISA::ISA_LinkUpProcess(int i) // [ORG=LinkState_LinkUp()]
{
int Ret;
BOOL Lm;
if (m_nMaxTxPending==1) //DM9000E
{
//i:PAD_FIX_MODE
}
else
{
/* [Enter: LinkSpeed_Auto] */
if (i==MDI_MODE){
DeviceWritePhy(0, MIIADDR_SCFG, MAKE_UNMASK1(5)|MAKE_MASK1(4)); //force_mdix_fix_to_mdi
//* 20.bit[5:4]= 0x0010= 01 MDI mode
NdisMSleep(uSec500);
_PSTR_REL(_T("===> LinkUp-ENTER: PHYReg00-0x%04X \r\n"), LinkState_GetBMCR(0x00));
_PSTR_REL(ModeNameTbl[i]);
}
else if (i==MDIX_MODE){
DeviceWritePhy(0, MIIADDR_SCFG, 0x0030); // force_mdix_fix_to_mdix
//* 20.5|20.4=11 MDIX mode
NdisMSleep(uSec500);
_PSTR_REL(_T("===> LinkUp-ENTER: PHYReg00-0x%04X \r\n"), LinkState_GetBMCR(0x00));
_PSTR_REL(ModeNameTbl[i]);
}
else if (i==AUTO_MDIX_MODE){
DeviceWritePhy(0, MIIADDR_SCFG, 0x0000); // enable_auto_mdix_mode
// 20.5|20.4=x0 Auto-MDIX mode
NdisMSleep(uSec500);
_PSTR_REL(_T("===> LinkUp-ENTER: PHYReg00-0x%04X \r\n"), LinkState_GetBMCR(0x00));
_PSTR_REL(ModeNameTbl[i]);
}
NdisMSleep(mSec10); // 10 ms
}
Ret= LnkStat_WaitLinkUp(); // [Wait LinkUp]
OP_ShowLinkMode(); // [status now: not exactly here!]
if ( Ret )
return TRUE;
// [Not link yet]
Lm= LnkStat_SetLinkMode(LINKSPEED_HALF100BASE, ModNameT[i]);
OP_ShowLinkMode();
if (Lm) { //100M Half
WPrintf(WSTR(" Done: [LINKSPEED_HALF100BASE] \r\n"));
Lm= LnkStat_SetLinkMode(LINKSPEED_AUTO, ModNameT[i]);
OP_ShowLinkMode(); // not exactly here!
if (Lm){
WPrintf(WSTR(" Done: [LINKSPEED_AUTO] \r\n"));
return 104; //TRUE;
}
WPrintf(_T("[-set].[%s].[LINK 100M Half]\r\n"), ModNameT[i]);
#ifdef IMPL_TST_FORCE_100H
DeviceWritePhy(0, 0, PARAM_100H);
#else
DeviceWritePhy(0, 0, DEV_LSMode(LINKSPEED_HALF100BASE)); //100M Half
/*0x2000*/
#endif
NdisMSleep(mSec5); // 5 ms
return 102; //TRUE;
}
/*
//============
//Found connect to Corega FSW-8,
//Corega FSW-8 power off.
//The 10 M Half can link,
//So remove 10 M detect.
//LINKSPEED_Auto can do for it!
//JJ::2008.03.06
//============
if (_LnkStat_SetLinkMode(LINKSPEED_HALF10BASE, ModNameT[i])) //10M Half
{
if (_LnkStat_SetLinkMode(LINKSPEED_AUTO, ModNameT[i]))
return 104; //TRUE;
_PSTR(_T("[-set].[%s].[LINK 10M Half]\r\n"), ModNameT[i]);
_DeviceWritePhy(0, 0, 0x0000); //10M Half
NdisMSleep(mSec5); // 5 ms
return 102; //TRUE;
}
*/
#ifdef IMPL_TST_FORCE_100H
DeviceWritePhy(0, 0, PARAM_100H/*PARAM_10H*/);
#else
DeviceWritePhy(0, 0, (DEV_LSMode(LINKSPEED_AUTO) & 0xFDFF) | 0x2100); //Bad & Leave: 1000 or 3100(default) A.N.
/*0x3100*/
#endif
NdisMSleep(mSec5); // 5 ms
return 0; //FALSE;
}
WORD DM9ISA::LinkState_Op(int i) // [DISCARD]
{
WORD wLinkState;
//Auto(= N-Way)
DeviceWritePhy(0, 0, 0x3100); // En Auto-neg
//_DeviceWritePhy(0, 0, _0x1200); // Restart Auto-neg
NdisMSleep(mSec25); // 25 ms
wLinkState= LinkState_Get_BMSR(0x01);
if (wLinkState&0x0004){
_PSTR(_T("N-WAY--------------------------------------\r\n"));
return wLinkState;
}
//100M Half
DeviceWritePhy(0, 0, 0x2000); // Set 100M Half
NdisMSleep(mSec5); // 5 ms
wLinkState= LinkState_Get_BMSR(0x01);
if (wLinkState&0x0004){
_PSTR(_T("100M-Half--------------------------------------\r\n"));
//return wLinkState;
//Auto(= N-Way)
DeviceWritePhy(0, 0, 0x3100); // En Auto-neg
// _DeviceWritePhy(0, 0, _0x1200); // Restart Auto-neg
NdisMSleep(mSec25); // 25 ms
wLinkState= LinkState_Get_BMSR(0x01);
if (wLinkState&0x0004){
_PSTR(_T("N-WAY--------------------------------------\r\n"));
return wLinkState;
}
//100M Half
DeviceWritePhy(0, 0, 0x2000); // Set 100M Half
NdisMSleep(mSec5); // 5 ms
wLinkState = LinkState_Get_BMSR(0x01);
return wLinkState;
}
//10M Half
DeviceWritePhy(0, 0, 0x0000); // Set 10M Half
NdisMSleep(mSec5); // 5 ms
wLinkState= LinkState_Get_BMSR(0x01);
if (wLinkState&0x0004){
/*
_PSTR(_T("10M-Half--------------------------------------\r\n"));
*/
//return wLinkState;
//Auto(= N-Way)
DeviceWritePhy(0, 0, 0x3100); // En Auto-neg
// _DeviceWritePhy(0, 0, _0x1200); // Restart Auto-neg
NdisMSleep(mSec25); // 25 ms
wLinkState= LinkState_Get_BMSR(0x01);
if (wLinkState&0x0004){
_PSTR(_T("N-WAY--------------------------------------\r\n"));
return wLinkState;
}
/*
//10M Half
_DeviceWritePhy(0, 0, 0x0000); // Set 10M Half
NdisMSleep(mSec5); // 5 ms
wLinkState = DeviceReadPhy(0, 0x1);
wLinkState = DeviceReadPhy(0, 0x1);
return wLinkState;
*/
}
/*
wLinkState = DeviceReadPhy(0, 0x1);
wLinkState = DeviceReadPhy(0, 0x1);
*/
return wLinkState;
}
/*
WORD DM9ISA::GetLinkState_init()
{
#if 0
WORD wLinkState;
//[Already Link-On]
if (m_wLinkState&0x0004) // In Link-On state
{
wLinkState = DeviceReadPhy(0, 0x1);
wLinkState = DeviceReadPhy(0, 0x1);
return wLinkState;
}
#endif
return _LinkState_Op();
}
*/
WORD DM9ISA::LinkState_GetBMCR(int i)
{
WORD wBMCRState;
wBMCRState = DeviceReadPhy(0, 0);
wBMCRState = DeviceReadPhy(0, 0);
return wBMCRState;
}
WORD DM9ISA::LinkState_Get_BMSR(int i)
{
WORD wLinkState;
wLinkState= DeviceReadPhy(0, 0x1);
wLinkState= DeviceReadPhy(0, 0x1);
return wLinkState;
}
WORD DM9ISA::LinkState_Get_DSCSR(LPWSTR head, int i)
{
WORD wData;
wData= DeviceReadPhy(0, MIIADDR_SPSTAT); // 17
wData= DeviceReadPhy(0, MIIADDR_SPSTAT); // 17
_PSTR(_T("%s-------------------[0x%04X]\r\n"),head,wData);
return wData;
}
WORD DM9ISA::LinkState_Get_DSCSR_EX(LPWSTR head, LPWSTR regname, int i)
{
WORD wData;
wData= DeviceReadPhy(0, MIIADDR_SPSTAT); // 17
wData= DeviceReadPhy(0, MIIADDR_SPSTAT); // 17
//_PSTR(_T("[%s].[%s]-------------------[0x%04X]\r\n"), head,regname,wData);
//_PSTR(_T("[%s].[%s]-------------------[0x%04X]\r\n"), head,regname,wData);
return wData;
}
WORD DM9ISA::LinkState_Get_SCFG(LPWSTR head, int i)
{
WORD wData;
wData= DeviceReadPhy(0, MIIADDR_SCFG); // 20
wData= DeviceReadPhy(0, MIIADDR_SCFG); // 20
_PSTR(_T("%s-------------------[0x%04X]\r\n"),head,wData);
return wData;
}
WORD DM9ISA::GetLinkState()
{
WORD wLinkState;
#if 0
wLinkState = DeviceReadPhy(0, 0x1);
wLinkState = DeviceReadPhy(0, 0x1);
#endif
#if 0
//[DeviceCheckForHang], wLinkState= LinkState_Op(TTL_COUNT);
#endif
wLinkState= LinkState_Get_BMSR(TTL_COUNT);
return wLinkState;
}
WORD DM9ISA::DeviceCheckLink(void) // Device-Check-For-Link() ;'BMSR'
{
WORD wLinkState, wData;
U32 nsr, ncr;
BOOL PHY, MAC;
wLinkState= LinkState_Get_BMSR(0x01);
nsr= DeviceReadPort(DM9_NSR);
PHY= (wLinkState&0x0004);
MAC= (nsr & MAKE_MASK(6));
SetConnectionStatus(PHY && MAC); //(true);
if (PHY && MAC)
{
m_Counter++;
}
else if (!PHY && !MAC)
{
m_Counter_Fail++;
}
else
m_Counter_Mix++;
// if (PHY && MAC)
// _PSTR(_T("LnkOn- "));
// else
// _PSTR(_T("Lnk-Fail- "));
ncr= DeviceReadPort(DM9_NCR);
wData= DeviceReadPhy(0, MIIADDR_SPSTAT); // 17
// _PSTR(_T("[NCNSPHY17:%02X,%02X,%04X] "),
// ncr,
// nsr,
// wData);
// if (PHY) // 0x01:dummy for BMSR-01
// _PSTR(_T("On(PHY@ %d, %d) &&"),m_Counter,m_Counter_Fail);
// else
// _PSTR(_T("Fail(PHY@ %d, %d) &&"),m_Counter,m_Counter_Fail);
// if(MAC)
// _PSTR(_T("On(NSR@ %d,%d,[neq:%d])\r\n"),m_Counter,m_Counter_Fail,m_Counter_Mix);
// else
// _PSTR(_T("Fail(NSR@ %d,%d,[NEQ:%d])\r\n"),m_Counter,m_Counter_Fail,m_Counter_Mix);
if (PHY && MAC){
int linkStatus= DEV_LinkStatus( DeviceReadPort(DM9_NCR), DeviceReadPort(DM9_NSR) );
#if 0
_PSTR_REL(_T("[9ISA-On(NSR@ %d,%d,[neq:%d]) [%s] \r\n"),
m_Counter,
m_Counter_Fail,
m_Counter_Mix,
SpeedNameTbl[linkStatus]);
#endif
}
return wLinkState;
}
void DM9ISA::Pnt_Dot_MsgCtrl(WORD wLinkState)
{
//m_JJ_PrintMessage_control++;
//m_JJ_PrintMessage_control &= _0x1f; // JJ(+)
//if (!m_JJ_PrintMessage_control)
// DEBUG_PRINTF(TEXT("[Device/DM9ISA]DeviceCheckForHang: Link=%d\r\n"), (wLinkState&0x4));
int qsize= m_pUpper->GetQueueSize();
if (!m_JJ_PrintMessage_control){
WPrintf(WSTR(" ."));
//DEBUG_PRINTF(TEXT("[9ISA_Ck4Hng]: Link= %d (TxPendings=%d, QueueSize=%d)\r\n"), wLinkState, m_nTxPendings, qsize);
DEBUG_PRINTF(TEXT(" (TxPdngs=%d, QSiz=%d)\r\n"), m_nTxPendings, qsize);
}
m_JJ_PrintMessage_control++;
m_JJ_PrintMessage_control &= 0x03;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -