virtio_net: convert to hw_features
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
9b12c75bf4
commit
98e778c9aa
@@ -710,17 +710,6 @@ static int virtnet_close(struct net_device *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int virtnet_set_tx_csum(struct net_device *dev, u32 data)
|
|
||||||
{
|
|
||||||
struct virtnet_info *vi = netdev_priv(dev);
|
|
||||||
struct virtio_device *vdev = vi->vdev;
|
|
||||||
|
|
||||||
if (data && !virtio_has_feature(vdev, VIRTIO_NET_F_CSUM))
|
|
||||||
return -ENOSYS;
|
|
||||||
|
|
||||||
return ethtool_op_set_tx_hw_csum(dev, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void virtnet_set_rx_mode(struct net_device *dev)
|
static void virtnet_set_rx_mode(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct virtnet_info *vi = netdev_priv(dev);
|
struct virtnet_info *vi = netdev_priv(dev);
|
||||||
@@ -822,10 +811,6 @@ static void virtnet_vlan_rx_kill_vid(struct net_device *dev, u16 vid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const struct ethtool_ops virtnet_ethtool_ops = {
|
static const struct ethtool_ops virtnet_ethtool_ops = {
|
||||||
.set_tx_csum = virtnet_set_tx_csum,
|
|
||||||
.set_sg = ethtool_op_set_sg,
|
|
||||||
.set_tso = ethtool_op_set_tso,
|
|
||||||
.set_ufo = ethtool_op_set_ufo,
|
|
||||||
.get_link = ethtool_op_get_link,
|
.get_link = ethtool_op_get_link,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -912,22 +897,29 @@ static int virtnet_probe(struct virtio_device *vdev)
|
|||||||
SET_NETDEV_DEV(dev, &vdev->dev);
|
SET_NETDEV_DEV(dev, &vdev->dev);
|
||||||
|
|
||||||
/* Do we support "hardware" checksums? */
|
/* Do we support "hardware" checksums? */
|
||||||
if (csum && virtio_has_feature(vdev, VIRTIO_NET_F_CSUM)) {
|
if (virtio_has_feature(vdev, VIRTIO_NET_F_CSUM)) {
|
||||||
/* This opens up the world of extra features. */
|
/* This opens up the world of extra features. */
|
||||||
|
dev->hw_features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST;
|
||||||
|
if (csum)
|
||||||
dev->features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST;
|
dev->features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST;
|
||||||
if (gso && virtio_has_feature(vdev, VIRTIO_NET_F_GSO)) {
|
|
||||||
dev->features |= NETIF_F_TSO | NETIF_F_UFO
|
if (virtio_has_feature(vdev, VIRTIO_NET_F_GSO)) {
|
||||||
|
dev->hw_features |= NETIF_F_TSO | NETIF_F_UFO
|
||||||
| NETIF_F_TSO_ECN | NETIF_F_TSO6;
|
| NETIF_F_TSO_ECN | NETIF_F_TSO6;
|
||||||
}
|
}
|
||||||
/* Individual feature bits: what can host handle? */
|
/* Individual feature bits: what can host handle? */
|
||||||
if (gso && virtio_has_feature(vdev, VIRTIO_NET_F_HOST_TSO4))
|
if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_TSO4))
|
||||||
dev->features |= NETIF_F_TSO;
|
dev->hw_features |= NETIF_F_TSO;
|
||||||
if (gso && virtio_has_feature(vdev, VIRTIO_NET_F_HOST_TSO6))
|
if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_TSO6))
|
||||||
dev->features |= NETIF_F_TSO6;
|
dev->hw_features |= NETIF_F_TSO6;
|
||||||
if (gso && virtio_has_feature(vdev, VIRTIO_NET_F_HOST_ECN))
|
if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_ECN))
|
||||||
dev->features |= NETIF_F_TSO_ECN;
|
dev->hw_features |= NETIF_F_TSO_ECN;
|
||||||
if (gso && virtio_has_feature(vdev, VIRTIO_NET_F_HOST_UFO))
|
if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_UFO))
|
||||||
dev->features |= NETIF_F_UFO;
|
dev->hw_features |= NETIF_F_UFO;
|
||||||
|
|
||||||
|
if (gso)
|
||||||
|
dev->features |= dev->hw_features & (NETIF_F_ALL_TSO|NETIF_F_UFO);
|
||||||
|
/* (!csum && gso) case will be fixed by register_netdev() */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Configuration may specify what MAC to use. Otherwise random. */
|
/* Configuration may specify what MAC to use. Otherwise random. */
|
||||||
|
Reference in New Issue
Block a user