26 Fis->Device =
Request->TaskFile.DriveSelect;
75 Fis->Features = TaskFile->
Feature;
76 Fis->LbaLow = TaskFile->
LowLba;
77 Fis->LbaMid = TaskFile->
MidLba;
78 Fis->LbaHigh = TaskFile->
HighLba;
83 Fis->SectorCount |=
Request->Slot << 3;
95 Fis->Icc = TaskFile->
Icc;
142 IssueSlot = 1 <<
Request->Slot;
144 ChanData->ActiveSlotsBitmap |= IssueSlot;
148 ChanData->ActiveQueuedSlotsBitmap |= IssueSlot;
239 for (
i = 0;
i <
SgList->NumberOfElements; ++
i)
244 ASSERT(Is64BitDma || (
SgList->Elements[
i].Address.HighPart == 0));
245 ASSERT(i < ChanData->MaximumPhysicalPages);
311 CommandsCompleted &= ~(1 << Slot);
313 Request = ChanData->Slots[Slot];
331 Request->SrbStatus = SrbStatus;
346 ULONG InterruptStatus, CommandsIssued, CommandsCompleted;
353 TRACE(
"CH %lu: Intr %08lx\n", ChanData->Channel, InterruptStatus);
360 if (ChanData->ActiveQueuedSlotsBitmap != 0)
364 CommandsIssued =
AHCI_PORT_READ(ChanData->IoBase, CommandRegister);
365 CommandsCompleted = ~CommandsIssued & ChanData->ActiveSlotsBitmap;
368 if (CommandsCompleted != 0)
370 ChanData->ActiveSlotsBitmap &= ~CommandsCompleted;
371 ChanData->ActiveQueuedSlotsBitmap &= ~CommandsCompleted;
374 ChanData->PortNotification(
AtaRequestComplete, ChanData->PortContext, CommandsCompleted);
386 WARN(
"CH %lu: Notification %08lx arrived\n", ChanData->Channel,
Message);
411 ULONG Port, InterruptStatus, PortInterruptBitmap;
414 if (InterruptStatus == 0)
417 PortInterruptBitmap = InterruptStatus & Controller->
ChannelBitmap;
420 PortInterruptBitmap &= ~(1 <<
Port);
#define AHCI_PRD_INTERRUPT_ON_COMPLETION
#define AHCI_MAX_PRDT_ENTRIES
#define AHCI_FBS_ISSUE_SHIFT
FORCEINLINE VOID AHCI_PORT_WRITE(_In_ PVOID PortIoBase, _In_ AHCI_PORT_REGISTER Register, _In_ ULONG Value)
#define AHCI_COMMAND_HEADER_PMP_SHIFT
#define AHCI_COMMAND_HEADER_WRITE
#define AHCI_PXIRQ_PORT_STATUS
#define AHCI_FIS_REGISTER_HOST_TO_DEVICE
#define AHCI_MAX_PRD_LENGTH
#define AHCI_PXIRQ_FATAL_ERROR
enum _AHCI_PORT_REGISTER AHCI_PORT_REGISTER
#define AHCI_COMMAND_HEADER_PRDT_LENGTH_SHIFT
FORCEINLINE ULONG AHCI_PORT_READ(_In_ PVOID PortIoBase, _In_ AHCI_PORT_REGISTER Register)
FORCEINLINE ULONG AHCI_HBA_READ(_In_ PVOID HbaIoBase, _In_ AHCI_HOST_BUS_ADAPTER_REGISTER Register)
FORCEINLINE VOID AHCI_HBA_WRITE(_In_ PVOID HbaIoBase, _In_ AHCI_HOST_BUS_ADAPTER_REGISTER Register, _In_ ULONG Value)
#define AHCI_COMMAND_HEADER_ATAPI
VOID AtaAhciHandleFatalError(_In_ PCHANNEL_DATA_AHCI ChanData)
VOID AtaAhciHandlePortStateChange(_In_ PCHANNEL_DATA_AHCI ChanData, _In_ ULONG InterruptStatus)
VOID AtaAhciSaveTaskFile(_In_ PCHANNEL_DATA_AHCI ChanData, _Inout_ PATA_DEVICE_REQUEST Request, _In_ BOOLEAN ProcessErrorStatus)
static VOID AtaAhciBuildPacketCommandFis(_In_ ATA_DEVICE_REQUEST *__restrict Request, _Out_ AHCI_FIS_HOST_TO_DEVICE *__restrict Fis)
static VOID AtaAhciTransferACMDRegion(_In_ VOID *__restrict Destination, _In_ VOID *__restrict Source, _In_ ATA_IO_CONTEXT_COMMON *__restrict Device)
static VOID AtaAhciBeginHostToDeviceFis(_In_ ATA_DEVICE_REQUEST *__restrict Request, _Out_ AHCI_FIS_HOST_TO_DEVICE *__restrict Fis)
static VOID AtaAhciPortHandleInterrupt(_In_ PCHANNEL_DATA_AHCI ChanData)
static VOID AtaAhciBuildAtaCommandFis(_In_ ATA_DEVICE_REQUEST *__restrict Request, _Out_ AHCI_FIS_HOST_TO_DEVICE *__restrict Fis)
static VOID AtaAhciPortCompleteCommands(_In_ PCHANNEL_DATA_AHCI ChanData, _In_ ULONG CommandsCompleted)
#define REQUEST_FLAG_SET_AUXILIARY_FIELD
#define REQUEST_FLAG_DATA_IN
_In_ PATA_DEVICE_REQUEST _In_ BOOLEAN Allocate
#define REQUEST_FLAG_DEVICE_EXCLUSIVE_ACCESS
#define REQUEST_FLAG_DATA_OUT
#define DEVICE_NEED_DMA_DIRECTION
#define REQUEST_FLAG_HAS_SG_LIST
#define REQUEST_FLAG_SAVE_TASK_FILE
@ AtaAsyncNotificationDetected
#define REQUEST_FLAG_SET_ICC_FIELD
#define ATA_MIN_BUFFER_ALIGNMENT
#define IDE_FEATURE_DMADIR
#define IDE_COMMAND_ATAPI_PACKET
static const WCHAR Message[]
#define SRB_STATUS_DATA_OVERRUN
#define SRB_STATUS_SUCCESS
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
#define REQUEST_FLAG_LBA48
#define REQUEST_FLAG_PACKET_COMMAND
#define REQUEST_FLAG_SET_DEVICE_REGISTER
unsigned __int64 * PULONG64
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
#define ATAPI_MAX_DRQ_DATA_BLOCK
CHANNEL_PREPARE_IO AtaAhciPrepareIo
#define CHANNEL_FLAG_IS_PMP
#define CHANNEL_FLAG_FBS_ENABLED
#define DEV_NUMBER(Device)
CHANNEL_ALLOCATE_SLOT AtaAhciAllocateSlot
CHANNEL_PREPARE_PRD_TABLE AtaAhciPreparePrdTable
KSERVICE_ROUTINE AtaAhciHbaIsr
CHANNEL_START_IO AtaAhciStartIo
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB Cdb
unsigned char _BitScanForward(unsigned long *_Index, unsigned long _Mask)
#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
AHCI_COMMAND_HEADER CommandHeader[ANYSIZE_ARRAY]
AHCI_FIS_HOST_TO_DEVICE HostToDeviceFis
AHCI_PRD_TABLE_ENTRY PrdTable[ANYSIZE_ARRAY]
PVOID Channels[MAX_CHANNELS]
UCHAR MidLba
LBA bits 8-15.
UCHAR LowLbaEx
LBA bits 24-31.
UCHAR HighLba
LBA bits 16-23.
UCHAR Icc
Isochronous Command Completion.
UCHAR HighLbaEx
LBA bits 40-47.
UCHAR LowLba
LBA bits 0-7.
UCHAR MidLbaEx
LBA bits 32-39.
PAHCI_COMMAND_TABLE CommandTable[AHCI_MAX_COMMAND_SLOTS]
UCHAR LastFbsDeviceNumber
PAHCI_COMMAND_LIST CommandList
UCHAR LastPmpDeviceNumber
#define FIELD_OFFSET(t, f)
#define RtlZeroMemory(Destination, Length)
_Must_inspect_result_ _In_ WDFDEVICE Device
WDF_EXTERN_C_START typedef _In_ WDFDEVICE _In_ WDFCONTEXT _In_ WDF_DMA_DIRECTION _In_ PSCATTER_GATHER_LIST SgList
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFINTERRUPT * Interrupt
_In_ WDF_WMI_PROVIDER_CONTROL Control
struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _In_ LARGE_INTEGER ByteCount