[ipxe-devel] Intel 82576 MAC swapping
Kieran Evans
keyz182 at gmail.com
Fri Jul 27 17:59:04 UTC 2012
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" <keyz182 at gmail.com>:
>> 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" <mouse at yandex-team.ru>:
>>>> 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" <keyz182 at gmail.com>:
>>>>> 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
>>>> ipxe-devel at lists.ipxe.org
>>>> 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 );
More information about the ipxe-devel
mailing list