@@ -110,6 +110,7 @@ EFI_STATUS OemGetMacE2prom(IN UINT32 Port, OUT UINT8 *pucAddr)
UINT16 I2cOffset;
UINT16 crc16;
NIC_MAC_ADDRESS stMacDesc = {0};
+ UINT32 Index;
Status = I2CInit(0, EEPROM_I2C_PORT, Normal);
if (EFI_ERROR(Status))
@@ -124,9 +125,10 @@ EFI_STATUS OemGetMacE2prom(IN UINT32 Port, OUT UINT8 *pucAddr)
stI2cDev.Port = EEPROM_I2C_PORT;
stI2cDev.SlaveDeviceAddress = I2C_SLAVEADDR_EEPROM;
stI2cDev.Socket = 0;
- Status = I2CRead(&stI2cDev, I2cOffset, sizeof(NIC_MAC_ADDRESS), (UINT8 *)&stMacDesc);
- if (EFI_ERROR(Status))
- {
+ for (Index = 0; Index < sizeof(NIC_MAC_ADDRESS); Index++) {
+ Status |= I2CRead(&stI2cDev, I2cOffset + Index, 1, (UINT8 *)&stMacDesc + Index);
+ }
+ if (EFI_ERROR(Status)) {
DEBUG((EFI_D_ERROR, "[%a]:[%dL] Call I2cRead failed! p1=0x%x.\n", __FUNCTION__, __LINE__, Status));
return Status;
}
@@ -150,6 +152,7 @@ EFI_STATUS OemSetMacE2prom(IN UINT32 Port, IN UINT8 *pucAddr)
EFI_STATUS Status;
UINT16 I2cOffset;
NIC_MAC_ADDRESS stMacDesc = {0};
+ UINTN Index;
stMacDesc.MacLen = MAC_ADDR_LEN;
@@ -170,9 +173,11 @@ EFI_STATUS OemSetMacE2prom(IN UINT32 Port, IN UINT8 *pucAddr)
stI2cDev.Port = EEPROM_I2C_PORT;
stI2cDev.SlaveDeviceAddress = I2C_SLAVEADDR_EEPROM;
stI2cDev.Socket = 0;
- Status = I2CWrite(&stI2cDev, I2cOffset, sizeof(NIC_MAC_ADDRESS), (UINT8 *)&stMacDesc);
- if (EFI_ERROR(Status))
- {
+ for (Index = 0; Index < sizeof(NIC_MAC_ADDRESS); Index++) {
+ Status |= I2CWrite(&stI2cDev, I2cOffset + Index, 1, (UINT8 *)&stMacDesc + Index);
+ }
+
+ if (EFI_ERROR(Status)) {
DEBUG((EFI_D_ERROR, "[%a]:[%dL] Call I2cWrite failed! p1=0x%x.\n", __FUNCTION__, __LINE__, Status));
return Status;
}
We would get incorrect data when accessing multiple bytes at one time and going across EEPROM page boundary, so we change to access EEPROM by single byte each time. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Peicong Li <lipeicong@huawei.com> --- .../D03/Drivers/OemNicConfig2PHi1610/OemNicConfig2P.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)