|
@@ -243,14 +243,8 @@ static int atl1_get_permanent_address(struct atl1_hw *hw)
|
|
|
i += 4;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * The following 2 lines are the Attansic originals. Saving for posterity.
|
|
|
- * *(u32 *) & eth_addr[2] = LONGSWAP(addr[0]);
|
|
|
- * *(u16 *) & eth_addr[0] = SHORTSWAP(*(u16 *) & addr[1]);
|
|
|
- */
|
|
|
- *(u32 *) & eth_addr[2] = swab32(addr[0]);
|
|
|
- *(u16 *) & eth_addr[0] = swab16(*(u16 *) & addr[1]);
|
|
|
-
|
|
|
+ *(u32 *) ð_addr[2] = swab32(addr[0]);
|
|
|
+ *(u16 *) ð_addr[0] = swab16(*(u16 *) &addr[1]);
|
|
|
if (is_valid_ether_addr(eth_addr)) {
|
|
|
memcpy(hw->perm_mac_addr, eth_addr, ETH_ALEN);
|
|
|
return 0;
|
|
@@ -281,17 +275,28 @@ static int atl1_get_permanent_address(struct atl1_hw *hw)
|
|
|
i += 4;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * The following 2 lines are the Attansic originals. Saving for posterity.
|
|
|
- * *(u32 *) & eth_addr[2] = LONGSWAP(addr[0]);
|
|
|
- * *(u16 *) & eth_addr[0] = SHORTSWAP(*(u16 *) & addr[1]);
|
|
|
- */
|
|
|
- *(u32 *) & eth_addr[2] = swab32(addr[0]);
|
|
|
- *(u16 *) & eth_addr[0] = swab16(*(u16 *) & addr[1]);
|
|
|
+ *(u32 *) ð_addr[2] = swab32(addr[0]);
|
|
|
+ *(u16 *) ð_addr[0] = swab16(*(u16 *) &addr[1]);
|
|
|
if (is_valid_ether_addr(eth_addr)) {
|
|
|
memcpy(hw->perm_mac_addr, eth_addr, ETH_ALEN);
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * On some motherboards, the MAC address is written by the
|
|
|
+ * BIOS directly to the MAC register during POST, and is
|
|
|
+ * not stored in eeprom. If all else thus far has failed
|
|
|
+ * to fetch the permanent MAC address, try reading it directly.
|
|
|
+ */
|
|
|
+ addr[0] = ioread32(hw->hw_addr + REG_MAC_STA_ADDR);
|
|
|
+ addr[1] = ioread16(hw->hw_addr + (REG_MAC_STA_ADDR + 4));
|
|
|
+ *(u32 *) ð_addr[2] = swab32(addr[0]);
|
|
|
+ *(u16 *) ð_addr[0] = swab16(*(u16 *) &addr[1]);
|
|
|
+ if (is_valid_ether_addr(eth_addr)) {
|
|
|
+ memcpy(hw->perm_mac_addr, eth_addr, ETH_ALEN);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
return 1;
|
|
|
}
|
|
|
|