[PORTCLS]

- Properly handle interrupt sharing for InterruptSyncModeAll and InterruptSyncModeRepeat

svn path=/trunk/; revision=57063
This commit is contained in:
Cameron Gutman 2012-08-12 23:50:51 +00:00
parent 80e2dfaa07
commit ea21f990a2

View file

@ -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;
} }
} }