[ros-diffs] [fireball] 45869: [UNIATA] - Really perform a controller hard-reset if it can't recover from a soft reset. Fixes VirtualBox one IDE controller configuration (master - IDE, slave - ATAPI). See issue #5145 for more details.

fireball at svn.reactos.org fireball at svn.reactos.org
Fri Mar 5 14:23:43 CET 2010


Author: fireball
Date: Fri Mar  5 14:23:43 2010
New Revision: 45869

URL: http://svn.reactos.org/svn/reactos?rev=45869&view=rev
Log:
[UNIATA]
- Really perform a controller hard-reset if it can't recover from a soft reset. Fixes VirtualBox one IDE controller configuration (master - IDE, slave - ATAPI).
See issue #5145 for more details.

Modified:
    trunk/reactos/drivers/storage/ide/uniata/id_probe.cpp

Modified: trunk/reactos/drivers/storage/ide/uniata/id_probe.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata/id_probe.cpp?rev=45869&r1=45868&r2=45869&view=diff
==============================================================================
--- trunk/reactos/drivers/storage/ide/uniata/id_probe.cpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/storage/ide/uniata/id_probe.cpp [iso-8859-1] Fri Mar  5 14:23:43 2010
@@ -2723,6 +2723,7 @@
                          signatureHigh;
     UCHAR                statusByte;
     ULONG                RetVal=0;
+    ULONG                waitCount = 10000;
 
     KdPrint2((PRINT_PREFIX "CheckDevice: Device %#x\n",
                deviceNumber));
@@ -2745,7 +2746,22 @@
             // Perform hard-reset.
             KdPrint2((PRINT_PREFIX
                         "CheckDevice: BUSY\n"));
+
+            AtapiWritePort1(chan, IDX_IO2_o_Control, IDE_DC_RESET_CONTROLLER );
+            AtapiStallExecution(500 * 1000);
+            AtapiWritePort1(chan, IDX_IO2_o_Control, IDE_DC_REENABLE_CONTROLLER);
+            SelectDrive(chan, deviceNumber & 0x01);
+
+            do {
+                // Wait for Busy to drop.
+                AtapiStallExecution(100);
+                GetStatus(chan, statusByte);
+
+            } while ((statusByte & IDE_STATUS_BUSY) && waitCount--);
+
             GetBaseStatus(chan, statusByte);
+            KdPrint2((PRINT_PREFIX
+                        "CheckDevice: status after hard reset %x\n", statusByte));
         }
 
         if((statusByte | IDE_STATUS_BUSY) == 0xff) {




More information about the Ros-diffs mailing list