📄 device.cpp
字号:
U32 uMask, //(1<<0)
U32 uExpected, // 0x00
U32 uInterval, // 20 /* in millisecond */
U32 uRetries) // -1
{
// -1
for(;uRetries;uRetries--)
{
if((DeviceReadPort(uPort) & uMask) == uExpected) break;
NdisStallExecution(uInterval);
} // of retry loop
return (BOOL)uRetries;
}
void NIC_DEVICE_OBJECT::SetConnectionStatus(bool bConnected)
{
if (bConnected)
{
if (m_szCurrentSettings[SID_MEDIA_CONNECTION_STATUS] == NdisMediaStateConnected)
;
else
{
// DEBUG_PRINTF(TEXT("Send connection!\r\n"));
m_szCurrentSettings[SID_MEDIA_CONNECTION_STATUS] = NdisMediaStateConnected;
NdisMIndicateStatus(m_pUpper->GetNdisMiniportAdapterHandle(), NDIS_STATUS_MEDIA_CONNECT,
(PVOID) 0, 0);
NdisMIndicateStatusComplete(m_pUpper->GetNdisMiniportAdapterHandle());
}
}
else
{
if (m_szCurrentSettings[SID_MEDIA_CONNECTION_STATUS] == NdisMediaStateDisconnected)
;
else
{
// DEBUG_PRINTF(TEXT("Send disconnection!\r\n"));
m_szCurrentSettings[SID_MEDIA_CONNECTION_STATUS] = NdisMediaStateDisconnected;
NdisMIndicateStatus(m_pUpper->GetNdisMiniportAdapterHandle(), NDIS_STATUS_MEDIA_DISCONNECT,
(PVOID) 0, 0);
NdisMIndicateStatusComplete(m_pUpper->GetNdisMiniportAdapterHandle());
}
}
//; LinkState_Get_DSCSR_EX(_T("CheckForHang].[Link-Change"), _T("PHYReg17"), 17); // DSCSR
}
BOOL NIC_DEVICE_OBJECT::DeviceCheckForHang(void)
{
WORD rData;
WORD wLinkState;
int mdix_cntl_status_flgb;
LPWSTR a,b,c,d;
//int Ret= 0; //BOOL MYLinkProcess;
//wcsncpy(buf,-);
//wcsncat(buf,-);
// WCHAR s[180];
// int len, slen;
m_CHIPMsgCtrl= FALSE; //TRUE; // KEEP TRUE
wLinkState= DeviceCheckLink(); // Device-Check-For-Link()
// ; [Supplement]
if (!(wLinkState & 0x4))
{
DeviceWritePort(0x1f, 0x01); NdisMSleep(mSec5); //DM9_GPR, 5 ms
DeviceWritePort(0x1f, 0x00); NdisMSleep(mSec10); //DM9_GPR, 10 ms
if (OP_GetMaxTxPending()==1) //DM9000E ( _m_auto_mdix_flgb= FALSE;)
{
if ((m_n4HangCounts%6)==0){
rData= DeviceReadPhy(0, 1);
WNextLine();
WPrintf(_T("BMSR= %04x for A.N. - 4Hang \r\n"), rData);
// How to set mdix:mdi: [ Circuit depend, No MDIX/MDI mode ]
WPrintf(_T("[4Hang:][Restart A.N.][@FIXED-MDXXI]\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
rData= DeviceReadPhy(0, 4);
a= b= c= d= WSTR("NA");
if (rData&0x0100) a= WSTR("100FDX");
if (rData&0x0080) b= WSTR("100HALF");
if (rData&0x0040) c= WSTR("10FDX");
if (rData&0x0020) d= WSTR("10HALF");
WPrintf(_T("A.N. Advrtmnt= [%s][%s][%s][%s] 0x%04x \r\n"), a,b,c,d, rData);
rData= DeviceReadPhy(0, 5);
a= b= c= d= WSTR("NA");
if (rData&0x0100) a= WSTR("100FDX");
if (rData&0x0080) b= WSTR("100HALF");
if (rData&0x0040) c= WSTR("10FDX");
if (rData&0x0020) d= WSTR("10HALF");
WPrintf(_T(" A.N. Partner= [%s][%s][%s][%s] 0x%x \r\n"), a,b,c,d, rData);
if (rData&0x8000){
rData= DeviceReadPhy(0, 6);
a= WSTR("Prtnr No A.N.");
if (rData&0x0001) a= WSTR("Prtnr Supp A.N.");
WPrintf(_T(" Expan Partner= [%s] 0x%x \r\n"), a,rData);
}
}
else if ((m_n4HangCounts%6)==4){
rData= DeviceReadPhy(0, 5);
a= b= c= d= WSTR("NA");
if (rData&0x0100) a= WSTR("100FDX");
if (rData&0x0080) b= WSTR("100HALF");
if (rData&0x0040) c= WSTR("10FDX");
if (rData&0x0020) d= WSTR("10HALF");
WPrintf(_T("+A.N. Partner= [%s][%s][%s][%s] 0x%x \r\n"), a,b,c,d, rData);
if (rData&0x8000){
rData= DeviceReadPhy(0, 6);
a= WSTR("Prtnr No A.N.");
if (rData&0x0001) a= WSTR("Prtnr Supp A.N.");
WPrintf(_T("+Expan Partner= [%s] 0x%x \r\n"), a,rData);
}
}
else if ((m_n4HangCounts%6)==5){
//[No as Auto-Negociation Restart procedure, Always 100HALF?]
WPrintf(_T("[4Hang:][FORCE 100HALF][@FIXED-MDXXI]\r\n"));
OP_SetLinkMode(LINKSPEED_HALF100BASE);
}
}
else
{
// [Final MDI or MDIX mode, (20.[5:4]), x0 enable AutoMDIX mode]
DeviceWritePhy(0, MIIADDR_SCFG, 0x0000); // enable_auto_mdix_mode
// 20.5|20.4=x0 Auto-MDIX mode
NdisMSleep(uSec500);
if ((m_n4HangCounts%2)==0){
rData= DeviceReadPhy(0, 1);
WPrintf(_T("BMSR= %04x for A.N. - 4Hang \r\n"), rData);
WPrintf(_T("[4Hang:DISCONNECT===][Restart A.N.][@AutoMDIX]\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
}
else
WPrintf(_T("[4Hang:DISCONNECT===][@AutoMDIX]\r\n"));
}
m_n4HangCounts++;
}
else{
if (m_n4HangCounts)
{
WNextLine();
WPrintf(WSTR(" - (%d)4Hang\r\n"), m_n4HangCounts); //" - (%d)4Hang.1st.CNNT - n4HC= \r\n"
// [_m_n4HangCounts_= true] // to show -> _OP_ShowLinkMode() again!
// [_Only for DM9003,D9013_]
if (((m_pUpper->m_Bag.m_pLowerId==DM9003_CHIP_ID)||
(m_pUpper->m_Bag.m_pLowerId==DM9013_CHIP_ID))){
BOOL Port0, Port1;
Port0= OP_ShowLinkMode(0);
//TEST (PHY-1)
#if 0
/*
WORD rData= DeviceReadPhy(1, MIIADDR_SPSTAT); // 17
//DeviceWritePhy(1, MIIADDR_SPSTAT, rData | 0x0200); // toword (DM9000B Read as 0, ignore on write)
DeviceWritePhy(1, MIIADDR_SPSTAT, rData & 0xFDFF); // backword (DM9003 R/W)
NdisMSleep(mSec1);
*/
#endif
Port1= OP_ShowLinkMode(1);
if (Port0||Port1) // [PHY-0|PHY-1]
m_n4HangCounts= 0;
else if (m_n4HangCounts > 3)
m_n4HangCounts= 3;
else
m_n4HangCounts--;
}
else{
// [_Only for DM9000_]
if (OP_ShowLinkMode())
m_n4HangCounts= 0;
}
if (!m_n4HangCounts) WPrintf(WSTR(" - 4Hang.1st.CNNT - Modify to 4HC=%d \r\n"), m_n4HangCounts);
if (OP_GetMaxTxPending()==1)
{
WPrintf(_T(" PAD_Fix=LnkOK\r\n")); // MDI
}
else
{
// [Final Pad MDI/MDIX mode]
mdix_cntl_status_flgb= (DeviceReadPhy(0, MIIADDR_SCFG)&MAKE_MASK1(7))? 1:0; //* 20.bit[7]=
// [Final MDI or MDIX mode, (20.[5:4]), 11 MDIX, 01 MDI (Disable the AutoMDIX)]
if (mdix_cntl_status_flgb){
//NdisMSleep(mSec2); // Not help for WPrintf with longer wstring
//[force_mdix_fix_to_mdix= 20.5|20.4=11 MDIX mode]
DeviceWritePhy(0, MIIADDR_SCFG, MAKE_MASK1(5)|MAKE_MASK1(4));
WPrintf(_T(" 1 SetMDIX=LnkOK\r\n")); // MDIX
}else{
//NdisMSleep(mSec2); // Not help for WPrintf with longer wstring
//[force_mdix_fix_to_mdi= 20.bit[5:4]= 0x0010= 01 MDI mode]
DeviceWritePhy(0, MIIADDR_SCFG, MAKE_UNMASK1(5)|MAKE_MASK1(4));
WPrintf(_T(" 0 SetMDI=LnkOK\r\n")); // MDI
}
}
WNextLine();
}
else
Pnt_Dot_MsgCtrl(wLinkState&0x4); //DEBUG_PRINTF(TEXT("[CkForHang]: Link=%d\r\n"), (wLinkState&0x4)); //
NdisMSleep(mSec2); // Not help for WPrintf with longer wstring
NdisMSleep(mSec5); // Not help for WPrintf with longer wstring
}
#if 0
// if (m_wLinkState != wLinkState)
// {
// if (wLinkState & 0x4)
// SetConnectionStatus(true);
// else
// SetConnectionStatus(false);
// }
#endif
m_wLinkState = wLinkState;
U32 cr= DeviceGetReceiveStatus();
U32 rxps,rxci;
rxps = cr >> 31;
rxci = cr & 0x7FFFFFFF;
REPORT(TID_NIC_RXPS, rxps);
REPORT(TID_NIC_RXCI, rxci);
#ifndef IMPL_RESET
return FALSE;
#endif
U32 lastread = m_szLastStatistics[TID_GEN_RCV_OK];
U32 lastsent = m_szLastStatistics[TID_GEN_XMIT_OK];
memcpy(
(void*)&m_szLastStatistics,
(void*)&m_szStatistics,
sizeof(m_szStatistics));
// report hang if
// 1. receive count stalled but overflow, or
if((m_szStatistics[TID_GEN_RCV_OK] == lastread) && cr)
{
WNextLine();
PRINTF(_T("[dm9XXX:receive count stalled but overflow\r\n"));
/*
TID_NIC_RXPS, TID_NIC_RXCI, TID_SIZE
*/
PRINTF(_T("[dm9XXX:Cntr Ovrflw FLAG: %d \r\n"), m_szStatistics[TID_NIC_RXPS]);
PRINTF(_T("[dm9XXX:Overflow Cntr: %d \r\n"), m_szStatistics[TID_NIC_RXCI]);
PRINTF(_T("[dm9XXX:MAC soft-rst \r\n"));
// mac - reset ???
// Phy -Reset (_DeviceWritePhy(0,0,0x8000); @ DM9ISA::_InitialHardware)
//
//[software reset the device-MAC ;and delay 10 usec]
//[&MAC register clear]
DeviceWritePort(DM9_NCR, 0x03); NdisStallExecution(20); // 20 ms
//_RPT_WREG(RN_NCR, DM9_NCR, 0x03);
//_RPT_RREG(RN_NCR, DM9_NCR, DeviceReadPort(DM9_NCR));
DeviceWritePort(DM9_NCR, 0x00);
//[software reset the device-MAC ;and delay 10 usec]
//[&MAC register clear]
DeviceWritePort(DM9_NCR, 0x03); NdisStallExecution(20);
//_RPT_WREG(RN_NCR, DM9_NCR, 0x03);
//_RPT_RREG(RN_NCR, DM9_NCR, DeviceReadPort(DM9_NCR));
DeviceWritePort(DM9_NCR, 0x00);
//[&MAC register clear]
DeviceWritePort(DM9_NCR, 0x03); NdisStallExecution(20);
if (OP_GetMaxTxPending()==1) //DM9000E
//[clear MAC register status bits ;WAKEST/TX2END/TX1END (each Clear by read or write 1)]
DeviceWritePort(DM9_NSR, 0x0f); //_RPT_WREG(RN_NSR, DM9_NSR, 0x2C);
else
DeviceWritePort(DM9_NSR, 0x2C); //_RPT_WREG(RN_NSR, DM9_NSR, 0x2C);
//[Enable memory chain][;Enable pointer auto-return for Tx & Rx FIFO]
DeviceWritePort(DM9_IMR, (1<<7)); //_RPT_WREG(RN_IMR, DM9_IMR, (1<<7));
DeviceWritePort(DM9_NCR, 0x00);
//return FALSE; // Test
//return TRUE; // JJ: return TRUE, So will called MiniportReset/Driver(Driver)/DeviceReset(ISA)
return TRUE;
}
// 2. tx idle while tqueue out of resource
if(m_pUpper->DriverIsOutOfResource() &&
(DeviceHardwareStatus() & NIC_HW_TX_IDLE) )
{
PRINTF(_T("[dm9XXX:tx idle while tqueue out of resource\r\n"));
return TRUE;
}
return FALSE;
}
/*******************************************************************************
*
* Device timer routine
*
********************************************************************************/
extern "C" void DeviceTimerTrunkRoutine(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3)
{
NIC_DEVICE_OBJECT *dev = (NIC_DEVICE_OBJECT*)FunctionContext;
if(!dev->m_mutexTimer.TryLock()) return;
dev->DeviceOnTimer();
dev->m_mutexTimer.Release();
}
void NIC_DEVICE_OBJECT::DeviceInitializeTimer(void)
{
//SETFNAME("NIC_DEVICE_OBJECT::DeviceInitializeTimer");
//FUNCTION_ENTER_MSG();
NdisMInitializeTimer(
&m_timerObject,
m_pUpper->GetNdisMiniportAdapterHandle(),
(PNDIS_TIMER_FUNCTION)DeviceTimerTrunkRoutine,
(PVOID)this);
//FUNCTION_LEAVE_MSG();
}
void NIC_DEVICE_OBJECT::DeviceCancelTimer(void)
{
BOOLEAN result;
NdisMCancelTimer(&m_timerObject, &result);
}
void NIC_DEVICE_OBJECT::DeviceSetTimer(U32 milliseconds)
{
//SETFNAME("NIC_DEVICE_OBJECT::DeviceSetTimer");
//FUNCTION_ENTER_MSG();
//_PRINTF(_T("[dm9usb:milliseconds = %d\n"),milliseconds);
NdisMSetTimer(&m_timerObject,milliseconds);
//FUNCTION_LEAVE_MSG();
}
void NIC_DEVICE_OBJECT::DeviceOnTimer(void)
{
}
void NIC_DEVICE_OBJECT::DeviceEnableTransmit(void)
{
}
void NIC_DEVICE_OBJECT::DeviceDisableTransmit(void)
{
}
// device attributes or characteristics
BOOL NIC_DEVICE_OBJECT::DeviceQueryInformation(
OUT NDIS_STATUS *Status,
IN NDIS_OID Oid,
IN PVOID InfoBuffer,
IN ULONG InfoBufferLength,
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded)
{
return FALSE;
}
BOOL NIC_DEVICE_OBJECT::DeviceSetInformation(
OUT NDIS_STATUS *Status,
IN NDIS_OID Oid,
IN PVOID InfoBuffer,
IN ULONG InfoBufferLength,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded)
{
return FALSE;
}
U32 NIC_DEVICE_OBJECT::DeviceHardwareStatus(void)
{
return NIC_HW_OK;
}
void NIC_DEVICE_OBJECT::DeviceIndication(U32 dwIndication)
{
m_pUpper->DriverIndication(dwIndication);
}
void NIC_DEVICE_OBJECT::DeviceSendCompleted(PCQUEUE_GEN_HEADER pObject)
{
m_pUpper->DriverSendCompleted(pObject);
}
void NIC_DEVICE_OBJECT::DeviceReceiveIndication(int nCurr, PVOID pVoid, int nLength)
{
m_pUpper->DriverReceiveIndication(nCurr,pVoid,nLength);
}
void NIC_DEVICE_OBJECT::InitialUsbParameters(USB_HANDLE pHandle,LPCUSB_FUNCS lpFunctions,LPCUSB_INTERFACE lpInterface)
{
}
void NIC_DEVICE_OBJECT::InitialConfigurations(NDIS_HANDLE hWrapperConfiguration)
{
NDIS_STATUS status;
NDIS_HANDLE hConfig;
SETFNAME("NIC_DEVICE_OBJECT::InitialConfigurations()");
FUNCTION_SHRINK_MSG();
//.FUNCTION_ENTER_MSG();
// Read registry configurations
NdisOpenConfiguration(&status, &hConfig, hWrapperConfiguration);
if(status != NDIS_STATUS_SUCCESS)
THROW((ERR_STRING("NIC_DEVICE_OBJECT::InitialConfigurations - Error in opening configuration\r\n"),status));
CException *pexp;
TRY
{
InitialDefaultSettings();
InitialEepromFieldPosition();
DeviceRetriveConfigurations(hConfig);
ValidateConfigurations();
FI;
}
CATCH(pexp)
{
pexp->PrintErrorMessage();
CLEAN(pexp);
NdisCloseConfiguration(hConfig);
THROW((ERR_STRING("NIC_DEVICE_OBJECT::InitialConfigurations - Error in retriving configurations.\r\n")));
}
NdisCloseConfiguration(hConfig);
//.FUNCTION_LEAVE_MSG();
}
void NIC_DEVICE_OBJECT::RegisterConfigurations()
{
CException *pexp;
DECNAME();
TRY
{
RegisterIoSpace();
LoadEeprom();
InitialHardware(m_nResetCounts=0);
RegisterInterrupt();
FI;
}
CATCH(pexp)
{
pexp->PrintErrorMessage();
CLEAN(pexp);
//FUNCTION_LEAVE_MSG(); // for (1 of 5-)(2 of 5-)or(3 of 5-)leave
//;SETFNAME("4 of 5- ");
//;FUNCTION_ENTER_MSG();
THROW((ERR_STRING("Device::RegisterConfigurations - Device error\r\n")));
//;FUNCTION_LEAVE_MSG();
}
REFNAME("5 of 5- "); // {No-way when CATCH() above}
FUNCTION_ENTER_MSG();// {No-way }
DeviceOnSetupFilter(0);
FUNCTION_LEAVE_MSG();// {No-way }
}
BOOL NIC_DEVICE_OBJECT::AssignDummyMacAddress()
{
int temp =0,n;
int nPos = (int)m_dwEepromFiledPosition[EID_MAC_ADDRESS]; // Mac address offset (BYTE)
for (n=0; n<6; n++)
temp +=m_btEeprom[n];
if ( ( (temp==0) || (temp == (0xff * 6)) ) && (nPos >=0))
{
for(n=0; n<6; n++)
m_btEeprom[nPos+n]=n*0x11;
return TRUE;
}
return FALSE;
}
BOOL NIC_DEVICE_OBJECT::DeviceQueryTxResources(void)
{
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -