diff options
author | Joachim Eastwood <manabian@gmail.com> | 2012-11-07 08:14:50 (GMT) |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-11-07 22:44:37 (GMT) |
commit | 17b8bb3e209d3681e9c94786de845f0d5118eebb (patch) | |
tree | 87c3272b9d08070e975213ab7ba8eb342d10a32d /drivers/net/ethernet/cadence/macb.c | |
parent | 01cbc1a717fe1c041c70a702d1a1a397104d51fa (diff) | |
download | linux-17b8bb3e209d3681e9c94786de845f0d5118eebb.tar.xz |
net/macb: check all address registers sets
The macb driver in u-boot uses the first register set while
the at91_ether driver in u-boot uses the second register set.
By checking all register set, like at91_ether does, this code
can be shared between the drivers.
This only changes behavior on macb if no vaild address
is found in the first register set.
Signed-off-by: Joachim Eastwood <manabian@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/cadence/macb.c')
-rw-r--r-- | drivers/net/ethernet/cadence/macb.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c index 13c3c33..3b609be 100644 --- a/drivers/net/ethernet/cadence/macb.c +++ b/drivers/net/ethernet/cadence/macb.c @@ -114,23 +114,28 @@ static void __init macb_get_hwaddr(struct macb *bp) u32 bottom; u16 top; u8 addr[6]; + int i; - bottom = macb_or_gem_readl(bp, SA1B); - top = macb_or_gem_readl(bp, SA1T); - - addr[0] = bottom & 0xff; - addr[1] = (bottom >> 8) & 0xff; - addr[2] = (bottom >> 16) & 0xff; - addr[3] = (bottom >> 24) & 0xff; - addr[4] = top & 0xff; - addr[5] = (top >> 8) & 0xff; - - if (is_valid_ether_addr(addr)) { - memcpy(bp->dev->dev_addr, addr, sizeof(addr)); - } else { - netdev_info(bp->dev, "invalid hw address, using random\n"); - eth_hw_addr_random(bp->dev); + /* Check all 4 address register for vaild address */ + for (i = 0; i < 4; i++) { + bottom = macb_or_gem_readl(bp, SA1B + i * 8); + top = macb_or_gem_readl(bp, SA1T + i * 8); + + addr[0] = bottom & 0xff; + addr[1] = (bottom >> 8) & 0xff; + addr[2] = (bottom >> 16) & 0xff; + addr[3] = (bottom >> 24) & 0xff; + addr[4] = top & 0xff; + addr[5] = (top >> 8) & 0xff; + + if (is_valid_ether_addr(addr)) { + memcpy(bp->dev->dev_addr, addr, sizeof(addr)); + return; + } } + + netdev_info(bp->dev, "invalid hw address, using random\n"); + eth_hw_addr_random(bp->dev); } static int macb_mdio_read(struct mii_bus *bus, int mii_id, int regnum) |