//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1997 - 1999 // // File: ctlrfdo.h // //-------------------------------------------------------------------------- #if !defined (___ctrlfdo_h___) #define ___ctrlfdo_h___ // // DeviceControlsFlags // // WARNING: all of these flags must be correctly reflected // in the mshdc.inf and txtsetuo.sif files // #define PCIIDEX_DCF_NO_ATAPI_DMA (1 << 0) // // determine how often we rescan for new unknown child. // unknown child is IDE channel which we don't know // it is enabled or not unless we pnp start the channel // and poke at it to find out. #define MIN_BUS_SCAN_PERIOD_IN_SEC 90 #define IsNativeMode(d) ((d)->NativeMode[0] && (d)->NativeMode[1]) struct _CONTROLLER_FDO_EXTENSION; typedef struct _CONTROLLER_FDO_EXTENSION * PCTRLFDO_EXTENSION; typedef struct _IDE_BUS_MASTER_REGISTERS * PIDE_BUS_MASTER_REGISTERS; typedef struct _DRIVER_OBJECT_EXTENSION { PCONTROLLER_PROPERTIES PciIdeGetControllerProperties; ULONG ExtensionSize; } DRIVER_OBJECT_EXTENSION, *PDRIVER_OBJECT_EXTENSION; typedef struct _FDO_POWER_CONTEXT { PIRP OriginalPowerIrp; POWER_STATE_TYPE newPowerType; POWER_STATE newPowerState; } FDO_POWER_CONTEXT, *PFDO_POWER_CONTEXT; typedef struct _PCIIDE_INTERRUPT_CONTEXT { PVOID DeviceExtension; ULONG ChannelNumber; } PCIIDE_INTERRUPT_CONTEXT, *PPCIIDE_INTERRUPT_CONTEXT; struct _CHANNEL_PDO_EXTENSION; typedef struct _CHANNEL_PDO_EXTENSION * PCHANPDO_EXTENSION; typedef struct _CONTROLLER_FDO_EXTENSION { EXTENSION_COMMON_HEADER; ULONG ControllerNumber; PDEVICE_OBJECT PhysicalDeviceObject; PCHANPDO_EXTENSION ChildDeviceExtension[MAX_IDE_CHANNEL]; ULONG NumberOfChildren; // // Interlocked* protected // ULONG NumberOfChildrenPowerUp; // // native mode channels // BOOLEAN NativeMode[MAX_IDE_CHANNEL]; // // initialized by AnalyzeResourceList() // BOOLEAN PdoCmdRegResourceFound[MAX_IDE_CHANNEL]; BOOLEAN PdoCtrlRegResourceFound[MAX_IDE_CHANNEL]; BOOLEAN PdoInterruptResourceFound[MAX_IDE_CHANNEL]; ULONG PdoResourceListSize[MAX_IDE_CHANNEL]; PCM_RESOURCE_LIST PdoResourceList[MAX_IDE_CHANNEL]; ULONG BmResourceListSize; PCM_RESOURCE_LIST BmResourceList; // // Bus Master Register // ULONG BusMasterBaseAddressSpace; PIDE_BUS_MASTER_REGISTERS TranslatedBusMasterBaseAddress; // // Vendor Specific Controller Properties // IDE_CONTROLLER_PROPERTIES ControllerProperties; // // Vendor Specific Device Extension // PVOID VendorSpecificDeviceEntension; // // Controller Object for serailizing access to broken PCI-IDE controller // // PCONTROLLER_OBJECT ControllerObject; // // mutex for setting pci config data // KSPIN_LOCK PciConfigDataLock; // // Special device specific parameter // ULONG DeviceControlsFlags; // // Bus Interface // BUS_INTERFACE_STANDARD BusInterface; // // Last BusScan Time in sec // ULONG LastBusScanTime; // // Flag to enable udma66 // ULONG EnableUDMA66; // // Timings for the different transfer modes // PULONG TransferModeTimingTable; // // Length of the table // ULONG TransferModeTableLength; // // Pre-alloced context structure for power routines // FDO_POWER_CONTEXT FdoPowerContext[MAX_IDE_CHANNEL]; #if DBG ULONG PowerContextLock[MAX_IDE_CHANNEL]; #endif #ifdef ENABLE_NATIVE_MODE // // Interrupt object // PKINTERRUPT InterruptObject[MAX_IDE_CHANNEL]; // // Context structure for the ISR // PCIIDE_INTERRUPT_CONTEXT InterruptContext[MAX_IDE_CHANNEL]; // // IDE resources for native mode controllers // IDE_RESOURCE IdeResource; // // Base register locations // IDE_REGISTERS_1 BaseIoAddress1[MAX_IDE_CHANNEL]; IDE_REGISTERS_2 BaseIoAddress2[MAX_IDE_CHANNEL]; // //interrupt // PCM_PARTIAL_RESOURCE_DESCRIPTOR IrqPartialDescriptors[MAX_IDE_CHANNEL]; // // Register length. // ULONG BaseIoAddress1Length[MAX_IDE_CHANNEL]; ULONG BaseIoAddress2Length[MAX_IDE_CHANNEL]; // // Max ide device/target-id // ULONG MaxIdeDevice[MAX_IDE_CHANNEL]; ULONG MaxIdeTargetId[MAX_IDE_CHANNEL]; // // Flags to close the interrupt window // BOOLEAN ControllerIsrInstalled; BOOLEAN NativeInterruptEnabled; BOOLEAN NoBusMaster[MAX_IDE_CHANNEL]; // // Native Ide Interface obtained from PCI // PCI_NATIVE_IDE_INTERFACE NativeIdeInterface; #endif } CTRLFDO_EXTENSION, *PCTRLFDO_EXTENSION; NTSTATUS ControllerAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject ); NTSTATUS ControllerStartDevice ( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS ControllerStartDeviceCompletionRoutine( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp, IN OUT PVOID Context ); NTSTATUS ControllerStopDevice ( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS ControllerStopController ( IN PCTRLFDO_EXTENSION fdoExtension ); NTSTATUS ControllerSurpriseRemoveDevice ( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS ControllerRemoveDevice ( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS ControllerRemoveDeviceCompletionRoutine ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); NTSTATUS ControllerQueryDeviceRelations ( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS ControllerQueryResourceRequirements( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS LoadControllerParameters ( PCTRLFDO_EXTENSION FdoExtension ); NTSTATUS AnalyzeResourceList ( PCTRLFDO_EXTENSION FdoExtension, PCM_RESOURCE_LIST ResourceList ); VOID ControllerOpMode ( IN PCTRLFDO_EXTENSION FdoExtension ); VOID EnablePCIBusMastering ( IN PCTRLFDO_EXTENSION FdoExtension ); IDE_CHANNEL_STATE PciIdeChannelEnabled ( IN PCTRLFDO_EXTENSION FdoExtension, IN ULONG Channel ); VOID ControllerTranslatorNull ( IN PVOID Context ); NTSTATUS ControllerTranslateResource ( IN PVOID Context, IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, IN RESOURCE_TRANSLATION_DIRECTION Direction, IN ULONG AlternativesCount OPTIONAL, IN IO_RESOURCE_DESCRIPTOR Alternatives[] OPTIONAL, IN PDEVICE_OBJECT PhysicalDeviceObject, OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target ); NTSTATUS ControllerTranslateRequirement ( IN PVOID Context, IN PIO_RESOURCE_DESCRIPTOR Source, IN PDEVICE_OBJECT PhysicalDeviceObject, OUT PULONG TargetCount, OUT PIO_RESOURCE_DESCRIPTOR *Target ); NTSTATUS ControllerQueryInterface ( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); VOID PciIdeInitControllerProperties ( IN PCTRLFDO_EXTENSION FdoExtension ); NTSTATUS ControllerUsageNotification ( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS ControllerUsageNotificationCompletionRoutine ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); NTSTATUS PciIdeGetBusStandardInterface( IN PCTRLFDO_EXTENSION FdoExtension ); NTSTATUS ControllerQueryPnPDeviceState ( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS PciIdeCreateTimingTable ( IN PCTRLFDO_EXTENSION FdoExtension ); #ifdef ENABLE_NATIVE_MODE NTSTATUS ControllerInterruptControl ( IN PCTRLFDO_EXTENSION FdoExtension, IN ULONG Channel, IN ULONG Disconnect ); BOOLEAN ControllerInterrupt( IN PKINTERRUPT Interrupt, PVOID Context ); NTSTATUS PciIdeGetNativeModeInterface( IN PCTRLFDO_EXTENSION FdoExtension ); #define ControllerEnableInterrupt(FdoExtension) \ if (FdoExtension->NativeIdeInterface.InterruptControl) { \ (FdoExtension->NativeIdeInterface).InterruptControl((FdoExtension->NativeIdeInterface).Context,\ TRUE);\ } #define ControllerDisableInterrupt(FdoExtension) \ if (FdoExtension->NativeIdeInterface.InterruptControl) { \ (FdoExtension->NativeIdeInterface).InterruptControl((FdoExtension->NativeIdeInterface).Context,\ FALSE);\ } #endif //ENABLE_NATIVE_MODE #endif // ___ctrlfdo_h___