mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 00:12:57 +00:00
[PORTCLS]
- Properly handle interrupt sharing for InterruptSyncModeAll and InterruptSyncModeRepeat svn path=/trunk/; revision=57063
This commit is contained in:
parent
80e2dfaa07
commit
ea21f990a2
1 changed files with 22 additions and 12 deletions
|
@ -164,12 +164,13 @@ IInterruptServiceRoutine(
|
||||||
PLIST_ENTRY CurEntry;
|
PLIST_ENTRY CurEntry;
|
||||||
PSYNC_ENTRY Entry;
|
PSYNC_ENTRY Entry;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
BOOL Success;
|
BOOL Success, Ret;
|
||||||
|
|
||||||
CInterruptSync * This = (CInterruptSync*)ServiceContext;
|
CInterruptSync * This = (CInterruptSync*)ServiceContext;
|
||||||
|
|
||||||
DPRINT("IInterruptServiceRoutine Mode %u\n", This->m_Mode);
|
DPRINT("IInterruptServiceRoutine Mode %u\n", This->m_Mode);
|
||||||
|
|
||||||
|
Ret = FALSE;
|
||||||
if (This->m_Mode == InterruptSyncModeNormal)
|
if (This->m_Mode == InterruptSyncModeNormal)
|
||||||
{
|
{
|
||||||
CurEntry = This->m_ServiceRoutines.Flink;
|
CurEntry = This->m_ServiceRoutines.Flink;
|
||||||
|
@ -177,13 +178,15 @@ IInterruptServiceRoutine(
|
||||||
{
|
{
|
||||||
Entry = CONTAINING_RECORD(CurEntry, SYNC_ENTRY, ListEntry);
|
Entry = CONTAINING_RECORD(CurEntry, SYNC_ENTRY, ListEntry);
|
||||||
Status = Entry->SyncRoutine((CInterruptSync*)This, Entry->DynamicContext);
|
Status = Entry->SyncRoutine((CInterruptSync*)This, Entry->DynamicContext);
|
||||||
if (NT_SUCCESS(Status))
|
if (Status == STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
return TRUE;
|
/* Mark as handled and break on the first success */
|
||||||
|
Ret = TRUE;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
CurEntry = CurEntry->Flink;
|
CurEntry = CurEntry->Flink;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return Ret;
|
||||||
}
|
}
|
||||||
else if (This->m_Mode == InterruptSyncModeAll)
|
else if (This->m_Mode == InterruptSyncModeAll)
|
||||||
{
|
{
|
||||||
|
@ -191,11 +194,15 @@ IInterruptServiceRoutine(
|
||||||
while (CurEntry != &This->m_ServiceRoutines)
|
while (CurEntry != &This->m_ServiceRoutines)
|
||||||
{
|
{
|
||||||
Entry = CONTAINING_RECORD(CurEntry, SYNC_ENTRY, ListEntry);
|
Entry = CONTAINING_RECORD(CurEntry, SYNC_ENTRY, ListEntry);
|
||||||
Entry->SyncRoutine((CInterruptSync*)This, Entry->DynamicContext);
|
Status = Entry->SyncRoutine((CInterruptSync*)This, Entry->DynamicContext);
|
||||||
|
if (Status == STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Mark as handled but don't break */
|
||||||
|
Ret = TRUE;
|
||||||
|
}
|
||||||
CurEntry = CurEntry->Flink;
|
CurEntry = CurEntry->Flink;
|
||||||
}
|
}
|
||||||
DPRINT("Returning TRUE with mode InterruptSyncModeAll\n");
|
return Ret;
|
||||||
return TRUE; //FIXME
|
|
||||||
}
|
}
|
||||||
else if (This->m_Mode == InterruptSyncModeRepeat)
|
else if (This->m_Mode == InterruptSyncModeRepeat)
|
||||||
{
|
{
|
||||||
|
@ -207,18 +214,21 @@ IInterruptServiceRoutine(
|
||||||
{
|
{
|
||||||
Entry = CONTAINING_RECORD(CurEntry, SYNC_ENTRY, ListEntry);
|
Entry = CONTAINING_RECORD(CurEntry, SYNC_ENTRY, ListEntry);
|
||||||
Status = Entry->SyncRoutine((CInterruptSync*)This, Entry->DynamicContext);
|
Status = Entry->SyncRoutine((CInterruptSync*)This, Entry->DynamicContext);
|
||||||
if (NT_SUCCESS(Status))
|
if (Status == STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Mark as handled if it works at least once */
|
||||||
Success = TRUE;
|
Success = TRUE;
|
||||||
|
Ret = TRUE;
|
||||||
|
}
|
||||||
CurEntry = CurEntry->Flink;
|
CurEntry = CurEntry->Flink;
|
||||||
}
|
}
|
||||||
} while(Success);
|
} while(Success);
|
||||||
DPRINT("Returning TRUE with mode InterruptSyncModeRepeat\n");
|
return Ret;
|
||||||
return TRUE; //FIXME
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DPRINT("Unknown mode %u\n", This->m_Mode);
|
DPRINT("Unknown mode %u\n", This->m_Mode);
|
||||||
return FALSE; //FIXME
|
return Ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue