Index: drivers/storage/ide/uniata/id_ata.cpp =================================================================== --- drivers/storage/ide/uniata/id_ata.cpp (revision 69239) +++ 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")); Index: drivers/storage/ide/uniata/id_sata.cpp =================================================================== --- drivers/storage/ide/uniata/id_sata.cpp (revision 69239) +++ 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 69239) +++ 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"