19 if (ChanData->DmaAdapter)
21 ChanData->FreeMemory(ChanData);
23 ChanData->DmaAdapter->DmaOperations->PutDmaAdapter(ChanData->DmaAdapter);
24 ChanData->DmaAdapter =
NULL;
48 &ChanData->MaximumPhysicalPages);
61 if (!ChanData->DmaAdapter)
63 WARN(
"CH %lu: Unable to get DMA adapter\n", ChanData->Channel);
67 Status = ChanData->AllocateMemory(ChanData);
70 WARN(
"CH %lu: Unable to allocate DMA memory %lx\n", ChanData->Channel,
Status);
76 ChanData->Current.MaximumTransferLength =
min(ChanData->Current.MaximumTransferLength,
78 INFO(
"CH %lu: Allocated %lu PRD pages, maximum transfer length 0x%lx\n",
80 ChanData->MaximumPhysicalPages,
81 ChanData->Current.MaximumTransferLength);
115 ERR(
"CH %lu: Failed to parse resources 0x%lx\n", ChanData->
Channel,
Status);
126 INFO(
"CH %lu: ACPI available\n", ChanData->
Channel);
139 INFO(
"CH %lu: Non DMA channel\n", ChanData->
Channel);
148 ERR(
"CH %lu: Unable to fall back to PIO mode\n", ChanData->
Channel);
166 INFO(
"CH %lu: 32-bit I/O not supported\n", ChanData->
Channel);
264 sizeof(*DeviceRelations),
266 if (!DeviceRelations)
269 DeviceRelations->
Count = 1;
294 RtlZeroMemory(&ParentCapabilities,
sizeof(ParentCapabilities));
295 ParentCapabilities.Size =
sizeof(ParentCapabilities);
296 ParentCapabilities.Version = 1;
297 ParentCapabilities.Address =
MAXULONG;
298 ParentCapabilities.UINumber =
MAXULONG;
355 Descriptor->u.Port.MinimumAddress.LowPart = IoBase;
371 ULONG CommandPortBase, ControlPortBase, InterruptVector, ListSize;
372 BOOLEAN AppendSecondaryResources;
377 return Irp->IoStatus.Status;
381 return Irp->IoStatus.Status;
390 AppendSecondaryResources = (Controller->
MaxChannels == 1);
394 if (AppendSecondaryResources)
406 if (AppendSecondaryResources)
434 Descriptor->u.Interrupt.Level = InterruptVector;
435 Descriptor->u.Interrupt.Vector = InterruptVector;
438 if (AppendSecondaryResources)
465 ULONG CommandPortBase, ControlPortBase, InterruptVector, ListSize;
466 BOOLEAN AppendSecondaryResources;
471 return Irp->IoStatus.Status;
475 return Irp->IoStatus.Status;
477 AppendSecondaryResources = (Controller->
MaxChannels == 1);
481 if (AppendSecondaryResources)
494 if (AppendSecondaryResources)
526 Descriptor->u.Interrupt.MinimumVector = InterruptVector;
527 Descriptor->u.Interrupt.MaximumVector = InterruptVector;
529 if (AppendSecondaryResources)
614 size_t CharCount, Remaining;
615 static const WCHAR IdeCompatibleId[] =
L"*PNP0600";
624 static const WCHAR PciIdeDeviceId[] =
L"PCIIDE\\IDEChannel";
644 CharCount =
sizeof(
"WinBond-1234") +
645 sizeof(
"Internal_IDE_Channel") +
650 CharCount *
sizeof(
WCHAR),
655 INFO(
"HardwareIDs:\n");
659 Remaining = CharCount;
720 "Internal_IDE_Channel");
723 INFO(
" '%S'\n", IdStart);
739 INFO(
" '%S'\n", IdStart);
763 CharCount =
sizeof(
"00");
766 CharCount *
sizeof(
WCHAR),
785 return Irp->IoStatus.Status;
811 CharCount =
sizeof(
"ATA Channel 99");
814 CharCount *
sizeof(
WCHAR),
834 CharCount =
sizeof(
"Channel 99");
837 CharCount *
sizeof(
WCHAR),
856 return Irp->IoStatus.Status;
878 if (IoStack->Parameters.QueryInterface.Size <
sizeof(*ChannelInterface))
879 return Irp->IoStatus.Status;
882 return Irp->IoStatus.Status;
884 ChanData =
PdoExt->ChanData;
967 &GUID_PCIIDE_INTERFACE_ROS))
#define ExAllocatePoolUninitialized
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
BOOLEAN AtaAcpiGetTimingMode(_In_ PDEVICE_OBJECT DeviceObject, _Out_ PIDE_ACPI_TIMING_MODE_BLOCK TimingMode)
ULONG AtaAhciChannelGetMaximumDeviceCount(_In_ PVOID ChannelContext)
#define PCIIDEX_INTERFACE_VERSION
#define ATA_MAX_TRANSFER_LENGTH
#define ATA_CHANNEL_FLAG_IS_EXTERNAL
struct _PCIIDEX_CHANNEL_INTERFACE * PPCIIDEX_CHANNEL_INTERFACE
#define ATA_CHANNEL_FLAG_PIO_VIA_DMA
#define ATA_CHANNEL_FLAG_PIO_FOR_LBA48_XFER
#define ATA_CHANNEL_FLAG_NCQ
#define ATA_CHANNEL_FLAG_IS_AHCI
#define NT_SUCCESS(StatCode)
#define RemoveEntryList(Entry)
VOID FASTCALL ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
VOID FASTCALL ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
#define CM_RESOURCE_PORT_IO
#define CM_RESOURCE_PORT_16_BIT_DECODE
_In_ PIOMMU_DEVICE_PATH _In_ PIOMMU_SVM_CAPABILITIES DeviceCapabilities
#define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define IRP_MN_SURPRISE_REMOVAL
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
#define IoCompleteRequest
NTSTRSAFEVAPI RtlStringCchPrintfExW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, _Out_opt_ size_t *pcchRemaining, _In_ STRSAFE_DWORD dwFlags, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
#define PCIIDE_LEGACY_PRIMARY_CONTROL_BASE
#define PCIIDE_LEGACY_SECONDARY_COMMAND_BASE
#define PCIIDE_LEGACY_SECONDARY_CONTROL_BASE
#define PCIIDE_LEGACY_PRIMARY_IRQ
#define PCIIDE_LEGACY_COMMAND_IO_RANGE_LENGTH
#define PCIIDE_LEGACY_RESOURCE_COUNT
#define PCIIDE_LEGACY_CONTROL_IO_RANGE_LENGTH
#define PCIIDE_LEGACY_SECONDARY_IRQ
#define PCIIDE_LEGACY_PRIMARY_COMMAND_BASE
NTSTATUS PciIdeParseResources(_In_ PCHANNEL_DATA_PATA ChanData, _In_ PCM_RESOURCE_LIST ResourcesTranslated)
NTSTATUS PciIdeConnectInterrupt(_In_ PVOID ChannelContext)
VOID PciIdeFreeResources(_In_ PVOID ChannelContext)
ULONG PataChannelGetMaximumDeviceCount(_In_ PVOID ChannelContext)
NTSTATUS PciIdeXPnpQueryDeviceUsageNotification(_In_ PCOMMON_DEVICE_EXTENSION CommonExt, _In_ PIRP Irp)
NTSTATUS PciIdeXPnpRepeatRequest(_In_ PCOMMON_DEVICE_EXTENSION CommonExt, _In_ PIRP Irp, _In_opt_ PDEVICE_CAPABILITIES DeviceCapabilities)
NTSTATUS PciIdeXPnpQueryPnpDeviceState(_In_ PCOMMON_DEVICE_EXTENSION CommonExt, _In_ PIRP Irp)
#define CTRL_FLAG_NATIVE_PCI
#define PDO_FLAG_REPORTED_MISSING
#define CHANNEL_FLAG_PIO_FOR_LBA48_XFER
CONTROLLER_ATTACH_CHANNEL AtaCtrlAttachChannel
#define CHANNEL_FLAG_IO32
CHANNEL_SET_MODE AtaCtrlSetTransferMode
CHANNEL_IDENTIFY_DEVICE PataIdentifyDevice
#define CHANNEL_FLAG_64_BIT_DMA
#define CTRL_FLAG_NON_PNP
#define IS_PRIMARY_CHANNEL(PdoExtension)
CHANNEL_ENUMERATE_CHANNEL PataEnumerateChannel
CHANNEL_ALLOCATE_SLOT AtaAhciAllocateSlot
CHANNEL_SET_DEVICE_DATA AtaCtrlSetDeviceData
CHANNEL_IDENTIFY_DEVICE AtaAhciIdentifyDevice
#define CTRL_FLAG_MANUAL_RES
CHANNEL_ALLOCATE_SLOT PataAllocateSlot
#define CTRL_FLAG_SATA_HBA_ACPI
CHANNEL_DOWNGRADE_INTERFACE_SPEED AtaCtrlDowngradeInterfaceSpeed
CHANNEL_RESET_CHANNEL PataResetChannel
#define CHANNEL_FLAG_IS_EXTERNAL
#define CHANNEL_FLAG_PIO_VIA_DMA
#define CTRL_FLAG_IS_AHCI
CHANNEL_ENUMERATE_CHANNEL AtaAhciEnumerateChannel
CHANNEL_ABORT_CHANNEL AtaCtrlAbortChannel
struct _CHANNEL_DATA_PATA * PCHANNEL_DATA_PATA
#define CHANNEL_FLAG_HAS_NCQ
CHANNEL_RESET_CHANNEL AtaAhciResetChannel
#define CHANNEL_FLAG_HAS_ACPI_GTM
CHANNEL_GET_INIT_TASK_FILE AtaCtrlGetInitTaskFile
#define CTRL_FLAG_IS_SIMPLEX
PDMA_ADAPTER NTAPI IoGetDmaAdapter(IN PDEVICE_OBJECT PhysicalDeviceObject, IN PDEVICE_DESCRIPTION DeviceDescription, IN OUT PULONG NumberOfMapRegisters)
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR CM_PARTIAL_RESOURCE_DESCRIPTOR
#define CmResourceTypePort
#define CM_RESOURCE_INTERRUPT_LATCHED
#define CmResourceTypeInterrupt
struct _IO_RESOURCE_DESCRIPTOR IO_RESOURCE_DESCRIPTOR
NTSTATUS PciIdeXFdoDispatchPnp(_In_ PFDO_DEVICE_EXTENSION FdoExtension, _Inout_ PIRP Irp)
IDE_CHANNEL_STATE PciIdeXGetChannelState(_In_ PATA_CONTROLLER Controller, _In_ ULONG Channel)
static BOOLEAN PciIdeXPdoInitDma(_In_ PFDO_DEVICE_EXTENSION FdoExt, _In_ PCHANNEL_DATA_COMMON ChanData)
static NTSTATUS PciIdeXPdoQueryStopRemoveDevice(_In_ PPDO_DEVICE_EXTENSION PdoExtension)
static NTSTATUS PciIdeXQueryPciIdeInterface(_In_ PPDO_DEVICE_EXTENSION PdoExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
static PCWSTR PciIdeXGetControllerVendorId(_In_ PFDO_DEVICE_EXTENSION FdoExtension)
static VOID PciIdeXPdoFreeDmaResources(_In_ PCHANNEL_DATA_COMMON ChanData)
static NTSTATUS PciIdeXPdoQueryResources(_In_ PPDO_DEVICE_EXTENSION PdoExtension, _In_ PIRP Irp)
static NTSTATUS PciIdeXPdoQueryCapabilities(_In_ PPDO_DEVICE_EXTENSION PdoExtension, _In_ PIRP Irp)
static PDMA_ADAPTER PciIdeXPdoGetDmaAdapter(_In_ PFDO_DEVICE_EXTENSION FdoExt, _In_ PCHANNEL_DATA_COMMON ChanData)
static NTSTATUS PciIdeXPdoStartDevice(_In_ PPDO_DEVICE_EXTENSION PdoExt, _In_ PCM_RESOURCE_LIST ResourcesTranslated)
NTSTATUS PciIdeXPdoRemoveDevice(_In_ PPDO_DEVICE_EXTENSION PdoExtension, _In_ PIRP Irp, _In_ BOOLEAN FinalRemove)
static VOID PciIdeXMakePortRequirement(_Out_ PIO_RESOURCE_DESCRIPTOR Descriptor, _In_ ULONG IoBase, _In_ ULONG Length)
static NTSTATUS PciIdeXPdoQueryDeviceText(_In_ PPDO_DEVICE_EXTENSION PdoExtension, _In_ PIRP Irp)
static NTSTATUS PciIdeXPdoStopDevice(_In_ PPDO_DEVICE_EXTENSION PdoExt)
static NTSTATUS PciIdeXPdoQueryInterface(_In_ PPDO_DEVICE_EXTENSION PdoExtension, _Inout_ PIRP Irp)
static VOID PciIdeXMakePortResource(_Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, _In_ ULONG IoBase, _In_ ULONG Length)
NTSTATUS NTAPI PciIdeXDispatchPnp(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
static NTSTATUS PciIdeXPdoQueryResourceRequirements(_In_ PPDO_DEVICE_EXTENSION PdoExtension, _In_ PIRP Irp)
static NTSTATUS PciIdeXPdoDispatchPnp(_In_ PPDO_DEVICE_EXTENSION PdoExtension, _Inout_ PIRP Irp)
static NTSTATUS PciIdeXPdoQueryTargetDeviceRelations(_In_ PPDO_DEVICE_EXTENSION PdoExtension, _In_ PIRP Irp)
static NTSTATUS PciIdeXPdoQueryId(_In_ PPDO_DEVICE_EXTENSION PdoExtension, _In_ PIRP Irp)
static PCWSTR PciIdeXGetControllerDeviceId(_In_ PFDO_DEVICE_EXTENSION FdoExtension)
PCONTROLLER_OBJECT HwSyncObject
PKINTERRUPT InterruptObject
PCHANNEL_PREPARE_IO PrepareIo
ULONG TransferModeSupported
PPORT_NOTIFICATION PortNotification
struct _CHANNEL_DATA_COMMON::@1183 Current
PCHANNEL_PREPARE_PRD_TABLE PreparePrdTable
PKINTERRUPT InterruptObject
ULONG MaximumPhysicalPages
PATA_CONTROLLER Controller
PATA_DEVICE_REQUEST * Slots
ULONG MaximumTransferLength
PCHANNEL_START_IO StartIo
IDE_ACPI_TIMING_MODE_BLOCK CurrentTimingMode
PDEVICE_OBJECT Objects[1]
ATA_CONTROLLER Controller
union _IO_STACK_LOCATION::@1696 Parameters
struct _IO_STACK_LOCATION::@4454::@4486 QueryDeviceText
struct _IO_STACK_LOCATION::@4454::@4481 DeviceCapabilities
struct _IO_STACK_LOCATION::@4454::@4479 QueryDeviceRelations
struct _IO_STACK_LOCATION::@4454::@4491 StartDevice
struct _IO_STACK_LOCATION::@4454::@4480 QueryInterface
struct _IO_STACK_LOCATION::@4454::@4485 QueryId
Channel interface with the PCIIDEX driver.
PPORT_NOTIFICATION * PortNotification
PCHANNEL_SET_MODE SetTransferMode
PCHANNEL_ALLOCATE_SLOT AllocateSlot
ULONG MaximumTransferLength
PCHANNEL_RESET_CHANNEL ResetChannel
PCHANNEL_DOWNGRADE_INTERFACE_SPEED DowngradeInterfaceSpeed
PCHANNEL_IDENTIFY_DEVICE IdentifyDevice
PCHANNEL_GET_INIT_TASK_FILE GetInitTaskFile
PCHANNEL_ABORT_CHANNEL AbortChannel
PCHANNEL_SET_DEVICE_DATA SetDeviceData
ULONG MaximumPhysicalPages
PCHANNEL_START_IO StartIo
PCONTROLLER_OBJECT HwSyncObject
PKINTERRUPT InterruptObject
PCHANNEL_PREPARE_IO PrepareIo
PCONTROLLER_ATTACH_CHANNEL AttachChannel
PCHANNEL_PREPARE_PRD_TABLE PreparePrdTable
PATA_DEVICE_REQUEST ** Slots
PDEVICE_OBJECT ChannelObject
PCHANNEL_ENUMERATE_CHANNEL EnumerateChannel
ULONG TransferModeSupported
COMMON_DEVICE_EXTENSION Common
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_DEVICE_BUSY
#define STATUS_INSUFFICIENT_RESOURCES
PUSBHUB_PORT_PDO_EXTENSION NTAPI PdoExt(IN PDEVICE_OBJECT DeviceObject)
_In_ PDEVICE_OBJECT DeviceObject
_In_ WDFCMRESLIST _In_ WDFCMRESLIST ResourcesTranslated
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ PCUNICODE_STRING DeviceDescription
_Must_inspect_result_ _In_ WDFIORESREQLIST _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFIORESLIST * ResourceList
_In_ WDFIORESREQLIST RequirementsList
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
_Must_inspect_result_ _In_ WDFCMRESLIST List
#define IsEqualGUIDAligned(guid1, guid2)
#define DeviceCapabilities
@ CmResourceShareDeviceExclusive
#define IoAcquireRemoveLock(RemoveLock, Tag)
#define IoReleaseRemoveLockAndWait(_RemoveLock, _Tag)
#define IoReleaseRemoveLock(_RemoveLock, _Tag)
#define IRP_MN_CANCEL_STOP_DEVICE
#define IRP_MN_QUERY_PNP_DEVICE_STATE
#define IRP_MN_QUERY_INTERFACE
#define DEVICE_DESCRIPTION_VERSION
#define IRP_MN_START_DEVICE
#define IRP_MN_DEVICE_USAGE_NOTIFICATION
#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS
#define IRP_MN_REMOVE_DEVICE
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define IRP_MN_QUERY_STOP_DEVICE
#define IRP_MN_QUERY_DEVICE_TEXT
#define IRP_MN_QUERY_CAPABILITIES
#define IRP_MN_QUERY_RESOURCES
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define IRP_MN_STOP_DEVICE
@ DeviceTextLocationInformation
#define IRP_MN_QUERY_REMOVE_DEVICE
#define BYTES_TO_PAGES(Size)
#define ObReferenceObject