mirror of
https://github.com/reactos/reactos.git
synced 2024-09-14 06:42:52 +00:00
- Acquire the adapter lock instead of just raising to DISPATCH_LEVEL (MSDN hints at this in various areas)
svn path=/trunk/; revision=40446
This commit is contained in:
parent
1e94c549a8
commit
ba9ee79954
|
@ -355,11 +355,9 @@ MiniRequestComplete(
|
||||||
|
|
||||||
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
|
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
|
||||||
|
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||||
|
|
||||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
|
||||||
Adapter->NdisMiniportBlock.PendingRequest = NULL;
|
Adapter->NdisMiniportBlock.PendingRequest = NULL;
|
||||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
|
||||||
|
|
||||||
if( MacBlock->Binding->RequestCompleteHandler ) {
|
if( MacBlock->Binding->RequestCompleteHandler ) {
|
||||||
(*MacBlock->Binding->RequestCompleteHandler)(
|
(*MacBlock->Binding->RequestCompleteHandler)(
|
||||||
|
@ -367,7 +365,7 @@ MiniRequestComplete(
|
||||||
Request,
|
Request,
|
||||||
Status);
|
Status);
|
||||||
}
|
}
|
||||||
KeLowerIrql(OldIrql);
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID NTAPI
|
VOID NTAPI
|
||||||
|
@ -384,6 +382,7 @@ MiniSendComplete(
|
||||||
* Status = Status of send operation
|
* Status = Status of send operation
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
|
PLOGICAL_ADAPTER Adapter = MiniportAdapterHandle;
|
||||||
PADAPTER_BINDING AdapterBinding;
|
PADAPTER_BINDING AdapterBinding;
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
|
|
||||||
|
@ -391,12 +390,12 @@ MiniSendComplete(
|
||||||
|
|
||||||
AdapterBinding = (PADAPTER_BINDING)Packet->Reserved[0];
|
AdapterBinding = (PADAPTER_BINDING)Packet->Reserved[0];
|
||||||
|
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||||
(*AdapterBinding->ProtocolBinding->Chars.SendCompleteHandler)(
|
(*AdapterBinding->ProtocolBinding->Chars.SendCompleteHandler)(
|
||||||
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
|
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
|
||||||
Packet,
|
Packet,
|
||||||
Status);
|
Status);
|
||||||
KeLowerIrql(OldIrql);
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -417,6 +416,7 @@ MiniTransferDataComplete(
|
||||||
IN NDIS_STATUS Status,
|
IN NDIS_STATUS Status,
|
||||||
IN UINT BytesTransferred)
|
IN UINT BytesTransferred)
|
||||||
{
|
{
|
||||||
|
PLOGICAL_ADAPTER Adapter = MiniportAdapterHandle;
|
||||||
PADAPTER_BINDING AdapterBinding;
|
PADAPTER_BINDING AdapterBinding;
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
|
|
||||||
|
@ -424,13 +424,13 @@ MiniTransferDataComplete(
|
||||||
|
|
||||||
AdapterBinding = (PADAPTER_BINDING)Packet->Reserved[0];
|
AdapterBinding = (PADAPTER_BINDING)Packet->Reserved[0];
|
||||||
|
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||||
(*AdapterBinding->ProtocolBinding->Chars.TransferDataCompleteHandler)(
|
(*AdapterBinding->ProtocolBinding->Chars.TransferDataCompleteHandler)(
|
||||||
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
|
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
|
||||||
Packet,
|
Packet,
|
||||||
Status,
|
Status,
|
||||||
BytesTransferred);
|
BytesTransferred);
|
||||||
KeLowerIrql(OldIrql);
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -605,7 +605,7 @@ MiniQueryInformation(
|
||||||
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
|
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
|
||||||
|
|
||||||
/* call the miniport's queryinfo handler */
|
/* call the miniport's queryinfo handler */
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||||
NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
|
NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
|
||||||
Adapter->NdisMiniportBlock.MiniportAdapterContext,
|
Adapter->NdisMiniportBlock.MiniportAdapterContext,
|
||||||
Oid,
|
Oid,
|
||||||
|
@ -613,7 +613,7 @@ MiniQueryInformation(
|
||||||
Size,
|
Size,
|
||||||
BytesWritten,
|
BytesWritten,
|
||||||
&BytesNeeded);
|
&BytesNeeded);
|
||||||
KeLowerIrql(OldIrql);
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||||
|
|
||||||
/* FIXME: Wait in pending case! */
|
/* FIXME: Wait in pending case! */
|
||||||
|
|
||||||
|
@ -634,11 +634,11 @@ MiniCheckForHang( PLOGICAL_ADAPTER Adapter )
|
||||||
BOOLEAN Ret = FALSE;
|
BOOLEAN Ret = FALSE;
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
|
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||||
if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CheckForHangHandler)
|
if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CheckForHangHandler)
|
||||||
Ret = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CheckForHangHandler)(
|
Ret = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CheckForHangHandler)(
|
||||||
Adapter->NdisMiniportBlock.MiniportAdapterContext);
|
Adapter->NdisMiniportBlock.MiniportAdapterContext);
|
||||||
KeLowerIrql(OldIrql);
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||||
|
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
@ -667,16 +667,14 @@ MiniReset(
|
||||||
NdisMIndicateStatus(Adapter, NDIS_STATUS_RESET_START, NULL, 0);
|
NdisMIndicateStatus(Adapter, NDIS_STATUS_RESET_START, NULL, 0);
|
||||||
NdisMIndicateStatusComplete(Adapter);
|
NdisMIndicateStatusComplete(Adapter);
|
||||||
|
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||||
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
|
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
|
||||||
Adapter->NdisMiniportBlock.MiniportAdapterContext,
|
Adapter->NdisMiniportBlock.MiniportAdapterContext,
|
||||||
AddressingReset);
|
AddressingReset);
|
||||||
|
|
||||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
|
||||||
Adapter->NdisMiniportBlock.ResetStatus = Status;
|
Adapter->NdisMiniportBlock.ResetStatus = Status;
|
||||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
|
||||||
|
|
||||||
KeLowerIrql(OldIrql);
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||||
|
|
||||||
if (Status != NDIS_STATUS_PENDING) {
|
if (Status != NDIS_STATUS_PENDING) {
|
||||||
NdisMIndicateStatus(Adapter, NDIS_STATUS_RESET_END, NULL, 0);
|
NdisMIndicateStatus(Adapter, NDIS_STATUS_RESET_END, NULL, 0);
|
||||||
|
@ -854,11 +852,9 @@ MiniDoRequest(
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
|
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
|
||||||
|
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||||
|
|
||||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
|
||||||
Adapter->NdisMiniportBlock.PendingRequest = NdisRequest;
|
Adapter->NdisMiniportBlock.PendingRequest = NdisRequest;
|
||||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
|
||||||
|
|
||||||
switch (NdisRequest->RequestType)
|
switch (NdisRequest->RequestType)
|
||||||
{
|
{
|
||||||
|
@ -887,12 +883,10 @@ MiniDoRequest(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Status != NDIS_STATUS_PENDING) {
|
if (Status != NDIS_STATUS_PENDING) {
|
||||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
|
||||||
Adapter->NdisMiniportBlock.PendingRequest = NULL;
|
Adapter->NdisMiniportBlock.PendingRequest = NULL;
|
||||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
KeLowerIrql(OldIrql);
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -909,12 +903,10 @@ NdisMSetInformationComplete(
|
||||||
{
|
{
|
||||||
PLOGICAL_ADAPTER Adapter =
|
PLOGICAL_ADAPTER Adapter =
|
||||||
(PLOGICAL_ADAPTER)MiniportAdapterHandle;
|
(PLOGICAL_ADAPTER)MiniportAdapterHandle;
|
||||||
KIRQL OldIrql;
|
|
||||||
ASSERT(Adapter);
|
ASSERT(Adapter);
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
/* This isn't a handler supplied by the miniport */
|
||||||
if (Adapter->NdisMiniportBlock.SetCompleteHandler)
|
if (Adapter->NdisMiniportBlock.SetCompleteHandler)
|
||||||
(Adapter->NdisMiniportBlock.SetCompleteHandler)(MiniportAdapterHandle, Status);
|
(Adapter->NdisMiniportBlock.SetCompleteHandler)(MiniportAdapterHandle, Status);
|
||||||
KeLowerIrql(OldIrql);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -930,12 +922,10 @@ NdisMQueryInformationComplete(
|
||||||
{
|
{
|
||||||
PLOGICAL_ADAPTER Adapter =
|
PLOGICAL_ADAPTER Adapter =
|
||||||
(PLOGICAL_ADAPTER)MiniportAdapterHandle;
|
(PLOGICAL_ADAPTER)MiniportAdapterHandle;
|
||||||
KIRQL OldIrql;
|
|
||||||
ASSERT(Adapter);
|
ASSERT(Adapter);
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
/* This isn't a handler supplied by the miniport */
|
||||||
if( Adapter->NdisMiniportBlock.QueryCompleteHandler )
|
if( Adapter->NdisMiniportBlock.QueryCompleteHandler )
|
||||||
(Adapter->NdisMiniportBlock.QueryCompleteHandler)(MiniportAdapterHandle, Status);
|
(Adapter->NdisMiniportBlock.QueryCompleteHandler)(MiniportAdapterHandle, Status);
|
||||||
KeLowerIrql(OldIrql);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -980,13 +970,11 @@ MiniportWorker(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* SendPackets is called at DISPATCH_LEVEL for all serialized miniports */
|
/* SendPackets is called at DISPATCH_LEVEL for all serialized miniports */
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &RaiseOldIrql);
|
||||||
{
|
|
||||||
NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's SendPackets handler\n"));
|
NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's SendPackets handler\n"));
|
||||||
(*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)(
|
(*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)(
|
||||||
Adapter->NdisMiniportBlock.MiniportAdapterContext, (PPNDIS_PACKET)&WorkItemContext, 1);
|
Adapter->NdisMiniportBlock.MiniportAdapterContext, (PPNDIS_PACKET)&WorkItemContext, 1);
|
||||||
}
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, RaiseOldIrql);
|
||||||
KeLowerIrql(RaiseOldIrql);
|
|
||||||
|
|
||||||
NdisStatus = NDIS_GET_PACKET_STATUS((PNDIS_PACKET)WorkItemContext);
|
NdisStatus = NDIS_GET_PACKET_STATUS((PNDIS_PACKET)WorkItemContext);
|
||||||
if( NdisStatus == NDIS_STATUS_RESOURCES ) {
|
if( NdisStatus == NDIS_STATUS_RESOURCES ) {
|
||||||
|
@ -1008,13 +996,13 @@ MiniportWorker(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Send is called at DISPATCH_LEVEL for all serialized miniports */
|
/* Send is called at DISPATCH_LEVEL for all serialized miniports */
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &RaiseOldIrql);
|
||||||
NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's Send handler\n"));
|
NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's Send handler\n"));
|
||||||
NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendHandler)(
|
NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendHandler)(
|
||||||
Adapter->NdisMiniportBlock.MiniportAdapterContext, (PNDIS_PACKET)WorkItemContext,
|
Adapter->NdisMiniportBlock.MiniportAdapterContext, (PNDIS_PACKET)WorkItemContext,
|
||||||
((PNDIS_PACKET)WorkItemContext)->Private.Flags);
|
((PNDIS_PACKET)WorkItemContext)->Private.Flags);
|
||||||
NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n"));
|
NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n"));
|
||||||
KeLowerIrql(RaiseOldIrql);
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, RaiseOldIrql);
|
||||||
if( NdisStatus == NDIS_STATUS_RESOURCES ) {
|
if( NdisStatus == NDIS_STATUS_RESOURCES ) {
|
||||||
MiniQueueWorkItem(Adapter, WorkItemType, WorkItemContext, TRUE);
|
MiniQueueWorkItem(Adapter, WorkItemType, WorkItemContext, TRUE);
|
||||||
break;
|
break;
|
||||||
|
@ -1046,19 +1034,14 @@ MiniportWorker(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
|
||||||
NdisMIndicateStatus(Adapter, NDIS_STATUS_RESET_START, NULL, 0);
|
NdisMIndicateStatus(Adapter, NDIS_STATUS_RESET_START, NULL, 0);
|
||||||
NdisMIndicateStatusComplete(Adapter);
|
NdisMIndicateStatusComplete(Adapter);
|
||||||
|
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||||
NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
|
NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
|
||||||
Adapter->NdisMiniportBlock.MiniportAdapterContext,
|
Adapter->NdisMiniportBlock.MiniportAdapterContext,
|
||||||
&AddressingReset);
|
&AddressingReset);
|
||||||
|
|
||||||
if (NdisStatus == NDIS_STATUS_PENDING)
|
Adapter->NdisMiniportBlock.ResetStatus = NdisStatus;
|
||||||
{
|
|
||||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
|
||||||
Adapter->NdisMiniportBlock.ResetStatus = NDIS_STATUS_PENDING;
|
|
||||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
KeLowerIrql(OldIrql);
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||||
|
|
||||||
if (NdisStatus != NDIS_STATUS_PENDING)
|
if (NdisStatus != NDIS_STATUS_PENDING)
|
||||||
MiniResetComplete(Adapter, NdisStatus, AddressingReset);
|
MiniResetComplete(Adapter, NdisStatus, AddressingReset);
|
||||||
|
|
|
@ -204,13 +204,11 @@ proSendPacketToMiniport(PLOGICAL_ADAPTER Adapter, PNDIS_PACKET Packet)
|
||||||
NdisStatus = NDIS_STATUS_PENDING;
|
NdisStatus = NDIS_STATUS_PENDING;
|
||||||
} else {
|
} else {
|
||||||
/* SendPackets is called at DISPATCH_LEVEL for all serialized miniports */
|
/* SendPackets is called at DISPATCH_LEVEL for all serialized miniports */
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &RaiseOldIrql);
|
||||||
{
|
|
||||||
NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's SendPackets handler\n"));
|
NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's SendPackets handler\n"));
|
||||||
(*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)(
|
(*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)(
|
||||||
Adapter->NdisMiniportBlock.MiniportAdapterContext, &Packet, 1);
|
Adapter->NdisMiniportBlock.MiniportAdapterContext, &Packet, 1);
|
||||||
}
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, RaiseOldIrql);
|
||||||
KeLowerIrql(RaiseOldIrql);
|
|
||||||
|
|
||||||
NdisStatus = NDIS_GET_PACKET_STATUS(Packet);
|
NdisStatus = NDIS_GET_PACKET_STATUS(Packet);
|
||||||
if (NdisStatus == NDIS_STATUS_RESOURCES) {
|
if (NdisStatus == NDIS_STATUS_RESOURCES) {
|
||||||
|
@ -229,12 +227,12 @@ proSendPacketToMiniport(PLOGICAL_ADAPTER Adapter, PNDIS_PACKET Packet)
|
||||||
NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n"));
|
NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n"));
|
||||||
} else {
|
} else {
|
||||||
/* Send is called at DISPATCH_LEVEL for all serialized miniports */
|
/* Send is called at DISPATCH_LEVEL for all serialized miniports */
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &RaiseOldIrql);
|
||||||
NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's Send handler\n"));
|
NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's Send handler\n"));
|
||||||
NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendHandler)(
|
NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendHandler)(
|
||||||
Adapter->NdisMiniportBlock.MiniportAdapterContext, Packet, Packet->Private.Flags);
|
Adapter->NdisMiniportBlock.MiniportAdapterContext, Packet, Packet->Private.Flags);
|
||||||
NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n"));
|
NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n"));
|
||||||
KeLowerIrql(RaiseOldIrql);
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, RaiseOldIrql);
|
||||||
|
|
||||||
if (NdisStatus == NDIS_STATUS_RESOURCES) {
|
if (NdisStatus == NDIS_STATUS_RESOURCES) {
|
||||||
MiniQueueWorkItem(Adapter, NdisWorkItemSend, Packet, TRUE);
|
MiniQueueWorkItem(Adapter, NdisWorkItemSend, Packet, TRUE);
|
||||||
|
@ -274,8 +272,6 @@ ProSend(
|
||||||
Adapter = AdapterBinding->Adapter;
|
Adapter = AdapterBinding->Adapter;
|
||||||
|
|
||||||
ASSERT(Adapter);
|
ASSERT(Adapter);
|
||||||
|
|
||||||
/* if the following is not true, KeRaiseIrql() below will break */
|
|
||||||
ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
|
ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
|
||||||
|
|
||||||
/* XXX what is this crazy black magic? */
|
/* XXX what is this crazy black magic? */
|
||||||
|
@ -326,10 +322,10 @@ ProSendPackets(
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* SendPackets is called at DISPATCH_LEVEL for all serialized miniports */
|
/* SendPackets is called at DISPATCH_LEVEL for all serialized miniports */
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &RaiseOldIrql);
|
||||||
(*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)(
|
(*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)(
|
||||||
Adapter->NdisMiniportBlock.MiniportAdapterContext, PacketArray, NumberOfPackets);
|
Adapter->NdisMiniportBlock.MiniportAdapterContext, PacketArray, NumberOfPackets);
|
||||||
KeLowerIrql(RaiseOldIrql);
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, RaiseOldIrql);
|
||||||
for (i = 0; i < NumberOfPackets; i++)
|
for (i = 0; i < NumberOfPackets; i++)
|
||||||
{
|
{
|
||||||
NdisStatus = NDIS_GET_PACKET_STATUS(PacketArray[i]);
|
NdisStatus = NDIS_GET_PACKET_STATUS(PacketArray[i]);
|
||||||
|
@ -353,7 +349,7 @@ ProSendPackets(
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Send is called at DISPATCH_LEVEL for all serialized miniports */
|
/* Send is called at DISPATCH_LEVEL for all serialized miniports */
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &RaiseOldIrql);
|
||||||
for (i = 0; i < NumberOfPackets; i++)
|
for (i = 0; i < NumberOfPackets; i++)
|
||||||
{
|
{
|
||||||
NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendHandler)(
|
NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendHandler)(
|
||||||
|
@ -361,7 +357,7 @@ ProSendPackets(
|
||||||
if (NdisStatus != NDIS_STATUS_PENDING)
|
if (NdisStatus != NDIS_STATUS_PENDING)
|
||||||
MiniSendComplete(Adapter, PacketArray[i], NdisStatus);
|
MiniSendComplete(Adapter, PacketArray[i], NdisStatus);
|
||||||
}
|
}
|
||||||
KeLowerIrql(RaiseOldIrql);
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, RaiseOldIrql);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -408,7 +404,7 @@ ProTransferData(
|
||||||
return NDIS_STATUS_SUCCESS;
|
return NDIS_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||||
|
|
||||||
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.TransferDataHandler)(
|
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.TransferDataHandler)(
|
||||||
Packet,
|
Packet,
|
||||||
|
@ -418,7 +414,7 @@ ProTransferData(
|
||||||
ByteOffset,
|
ByteOffset,
|
||||||
BytesToTransfer);
|
BytesToTransfer);
|
||||||
|
|
||||||
KeLowerIrql(OldIrql);
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue