diff options
Diffstat (limited to 'drivers/virtio')
-rw-r--r-- | drivers/virtio/virtio.c | 5 | ||||
-rw-r--r-- | drivers/virtio/virtio_pci.c | 10 |
2 files changed, 8 insertions, 7 deletions
diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c index baf103361e3a..5b78fd0aff0a 100644 --- a/drivers/virtio/virtio.c +++ b/drivers/virtio/virtio.c | |||
@@ -113,7 +113,7 @@ static int virtio_dev_probe(struct device *_d) | |||
113 | set_bit(f, dev->features); | 113 | set_bit(f, dev->features); |
114 | } | 114 | } |
115 | 115 | ||
116 | /* Transport features are always preserved to pass to set_features. */ | 116 | /* Transport features always preserved to pass to finalize_features. */ |
117 | for (i = VIRTIO_TRANSPORT_F_START; i < VIRTIO_TRANSPORT_F_END; i++) | 117 | for (i = VIRTIO_TRANSPORT_F_START; i < VIRTIO_TRANSPORT_F_END; i++) |
118 | if (device_features & (1 << i)) | 118 | if (device_features & (1 << i)) |
119 | set_bit(i, dev->features); | 119 | set_bit(i, dev->features); |
@@ -122,8 +122,7 @@ static int virtio_dev_probe(struct device *_d) | |||
122 | if (err) | 122 | if (err) |
123 | add_status(dev, VIRTIO_CONFIG_S_FAILED); | 123 | add_status(dev, VIRTIO_CONFIG_S_FAILED); |
124 | else { | 124 | else { |
125 | /* They should never have set feature bits beyond 32 */ | 125 | dev->config->finalize_features(dev); |
126 | dev->config->set_features(dev, dev->features[0]); | ||
127 | add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK); | 126 | add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK); |
128 | } | 127 | } |
129 | return err; | 128 | return err; |
diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index eae7236310e4..9855975a72a3 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c | |||
@@ -94,12 +94,14 @@ static u32 vp_get_features(struct virtio_device *vdev) | |||
94 | return ioread32(vp_dev->ioaddr + VIRTIO_PCI_HOST_FEATURES); | 94 | return ioread32(vp_dev->ioaddr + VIRTIO_PCI_HOST_FEATURES); |
95 | } | 95 | } |
96 | 96 | ||
97 | /* virtio config->set_features() implementation */ | 97 | /* virtio config->finalize_features() implementation */ |
98 | static void vp_set_features(struct virtio_device *vdev, u32 features) | 98 | static void vp_finalize_features(struct virtio_device *vdev) |
99 | { | 99 | { |
100 | struct virtio_pci_device *vp_dev = to_vp_device(vdev); | 100 | struct virtio_pci_device *vp_dev = to_vp_device(vdev); |
101 | 101 | ||
102 | iowrite32(features, vp_dev->ioaddr + VIRTIO_PCI_GUEST_FEATURES); | 102 | /* We only support 32 feature bits. */ |
103 | BUILD_BUG_ON(ARRAY_SIZE(vdev->features) != 1); | ||
104 | iowrite32(vdev->features[0], vp_dev->ioaddr+VIRTIO_PCI_GUEST_FEATURES); | ||
103 | } | 105 | } |
104 | 106 | ||
105 | /* virtio config->get() implementation */ | 107 | /* virtio config->get() implementation */ |
@@ -297,7 +299,7 @@ static struct virtio_config_ops virtio_pci_config_ops = { | |||
297 | .find_vq = vp_find_vq, | 299 | .find_vq = vp_find_vq, |
298 | .del_vq = vp_del_vq, | 300 | .del_vq = vp_del_vq, |
299 | .get_features = vp_get_features, | 301 | .get_features = vp_get_features, |
300 | .set_features = vp_set_features, | 302 | .finalize_features = vp_finalize_features, |
301 | }; | 303 | }; |
302 | 304 | ||
303 | /* the PCI probing function */ | 305 | /* the PCI probing function */ |