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

📄 niceeprom.c

📁 3com3c905网卡驱动程序
💻 C
字号:
/*******************************************************************************
*** Note: Copy rights resevered to Beijing Pacific Linkair Communications Co. 
***
*** File Name: NICEeprom.c
*** Purpose  : Supply the NIC EEPROM Accessing Layer Routines and some other definitions
***
*** Author   : Guangzhao Tian
*** Modified : By Guangzhao Tian at 2000/9/7
***
**/

#include "NICMacro.h"
#include "NICWinReg.h"
#include "NICCommand.h"
#include "NICEeprom.h"
#include "NICData.h"
#include "NICHelper.h"
#include "NICExport.h"

/*********************************************************
***   send command into NIC and wait it completed
***/

NIC_STATUS  NIC_COMMAND_WAIT(IN NIC_INFORMATION * pAdapter,IN USHORT Command )
{
 	DWORD count;
	USHORT value;

    register int ix;

	NIC_WRITE_PORT_USHORT(pAdapter->IoBaseAddress,INTSTATUS_COMMAND_REGISTER,Command);

    for (ix = 0; ix < NIC_WAITTIMES; ix++)
	{
       value = NIC_READ_PORT_USHORT(pAdapter->IoBaseAddress,INTSTATUS_COMMAND_REGISTER);

		if (!(value & INTSTATUS_COMMAND_IN_PROGRESS) ) break;
		NIC_DELAY(NIC_RESETWAITTIME);
	}

    if (ix == NIC_WAITTIMES)
	{
		DebugMsg("  It seems the Command Never Completed !\n");
		return NIC_STATUS_FAILURE;
	}
   
	return NIC_STATUS_SUCCESS;
}

/**********************************************************************
** Fill EEPROM Data to Global Controlling Variable
*/
NIC_STATUS NIC_EEPROMFillGlobal(IN NIC_INFORMATION * pAdapter)
{
     WORD nRetValue=0;
      int  nCount=0;

     DebugMsg("Now Reading the EEPROM Values from the Card \n");
       
     /************** Get Device ID from EEPROM ********************/
     if(NIC_STATUS_FAILURE == NIC_EEPROMRead(pAdapter, EEPROM_DEVICE_ID, &nRetValue) )
     {
          DebugMsg("Failure to read EEPROM Registers: DEVICE ID ! \n " );
         return NIC_STATUS_FAILURE;
     }   
     else
          pAdapter->EEPROMInfo.wDeviceID=(USHORT) nRetValue;

     DebugMsg("Device ID in EEPROM: 0x%08X ! \n",pAdapter->EEPROMInfo.wDeviceID );

     /*************** Get 3 OEM Node Addresses ********************/
     for (; nCount <3;nCount ++)
     {
        if(NIC_STATUS_FAILURE == NIC_EEPROMRead(pAdapter,
                             EEPROM_OEM_NODE_ADDRESS_WORD_0+nCount, &nRetValue) )
        {
            DebugMsg("Failure to read EEPROM Registers: OEM Addr[ 0x%04X] ! \n ",nCount );
            return NIC_STATUS_FAILURE;
        }   
        else
            pAdapter->EEPROMInfo.wOEMNodeAddress[nCount]=(USHORT) nRetValue;
 
      DebugMsg("OEM Device Address[ 0x%04X ] in EEPROM: 0x%08X ! \n",nCount,
                               pAdapter->EEPROMInfo.wOEMNodeAddress[nCount] );
     }

      /****----------- Read the compatability word from EEPROM ------****/
     if(NIC_STATUS_FAILURE == NIC_EEPROMRead(pAdapter, EEPROM_COMPATABILITY_WORD, &nRetValue) )
     {
          DebugMsg("Failure to read EEPROM Registers: COMPATABILITY_WORD  ! \n "   );
         return NIC_STATUS_FAILURE;
     }   
     else
          pAdapter->EEPROMInfo.wDeviceID=(USHORT) nRetValue;

     DebugMsg("COMPATABILITY_WORD in EEPROM: 0x%08X ! \n",pAdapter->EEPROMInfo.wDeviceID );
  
	/****----------- Read the capabilities information from EEPROM ------****/
    if (NIC_STATUS_FAILURE == NIC_EEPROMRead (pAdapter ,EEPROM_CAPABILITIES_WORD, &nRetValue )  )
	{
	   DebugMsg("Can not read capabilities information from EEPROM \n");
       return NIC_STATUS_FAILURE;
	} 
    else  
         pAdapter->EEPROMInfo.wCapabilitiesWord  = nRetValue;
      DebugMsg("Capabilities Word in EEPROM: 0x%08X ! \n",pAdapter->EEPROMInfo.wCapabilitiesWord );

     /************* Get Media Options from EEPROM **************/
     if(NIC_STATUS_FAILURE == NIC_EEPROMRead(pAdapter, EEPROM_MEDIAOPTIONS, &nRetValue) )
     {
          DebugMsg("Failure to read EEPROM Registers: Media Options ! \n "  );
         return NIC_STATUS_FAILURE;
     }   
     else
          pAdapter->EEPROMInfo.wDeviceID=(USHORT) nRetValue;

     DebugMsg("Media Options in EEPROM: 0x%08X ! \n",pAdapter->EEPROMInfo.wDeviceID );

     return NIC_STATUS_SUCCESS;
}


