diff --git a/headers/private/virtio/virtio.h b/headers/private/virtio/virtio.h index 68e36446e0..d53d1c2623 100644 --- a/headers/private/virtio/virtio.h +++ b/headers/private/virtio/virtio.h @@ -134,7 +134,7 @@ typedef struct { uint16 (*queue_size)(virtio_queue queue); - void* (*queue_dequeue)(virtio_queue queue, uint16* _size); + void* (*queue_dequeue)(virtio_queue queue, uint32* _usedLength); } virtio_device_interface; diff --git a/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp b/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp index e54e094d7c..753980e487 100644 --- a/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp +++ b/src/add-ons/kernel/bus_managers/virtio/VirtioModule.cpp @@ -185,10 +185,10 @@ virtio_queue_size(virtio_queue _queue) void* -virtio_queue_dequeue(virtio_queue _queue, uint16* _size) +virtio_queue_dequeue(virtio_queue _queue, uint32* _usedLength) { VirtioQueue *queue = (VirtioQueue *)_queue; - return queue->Dequeue(_size); + return queue->Dequeue(_usedLength); } diff --git a/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h b/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h index f658eda0d7..9b4da99a14 100644 --- a/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h +++ b/src/add-ons/kernel/bus_managers/virtio/VirtioPrivate.h @@ -131,7 +131,7 @@ public: void EnableInterrupt(); void DisableInterrupt(); - void* Dequeue(uint16* _size = NULL); + void* Dequeue(uint32* _usedLength = NULL); private: void UpdateAvailable(uint16 index); diff --git a/src/add-ons/kernel/bus_managers/virtio/VirtioQueue.cpp b/src/add-ons/kernel/bus_managers/virtio/VirtioQueue.cpp index 6d067c62a3..0220ab9385 100644 --- a/src/add-ons/kernel/bus_managers/virtio/VirtioQueue.cpp +++ b/src/add-ons/kernel/bus_managers/virtio/VirtioQueue.cpp @@ -246,7 +246,7 @@ VirtioQueue::Interrupt() void* -VirtioQueue::Dequeue(uint16 *_size) +VirtioQueue::Dequeue(uint32* _usedLength) { TRACE("Dequeue() fRingUsedIndex: %u\n", fRingUsedIndex); @@ -257,12 +257,11 @@ VirtioQueue::Dequeue(uint16 *_size) TRACE("Dequeue() usedIndex: %u\n", usedIndex); struct vring_used_elem *element = &fRing.used->ring[usedIndex]; uint16 descriptorIndex = element->id; - // uint32 length = element->len; + if (_usedLength != NULL) + *_usedLength = element->len; void* cookie = fDescriptors[descriptorIndex]->Cookie(); uint16 size = fDescriptors[descriptorIndex]->Size(); - if (_size != NULL) - *_size = size; if (size == 0) panic("VirtioQueue::Dequeue() size is zero\n"); fDescriptors[descriptorIndex]->Unset();