Here you go:

http://dbyz.co.uk/eth8.dmp
http://dbyz.co.uk/eth9.dmp
http://dbyz.co.uk/eth10.dmp
http://dbyz.co.uk/eth11.dmp

All four are identical.

On 27/07/2012 18:31, Anton D. Kachalov wrote:
Could you paste eeprom dumps from those 4 ports NICs?


27.07.2012, 20:59, "Kieran Evans" <[email protected]>:
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 );

_______________________________________________
ipxe-devel mailing list
[email protected]
https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel

Reply via email to