mirror of
https://github.com/reactos/reactos.git
synced 2025-07-29 03:32:15 +00:00
- Merge aicom-network-fixes up to r37712
svn path=/trunk/; revision=37713
This commit is contained in:
parent
c7649d342c
commit
ffb80a044e
4 changed files with 106 additions and 5 deletions
|
@ -173,6 +173,11 @@ MiniSendComplete(
|
|||
IN PNDIS_PACKET Packet,
|
||||
IN NDIS_STATUS Status);
|
||||
|
||||
BOOLEAN
|
||||
MiniIsBusy(
|
||||
PLOGICAL_ADAPTER Adapter,
|
||||
NDIS_WORK_ITEM_TYPE Type);
|
||||
|
||||
#endif /* __MINIPORT_H */
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -134,6 +134,55 @@ MiniDisplayPacket2(
|
|||
#endif /* DBG */
|
||||
}
|
||||
|
||||
PNDIS_MINIPORT_WORK_ITEM
|
||||
MiniGetFirstWorkItem(
|
||||
PLOGICAL_ADAPTER Adapter,
|
||||
NDIS_WORK_ITEM_TYPE Type)
|
||||
{
|
||||
PNDIS_MINIPORT_WORK_ITEM CurrentEntry = Adapter->WorkQueueHead;
|
||||
|
||||
while (CurrentEntry)
|
||||
{
|
||||
if (CurrentEntry->WorkItemType == Type)
|
||||
return CurrentEntry;
|
||||
|
||||
CurrentEntry = (PNDIS_MINIPORT_WORK_ITEM)CurrentEntry->Link.Next;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
MiniIsBusy(
|
||||
PLOGICAL_ADAPTER Adapter,
|
||||
NDIS_WORK_ITEM_TYPE Type)
|
||||
{
|
||||
BOOLEAN Busy = FALSE;
|
||||
KIRQL OldIrql;
|
||||
|
||||
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||
|
||||
if (Type == NdisWorkItemRequest &&
|
||||
(Adapter->NdisMiniportBlock.PendingRequest || MiniGetFirstWorkItem(Adapter, NdisWorkItemRequest)))
|
||||
{
|
||||
Busy = TRUE;
|
||||
}
|
||||
else if (Type == NdisWorkItemSend &&
|
||||
(Adapter->NdisMiniportBlock.FirstPendingPacket || MiniGetFirstWorkItem(Adapter, NdisWorkItemSend)))
|
||||
{
|
||||
Busy = TRUE;
|
||||
}
|
||||
else if (Type == NdisWorkItemResetRequested &&
|
||||
(Adapter->NdisMiniportBlock.ResetStatus == NDIS_STATUS_PENDING || MiniGetFirstWorkItem(Adapter, NdisWorkItemResetRequested)))
|
||||
{
|
||||
Busy = TRUE;
|
||||
}
|
||||
|
||||
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||
|
||||
return Busy;
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
MiniIndicateData(
|
||||
|
@ -274,6 +323,8 @@ MiniResetComplete(
|
|||
|
||||
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||
|
||||
Adapter->NdisMiniportBlock.ResetStatus = Status;
|
||||
|
||||
CurrentEntry = Adapter->ProtocolListHead.Flink;
|
||||
|
||||
while (CurrentEntry != &Adapter->ProtocolListHead)
|
||||
|
@ -298,12 +349,18 @@ MiniRequestComplete(
|
|||
IN PNDIS_REQUEST Request,
|
||||
IN NDIS_STATUS Status)
|
||||
{
|
||||
PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle;
|
||||
PNDIS_REQUEST_MAC_BLOCK MacBlock = (PNDIS_REQUEST_MAC_BLOCK)Request->MacReserved;
|
||||
KIRQL OldIrql;
|
||||
|
||||
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
|
||||
|
||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||
|
||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
Adapter->NdisMiniportBlock.PendingRequest = NULL;
|
||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
|
||||
if( MacBlock->Binding->RequestCompleteHandler ) {
|
||||
(*MacBlock->Binding->RequestCompleteHandler)(
|
||||
MacBlock->Binding->ProtocolBindingContext,
|
||||
|
@ -601,6 +658,11 @@ MiniReset(
|
|||
NDIS_STATUS Status;
|
||||
KIRQL OldIrql;
|
||||
|
||||
if (MiniIsBusy(Adapter, NdisWorkItemResetRequested)) {
|
||||
MiniQueueWorkItem(Adapter, NdisWorkItemResetRequested, NULL, FALSE);
|
||||
return NDIS_STATUS_PENDING;
|
||||
}
|
||||
|
||||
NdisMIndicateStatus(Adapter, NDIS_STATUS_RESET_START, NULL, 0);
|
||||
NdisMIndicateStatusComplete(Adapter);
|
||||
|
||||
|
@ -608,6 +670,11 @@ MiniReset(
|
|||
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
|
||||
Adapter->NdisMiniportBlock.MiniportAdapterContext,
|
||||
AddressingReset);
|
||||
|
||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
Adapter->NdisMiniportBlock.ResetStatus = Status;
|
||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
|
||||
KeLowerIrql(OldIrql);
|
||||
|
||||
if (Status != NDIS_STATUS_PENDING) {
|
||||
|
@ -668,6 +735,7 @@ MiniQueueWorkItem(
|
|||
{
|
||||
if (WorkItemType == NdisWorkItemSend)
|
||||
{
|
||||
NDIS_DbgPrint(MIN_TRACE, ("Requeuing failed packet (%x).\n", WorkItemContext));
|
||||
Adapter->NdisMiniportBlock.FirstPendingPacket = WorkItemContext;
|
||||
}
|
||||
else
|
||||
|
@ -786,6 +854,11 @@ MiniDoRequest(
|
|||
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
|
||||
|
||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||
|
||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
Adapter->NdisMiniportBlock.PendingRequest = NdisRequest;
|
||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
|
||||
switch (NdisRequest->RequestType)
|
||||
{
|
||||
case NdisRequestQueryInformation:
|
||||
|
@ -812,6 +885,12 @@ MiniDoRequest(
|
|||
Status = NDIS_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
if (Status != NDIS_STATUS_PENDING) {
|
||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
Adapter->NdisMiniportBlock.PendingRequest = NULL;
|
||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
}
|
||||
|
||||
KeLowerIrql(OldIrql);
|
||||
return Status;
|
||||
}
|
||||
|
@ -968,12 +1047,18 @@ MiniportWorker(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
|
|||
NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
|
||||
Adapter->NdisMiniportBlock.MiniportAdapterContext,
|
||||
&AddressingReset);
|
||||
KeLowerIrql(OldIrql);
|
||||
|
||||
if (NdisStatus == NDIS_STATUS_PENDING)
|
||||
break;
|
||||
{
|
||||
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
Adapter->NdisMiniportBlock.ResetStatus = NDIS_STATUS_PENDING;
|
||||
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||
}
|
||||
|
||||
MiniResetComplete(Adapter, NdisStatus, AddressingReset);
|
||||
KeLowerIrql(OldIrql);
|
||||
|
||||
if (NdisStatus != NDIS_STATUS_PENDING)
|
||||
MiniResetComplete(Adapter, NdisStatus, AddressingReset);
|
||||
break;
|
||||
|
||||
case NdisWorkItemResetInProgress:
|
||||
|
@ -1002,6 +1087,7 @@ MiniportWorker(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
|
|||
|
||||
default:
|
||||
NDIS_DbgPrint(MIN_TRACE, ("Unknown NDIS request type.\n"));
|
||||
MiniRequestComplete( (NDIS_HANDLE)Adapter, (PNDIS_REQUEST)WorkItemContext, NdisStatus );
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -140,6 +140,11 @@ ProRequest(
|
|||
MiniQueueWorkItem(Adapter, NdisWorkItemRequest, NdisRequest, FALSE);
|
||||
return NDIS_STATUS_PENDING;
|
||||
#else
|
||||
if (MiniIsBusy(Adapter, NdisWorkItemRequest)) {
|
||||
MiniQueueWorkItem(Adapter, NdisWorkItemRequest, NdisRequest, FALSE);
|
||||
return NDIS_STATUS_PENDING;
|
||||
}
|
||||
|
||||
return MiniDoRequest(Adapter, NdisRequest);
|
||||
#endif
|
||||
}
|
||||
|
@ -164,7 +169,7 @@ proSendPacketToMiniport(PLOGICAL_ADAPTER Adapter, PNDIS_PACKET Packet)
|
|||
KIRQL RaiseOldIrql;
|
||||
NDIS_STATUS NdisStatus;
|
||||
|
||||
if(Adapter->NdisMiniportBlock.FirstPendingPacket) {
|
||||
if(MiniIsBusy(Adapter, NdisWorkItemSend)) {
|
||||
MiniQueueWorkItem(Adapter, NdisWorkItemSend, Packet, FALSE);
|
||||
return NDIS_STATUS_PENDING;
|
||||
}
|
||||
|
|
|
@ -27,12 +27,17 @@ NTSTATUS DispPrepareIrpForCancel(
|
|||
*/
|
||||
{
|
||||
KIRQL OldIrql;
|
||||
PIO_STACK_LOCATION IrpSp;
|
||||
PTRANSPORT_CONTEXT TransContext;
|
||||
|
||||
TI_DbgPrint(DEBUG_IRP, ("Called.\n"));
|
||||
|
||||
IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||
TransContext = (PTRANSPORT_CONTEXT)IrpSp->FileObject->FsContext;
|
||||
|
||||
IoAcquireCancelSpinLock(&OldIrql);
|
||||
|
||||
if (!Irp->Cancel) {
|
||||
if (!Irp->Cancel && !TransContext->CancelIrps) {
|
||||
(void)IoSetCancelRoutine(Irp, CancelRoutine);
|
||||
IoReleaseCancelSpinLock(OldIrql);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue