- pciidex: Fix Hardware IDs returned for channel PDOs - pciidex: Better test to see if the PCI controller is in compatible or native mode before getting channel resources - pciidex: Change IDE_DRIVE_IDENTIFY structure to IDENTIFY_DATA structure - pciide: Implement PciIdeUseDma - pciide: Tell that channel state is unknown instead of enabled Modified: trunk/reactos/drivers/storage/pciide/pciide.c Modified: trunk/reactos/drivers/storage/pciidex/fdo.c Modified: trunk/reactos/drivers/storage/pciidex/miniport.c Modified: trunk/reactos/drivers/storage/pciidex/pciidex.h Modified: trunk/reactos/drivers/storage/pciidex/pdo.c Modified: trunk/reactos/w32api/include/ddk/ide.h _____
Modified: trunk/reactos/drivers/storage/pciide/pciide.c --- trunk/reactos/drivers/storage/pciide/pciide.c 2005-11-09 05:14:12 UTC (rev 19091) +++ trunk/reactos/drivers/storage/pciide/pciide.c 2005-11-09 11:10:24 UTC (rev 19092) @@ -44,10 +44,7 @@
return ChannelDisabled; }
- /* FIXME: I don't know where to find the enabled/disabled - * bits for channels, so assume they are always enabled - */ - return ChannelEnabled; + return ChannelStateUnknown; }
BOOLEAN NTAPI @@ -74,15 +71,16 @@ return STATUS_SUCCESS; }
-BOOLEAN NTAPI +ULONG NTAPI PciIdeUseDma( IN PVOID DeviceExtension, IN PUCHAR CdbCommand, IN PUCHAR Slave) { - DPRINT1("PciIdeUseDma(%p %p %p)\n", DeviceExtension, CdbCommand, Slave); + DPRINT("PciIdeUseDma(%p %p %p)\n", DeviceExtension, CdbCommand, Slave);
- return FALSE; + /* Nothing should prevent us to use DMA */ + return 1; }
NTSTATUS NTAPI @@ -99,7 +97,7 @@ ControllerProperties->IgnoreActiveBitForAtaDevice = FALSE; ControllerProperties->AlwaysClearBusMasterInterrupt = TRUE; ControllerProperties->PciIdeUseDma = PciIdeUseDma; - ControllerProperties->AlignmentRequirement = 1; /* FIXME */ + ControllerProperties->AlignmentRequirement = 1; ControllerProperties->DefaultPIO = 0; /* FIXME */ ControllerProperties->PciIdeUdmaModesSupported = NULL; /* optional */ _____
Modified: trunk/reactos/drivers/storage/pciidex/fdo.c --- trunk/reactos/drivers/storage/pciidex/fdo.c 2005-11-09 05:14:12 UTC (rev 19091) +++ trunk/reactos/drivers/storage/pciidex/fdo.c 2005-11-09 11:10:24 UTC (rev 19092) @@ -82,7 +82,6 @@
return Status; }
-/* static NTSTATUS ReleaseBusInterface( IN PFDO_DEVICE_EXTENSION DeviceExtension) @@ -99,7 +98,6 @@
return Status; } -*/
NTSTATUS NTAPI PciIdeXAddDevice( @@ -109,6 +107,8 @@ PPCIIDEX_DRIVER_EXTENSION DriverExtension; PFDO_DEVICE_EXTENSION DeviceExtension; PDEVICE_OBJECT Fdo; + ULONG BytesRead; + PCI_COMMON_CONFIG PciConfig; NTSTATUS Status;
DPRINT("PciIdeXAddDevice(%p %p)\n", DriverObject, Pdo); @@ -145,10 +145,28 @@ Status = GetBusInterface(DeviceExtension); if (!NT_SUCCESS(Status)) { - DPRINT("GetBusInterface() failed() failed with status 0x%08lx\n", Status); + DPRINT("GetBusInterface() failed with status 0x%08lx\n", Status); + IoDetachDevice(DeviceExtension->LowerDevice); return Status; }
+ BytesRead = (*DeviceExtension->BusInterface->GetBusData)( + DeviceExtension->BusInterface->Context, + PCI_WHICHSPACE_CONFIG, + &PciConfig, + 0, + PCI_COMMON_HDR_LENGTH); + if (BytesRead != PCI_COMMON_HDR_LENGTH) + { + DPRINT("BusInterface->GetBusData() failed()\n"); + ReleaseBusInterface(DeviceExtension); + IoDetachDevice(DeviceExtension->LowerDevice); + return STATUS_IO_DEVICE_ERROR; + } + + DeviceExtension->VendorId = PciConfig.VendorID; + DeviceExtension->DeviceId = PciConfig.DeviceID; + Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS; @@ -156,7 +174,7 @@
static NTSTATUS NTAPI PciIdeXUdmaModesSupported( - IN IDE_DRIVE_IDENTIFY IdentifyData, + IN IDENTIFY_DATA IdentifyData, OUT PULONG BestXferMode, OUT PULONG CurrentXferMode) { @@ -317,7 +335,7 @@ } ChannelState = DeviceExtension->Properties.PciIdeChannelEnabled( DeviceExtension->MiniControllerExtension, i); - if (ChannelState != ChannelEnabled) + if (ChannelState == ChannelDisabled) { DPRINT("Channel %lu is disabled\n", i); continue; _____
Modified: trunk/reactos/drivers/storage/pciidex/miniport.c --- trunk/reactos/drivers/storage/pciidex/miniport.c 2005-11-09 05:14:12 UTC (rev 19091) +++ trunk/reactos/drivers/storage/pciidex/miniport.c 2005-11-09 11:10:24 UTC (rev 19092) @@ -67,7 +67,7 @@
{ PFDO_DEVICE_EXTENSION FdoDeviceExtension; ULONG BytesRead = 0; - NTSTATUS Status = STATUS_UNSUCCESSFUL; + NTSTATUS Status = STATUS_IO_DEVICE_ERROR;
DPRINT("PciIdeXGetBusData(%p %p 0x%lx 0x%lx)\n", DeviceExtension, Buffer, ConfigDataOffset, BufferLength); _____
Modified: trunk/reactos/drivers/storage/pciidex/pciidex.h --- trunk/reactos/drivers/storage/pciidex/pciidex.h 2005-11-09 05:14:12 UTC (rev 19091) +++ trunk/reactos/drivers/storage/pciidex/pciidex.h 2005-11-09 11:10:24 UTC (rev 19092) @@ -32,6 +32,8 @@
PHYSICAL_ADDRESS BusMasterPortBase; PDEVICE_OBJECT LowerDevice; PDEVICE_OBJECT Pdo[MAX_IDE_CHANNEL]; + USHORT VendorId; + USHORT DeviceId; PBYTE MiniControllerExtension[0]; } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
_____
Modified: trunk/reactos/drivers/storage/pciidex/pdo.c --- trunk/reactos/drivers/storage/pciidex/pdo.c 2005-11-09 05:14:12 UTC (rev 19091) +++ trunk/reactos/drivers/storage/pciidex/pdo.c 2005-11-09 11:10:24 UTC (rev 19092) @@ -18,6 +18,7 @@
OUT ULONG_PTR* Information) { PPDO_DEVICE_EXTENSION DeviceExtension; + PFDO_DEVICE_EXTENSION FdoDeviceExtension; WCHAR Buffer[256]; ULONG Index = 0; ULONG IdType; @@ -27,6 +28,7 @@
IdType = IoGetCurrentIrpStackLocation(Irp)->Parameters.QueryId.IdType; DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceExtension->ControllerFdo->DeviceExtension;
switch (IdType) { @@ -40,26 +42,62 @@ { DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryHardwareIDs\n");
+ switch (FdoDeviceExtension->VendorId) + { + case 0x0e11: + Index += swprintf(&Buffer[Index], L"Compaq-%04x", FdoDeviceExtension->DeviceId) + 1; + break; + case 0x1039: + Index += swprintf(&Buffer[Index], L"SiS-%04x", FdoDeviceExtension->DeviceId) + 1; + break; + case 0x1050: + Index += swprintf(&Buffer[Index], L"WinBond-%04x", FdoDeviceExtension->DeviceId) + 1; + break; + case 0x1095: + Index += swprintf(&Buffer[Index], L"CMD-%04x", FdoDeviceExtension->DeviceId) + 1; + break; + case 0x8086: + { + switch (FdoDeviceExtension->DeviceId) + { + case 0x1230: + Index += swprintf(&Buffer[Index], L"Intel-PIIX") + 1; + break; + case 0x7010: + Index += swprintf(&Buffer[Index], L"Intel-PIIX3") + 1; + break; + case 0x7111: + Index += swprintf(&Buffer[Index], L"Intel-PIIX4") + 1; + break; + default: + Index += swprintf(&Buffer[Index], L"Intel-%04x", FdoDeviceExtension->DeviceId) + 1; + break; + } + break; + } + default: + break; + } if (DeviceExtension->Channel == 0) - Index += swprintf(&Buffer[Index], L"Primary_IDE_Channel"); + Index += swprintf(&Buffer[Index], L"Primary_IDE_Channel") + 1; else - Index += swprintf(&Buffer[Index], L"Secondary_IDE_Channel"); - Index++; + Index += swprintf(&Buffer[Index], L"Secondary_IDE_Channel") + 1; + Index += swprintf(&Buffer[Index], L"*PNP0600") + 1; Buffer[Index] = UNICODE_NULL; SourceString.Length = SourceString.MaximumLength = Index * sizeof(WCHAR); SourceString.Buffer = Buffer; break; } case BusQueryCompatibleIDs: + { DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryCompatibleIDs\n");
- Index += swprintf(&Buffer[Index], - L"*PNP0600"); - Index++; + Index += swprintf(&Buffer[Index], L"*PNP0600") + 1; Buffer[Index] = UNICODE_NULL; SourceString.Length = SourceString.MaximumLength = Index * sizeof(WCHAR); SourceString.Buffer = Buffer; break; + } case BusQueryInstanceID: { DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryInstanceID\n"); @@ -69,9 +107,7 @@ } default: DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / unknown query id type 0x%lx\n", IdType); -#ifndef NDEBUG - DbgBreakPoint(); -#endif + ASSERT(FALSE); return STATUS_NOT_SUPPORTED; }
@@ -94,21 +130,22 @@ PPDO_DEVICE_EXTENSION DeviceExtension; PFDO_DEVICE_EXTENSION FdoDeviceExtension; ULONG BaseIndex; + ULONG BytesRead; PCI_COMMON_CONFIG PciConfig; - NTSTATUS Status; NTSTATUS ret = STATUS_UNSUCCESSFUL;
DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceExtension->ControllerFdo->DeviceExtension; BaseIndex = DeviceExtension->Channel * 2;
- Status = PciIdeXGetBusData( - FdoDeviceExtension->MiniControllerExtension, + BytesRead = (*FdoDeviceExtension->BusInterface->GetBusData)( + FdoDeviceExtension->BusInterface->Context, + PCI_WHICHSPACE_CONFIG, &PciConfig, 0, PCI_COMMON_HDR_LENGTH); - if (!NT_SUCCESS(Status)) - return Status; + if (BytesRead != PCI_COMMON_HDR_LENGTH) + return STATUS_IO_DEVICE_ERROR;
/* We have found a known native pci ide controller */ if ((PciConfig.ProgIf & 0x80) && (PciConfig.u.type0.BaseAddresses[4] & PCI_ADDRESS_IO_SPACE)) @@ -122,17 +159,22 @@ *BusMasterPortBase = 0; }
- if ((PciConfig.u.type0.BaseAddresses[BaseIndex + 0] & PCI_ADDRESS_IO_SPACE) && - (PciConfig.u.type0.BaseAddresses[BaseIndex + 1] & PCI_ADDRESS_IO_SPACE)) + if ((PciConfig.ProgIf >> BaseIndex) & 0x1) { - /* Channel is enabled */ - *CommandPortBase = PciConfig.u.type0.BaseAddresses[BaseIndex + 0] & PCI_ADDRESS_IO_ADDRESS_MASK; - *ControlPortBase = PciConfig.u.type0.BaseAddresses[BaseIndex + 1] & PCI_ADDRESS_IO_ADDRESS_MASK; - *InterruptVector = PciConfig.u.type0.InterruptLine; - ret = STATUS_SUCCESS; + /* Native mode */ + if ((PciConfig.u.type0.BaseAddresses[BaseIndex + 0] & PCI_ADDRESS_IO_SPACE) && + (PciConfig.u.type0.BaseAddresses[BaseIndex + 1] & PCI_ADDRESS_IO_SPACE)) + { + /* Channel is enabled */ + *CommandPortBase = PciConfig.u.type0.BaseAddresses[BaseIndex + 0] & PCI_ADDRESS_IO_ADDRESS_MASK; + *ControlPortBase = PciConfig.u.type0.BaseAddresses[BaseIndex + 1] & PCI_ADDRESS_IO_ADDRESS_MASK; + *InterruptVector = PciConfig.u.type0.InterruptLine; + ret = STATUS_SUCCESS; + } } else { + /* Compatibility mode */ switch (DeviceExtension->Channel) { case 0: @@ -263,9 +305,7 @@ } default: DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / unknown type 0x%lx\n", DeviceTextType); -#ifndef NDEBUG - DbgBreakPoint(); -#endif + ASSERT(FALSE); return STATUS_NOT_SUPPORTED; }
@@ -370,9 +410,7 @@ { DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown type 0x%lx\n",
Stack->Parameters.QueryDeviceRelations.Type); -#ifndef NDEBUG - DbgBreakPoint(); -#endif + ASSERT(FALSE); Status = STATUS_NOT_SUPPORTED; break; } @@ -456,9 +494,7 @@ /* We can't forward request to the lower driver, because * we are a Pdo, so we don't have lower driver... */ DPRINT1("IRP_MJ_PNP / Unknown minor function 0x%lx\n", MinorFunction); -#ifndef NDEBUG - DbgBreakPoint(); -#endif + ASSERT(FALSE); Information = Irp->IoStatus.Information; Status = Irp->IoStatus.Status; } _____
Modified: trunk/reactos/w32api/include/ddk/ide.h --- trunk/reactos/w32api/include/ddk/ide.h 2005-11-09 05:14:12 UTC (rev 19091) +++ trunk/reactos/w32api/include/ddk/ide.h 2005-11-09 11:10:24 UTC (rev 19092) @@ -32,87 +32,173 @@
#endif
#define MAX_IDE_CHANNEL 2 +#define MAX_IDE_LINE 2 #define MAX_IDE_DEVICE 2
#include <pshpack1.h> -typedef struct _IDE_DRIVE_IDENTIFY -{ - USHORT GeneralConfiguration; - USHORT NumberOfCylinders; - USHORT Reserved1; - USHORT NumberOfHeads; - USHORT UnformattedBytesPerTrack; - USHORT UnformattedBytesPerSector; - USHORT SectorsPerTrack; - USHORT VendorUnique1[3]; - BYTE SerialNumber[20]; - USHORT BufferType; - USHORT BufferSectorSize; - USHORT NumberOfEccBytes; - BYTE FirmwareRevision[8]; - BYTE ModelNumber[40]; - BYTE MaximumBlockTransfer; - BYTE VendorUnique2; - USHORT DoubleWordIo; - USHORT Capabilities; - USHORT Reserved2; - BYTE VendorUnique3; - BYTE PioCycleTimingMode; - BYTE VendorUnique4; - BYTE DmaCycleTimingMode; - USHORT TranslationFieldsValid:3; - USHORT Reserved3:13; - USHORT NumberOfCurrentCylinders; - USHORT NumberOfCurrentHeads; - USHORT CurrentSectorsPerTrack; - ULONG CurrentSectorCapacity; - USHORT CurrentMultiSectorSetting; - ULONG UserAddressableSectors; - USHORT SingleWordDMASupport : 8; - USHORT SingleWordDMAActive : 8; - USHORT MultiWordDMASupport : 8; - USHORT MultiWordDMAActive : 8; - USHORT AdvancedPIOModes : 8; - USHORT Reserved4 : 8; - USHORT MinimumMWXferCycleTime; - USHORT RecommendedMWXferCycleTime; - USHORT MinimumPIOCycleTime; - USHORT MinimumPIOCycleTimeIORDY; - USHORT Reserved5[11]; - USHORT MajorRevision; - USHORT MinorRevision; - USHORT Reserved6[6]; - USHORT UltraDMASupport : 8; - USHORT UltraDMAActive : 8; - USHORT Reserved7[37]; - USHORT LastLun:3; - USHORT Reserved8:13; - USHORT MediaStatusNotification:2; - USHORT Reserved9:6; - USHORT DeviceWriteProtect:1; - USHORT Reserved10:7; - USHORT Reserved11[128]; -} IDE_DRIVE_IDENTIFY, *PIDE_DRIVE_IDENTIFY; +typedef struct _IDENTIFY_DATA { + USHORT GeneralConfiguration; /* 00 */ + USHORT NumCylinders; /* 02 */ + USHORT Reserved1; /* 04 */ + USHORT NumHeads; /* 06 */ + USHORT UnformattedBytesPerTrack; /* 08 */ + USHORT UnformattedBytesPerSector; /* 10 */ + USHORT NumSectorsPerTrack; /* 12 */ + USHORT VendorUnique1[3]; /* 14 */ + UCHAR SerialNumber[20]; /* 20 */ + USHORT BufferType; /* 40 */ + USHORT BufferSectorSize; /* 42 */ + USHORT NumberOfEccBytes; /* 44 */ + UCHAR FirmwareRevision[8]; /* 46 */ + UCHAR ModelNumber[40]; /* 54 */ + UCHAR MaximumBlockTransfer; /* 94 */ + UCHAR VendorUnique2; /* 95 */ + USHORT DoubleWordIo; /* 96 */ + USHORT Capabilities; /* 98 */ + USHORT Reserved2; /* 100 */ + UCHAR VendorUnique3; /* 102 */ + UCHAR PioCycleTimingMode; /* 103 */ + UCHAR VendorUnique4; /* 104 */ + UCHAR DmaCycleTimingMode; /* 105 */ + USHORT TranslationFieldsValid:3; /* 106 */ + USHORT Reserved3:13; /* - */ + USHORT NumberOfCurrentCylinders; /* 108 */ + USHORT NumberOfCurrentHeads; /* 110 */ + USHORT CurrentSectorsPerTrack; /* 112 */ + ULONG CurrentSectorCapacity; /* 114 */ + USHORT CurrentMultiSectorSetting; /* 118 */ + ULONG UserAddressableSectors; /* 120 */ + USHORT SingleWordDMASupport:8; /* 124 */ + USHORT SingleWordDMAActive:8; /* - */ + USHORT MultiWordDMASupport:8; /* 126 */ + USHORT MultiWordDMAActive:8; /* - */ + USHORT AdvancedPIOModes:8; /* 128 */ + USHORT Reserved4:8; /* - */ + USHORT MinimumMWXferCycleTime; /* 130 */ + USHORT RecommendedMWXferCycleTime; /* 132 */ + USHORT MinimumPIOCycleTime; /* 134 */ + USHORT MinimumPIOCycleTimeIORDY; /* 136 */ + USHORT Reserved5[11]; /* 138 */ + USHORT MajorRevision; /* 160 */ + USHORT MinorRevision; /* 162 */ + USHORT Reserved6; /* 164 */ + USHORT CommandSetSupport; /* 166 */ + USHORT Reserved6a[2]; /* 168 */ + USHORT CommandSetActive; /* 172 */ + USHORT Reserved6b; /* 174 */ + USHORT UltraDMASupport:8; /* 176 */ + USHORT UltraDMAActive:8; /* - */ + USHORT Reserved7[11]; /* 178 */ + ULONG Max48BitLBA[2]; /* 200 */ + USHORT Reserved7a[22]; /* 208 */ + USHORT LastLun:3; /* 252 */ + USHORT Reserved8:13; /* - */ + USHORT MediaStatusNotification:2; /* 254 */ + USHORT Reserved9:6; /* - */ + USHORT DeviceWriteProtect:1; /* - */ + USHORT Reserved10:7; /* - */ + USHORT Reserved11[128]; /* 256 */ +} IDENTIFY_DATA, *PIDENTIFY_DATA; + +typedef struct _EXTENDED_IDENTIFY_DATA { + USHORT GeneralConfiguration; /* 00 */ + USHORT NumCylinders; /* 02 */ + USHORT Reserved1; /* 04 */ + USHORT NumHeads; /* 06 */ + USHORT UnformattedBytesPerTrack; /* 08 */ + USHORT UnformattedBytesPerSector; /* 10 */ + USHORT NumSectorsPerTrack; /* 12 */ + union + { + USHORT VendorUnique1[3]; /* 14 */ + struct + { + UCHAR InterSectorGap; /* 14 */ + UCHAR InterSectorGapSize; /* - */ + UCHAR Reserved16; /* 16 */ + UCHAR BytesInPLO; /* - */ + USHORT VendorUniqueCnt; /* 18 */ + } u; + }; + UCHAR SerialNumber[20]; /* 20 */ + USHORT BufferType; /* 40 */ + USHORT BufferSectorSize; /* 42 */ + USHORT NumberOfEccBytes; /* 44 */ + UCHAR FirmwareRevision[8]; /* 46 */ + UCHAR ModelNumber[40]; /* 54 */ + UCHAR MaximumBlockTransfer; /* 94 */ + UCHAR VendorUnique2; /* 95 */ + USHORT DoubleWordIo; /* 96 */ + USHORT Capabilities; /* 98 */ + USHORT Reserved2; /* 100 */ + UCHAR VendorUnique3; /* 102 */ + UCHAR PioCycleTimingMode; /* 103 */ + UCHAR VendorUnique4; /* 104 */ + UCHAR DmaCycleTimingMode; /* 105 */ + USHORT TranslationFieldsValid:3; /* 106 */ + USHORT Reserved3:13; /* - */ + USHORT NumberOfCurrentCylinders; /* 108 */ + USHORT NumberOfCurrentHeads; /* 110 */ + USHORT CurrentSectorsPerTrack; /* 112 */ + ULONG CurrentSectorCapacity; /* 114 */ + USHORT CurrentMultiSectorSetting; /* 118 */ + ULONG UserAddressableSectors; /* 120 */ + USHORT SingleWordDMASupport:8; /* 124 */ + USHORT SingleWordDMAActive:8; /* - */ + USHORT MultiWordDMASupport:8; /* 126 */ + USHORT MultiWordDMAActive:8; /* - */ + USHORT AdvancedPIOModes:8; /* 128 */ + USHORT Reserved4:8; /* - */ + USHORT MinimumMWXferCycleTime; /* 130 */ + USHORT RecommendedMWXferCycleTime; /* 132 */ + USHORT MinimumPIOCycleTime; /* 134 */ + USHORT MinimumPIOCycleTimeIORDY; /* 136 */ + USHORT Reserved5[11]; /* 138 */ + USHORT MajorRevision; /* 160 */ + USHORT MinorRevision; /* 162 */ + USHORT Reserved6; /* 164 */ + USHORT CommandSetSupport; /* 166 */ + USHORT Reserved6a[2]; /* 168 */ + USHORT CommandSetActive; /* 172 */ + USHORT Reserved6b; /* 174 */ + USHORT UltraDMASupport:8; /* 176 */ + USHORT UltraDMAActive:8; /* - */ + USHORT Reserved7[11]; /* 178 */ + ULONG Max48BitLBA[2]; /* 200 */ + USHORT Reserved7a[22]; /* 208 */ + USHORT LastLun:3; /* 252 */ + USHORT Reserved8:13; /* - */ + USHORT MediaStatusNotification:2; /* 254 */ + USHORT Reserved9:6; /* - */ + USHORT DeviceWriteProtect:1; /* - */ + USHORT Reserved10:7; /* - */ + USHORT Reserved11[128]; /* 256 */ +} EXTENDED_IDENTIFY_DATA, *PEXTENDED_IDENTIFY_DATA; #include <poppack.h>
typedef struct _PCIIDE_TRANSFER_MODE_SELECT { ULONG Channel; - BOOLEAN DevicePresent[MAX_IDE_DEVICE]; - BOOLEAN FixedDisk[MAX_IDE_DEVICE]; - BOOLEAN IoReadySupported[MAX_IDE_DEVICE]; - ULONG DeviceTransferModeSupported[MAX_IDE_DEVICE]; - ULONG BestPioCycleTime[MAX_IDE_DEVICE]; - ULONG BestSwDmaCycleTime[MAX_IDE_DEVICE]; - ULONG BestMwDmaCycleTime[MAX_IDE_DEVICE]; - ULONG BestUDmaCycleTime[MAX_IDE_DEVICE]; - ULONG DeviceTransferModeCurrent[MAX_IDE_DEVICE]; - ULONG DeviceTransferModeSelected[MAX_IDE_DEVICE]; + BOOLEAN DevicePresent[MAX_IDE_DEVICE * MAX_IDE_LINE]; + BOOLEAN FixedDisk[MAX_IDE_DEVICE * MAX_IDE_LINE]; + BOOLEAN IoReadySupported[MAX_IDE_DEVICE * MAX_IDE_LINE]; + ULONG DeviceTransferModeSupported[MAX_IDE_DEVICE * MAX_IDE_LINE]; + ULONG BestPioCycleTime[MAX_IDE_DEVICE * MAX_IDE_LINE]; + ULONG BestSwDmaCycleTime[MAX_IDE_DEVICE * MAX_IDE_LINE]; + ULONG BestMwDmaCycleTime[MAX_IDE_DEVICE * MAX_IDE_LINE]; + ULONG BestUDmaCycleTime[MAX_IDE_DEVICE * MAX_IDE_LINE]; + ULONG DeviceTransferModeCurrent[MAX_IDE_DEVICE * MAX_IDE_LINE]; + ULONG UserChoiceTransferMode[MAX_IDE_DEVICE * MAX_IDE_LINE]; + ULONG EnableUDMA66; + IDENTIFY_DATA IdentifyData[MAX_IDE_DEVICE]; + ULONG DeviceTransferModeSelected[MAX_IDE_DEVICE * MAX_IDE_LINE]; + PULONG TransferModeTimingTable; + ULONG TransferModeTableLength; } PCIIDE_TRANSFER_MODE_SELECT, *PPCIIDE_TRANSFER_MODE_SELECT;
typedef enum { - ChannelDisabled, + ChannelDisabled = 0, ChannelEnabled, ChannelStateUnknown } IDE_CHANNEL_STATE; @@ -131,7 +217,7 @@ IN PVOID DeviceExtension, IN OUT PPCIIDE_TRANSFER_MODE_SELECT XferMode);
-typedef BOOLEAN +typedef ULONG (NTAPI *PCIIDE_USEDMA_FUNC)( IN PVOID DeviceExtension, IN PUCHAR CdbCommand, @@ -139,7 +225,7 @@
typedef NTSTATUS (NTAPI *PCIIDE_UDMA_MODES_SUPPORTED)( - IN IDE_DRIVE_IDENTIFY IdentifyData, + IN IDENTIFY_DATA IdentifyData, OUT PULONG BestXferMode, OUT PULONG CurrentXferMode);
@@ -210,6 +296,7 @@ #define UDMA_MODE2 (1 << 13) #define UDMA_MODE3 (1 << 14) #define UDMA_MODE4 (1 << 15) +#define UDMA_MODE5 (1 << 16)
#ifdef __cplusplus }