- Silence a few debug prints

- The IrpQueue functions are called at DISPATCH_LEVEL, therefore use KeAcquireSpinLockAtDpcLevel instead
- Fix multiple bugs when using IrpQueue tag functions

svn path=/trunk/; revision=40716
This commit is contained in:
Johannes Anderwald 2009-04-27 23:16:49 +00:00
parent da49b0b87d
commit b34e7b4258
4 changed files with 58 additions and 64 deletions

View file

@ -177,7 +177,7 @@ IInterruptServiceRoutine(
BOOL Success; BOOL Success;
IInterruptSyncImpl * This = (IInterruptSyncImpl*)ServiceContext; IInterruptSyncImpl * This = (IInterruptSyncImpl*)ServiceContext;
DPRINT("IInterruptServiceRoutine Mode %u\n", This->Mode); //DPRINT("IInterruptServiceRoutine Mode %u\n", This->Mode);
if (This->Mode == InterruptSyncModeNormal) if (This->Mode == InterruptSyncModeNormal)
{ {

View file

@ -33,18 +33,13 @@ typedef struct
KSPIN_CONNECT *ConnectDetails; KSPIN_CONNECT *ConnectDetails;
PKSDATAFORMAT_WAVEFORMATEX DataFormat; PKSDATAFORMAT_WAVEFORMATEX DataFormat;
PIRP_MAPPING FirstMap;
PIRP_MAPPING LastMap;
KSPIN_LOCK Lock; KSPIN_LOCK Lock;
LIST_ENTRY ListHead; LIST_ENTRY ListHead;
PVOID LastTag; PVOID LastTag;
BOOL OutOfMapping; ULONG OutOfMapping;
ULONG MaxFrameSize; ULONG MaxFrameSize;
BOOL LastMappingFailed;
}IIrpQueueImpl; }IIrpQueueImpl;
VOID VOID
@ -128,7 +123,7 @@ IIrpQueue_fnInit(
This->ConnectDetails = ConnectDetails; This->ConnectDetails = ConnectDetails;
This->DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat; This->DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat;
This->MaxFrameSize = FrameSize; This->MaxFrameSize = FrameSize;
This->LastTag = (PVOID)0x12345678; This->LastTag = NULL;
InitializeListHead(&This->ListHead); InitializeListHead(&This->ListHead);
KeInitializeSpinLock(&This->Lock); KeInitializeSpinLock(&This->Lock);
@ -158,17 +153,15 @@ IIrpQueue_fnAddMapping(
if (This->MaxFrameSize) if (This->MaxFrameSize)
{ {
Mapping->NumTags = max((Mapping->Header->DataUsed / This->MaxFrameSize) + 1, 1); Mapping->NumTags = max((Mapping->Header->DataUsed / This->MaxFrameSize) + 1, 1);
Mapping->Tag = AllocateItem(NonPagedPool, sizeof(PVOID) * This->NumMappings, TAG_PORTCLASS); Mapping->Tag = AllocateItem(NonPagedPool, sizeof(PVOID) * Mapping->NumTags, TAG_PORTCLASS);
Mapping->ReferenceCount = Mapping->NumTags;
} }
This->NumDataAvailable += Mapping->Header->DataUsed; This->NumDataAvailable += Mapping->Header->DataUsed;
DPRINT("IIrpQueue_fnAddMapping NumMappings %u SizeOfMapping %lu NumDataAvailable %lu Irp %p\n", This->NumMappings, Mapping->Header->DataUsed, This->NumDataAvailable, Irp); DPRINT("IIrpQueue_fnAddMapping NumMappings %u SizeOfMapping %lu NumDataAvailable %lu Irp %p\n", This->NumMappings, Mapping->Header->DataUsed, This->NumDataAvailable, Irp);
/* FIXME use InterlockedCompareExchangePointer */
if (InterlockedCompareExchange((volatile long *)&This->FirstMap, (LONG)Mapping, (LONG)0) != 0)
ExInterlockedInsertTailList(&This->ListHead, &Mapping->Entry, &This->Lock); ExInterlockedInsertTailList(&This->ListHead, &Mapping->Entry, &This->Lock);
(void)InterlockedIncrement((volatile long*)&This->NumMappings); (void)InterlockedIncrement((volatile long*)&This->NumMappings);
if (Irp) if (Irp)
@ -188,17 +181,28 @@ IIrpQueue_fnGetMapping(
OUT PUCHAR * Buffer, OUT PUCHAR * Buffer,
OUT PULONG BufferSize) OUT PULONG BufferSize)
{ {
IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
if (!This->FirstMap) PIRP_MAPPING CurMapping;
IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
PLIST_ENTRY CurEntry;
KeAcquireSpinLockAtDpcLevel(&This->Lock);
CurEntry = This->ListHead.Flink;
CurMapping = CONTAINING_RECORD(CurEntry, IRP_MAPPING, Entry);
if (CurEntry == &This->ListHead)
{ {
This->LastMappingFailed = TRUE; KeReleaseSpinLockFromDpcLevel(&This->Lock);
This->OutOfMapping = TRUE;
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }
*Buffer = (PUCHAR)This->FirstMap->Header->Data + This->CurrentOffset; *Buffer = (PUCHAR)CurMapping->Header->Data + This->CurrentOffset;
*BufferSize = This->FirstMap->Header->DataUsed - This->CurrentOffset; *BufferSize = CurMapping->Header->DataUsed - This->CurrentOffset;
This->LastMappingFailed = FALSE; This->OutOfMapping = FALSE;
KeReleaseSpinLockFromDpcLevel(&This->Lock);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -210,21 +214,22 @@ IIrpQueue_fnUpdateMapping(
IN IIrpQueue *iface, IN IIrpQueue *iface,
IN ULONG BytesWritten) IN ULONG BytesWritten)
{ {
PLIST_ENTRY CurEntry;
PIRP_MAPPING CurMapping;
IIrpQueueImpl * This = (IIrpQueueImpl*)iface; IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
PIRP_MAPPING Mapping, CurMapping;
This->CurrentOffset += BytesWritten; This->CurrentOffset += BytesWritten;
This->NumDataAvailable -= BytesWritten; This->NumDataAvailable -= BytesWritten;
if (This->FirstMap->Header->DataUsed <=This->CurrentOffset) CurEntry = This->ListHead.Flink;
CurMapping = CONTAINING_RECORD(CurEntry, IRP_MAPPING, Entry);
if (CurMapping->Header->DataUsed <= This->CurrentOffset)
{ {
This->CurrentOffset = 0; This->CurrentOffset = 0;
Mapping = (PIRP_MAPPING)ExInterlockedRemoveHeadList(&This->ListHead, &This->Lock);
CurMapping = This->FirstMap;
(void)InterlockedExchangePointer((PVOID volatile*)&This->FirstMap, (PVOID)Mapping); (void)ExInterlockedRemoveHeadList(&This->ListHead, &This->Lock);
InterlockedDecrement(&This->NumMappings); InterlockedDecrement(&This->NumMappings);
FreeMappingRoutine(CurMapping); FreeMappingRoutine(CurMapping);
} }
@ -304,45 +309,37 @@ IIrpQueue_fnGetMappingWithTag(
OUT PULONG ByteCount, OUT PULONG ByteCount,
OUT PULONG Flags) OUT PULONG Flags)
{ {
KIRQL OldIrql;
PIRP_MAPPING CurMapping; PIRP_MAPPING CurMapping;
PIRP_MAPPING Result; PIRP_MAPPING Result;
PLIST_ENTRY CurEntry; PLIST_ENTRY CurEntry;
ULONG Index; ULONG Index;
ULONG Offset;
IIrpQueueImpl * This = (IIrpQueueImpl*)iface; IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
*Flags = 0; *Flags = 0;
Result = NULL; Result = NULL;
KeAcquireSpinLock(&This->Lock, &OldIrql); KeAcquireSpinLockAtDpcLevel(&This->Lock);
CurEntry = This->ListHead.Flink; CurEntry = This->ListHead.Flink;
if (CurEntry == &This->ListHead)
{
KeReleaseSpinLockFromDpcLevel(&This->Lock);
This->OutOfMapping = TRUE;
return STATUS_UNSUCCESSFUL;
}
while (CurEntry != &This->ListHead) while (CurEntry != &This->ListHead)
{ {
CurMapping = CONTAINING_RECORD(CurEntry, IRP_MAPPING, Entry); CurMapping = CONTAINING_RECORD(CurEntry, IRP_MAPPING, Entry);
for(Index = 0; Index < CurMapping->NumTags; Index++) for(Index = 0; Index < CurMapping->NumTags; Index++)
{ {
if (This->LastTag == (PVOID)0x12345678)
{
CurMapping->Tag[Index] = Tag;
CurMapping->ReferenceCount++;
Result = CurMapping;
if (Index + 1 == CurMapping->NumTags - 1)
{
/* indicate end of packet */
*Flags = 1;
}
break;
}
if (CurMapping->Tag[Index] == This->LastTag) if (CurMapping->Tag[Index] == This->LastTag)
{ {
if (Index + 1 < CurMapping->NumTags) if (Index + 1 < CurMapping->NumTags)
{ {
CurMapping->Tag[Index+1] = Tag; CurMapping->Tag[Index+1] = Tag;
CurMapping->ReferenceCount++;
Result = CurMapping; Result = CurMapping;
if (Index + 1 == CurMapping->NumTags - 1) if (Index + 1 == CurMapping->NumTags - 1)
@ -350,6 +347,11 @@ IIrpQueue_fnGetMappingWithTag(
/* indicate end of packet */ /* indicate end of packet */
*Flags = 1; *Flags = 1;
} }
Offset = (Index + 1) * This->MaxFrameSize;
ASSERT(Result->Header->DataUsed > Offset);
*VirtualAddress = (PUCHAR)Result->Header->Data + Offset;
*PhysicalAddress = MmGetPhysicalAddress(*VirtualAddress);
*ByteCount = min(Result->Header->DataUsed - Offset, This->MaxFrameSize);
break; break;
} }
@ -357,30 +359,23 @@ IIrpQueue_fnGetMappingWithTag(
if (&This->ListHead == CurEntry) if (&This->ListHead == CurEntry)
{ {
This->OutOfMapping = TRUE; This->OutOfMapping = TRUE;
break; KeReleaseSpinLockFromDpcLevel(&This->Lock);
return STATUS_UNSUCCESSFUL;
} }
Result = CONTAINING_RECORD(CurEntry, IRP_MAPPING, Entry); Result = CONTAINING_RECORD(CurEntry, IRP_MAPPING, Entry);
Result->Tag[0] = Tag; Result->Tag[0] = Tag;
Result->ReferenceCount++; *VirtualAddress = (PUCHAR)Result->Header->Data;
*PhysicalAddress = MmGetPhysicalAddress(*VirtualAddress);
*ByteCount = min(Result->Header->DataUsed, This->MaxFrameSize);
break; break;
} }
} }
CurEntry = CurEntry->Flink; CurEntry = CurEntry->Flink;
} }
KeReleaseSpinLock(&This->Lock, OldIrql); KeReleaseSpinLockFromDpcLevel(&This->Lock);
if (!Result)
{
This->LastMappingFailed = TRUE;
return STATUS_UNSUCCESSFUL;
}
Result->Tag = Tag;
*PhysicalAddress = MmGetPhysicalAddress(Result->Header->Data);
*VirtualAddress = Result->Header->Data;
*ByteCount = Result->Header->DataUsed;
This->LastTag = Tag; This->LastTag = Tag;
This->LastMappingFailed = FALSE; This->OutOfMapping = FALSE;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -390,13 +385,12 @@ IIrpQueue_fnReleaseMappingWithTag(
IN IIrpQueue *iface, IN IIrpQueue *iface,
IN PVOID Tag) IN PVOID Tag)
{ {
KIRQL OldIrql;
PIRP_MAPPING CurMapping; PIRP_MAPPING CurMapping;
PLIST_ENTRY CurEntry; PLIST_ENTRY CurEntry;
ULONG Index; ULONG Index;
IIrpQueueImpl * This = (IIrpQueueImpl*)iface; IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
KeAcquireSpinLock(&This->Lock, &OldIrql); KeAcquireSpinLockAtDpcLevel(&This->Lock);
CurEntry = This->ListHead.Flink; CurEntry = This->ListHead.Flink;
while (CurEntry != &This->ListHead) while (CurEntry != &This->ListHead)
@ -427,7 +421,7 @@ IIrpQueue_fnReleaseMappingWithTag(
CurEntry = CurEntry->Flink; CurEntry = CurEntry->Flink;
} }
KeReleaseSpinLock(&This->Lock, OldIrql); KeReleaseSpinLockFromDpcLevel(&This->Lock);
} }
BOOL BOOL
@ -436,7 +430,7 @@ IIrpQueue_fnHasLastMappingFailed(
IN IIrpQueue *iface) IN IIrpQueue *iface)
{ {
IIrpQueueImpl * This = (IIrpQueueImpl*)iface; IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
return This->LastMappingFailed; return This->OutOfMapping;
} }
static IIrpQueueVtbl vt_IIrpQueue = static IIrpQueueVtbl vt_IIrpQueue =

View file

@ -202,7 +202,7 @@ IServiceSink_fnRequestService(
ASSERT_IRQL(DISPATCH_LEVEL); ASSERT_IRQL(DISPATCH_LEVEL);
Status = This->Stream->lpVtbl->GetPosition(This->Stream, &Position); Status = This->Stream->lpVtbl->GetPosition(This->Stream, &Position);
DPRINT("Position %llu Status %x\n", Position, Status); DPRINT("Position %ull Status %x\n", Position, Status);
This->Stream->lpVtbl->Service(This->Stream); This->Stream->lpVtbl->Service(This->Stream);
} }

View file

@ -226,7 +226,7 @@ IServiceSink_fnRequestService(
IServiceSink* iface) IServiceSink* iface)
{ {
IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, IPortWavePciImpl, lpVtblServiceSink); IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, IPortWavePciImpl, lpVtblServiceSink);
DPRINT("IServiceSink_fnRequestService entered\n"); //DPRINT("IServiceSink_fnRequestService entered\n");
if (This->Miniport) if (This->Miniport)
{ {
This->Miniport->lpVtbl->Service(This->Miniport); This->Miniport->lpVtbl->Service(This->Miniport);
@ -576,9 +576,9 @@ IPortWavePci_fnNotify(
IN IPortWavePci * iface, IN IPortWavePci * iface,
IN PSERVICEGROUP ServiceGroup) IN PSERVICEGROUP ServiceGroup)
{ {
IPortWavePciImpl * This = (IPortWavePciImpl*)iface; //IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
DPRINT("IPortWavePci_fnNotify entered %p, ServiceGroup %p\n", This, ServiceGroup); //DPRINT("IPortWavePci_fnNotify entered %p, ServiceGroup %p\n", This, ServiceGroup);
if (ServiceGroup) if (ServiceGroup)
{ {