cpsw: fix for change MAC address using ifconfig
authorHebbar, Gururaja <gururaja.hebbar@ti.com>
Mon, 2 Jan 2012 10:55:32 +0000 (16:25 +0530)
committerVaibhav Hiremath <hvaibhav@ti.com>
Mon, 23 Jan 2012 19:14:44 +0000 (00:44 +0530)
When MAC address is changed using ifconfig, driver MAC address is
not changes as pointer holding the new MAC address is not utilised.
Changed the driver code to utilize the new MAC address and change
the MAC address in driver if it is a valid MAC address.

Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
Signed-off-by: Hebbar, Gururaja <gururaja.hebbar@ti.com>
drivers/net/ethernet/ti/cpsw.c

index 064384771b3dd0b9998ce2202c809a6b341fe139..e209fa0ece2e1aaf9e0797d2f995df516bc2f6e6 100644 (file)
@@ -828,15 +828,22 @@ static void cpsw_ndo_change_rx_flags(struct net_device *ndev, int flags)
                dev_err(&ndev->dev, "multicast traffic cannot be filtered!\n");
 }
 
                dev_err(&ndev->dev, "multicast traffic cannot be filtered!\n");
 }
 
-static int cpsw_ndo_set_mac_address(struct net_device *ndev, void *addr)
+static int cpsw_ndo_set_mac_address(struct net_device *ndev, void *p)
 {
        struct cpsw_priv *priv = netdev_priv(ndev);
 {
        struct cpsw_priv *priv = netdev_priv(ndev);
+       struct sockaddr *addr = (struct sockaddr *)p;
+
+       if (!is_valid_ether_addr(addr->sa_data))
+               return -EADDRNOTAVAIL;
 
        cpsw_ale_del_ucast(priv->ale, priv->mac_addr, priv->host_port);
 
        cpsw_ale_del_ucast(priv->ale, priv->mac_addr, priv->host_port);
-       memcpy(priv->mac_addr, ndev->dev_addr, ETH_ALEN);
+
+       memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN);
+       memcpy(ndev->dev_addr, priv->mac_addr, ETH_ALEN);
+
        cpsw_ale_add_ucast(priv->ale, priv->mac_addr, priv->host_port,
                           0);
        cpsw_ale_add_ucast(priv->ale, priv->mac_addr, priv->host_port,
                           0);
-                          /* ALE_SECURE); */
+       /* ALE_SECURE); */
        for_each_slave(priv, cpsw_set_slave_mac, priv);
        return 0;
 }
        for_each_slave(priv, cpsw_set_slave_mac, priv);
        return 0;
 }