36 Action &= ~ACTION_DEVICE_ERROR;
40 ASSERT(PortData->Worker.FailedRequest ==
NULL);
41 PortData->Worker.FailedRequest = FailedRequest;
46 Action &= ~ACTION_DEVICE_ERROR;
52 if ((PortData->ActiveSlotsBitmap & 1) &&
60 PortData->ActiveSlotsBitmap &= ~1;
67 PortData->Worker.PausedSlotsBitmap |= PortData->ActiveSlotsBitmap;
68 PortData->ActiveSlotsBitmap = 0;
102 TRACE(
"Clear dev action %lx, total %lx\n",
Action, DevExt->Worker.EventsPending & ~
Action);
216 PortData->ActiveSlotsBitmap &= ~CommandsCompleted;
222 CommandsCompleted &= ~(1 << Slot);
224 Request = PortData->Slots[Slot];
241 if (++DevExt->Worker.ResetRetryCount >= 4)
243 ERR(
"CH %lu: Too many reset attempts for the device %u, giving up\n",
244 PortData->PortNumber,
245 DevExt->Device.AtaScsiAddress.TargetId);
249 PortData->Worker.BadDeviceBitmap |= 1 << (
ULONG)DevExt->Device.AtaScsiAddress.TargetId;
262 PortData->Worker.DeviceCount = PortData->EnumerateChannel(PortData->ChannelContext);
265 INFO(
"CH %lu: Detected %lu devices\n", PortData->PortNumber, PortData->Worker.DeviceCount);
285 if (AtaScsiAddress.
TargetId >= PortData->Worker.DeviceCount)
298 PortData->ResetChannel(PortData->ChannelContext);
313 if (++PortData->Worker.ResetRetryCount >= 10)
315 ERR(
"CH %lu: Too many port reset attempts, giving up\n", PortData->PortNumber);
316 PortData->Worker.BadDeviceBitmap =
MAXULONG;
332 DevExt = PortData->
Worker.EnumDevExt;
479 Request = PortData->Worker.FailedRequest;
480 if (
Request && !(PortData->Worker.PausedSlotsBitmap & (1 <<
Request->Slot)))
484 PortData->Worker.FailedRequest =
NULL;
489 if (!(PortData->Worker.PausedSlotsBitmap & (1 <<
i)))
501 PortData->Worker.PausedSlotsBitmap = 0;
506 *
Action = 1 << EventIndex;
524 if (PortData->Worker.StateLoopCount++ > 1500)
526 ERR(
"CH %lu: Loop detected %lx\n", PortData->PortNumber,
527 PortData->Worker.EventsPending);
635 if (PowerIdleCounter)
642 PortData->Worker.Flags = 0;
643 PortData->Worker.BadDeviceBitmap = 0;
644 PortData->Worker.ResetRetryCount = 0;
646 PortData->Worker.StateLoopCount = 0;
698 DevExt->
Worker.
Flags &= ~DEV_WORKER_FLAG_HOLD_REFERENCE;
706 PortData->Worker.Flags &= ~WORKER_FLAG_NEED_RESCAN;
840 INFO(
"CH %lu: Send CDB %u %02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
841 PortData->PortNumber,
842 DevExt->Device.AtaScsiAddress.TargetId,
853 INFO(
"CH %lu: Send TF %u %02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
854 PortData->PortNumber,
855 DevExt->Device.AtaScsiAddress.TargetId,
862 Request->TaskFile.DriveSelect);
870 PortData->Worker.OldRequest = PortData->Slots[0];
876 PortData->ActiveTimersBitmap |= 1 << 0;
887 PortData->ActiveTimersBitmap = 0;
890 PortData->Slots[0] = PortData->Worker.OldRequest;
914 Request = PortData->Slots[Slot];
919 ERR(
"CH %lu: Slot %lu (%08lx) timed out %lx (%lus) %u '%s'\n",
920 PortData->PortNumber,
926 DevExt->FriendlyName);
929 ERR(
"CH %lu: CDB %02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
930 PortData->PortNumber,
941 ERR(
"CH %lu: TF %02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
942 PortData->PortNumber,
949 Request->TaskFile.DriveSelect);
enum _PORT_NOTIFICATION_TYPE PORT_NOTIFICATION_TYPE
struct _ATA_IO_CONTEXT_COMMON * PATA_IO_CONTEXT_COMMON
#define REQUEST_STATE_REQUEUE
#define REQUEST_FLAG_INTERNAL
@ AtaAsyncNotificationDetected
VOID AtaReqSendRequest(_In_ PATA_DEVICE_REQUEST Request)
#define PORT_FLAG_EXIT_THREAD
#define ASSERT_REQUEST(Request)
VOID AtaDeviceFlushPowerIrpQueue(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
#define PORT_INT_FLAG_IS_IO_ACTIVE
KDEFERRED_ROUTINE AtaPortWorkerSignalDpc
SLIST_HEADER AtapCompletionQueueList
#define DEV_WORKER_FLAG_HOLD_REFERENCE
KSTART_ROUTINE AtaPortWorkerThread
NTSTATUS AtaPortDeviceProcessConfig(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
#define PORT_QUEUE_FLAG_SIGNAL_STOP
enum _ATA_PORT_ACTION ATA_PORT_ACTION
struct _ATAPORT_IO_CONTEXT * PATAPORT_IO_CONTEXT
#define WORKER_FLAG_NEED_RESCAN
NTSTATUS AtaPortDeviceProcessError(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaReqFlushDeviceQueue(_In_ PATAPORT_IO_CONTEXT Device)
REQUEST_COMPLETION_ROUTINE AtaPortCompleteInternalRequest
#define QUEUE_FLAG_FROZEN_PORT_BUSY
DECLSPEC_NOINLINE_FROM_PAGED PATAPORT_DEVICE_EXTENSION AtaFdoFindNextDeviceByPath(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _Inout_ PATA_SCSI_ADDRESS AtaScsiAddress, _In_ BOOLEAN SearchRemoveDev, _In_ PVOID ReferenceTag)
PORT_NOTIFICATION AtaPortNotification
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaReqThawQueue(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ ULONG ReasonFlags)
VOID AtaReqStartCompletionDpc(_In_ PATA_DEVICE_REQUEST Request)
#define PORT_INT_FLAG_IGNORE_LINK_IRQ
#define DEV_WORKER_FLAG_REMOVED
FORCEINLINE BOOLEAN AtaPortQueueEmpty(_In_ PATAPORT_PORT_DATA PortData)
#define DEVICE_UNINITIALIZED
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaReqFreezeQueue(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ ULONG ReasonFlags)
#define DEVICE_PNP_STARTED
VOID AtaPortSelectTimings(_In_ PATAPORT_PORT_DATA PortData, _In_ BOOLEAN ForceCompatibleTimings)
ATA_DEVICE_STATUS AtaPortIdentifyDevice(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
#define WORKER_FLAG_COMPLETE_PORT_ENUM_EVENT
#define QUEUE_FLAG_FROZEN_REMOVED
NTSTATUS AtaPortDeviceProcessPowerChange(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
#define IDE_ERROR_COMMAND_ABORTED
BOOLEAN NTAPI KeInsertQueueDpc(IN PKDPC Dpc, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
#define SRB_STATUS_BUS_RESET
#define SRB_STATUS_TIMEOUT
#define SRB_STATUS_SUCCESS
#define KeRaiseIrql(irql, oldIrql)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeReleaseSpinLock(sl, irql)
#define KeLowerIrql(oldIrql)
#define KeSetEvent(pEvt, foo, foo2)
#define KeAcquireSpinLock(sl, irql)
#define KeGetCurrentIrql()
VOID NTAPI KeClearEvent(IN PKEVENT Event)
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 KeGetCurrentThread
#define REQUEST_FLAG_PACKET_COMMAND
volatile char *const const char modify _InterlockedAnd
#define UNREFERENCED_PARAMETER(P)
KIRQL NTAPI KeAcquireInterruptSpinLock(IN PKINTERRUPT Interrupt)
VOID NTAPI KeReleaseInterruptSpinLock(IN PKINTERRUPT Interrupt, IN KIRQL OldIrql)
NTSTATUS NTAPI PsTerminateSystemThread(IN NTSTATUS ExitStatus)
#define STATUS_ADAPTER_HARDWARE_ERROR
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
static VOID AtaPortOnResetNotification(_In_ PATAPORT_PORT_DATA PortData, _In_ ULONG DeviceBitmap)
static VOID AtaPortWaitForIdle(_In_ PATAPORT_PORT_DATA PortData)
static NTSTATUS AtaPortDeviceChangePower(_In_ PATAPORT_PORT_DATA PortData)
static ATA_PORT_ACTION AtaPortClearPortAction(_In_ PATA_WORKER_CONTEXT Context, _In_ ATA_PORT_ACTION Action)
static PATAPORT_DEVICE_EXTENSION AtaPortFindDeviceForAction(_In_ PATAPORT_PORT_DATA PortData, _In_ ATA_PORT_ACTION Action)
static NTSTATUS AtaPortEnumerateDevice(_In_ PATAPORT_PORT_DATA PortData, _In_ ATA_PORT_ACTION Action)
static BOOLEAN AtaPortClearDeviceAction(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ ATA_PORT_ACTION Action)
static VOID AtaPortExitStateMachine(_In_ PATAPORT_PORT_DATA PortData)
static NTSTATUS AtaPortConfigureDevice(_In_ PATAPORT_PORT_DATA PortData)
static BOOLEAN AtaPortGetNextEvent(_In_ PATAPORT_PORT_DATA PortData, _Out_ ATA_PORT_ACTION *Action)
VOID AtaPortTimeout(_In_ PATAPORT_PORT_DATA PortData, _In_ ULONG Slot)
static VOID AtaPortOnAsyncNotification(_In_ PATAPORT_PORT_DATA PortData, _In_ ULONG DeviceBitmap)
static NTSTATUS AtaPortResetPort(_In_ PATAPORT_PORT_DATA PortData)
static VOID AtaPortQueueEvent(_In_ PATAPORT_PORT_DATA PortData, _In_opt_ PATAPORT_DEVICE_EXTENSION DevExt, _In_opt_ PATA_DEVICE_REQUEST FailedRequest, _In_ ATA_PORT_ACTION Action)
static NTSTATUS AtaPortRecoveryFromError(_In_ PATAPORT_PORT_DATA PortData)
static NTSTATUS AtaPortSetTransferMode(_In_ PATAPORT_PORT_DATA PortData)
static VOID AtaPortMarkDeviceFailed(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
static VOID AtaPortWorkerClearSignal(_In_ PATAPORT_PORT_DATA PortData)
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaPortSignalWorkerThread(_In_ PATAPORT_PORT_DATA PortData)
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaDeviceQueueEvent(_In_ PATAPORT_PORT_DATA PortData, _In_opt_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ ATA_PORT_ACTION Action)
static VOID AtaPortOnRequestComplete(_In_ PATAPORT_PORT_DATA PortData, _In_ ULONG CommandsCompleted)
NTSTATUS AtaPortSendRequest(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
static NTSTATUS AtaPortEnumeratePort(_In_ PATAPORT_PORT_DATA PortData)
static VOID AtaPortRunStateMachine(_In_ PATAPORT_PORT_DATA PortData)
static VOID AtaPortEnterStateMachine(_In_ PATAPORT_PORT_DATA PortData)
long _InterlockedOr(_Interlocked_operand_ long volatile *_Value, long _Mask)
unsigned char _BitScanForward(unsigned long *_Index, unsigned long _Mask)
#define KeAcquireSpinLockAtDpcLevel(SpinLock)
#define KeReleaseSpinLockFromDpcLevel(SpinLock)
#define DECLSPEC_NOINLINE_FROM_PAGED
SINGLE_LIST_ENTRY PdoList
IO_REMOVE_LOCK RemoveLock
ATA_WORKER_DEVICE_CONTEXT Worker
ATAPORT_IO_CONTEXT Device
ATAPORT_COMMON_EXTENSION Common
ATA_SCSI_ADDRESS AtaScsiAddress
volatile LONG InterruptFlags
ATA_WORKER_CONTEXT Worker
volatile LONG EventsPending
struct _SINGLE_LIST_ENTRY * Next
#define CONTAINING_RECORD(address, type, field)
#define STATUS_IO_DEVICE_ERROR
_Must_inspect_result_ _In_ WDFDEVICE Device
_In_ WDF_SPECIAL_FILE_TYPE NotificationType
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
void int int ULONGLONG int va_list * ap
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
#define IoReleaseRemoveLock(_RemoveLock, _Tag)
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
_In_opt_ PVOID DeferredContext
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
#define PoSetDeviceBusy(IdlePointer)
#define InterlockedPushEntrySList(SListHead, SListEntry)