]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/usb/mcs7830.c
net/usb/mcs7830: add set_mac_address
[linux-2.6-omap-h63xx.git] / drivers / net / usb / mcs7830.c
index ebf1332abaa11e0adfe284c65de835aa89639b15..ca9d00c1194e0448da4945a00f2941a32bab8f75 100644 (file)
@@ -446,6 +446,29 @@ static struct ethtool_ops mcs7830_ethtool_ops = {
        .nway_reset             = usbnet_nway_reset,
 };
 
+static int mcs7830_set_mac_address(struct net_device *netdev, void *p)
+{
+       int ret;
+       struct usbnet *dev = netdev_priv(netdev);
+       struct sockaddr *addr = p;
+
+       if (netif_running(netdev))
+               return -EBUSY;
+
+       if (!is_valid_ether_addr(addr->sa_data))
+               return -EINVAL;
+
+       memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
+
+       ret = mcs7830_set_reg(dev, HIF_REG_ETHERNET_ADDR, ETH_ALEN,
+                       netdev->dev_addr);
+
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
 static int mcs7830_bind(struct usbnet *dev, struct usb_interface *udev)
 {
        struct net_device *net = dev->net;
@@ -459,6 +482,7 @@ static int mcs7830_bind(struct usbnet *dev, struct usb_interface *udev)
        net->ethtool_ops = &mcs7830_ethtool_ops;
        net->set_multicast_list = mcs7830_set_multicast;
        mcs7830_set_multicast(net);
+       net->set_mac_address = mcs7830_set_mac_address;
 
        /* reserve space for the status byte on rx */
        dev->rx_urb_size = ETH_FRAME_LEN + 1;