Looks like the validity check is necessary. On some other interfaces
that are 4 port 82576s they were loading FF:FF:FF:FF:FF:FF from eeprom
and using it.
I've attached (and uploaded here https://gist.github.com/3189152) a
patch with a validity check that works for those interfaces.
There's 12 interfaces on this server though, so capturing the output is
a little difficult, I'll try to get a video of it so I can pull out some
frames to see the output.
Here's the end of the debug output for now (the first two sets of output
are the last two problem ports) http://dbyz.co.uk/ipxe7.png
Here's the output from ifstat on that server (at least, the last 4/5ths
of it) http://dbyz.co.uk/ipxe8.png
/Kieran
On 27/07/2012 16:38, Anton D. Kachalov wrote:
Here is another one without shifting an offset.
27.07.2012, 19:36, "Anton D. Kachalov" <[email protected]>:
Kieran,
regarding to "igb" driver, offset (in words) to EEPROM's MAC should be placed
at 0x37 (in words) of EEPROM (page 178, table 6-1). It is 0xffff.
Try the attached patch.
I accidentally has added left shift by 2 instead of 1 :))
if ( ( rc = nvs_read ( &intel->eeprom, 0x37 << 2 /* NVM_ALT_MAC_ADDR_PTR
*/,
to this one:
if ( ( rc = nvs_read ( &intel->eeprom, 0x37 << 1 /* NVM_ALT_MAC_ADDR_PTR
*/,
27.07.2012, 19:01, "Kieran Evans" <[email protected]>:
Anton, no luck there I'm afraid.
http://dbyz.co.uk/ipxe4.png
If you check the EEPROM dumps I sent earlier, you'll see that there is
only one MAC in the whole EEPROM. Looking for it at different offsets
will return garbage.
Just to be sure, I dumped the EEPROM from both interfaces (both linked
in an earlier email) and they are identical, so they are sharing the
same EEPROM.
/Kieran
On 27/07/2012 14:55, Anton D. Kachalov wrote:
Kieran,
my fault.
Fix this line:
if ( ( rc = nvs_read ( &intel->eeprom, 0x37 /* NVM_ALT_MAC_ADDR_PTR */,
to this one:
if ( ( rc = nvs_read ( &intel->eeprom, 0x37 << 2 /* NVM_ALT_MAC_ADDR_PTR
*/,
--
Anton D. Kachalov
ITO, R&D group, Senior System Engineer
Tel: +7 (495) 739-70-00 ext.7613
_______________________________________________
ipxe-devel mailing list
[email protected]
https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel
--- a/src/drivers/net/intel.c
+++ b/src/drivers/net/intel.c
@@ -181,21 +181,41 @@ static int intel_init_eeprom ( struct intel_nic *intel ) {
static int intel_fetch_mac_eeprom ( struct intel_nic *intel,
uint8_t *hw_addr ) {
int rc;
+ uint16_t offset;
/* Initialise EEPROM */
if ( ( rc = intel_init_eeprom ( intel ) ) != 0 )
return rc;
+ if ( ( rc = nvs_read ( &intel->eeprom, 0x37 /* NVM_ALT_MAC_ADDR_PTR */,
+ &offset, sizeof(offset) ) ) != 0 ) {
+ DBGC ( intel, "INTEL %p could not read EEPROM alternate MAC"
+ "address PTR: %s\n", intel, strerror ( rc ) );
+ return rc;
+ }
+
+ if (offset == 0xffff) {
+ /* There is no Alternate MAC Address */
+ return -1;
+ }
+
+ if (intel->port == 1)
+ offset += 3; /* E1000_ALT_MAC_ADDRESS_OFFSET_LAN1 */
+
/* Read base MAC address from EEPROM */
- if ( ( rc = nvs_read ( &intel->eeprom, INTEL_EEPROM_MAC,
+ if ( ( rc = nvs_read ( &intel->eeprom, offset,
hw_addr, ETH_ALEN ) ) != 0 ) {
DBGC ( intel, "INTEL %p could not read EEPROM base MAC "
"address: %s\n", intel, strerror ( rc ) );
return rc;
}
- /* Adjust MAC address for multi-port devices */
- hw_addr[ETH_ALEN-1] ^= intel->port;
+ if ( ! is_valid_ether_addr ( hw_addr ) ) {
+ DBGC ( intel, "INTEL %p EEPROM MAC %s Tested as invalid, skipping
",
+ intel, eth_ntoa ( hw_addr ) );
+ return -1;
+ }
+
DBGC ( intel, "INTEL %p has EEPROM MAC address %s (port %d)\n",
intel, eth_ntoa ( hw_addr ), intel->port );