igb: read address from RAH/RAL instead of from EEPROM
Instead of pulling the mac address from EEPROM it is easier to pull it from the RAL/RAH registers and then just copy it into the address structures. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
c1889bfe68
commit
40a70b3889
@@ -481,6 +481,8 @@
|
|||||||
* manageability enabled, allowing us room for 15 multicast addresses.
|
* manageability enabled, allowing us room for 15 multicast addresses.
|
||||||
*/
|
*/
|
||||||
#define E1000_RAH_AV 0x80000000 /* Receive descriptor valid */
|
#define E1000_RAH_AV 0x80000000 /* Receive descriptor valid */
|
||||||
|
#define E1000_RAL_MAC_ADDR_LEN 4
|
||||||
|
#define E1000_RAH_MAC_ADDR_LEN 2
|
||||||
|
|
||||||
/* Error Codes */
|
/* Error Codes */
|
||||||
#define E1000_ERR_NVM 1
|
#define E1000_ERR_NVM 1
|
||||||
|
@@ -515,29 +515,23 @@ out:
|
|||||||
**/
|
**/
|
||||||
s32 igb_read_mac_addr(struct e1000_hw *hw)
|
s32 igb_read_mac_addr(struct e1000_hw *hw)
|
||||||
{
|
{
|
||||||
s32 ret_val = 0;
|
u32 rar_high;
|
||||||
u16 offset, nvm_data, i;
|
u32 rar_low;
|
||||||
|
u16 i;
|
||||||
|
|
||||||
for (i = 0; i < ETH_ALEN; i += 2) {
|
rar_high = rd32(E1000_RAH(0));
|
||||||
offset = i >> 1;
|
rar_low = rd32(E1000_RAL(0));
|
||||||
ret_val = hw->nvm.ops.read_nvm(hw, offset, 1, &nvm_data);
|
|
||||||
if (ret_val) {
|
|
||||||
hw_dbg("NVM Read Error\n");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
hw->mac.perm_addr[i] = (u8)(nvm_data & 0xFF);
|
|
||||||
hw->mac.perm_addr[i+1] = (u8)(nvm_data >> 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Flip last bit of mac address if we're on second port */
|
for (i = 0; i < E1000_RAL_MAC_ADDR_LEN; i++)
|
||||||
if (hw->bus.func == E1000_FUNC_1)
|
hw->mac.perm_addr[i] = (u8)(rar_low >> (i*8));
|
||||||
hw->mac.perm_addr[5] ^= 1;
|
|
||||||
|
for (i = 0; i < E1000_RAH_MAC_ADDR_LEN; i++)
|
||||||
|
hw->mac.perm_addr[i+4] = (u8)(rar_high >> (i*8));
|
||||||
|
|
||||||
for (i = 0; i < ETH_ALEN; i++)
|
for (i = 0; i < ETH_ALEN; i++)
|
||||||
hw->mac.addr[i] = hw->mac.perm_addr[i];
|
hw->mac.addr[i] = hw->mac.perm_addr[i];
|
||||||
|
|
||||||
out:
|
return 0;
|
||||||
return ret_val;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user