mirror of
https://github.com/ipxe/ipxe
synced 2025-12-15 17:12:54 +03:00
[realtek] Force EEPROM CS low before disabling EEPROM access mode
Some RTL8169 cards seem to drive the EEPROM CS line high (i.e. active) when 9346CR.EEM is set to "normal operating mode", with the result that the CS line is never deasserted. The symptom of this is that the first read from the EEPROM will work, while all subsequent reads will return garbage data. Reported-by: Thomas Miletich <thomas.miletich@gmail.com> Debugged-by: Thomas Miletich <thomas.miletich@gmail.com> Tested-by: Thomas Miletich <thomas.miletich@gmail.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -60,9 +60,35 @@ static const uint8_t realtek_eeprom_bits[] = {
|
||||
[SPI_BIT_SCLK] = RTL_9346CR_EESK,
|
||||
[SPI_BIT_MOSI] = RTL_9346CR_EEDI,
|
||||
[SPI_BIT_MISO] = RTL_9346CR_EEDO,
|
||||
[SPI_BIT_SS(0)] = ( RTL_9346CR_EECS | RTL_9346CR_EEM1 ),
|
||||
[SPI_BIT_SS(0)] = RTL_9346CR_EECS,
|
||||
};
|
||||
|
||||
/**
|
||||
* Open bit-bashing interface
|
||||
*
|
||||
* @v basher Bit-bashing interface
|
||||
*/
|
||||
static void realtek_spi_open_bit ( struct bit_basher *basher ) {
|
||||
struct realtek_nic *rtl = container_of ( basher, struct realtek_nic,
|
||||
spibit.basher );
|
||||
|
||||
/* Enable EEPROM access */
|
||||
writeb ( RTL_9346CR_EEM_EEPROM, rtl->regs + RTL_9346CR );
|
||||
}
|
||||
|
||||
/**
|
||||
* Close bit-bashing interface
|
||||
*
|
||||
* @v basher Bit-bashing interface
|
||||
*/
|
||||
static void realtek_spi_close_bit ( struct bit_basher *basher ) {
|
||||
struct realtek_nic *rtl = container_of ( basher, struct realtek_nic,
|
||||
spibit.basher );
|
||||
|
||||
/* Disable EEPROM access */
|
||||
writeb ( RTL_9346CR_EEM_NORMAL, rtl->regs + RTL_9346CR );
|
||||
}
|
||||
|
||||
/**
|
||||
* Read input bit
|
||||
*
|
||||
@@ -108,6 +134,8 @@ static void realtek_spi_write_bit ( struct bit_basher *basher,
|
||||
|
||||
/** SPI bit-bashing interface */
|
||||
static struct bit_basher_operations realtek_basher_ops = {
|
||||
.open = realtek_spi_open_bit,
|
||||
.close = realtek_spi_close_bit,
|
||||
.read = realtek_spi_read_bit,
|
||||
.write = realtek_spi_write_bit,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user