|
@@ -3325,6 +3325,37 @@ static void ucc_netpoll(struct net_device *dev)
|
|
}
|
|
}
|
|
#endif /* CONFIG_NET_POLL_CONTROLLER */
|
|
#endif /* CONFIG_NET_POLL_CONTROLLER */
|
|
|
|
|
|
|
|
+static int ucc_geth_set_mac_addr(struct net_device *dev, void *p)
|
|
|
|
+{
|
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
|
+ struct sockaddr *addr = p;
|
|
|
|
+
|
|
|
|
+ if (!is_valid_ether_addr(addr->sa_data))
|
|
|
|
+ return -EADDRNOTAVAIL;
|
|
|
|
+
|
|
|
|
+ memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * If device is not running, we will set mac addr register
|
|
|
|
+ * when opening the device.
|
|
|
|
+ */
|
|
|
|
+ if (!netif_running(dev))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ spin_lock_irq(&ugeth->lock);
|
|
|
|
+ init_mac_station_addr_regs(dev->dev_addr[0],
|
|
|
|
+ dev->dev_addr[1],
|
|
|
|
+ dev->dev_addr[2],
|
|
|
|
+ dev->dev_addr[3],
|
|
|
|
+ dev->dev_addr[4],
|
|
|
|
+ dev->dev_addr[5],
|
|
|
|
+ &ugeth->ug_regs->macstnaddr1,
|
|
|
|
+ &ugeth->ug_regs->macstnaddr2);
|
|
|
|
+ spin_unlock_irq(&ugeth->lock);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
/* Called when something needs to use the ethernet device */
|
|
/* Called when something needs to use the ethernet device */
|
|
/* Returns 0 for success. */
|
|
/* Returns 0 for success. */
|
|
static int ucc_geth_open(struct net_device *dev)
|
|
static int ucc_geth_open(struct net_device *dev)
|
|
@@ -3501,7 +3532,7 @@ static const struct net_device_ops ucc_geth_netdev_ops = {
|
|
.ndo_stop = ucc_geth_close,
|
|
.ndo_stop = ucc_geth_close,
|
|
.ndo_start_xmit = ucc_geth_start_xmit,
|
|
.ndo_start_xmit = ucc_geth_start_xmit,
|
|
.ndo_validate_addr = eth_validate_addr,
|
|
.ndo_validate_addr = eth_validate_addr,
|
|
- .ndo_set_mac_address = eth_mac_addr,
|
|
|
|
|
|
+ .ndo_set_mac_address = ucc_geth_set_mac_addr,
|
|
.ndo_change_mtu = eth_change_mtu,
|
|
.ndo_change_mtu = eth_change_mtu,
|
|
.ndo_set_multicast_list = ucc_geth_set_multi,
|
|
.ndo_set_multicast_list = ucc_geth_set_multi,
|
|
.ndo_tx_timeout = ucc_geth_timeout,
|
|
.ndo_tx_timeout = ucc_geth_timeout,
|