Skip to content

Commit 9964491

Browse files
diseanbinarymaster
authored andcommitted
[ATAPI] Enable driver
Just a temporary and no proper solution
1 parent 60d775f commit 9964491

File tree

6 files changed

+219
-21
lines changed

6 files changed

+219
-21
lines changed

drivers/storage/ide/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
add_subdirectory(atapi)
33
add_subdirectory(pciide)
44
add_subdirectory(pciidex)
5-
add_subdirectory(uniata)
5+
# add_subdirectory(uniata)

drivers/storage/ide/atapi/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ target_link_libraries(atapi libcntpr)
44
set_module_type(atapi kernelmodedriver)
55
add_importlibs(atapi scsiport)
66
add_cd_file(TARGET atapi DESTINATION reactos/system32/drivers NO_CAB FOR all)
7+
add_registry_inf(atapi_reg.inf)

drivers/storage/ide/atapi/atapi.c

Lines changed: 143 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ Return Value:
484484
DebugPrint((1,
485485
"IssueIdentify: DRQ never asserted (%x). Error reg (%x)\n",
486486
statusByte,
487-
ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1)));
487+
ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR)));
488488

489489
AtapiSoftReset(baseIoAddress1,DeviceNumber);
490490

@@ -613,7 +613,7 @@ Return Value:
613613
// Suck out any remaining bytes and throw away.
614614
//
615615

616-
ScsiPortReadPortUshort(&baseIoAddress1->Data);
616+
ScsiPortReadPortUshort((PUSHORT)&baseIoAddress1->Data);
617617

618618
} else {
619619

@@ -701,7 +701,7 @@ Return Value:
701701
GetStatus(baseIoAddress2, statusByte);
702702

703703
if (statusByte & IDE_STATUS_ERROR) {
704-
errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1);
704+
errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR);
705705
DebugPrint((1,
706706
"SetDriveParameters: Error bit set. Status %x, error %x\n",
707707
errorByte,
@@ -937,7 +937,7 @@ Return Value:
937937
// Read the error register.
938938
//
939939

940-
errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1);
940+
errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR);
941941
DebugPrint((1,
942942
"MapError: Error register is %x\n",
943943
errorByte));
@@ -1247,7 +1247,7 @@ Return Value:
12471247
// Read the error register.
12481248
//
12491249

1250-
errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1);
1250+
errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR);
12511251

12521252
DebugPrint((1,
12531253
"AtapiHwInitialize: Error setting multiple mode. Status %x, error byte %x\n",
@@ -1361,7 +1361,7 @@ Return Value:
13611361
// Read the error register.
13621362
//
13631363

1364-
errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress + 1);
1364+
errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress + ATAPI_ERROR);
13651365

