aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/virtio
diff options
context:
space:
mode:
authorMichael S. Tsirkin <mst@redhat.com>2014-10-22 10:41:38 -0400
committerMichael S. Tsirkin <mst@redhat.com>2014-12-09 05:05:25 -0500
commitcb3f6d9da49929797f806b4e91ec005e6fc2e9c2 (patch)
treee345a69f99132bf1a88340229610e51d36cd5ecf /drivers/virtio
parent890626521503318d7ac92a4a3b9feba55c0131ec (diff)
virtio: set FEATURES_OK
set FEATURES_OK as per virtio 1.0 spec Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Diffstat (limited to 'drivers/virtio')
-rw-r--r--drivers/virtio/virtio.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c
index 746d350c8062..9248125d29c9 100644
--- a/drivers/virtio/virtio.c
+++ b/drivers/virtio/virtio.c
@@ -160,6 +160,7 @@ static int virtio_dev_probe(struct device *_d)
160 struct virtio_device *dev = dev_to_virtio(_d); 160 struct virtio_device *dev = dev_to_virtio(_d);
161 struct virtio_driver *drv = drv_to_virtio(dev->dev.driver); 161 struct virtio_driver *drv = drv_to_virtio(dev->dev.driver);
162 u64 device_features; 162 u64 device_features;
163 unsigned status;
163 164
164 /* We have a driver! */ 165 /* We have a driver! */
165 add_status(dev, VIRTIO_CONFIG_S_DRIVER); 166 add_status(dev, VIRTIO_CONFIG_S_DRIVER);
@@ -183,18 +184,32 @@ static int virtio_dev_probe(struct device *_d)
183 184
184 dev->config->finalize_features(dev); 185 dev->config->finalize_features(dev);
185 186
187 if (virtio_has_feature(dev, VIRTIO_F_VERSION_1)) {
188 add_status(dev, VIRTIO_CONFIG_S_FEATURES_OK);
189 status = dev->config->get_status(dev);
190 if (!(status & VIRTIO_CONFIG_S_FEATURES_OK)) {
191 dev_err(_d, "virtio: device refuses features: %x\n",
192 status);
193 err = -ENODEV;
194 goto err;
195 }
196 }
197
186 err = drv->probe(dev); 198 err = drv->probe(dev);
187 if (err) 199 if (err)
188 add_status(dev, VIRTIO_CONFIG_S_FAILED); 200 goto err;
189 else {
190 add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK);
191 if (drv->scan)
192 drv->scan(dev);
193 201
194 virtio_config_enable(dev); 202 add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK);
195 } 203 if (drv->scan)
204 drv->scan(dev);
205
206 virtio_config_enable(dev);
196 207
208 return 0;
209err:
210 add_status(dev, VIRTIO_CONFIG_S_FAILED);
197 return err; 211 return err;
212
198} 213}
199 214
200static int virtio_dev_remove(struct device *_d) 215static int virtio_dev_remove(struct device *_d)