mirror of
https://github.com/reactos/reactos.git
synced 2024-06-30 01:42:30 +00:00
- Support for deserialized miniports (experimental).
svn path=/trunk/; revision=10255
This commit is contained in:
parent
6e64d6266e
commit
bdedaa4fe0
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue