//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 1997 - 1999
//
//  File:       chanpdo.h
//
//--------------------------------------------------------------------------

#if !defined (___chanpdo_h___)
#define ___chanpdo_h___


typedef enum BMSTATE {
    BmIdle,
    BmSet,
    BmArmed,
    BmDisarmed,
} BMSTATE;


#define PDOS_STARTED          (1 << 0)
#define PDOS_DEADMEAT         (1 << 1)
#define PDOS_STOPPED          (1 << 2)
#define PDOS_REMOVED          (1 << 3)
#define PDOS_SURPRISE_REMOVED (1 << 4)
#define PDOS_DISABLED_BY_USER (1 << 5)

typedef struct _PHYSICAL_REGION_DESCRIPTOR * PPHYSICAL_REGION_DESCRIPTOR;

typedef struct _CHANNEL_PDO_EXTENSION {

    EXTENSION_COMMON_HEADER;

    PCTRLFDO_EXTENSION  ParentDeviceExtension;

    ULONG               ChannelNumber;

    KSPIN_LOCK          SpinLock;
    ULONG               PdoState;

    DMADETECTIONLEVEL   DmaDetectionLevel;

    ULONG               RefCount;

    ULONG               PnPDeviceState;

    //
    // Busmaster Properties
    //
    PIDE_BUS_MASTER_REGISTERS   BmRegister;
    PDMA_ADAPTER                DmaAdapterObject;
    ULONG                       MaximumPhysicalPages;
    PPHYSICAL_REGION_DESCRIPTOR RegionDescriptorTable;
    PHYSICAL_ADDRESS            PhysicalRegionDescriptorTable;
    PVOID                       DataVirtualAddress;
    PSCATTER_GATHER_LIST        HalScatterGatherList;
    ULONG                       TransferLength;
    PVOID                       MapRegisterBase;
    PMDL                        Mdl;
    BOOLEAN                     DataIn;
    VOID                        (* BmCallback) (PVOID Context);
    PVOID                       BmCallbackContext;
    BMSTATE                     BmState;

    UCHAR                       BootBmStatus;

    BOOLEAN                     EmptyChannel;
    BOOLEAN                     NeedToCallIoInvalidateDeviceRelations;

} CHANPDO_EXTENSION, *PCHANPDO_EXTENSION;

PCHANPDO_EXTENSION
ChannelGetPdoExtension(
    PDEVICE_OBJECT DeviceObject
    );

ULONG
ChannelUpdatePdoState(
    PCHANPDO_EXTENSION PdoExtension,
    ULONG SetFlags,
    ULONG ClearFlags
    );

NTSTATUS
ChannelStartDevice (
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    );

NTSTATUS
ChannelQueryStopRemoveDevice (
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    );

NTSTATUS
ChannelRemoveDevice (
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    );

NTSTATUS
ChannelStopDevice (
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    );

NTSTATUS
ChannelStopChannel (
    PCHANPDO_EXTENSION pdoExtension
    );

NTSTATUS
ChannelQueryId (
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    );

PWSTR
ChannelBuildDeviceId(
    IN PCHANPDO_EXTENSION pdoExtension
    );

PWSTR
ChannelBuildInstanceId(
    IN PCHANPDO_EXTENSION pdoExtension
    );

PWSTR
ChannelBuildCompatibleId(
    IN PCHANPDO_EXTENSION pdoExtension
    );

PWSTR
ChannelBuildHardwareId(
    IN PCHANPDO_EXTENSION pdoExtension
    );

NTSTATUS
ChannelQueryCapabitilies (
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    );

NTSTATUS
ChannelQueryResources(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
ChannelQueryResourceRequirements(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
ChannelQueryResourceRequirementsCompletionRoutine (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

NTSTATUS
ChannelInternalDeviceIoControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );
    
NTSTATUS
ChannelQueryText (
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    );

NTSTATUS
PciIdeChannelQueryInterface (
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    );
    
NTSTATUS
PciIdeChannelTransferModeInterface (
    IN PCHANPDO_EXTENSION PdoExtension,
    PPCIIDE_XFER_MODE_INTERFACE XferMode
    );

NTSTATUS
PciIdeChannelTransferModeSelect (
    IN PCHANPDO_EXTENSION PdoExtension,
    PPCIIDE_TRANSFER_MODE_SELECT XferMode
    );
    
NTSTATUS
ChannelQueryDeviceRelations (
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    );
                         
NTSTATUS
ChannelUsageNotification (
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    );
            
NTSTATUS
ChannelQueryPnPDeviceState (
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    );
                         
VOID
PciIdeChannelRequestProperResources(
    IN PDEVICE_OBJECT DeviceObject
    );

NTSTATUS
ChannelFilterResourceRequirements (
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    );

#ifdef ENABLE_NATIVE_MODE
NTSTATUS
PciIdeInterruptControl (
	IN PVOID Context,
	IN ULONG DisConnect
	);

NTSTATUS
PciIdeChannelInterruptInterface (
    IN PCHANPDO_EXTENSION PdoExtension,
    PPCIIDE_INTERRUPT_INTERFACE InterruptInterface
    );
#endif

#endif // ___chanpdo_h___