net: fec: make sure to init MAC address
authorLucas Stach <l.stach@pengutronix.de>
Sun, 30 Mar 2014 19:32:08 +0000 (21:32 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 31 Mar 2014 20:34:19 +0000 (16:34 -0400)
Though we made sure to acquire a valid MAC for
the netdevice we never actually programmed it
into the hardware.
So if the bootloader did not set the MAC,
network operation would only work if userspace
explicitly asked to transfer the MAC to hardware.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/fec_main.c

index e19315eaf2dd65a13bad1f064f856d0e04378dcb..8d69e439f0c518d4b3e46c9ae21d85e4013b7e06 100644 (file)
@@ -1898,10 +1898,11 @@ fec_set_mac_address(struct net_device *ndev, void *p)
        struct fec_enet_private *fep = netdev_priv(ndev);
        struct sockaddr *addr = p;
 
-       if (!is_valid_ether_addr(addr->sa_data))
-               return -EADDRNOTAVAIL;
-
-       memcpy(ndev->dev_addr, addr->sa_data, ndev->addr_len);
+       if (addr) {
+               if (!is_valid_ether_addr(addr->sa_data))
+                       return -EADDRNOTAVAIL;
+               memcpy(ndev->dev_addr, addr->sa_data, ndev->addr_len);
+       }
 
        writel(ndev->dev_addr[3] | (ndev->dev_addr[2] << 8) |
                (ndev->dev_addr[1] << 16) | (ndev->dev_addr[0] << 24),
@@ -2000,6 +2001,8 @@ static int fec_enet_init(struct net_device *ndev)
 
        /* Get the Ethernet address */
        fec_get_mac(ndev);
+       /* make sure MAC we just acquired is programmed into the hw */
+       fec_set_mac_address(ndev, NULL);
 
        /* init the tx & rx ring size */
        fep->tx_ring_size = TX_RING_SIZE;