/***********************************************************************
**** Check if EEPROM is Busy, if not we can do our work, if is, wait
       until it becomes idle
*/
NIC_STATUS NIC_EEPROMIsBusy( IN NIC_INFORMATION * pAdapter	) 
{
	USHORT nCommand = 0;
	DWORD count;

    register int ix;

    for (ix = 0; ix < EEPROM_WAITTIMES; ix++)
	{
        nCommand = NIC_READ_PORT_USHORT(pAdapter->IoBaseAddress,EEPROM_COMMAND_REGISTER);

 		if (!(nCommand & EEPROM_BUSY_BIT)) break;
		NIC_DELAY(EEPROM_TIMEOUT);
	}

    if (ix == EEPROM_WAITTIMES)
	{
		DebugMsg("It seems the EEPROM Never get tired, Maybe She has gone off!\n");
		return NIC_STATUS_FAILURE;
	}
 
 	return NIC_STATUS_SUCCESS; 
}

/********************************************************************
*** Read some information from the nonvoliant EEPROM
*/
NIC_STATUS NIC_EEPROMRead (IN NIC_INFORMATION * pAdapter,
						 IN USHORT EEPROMAddress, OUT PUSHORT  pValue ) 
{
	USHORT lowerOffset = 0;
	USHORT upperOffset = 0;

	if (EEPROMAddress > 0x003F) 
	{
		lowerOffset = EEPROMAddress & 0x003F;
		upperOffset = (EEPROMAddress & 0x03C0) << 2;
		EEPROMAddress = upperOffset | lowerOffset;
	}

    NIC_COMMAND( (pAdapter->IoBaseAddress),
                   (USHORT)(COMMAND_SELECT_REGISTER_WINDOW | REGISTER_WINDOW_0) );
	
	/* Check if EEPROM is busy */
	if (NIC_EEPROMIsBusy(pAdapter) != NIC_STATUS_SUCCESS)
	{
   		DebugMsg("Can not read EEPROM: it's busy! \n");
		return NIC_STATUS_FAILURE;
	}
	
	/* Issue the read eeprom data command */
 	NIC_WRITE_PORT_USHORT(pAdapter->IoBaseAddress, EEPROM_COMMAND_REGISTER, 
		           (USHORT)(EEPROM_COMMAND_READ + (USHORT)EEPROMAddress));
	
	/* Check if EEPROM is busy */
	if (NIC_EEPROMIsBusy(pAdapter) != NIC_STATUS_SUCCESS)
	{
   		DebugMsg("the EEPROM keep on reading the value forever ! \n");
		return NIC_STATUS_FAILURE;
	}

	/*  Save value read from eeprom */
 	*pValue =(USHORT) NIC_READ_PORT_USHORT(pAdapter->IoBaseAddress, EEPROM_DATA_REGISTER);

	return NIC_STATUS_SUCCESS;
}


