📄 peephole.c
字号:
USHORT ConvertData;
//
// Convert RD_INSTRUCTION_93C46 command into a bit string.
//
for (i = RD_INSTRUCTION_LEN_93C46, ConvertData = RD_INSTRUCTION_93C46;
i > 0;
i--, ConvertData >>= 1)
{
OpBitStr[i-1] = (UCHAR)(ConvertData & 1);
}
//
// The instruction followed is to set up clock pulse in advance for
// reading serial EEPROM for circuit repuirements before reading
// the chip.
//
OperateArray[0] = 0;
OperateArray[1] = CHIP_SELECT;
j = 2;
for (i = 0; i < RD_INSTRUCTION_LEN_93C46; i++)
{
temp = (i * 2) + j;
OperateArray[temp] = (OpBitStr[i] == 0)?
(USHORT)(CHIP_SELECT) :
(USHORT)(CHIP_SELECT | SERIAL_DATA_INPUT);
OperateArray[temp+1] = OperateArray[temp] | SERIAL_DATA_CLOCK;
}
j += i*2;
//
// Convert "address" into a bit string.
//
for (i = ADDRESS_LENGTH2_93C46, ConvertData = address;
i > 0;
i--, ConvertData >>= 1)
{
AddrBitStr[i-1] = (UCHAR)(ConvertData & 1);
}
//
// The instruction followed keeps on setting up clock pulse in advance
// for reading serial EEPROM for circuit repuirements before reading
// the chip.
//
for (i = 0; i < ADDRESS_LENGTH2_93C46; i++)
{
temp = (i * 2) + j;
OperateArray[temp] = (AddrBitStr[i] == 0)?
(USHORT)(CHIP_SELECT) :
(USHORT)(CHIP_SELECT | SERIAL_DATA_INPUT);
OperateArray[temp+1] = OperateArray[temp] | SERIAL_DATA_CLOCK;
}
*length = j + (i * 2);
}
NDIS_STATUS
ReadSerialEEPROM93C46Word(
IN PADAPTER_BLOCK pAdapter,
IN USHORT address,
OUT PUSHORT pData
)
/*++
Routine Description:
This routine reads in 1-word of node address from serial EEPROM.
Arguments:
pAdapter - Pointer to the adapter to program.
address - Offset of node address will be read.
pData - Pointer to the read-in node address.
Return Value:
NDIS_STATUS_FAILURE - fail to read a word size of the node address
from EEPROM.
NDIS_STATUS_SUCCESS - otherwise.
--*/
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
USHORT OperateArray[ 2 + (2*RD_INSTRUCTION_93C46) + (2*ADDRESS_LENGTH2_93C46)];
UCHAR length, i;
ULONG data1;
DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_INFO,
("==>ReadSerialEEPROM93C46Word\n"));
SetRead93C46StructureWord(OperateArray, address, &length);
do
{
for ( i = 0; ( i < length ); i++ )
{
TBATM155_PH_WRITE_DEV(
pAdapter,
MAC_ADDR_ROM_OFFSET,
OperateArray[i],
&Status);
if (NDIS_STATUS_SUCCESS != Status)
{
DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_ERR,
("Failed to access mac address 1.\n"));
break;
}
}
if (NDIS_STATUS_SUCCESS != Status)
break;
TBATM155_PH_WRITE_DEV(
pAdapter,
MAC_ADDR_ROM_OFFSET,
CHIP_SELECT,
&Status);
if (NDIS_STATUS_SUCCESS != Status)
{
DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_ERR,
("Failed to access mac address 2.\n"));
break;
}
//
// read 1 word data from EEPROM now.
//
for ( i = 0, *pData = 0; (i < 16); i++ )
{
//
// raise data clock to get ready of
// reading data from EEPROM 93C46.
//
TBATM155_PH_WRITE_DEV(
pAdapter,
MAC_ADDR_ROM_OFFSET,
CHIP_SELECT | SERIAL_DATA_CLOCK,
&Status);
if (NDIS_STATUS_SUCCESS != Status)
{
DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_ERR,
("Failed to access mac address 3.\n"));
break;
}
//
// read 1 bit in from serial EEPROM.
//
TBATM155_PH_READ_DEV(
pAdapter,
MAC_ADDR_ROM_OFFSET,
&data1,
&Status);
if (NDIS_STATUS_SUCCESS != Status)
{
DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_ERR,
("Failed to access mac address 4.\n"));
break;
}
//
// To merge the input 1-bit data into word data.
//
*pData <<= 1;
*pData |= (data1 & 0x8)? 1 : 0;
//
// Drop the data clock of EEPROM.
//
TBATM155_PH_WRITE_DEV(
pAdapter,
MAC_ADDR_ROM_OFFSET,
CHIP_SELECT,
&Status);
if (NDIS_STATUS_SUCCESS != Status)
{
DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_ERR,
("Failed to access mac address 5.\n"));
break;
}
}
} while (FALSE);
DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_INFO,
("<==ReadSerialEEPROM93C46Word: odata=0x%x\n", *pData));
return (Status);
}
NDIS_STATUS
tbAtm155Read_PermanentAddress(
IN PADAPTER_BLOCK pAdapter,
OUT PUCHAR pNodeaddress
)
/*++
Routine Description:
This routine reads node address from EEPROM 93C46.
Arguments:
pPermanentAddress - Pointer to the node address.
Return Value:
NDIS_STATUS_FAILURE - if fail to read the node address from EEPROM.
NDIS_STATUS_SUCCESS - otherwise.
--*/
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
USHORT data;
UCHAR i;
DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_INFO,
("==>tbAtm155Read_PermanentAddress\n"));
for ( i = 0; i < ATM_MAC_ADDRESS_LENGTH; i += 2 )
{
Status = ReadSerialEEPROM93C46Word(pAdapter, (USHORT)(i >> 1), &data);
if (NDIS_STATUS_SUCCESS != Status)
{
DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_ERR,
("tbAtm155Read_PermanentAddress error at offset (%d).\n", i));
break;
}
pNodeaddress[i] = (UCHAR)( data >> 8 );
pNodeaddress[i+1] = (UCHAR)( data & 0x00FF );
}
if (NDIS_STATUS_SUCCESS == Status)
{
//
// check if node address is invalid.
// (an invalid node address: ff-ff-ff-ff-ff-ff)
//
for (Status = NDIS_STATUS_FAILURE, i = ATM_MAC_ADDRESS_LENGTH - 1;
i >= 0;
i--)
{
if (pNodeaddress[i] != 0x0FF)
{
Status = NDIS_STATUS_SUCCESS;
break;
}
}
}
if (NDIS_STATUS_SUCCESS != Status)
{
DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_ERR,
("tbAtm155Read_PermanentAddress is bad.\n"));
}
DBGPRINT(DBG_COMP_PEEPHOLE, DBG_LEVEL_INFO,
("<==tbAtm155Read_PermanentAddress\n"));
return(Status);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -