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

📄 device.cpp

📁 This is a source code for Ethernet Driver This driver was developed on RMI AU1250 CPU for Windows
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -