while (CurrentEntry)
{
- if (CurrentEntry->WorkItemType == Type)
+ if (CurrentEntry->WorkItemType == Type || Type == NdisMaxWorkItems)
return CurrentEntry;
CurrentEntry = (PNDIS_MINIPORT_WORK_ITEM)CurrentEntry->Link.Next;
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
- if (Type == NdisWorkItemRequest &&
- (Adapter->NdisMiniportBlock.PendingRequest || MiniGetFirstWorkItem(Adapter, NdisWorkItemRequest)))
+ if (MiniGetFirstWorkItem(Adapter, Type))
+ {
+ Busy = TRUE;
+ }
+ else if (Type == NdisWorkItemRequest && Adapter->NdisMiniportBlock.PendingRequest)
{
Busy = TRUE;
}
- else if (Type == NdisWorkItemSend &&
- (Adapter->NdisMiniportBlock.FirstPendingPacket || MiniGetFirstWorkItem(Adapter, NdisWorkItemSend)))
+ else if (Type == NdisWorkItemSend && Adapter->NdisMiniportBlock.FirstPendingPacket)
{
Busy = TRUE;
}
- else if (Type == NdisWorkItemResetRequested &&
- (Adapter->NdisMiniportBlock.ResetStatus == NDIS_STATUS_PENDING || MiniGetFirstWorkItem(Adapter, NdisWorkItemResetRequested)))
+ else if (Type == NdisWorkItemResetRequested &&
+ Adapter->NdisMiniportBlock.ResetStatus == NDIS_STATUS_PENDING)
{
Busy = TRUE;
}
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
Adapter->NdisMiniportBlock.PendingRequest = NULL;
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
-
KeLowerIrql(OldIrql);
+
+ MiniWorkItemComplete(Adapter, NdisWorkItemRequest);
}
VOID NTAPI
Status);
KeLowerIrql(OldIrql);
+
+ MiniWorkItemComplete(Adapter, NdisWorkItemSend);
}
MiniSendResourcesAvailable(
IN NDIS_HANDLE MiniportAdapterHandle)
{
-/*
- UNIMPLEMENTED
-*/
+ /* Run the work if anything is waiting */
+ MiniWorkItemComplete((PLOGICAL_ADAPTER)MiniportAdapterHandle, NdisWorkItemSend);
}
NdisMIndicateStatus(Adapter, NDIS_STATUS_RESET_END, NULL, 0);
NdisMIndicateStatusComplete(Adapter);
+
+ MiniWorkItemComplete(Adapter, NdisWorkItemResetRequested);
}
return Status;
}
}
+VOID
+MiniWorkItemComplete(
+ PLOGICAL_ADAPTER Adapter,
+ NDIS_WORK_ITEM_TYPE WorkItemType)
+{
+ PIO_WORKITEM IoWorkItem;
+
+ /* Check if there's anything queued to run after this work item */
+ if (!MiniIsBusy(Adapter, WorkItemType))
+ return;
+
+ /* There is, so fire the worker */
+ IoWorkItem = IoAllocateWorkItem(Adapter->NdisMiniportBlock.DeviceObject);
+ if (IoWorkItem)
+ IoQueueWorkItem(IoWorkItem, MiniportWorker, DelayedWorkQueue, IoWorkItem);
+}
+
VOID
FASTCALL
MiniQueueWorkItem(
*/
{
PNDIS_MINIPORT_WORK_ITEM MiniportWorkItem;
- PIO_WORKITEM IoWorkItem;
KIRQL OldIrql;
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
}
}
- IoWorkItem = IoAllocateWorkItem(Adapter->NdisMiniportBlock.DeviceObject);
- if (IoWorkItem)
- IoQueueWorkItem(IoWorkItem, MiniportWorker, DelayedWorkQueue, IoWorkItem);
-
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
}
}
KeLowerIrql(OldIrql);
+
+ if (Status != NDIS_STATUS_PENDING) {
+ MiniWorkItemComplete(Adapter, NdisWorkItemRequest);
+ }
+
return Status;
}