From e8861acfb21c855af2615b252acfb81eb15a458a Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sat, 18 Dec 2004 19:32:40 +0000 Subject: [PATCH] Filip and I have hopefully fixed the ndis completion problem on sends. 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 | 1 + reactos/drivers/net/ndis/ndis/main.c | 1 + reactos/drivers/net/ndis/ndis/miniport.c | 16 +++++++++++++--- reactos/drivers/net/ndis/ndis/protocol.c | 20 +++++++++++++++----- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/reactos/drivers/net/ndis/include/ndissys.h b/reactos/drivers/net/ndis/include/ndissys.h index 548e1fc02f3..7556f232d1d 100644 --- a/reactos/drivers/net/ndis/include/ndissys.h +++ b/reactos/drivers/net/ndis/include/ndissys.h @@ -39,6 +39,7 @@ typedef struct _ATM_ADDRESS *PATM_ADDRESS; #define EXPORT STDCALL #endif +#define NDIS_TAG 0x4e4d4953 #ifdef DBG diff --git a/reactos/drivers/net/ndis/ndis/main.c b/reactos/drivers/net/ndis/ndis/main.c index fcceb512267..ab3c4bff531 100644 --- a/reactos/drivers/net/ndis/ndis/main.c +++ b/reactos/drivers/net/ndis/ndis/main.c @@ -19,6 +19,7 @@ /* See debug.h for debug/trace constants */ DWORD DebugTraceLevel = MIN_TRACE; +//DWORD DebugTraceLevel = DEBUG_ULTRA; #endif /* DBG */ diff --git a/reactos/drivers/net/ndis/ndis/miniport.c b/reactos/drivers/net/ndis/ndis/miniport.c index b1d774fae13..6922fe429c7 100644 --- a/reactos/drivers/net/ndis/ndis/miniport.c +++ b/reactos/drivers/net/ndis/ndis/miniport.c @@ -18,6 +18,14 @@ #include #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 - /* * @implemented diff --git a/reactos/drivers/net/ndis/ndis/protocol.c b/reactos/drivers/net/ndis/ndis/protocol.c index ff96b9ee839..93495e3e068 100644 --- a/reactos/drivers/net/ndis/ndis/protocol.c +++ b/reactos/drivers/net/ndis/ndis/protocol.c @@ -13,6 +13,13 @@ #include "ndissys.h" #include +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;