diff options
| -rw-r--r-- | drivers/net/virtio_net.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index ec2a8b41ed41..b0bc8ead47de 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
| @@ -1673,6 +1673,40 @@ static const struct attribute_group virtio_net_mrg_rx_group = { | |||
| 1673 | }; | 1673 | }; |
| 1674 | #endif | 1674 | #endif |
| 1675 | 1675 | ||
| 1676 | static bool virtnet_fail_on_feature(struct virtio_device *vdev, | ||
| 1677 | unsigned int fbit, | ||
| 1678 | const char *fname, const char *dname) | ||
| 1679 | { | ||
| 1680 | if (!virtio_has_feature(vdev, fbit)) | ||
| 1681 | return false; | ||
| 1682 | |||
| 1683 | dev_err(&vdev->dev, "device advertises feature %s but not %s", | ||
| 1684 | fname, dname); | ||
| 1685 | |||
| 1686 | return true; | ||
| 1687 | } | ||
| 1688 | |||
| 1689 | #define VIRTNET_FAIL_ON(vdev, fbit, dbit) \ | ||
| 1690 | virtnet_fail_on_feature(vdev, fbit, #fbit, dbit) | ||
| 1691 | |||
| 1692 | static bool virtnet_validate_features(struct virtio_device *vdev) | ||
| 1693 | { | ||
| 1694 | if (!virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ) && | ||
| 1695 | (VIRTNET_FAIL_ON(vdev, VIRTIO_NET_F_CTRL_RX, | ||
| 1696 | "VIRTIO_NET_F_CTRL_VQ") || | ||
| 1697 | VIRTNET_FAIL_ON(vdev, VIRTIO_NET_F_CTRL_VLAN, | ||
| 1698 | "VIRTIO_NET_F_CTRL_VQ") || | ||
| 1699 | VIRTNET_FAIL_ON(vdev, VIRTIO_NET_F_GUEST_ANNOUNCE, | ||
| 1700 | "VIRTIO_NET_F_CTRL_VQ") || | ||
| 1701 | VIRTNET_FAIL_ON(vdev, VIRTIO_NET_F_MQ, "VIRTIO_NET_F_CTRL_VQ") || | ||
| 1702 | VIRTNET_FAIL_ON(vdev, VIRTIO_NET_F_CTRL_MAC_ADDR, | ||
| 1703 | "VIRTIO_NET_F_CTRL_VQ"))) { | ||
| 1704 | return false; | ||
| 1705 | } | ||
| 1706 | |||
| 1707 | return true; | ||
| 1708 | } | ||
| 1709 | |||
| 1676 | static int virtnet_probe(struct virtio_device *vdev) | 1710 | static int virtnet_probe(struct virtio_device *vdev) |
| 1677 | { | 1711 | { |
| 1678 | int i, err; | 1712 | int i, err; |
| @@ -1680,6 +1714,9 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
| 1680 | struct virtnet_info *vi; | 1714 | struct virtnet_info *vi; |
| 1681 | u16 max_queue_pairs; | 1715 | u16 max_queue_pairs; |
| 1682 | 1716 | ||
| 1717 | if (!virtnet_validate_features(vdev)) | ||
| 1718 | return -EINVAL; | ||
| 1719 | |||
| 1683 | /* Find if host supports multiqueue virtio_net device */ | 1720 | /* Find if host supports multiqueue virtio_net device */ |
| 1684 | err = virtio_cread_feature(vdev, VIRTIO_NET_F_MQ, | 1721 | err = virtio_cread_feature(vdev, VIRTIO_NET_F_MQ, |
| 1685 | struct virtio_net_config, | 1722 | struct virtio_net_config, |
