Index: drivers/storage/ide/uniata/CMakeLists.txt =================================================================== --- drivers/storage/ide/uniata/CMakeLists.txt (revision 69242) +++ drivers/storage/ide/uniata/CMakeLists.txt (working copy) @@ -5,7 +5,7 @@ BEFORE ${CMAKE_CURRENT_SOURCE_DIR} inc) -#add_definitions(-D_DEBUG) +add_definitions(-D_DEBUG) list(APPEND SOURCE id_ata.cpp Index: drivers/storage/ide/uniata/id_ata.cpp =================================================================== --- drivers/storage/ide/uniata/id_ata.cpp (revision 69242) +++ drivers/storage/ide/uniata/id_ata.cpp (working copy) @@ -6281,6 +6281,15 @@ interruptReason, statusByte)); + if(g_opt_VirtualMachine == VM_QEMU) { + if(interruptReason == ATAPI_IR_IO_toDev && !(statusByte & IDE_STATUS_DRQ) && !DmaTransfer) { + statusByte = WaitForDrq(chan); + if(statusByte & IDE_STATUS_DRQ) { + goto continue_PIO; + } + } + } + if(OldReqState == REQ_STATE_DPC_WAIT_BUSY0 && AtaReq->WordsLeft == 0) { KdPrint2((PRINT_PREFIX "AtapiInterrupt: pending WAIT_BUSY0. Complete.\n")); @@ -10212,7 +10221,7 @@ return status; } #endif // USE_REACTOS_DDK - KdPrint(("UniATA Init: OS ver %x.%x (%d), %d CPU(s)\n", MajorVersion, MinorVersion, BuildNumber, *KeNumberProcessors)); + KdPrint(("UniATA Init: OS ver %x.%x (%d), %d CPU(s)\n", MajorVersion, MinorVersion, BuildNumber, KeNumberProcessors)); KeQuerySystemTime(&t0); do { Index: drivers/storage/ide/uniata/id_sata.cpp =================================================================== --- drivers/storage/ide/uniata/id_sata.cpp (revision 69242) +++ drivers/storage/ide/uniata/id_sata.cpp (working copy) @@ -2206,12 +2206,16 @@ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CI, 0x01 << tag); chan->AhciPrevCI |= 0x01 << tag; - KdPrint2((" Send CMD START\n")); - UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CMD, - CMD | - ATA_AHCI_P_CMD_ST | - ((chan->ChannelCtrlFlags & CTRFLAGS_AHCI_PM) ? ATA_AHCI_P_CMD_PMA : 0)); - UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); /* flush */ + CMD0 = CMD; + CMD |= ATA_AHCI_P_CMD_ST | + ((chan->ChannelCtrlFlags & CTRFLAGS_AHCI_PM) ? ATA_AHCI_P_CMD_PMA : 0); + if(CMD != CMD0) { + KdPrint2((" Send CMD START\n")); + UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CMD, CMD); + UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); /* flush */ + } else { + KdPrint2((" No CMD START, already active\n")); + } if(!ATAPI_DEVICE(chan, DeviceNumber)) { // TODO: check if we send ATAPI_RESET and wait for ready of so. Index: drivers/storage/ide/uniata/uniata_ver.h =================================================================== --- drivers/storage/ide/uniata/uniata_ver.h (revision 69242) +++ drivers/storage/ide/uniata/uniata_ver.h (working copy) @@ -1,10 +1,10 @@ -#define UNIATA_VER_STR "45h1" -#define UNIATA_VER_DOT 0.45.8.1 +#define UNIATA_VER_STR "45h3" +#define UNIATA_VER_DOT 0.45.8.3 #define UNIATA_VER_MJ 0 #define UNIATA_VER_MN 45 #define UNIATA_VER_SUB_MJ 8 -#define UNIATA_VER_SUB_MN 1 -#define UNIATA_VER_DOT_COMMA 0,45,8,1 -#define UNIATA_VER_DOT_STR "0.45.8.1" +#define UNIATA_VER_SUB_MN 3 +#define UNIATA_VER_DOT_COMMA 0,45,8,3 +#define UNIATA_VER_DOT_STR "0.45.8.3" #define UNIATA_VER_YEAR 2015 #define UNIATA_VER_YEAR_STR "2015"