diff -uN M:\work\UniATA\etc\v45g\driver\atapi.h M:\work\UniATA\BusMaster\driver\atapi.h
--- M:\work\UniATA\etc\v45g\driver\atapi.h	Tue Aug 12 01:13:18 2014
+++ M:\work\UniATA\BusMaster\driver\atapi.h	Sun Feb 22 09:48:11 2015
@@ -437,6 +437,7 @@
 #define IDE_DRIVE_2                  0x10
 #define IDE_DRIVE_SELECT_1           (IDE_DRIVE_SELECT | IDE_DRIVE_1)
 #define IDE_DRIVE_SELECT_2           (IDE_DRIVE_SELECT | IDE_DRIVE_2)
+#define IDE_DRIVE_MASK               (IDE_DRIVE_SELECT_1 | IDE_DRIVE_SELECT_2)
 
 #define IDE_USE_LBA                  0x40
 
diff -uN M:\work\UniATA\etc\v45g\driver\id_ata.cpp M:\work\UniATA\BusMaster\driver\id_ata.cpp
--- M:\work\UniATA\etc\v45g\driver\id_ata.cpp	Thu Feb 19 11:28:54 2015
+++ M:\work\UniATA\BusMaster\driver\id_ata.cpp	Mon Feb 23 23:46:40 2015
@@ -498,6 +498,7 @@
         if (statusByte & IDE_STATUS_DRQ) {
             // Suck out any remaining bytes and throw away.
             AtapiReadPort2(chan, IDX_IO1_i_Data);
+            UniataNanoSleep(PIO0_TIMING);
         } else {
             break;
         }
@@ -512,13 +513,14 @@
 DDKFASTAPI
 AtapiSuckPortBuffer2(
     IN PHW_CHANNEL chan,
-    IN PVOID Buffer,
+    IN PUSHORT Buffer,
     IN ULONG Count
     )
 {
     UCHAR statusByte;
     ULONG i;
     USHORT data;
+    BOOLEAN retry = FALSE;
 
     // Assume, proper drive is already seleted
     WaitOnBusyLong(chan);
@@ -528,15 +530,25 @@
         if (statusByte & IDE_STATUS_DRQ) {
             // Suck out any remaining bytes and throw away.
             data = AtapiReadPort2(chan, IDX_IO1_i_Data);
-            (*((USHORT*)Buffer)) = data;
-            Count--; \
-            Buffer = ((USHORT*)Buffer)+1; \
-        } else {
+            (*Buffer) = data;
+            Count--;
+            Buffer++;
+            UniataNanoSleep(PIO0_TIMING);
+            retry = FALSE;
+        } else {
+            if(i<Count && !retry) {
+                KdPrint2((PRINT_PREFIX "  wait...\n"));
+                WaitForDrq(chan);
+                retry = TRUE;
+            }
             break;
         }
     }
     if(i) {
         KdPrint2((PRINT_PREFIX "AtapiSuckPortBuffer2: %#x words\n", i ));
+        if(i==Count) {
+            AtapiSuckPort2(chan);
+        }
     }
     return i;
 } // AtapiSuckPortBuffer2()
@@ -1644,7 +1656,7 @@
             // ATI/SII chipsets with memory-mapped IO hangs when
             // I call ReadBuffer(), probably due to PCI burst/prefetch enabled
             // Unfortunately, I don't know yet how to workaround it except
-            // spacifying manual delay in the way you see below.
+            // specifying manual delay in the way you see below.
             ReadBuffer(chan, (PUSHORT)&deviceExtension->FullIdentifyData, 256, PIO0_TIMING);
 
             // Work around for some IDE and one model Atapi that will present more than
@@ -5485,7 +5497,7 @@
                         interruptReason,
                         srb));
 
