diff options
-rw-r--r-- | drivers/net/8139cp.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index 35517b06ec3f..a09e3a7cac4f 100644 --- a/drivers/net/8139cp.c +++ b/drivers/net/8139cp.c | |||
@@ -1602,6 +1602,28 @@ static int cp_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) | |||
1602 | return rc; | 1602 | return rc; |
1603 | } | 1603 | } |
1604 | 1604 | ||
1605 | static int cp_set_mac_address(struct net_device *dev, void *p) | ||
1606 | { | ||
1607 | struct cp_private *cp = netdev_priv(dev); | ||
1608 | struct sockaddr *addr = p; | ||
1609 | |||
1610 | if (!is_valid_ether_addr(addr->sa_data)) | ||
1611 | return -EADDRNOTAVAIL; | ||
1612 | |||
1613 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); | ||
1614 | |||
1615 | spin_lock_irq(&cp->lock); | ||
1616 | |||
1617 | cpw8_f(Cfg9346, Cfg9346_Unlock); | ||
1618 | cpw32_f(MAC0 + 0, le32_to_cpu (*(__le32 *) (dev->dev_addr + 0))); | ||
1619 | cpw32_f(MAC0 + 4, le32_to_cpu (*(__le32 *) (dev->dev_addr + 4))); | ||
1620 | cpw8_f(Cfg9346, Cfg9346_Lock); | ||
1621 | |||
1622 | spin_unlock_irq(&cp->lock); | ||
1623 | |||
1624 | return 0; | ||
1625 | } | ||
1626 | |||
1605 | /* Serial EEPROM section. */ | 1627 | /* Serial EEPROM section. */ |
1606 | 1628 | ||
1607 | /* EEPROM_Ctrl bits. */ | 1629 | /* EEPROM_Ctrl bits. */ |
@@ -1821,7 +1843,7 @@ static const struct net_device_ops cp_netdev_ops = { | |||
1821 | .ndo_open = cp_open, | 1843 | .ndo_open = cp_open, |
1822 | .ndo_stop = cp_close, | 1844 | .ndo_stop = cp_close, |
1823 | .ndo_validate_addr = eth_validate_addr, | 1845 | .ndo_validate_addr = eth_validate_addr, |
1824 | .ndo_set_mac_address = eth_mac_addr, | 1846 | .ndo_set_mac_address = cp_set_mac_address, |
1825 | .ndo_set_multicast_list = cp_set_rx_mode, | 1847 | .ndo_set_multicast_list = cp_set_rx_mode, |
1826 | .ndo_get_stats = cp_get_stats, | 1848 | .ndo_get_stats = cp_get_stats, |
1827 | .ndo_do_ioctl = cp_ioctl, | 1849 | .ndo_do_ioctl = cp_ioctl, |