Filip and I have hopefully fixed the ndis completion problem on sends.
authorArt Yerkes <art.yerkes@gmail.com>
Sat, 18 Dec 2004 19:32:40 +0000 (19:32 +0000)
committerArt Yerkes <art.yerkes@gmail.com>
Sat, 18 Dec 2004 19:32:40 +0000 (19:32 +0000)
After calls to delayed miniport send routines, we check status and if not
pending, do NdisMSendComplete and set the miniport busy flag off.

svn path=/trunk/; revision=12196

reactos/drivers/net/ndis/include/ndissys.h
reactos/drivers/net/ndis/ndis/main.c
reactos/drivers/net/ndis/ndis/miniport.c
reactos/drivers/net/ndis/ndis/protocol.c

index 548e1fc..7556f23 100644 (file)
@@ -39,6 +39,7 @@ typedef struct _ATM_ADDRESS *PATM_ADDRESS;
 #define EXPORT STDCALL
 #endif
 
+#define NDIS_TAG  0x4e4d4953
 
 #ifdef DBG
 
index fcceb51..ab3c4bf 100644 (file)
@@ -19,6 +19,7 @@
 
 /* See debug.h for debug/trace constants */
 DWORD DebugTraceLevel = MIN_TRACE;
+//DWORD DebugTraceLevel = DEBUG_ULTRA;
 
 #endif /* DBG */
 
index b1d774f..6922fe4 100644 (file)
 #include <buffer.h>
 #endif /* DBG */
 
+#undef NdisMSendComplete
+VOID
+EXPORT
+NdisMSendComplete(
+    IN  NDIS_HANDLE     MiniportAdapterHandle,
+    IN  PNDIS_PACKET    Packet,
+    IN  NDIS_STATUS     Status);
+
 /* Root of the scm database */
 #define SERVICES_ROOT L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"
 
@@ -819,6 +827,8 @@ VOID STDCALL MiniportDpc(
                  */
                 (*Adapter->Miniport->Chars.SendPacketsHandler)(
                     Adapter->NdisMiniportBlock.MiniportAdapterContext, (PPNDIS_PACKET)&WorkItemContext, 1);
+               NdisStatus = 
+                   NDIS_GET_PACKET_STATUS((PNDIS_PACKET)WorkItemContext);
 
                 NDIS_DbgPrint(MAX_TRACE, ("back from miniport's SendPackets handler\n"));
               }
@@ -831,7 +841,9 @@ VOID STDCALL MiniportDpc(
 
                 NDIS_DbgPrint(MAX_TRACE, ("back from miniport's Send handler\n"));
               }
-
+           NdisMSendComplete
+               ( Adapter, (PNDIS_PACKET)WorkItemContext, NdisStatus );
+           Adapter->MiniportBusy = FALSE;
             break;
 
           case NdisWorkItemSendLoopback:
@@ -1831,8 +1843,6 @@ NdisMResetComplete(
   MiniResetComplete(MiniportAdapterHandle, Status, AddressingReset);
 }
 
-#undef NdisMSendComplete
-
 \f
 /*
  * @implemented
index ff96b9e..93495e3 100644 (file)
 #include "ndissys.h"
 #include <buffer.h>
 
+VOID
+EXPORT
+NdisMSendComplete(
+    IN  NDIS_HANDLE     MiniportAdapterHandle,
+    IN  PNDIS_PACKET    Packet,
+    IN  NDIS_STATUS     Status);
+
 #define SERVICES_KEY L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"
 #define LINKAGE_KEY  L"\\Linkage"
 #define PARAMETERS_KEY L"\\Parameters\\"
@@ -359,11 +366,14 @@ ProSend(
           NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's Send handler\n"));
           NdisStatus = (*Adapter->Miniport->Chars.SendHandler)(Adapter->NdisMiniportBlock.MiniportAdapterContext, Packet, 0);
           NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n"));
-
+         if( NdisStatus != NDIS_STATUS_PENDING ) {
+             NdisMSendComplete( Adapter, Packet, NdisStatus );
+             Adapter->MiniportBusy = FALSE;
+         }
           KeLowerIrql(RaiseOldIrql);
         }
     }
-
+  
   /* XXX why the hell do we do this? */
   NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
   KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &SpinOldIrql);
@@ -736,7 +746,7 @@ NdisRegisterProtocol(
     UNICODE_STRING RegistryPath;
     WCHAR *RegistryPathStr;
 
-    RegistryPathStr = ExAllocatePool(PagedPool, sizeof(SERVICES_KEY) + ProtocolCharacteristics->Name.Length + sizeof(LINKAGE_KEY));
+    RegistryPathStr = ExAllocatePoolWithTag(PagedPool, sizeof(SERVICES_KEY) + ProtocolCharacteristics->Name.Length + sizeof(LINKAGE_KEY), NDIS_TAG + __LINE__);
     if(!RegistryPathStr)
       {
         NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
@@ -785,7 +795,7 @@ NdisRegisterProtocol(
         return;
       }
 
-    KeyInformation = ExAllocatePool(PagedPool, sizeof(KEY_VALUE_PARTIAL_INFORMATION) + ResultLength);
+    KeyInformation = ExAllocatePoolWithTag(PagedPool, sizeof(KEY_VALUE_PARTIAL_INFORMATION) + ResultLength, NDIS_TAG + __LINE__);
     if(!KeyInformation)
       {
         NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
@@ -856,7 +866,7 @@ NdisRegisterProtocol(
 
       NDIS_DbgPrint(MAX_TRACE, ("Calling protocol's BindAdapter handler with DeviceName %wZ and RegistryPath %wZ\n",
           &DeviceName, &RegistryPath));
-
+      
       /* XXX SD must do something with bind context */
       *NdisProtocolHandle = Protocol;