Author: janderwald
Date: Tue Apr 28 03:16:49 2009
New Revision: 40716

URL: http://svn.reactos.org/svn/reactos?rev=40716&view=rev
Log:
- 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

Modified:
    trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c?rev=40716&r1=40715&r2=40716&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c [iso-8859-1] 
Tue Apr 28 03:16:49 2009
@@ -177,7 +177,7 @@
     BOOL Success;
     IInterruptSyncImpl * This = (IInterruptSyncImpl*)ServiceContext;
 
-    DPRINT("IInterruptServiceRoutine Mode %u\n", This->Mode);
+    //DPRINT("IInterruptServiceRoutine Mode %u\n", This->Mode);
 
     if (This->Mode == InterruptSyncModeNormal)
     {

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c?rev=40716&r1=40715&r2=40716&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c [iso-8859-1] 
Tue Apr 28 03:16:49 2009
@@ -33,17 +33,12 @@
     KSPIN_CONNECT *ConnectDetails;
     PKSDATAFORMAT_WAVEFORMATEX DataFormat;
 
-    PIRP_MAPPING FirstMap;
-    PIRP_MAPPING LastMap;
-
     KSPIN_LOCK Lock;
     LIST_ENTRY ListHead;
 
     PVOID LastTag;
-    BOOL OutOfMapping;
+    ULONG OutOfMapping;
     ULONG MaxFrameSize;
-
-    BOOL LastMappingFailed;
 
 }IIrpQueueImpl;
 
@@ -128,7 +123,7 @@
     This->ConnectDetails = ConnectDetails;
     This->DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat;
     This->MaxFrameSize = FrameSize;
-    This->LastTag = (PVOID)0x12345678;
+    This->LastTag = NULL;
 
     InitializeListHead(&This->ListHead);
     KeInitializeSpinLock(&This->Lock);
@@ -158,17 +153,15 @@
     if (This->MaxFrameSize)
     {
         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;
 
     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);
 
     if (Irp)
@@ -188,17 +181,28 @@
     OUT PUCHAR * Buffer,
     OUT PULONG BufferSize)
 {
-    IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
-
-    if (!This->FirstMap)
-    {
-        This->LastMappingFailed = TRUE;
+
+    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)
+    {
+        KeReleaseSpinLockFromDpcLevel(&This->Lock);
+        This->OutOfMapping = TRUE;
         return STATUS_UNSUCCESSFUL;
     }
 
-    *Buffer = (PUCHAR)This->FirstMap->Header->Data + This->CurrentOffset;
-    *BufferSize = This->FirstMap->Header->DataUsed - This->CurrentOffset;
-    This->LastMappingFailed = FALSE;
+    *Buffer = (PUCHAR)CurMapping->Header->Data + This->CurrentOffset;
+    *BufferSize = CurMapping->Header->DataUsed - This->CurrentOffset;
+    This->OutOfMapping = FALSE;
+
+    KeReleaseSpinLockFromDpcLevel(&This->Lock);
     return STATUS_SUCCESS;
 }
 
@@ -210,21 +214,22 @@
     IN IIrpQueue *iface,
     IN ULONG BytesWritten)
 {
-    IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
-    PIRP_MAPPING Mapping, CurMapping;
+    PLIST_ENTRY CurEntry;
+    PIRP_MAPPING CurMapping;
+    IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
 
     This->CurrentOffset += 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;
-        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);
-
         FreeMappingRoutine(CurMapping);
     }
 