13661366
DebugPrint((1,
13671367
"AtapiHwInitialize: Error setting multiple mode. Status %x, error byte %x\n",
@@ -2134,6 +2134,126 @@ Return Value:
21342134
--*/
21352135

21362136
{
2137+
#if defined(SARCH_PC98)
2138+
PHW_DEVICE_EXTENSION deviceExtension = HwDeviceExtension;
2139+
PIDE_REGISTERS_1 BaseIoAddress1;
2140+
PIDE_REGISTERS_2 BaseIoAddress2;
2141+
UCHAR i, j;
2142+
UCHAR Status;
2143+
UCHAR SL, SH, SC, SN;
2144+
2145+
BaseIoAddress1 = ScsiPortGetDeviceBase(HwDeviceExtension,
2146+
ConfigInfo->AdapterInterfaceType,
2147+
ConfigInfo->SystemIoBusNumber,
2148+
ScsiPortConvertUlongToPhysicalAddress(0x640),
2149+
16,
2150+
TRUE);
2151+
2152+
BaseIoAddress2 = ScsiPortGetDeviceBase(HwDeviceExtension,
2153+
ConfigInfo->AdapterInterfaceType,
2154+
ConfigInfo->SystemIoBusNumber,
2155+
ScsiPortConvertUlongToPhysicalAddress(0x74C),
2156+
4,
2157+
TRUE);
2158+
2159+
deviceExtension->BaseIoAddress1[0] =
2160+
deviceExtension->BaseIoAddress1[1] = BaseIoAddress1;
2161+
deviceExtension->BaseIoAddress2[0] =
2162+
deviceExtension->BaseIoAddress2[1] = BaseIoAddress2;
2163+
2164+
// We expect initialization to be done by bootloader
2165+
// ScsiPortWritePortUchar((PUCHAR)0x432, 0x00);
2166+
2167+
for (i = 0; i < 2; i++)
2168+
{
2169+
DebugPrint((0, "AtapiFindController: Device %d\t", i));
2170+
2171+
ScsiPortWritePortUchar((PUCHAR)0x64C, (i == 0) ? 0xA0 : 0xB0);
2172+
ScsiPortStallExecution(5);
2173+
ScsiPortWritePortUchar((PUCHAR)0x648, 0x55);
2174+
ScsiPortWritePortUchar((PUCHAR)0x648, 0x55);
2175+
ScsiPortStallExecution(5);
2176+
if (ScsiPortReadPortUchar((PUCHAR)0x648) != 0x55)
2177+
continue;
2178+
2179+
deviceExtension->DeviceFlags[i] |= DFLAGS_DEVICE_PRESENT;
2180+
2181+
ScsiPortWritePortUchar((PUCHAR)0x74C, 0x04);
2182+
ScsiPortStallExecution(100000);
2183+
ScsiPortWritePortUchar((PUCHAR)0x74C, 0x00);
2184+
ScsiPortStallExecution(5);
2185+
for (j = 0; i < 30000; j++)
2186+
{
2187+
Status = ScsiPortReadPortUchar((PUCHAR)0x64E);
2188+
if (Status & IDE_STATUS_BUSY)
2189+
{
2190+
ScsiPortStallExecution(100);
2191+
}
2192+
else
2193+
{
2194+
break;
2195+
}
2196+
}
2197+
if (Status & IDE_STATUS_BUSY)
2198+
{
2199+
deviceExtension->DeviceFlags[i] &= ~DFLAGS_DEVICE_PRESENT;
2200+
continue;
2201+
}
2202+
2203+
ScsiPortWritePortUchar((PUCHAR)0x64C, (i == 0) ? 0xA0 : 0xB0);
2204+
ScsiPortStallExecution(1000);
2205+
if (ScsiPortReadPortUchar((PUCHAR)0x64E) & IDE_STATUS_BUSY)
2206+
{
2207+
deviceExtension->DeviceFlags[i] &= ~DFLAGS_DEVICE_PRESENT;
2208+
continue;
2209+
}
2210+
2211+
SC = ScsiPortReadPortUchar((PUCHAR)0x644);
2212+
SN = ScsiPortReadPortUchar((PUCHAR)0x646);
2213+
SL = ScsiPortReadPortUchar((PUCHAR)0x648);
2214+
SH = ScsiPortReadPortUchar((PUCHAR)0x64A);
2215+
if ((SC == 0x01) &&
2216+
(SN == 0x01) &&
2217+
(SL == 0x00) &&
2218+
(SH == 0x00))
2219+
{
2220+
DebugPrint((0, "IDE HDD\n"));
2221+
}
2222+
else if ((SL == 0x14) &&
2223+
(SH == 0xEB))
2224+
{
2225+
deviceExtension->DeviceFlags[i] |= DFLAGS_ATAPI_DEVICE;
2226+
DebugPrint((0, "ATAPI\n"));
2227+
IssueIdentify(HwDeviceExtension, i, 0, IDE_COMMAND_ATAPI_IDENTIFY);
2228+
}
2229+
else
2230+
{
2231+
deviceExtension->DeviceFlags[i] &= ~DFLAGS_DEVICE_PRESENT;
2232+
DebugPrint((0, "---- (%X %X %X %X)\n", SC, SN, SL, SH));
2233+
}
2234+
}
2235+
2236+
if (!(deviceExtension->DeviceFlags[0] & DFLAGS_DEVICE_PRESENT) &&
2237+
!(deviceExtension->DeviceFlags[1] & DFLAGS_DEVICE_PRESENT))
2238+
{
2239+
ScsiPortFreeDeviceBase(HwDeviceExtension, BaseIoAddress1);
2240+
ScsiPortFreeDeviceBase(HwDeviceExtension, BaseIoAddress2);
2241+
2242+
return SP_RETURN_NOT_FOUND;
2243+
}
2244+
2245+
ScsiPortWritePortUchar((PUCHAR)0x74C, 0x00);
2246+
2247+
ConfigInfo->NumberOfBuses = 1;
2248+
ConfigInfo->MaximumNumberOfTargets = 2;
2249+
ConfigInfo->BusInterruptLevel = 9;
2250+
ConfigInfo->InterruptMode = Latched;
2251+
ConfigInfo->AtdiskPrimaryClaimed = TRUE;
2252+
2253+
*Again = FALSE;
2254+
2255+
return SP_RETURN_FOUND;
2256+
#else
21372257
PHW_DEVICE_EXTENSION deviceExtension = HwDeviceExtension;
21382258
PULONG adapterCount = (PULONG)Context;
21392259
PUCHAR ioSpace = NULL;
@@ -2563,6 +2683,7 @@ Return Value:
25632683
*(adapterCount) = 0;
25642684

25652685
return(SP_RETURN_NOT_FOUND);
2686+
#endif
25662687

25672688
} // end AtapiFindController()
25682689

@@ -4252,7 +4373,7 @@ Return Value:
42524373
UCHAR error = 0;
42534374

42544375
if (status != SRB_STATUS_SUCCESS) {
4255-
error = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1);
4376+
error = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR);
42564377
}
42574378