-            if(!wordCount && atapiDev && !g_opt_AtapiSendDisableIntr &&
+            if(!wordCount && atapiDev && 
                 !(statusByte & (IDE_STATUS_ERROR | IDE_STATUS_BUSY)) &&
                  (statusByte & IDE_STATUS_DRQ)) {
                 // this can be late Packet interrupt after packet sending
diff -uN M:\work\UniATA\etc\v45g\driver\id_init.cpp M:\work\UniATA\BusMaster\driver\id_init.cpp
--- M:\work\UniATA\etc\v45g\driver\id_init.cpp	Thu Oct 30 09:28:52 2014
+++ M:\work\UniATA\BusMaster\driver\id_init.cpp	Mon Feb 23 11:19:19 2015
@@ -2094,6 +2094,8 @@
             KdPrint2((PRINT_PREFIX "Intel SATA\n"));
             if(ChipFlags & UNIATA_AHCI) {
                 KdPrint2((PRINT_PREFIX "Do nothing for AHCI\n"));
+                /* enable PCI interrupt */
+                ChangePciConfig2(offsetof(PCI_COMMON_CONFIG, Command), (a & ~0x0400));
                 break;
             }
             if(c == CHAN_NOT_SPECIFIED) {
diff -uN M:\work\UniATA\etc\v45g\driver\id_probe.cpp M:\work\UniATA\BusMaster\driver\id_probe.cpp
--- M:\work\UniATA\etc\v45g\driver\id_probe.cpp	Thu Feb 19 18:09:30 2015
+++ M:\work\UniATA\BusMaster\driver\id_probe.cpp	Sun Feb 22 23:26:34 2015
@@ -1,6 +1,6 @@
 /*++
 
-Copyright (c) 2002-2012 Alexandr A. Telyatnikov (Alter)
+Copyright (c) 2002-2015 Alexandr A. Telyatnikov (Alter)
 
 Module Name:
     id_probe.cpp
@@ -53,6 +53,10 @@
 ULONG         MCACount = 0;
 
 BOOLEAN FirstMasterOk = FALSE;
+// This is our own resource check,
+// ReactOS allows to allocate same I/O range for both PCI and ISA controllers
+BOOLEAN AtdiskPrimaryClaimed = FALSE;
+BOOLEAN AtdiskSecondaryClaimed = FALSE;
 
 #ifndef UNIATA_CORE
 
@@ -1721,6 +1725,7 @@
             KdPrint2((PRINT_PREFIX "claim Compatible controller\n"));
             if (channel == 0) {
                 KdPrint2((PRINT_PREFIX "claim Primary\n"));
+                AtdiskPrimaryClaimed =
                 ConfigInfo->AtdiskPrimaryClaimed = TRUE;
                 chan->PrimaryAddress = TRUE;
 
@@ -1729,10 +1734,24 @@
             } else
             if (channel == 1) {
                 KdPrint2((PRINT_PREFIX "claim Secondary\n"));
+                AtdiskSecondaryClaimed =
                 ConfigInfo->AtdiskSecondaryClaimed = TRUE;
 
                 FirstMasterOk = TRUE;
             }
+        } else {
+            if(chan->RegTranslation[IDX_IO1].Addr == IO_WD1 &&
+               !chan->RegTranslation[IDX_IO1].MemIo) {
+                KdPrint2((PRINT_PREFIX "claim Primary (PCI over ISA range)\n"));
+                AtdiskPrimaryClaimed =
+                ConfigInfo->AtdiskPrimaryClaimed = TRUE;
+            }
+            if(chan->RegTranslation[IDX_IO1].Addr == IO_WD2 &&
+               !chan->RegTranslation[IDX_IO1].MemIo) {
+                KdPrint2((PRINT_PREFIX "claim Secondary (PCI over ISA range)\n"));
+                AtdiskSecondaryClaimed =
+                ConfigInfo->AtdiskSecondaryClaimed = TRUE;
+            }
         }
 
         AtapiDmaAlloc(HwDeviceExtension, ConfigInfo, c);
@@ -2250,12 +2269,12 @@
         }
         // check if Primary/Secondary Master IDE claimed
         if((ioSpace == (PUCHAR)IO_WD1) &&
-           (ConfigInfo->AtdiskPrimaryClaimed)) {
+           (ConfigInfo->AtdiskPrimaryClaimed || AtdiskPrimaryClaimed)) {
             KdPrint2((PRINT_PREFIX "AtapiFindController: AtdiskPrimaryClaimed\n"));
             goto not_found;
         } else
         if((ioSpace == (PUCHAR)IO_WD2) &&
-           (ConfigInfo->AtdiskSecondaryClaimed)) {
+           (ConfigInfo->AtdiskSecondaryClaimed || AtdiskSecondaryClaimed)) {
             KdPrint2((PRINT_PREFIX "AtapiFindController: AtdiskSecondaryClaimed\n"));
             goto not_found;
         }
@@ -2714,6 +2733,20 @@
 
     if(ResetDev) {
         LunExt->PowerState = 0;
+    }
+
+    if((deviceExtension->HwFlags & UNIATA_SATA) &&
+        !UniataIsSATARangeAvailable(deviceExtension, lChannel) &&
+        deviceNumber) {
+        KdPrint2((PRINT_PREFIX "  SATA w/o i/o registers, check slave presence\n"));
+        SelectDrive(chan, deviceNumber & 0x01);
+        statusByte = AtapiReadPort1(chan, IDX_ATAPI_IO1_i_DriveSelect);
+        KdPrint2((PRINT_PREFIX "  DriveSelect: %#x\n", statusByte));
+        if((statusByte & IDE_DRIVE_MASK) != IDE_DRIVE_SELECT_2) {
+            KdPrint2((PRINT_PREFIX "CheckDevice: (no dev)\n"));
+            UniataForgetDevice(LunExt);
+            return 0;
+        }
     }
 
     if(ResetDev && (deviceExtension->HwFlags & UNIATA_AHCI)) {
diff -uN M:\work\UniATA\etc\v45g\driver\id_sata.cpp M:\work\UniATA\BusMaster\driver\id_sata.cpp
--- M:\work\UniATA\etc\v45g\driver\id_sata.cpp	Thu Oct 30 09:09:06 2014
+++ M:\work\UniATA\BusMaster\driver\id_sata.cpp	Mon Feb 23 18:45:47 2015
@@ -728,12 +728,20 @@
     }
 
     /* re-enable AHCI mode */
+    /* Linux: Some controllers need AHCI_EN to be written multiple times.
+     * Try a few times before giving up.
+     */
     GHC = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_GHC);
-    if(!(GHC & AHCI_GHC_AE)) {
-        KdPrint2((PRINT_PREFIX "  re-enable AHCI mode, GHC %#x\n", GHC));
-        UniataAhciWriteHostPort4(deviceExtension, IDX_AHCI_GHC,
-            GHC | AHCI_GHC_AE);
-        GHC = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_GHC);
+    for(i=0; i<5; i++) {
+        if(!(GHC & AHCI_GHC_AE)) {
+            KdPrint2((PRINT_PREFIX "  re-enable AHCI mode, GHC %#x\n", GHC));
+            UniataAhciWriteHostPort4(deviceExtension, IDX_AHCI_GHC,
+                GHC | AHCI_GHC_AE);
+            AtapiStallExecution(1000);
+            GHC = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_GHC);
+        } else {
+            break;
+        }
     }
     KdPrint2((PRINT_PREFIX "  AHCI GHC %#x\n", GHC));
     if(!(GHC & AHCI_GHC_AE)) {
@@ -1980,6 +1988,7 @@
     CMD = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD);
     KdPrint2(("  CMD %#x\n", CMD));
     UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CMD, CMD | ATA_AHCI_P_CMD_FRE);
