diff --git a/headers/private/virtio/virtio.h b/headers/private/virtio/virtio.h index cb0c1760e6..2e17f725c1 100644 --- a/headers/private/virtio/virtio.h +++ b/headers/private/virtio/virtio.h @@ -101,6 +101,8 @@ typedef struct { status_t (*negotiate_features)(virtio_device cookie, uint32 supported, uint32* negotiated, const char* (*get_feature_name)(uint32)); + status_t (*clear_feature)(virtio_device cookie, uint32 feature); + status_t (*read_device_config)(virtio_device cookie, uint8 offset, void* buffer, size_t bufferSize); status_t (*write_device_config)(virtio_device cookie, uint8 offset, diff --git a/src/add-ons/kernel/bus_managers/virtio/VirtioDevice.cpp b/src/add-ons/kernel/bus_managers/virtio/VirtioDevice.cpp index 012f192598..2ef33a7fad 100644 --- a/src/add-ons/kernel/bus_managers/virtio/VirtioDevice.cpp +++ b/src/add-ons/kernel/bus_managers/virtio/VirtioDevice.cpp @@ -126,6 +126,14 @@ VirtioDevice::NegotiateFeatures(uint32 supported, uint32* negotiated, } +status_t +VirtioDevice::ClearFeature(uint32 feature) +{ + fFeatures &= ~feature; + return fController->write_guest_features(fCookie, fFeatures); +} + + status_t VirtioDevice::ReadDeviceConfig(uint8 offset, void* buffer, size_t bufferSize) { diff --git a/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp b/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp index 4ad32a019d..3bfecb7fb3 100644 --- a/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp +++ b/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp @@ -63,6 +63,16 @@ virtio_negotiate_features(void* _device, uint32 supported, } +status_t +virtio_clear_feature(void* _device, uint32 feature) +{ + CALLED(); + VirtioDevice *device = (VirtioDevice *)_device; + + return device->ClearFeature(feature); +} + + status_t virtio_read_device_config(void* _device, uint8 offset, void* buffer, size_t bufferSize) @@ -275,6 +285,7 @@ virtio_device_interface virtio_device_module = { }, virtio_negotiate_features, + virtio_clear_feature, virtio_read_device_config, virtio_write_device_config, virtio_alloc_queues, diff --git a/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h b/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h index 5a1b7dbc3a..e91244d012 100644 --- a/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h +++ b/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h @@ -48,6 +48,7 @@ public: status_t NegotiateFeatures(uint32 supported, uint32* negotiated, const char* (*get_feature_name)(uint32)); + status_t ClearFeature(uint32 feature); status_t ReadDeviceConfig(uint8 offset, void* buffer, size_t bufferSize);