@@ -304,45 +309,37 @@
     OUT PULONG  ByteCount,
     OUT PULONG  Flags)
 {
-    KIRQL OldIrql;
     PIRP_MAPPING CurMapping;
     PIRP_MAPPING Result;
     PLIST_ENTRY CurEntry;
     ULONG Index;
+    ULONG Offset;
     IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
 
     *Flags = 0;
     Result = NULL;
 
-    KeAcquireSpinLock(&This->Lock, &OldIrql);
+    KeAcquireSpinLockAtDpcLevel(&This->Lock);
 
     CurEntry = This->ListHead.Flink;
+    if (CurEntry == &This->ListHead)
+    {
+        KeReleaseSpinLockFromDpcLevel(&This->Lock);
+        This->OutOfMapping = TRUE;
+        return STATUS_UNSUCCESSFUL;
+    }
+
 
     while (CurEntry != &This->ListHead)
     {
         CurMapping = CONTAINING_RECORD(CurEntry, IRP_MAPPING, Entry);
         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 (Index + 1 < CurMapping->NumTags)
                 {
                     CurMapping->Tag[Index+1] = Tag;
-                    CurMapping->ReferenceCount++;
                     Result = CurMapping;
 
                     if (Index + 1 == CurMapping->NumTags - 1)
@@ -350,6 +347,11 @@
                         /* indicate end of packet */
                         *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;
                 }
 
@@ -357,30 +359,23 @@
                 if (&This->ListHead == CurEntry)
                 {
                     This->OutOfMapping = TRUE;
-                    break;
+                    KeReleaseSpinLockFromDpcLevel(&This->Lock);
+                    return STATUS_UNSUCCESSFUL;
                 }
                 Result = CONTAINING_RECORD(CurEntry, IRP_MAPPING, Entry);
                 Result->Tag[0] = Tag;
-                Result->ReferenceCount++;
+                *VirtualAddress = (PUCHAR)Result->Header->Data;
+                *PhysicalAddress = MmGetPhysicalAddress(*VirtualAddress);
+                *ByteCount = min(Result->Header->DataUsed, This->MaxFrameSize);
                 break;
             }
         }
         CurEntry = CurEntry->Flink;
     }
 
-    KeReleaseSpinLock(&This->Lock, OldIrql);
-    if (!Result)
-    {
-        This->LastMappingFailed = TRUE;
-        return STATUS_UNSUCCESSFUL;
-    }
-
-    Result->Tag = Tag;
-    *PhysicalAddress = MmGetPhysicalAddress(Result->Header->Data);
-    *VirtualAddress = Result->Header->Data;
-    *ByteCount = Result->Header->DataUsed;
+    KeReleaseSpinLockFromDpcLevel(&This->Lock);
     This->LastTag = Tag;
-    This->LastMappingFailed = FALSE;
+    This->OutOfMapping = FALSE;
     return STATUS_SUCCESS;
 }
 
@@ -390,13 +385,12 @@
     IN IIrpQueue *iface,
     IN PVOID Tag)
 {
-    KIRQL OldIrql;
     PIRP_MAPPING CurMapping;
     PLIST_ENTRY CurEntry;
     ULONG Index;
     IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
 
-    KeAcquireSpinLock(&This->Lock, &OldIrql);
+    KeAcquireSpinLockAtDpcLevel(&This->Lock);
     CurEntry = This->ListHead.Flink;
 
     while (CurEntry != &This->ListHead)
@@ -427,7 +421,7 @@
         CurEntry = CurEntry->Flink;
     }
 
-    KeReleaseSpinLock(&This->Lock, OldIrql);
+    KeReleaseSpinLockFromDpcLevel(&This->Lock);
 }
 
 BOOL
@@ -436,7 +430,7 @@
     IN IIrpQueue *iface)
 {
     IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
-    return This->LastMappingFailed;
+    return This->OutOfMapping;
 }
 
 static IIrpQueueVtbl vt_IIrpQueue =

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c?rev=40716&r1=40715&r2=40716&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c [iso-8859-1] 
Tue Apr 28 03:16:49 2009
@@ -202,7 +202,7 @@
     ASSERT_IRQL(DISPATCH_LEVEL);
 
     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);
 }

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c?rev=40716&r1=40715&r2=40716&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c [iso-8859-1] 
Tue Apr 28 03:16:49 2009
@@ -226,7 +226,7 @@
     IServiceSink* iface)
 {
     IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, 
IPortWavePciImpl, lpVtblServiceSink);
-    DPRINT("IServiceSink_fnRequestService entered\n");
+    //DPRINT("IServiceSink_fnRequestService entered\n");
     if (This->Miniport)
     {
         This->Miniport->lpVtbl->Service(This->Miniport);
@@ -576,9 +576,9 @@
     IN IPortWavePci * iface,
     IN  PSERVICEGROUP ServiceGroup)
 {
-    IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
-
-    DPRINT("IPortWavePci_fnNotify entered %p, ServiceGroup %p\n", This, 
ServiceGroup);
+    //IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
+
+    //DPRINT("IPortWavePci_fnNotify entered %p, ServiceGroup %p\n", This, 
ServiceGroup);
 
     if (ServiceGroup)
     {

Reply via email to