diff --git a/src/add-ons/kernel/busses/virtio/virtio_mmio/VirtioDevice.cpp b/src/add-ons/kernel/busses/virtio/virtio_mmio/VirtioDevice.cpp index 4e1c4bdd5c..7467279139 100644 --- a/src/add-ons/kernel/busses/virtio/virtio_mmio/VirtioDevice.cpp +++ b/src/add-ons/kernel/busses/virtio/virtio_mmio/VirtioDevice.cpp @@ -91,9 +91,11 @@ VirtioQueue::Init() phys_addr_t availPhys = (addr_t)fAvail - (addr_t)queueMem + pe.address; phys_addr_t usedPhys = (addr_t)fUsed - (addr_t)queueMem + pe.address; - SetLowHi(fDev->fRegs->queueDescLow, fDev->fRegs->queueDescHi, descsPhys); - SetLowHi(fDev->fRegs->queueAvailLow, fDev->fRegs->queueAvailHi, availPhys); - SetLowHi(fDev->fRegs->queueUsedLow, fDev->fRegs->queueUsedHi, usedPhys); + if (fDev->fRegs->version != 1) { + SetLowHi(fDev->fRegs->queueDescLow, fDev->fRegs->queueDescHi, descsPhys); + SetLowHi(fDev->fRegs->queueAvailLow, fDev->fRegs->queueAvailHi, availPhys); + SetLowHi(fDev->fRegs->queueUsedLow, fDev->fRegs->queueUsedHi, usedPhys); + } fFreeDescs.SetTo(new(std::nothrow) uint32[(fQueueLen + 31) / 32]); if (!fFreeDescs.IsSet()) @@ -104,7 +106,13 @@ VirtioQueue::Init() if (!fCookies.IsSet()) return B_NO_MEMORY; - fDev->fRegs->queueReady = 1; + if (fDev->fRegs->version == 1) { + uint32_t pfn = descsPhys / B_PAGE_SIZE; + fDev->fRegs->queueAlign = B_PAGE_SIZE; + fDev->fRegs->queuePfn = pfn; + } else { + fDev->fRegs->queueReady = 1; + } return B_OK; }