18 ULONG InterruptStatus;
19 UCHAR RirbStatus, CorbStatus;
23 DeviceExtension = static_cast<PHDA_FDO_DEVICE_EXTENSION>(
DeviceObject->DeviceExtension);
29 DPRINT1(
"HDA_InterruptService %lx\n", InterruptStatus);
53 DPRINT1(
"hda: RIRB Overflow\n");
61 DPRINT1(
"hda: CORB Memory Error!\n");
67 if ((intrStatus & (1 <<
index)) != 0) {
68 if (controller->streams[
index]) {
69 if (stream_handle_interrupt(controller,
71 handled = B_INVOKE_SCHEDULER;
75 dprintf(
"hda: Stream interrupt for unconfigured stream " 99 DeviceExtension = static_cast<PHDA_FDO_DEVICE_EXTENSION>(
DeviceObject->DeviceExtension);
109 DPRINT1(
"Response %lx ResponseFlags %lx Cad %lx\n",
Response, ResponseFlags, Cad);
112 Codec = DeviceExtension->
Codecs[Cad];
115 DPRINT1(
"hda: response for unknown codec %x Response %x ResponseFlags %x\n", Cad,
Response, ResponseFlags);
122 DPRINT1(
"too many responses for codec %x Response %x ResponseFlags %x\n", Cad,
Response, ResponseFlags);
146 ULONG Sent = 0, ReadPosition, WritePosition, Queued;
153 Codec->ResponseCount = 0;
163 if (WritePosition == ReadPosition) {
169 DeviceExtension->
CorbBase[WritePosition] = Verbs[
Sent++];
190 DPRINT1(
"HDA_SendVerbs: timeout! Queued: %u\n", Queued);
195 if (Responses !=
NULL) {
196 memcpy(Responses, Codec->Responses, Codec->ResponseCount *
sizeof(
ULONG));
211 ULONG NodeId, GroupType;
220 DPRINT1(
"hda: failed to allocate memory");
225 Entry->Addr = codecAddress;
255 DPRINT1(
"hda Codec %ld Vendor: %04lx Product: %04lx, Revision: %lu.%lu.%lu.%lu NodeStart %u NodeCount %u \n", codecAddress,
Response.vendor,
264 DPRINT1(
"Status %x NodeId %u GroupType %x\n",
Status, NodeId, GroupType);
272 DPRINT1(
"Too many audio groups in node %u. Skipping.\n", NodeId);
279 DPRINT1(
"hda: insufficient memory\n");
284 AudioGroup->
NodeId = NodeId;
288 DPRINT1(
"NodeId %x found an audio function group!\n", NodeId);
303 ChildDeviceExtension->
AudioGroup = AudioGroup;
311 Entry->AudioGroups[
Entry->AudioGroupCount] = AudioGroup;
312 Entry->AudioGroupCount++;
328 USHORT corbReadPointer, rirbWritePointer, interruptValue, corbControl, rirbControl;
376 HighestPhysicalAddress.
QuadPart = 0x00000000FFFFFFFF;
421 DPRINT1(
"hda: CORB read pointer reset not acknowledged\n");
440 DPRINT1(
"hda: CORB read pointer reset failed\n");
474 ULONG InputStreams, OutputStreams, BiDirStreams,
Control;
475 UCHAR corbControl, rirbControl;
487 DPRINT1(
"NumInputStreams %u\n", InputStreams);
488 DPRINT1(
"NumOutputStreams %u\n", OutputStreams);
489 DPRINT1(
"NumBiDirStreams %u\n", BiDirStreams);
520 if (corbControl == 0 && rirbControl == 0)
523 if (corbControl != 0 || rirbControl != 0) {
524 DPRINT1(
"hda: unable to stop dma\n");
545 DPRINT1(
"hda: unable to reset controller\n");
561 DPRINT1(
"hda: unable to exit reset\n");
603 DPRINT1(
"HDA_StartDevice Lower device failed to start %x\n",
Status);
621 DPRINT1(
"[HDAB] Failed to map registers\n");
641 DPRINT1(
"[HDAB] Failed to connect interrupt. Status=%lx\n",
Status);
673 DPRINT1(
"hda: bad codec status\n");
698 ULONG CodecIndex, AFGIndex;
704 DeviceExtension = static_cast<PHDA_FDO_DEVICE_EXTENSION>(
DeviceObject->DeviceExtension);
729 CodecEntry = DeviceExtension->
Codecs[CodecIndex];
730 if (CodecEntry ==
NULL)
739 if (ChildPDO !=
NULL)
741 ChildDeviceExtension = static_cast<PHDA_PDO_DEVICE_EXTENSION>(ChildPDO->
DeviceExtension);
744 ChildDeviceExtension->
FDO =
NULL;
776 if (DeviceExtension->
Codecs[CodecIndex] ==
NULL)
779 Codec = DeviceExtension->
Codecs[CodecIndex];
787 if (!DeviceRelations)
790 DeviceRelations->
Count = 0;
793 if (DeviceExtension->
Codecs[CodecIndex] ==
NULL)
796 Codec = DeviceExtension->
Codecs[CodecIndex];
802 DeviceRelations->
Count++;
#define DO_DEVICE_INITIALIZING
#define RIRB_STATUS_RESPONSE
#define GLOBAL_CONTROL_RESET
#define HDAC_DMA_POSITION_BASE_UPPER
NTKERNELAPI VOID NTAPI WRITE_REGISTER_ULONG(IN PULONG Register, IN ULONG Value)
#define HDA_MAX_AUDIO_GROUPS
#define STATUS_INSUFFICIENT_RESOURCES
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
NTSTATUS HDA_SendVerbs(IN PDEVICE_OBJECT DeviceObject, IN PHDA_CODEC_ENTRY Codec, IN PULONG Verbs, OUT PULONG Responses, IN ULONG Count)
#define CORB_CONTROL_MEMORY_ERROR_INTR
#define HDAC_INPUT_STREAM_OFFSET(index)
#define HDAC_RESPONSE_INTR_COUNT_MASK
#define INTR_STATUS_CONTROLLER
#define PID_SUB_NODE_COUNT
#define GLOBAL_CAP_OUTPUT_STREAMS(cap)
struct _DEVICE_OBJECT * PDEVICE_OBJECT
#define HDAC_INTR_CONTROL
BOOLEAN NTAPI IoForwardIrpSynchronously(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define RESPONSE_FLAGS_CODEC_MASK
PDEVICE_OBJECT Objects[1]
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFINTERRUPT * Interrupt
PVOID AllocateItem(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes)
struct HDA_FDO_DEVICE_EXTENSION * PHDA_FDO_DEVICE_EXTENSION
struct HDA_PDO_DEVICE_EXTENSION * PHDA_PDO_DEVICE_EXTENSION
#define HDAC_STREAM_CONTROL0
#define HDAC_RIRB_SIZE_MASK
#define STATUS_INVALID_DEVICE_REQUEST
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
#define GLOBAL_CAP_INPUT_STREAMS(cap)
NTKERNELAPI VOID NTAPI WRITE_REGISTER_USHORT(IN PUSHORT Register, IN USHORT Value)
PVOID NTAPI MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType)
NTKERNELAPI ULONG NTAPI READ_REGISTER_ULONG(IN PULONG Register)
#define RIRB_SIZE_16_ENTRIES
NTSTATUS NTAPI HDA_ResetController(IN PDEVICE_OBJECT DeviceObject)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
#define HDAC_RIRB_CONTROL
VOID NTAPI MmFreeContiguousMemory(IN PVOID BaseAddress)
#define INTR_STATUS_GLOBAL
NTSTATUS NTAPI HDA_FDOStartDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define HDAC_RIRB_WRITE_POS
_In_ PDEVICE_OBJECT DeviceObject
NTSTATUS NTAPI HDA_FDOQueryBusRelations(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
VOID FreeItem(IN PVOID Item)
PHDA_CODEC_ENTRY Codecs[HDA_MAX_CODECS+1]
#define HDAC_GLOBAL_CONTROL
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
NTSTATUS NTAPI HDA_InitCorbRirbPos(IN PDEVICE_OBJECT DeviceObject)
#define CORB_SIZE_2_ENTRIES
NTSTATUS NTAPI IoConnectInterrupt(OUT PKINTERRUPT *InterruptObject, IN PKSERVICE_ROUTINE ServiceRoutine, IN PVOID ServiceContext, IN PKSPIN_LOCK SpinLock, IN ULONG Vector, IN KIRQL Irql, IN KIRQL SynchronizeIrql, IN KINTERRUPT_MODE InterruptMode, IN BOOLEAN ShareVector, IN KAFFINITY ProcessorEnableMask, IN BOOLEAN FloatingSave)
struct RIRB_RESPONSE * PRIRB_RESPONSE
struct HDA_CODEC_AUDIO_GROUP * PHDA_CODEC_AUDIO_GROUP
#define MAX_CODEC_RESPONSES
PHDA_CODEC_AUDIO_GROUP AudioGroups[HDA_MAX_AUDIO_GROUPS]
#define HDAC_RESPONSE_INTR_COUNT
struct _DEVICE_RELATIONS * PDEVICE_RELATIONS
_In_ WDF_WMI_PROVIDER_CONTROL Control
#define RIRB_SIZE_2_ENTRIES
enum _KINTERRUPT_MODE KINTERRUPT_MODE
VOID NTAPI IoDisconnectInterrupt(PKINTERRUPT InterruptObject)
#define INTR_CONTROL_GLOBAL_ENABLE
#define HDAC_WAKE_ENABLE_MASK
WDF_EXTERN_C_START typedef _In_ WDFCMRESLIST Resources
#define RIRB_SIZE_CAP_2_ENTRIES
#define GLOBAL_CONTROL_UNSOLICITED
#define CORB_SIZE_256_ENTRIES
#define RIRB_WRITE_POS_RESET
#define FILE_AUTOGENERATED_DEVICE_NAME
NTSTATUS HDA_InitCodec(IN PDEVICE_OBJECT DeviceObject, IN ULONG codecAddress)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
#define RIRB_STATUS_OVERRUN
#define HDAC_RIRB_BASE_UPPER
ULONG Responses[MAX_CODEC_RESPONSES]
VOID NTAPI KeInitializeSemaphore(IN PKSEMAPHORE Semaphore, IN LONG Count, IN LONG Limit)
#define HDAC_CORB_BASE_LOWER
VOID NTAPI HDA_DpcForIsr(_In_ PKDPC Dpc, _In_opt_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp, _In_opt_ PVOID Context)
NTSTATUS HDA_PDORemoveDevice(_In_ PDEVICE_OBJECT DeviceObject)
#define HDAC_RIRB_CONTROL_MASK
#define NT_SUCCESS(StatCode)
_In_ WDFCOLLECTION _In_ ULONG Index
FORCEINLINE VOID IoRequestDpc(_Inout_ PDEVICE_OBJECT DeviceObject, _In_opt_ PIRP Irp, _In_opt_ __drv_aliasesMem PVOID Context)
#define PID_FUNCTION_GROUP_TYPE
#define MAKE_VERB(cad, nid, vid, payload)
#define CORB_SIZE_CAP_256_ENTRIES
_In_ PKSERVICE_ROUTINE _In_opt_ PVOID ServiceContext
#define HDAC_RIRB_BASE_LOWER
#define STATUS_UNSUCCESSFUL
#define INTR_CONTROL_CONTROLLER_ENABLE
#define RIRB_CONTROL_RESPONSE_INTR
PDEVICE_OBJECT LowerDevice
#define memcpy(s1, s2, n)
#define HDAC_CORB_CONTROL
#define FILE_DEVICE_SOUND
#define HDAC_STATE_STATUS
GLsizei const GLfloat * value
#define HDAC_CORB_BASE_UPPER
#define HDAC_CORB_WRITE_POS_MASK
#define FUNCTION_GROUP_NODETYPE_MASK
#define VID_GET_PARAMETER
#define CORB_SIZE_16_ENTRIES
NTKERNELAPI UCHAR NTAPI READ_REGISTER_UCHAR(IN PUCHAR Register)
#define HDAC_CORB_WRITE_POS
BOOLEAN NTAPI HDA_InterruptService(IN PKINTERRUPT Interrupt, IN PVOID ServiceContext)
#define CORB_READ_POS_RESET
#define RIRB_SIZE_256_ENTRIES
#define HDAC_STREAM_STATUS
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
struct HDA_CODEC_ENTRY * PHDA_CODEC_ENTRY
LONG NTAPI KeReleaseSemaphore(IN PKSEMAPHORE Semaphore, IN KPRIORITY Increment, IN LONG Adjustment, IN BOOLEAN Wait)
#define CORB_SIZE_CAP_2_ENTRIES
#define INTR_STATUS_STREAM_MASK
VOID NTAPI MmUnmapIoSpace(IN PVOID BaseAddress, IN SIZE_T NumberOfBytes)
#define GLOBAL_CAP_BIDIR_STREAMS(cap)
#define RESPONSE_FLAGS_UNSOLICITED
#define HDAC_CORB_CONTROL_MASK
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
PHDA_CODEC_AUDIO_GROUP AudioGroup
PVOID NTAPI MmAllocateContiguousMemory(IN SIZE_T NumberOfBytes, IN PHYSICAL_ADDRESS HighestAcceptableAddress)
#define CORB_STATUS_MEMORY_ERROR
#define IoSkipCurrentIrpStackLocation(Irp)
#define HDAC_OUTPUT_STREAM_OFFSET(num_input_streams, index)
#define CmResourceTypeInterrupt
#define RIRB_SIZE_CAP_256_ENTRIES
#define HDAC_CORB_READ_POS
#define ObReferenceObject
#define CM_RESOURCE_INTERRUPT_LATCHED
#define HDAC_DMA_POSITION_BASE_LOWER
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
NTKERNELAPI USHORT NTAPI READ_REGISTER_USHORT(IN PUSHORT Register)
PHYSICAL_ADDRESS NTAPI MmGetPhysicalAddress(IN PVOID Address)
#define RIRB_SIZE_CAP_16_ENTRIES
#define RIRB_CONTROL_DMA_ENABLE
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
#define CmResourceTypeMemory
#define FUNCTION_GROUP_NODETYPE_AUDIO
#define HDAC_CORB_SIZE_MASK
NTSTATUS NTAPI HDA_FDORemoveDevice(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
NTKERNELAPI VOID NTAPI WRITE_REGISTER_UCHAR(IN PUCHAR Register, IN UCHAR Value)
VOID NTAPI KeStallExecutionProcessor(IN ULONG MicroSeconds)
base of all file and directory entries
#define HDAC_BIDIR_STREAM_OFFSET(num_input_streams, num_output_streams, index)
#define CORB_SIZE_CAP_16_ENTRIES
#define RIRB_CONTROL_OVERRUN_INTR
KSEMAPHORE ResponseSemaphore