From bdedaa4fe0ce55b3c5f5cc594ccb7527584243c8 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 22 Jul 2004 18:54:36 +0000 Subject: [PATCH] - Support for deserialized miniports (experimental). svn path=/trunk/; revision=10255 --- reactos/drivers/net/ndis/ndis/io.c | 4 +- reactos/drivers/net/ndis/ndis/miniport.c | 7 --- reactos/drivers/net/ndis/ndis/protocol.c | 59 +++++++++++++----------- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/reactos/drivers/net/ndis/ndis/io.c b/reactos/drivers/net/ndis/ndis/io.c index 40adb6d172b..f581bfdf12e 100644 --- a/reactos/drivers/net/ndis/ndis/io.c +++ b/reactos/drivers/net/ndis/ndis/io.c @@ -332,7 +332,7 @@ NdisMAllocateMapRegisters( /* only bus masters may call this routine */ ASSERT(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER); - if(!Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER) + if(!(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER)) return NDIS_STATUS_SUCCESS; DeviceObject = Adapter->NdisMiniportBlock.DeviceObject; @@ -660,7 +660,7 @@ NdisMFreeMapRegisters( /* only bus masters may call this routine */ ASSERT(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER); - if(!Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER) + if(!(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER)) return; MapRegistersPerBaseRegister = ((Adapter->NdisMiniportBlock.MaximumPhysicalMapping - 2) / PAGE_SIZE) + 2; diff --git a/reactos/drivers/net/ndis/ndis/miniport.c b/reactos/drivers/net/ndis/ndis/miniport.c index bea89356f40..146f4bdf2ac 100644 --- a/reactos/drivers/net/ndis/ndis/miniport.c +++ b/reactos/drivers/net/ndis/ndis/miniport.c @@ -1912,13 +1912,6 @@ NdisMSetAttributesEx( Adapter->NdisMiniportBlock.AdapterType = AdapterType; Adapter->AttributesSet = TRUE; - - if(AttributeFlags & NDIS_ATTRIBUTE_DESERIALIZE) - { - NDIS_DbgPrint(MIN_TRACE, ("Deserialized miniport - UNIMPLEMENTED\n")); - /* XXX when this is implemented, be sure to fix ProSend() to not nail the irql up to dispatch_level */ - ASSERT(0); - } } diff --git a/reactos/drivers/net/ndis/ndis/protocol.c b/reactos/drivers/net/ndis/ndis/protocol.c index 8fbbd2cd50c..8dbc91887e9 100644 --- a/reactos/drivers/net/ndis/ndis/protocol.c +++ b/reactos/drivers/net/ndis/ndis/protocol.c @@ -321,53 +321,60 @@ ProSend( */ if(Adapter->Miniport->Chars.SendPacketsHandler) { - /* TODO: support deserialized miniports by checking for attributes */ - /* SendPackets is called at DISPATCH_LEVEL for all serialized miniports */ - KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql); + if(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_DESERIALIZE) { NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's SendPackets handler\n")); (*Adapter->Miniport->Chars.SendPacketsHandler)(Adapter->NdisMiniportBlock.MiniportAdapterContext, &Packet, 1); } - KeLowerIrql(RaiseOldIrql); - - /* XXX why the hell do we do this? */ - NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); - KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &SpinOldIrql); + else { - if (Adapter->WorkQueueHead) - KeInsertQueueDpc(&Adapter->MiniportDpc, NULL, NULL); + /* SendPackets is called at DISPATCH_LEVEL for all serialized miniports */ + KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql); + { + NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's SendPackets handler\n")); + (*Adapter->Miniport->Chars.SendPacketsHandler)(Adapter->NdisMiniportBlock.MiniportAdapterContext, &Packet, 1); + } + KeLowerIrql(RaiseOldIrql); } - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql); - - NDIS_DbgPrint(MAX_TRACE, ("MiniportDpc queued; returning NDIS_STATUS_SCUCESS\n")); /* SendPackets handlers return void - they always "succeed" */ NdisStatus = NDIS_STATUS_SUCCESS; } else { - /* Send handlers always run at DISPATCH_LEVEL so we raise here */ - KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql); + /* XXX FIXME THIS IS WRONG */ + /* uh oh... forgot why i thought that... */ + if(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_DESERIALIZE) { - /* XXX FIXME THIS IS WRONG */ - /* uh oh... forgot why i thought that... */ + NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's Send handler\n")); + NdisStatus = (*Adapter->Miniport->Chars.u1.SendHandler)(Adapter->NdisMiniportBlock.MiniportAdapterContext, Packet, 0); + NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n")); + } + else + { + /* Send handlers always run at DISPATCH_LEVEL so we raise here */ + KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql); NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's Send handler\n")); NdisStatus = (*Adapter->Miniport->Chars.u1.SendHandler)(Adapter->NdisMiniportBlock.MiniportAdapterContext, Packet, 0); NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n")); - /* XXX why the hell do we do this? */ - NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); - KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); - { - if (Adapter->WorkQueueHead) - KeInsertQueueDpc(&Adapter->MiniportDpc, NULL, NULL); - } - KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); + KeLowerIrql(RaiseOldIrql); } - KeLowerIrql(RaiseOldIrql); } + /* XXX why the hell do we do this? */ + NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); + KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &SpinOldIrql); + { + if (Adapter->WorkQueueHead) + { + KeInsertQueueDpc(&Adapter->MiniportDpc, NULL, NULL); + NDIS_DbgPrint(MAX_TRACE, ("MiniportDpc queued; returning NDIS_STATUS_SUCCESS\n")); + } + } + KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql); + NDIS_DbgPrint(MAX_TRACE, ("returning 0x%x\n", NdisStatus)); return NdisStatus; }