/**********************************************************************
** Write Data to EEPROM of NIC
*/
NIC_STATUS NIC_EEPROMWrite(IN NIC_INFORMATION * pAdapter,
							 IN USHORT EEPROMAddress, IN USHORT Data) 
{
 	USHORT lowerOffset = 0;
	USHORT upperOffset = 0;
 
	if (EEPROMAddress > 0x003F)
	{
		lowerOffset = EEPROMAddress & 0x003F;
		upperOffset = (EEPROMAddress & 0x03C0) << 2;
		EEPROMAddress = upperOffset | lowerOffset;
	}

	NIC_COMMAND( (pAdapter->IoBaseAddress),(COMMAND_SELECT_REGISTER_WINDOW | REGISTER_WINDOW_0) );

	/* Check if EEPROM is busy */
	if (NIC_EEPROMIsBusy(pAdapter) != NIC_STATUS_SUCCESS)
	{
   		DebugMsg("Can not enable EEPROM: it's busy");
		return NIC_STATUS_FAILURE;
	}
	
	/*Enable the EEPROM write for erasing */
	NIC_WRITE_PORT_USHORT(pAdapter->IoBaseAddress ,
		                   EEPROM_COMMAND_REGISTER, (USHORT)EEPROM_WRITE_ENABLE);
	
	/* Check if EEPROM is busy */
	if (NIC_EEPROMIsBusy(pAdapter) != NIC_STATUS_SUCCESS)
	{
   		DebugMsg("Can not Erase EEPROM: it's keep on enable the writing");
		return NIC_STATUS_FAILURE;
	}
	
	/* Issue erase register command prior to writing */
	NIC_WRITE_PORT_USHORT(pAdapter->IoBaseAddress ,	EEPROM_COMMAND_REGISTER,
	                 	(USHORT)(EEPROM_ERASE_REGISTER + (USHORT)EEPROMAddress));
 
	/* Check if EEPROM is busy */
	if (NIC_EEPROMIsBusy(pAdapter) != NIC_STATUS_SUCCESS)
	{
   		DebugMsg("Can not write EEPROM: it's busy erasing the EEPROM");
		return NIC_STATUS_FAILURE;
	}
	
	/*  Load data to the EepromData register for writting */
 	NIC_WRITE_PORT_USHORT(pAdapter->IoBaseAddress, EEPROM_DATA_REGISTER, Data);

	/*Enable the EEPROM write once more ,this time for writing*/
	NIC_WRITE_PORT_USHORT(pAdapter->IoBaseAddress ,
		                   EEPROM_COMMAND_REGISTER, (USHORT)EEPROM_WRITE_ENABLE);
	
	/* Check if EEPROM is busy */
	if (NIC_EEPROMIsBusy(pAdapter) != NIC_STATUS_SUCCESS)
	{
   		DebugMsg("Can not write EEPROM: it's keep on enable the writing");
		return NIC_STATUS_FAILURE;
	}

	/* Issue the Write command ,this do the real working */
 	NIC_WRITE_PORT_USHORT ( pAdapter->IoBaseAddress ,EEPROM_COMMAND_REGISTER,
                  (USHORT)(EEPROM_WRITE_REGISTER + (USHORT)EEPROMAddress));
	
	/* Check if EEPROM is busy */
	if (NIC_EEPROMIsBusy(pAdapter) != NIC_STATUS_SUCCESS)
	{
   		DebugMsg("Can not write EEPROM: it's busy");
		return NIC_STATUS_FAILURE;
	}

	return NIC_STATUS_SUCCESS;
}

/***********************************************************************
*** Checksum the EEPROM 
*/
WORD NIC_EEPROMChecksum(IN NIC_INFORMATION * pAdapter ) 
{
	NIC_STATUS nStatus;
	USHORT checksum=0;
  	USHORT value=0;
	USHORT index;
  

	NIC_COMMAND(pAdapter->IoBaseAddress , COMMAND_SELECT_REGISTER_WINDOW | REGISTER_WINDOW_0);

	for (index = EEPROM_NODE_ADDRESS_WORD_0; index < EEPROM_CHECKSUM_1; index++)
	{
		nStatus = NIC_EEPROMRead(pAdapter, index, &value);
		
		if (nStatus == NIC_STATUS_FAILURE)
		{
           DebugMsg("cann't checksum the eeprom, since we cannot read all the data from it");
			return NIC_STATUS_FAILURE;
		}

		checksum ^= (USHORT)LOBYTE(value);			 
		checksum ^= (USHORT)HIBYTE(value);			 
	}

	return((USHORT)checksum);
}

/***  Above are routines about EEPROM
***    End of EEPROM.c
************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -