igb: read address from RAH/RAL instead of from EEPROM
authorAlexander Duyck <alexander.h.duyck@intel.com>
Fri, 6 Feb 2009 23:17:06 +0000 (23:17 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 7 Feb 2009 10:43:05 +0000 (02:43 -0800)
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>
drivers/net/igb/e1000_defines.h
drivers/net/igb/e1000_nvm.c

index 40d03426c1223f85639e6f03c2d61c6499144636..54a1489233867404fcb5ca4be7fc1899fced8328 100644 (file)
  * manageability enabled, allowing us room for 15 multicast addresses.
  */
 #define E1000_RAH_AV  0x80000000        /* Receive descriptor valid */
+#define E1000_RAL_MAC_ADDR_LEN 4
+#define E1000_RAH_MAC_ADDR_LEN 2
 
 /* Error Codes */
 #define E1000_ERR_NVM      1
index a84e4e429fa7e3a4a1606db2a7dd7a48069b0d78..5942da107a9c6bedd40fc4bc0b40025b71611fd7 100644 (file)
@@ -515,29 +515,23 @@ out:
  **/
 s32 igb_read_mac_addr(struct e1000_hw *hw)
 {
-       s32  ret_val = 0;
-       u16 offset, nvm_data, i;
+       u32 rar_high;
+       u32 rar_low;
+       u16 i;
 
-       for (i = 0; i < ETH_ALEN; i += 2) {
-               offset = i >> 1;
-               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);
-       }
+       rar_high = rd32(E1000_RAH(0));
+       rar_low = rd32(E1000_RAL(0));
+
+       for (i = 0; i < E1000_RAL_MAC_ADDR_LEN; i++)
+               hw->mac.perm_addr[i] = (u8)(rar_low >> (i*8));
 
-       /* Flip last bit of mac address if we're on second port */
-       if (hw->bus.func == E1000_FUNC_1)
-               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++)
                hw->mac.addr[i] = hw->mac.perm_addr[i];
 
-out:
-       return ret_val;
+       return 0;
 }
 
 /**