windows-nt/Source/XPSP1/NT/drivers/storage/ide/atapi/devpdo.h
2020-09-26 16:20:57 +08:00

525 lines
11 KiB
C

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: devpdo.h
//
//--------------------------------------------------------------------------
#if !defined (___devpdo_h___)
#define ___devpdo_h___
#define PNP_ADDRESS(target, lun) ((target & 0xf) | (lun << 4))
typedef struct _PDO_STOP_QUEUE_CONTEXT {
PPDO_EXTENSION PdoExtension;
KEVENT Event;
ULONG QueueStopFlag;
NTSTATUS Status;
ATA_PASS_THROUGH AtaPassThroughData;
} PDO_STOP_QUEUE_CONTEXT, *PPDO_STOP_QUEUE_CONTEXT;
//
// PDO State
//
#define PDOS_DEVICE_CLIAMED (1 << 0)
#define PDOS_LEGACY_ATTACHER (1 << 1)
#define PDOS_STARTED (1 << 2)
#define PDOS_STOPPED (1 << 3)
#define PDOS_SURPRISE_REMOVED (1 << 4)
#define PDOS_REMOVED (1 << 5)
#define PDOS_DEADMEAT (1 << 6)
#define PDOS_NO_POWER_DOWN (1 << 7)
#define PDOS_QUEUE_FROZEN_BY_POWER_DOWN (1 << 8)
#define PDOS_QUEUE_FROZEN_BY_SLEEPING_SYSTEM (1 << 9)
#define PDOS_QUEUE_FROZEN_BY_STOP_DEVICE (1 << 10)
#define PDOS_QUEUE_FROZEN_BY_PARENT (1 << 11)
#define PDOS_QUEUE_FROZEN_BY_START (1 << 12)
#define PDOS_DISABLED_BY_USER (1 << 13)
#define PDOS_NEED_RESCAN (1 << 14)
#define PDOS_REPORTED_TO_PNP (1 << 15)
#define PDOS_INITIALIZED (1 << 31)
#define PDOS_MUST_QUEUE (PDOS_QUEUE_FROZEN_BY_SLEEPING_SYSTEM |\
PDOS_QUEUE_FROZEN_BY_STOP_DEVICE |\
PDOS_QUEUE_FROZEN_BY_PARENT |\
PDOS_QUEUE_FROZEN_BY_START)
#define PDOS_QUEUE_BLOCKED (PDOS_MUST_QUEUE | PDOS_QUEUE_FROZEN_BY_POWER_DOWN)
#define PDO_CONSECUTIVE_PAGING_TIMEOUT_LIMIT 20
#define PDO_CONSECUTIVE_TIMEOUT_LIMIT 6
#define PDO_CONSECUTIVE_TIMEOUT_WARNING_LIMIT (PDO_CONSECUTIVE_TIMEOUT_LIMIT/2)
#define PDO_DMA_TIMEOUT_LIMIT 6
#define PDO_FLUSH_TIMEOUT_LIMIT 3
#define PDO_UDMA_CRC_ERROR_LIMIT 6
#define PDO_PAGING_DEVICE_RETRY_COUNT 6
typedef enum {
enumFailed = 1,
reportedMissing,
tooManyTimeout,
byKilledPdo,
replacedByUser
} DEADMEAT_REASON;
//
// Ide Power Context (pre-alloced)
//
typedef struct _IDE_POWER_CONTEXT {
PPDO_EXTENSION PdoExtension;
PIRP PowerIrp;
ATA_PASS_THROUGH AtaPassThroughData;
} IDE_POWER_CONTEXT, *PIDE_POWER_CONTEXT;
//
// Device Extension
//
typedef struct _PDO_EXTENSION {
EXTENSION_COMMON_HEADER;
PFDO_EXTENSION ParentDeviceExtension;
PULONG IdleCounter;
KEVENT RemoveEvent;
ULONG ConsecutiveTimeoutCount;
ULONG DmaTransferTimeoutCount;
ULONG FlushCacheTimeoutCount;
ULONG CrcErrorCount;
UCHAR PathId;
UCHAR TargetId;
UCHAR Lun;
UCHAR RetryCount;
ULONG LuFlags;
ULONG CurrentKey;
struct _PDO_EXTENSION *NextLogicalUnit;
PSCSI_REQUEST_BLOCK AbortSrb;
struct _PDO_EXTENSION *CompletedAbort;
LONG RequestTimeoutCounter;
PIRP PendingRequest;
PIRP BusyRequest;
//UCHAR MaxQueueDepth;
//UCHAR QueueCount;
SRB_DATA SrbData;
UCHAR ScsiDeviceType;
UCHAR FullVendorProductId[40 + 1];
UCHAR FullProductRevisionId[8 + 1];
UCHAR FullSerialNumber[20 * 2 + 1];
//
// (ata device only) indicate whether the write cache is enabled
//
BOOLEAN WriteCacheEnable;
//
// SpinLock to protect Pdo Extension
//
KSPIN_LOCK PdoSpinLock;
//
// If the logical is attached, this field contains
// the device object of the attacher. Otherwise,
// it is same as PhysicalDeviceObject
//
PVOID AttacherDeviceObject;
//
// Number of references made to this logical unit extension
//
// Protected by Pdo SpinLock
//
// should be LONG: ASSERT when we try to decrement 0.
ULONG ReferenceCount;
//
// keeping track of Pdo State
//
ULONG PdoState;
PIRP PendingPowerDownSystemIrp;
//
// indicate we need to call DeviceQueryInitData()
// protected by interlock
//
ULONG InitDeviceWithAcpiGtf;
//
// iddata checksum
//
ULONG IdentifyDataCheckSum;
//
// firmware settings from acpi
//
// must get it before we power down
PDEVICE_SETTINGS AcpiDeviceSettings;
IDE_POWER_CONTEXT PdoPowerContext;
#if DBG
ULONG PowerContextLock;
#endif
#ifdef LOG_DEADMEAT_EVENT
struct {
DEADMEAT_REASON Reason;
PUCHAR FileName;
ULONG LineNumber;
IDEREGS IdeReg;
} DeadmeatRecord;
#endif // LOG_DEADMEAT_EVENT
#if DBG
//
// Number of Items queued up in Device Queue
//
ULONG NumberOfIrpQueued;
#define TAG_TABLE_SIZE 0x1000
KSPIN_LOCK RefCountSpinLock;
ULONG NumTagUsed;
PVOID TagTable[TAG_TABLE_SIZE];
#endif
} PDO_EXTENSION, *PPDO_EXTENSION;
typedef PDO_EXTENSION LOGICAL_UNIT_EXTENSION;
typedef PPDO_EXTENSION PLOGICAL_UNIT_EXTENSION;
typedef VOID (*DEVICE_INIT_COMPLETION) (
PVOID Context,
NTSTATUS Status
);
typedef enum _DEVICE_INIT_STATE {
deviceInitState_acpi = 0,
deviceInitState_done,
deviceInitState_max
} DEVICE_INIT_STATE;
typedef struct _DEVICE_INIT_DEVICE_STATE_CONTEXT {
PPDO_EXTENSION PdoExtension;
DEVICE_INIT_STATE DeviceInitState[deviceInitState_max];
ULONG CurrentState;
ULONG NumInitState;
ULONG NumAcpiRequestSent;
ULONG NumRequestFailed;
DEVICE_INIT_COMPLETION DeviceInitCompletionRoutine;
PVOID DeviceInitCompletionContext;
ATA_PASS_THROUGH AtaPassThroughData;
} DEVICE_INIT_DEVICE_STATE_CONTEXT, *PDEVICE_INIT_DEVICE_STATE_CONTEXT;
#define DEVICE_DEFAULT_IDLE_TIMEOUT 0xffffffff
#define DEVICE_VERY_LONG_IDLE_TIMEOUT 0xfffffffe
typedef struct _IDE_READ_CAPACITY_CONTEXT {
PPDO_EXTENSION PdoExtension;
PIRP OriginalIrp;
PVOID OldDataBuffer;
ATA_PASS_THROUGH AtaPassThroughData;
UCHAR DataBuffer[sizeof(IDENTIFY_DATA)];
BOOLEAN GeometryIoctl;
} IDE_READ_CAPACITY_CONTEXT, *PIDE_READ_CAPACITY_CONTEXT;
typedef struct _IDE_MODE_COMMAND_CONTEXT {
PSCSI_REQUEST_BLOCK Srb;
PVOID OriginalDataBuffer;
} IDE_MODE_COMMAND_CONTEXT, *PIDE_MODE_COMMAND_CONTEXT;
PDEVICE_OBJECT
DeviceCreatePhysicalDeviceObject (
IN PDRIVER_OBJECT DriverObject,
IN PFDO_EXTENSION FdoExtension,
IN PUNICODE_STRING DeviceObjectName
);
NTSTATUS
DeviceStartDevice (
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
);
NTSTATUS
DeviceStartDeviceQueue (
IN PPDO_EXTENSION PdoExtension,
IN ULONG StopFlagToClear
);
NTSTATUS
DeviceStopDevice (
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
);
NTSTATUS
DeviceStopDeviceQueueSafe (
IN PPDO_EXTENSION PdoExtension,
IN ULONG QueueStopFlag,
IN BOOLEAN lowMem
);
VOID
IdeStopQueueCompletionRoutine (
IN PDEVICE_OBJECT DeviceObject,
IN PPDO_STOP_QUEUE_CONTEXT Context,
IN NTSTATUS Status
);
NTSTATUS
DeviceRemoveDevice (
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
);
NTSTATUS
DeviceUsageNotification (
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
);
NTSTATUS
DeviceQueryStopRemoveDevice (
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
);
NTSTATUS
DeviceQueryId (
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
);
PWSTR
DeviceBuildBusId (
IN PPDO_EXTENSION pdoExtension
);
PWSTR
DeviceBuildInstanceId (
IN PPDO_EXTENSION pdoExtension
);
PWSTR
DeviceBuildCompatibleId(
IN PPDO_EXTENSION pdoExtension
);
PWSTR
DeviceBuildHardwareId(
IN PPDO_EXTENSION pdoExtension
);
VOID
CopyField(
IN PUCHAR Destination,
IN PUCHAR Source,
IN ULONG Count,
IN UCHAR Change
);
NTSTATUS
DeviceDeviceIoControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DeviceBuildStorageDeviceDescriptor(
PPDO_EXTENSION pdoExtension,
IN OUT PSTORAGE_DEVICE_DESCRIPTOR StorageDeviceDescriptor,
IN OUT PULONG BufferSize
);
NTSTATUS
DeviceQueryCapabilities (
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
);
NTSTATUS
IdePortInsertByKeyDeviceQueue (
IN PPDO_EXTENSION PdoExtension,
IN PIRP Irp,
IN ULONG SortKey,
OUT PBOOLEAN Inserted
);
VOID
DeviceInitCompletionRoutine (
PVOID Context,
NTSTATUS Status
);
NTSTATUS
DeviceQueryText (
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
);
NTSTATUS
IdePortSendPassThrough (
IN PPDO_EXTENSION PdoExtension,
IN PIRP Irp
);
VOID
DeviceRegisterIdleDetection (
IN PPDO_EXTENSION PdoExtension,
IN ULONG ConservationIdleTime,
IN ULONG PerformanceIdleTime
);
VOID
DeviceUnregisterIdleDetection (
IN PPDO_EXTENSION PdoExtension
);
VOID
DeviceInitIdStrings (
IN PPDO_EXTENSION PdoExtension,
IN IDE_DEVICETYPE DeviceType,
IN PINQUIRYDATA InquiryData,
IN PIDENTIFY_DATA IdentifyData
);
VOID
DeviceInitDeviceType (
IN PPDO_EXTENSION PdoExtension,
IN PINQUIRYDATA InquiryData
);
NTSTATUS
DeviceQueryDeviceRelations (
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
);
NTSTATUS
DeviceInitDeviceState (
IN PPDO_EXTENSION PdoExtension,
DEVICE_INIT_COMPLETION DeviceInitCompletionRoutine,
PVOID DeviceInitCompletionContext
);
NTSTATUS
DeviceQueryInitData (
IN PPDO_EXTENSION PdoExtension
);
VOID
DeviceInitDeviceStateCompletionRoutine (
PDEVICE_OBJECT DeviceObject,
PVOID Context,
NTSTATUS Status
);
VOID
DeviceInitCHS (
IN PPDO_EXTENSION PdoExtension,
PDEVICE_INIT_DEVICE_STATE_CONTEXT DeviceStateContext,
PATA_PASS_THROUGH AtaPassThroughData
);
NTSTATUS
DeviceIdeReadCapacity (
IN PPDO_EXTENSION PdoExtension,
IN OUT PIRP Irp
);
VOID
DeviceIdeReadCapacityCompletionRoutine (
IN PDEVICE_OBJECT DeviceObject,
PVOID Context,
NTSTATUS Status
);
NTSTATUS
DeviceIdeModeSense (
IN PPDO_EXTENSION PdoExtension,
IN OUT PIRP Irp
);
NTSTATUS
DeviceIdeModeSelect (
IN PPDO_EXTENSION PdoExtension,
IN OUT PIRP Irp
);
NTSTATUS
DeviceQueryPnPDeviceState (
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
);
NTSTATUS
DeviceIdeTestUnitReady (
IN PPDO_EXTENSION PdoExtension,
IN OUT PIRP Irp
);
NTSTATUS
DeviceAtapiModeSelect (
IN PPDO_EXTENSION PdoExtension,
IN PIRP Irp
);
NTSTATUS
DeviceAtapiModeSense (
IN PPDO_EXTENSION PdoExtension,
IN PIRP Irp
);
NTSTATUS
DeviceAtapiModeCommandCompletion (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
#endif // ___devpdo_h___