+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/backpln/portcls/interrupt.c
+ * PURPOSE: portcls interrupt object
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
#include "private.h"
typedef struct
{
IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
- DPRINT1("IInterruptSync_fnQueryInterface: This %p\n", This);
+ DPRINT("IInterruptSync_fnQueryInterface: This %p\n", This);
- if (IsEqualGUIDAligned(refiid, &IID_IInterruptSync))
+ if (IsEqualGUIDAligned(refiid, &IID_IInterruptSync) ||
+ IsEqualGUIDAligned(refiid, &IID_IUnknown))
{
*Output = &This->lpVtbl;
- _InterlockedIncrement(&This->ref);
+ InterlockedIncrement(&This->ref);
return STATUS_SUCCESS;
}
DPRINT1("IInterruptSync_fnQueryInterface: This %p UNKNOWN interface requested\n", This);
{
IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
- DPRINT1("IInterruptSync_AddRef: This %p\n", This);
+ DPRINT("IInterruptSync_AddRef: This %p\n", This);
- return _InterlockedIncrement(&This->ref);
+ return InterlockedIncrement(&This->ref);
}
ULONG
PSYNC_ENTRY Entry;
IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
- _InterlockedDecrement(&This->ref);
+ InterlockedDecrement(&This->ref);
- DPRINT1("IInterruptSync_Release: This %p new ref %u\n", This, This->ref);
+ DPRINT("IInterruptSync_Release: This %p new ref %u\n", This, This->ref);
if (This->ref == 0)
{
FreeItem(Entry, TAG_PORTCLASS);
}
- //This->ResourceList->lpVtbl->Release(This->ResourceList);
- //FreeItem(This, TAG_PORTCLASS);
-DPRINT1("IInterruptSync_Release: complete\n");
+ This->ResourceList->lpVtbl->Release(This->ResourceList);
+ FreeItem(This, TAG_PORTCLASS);
return 0;
}
/* Return new reference count */
IN PVOID ServiceContext)
{
IInterruptSyncImpl * This = (IInterruptSyncImpl*)ServiceContext;
- DPRINT1("IInterruptSynchronizedRoutine This %p SyncRoutine%p\n", This, This->SyncRoutine);
+ DPRINT("IInterruptSynchronizedRoutine This %p SyncRoutine %p Context %p\n", This, This->SyncRoutine, This->DynamicContext);
return This->SyncRoutine((IInterruptSync*)&This->lpVtbl, This->DynamicContext);
}
KIRQL OldIrql;
IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
- DPRINT1("IInterruptSync_fnCallSynchronizedRoutine This %p Routine %p DynamicContext %p\n", This, Routine, DynamicContext);
+ DPRINT("IInterruptSync_fnCallSynchronizedRoutine This %p Routine %p DynamicContext %p Irql %x Interrupt %p\n", This, Routine, DynamicContext, KeGetCurrentIrql(), This->Interrupt);
if (!This->Interrupt)
{
This->SyncRoutine = Routine;
This->DynamicContext = DynamicContext;
- return KeSynchronizeExecution(This->Interrupt, IInterruptSynchronizedRoutine, (PVOID)This);
+ if (KeSynchronizeExecution(This->Interrupt, IInterruptSynchronizedRoutine, (PVOID)This))
+ return STATUS_SUCCESS;
+ else
+ return STATUS_UNSUCCESSFUL;
}
-NTAPI
PKINTERRUPT
+NTAPI
IInterruptSync_fnGetKInterrupt(
IN IInterruptSync * iface)
{
IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
- DPRINT1("IInterruptSynchronizedRoutine\n");
+ DPRINT("IInterruptSynchronizedRoutine\n");
return This->Interrupt;
}
BOOL Success;
IInterruptSyncImpl * This = (IInterruptSyncImpl*)ServiceContext;
- DPRINT1("IInterruptServiceRoutine\n");
+ //DPRINT("IInterruptServiceRoutine Mode %u\n", This->Mode);
if (This->Mode == InterruptSyncModeNormal)
{
NTSTATUS Status;
PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor;
- DPRINT1("IInterruptSync_fnConnect\n");
+ DPRINT("IInterruptSync_fnConnect\n");
+ ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
Descriptor = This->ResourceList->lpVtbl->FindTranslatedEntry(This->ResourceList, CmResourceTypeInterrupt, This->ResourceIndex);
if (!Descriptor)
Status = IoConnectInterrupt(&This->Interrupt,
IInterruptServiceRoutine,
(PVOID)This,
- &This->Lock, Descriptor->u.Interrupt.Vector,
+ &This->Lock,
+ Descriptor->u.Interrupt.Vector,
Descriptor->u.Interrupt.Level,
- Descriptor->u.Interrupt.Level, //FIXME
- LevelSensitive, //FIXME
- TRUE, //FIXME
- Descriptor->u.Interrupt.Affinity,
+ Descriptor->u.Interrupt.Level,
+ (Descriptor->Flags & CM_RESOURCE_INTERRUPT_LATCHED),
+ (Descriptor->Flags != CM_RESOURCE_INTERRUPT_LATCHED),
+ Descriptor->u.Interrupt.Affinity,
FALSE);
+ DPRINT("IInterruptSync_fnConnect result %x\n", Status);
return Status;
}
IN IInterruptSync * iface)
{
IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
- DPRINT1("IInterruptSync_fnDisconnect\n");
+
+ DPRINT("IInterruptSync_fnDisconnect\n");
+ ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
if (!This->Interrupt)
{
PSYNC_ENTRY NewEntry;
IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
-DPRINT1("IInterruptSync_fnRegisterServiceRoutine\n");
+ DPRINT("IInterruptSync_fnRegisterServiceRoutine\n");
+ ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
NewEntry = AllocateItem(NonPagedPool, sizeof(SYNC_ENTRY), TAG_PORTCLASS);
if (!NewEntry)
};
/*
- * @unimplemented
+ * @implemented
*/
NTSTATUS NTAPI
PcNewInterruptSync(
{
IInterruptSyncImpl * This;
- DPRINT1("PcNewInterruptSync entered\n");
+ DPRINT("PcNewInterruptSync entered OutInterruptSync %p OuterUnknown %p ResourceList %p ResourceIndex %u Mode %d\n",
+ OutInterruptSync, OuterUnknown, ResourceList, ResourceIndex, Mode);
- if (!OutInterruptSync || !ResourceList || Mode > InterruptSyncModeRepeat || Mode < 0)
+ if (!OutInterruptSync || !ResourceList || Mode < InterruptSyncModeNormal || Mode > InterruptSyncModeRepeat)
return STATUS_INVALID_PARAMETER;
if (ResourceIndex > ResourceList->lpVtbl->NumberOfEntriesOfType(ResourceList, CmResourceTypeInterrupt))
KeInitializeSpinLock(&This->Lock);
*OutInterruptSync = (PINTERRUPTSYNC)&This->lpVtbl;
- DPRINT1("PcNewInterruptSync success %p\n", *OutInterruptSync);
+ DPRINT("PcNewInterruptSync success %p\n", *OutInterruptSync);
return STATUS_SUCCESS;
}