Browse Source

[realtek] Do not attempt to access EEPROM on RTL8169 chips

On some RTL8169 onboard NICs (observed with a Lenovo ThinkPad 11e),
the EEPROM is not merely not present: any attempt to read from the
non-existent EEPROM will crash and reboot the system.

The equivalent code to read from the EEPROM was removed from the Linux
r8169 driver in 2009 with a comment suggesting that it was similarly
found to be unreliable on some systems.

Fix by accessing the EEPROM only on RTL8139 NICs, and assuming that
the MAC address will always be correctly preset on RTL8169 NICs.

Reported-by: Evan Prohaska <eprohaska@edkey.org>
Tested-by: Evan Prohaska <eprohaska@edkey.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 9 years ago
parent
commit
eda1c58358
1 changed files with 3 additions and 2 deletions
  1. 3
    2
      src/drivers/net/realtek.c

+ 3
- 2
src/drivers/net/realtek.c View File

198
 		DBGC ( rtl, "REALTEK %p EEPROM is a 93C46\n", rtl );
198
 		DBGC ( rtl, "REALTEK %p EEPROM is a 93C46\n", rtl );
199
 		init_at93c46 ( &rtl->eeprom, 16 );
199
 		init_at93c46 ( &rtl->eeprom, 16 );
200
 	}
200
 	}
201
-	rtl->eeprom.bus = &rtl->spibit.bus;
202
 
201
 
203
 	/* Check for EEPROM presence.  Some onboard NICs will have no
202
 	/* Check for EEPROM presence.  Some onboard NICs will have no
204
 	 * EEPROM connected, with the BIOS being responsible for
203
 	 * EEPROM connected, with the BIOS being responsible for
1089
 			       rtl );
1088
 			       rtl );
1090
 			rtl->legacy = 1;
1089
 			rtl->legacy = 1;
1091
 		}
1090
 		}
1091
+		rtl->eeprom.bus = &rtl->spibit.bus;
1092
 	}
1092
 	}
1093
 }
1093
 }
1094
 
1094
 
1136
 	realtek_detect ( rtl );
1136
 	realtek_detect ( rtl );
1137
 
1137
 
1138
 	/* Initialise EEPROM */
1138
 	/* Initialise EEPROM */
1139
-	if ( ( rc = realtek_init_eeprom ( netdev ) ) == 0 ) {
1139
+	if ( rtl->eeprom.bus &&
1140
+	     ( ( rc = realtek_init_eeprom ( netdev ) ) == 0 ) ) {
1140
 
1141
 
1141
 		/* Read MAC address from EEPROM */
1142
 		/* Read MAC address from EEPROM */
1142
 		if ( ( rc = nvs_read ( &rtl->eeprom.nvs, RTL_EEPROM_MAC,
1143
 		if ( ( rc = nvs_read ( &rtl->eeprom.nvs, RTL_EEPROM_MAC,

Loading…
Cancel
Save