From a89deaa805d31c6909004089b546bc3520b5fd62 Mon Sep 17 00:00:00 2001 From: Dmitry Borisov Date: Fri, 6 Nov 2020 22:14:29 +0600 Subject: [PATCH] [ATAPI] Enable driver Just a temporary and no proper solution --- drivers/storage/ide/CMakeLists.txt | 2 +- drivers/storage/ide/atapi/CMakeLists.txt | 1 + drivers/storage/ide/atapi/atapi.c | 159 ++++++++++++++++++++--- drivers/storage/ide/atapi/atapi.h | 68 +++++++++- drivers/storage/ide/atapi/atapi_reg.inf | 8 ++ drivers/storage/ide/uniata/id_ata.cpp | 2 +- 6 files changed, 219 insertions(+), 21 deletions(-) create mode 100644 drivers/storage/ide/atapi/atapi_reg.inf diff --git a/drivers/storage/ide/CMakeLists.txt b/drivers/storage/ide/CMakeLists.txt index f49c4ce8bf3f3..491c9a040f851 100644 --- a/drivers/storage/ide/CMakeLists.txt +++ b/drivers/storage/ide/CMakeLists.txt @@ -2,4 +2,4 @@ add_subdirectory(atapi) add_subdirectory(pciide) add_subdirectory(pciidex) -add_subdirectory(uniata) +# add_subdirectory(uniata) diff --git a/drivers/storage/ide/atapi/CMakeLists.txt b/drivers/storage/ide/atapi/CMakeLists.txt index 5ab339c52999c..58cc433de83d3 100644 --- a/drivers/storage/ide/atapi/CMakeLists.txt +++ b/drivers/storage/ide/atapi/CMakeLists.txt @@ -4,3 +4,4 @@ target_link_libraries(atapi libcntpr) set_module_type(atapi kernelmodedriver) add_importlibs(atapi scsiport) add_cd_file(TARGET atapi DESTINATION reactos/system32/drivers NO_CAB FOR all) +add_registry_inf(atapi_reg.inf) diff --git a/drivers/storage/ide/atapi/atapi.c b/drivers/storage/ide/atapi/atapi.c index 19b8a0ee44793..0ab7a26770b75 100644 --- a/drivers/storage/ide/atapi/atapi.c +++ b/drivers/storage/ide/atapi/atapi.c @@ -484,7 +484,7 @@ Return Value: DebugPrint((1, "IssueIdentify: DRQ never asserted (%x). Error reg (%x)\n", statusByte, - ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1))); + ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR))); AtapiSoftReset(baseIoAddress1,DeviceNumber); @@ -613,7 +613,7 @@ Return Value: // Suck out any remaining bytes and throw away. // - ScsiPortReadPortUshort(&baseIoAddress1->Data); + ScsiPortReadPortUshort((PUSHORT)&baseIoAddress1->Data); } else { @@ -701,7 +701,7 @@ Return Value: GetStatus(baseIoAddress2, statusByte); if (statusByte & IDE_STATUS_ERROR) { - errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1); + errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR); DebugPrint((1, "SetDriveParameters: Error bit set. Status %x, error %x\n", errorByte, @@ -937,7 +937,7 @@ Return Value: // Read the error register. // - errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1); + errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR); DebugPrint((1, "MapError: Error register is %x\n", errorByte)); @@ -1247,7 +1247,7 @@ Return Value: // Read the error register. // - errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1); + errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR); DebugPrint((1, "AtapiHwInitialize: Error setting multiple mode. Status %x, error byte %x\n", @@ -1361,7 +1361,7 @@ Return Value: // Read the error register. // - errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress + 1); + errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress + ATAPI_ERROR); DebugPrint((1, "AtapiHwInitialize: Error setting multiple mode. Status %x, error byte %x\n", @@ -2134,6 +2134,126 @@ Return Value: --*/ { +#if defined(SARCH_PC98) + PHW_DEVICE_EXTENSION deviceExtension = HwDeviceExtension; + PIDE_REGISTERS_1 BaseIoAddress1; + PIDE_REGISTERS_2 BaseIoAddress2; + UCHAR i, j; + UCHAR Status; + UCHAR SL, SH, SC, SN; + + BaseIoAddress1 = ScsiPortGetDeviceBase(HwDeviceExtension, + ConfigInfo->AdapterInterfaceType, + ConfigInfo->SystemIoBusNumber, + ScsiPortConvertUlongToPhysicalAddress(0x640), + 16, + TRUE); + + BaseIoAddress2 = ScsiPortGetDeviceBase(HwDeviceExtension, + ConfigInfo->AdapterInterfaceType, + ConfigInfo->SystemIoBusNumber, + ScsiPortConvertUlongToPhysicalAddress(0x74C), + 4, + TRUE); + + deviceExtension->BaseIoAddress1[0] = + deviceExtension->BaseIoAddress1[1] = BaseIoAddress1; + deviceExtension->BaseIoAddress2[0] = + deviceExtension->BaseIoAddress2[1] = BaseIoAddress2; + + // We expect initialization to be done by bootloader + // ScsiPortWritePortUchar((PUCHAR)0x432, 0x00); + + for (i = 0; i < 2; i++) + { + DebugPrint((0, "AtapiFindController: Device %d\t", i)); + + ScsiPortWritePortUchar((PUCHAR)0x64C, (i == 0) ? 0xA0 : 0xB0); + ScsiPortStallExecution(5); + ScsiPortWritePortUchar((PUCHAR)0x648, 0x55); + ScsiPortWritePortUchar((PUCHAR)0x648, 0x55); + ScsiPortStallExecution(5); + if (ScsiPortReadPortUchar((PUCHAR)0x648) != 0x55) + continue; + + deviceExtension->DeviceFlags[i] |= DFLAGS_DEVICE_PRESENT; + + ScsiPortWritePortUchar((PUCHAR)0x74C, 0x04); + ScsiPortStallExecution(100000); + ScsiPortWritePortUchar((PUCHAR)0x74C, 0x00); + ScsiPortStallExecution(5); + for (j = 0; i < 30000; j++) + { + Status = ScsiPortReadPortUchar((PUCHAR)0x64E); + if (Status & IDE_STATUS_BUSY) + { + ScsiPortStallExecution(100); + } + else + { + break; + } + } + if (Status & IDE_STATUS_BUSY) + { + deviceExtension->DeviceFlags[i] &= ~DFLAGS_DEVICE_PRESENT; + continue; + } + + ScsiPortWritePortUchar((PUCHAR)0x64C, (i == 0) ? 0xA0 : 0xB0); + ScsiPortStallExecution(1000); + if (ScsiPortReadPortUchar((PUCHAR)0x64E) & IDE_STATUS_BUSY) + { + deviceExtension->DeviceFlags[i] &= ~DFLAGS_DEVICE_PRESENT; + continue; + } + + SC = ScsiPortReadPortUchar((PUCHAR)0x644); + SN = ScsiPortReadPortUchar((PUCHAR)0x646); + SL = ScsiPortReadPortUchar((PUCHAR)0x648); + SH = ScsiPortReadPortUchar((PUCHAR)0x64A); + if ((SC == 0x01) && + (SN == 0x01) && + (SL == 0x00) && + (SH == 0x00)) + { + DebugPrint((0, "IDE HDD\n")); + } + else if ((SL == 0x14) && + (SH == 0xEB)) + { + deviceExtension->DeviceFlags[i] |= DFLAGS_ATAPI_DEVICE; + DebugPrint((0, "ATAPI\n")); + IssueIdentify(HwDeviceExtension, i, 0, IDE_COMMAND_ATAPI_IDENTIFY); + } + else + { + deviceExtension->DeviceFlags[i] &= ~DFLAGS_DEVICE_PRESENT; + DebugPrint((0, "---- (%X %X %X %X)\n", SC, SN, SL, SH)); + } + } + + if (!(deviceExtension->DeviceFlags[0] & DFLAGS_DEVICE_PRESENT) && + !(deviceExtension->DeviceFlags[1] & DFLAGS_DEVICE_PRESENT)) + { + ScsiPortFreeDeviceBase(HwDeviceExtension, BaseIoAddress1); + ScsiPortFreeDeviceBase(HwDeviceExtension, BaseIoAddress2); + + return SP_RETURN_NOT_FOUND; + } + + ScsiPortWritePortUchar((PUCHAR)0x74C, 0x00); + + ConfigInfo->NumberOfBuses = 1; + ConfigInfo->MaximumNumberOfTargets = 2; + ConfigInfo->BusInterruptLevel = 9; + ConfigInfo->InterruptMode = Latched; + ConfigInfo->AtdiskPrimaryClaimed = TRUE; + + *Again = FALSE; + + return SP_RETURN_FOUND; +#else PHW_DEVICE_EXTENSION deviceExtension = HwDeviceExtension; PULONG adapterCount = (PULONG)Context; PUCHAR ioSpace = NULL; @@ -2563,6 +2683,7 @@ Return Value: *(adapterCount) = 0; return(SP_RETURN_NOT_FOUND); +#endif } // end AtapiFindController() @@ -4252,7 +4373,7 @@ Return Value: UCHAR error = 0; if (status != SRB_STATUS_SUCCESS) { - error = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1); + error = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR); } // @@ -4424,7 +4545,7 @@ Return Value: deviceExtension->ExpectingInterrupt = TRUE; ScsiPortWritePortUchar(&baseIoAddress1->DriveSelect,(UCHAR)(((targetId & 0x1) << 4) | 0xA0)); - ScsiPortWritePortUchar((PUCHAR)baseIoAddress1 + 1,regs->bFeaturesReg); + ScsiPortWritePortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR,regs->bFeaturesReg); ScsiPortWritePortUchar(&baseIoAddress1->BlockCount,regs->bSectorCountReg); ScsiPortWritePortUchar(&baseIoAddress1->BlockNumber,regs->bSectorNumberReg); ScsiPortWritePortUchar(&baseIoAddress1->CylinderLow,regs->bCylLowReg); @@ -4474,7 +4595,7 @@ Return Value: deviceExtension->ExpectingInterrupt = TRUE; ScsiPortWritePortUchar(&baseIoAddress1->DriveSelect,(UCHAR)(((targetId & 0x1) << 4) | 0xA0)); - ScsiPortWritePortUchar((PUCHAR)baseIoAddress1 + 1,regs->bFeaturesReg); + ScsiPortWritePortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR,regs->bFeaturesReg); ScsiPortWritePortUchar(&baseIoAddress1->BlockCount,regs->bSectorCountReg); ScsiPortWritePortUchar(&baseIoAddress1->BlockNumber,regs->bSectorNumberReg); ScsiPortWritePortUchar(&baseIoAddress1->CylinderLow,regs->bCylLowReg); @@ -5155,7 +5276,7 @@ Return Value: if (statusByte & IDE_STATUS_DRQ) { - ScsiPortReadPortUshort(&baseIoAddress1->Data); + ScsiPortReadPortUshort((PUSHORT)&baseIoAddress1->Data); } else { @@ -5258,7 +5379,7 @@ Return Value: ScsiPortWritePortUchar(&baseIoAddress1->ByteCountLow,byteCountLow); ScsiPortWritePortUchar(&baseIoAddress1->ByteCountHigh, byteCountHigh); - ScsiPortWritePortUchar((PUCHAR)baseIoAddress1 + 1,0); + ScsiPortWritePortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR,0); if (flags & DFLAGS_INT_DRQ) { @@ -5490,7 +5611,7 @@ Return Value: // error occured, handle it locally, clear interrupt // - errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1); + errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR); GetBaseStatus(baseIoAddress1, statusByte); deviceExtension->ExpectingInterrupt = FALSE; @@ -5535,7 +5656,7 @@ Return Value: deviceExtension->ExpectingInterrupt = FALSE; status = SRB_STATUS_SUCCESS; } else { - errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1); + errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR); if (errorByte == IDE_ERROR_DATA_ERROR){ // @@ -5686,7 +5807,7 @@ HwDeviceExtension - ATAPI driver storage. // // enable // - ScsiPortWritePortUchar((PUCHAR)baseIoAddress + 1,(UCHAR) (0x95)); + ScsiPortWritePortUchar((PUCHAR)baseIoAddress + ATAPI_ERROR,(UCHAR) (0x95)); ScsiPortWritePortUchar(&baseIoAddress->Command, IDE_COMMAND_ENABLE_MEDIA_STATUS); @@ -5696,7 +5817,7 @@ HwDeviceExtension - ATAPI driver storage. // // Read the error register. // - errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress + 1); + errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress + ATAPI_ERROR); DebugPrint((1, "IdeMediaStatus: Error enabling media status. Status %x, error byte %x\n", @@ -5717,7 +5838,7 @@ HwDeviceExtension - ATAPI driver storage. // if ((deviceExtension->DeviceFlags[Channel] & DFLAGS_MEDIA_STATUS_ENABLED)) { - ScsiPortWritePortUchar((PUCHAR)baseIoAddress + 1,(UCHAR) (0x31)); + ScsiPortWritePortUchar((PUCHAR)baseIoAddress + ATAPI_ERROR,(UCHAR) (0x31)); ScsiPortWritePortUchar(&baseIoAddress->Command, IDE_COMMAND_ENABLE_MEDIA_STATUS); @@ -6198,7 +6319,9 @@ Return Value: { HW_INITIALIZATION_DATA hwInitializationData; ULONG adapterCount; +#if !defined(SARCH_PC98) ULONG i; +#endif ULONG statusToReturn, newStatus; DebugPrint((1,"\n\nATAPI IDE MiniPort Driver\n")); @@ -6243,6 +6366,7 @@ Return Value: // // Native Mode Devices // +#if !defined(SARCH_PC98) for (i=0; i Data, \ + ScsiPortReadPortBufferUshort((PUSHORT)&BaseIoAddress->Data, \ Buffer, \ Count); #define WriteBuffer(BaseIoAddress, Buffer, Count) \ - ScsiPortWritePortBufferUshort(&BaseIoAddress->Data, \ + ScsiPortWritePortBufferUshort((PUSHORT)&BaseIoAddress->Data, \ Buffer, \ Count); @@ -425,7 +483,11 @@ NATIVE_MODE_CONTROLLER_INFORMATION const NativeModeAdapters[] = { while ((ScsiPortReadPortUchar(&BaseIoAddress->Command) & IDE_STATUS_BUSY) && i--)\ ScsiPortStallExecution(30);\ ScsiPortWritePortUchar(&BaseIoAddress->DriveSelect,(UCHAR)((DeviceNumber << 4) | 0xA0)); \ - WaitOnBusy( ((PIDE_REGISTERS_2)((PUCHAR)BaseIoAddress + 0x206)), statusByte); \ +/* if defined(SARCH_PC98) */ \ + WaitOnBusy( ((PIDE_REGISTERS_2)((PUCHAR)BaseIoAddress + 0x10C)), statusByte); \ +/* else */ \ + /* WaitOnBusy( ((PIDE_REGISTERS_2)((PUCHAR)BaseIoAddress + 0x206)), statusByte); */ \ +/* endif */ \ ScsiPortStallExecution(500);\ } diff --git a/drivers/storage/ide/atapi/atapi_reg.inf b/drivers/storage/ide/atapi/atapi_reg.inf new file mode 100644 index 0000000000000..cee014aa9c650 --- /dev/null +++ b/drivers/storage/ide/atapi/atapi_reg.inf @@ -0,0 +1,8 @@ + +[AddReg] +HKLM,"SYSTEM\CurrentControlSet\Services\atapi","ErrorControl",0x00010001,0x00000000 +HKLM,"SYSTEM\CurrentControlSet\Services\atapi","Group",0x00000000,"SCSI Miniport" +HKLM,"SYSTEM\CurrentControlSet\Services\atapi","ImagePath",0x00020000,"system32\drivers\atapi.sys" +HKLM,"SYSTEM\CurrentControlSet\Services\atapi","Start",0x00010001,0x00000000 +HKLM,"SYSTEM\CurrentControlSet\Services\atapi","Type",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\atapi","Tag",0x00010001,0x00000010 diff --git a/drivers/storage/ide/uniata/id_ata.cpp b/drivers/storage/ide/uniata/id_ata.cpp index 6957956b88e9a..a53a527208202 100644 --- a/drivers/storage/ide/uniata/id_ata.cpp +++ b/drivers/storage/ide/uniata/id_ata.cpp @@ -10707,7 +10707,7 @@ DriverEntry( //a = (WCHAR)strlen(ver_string); statusToReturn = 0xffffffff; - +return -1; // Zero out structure. RtlZeroMemory(((PCHAR)&hwInitializationData), sizeof(hwInitializationData));