From d8e1fd6eda930f5b4c8ba531a5c84ca0cd54d318 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Wed, 18 Mar 2020 10:05:50 +0100 Subject: [PATCH] virtio: add clear_feature hook. Change-Id: I282ffc65a7bd692145626ab4272c5df4a792e9d4 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2383 Reviewed-by: Adrien Destugues Reviewed-by: waddlesplash --- headers/private/virtio/virtio.h | 2 ++ .../kernel/bus_managers/virtio/VirtioDevice.cpp | 8 ++++++++ .../kernel/bus_managers/virtio/VirtioModule.cpp | 11 +++++++++++ .../kernel/bus_managers/virtio/VirtioPrivate.h | 1 + 4 files changed, 22 insertions(+) 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);