+    UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); /* flush */
 
     return;
 } // end UniataAhciStartFR()
@@ -2039,6 +2048,7 @@
         CMD |
         ATA_AHCI_P_CMD_ST |
         ((chan->ChannelCtrlFlags & CTRFLAGS_AHCI_PM) ? ATA_AHCI_P_CMD_PMA : 0));
+    UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); /* flush */
 
     return;
 } // end UniataAhciStart()
@@ -2187,15 +2197,24 @@
     if(CMD0 != CMD) {
         KdPrint2(("  send CMD %#x, entries %#x\n", CMD, AHCI_CL->prd_length));
         UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CMD, CMD);
+        UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); /* flush */
     }
 
     /* issue command to controller */
     //UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_ACT, 0x01 << tag);
+    KdPrint2(("  Set CI\n"));
     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 */
+
     if(!ATAPI_DEVICE(chan, DeviceNumber)) {
-        // TODO: check if we send ATA_RESET and wait for ready of so.
+        // TODO: check if we send ATAPI_RESET and wait for ready of so.
         if(AtaReq->ahci.ahci_cmd_ptr->cfis[2] == IDE_COMMAND_ATAPI_RESET) {
             ULONG  TFD;
             ULONG  i;
@@ -2365,6 +2384,7 @@
 	     (((chan->ChannelCtrlFlags & CTRFLAGS_AHCI_PM)) ? ATA_AHCI_P_CMD_ALPE : 0) |
 	     (((chan->ChannelCtrlFlags & CTRFLAGS_AHCI_PM2)) ? ATA_AHCI_P_CMD_ASP : 0 ))
 	     );
+    UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); /* flush */
 
 #ifdef DBG
     //UniataDumpAhciPortRegs(chan);
@@ -2399,6 +2419,7 @@
     UniataAhciStop(chan);
     UniataAhciStopFR(chan);
     UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CMD, 0);
+    UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); /* flush */
 
     /* Allow everything including partial and slumber modes. */
     UniataSataWritePort4(chan, IDX_SATA_SControl, 0, 0);