42584379
//
@@ -4424,7 +4545,7 @@ Return Value:
44244545
deviceExtension->ExpectingInterrupt = TRUE;
44254546

44264547
ScsiPortWritePortUchar(&baseIoAddress1->DriveSelect,(UCHAR)(((targetId & 0x1) << 4) | 0xA0));
4427-
ScsiPortWritePortUchar((PUCHAR)baseIoAddress1 + 1,regs->bFeaturesReg);
4548+
ScsiPortWritePortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR,regs->bFeaturesReg);
44284549
ScsiPortWritePortUchar(&baseIoAddress1->BlockCount,regs->bSectorCountReg);
44294550
ScsiPortWritePortUchar(&baseIoAddress1->BlockNumber,regs->bSectorNumberReg);
44304551
ScsiPortWritePortUchar(&baseIoAddress1->CylinderLow,regs->bCylLowReg);
@@ -4474,7 +4595,7 @@ Return Value:
44744595
deviceExtension->ExpectingInterrupt = TRUE;
44754596

44764597
ScsiPortWritePortUchar(&baseIoAddress1->DriveSelect,(UCHAR)(((targetId & 0x1) << 4) | 0xA0));
4477-
ScsiPortWritePortUchar((PUCHAR)baseIoAddress1 + 1,regs->bFeaturesReg);
4598+
ScsiPortWritePortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR,regs->bFeaturesReg);
44784599
ScsiPortWritePortUchar(&baseIoAddress1->BlockCount,regs->bSectorCountReg);
44794600
ScsiPortWritePortUchar(&baseIoAddress1->BlockNumber,regs->bSectorNumberReg);
44804601
ScsiPortWritePortUchar(&baseIoAddress1->CylinderLow,regs->bCylLowReg);
@@ -5155,7 +5276,7 @@ Return Value:
51555276

51565277
if (statusByte & IDE_STATUS_DRQ) {
51575278

5158-
ScsiPortReadPortUshort(&baseIoAddress1->Data);
5279+
ScsiPortReadPortUshort((PUSHORT)&baseIoAddress1->Data);
51595280

51605281
} else {
51615282

@@ -5258,7 +5379,7 @@ Return Value:
52585379
ScsiPortWritePortUchar(&baseIoAddress1->ByteCountLow,byteCountLow);
52595380
ScsiPortWritePortUchar(&baseIoAddress1->ByteCountHigh, byteCountHigh);
52605381

5261-
ScsiPortWritePortUchar((PUCHAR)baseIoAddress1 + 1,0);
5382+
ScsiPortWritePortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR,0);
52625383

52635384

52645385
if (flags & DFLAGS_INT_DRQ) {
@@ -5490,7 +5611,7 @@ Return Value:
54905611
// error occured, handle it locally, clear interrupt
54915612
//
54925613

5493-
errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1);
5614+
errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR);
54945615

