mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 17:45:41 +00:00
- Protect MiniportBusy with a spin lock
- Adapter is PLOGICAL_ADAPTER not PNDIS_MINIPORT_BLOCK - Make sure memory allocation was successful - Cleanup code in ProRequest svn path=/branches/aicom-network-fixes/; revision=36556
This commit is contained in:
parent
a4c5f0d79c
commit
72f9da2665
3 changed files with 30 additions and 32 deletions
|
@ -146,7 +146,7 @@ MiniDequeueWorkItem(
|
|||
|
||||
NDIS_STATUS
|
||||
MiniDoRequest(
|
||||
PNDIS_MINIPORT_BLOCK Adapter,
|
||||
PLOGICAL_ADAPTER Adapter,
|
||||
PNDIS_REQUEST NdisRequest);
|
||||
|
||||
BOOLEAN
|
||||
|
|
|
@ -326,8 +326,10 @@ MiniRequestComplete(
|
|||
Request,
|
||||
Status);
|
||||
}
|
||||
KeLowerIrql(OldIrql);
|
||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
Adapter->MiniportBusy = FALSE;
|
||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
KeLowerIrql(OldIrql);
|
||||
}
|
||||
|
||||
VOID NTAPI
|
||||
|
@ -357,8 +359,10 @@ MiniSendComplete(
|
|||
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
|
||||
Packet,
|
||||
Status);
|
||||
KeLowerIrql(OldIrql);
|
||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
Adapter->MiniportBusy = FALSE;
|
||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
KeLowerIrql(OldIrql);
|
||||
}
|
||||
|
||||
|
||||
|
@ -392,8 +396,10 @@ MiniTransferDataComplete(
|
|||
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
|
||||
Packet,
|
||||
Status);
|
||||
KeLowerIrql(OldIrql);
|
||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
Adapter->MiniportBusy = FALSE;
|
||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
KeLowerIrql(OldIrql);
|
||||
}
|
||||
|
||||
|
||||
|
@ -767,7 +773,7 @@ MiniDequeueWorkItem(
|
|||
|
||||
NDIS_STATUS
|
||||
MiniDoRequest(
|
||||
PNDIS_MINIPORT_BLOCK Adapter,
|
||||
PLOGICAL_ADAPTER Adapter,
|
||||
PNDIS_REQUEST NdisRequest)
|
||||
/*
|
||||
* FUNCTION: Sends a request to a miniport
|
||||
|
@ -782,14 +788,14 @@ MiniDoRequest(
|
|||
KIRQL OldIrql;
|
||||
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
|
||||
|
||||
Adapter->MediaRequest = NdisRequest;
|
||||
Adapter->NdisMiniportBlock.MediaRequest = NdisRequest;
|
||||
|
||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||
switch (NdisRequest->RequestType)
|
||||
{
|
||||
case NdisRequestQueryInformation:
|
||||
Status = (*Adapter->DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
|
||||
Adapter->MiniportAdapterContext,
|
||||
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
|
||||
Adapter->NdisMiniportBlock.MiniportAdapterContext,
|
||||
NdisRequest->DATA.QUERY_INFORMATION.Oid,
|
||||
NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,
|
||||
NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,
|
||||
|
@ -798,8 +804,8 @@ MiniDoRequest(
|
|||
break;
|
||||
|
||||
case NdisRequestSetInformation:
|
||||
Status = (*Adapter->DriverHandle->MiniportCharacteristics.SetInformationHandler)(
|
||||
Adapter->MiniportAdapterContext,
|
||||
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SetInformationHandler)(
|
||||
Adapter->NdisMiniportBlock.MiniportAdapterContext,
|
||||
NdisRequest->DATA.SET_INFORMATION.Oid,
|
||||
NdisRequest->DATA.SET_INFORMATION.InformationBuffer,
|
||||
NdisRequest->DATA.SET_INFORMATION.InformationBufferLength,
|
||||
|
@ -833,8 +839,10 @@ NdisMQueryInformationComplete(
|
|||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||
if( Adapter->NdisMiniportBlock.QueryCompleteHandler )
|
||||
(Adapter->NdisMiniportBlock.QueryCompleteHandler)(MiniportAdapterHandle, Status);
|
||||
KeLowerIrql(OldIrql);
|
||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
Adapter->MiniportBusy = FALSE;
|
||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
KeLowerIrql(OldIrql);
|
||||
}
|
||||
|
||||
VOID NTAPI MiniportWorker(IN PVOID WorkItem)
|
||||
|
@ -962,7 +970,7 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
|
|||
break;
|
||||
|
||||
case NdisWorkItemRequest:
|
||||
NdisStatus = MiniDoRequest(&Adapter->NdisMiniportBlock, (PNDIS_REQUEST)WorkItemContext);
|
||||
NdisStatus = MiniDoRequest(Adapter, (PNDIS_REQUEST)WorkItemContext);
|
||||
|
||||
if (NdisStatus == NDIS_STATUS_PENDING)
|
||||
break;
|
||||
|
@ -1019,6 +1027,7 @@ VOID NTAPI MiniportDpc(
|
|||
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
|
||||
|
||||
NdisWorkItem = ExAllocatePool(NonPagedPool, sizeof(NDIS_WORK_ITEM));
|
||||
if (!NdisWorkItem) return;
|
||||
|
||||
WorkItem = (PWORK_QUEUE_ITEM)NdisWorkItem->WrapperReserved;
|
||||
|
||||
|
@ -2123,8 +2132,10 @@ NdisMSetInformationComplete(
|
|||
ASSERT(Adapter);
|
||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||
(Adapter->NdisMiniportBlock.SetCompleteHandler)(MiniportAdapterHandle, Status);
|
||||
KeLowerIrql(OldIrql);
|
||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
Adapter->MiniportBusy = FALSE;
|
||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
KeLowerIrql(OldIrql);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -119,8 +119,6 @@ ProRequest(
|
|||
*/
|
||||
{
|
||||
KIRQL OldIrql;
|
||||
BOOLEAN QueueWorkItem = FALSE;
|
||||
NDIS_STATUS NdisStatus;
|
||||
PADAPTER_BINDING AdapterBinding;
|
||||
PLOGICAL_ADAPTER Adapter;
|
||||
PNDIS_REQUEST_MAC_BLOCK MacBlock = (PNDIS_REQUEST_MAC_BLOCK)NdisRequest->MacReserved;
|
||||
|
@ -141,26 +139,15 @@ ProRequest(
|
|||
NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
|
||||
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||
{
|
||||
if(Adapter->MiniportBusy)
|
||||
QueueWorkItem = TRUE;
|
||||
if (Adapter->MiniportBusy) {
|
||||
MiniQueueWorkItem(Adapter, NdisWorkItemRequest, (PVOID)NdisRequest);
|
||||
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||
return NDIS_STATUS_PENDING;
|
||||
}
|
||||
}
|
||||
|
||||
/* MiniQueueWorkItem must be called at IRQL >= DISPATCH_LEVEL */
|
||||
if (QueueWorkItem)
|
||||
{
|
||||
MiniQueueWorkItem(Adapter, NdisWorkItemRequest, (PVOID)NdisRequest);
|
||||
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||
return NDIS_STATUS_PENDING;
|
||||
}
|
||||
|
||||
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||
|
||||
NdisStatus = MiniDoRequest(&Adapter->NdisMiniportBlock, NdisRequest);
|
||||
|
||||
if( NdisStatus == NDIS_STATUS_PENDING )
|
||||
Adapter->MiniportBusy = TRUE;
|
||||
|
||||
return NdisStatus;
|
||||
return MiniDoRequest(Adapter, NdisRequest);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue