diff options
| author | Oliver Martin <oliver.martin@student.tuwien.ac.at> | 2008-08-23 16:08:47 -0400 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@redhat.com> | 2008-08-27 05:54:57 -0400 |
| commit | 1025433147e635af9cd150676a097396cf666ddb (patch) | |
| tree | e91dec9b5ac553901711d1fca79d0de521863508 /drivers/net | |
| parent | 8382cc1c2d0eb8918d3b71bf6cb8ac2e883f3e33 (diff) | |
net/usb/mcs7830: add set_mac_address
Implement set_mac_address for mcs7830. This enables me to use it with my
cable modem.
Signed-off-by: Oliver Martin <oliver.martin@student.tuwien.ac.at>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/usb/mcs7830.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/net/usb/mcs7830.c b/drivers/net/usb/mcs7830.c index ebf1332abaa1..ca9d00c1194e 100644 --- a/drivers/net/usb/mcs7830.c +++ b/drivers/net/usb/mcs7830.c | |||
| @@ -446,6 +446,29 @@ static struct ethtool_ops mcs7830_ethtool_ops = { | |||
| 446 | .nway_reset = usbnet_nway_reset, | 446 | .nway_reset = usbnet_nway_reset, |
| 447 | }; | 447 | }; |
| 448 | 448 | ||
| 449 | static int mcs7830_set_mac_address(struct net_device *netdev, void *p) | ||
| 450 | { | ||
| 451 | int ret; | ||
| 452 | struct usbnet *dev = netdev_priv(netdev); | ||
| 453 | struct sockaddr *addr = p; | ||
| 454 | |||
| 455 | if (netif_running(netdev)) | ||
| 456 | return -EBUSY; | ||
| 457 | |||
| 458 | if (!is_valid_ether_addr(addr->sa_data)) | ||
| 459 | return -EINVAL; | ||
| 460 | |||
| 461 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); | ||
| 462 | |||
| 463 | ret = mcs7830_set_reg(dev, HIF_REG_ETHERNET_ADDR, ETH_ALEN, | ||
| 464 | netdev->dev_addr); | ||
| 465 | |||
| 466 | if (ret < 0) | ||
| 467 | return ret; | ||
| 468 | |||
| 469 | return 0; | ||
| 470 | } | ||
| 471 | |||
| 449 | static int mcs7830_bind(struct usbnet *dev, struct usb_interface *udev) | 472 | static int mcs7830_bind(struct usbnet *dev, struct usb_interface *udev) |
| 450 | { | 473 | { |
| 451 | struct net_device *net = dev->net; | 474 | struct net_device *net = dev->net; |
| @@ -459,6 +482,7 @@ static int mcs7830_bind(struct usbnet *dev, struct usb_interface *udev) | |||
| 459 | net->ethtool_ops = &mcs7830_ethtool_ops; | 482 | net->ethtool_ops = &mcs7830_ethtool_ops; |
| 460 | net->set_multicast_list = mcs7830_set_multicast; | 483 | net->set_multicast_list = mcs7830_set_multicast; |
| 461 | mcs7830_set_multicast(net); | 484 | mcs7830_set_multicast(net); |
| 485 | net->set_mac_address = mcs7830_set_mac_address; | ||
| 462 | 486 | ||
| 463 | /* reserve space for the status byte on rx */ | 487 | /* reserve space for the status byte on rx */ |
| 464 | dev->rx_urb_size = ETH_FRAME_LEN + 1; | 488 | dev->rx_urb_size = ETH_FRAME_LEN + 1; |