54955616
GetBaseStatus(baseIoAddress1, statusByte);
54965617
deviceExtension->ExpectingInterrupt = FALSE;
@@ -5535,7 +5656,7 @@ Return Value:
55355656
deviceExtension->ExpectingInterrupt = FALSE;
55365657
status = SRB_STATUS_SUCCESS;
55375658
} else {
5538-
errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1);
5659+
errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + ATAPI_ERROR);
55395660
if (errorByte == IDE_ERROR_DATA_ERROR){
55405661

55415662
//
@@ -5686,7 +5807,7 @@ HwDeviceExtension - ATAPI driver storage.
56865807
//
56875808
// enable
56885809
//
5689-
ScsiPortWritePortUchar((PUCHAR)baseIoAddress + 1,(UCHAR) (0x95));
5810+
ScsiPortWritePortUchar((PUCHAR)baseIoAddress + ATAPI_ERROR,(UCHAR) (0x95));
56905811
ScsiPortWritePortUchar(&baseIoAddress->Command,
56915812
IDE_COMMAND_ENABLE_MEDIA_STATUS);
56925813

@@ -5696,7 +5817,7 @@ HwDeviceExtension - ATAPI driver storage.
56965817
//
56975818
// Read the error register.
56985819
//
5699-
errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress + 1);
5820+
errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress + ATAPI_ERROR);
57005821

57015822
DebugPrint((1,
57025823
"IdeMediaStatus: Error enabling media status. Status %x, error byte %x\n",
@@ -5717,7 +5838,7 @@ HwDeviceExtension - ATAPI driver storage.
57175838
//
57185839
if ((deviceExtension->DeviceFlags[Channel] & DFLAGS_MEDIA_STATUS_ENABLED)) {
57195840

5720-
ScsiPortWritePortUchar((PUCHAR)baseIoAddress + 1,(UCHAR) (0x31));
5841+
ScsiPortWritePortUchar((PUCHAR)baseIoAddress + ATAPI_ERROR,(UCHAR) (0x31));
57215842
ScsiPortWritePortUchar(&baseIoAddress->Command,
57225843
IDE_COMMAND_ENABLE_MEDIA_STATUS);
57235844

@@ -6198,7 +6319,9 @@ Return Value:
61986319
{
61996320
HW_INITIALIZATION_DATA hwInitializationData;
62006321
ULONG adapterCount;
6322+
#if !defined(SARCH_PC98)
62016323
ULONG i;
6324+
#endif
62026325
ULONG statusToReturn, newStatus;
62036326

62046327
DebugPrint((1,"\n\nATAPI IDE MiniPort Driver\n"));
@@ -6243,6 +6366,7 @@ Return Value:
62436366
//
62446367
// Native Mode Devices
62456368
//
6369+
#if !defined(SARCH_PC98)
62466370
for (i=0; i <NUM_NATIVE_MODE_ADAPTERS; i++) {
62476371
hwInitializationData.HwFindAdapter = AtapiFindNativeModeController;
62486372
hwInitializationData.NumberOfAccessRanges = 4;
@@ -6260,6 +6384,7 @@ Return Value:
62606384
if (newStatus < statusToReturn)
62616385
statusToReturn = newStatus;
62626386
}
6387+
#endif
62636388

62646389
hwInitializationData.VendorId = 0;
62656390
hwInitializationData.VendorIdLength = 0;
@@ -6273,6 +6398,7 @@ Return Value:
62736398

62746399
adapterCount = 0;
62756400

6401+
#if !defined(SARCH_PC98)
62766402
hwInitializationData.HwFindAdapter = AtapiFindPCIController;
62776403
hwInitializationData.NumberOfAccessRanges = 4;
62786404
hwInitializationData.AdapterInterfaceType = Isa;
@@ -6283,6 +6409,7 @@ Return Value:
62836409
&adapterCount);
62846410
if (newStatus < statusToReturn)
62856411
statusToReturn = newStatus;
6412+
#endif
62866413

62876414
//
62886415
// Indicate 2 access ranges and reset FindAdapter.

0 commit comments

Comments
 (0)