net/macb: check all address registers sets
authorJoachim Eastwood <manabian@gmail.com>
Wed, 7 Nov 2012 08:14:50 +0000 (08:14 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 7 Nov 2012 22:44:37 +0000 (17:44 -0500)
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>
drivers/net/ethernet/cadence/macb.c

index 13c3c33..3b609be 100644 (file)
@@ -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)