From ddce511a68958afb849f4f4a8951166f9eaba60c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 14 Sep 2008 00:48:32 +0000 Subject: [PATCH] - Merge aicom-network-fixes up to r36198 svn path=/trunk/; revision=36204 --- reactos/drivers/network/ndis/ndis/buffer.c | 85 +++++++++++++++++--- reactos/drivers/network/ndis/ndis/efilter.c | 9 +-- reactos/drivers/network/ndis/ndis/io.c | 4 +- reactos/drivers/network/ndis/ndis/miniport.c | 18 ++++- reactos/drivers/network/ndis/ndis/protocol.c | 9 +-- 5 files changed, 100 insertions(+), 25 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/buffer.c b/reactos/drivers/network/ndis/ndis/buffer.c index a87d36d6660..a690bf862aa 100644 --- a/reactos/drivers/network/ndis/ndis/buffer.c +++ b/reactos/drivers/network/ndis/ndis/buffer.c @@ -465,7 +465,7 @@ NdisAllocatePacketPool( /* - * @unimplemented + * @implemented */ VOID EXPORT @@ -694,7 +694,7 @@ NdisCopyFromPacketToPacket( /* - * @unimplemented + * @implemented */ VOID EXPORT @@ -710,12 +710,42 @@ NdisDprAllocatePacket( * PoolHandle = Handle returned by NdisAllocatePacketPool */ { - *Status = NDIS_STATUS_FAILURE; + PNDIS_PACKET Temp; + PNDISI_PACKET_POOL Pool = (PNDISI_PACKET_POOL)PoolHandle; + + NDIS_DbgPrint(MAX_TRACE, ("Status (0x%X) Packet (0x%X) PoolHandle (0x%X).\n", + Status, Packet, PoolHandle)); + + *Packet = NULL; + + if (Pool == NULL) + { + *Status = NDIS_STATUS_FAILURE; + return; + } + + KeAcquireSpinLockAtDpcLevel(&Pool->SpinLock.SpinLock); + + if (Pool->FreeList) { + Temp = Pool->FreeList; + Pool->FreeList = (PNDIS_PACKET)Temp->Private.Head; + + KeReleaseSpinLockFromDpcLevel(&Pool->SpinLock.SpinLock); + + RtlZeroMemory(&Temp->Private, sizeof(NDIS_PACKET_PRIVATE)); + Temp->Private.Pool = Pool; + + *Packet = Temp; + *Status = NDIS_STATUS_SUCCESS; + } else { + *Status = NDIS_STATUS_RESOURCES; + KeReleaseSpinLockFromDpcLevel(&Pool->SpinLock.SpinLock); + } } /* - * @unimplemented + * @implemented */ VOID EXPORT @@ -731,12 +761,37 @@ NdisDprAllocatePacketNonInterlocked( * PoolHandle = Handle returned by NdisAllocatePacketPool */ { - *Status = NDIS_STATUS_FAILURE; + PNDIS_PACKET Temp; + PNDISI_PACKET_POOL Pool = (PNDISI_PACKET_POOL)PoolHandle; + + NDIS_DbgPrint(MAX_TRACE, ("Status (0x%X) Packet (0x%X) PoolHandle (0x%X).\n", + Status, Packet, PoolHandle)); + + *Packet = NULL; + + if (Pool == NULL) + { + *Status = NDIS_STATUS_FAILURE; + return; + } + + if (Pool->FreeList) { + Temp = Pool->FreeList; + Pool->FreeList = (PNDIS_PACKET)Temp->Private.Head; + + RtlZeroMemory(&Temp->Private, sizeof(NDIS_PACKET_PRIVATE)); + Temp->Private.Pool = Pool; + + *Packet = Temp; + *Status = NDIS_STATUS_SUCCESS; + } else { + *Status = NDIS_STATUS_RESOURCES; + } } /* - * @unimplemented + * @implemented */ VOID EXPORT @@ -748,11 +803,17 @@ NdisDprFreePacket( * Packet = Pointer to packet to free */ { + NDIS_DbgPrint(MAX_TRACE, ("Packet (0x%X).\n", Packet)); + + KeAcquireSpinLockAtDpcLevel(&((NDISI_PACKET_POOL*)Packet->Private.Pool)->SpinLock.SpinLock); + Packet->Private.Head = (PNDIS_BUFFER)((NDISI_PACKET_POOL*)Packet->Private.Pool)->FreeList; + ((NDISI_PACKET_POOL*)Packet->Private.Pool)->FreeList = Packet; + KeReleaseSpinLockFromDpcLevel(&((NDISI_PACKET_POOL*)Packet->Private.Pool)->SpinLock.SpinLock); } /* - * @unimplemented + * @implemented */ VOID EXPORT @@ -764,6 +825,10 @@ NdisDprFreePacketNonInterlocked( * Packet = Pointer to packet to free */ { + NDIS_DbgPrint(MAX_TRACE, ("Packet (0x%X).\n", Packet)); + + Packet->Private.Head = (PNDIS_BUFFER)((NDISI_PACKET_POOL*)Packet->Private.Pool)->FreeList; + ((NDISI_PACKET_POOL*)Packet->Private.Pool)->FreeList = Packet; } @@ -891,13 +956,15 @@ NdisGetFirstBufferFromPacket( Buffer = _Packet->Private.Head; *_FirstBuffer = Buffer; - *_FirstBufferVA = MmGetMdlVirtualAddress(Buffer); if (Buffer != NULL) { *_FirstBufferLength = MmGetMdlByteCount(Buffer); + *_FirstBufferVA = MmGetSystemAddressForMdl(Buffer); Buffer = Buffer->Next; - } else + } else { *_FirstBufferLength = 0; + *_FirstBufferVA = NULL; + } *_TotalBufferLength = *_FirstBufferLength; diff --git a/reactos/drivers/network/ndis/ndis/efilter.c b/reactos/drivers/network/ndis/ndis/efilter.c index 90a59b99bb7..e05b3d36b3e 100644 --- a/reactos/drivers/network/ndis/ndis/efilter.c +++ b/reactos/drivers/network/ndis/ndis/efilter.c @@ -59,7 +59,7 @@ EthDeleteFilter( /* - * @unimplemented + * @implemented */ VOID EXPORT @@ -100,7 +100,7 @@ EthFilterDprIndicateReceive( /* - * @unimplemented + * @implemented */ VOID EXPORT @@ -112,7 +112,6 @@ EthFilterDprIndicateReceiveComplete( * Filter = Pointer to Ethernet filter */ { - KIRQL OldIrql; PLIST_ENTRY CurrentEntry; PLOGICAL_ADAPTER Adapter; PADAPTER_BINDING AdapterBinding; @@ -124,7 +123,7 @@ EthFilterDprIndicateReceiveComplete( Adapter = (PLOGICAL_ADAPTER)((PETHI_FILTER)Filter)->Miniport; NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); - KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); + KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); { CurrentEntry = Adapter->ProtocolListHead.Flink; @@ -138,7 +137,7 @@ EthFilterDprIndicateReceiveComplete( CurrentEntry = CurrentEntry->Flink; } } - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); + KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); } /* EOF */ diff --git a/reactos/drivers/network/ndis/ndis/io.c b/reactos/drivers/network/ndis/ndis/io.c index 42e283b8ac9..936d6b8c6b9 100644 --- a/reactos/drivers/network/ndis/ndis/io.c +++ b/reactos/drivers/network/ndis/ndis/io.c @@ -198,7 +198,7 @@ NdisImmediateWritePortUlong( /* - * @unimplemented + * @implemented */ VOID EXPORT @@ -819,7 +819,7 @@ NdisMRegisterInterrupt( /* - * @unimplemented + * @implemented */ NDIS_STATUS EXPORT diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index cdb0a88fe0b..f6449aecf22 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -767,16 +767,17 @@ VOID NTAPI MiniportDpc( PVOID WorkItemContext; NDIS_WORK_ITEM_TYPE WorkItemType; PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext); - KIRQL OldIrql; NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); - KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); + KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); NdisStatus = MiniDequeueWorkItem (Adapter, &WorkItemType, &WorkItemContext); + KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); + if (NdisStatus == NDIS_STATUS_SUCCESS) { switch (WorkItemType) @@ -869,8 +870,6 @@ VOID NTAPI MiniportDpc( break; } } - - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); } @@ -1207,6 +1206,17 @@ DoQueries( return NdisStatus; } + NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAXIMUM_SEND_PACKETS, sizeof(ULONG), + &Adapter->NdisMiniportBlock.MaxSendPackets, &BytesWritten); + + if (NdisStatus != NDIS_STATUS_SUCCESS) + { + NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_MAXIMUM_SEND_PACKETS failed. NdisStatus (0x%X).\n", NdisStatus)); + + /* Set it to 1 if it fails because some drivers don't support this (?)*/ + Adapter->NdisMiniportBlock.MaxSendPackets = 1; + } + NDIS_DbgPrint(DEBUG_MINIPORT, ("CurLookaheadLength (0x%X).\n", Adapter->NdisMiniportBlock.CurrentLookahead)); if (Adapter->NdisMiniportBlock.MaximumLookahead != 0) diff --git a/reactos/drivers/network/ndis/ndis/protocol.c b/reactos/drivers/network/ndis/ndis/protocol.c index 818c5d2a8e8..50c7728dab7 100644 --- a/reactos/drivers/network/ndis/ndis/protocol.c +++ b/reactos/drivers/network/ndis/ndis/protocol.c @@ -63,7 +63,6 @@ ProIndicatePacket( * - XXX ATM, this only handles loopback packets - is that its designed function? */ { - KIRQL OldIrql; UINT BufferedLength; UINT PacketLength; @@ -76,12 +75,12 @@ ProIndicatePacket( NdisQueryPacket(Packet, NULL, NULL, NULL, &PacketLength); NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); - KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); + KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); { Adapter->NdisMiniportBlock.IndicatedPacket[KeGetCurrentProcessorNumber()] = Packet; BufferedLength = CopyPacketToBuffer(Adapter->LookaheadBuffer, Packet, 0, Adapter->NdisMiniportBlock.CurrentLookahead); } - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); + KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); if (BufferedLength > Adapter->MediumHeaderSize) { @@ -96,11 +95,11 @@ ProIndicatePacket( } NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); - KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); + KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); { Adapter->NdisMiniportBlock.IndicatedPacket[KeGetCurrentProcessorNumber()] = NULL; } - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); + KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); return STATUS_SUCCESS; }