virtio-net: introduce a new control to set macaddr
Currently we write MAC address to pci config space byte by byte, this means that we have an intermediate step where mac is wrong. This patch introduced a new control command to set MAC address, it's atomic. VIRTIO_NET_F_CTRL_MAC_ADDR is a new feature bit for compatibility. Signed-off-by: Amos Kong <akong@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
fa0879e37b
commit
7e58d5aea8
@@ -802,14 +802,28 @@ static int virtnet_set_mac_address(struct net_device *dev, void *p)
|
||||
struct virtnet_info *vi = netdev_priv(dev);
|
||||
struct virtio_device *vdev = vi->vdev;
|
||||
int ret;
|
||||
struct sockaddr *addr = p;
|
||||
struct scatterlist sg;
|
||||
|
||||
ret = eth_mac_addr(dev, p);
|
||||
ret = eth_prepare_mac_addr_change(dev, p);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC))
|
||||
if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_MAC_ADDR)) {
|
||||
sg_init_one(&sg, addr->sa_data, dev->addr_len);
|
||||
if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_MAC,
|
||||
VIRTIO_NET_CTRL_MAC_ADDR_SET,
|
||||
&sg, 1, 0)) {
|
||||
dev_warn(&vdev->dev,
|
||||
"Failed to set mac address by vq command.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC)) {
|
||||
vdev->config->set(vdev, offsetof(struct virtio_net_config, mac),
|
||||
dev->dev_addr, dev->addr_len);
|
||||
addr->sa_data, dev->addr_len);
|
||||
}
|
||||
|
||||
eth_commit_mac_addr_change(dev, p);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1627,6 +1641,7 @@ static unsigned int features[] = {
|
||||
VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ,
|
||||
VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
|
||||
VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,
|
||||
VIRTIO_NET_F_CTRL_MAC_ADDR,
|
||||
};
|
||||
|
||||
static struct virtio_driver virtio_net_driver = {
|
||||
|
||||
Reference in New Issue
Block a user