57 return Controller->AttachChannel(ChanData, Attach);
101 DiscoveredNewDevice =
TRUE;
104 Device->SupportedModes &= ChanData->
Current.TransferModeSupported;
225 if (DisableInterrupts)
265 if (MinimumIoLength != 0)
269 ERR(
"%04X:%04X.%02X: Unexpected PCI BAR #%lu length 0x%lx, minimum required 0x%lx\n",
307 ULONG IoBase = PciData->u.type0.BaseAddresses[*
Bar];
310 IoBase &= ~PCI_ADDRESS_IO_SPACE;
354 ULONG CurrBar, NextBar;
363 CurrBar = PciData->
u.type0.BaseAddresses[
Bar];
365 NextBar = PciData->
u.type0.BaseAddresses[
Bar + 1];
377 INFO(
"BAR[%lu]: I/O %I64X Len %lX\n",
393 if (Desc->
u.
Memory.Start.HighPart != NextBar)
398 if (Desc->
u.
Memory.Start.HighPart != 0)
402 INFO(
"BAR[%lu]: MEM %I64X Len %lX\n",
425 Controller->Pci.RevisionID = PciData->RevisionID;
428 Controller->Pci.BaseClass = PciData->BaseClass;
429 Controller->Pci.CacheLineSize = PciData->CacheLineSize;
430 Controller->Pci.SubVendorID = PciData->u.type0.SubVendorID;
431 Controller->Pci.SubSystemID = PciData->u.type0.SubSystemID;
484#if defined(ATA_DETECT_LEGACY_DEVICES)
495 ERR(
"Failed to collect PCI information 0x%lx\n",
Status);
499 INFO(
"Starting controller %04X:%04X.%02X-%04X.%04X-%02X.%02X.%02X\n",
515 ERR(
"Failed to match ATA controller with status %lx\n",
Status);
603 ListEntry = ListEntry->
Flink)
627 WCHAR DeviceNameBuffer[
sizeof(
"\\Device\\Ide\\PciIde99999Channel99-FFF")];
631 static ULONG PdoNumber = 0;
636 sizeof(DeviceNameBuffer),
637 L"\\Device\\Ide\\PciIde%luChannel%lu-%lx",
653 ERR(
"Failed to create PDO 0x%lx\n",
Status);
677 Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
715 if (!DeviceRelations)
721 for (ListEntry = FdoExt->PdoListHead.
Flink;
722 ListEntry != &FdoExt->PdoListHead;
723 ListEntry = ListEntry->
Flink)
737 INFO(
"%04X:%04X.%02X: Skip disabled channel %lu\n",
749 ChannelBitmap =
Controller->ChannelBitmap & ~ChannelBitmap;
755 if (!(ChannelBitmap & (1 <<
i)))
761 INFO(
"%04X:%04X.%02X: Skip disabled channel %lu\n",
781 DeviceRelations->
Count = 0;
782 for (ListEntry = FdoExt->PdoListHead.
Flink;
783 ListEntry != &FdoExt->PdoListHead;
784 ListEntry = ListEntry->
Flink)
815 &GUID_TRANSLATOR_INTERFACE_STANDARD))
819 CM_RESOURCE_TYPE ResourceType;
826 if (IoStack->Parameters.QueryInterface.Size <
sizeof(*TranslatorInterface))
829 ResourceType =
PtrToUlong(IoStack->Parameters.QueryInterface.InterfaceSpecificData);
838 sizeof(*TranslatorInterface),
839 IoStack->Parameters.QueryInterface.Version,
859 switch (IoStack->Parameters.QueryId.IdType)
877 static const WCHAR IdeGenericId[] =
L"*PNP0600\0";
888 INFO(
"Hardware/Compatible ID: '%S'\n",
Buffer);
#define ExAllocatePoolUninitialized
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
NTSTATUS AtaAcpiSetTimingMode(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIDE_ACPI_TIMING_MODE_BLOCK TimingMode, _In_opt_ PIDENTIFY_DEVICE_DATA IdBlock1, _In_opt_ PIDENTIFY_DEVICE_DATA IdBlock2)
VOID AtaAcpiSetDeviceData(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIDENTIFY_DEVICE_DATA IdBlock)
PVOID AtaAcpiGetTaskFile(_In_ PDEVICE_OBJECT DeviceObject)
FORCEINLINE ULONG AHCI_PORT_READ(_In_ PVOID PortIoBase, _In_ AHCI_PORT_REGISTER Register)
NTSTATUS AhciGetControllerProperties(_Inout_ PATA_CONTROLLER Controller)
BOOLEAN AtaAhciDowngradeInterfaceSpeed(_In_ PCHANNEL_DATA_AHCI ChanData)
#define ATA_MIN_BUFFER_ALIGNMENT
#define FILE_DEVICE_SECURE_OPEN
VOID NTAPI IoDeleteController(IN PCONTROLLER_OBJECT ControllerObject)
#define STATUS_NOT_SUPPORTED
_In_ ULONG _In_ MEMORY_CACHING_TYPE _Out_ PPHYSICAL_ADDRESS PhysicalAddress
#define NT_SUCCESS(StatCode)
VOID CompleteIrp(IN PIRP Irp, IN NTSTATUS Status, IN ULONG_PTR Information)
#define InsertTailList(ListHead, Entry)
#define KeReleaseSpinLock(sl, irql)
#define KeAcquireSpinLock(sl, irql)
#define KeGetCurrentIrql()
union Alignment_ Alignment
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
VOID FASTCALL ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
VOID FASTCALL ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
_In_ UCXUSBDEVICE _In_ PDEVICE_OBJECT Pdo
VOID NTAPI MmUnmapIoSpace(IN PVOID BaseAddress, IN SIZE_T NumberOfBytes)
PVOID NTAPI MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType)
#define ExFreePoolWithTag(_P, _T)
static BOOL StartDevice(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DevInfoData OPTIONAL, IN BOOL bEnable, IN DWORD HardwareProfile OPTIONAL, OUT BOOL *bNeedReboot OPTIONAL)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
#define IRP_MN_SURPRISE_REMOVAL
#define IoSkipCurrentIrpStackLocation(Irp)
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
#define IoCompleteRequest
BOOLEAN NTAPI IoForwardIrpSynchronously(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
KIRQL NTAPI KeAcquireInterruptSpinLock(IN PKINTERRUPT Interrupt)
VOID NTAPI KeReleaseInterruptSpinLock(IN PKINTERRUPT Interrupt, IN KIRQL OldIrql)
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
IDE_CHANNEL_STATE PciIdeGetChannelState(_In_ PATA_CONTROLLER Controller, _In_ ULONG Channel)
NTSTATUS PataGetControllerProperties(_Inout_ PATA_CONTROLLER Controller, _In_ PCM_RESOURCE_LIST ResourcesTranslated)
NTSTATUS NTAPI PciIdeGetControllerProperties(IN PVOID DeviceExtension, OUT PIDE_CONTROLLER_PROPERTIES ControllerProperties)
NTSTATUS PciIdeXPnpQueryDeviceUsageNotification(_In_ PCOMMON_DEVICE_EXTENSION CommonExt, _In_ PIRP Irp)
NTSTATUS PciIdeXPnpQueryPnpDeviceState(_In_ PCOMMON_DEVICE_EXTENSION CommonExt, _In_ PIRP Irp)
#define CTRL_FLAG_NATIVE_PCI
#define PDO_FLAG_REPORTED_MISSING
struct _CHANNEL_DATA_AHCI * PCHANNEL_DATA_AHCI
CONTROLLER_PNP_START_DEVICE PciIdeXFdoStartDevice
#define CHANNEL_FLAG_NO_ATAPI_DMA
CONTROLLER_ATTACH_CHANNEL AtaCtrlAttachChannel
CHANNEL_SET_MODE AtaCtrlSetTransferMode
#define CTRL_FLAG_NON_PNP
CHANNEL_SET_DEVICE_DATA AtaCtrlSetDeviceData
NTSTATUS PciIdeXPdoRemoveDevice(_In_ PPDO_DEVICE_EXTENSION PdoExtension, _In_ PIRP Irp, _In_ BOOLEAN FinalRemove)
CONTROLLER_ATTACH_CHANNEL_EX PciIdeAttachChannel
#define PDO_FLAG_NOT_PRESENT
#define CTRL_FLAG_SATA_HBA_ACPI
CHANNEL_DOWNGRADE_INTERFACE_SPEED AtaCtrlDowngradeInterfaceSpeed
#define CHANNEL_FLAG_PIO_VIA_DMA
#define CTRL_FLAG_IS_AHCI
CHANNEL_ABORT_CHANNEL AtaCtrlAbortChannel
CONTROLLER_PNP_REMOVE_DEVICE PciIdeXFdoRemoveDevice
CHANNEL_SET_MODE_EX PciIdeGenericSetTransferMode
#define CHANNEL_FLAG_HAS_ACPI_GTM
CHANNEL_GET_INIT_TASK_FILE AtaCtrlGetInitTaskFile
#define FILE_DEVICE_CONTROLLER
#define CmResourceTypeMemory
#define CmResourceTypePort
#define CmResourceTypeInterrupt
unsigned char _BitScanReverse(unsigned long *_Index, unsigned long _Mask)
#define DECLSPEC_NOINLINE_FROM_PAGED
NTSTATUS PciIdeXFdoDispatchPnp(_In_ PFDO_DEVICE_EXTENSION FdoExtension, _Inout_ PIRP Irp)
static NTSTATUS AtaCtrlPciCollectInformation(_In_ PFDO_DEVICE_EXTENSION FdoExt, _In_ PCM_RESOURCE_LIST ResourcesTranslated)
static PPDO_DEVICE_EXTENSION PciIdeXPdoCreateDevice(_In_ PFDO_DEVICE_EXTENSION FdoExtension, _In_ ULONG ChannelNumber)
static NTSTATUS PciIdeXFdoQueryBusRelations(_In_ PFDO_DEVICE_EXTENSION FdoExt, _In_ PIRP Irp)
static NTSTATUS PciIdeXFdoQueryInterface(_In_ PFDO_DEVICE_EXTENSION FdoExtension, _In_ PIO_STACK_LOCATION IoStack)
VOID DumpTestMiniport(_Inout_ PFDO_DEVICE_EXTENSION FdoExt)
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaChanEnableInterruptsSync(_In_ PVOID ChannelContext, _In_ BOOLEAN Enable)
static VOID AtaCtrlPciAssignResources(_In_ PATA_CONTROLLER Controller, _In_ PCM_RESOURCE_LIST ResourcesTranslated, _In_ PPCI_COMMON_HEADER PciData)
static NTSTATUS PciIdeXFdoQueryId(_In_ PFDO_DEVICE_EXTENSION FdoExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
static DECLSPEC_NOINLINE_FROM_PAGED VOID AtaCtrlCallStopController(_In_ PATA_CONTROLLER Controller)
static NTSTATUS PciIdeXFdoStopDevice(_In_ PFDO_DEVICE_EXTENSION FdoExtension)
static VOID PciIdeXFdoFreeResources(_In_ PFDO_DEVICE_EXTENSION FdoExtension)
static VOID AtaCtrlPciSaveData(_Out_ PATA_CONTROLLER Controller, _In_ PPCI_COMMON_HEADER PciData)
static DECLSPEC_NOINLINE_FROM_PAGED VOID AtaCtrlCallStartController(_In_ PATA_CONTROLLER Controller)
static BOOLEAN AtaCtrlPciGetNextBarIndex(_In_ PPCI_COMMON_HEADER PciData, _Inout_ PULONG Bar)
PVOID AtaCtrlPciMapBar(_In_ PATA_CONTROLLER Controller, _In_range_(0, PCI_TYPE0_ADDRESSES) ULONG Index, _In_ ULONG MinimumIoLength)
IDE_CHANNEL_STATE PciIdeXGetChannelState(_In_ PATA_CONTROLLER Controller, _In_ ULONG Channel)
PCHANNEL_SET_MODE_EX SetTransferMode
struct _CHANNEL_DATA_COMMON::@1295 Current
PKINTERRUPT InterruptObject
ULONG ActiveQueuedSlotsBitmap
PATA_CONTROLLER Controller
PCHANNEL_ENABLE_INTERRUPTS EnableInterrupts
IDE_ACPI_TIMING_MODE_BLOCK CurrentTimingMode
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@494::@496 Port
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@494 u
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@494::@499 Memory
PDEVICE_OBJECT Objects[1]
FAST_MUTEX PdoListSyncMutex
ATA_CONTROLLER Controller
struct _IO_STACK_LOCATION::@5020::@5045 QueryDeviceRelations
union _IO_STACK_LOCATION::@1814 Parameters
struct _LIST_ENTRY * Flink
COMMON_DEVICE_EXTENSION Common
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller
#define STATUS_IO_DEVICE_ERROR
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
PUSBHUB_PORT_PDO_EXTENSION NTAPI PdoExt(IN PDEVICE_OBJECT DeviceObject)
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ PDEVICE_OBJECT DeviceObject
_In_ WDFCMRESLIST _In_ WDFCMRESLIST ResourcesTranslated
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesRead
#define IsEqualGUIDAligned(guid1, guid2)
#define HalGetInterruptTranslator
#define IoAcquireRemoveLock(RemoveLock, Tag)
#define IoReleaseRemoveLockAndWait(_RemoveLock, _Tag)
#define IoReleaseRemoveLock(_RemoveLock, _Tag)
#define IoInitializeRemoveLock(Lock, AllocateTag, MaxLockedMinutes, HighWatermark)
#define IRP_MN_CANCEL_STOP_DEVICE
#define IRP_MN_QUERY_PNP_DEVICE_STATE
#define PCI_WHICHSPACE_CONFIG
#define PCI_ADDRESS_IO_ADDRESS_MASK
#define IRP_MN_QUERY_INTERFACE
#define PCI_TYPE0_ADDRESSES
#define IRP_MN_START_DEVICE
#define IRP_MN_DEVICE_USAGE_NOTIFICATION
#define PCI_ADDRESS_IO_SPACE
#define IRP_MN_REMOVE_DEVICE
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define PCI_ADDRESS_MEMORY_ADDRESS_MASK
#define IRP_MN_QUERY_STOP_DEVICE
struct _PCI_COMMON_HEADER * PPCI_COMMON_HEADER
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define PCI_ADDRESS_MEMORY_PREFETCHABLE
#define IRP_MN_STOP_DEVICE
#define PCI_ADDRESS_MEMORY_TYPE_MASK
struct _TRANSLATOR_INTERFACE * PTRANSLATOR_INTERFACE
#define IRP_MN_QUERY_REMOVE_DEVICE
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define ObReferenceObject