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/... ============================================================================== --- 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) {