/********************************************************** NDIS-required procedure for DPC handling Parameters: PVOID MiniportInterruptContext (Adapter context) ***********************************************************/ static VOID MiniportInterruptDPC( IN NDIS_HANDLE MiniportInterruptContext, IN PVOID MiniportDpcContext, IN PVOID ReceiveThrottleParameters, IN PVOID NdisReserved2 ) { PARANDIS_ADAPTER *pContext = (PARANDIS_ADAPTER *)MiniportInterruptContext; ULONG requiresProcessing; #if NDIS_SUPPORT_NDIS620 PNDIS_RECEIVE_THROTTLE_PARAMETERS RxThrottleParameters = (PNDIS_RECEIVE_THROTTLE_PARAMETERS)ReceiveThrottleParameters; DEBUG_ENTRY(5); RxThrottleParameters->MoreNblsPending = 0; requiresProcessing = ParaNdis_DPCWorkBody(pContext, RxThrottleParameters->MaxNblsToIndicate); if(requiresProcessing) { BOOLEAN bSpawnNextDpc = FALSE; DPrintf(4, ("[%s] Queued additional DPC for %d\n", __FUNCTION__, requiresProcessing)); InterlockedOr(&pContext->InterruptStatus, requiresProcessing); if(requiresProcessing & isReceive) { if (NDIS_INDICATE_ALL_NBLS != RxThrottleParameters->MaxNblsToIndicate) RxThrottleParameters->MoreNblsPending = 1; else bSpawnNextDpc = TRUE; } if(requiresProcessing & isTransmit) bSpawnNextDpc = TRUE; if (bSpawnNextDpc) { GROUP_AFFINITY Affinity; GetAffinityForCurrentCpu(&Affinity); NdisMQueueDpcEx(pContext->InterruptHandle, 0, &Affinity, MiniportDpcContext); } } #else /* NDIS 6.0*/ DEBUG_ENTRY(5); UNREFERENCED_PARAMETER(ReceiveThrottleParameters); requiresProcessing = ParaNdis_DPCWorkBody(pContext, PARANDIS_UNLIMITED_PACKETS_TO_INDICATE); if (requiresProcessing) { DPrintf(4, ("[%s] Queued additional DPC for %d\n", __FUNCTION__, requiresProcessing)); InterlockedOr(&pContext->InterruptStatus, requiresProcessing); NdisMQueueDpc(pContext->InterruptHandle, 0, 1 << KeGetCurrentProcessorNumber(), MiniportDpcContext); } #endif /* NDIS_SUPPORT_NDIS620 */ UNREFERENCED_PARAMETER(NdisReserved2); }
/********************************************************** NDIS-required procedure for MSI DPC handling Parameters: PVOID MiniportInterruptContext (Adapter context) IN ULONG MessageId - specific interrupt index ***********************************************************/ static VOID MiniportMSIInterruptDpc( IN PVOID MiniportInterruptContext, IN ULONG MessageId, IN PVOID MiniportDpcContext, #if NDIS_SUPPORT_NDIS620 IN PVOID ReceiveThrottleParameters, IN PVOID NdisReserved2 #else IN PULONG NdisReserved1, IN PULONG NdisReserved2 #endif ) { PARANDIS_ADAPTER *pContext = (PARANDIS_ADAPTER *)MiniportInterruptContext; bool requireDPCRescheduling; #if NDIS_SUPPORT_NDIS620 PNDIS_RECEIVE_THROTTLE_PARAMETERS RxThrottleParameters = (PNDIS_RECEIVE_THROTTLE_PARAMETERS)ReceiveThrottleParameters; RxThrottleParameters->MoreNblsPending = 0; requireDPCRescheduling = ParaNdis_DPCWorkBody(pContext, RxThrottleParameters->MaxNblsToIndicate); if (requireDPCRescheduling) { GROUP_AFFINITY Affinity; GetAffinityForCurrentCpu(&Affinity); NdisMQueueDpcEx(pContext->InterruptHandle, MessageId, &Affinity, MiniportDpcContext); } #else UNREFERENCED_PARAMETER(NdisReserved1); requireDPCRescheduling = ParaNdis_DPCWorkBody(pContext, PARANDIS_UNLIMITED_PACKETS_TO_INDICATE); if (requireDPCRescheduling) { NdisMQueueDpc(pContext->InterruptHandle, MessageId, 1 << KeGetCurrentProcessorNumber(), MiniportDpcContext); } #endif UNREFERENCED_PARAMETER(NdisReserved2); }
/********************************************************** NDIS-required procedure for DPC handling Parameters: PVOID MiniportInterruptContext (Adapter context) ***********************************************************/ static VOID MiniportInterruptDPC( IN NDIS_HANDLE MiniportInterruptContext, IN PVOID MiniportDpcContext, IN PVOID ReceiveThrottleParameters, IN PVOID NdisReserved2 ) { PARANDIS_ADAPTER *pContext = (PARANDIS_ADAPTER *)MiniportInterruptContext; bool requiresDPCRescheduling; #if NDIS_SUPPORT_NDIS620 PNDIS_RECEIVE_THROTTLE_PARAMETERS RxThrottleParameters = (PNDIS_RECEIVE_THROTTLE_PARAMETERS)ReceiveThrottleParameters; DEBUG_ENTRY(5); RxThrottleParameters->MoreNblsPending = 0; requiresDPCRescheduling = ParaNdis_DPCWorkBody(pContext, RxThrottleParameters->MaxNblsToIndicate); if (requiresDPCRescheduling) { GROUP_AFFINITY Affinity; GetAffinityForCurrentCpu(&Affinity); NdisMQueueDpcEx(pContext->InterruptHandle, 0, &Affinity, MiniportDpcContext); } #else /* NDIS 6.0*/ DEBUG_ENTRY(5); UNREFERENCED_PARAMETER(ReceiveThrottleParameters); requiresDPCRescheduling = ParaNdis_DPCWorkBody(pContext, PARANDIS_UNLIMITED_PACKETS_TO_INDICATE); if (requiresDPCRescheduling) { DPrintf(4, ("[%s] Queued additional DPC for %d\n", __FUNCTION__, requiresDPCRescheduling)); NdisMQueueDpc(pContext->InterruptHandle, 0, 1 << KeGetCurrentProcessorNumber(), MiniportDpcContext); } #endif /* NDIS_SUPPORT_NDIS620 */ UNREFERENCED_PARAMETER(NdisReserved2); }
/********************************************************** NDIS-required procedure for MSI DPC handling Parameters: PVOID MiniportInterruptContext (Adapter context) IN ULONG MessageId - specific interrupt index ***********************************************************/ static VOID MiniportMSIInterruptDpc( IN PVOID MiniportInterruptContext, IN ULONG MessageId, IN PVOID MiniportDpcContext, #if NDIS_SUPPORT_NDIS620 IN PVOID ReceiveThrottleParameters, IN PVOID NdisReserved2 #else IN PULONG NdisReserved1, IN PULONG NdisReserved2 #endif ) { PARANDIS_ADAPTER *pContext = (PARANDIS_ADAPTER *)MiniportInterruptContext; ULONG interruptSource = MessageToInterruptSource(pContext, MessageId); #if NDIS_SUPPORT_NDIS620 BOOLEAN bSpawnNextDpc = FALSE; PNDIS_RECEIVE_THROTTLE_PARAMETERS RxThrottleParameters = (PNDIS_RECEIVE_THROTTLE_PARAMETERS)ReceiveThrottleParameters; DPrintf(5, ("[%s] (Message %d, source %d)\n", __FUNCTION__, MessageId, interruptSource)); RxThrottleParameters->MoreNblsPending = 0; interruptSource = ParaNdis_DPCWorkBody(pContext, RxThrottleParameters->MaxNblsToIndicate); if (interruptSource) { InterlockedOr(&pContext->InterruptStatus, interruptSource); if (interruptSource & isReceive) { if (NDIS_INDICATE_ALL_NBLS != RxThrottleParameters->MaxNblsToIndicate) { RxThrottleParameters->MoreNblsPending = 1; DPrintf(3, ("[%s] Requested additional RX DPC\n", __FUNCTION__)); } else bSpawnNextDpc = TRUE; } if (interruptSource & isTransmit) bSpawnNextDpc = TRUE; if (bSpawnNextDpc) { GROUP_AFFINITY Affinity; GetAffinityForCurrentCpu(&Affinity); NdisMQueueDpcEx(pContext->InterruptHandle, MessageId, &Affinity, MiniportDpcContext); } } #else UNREFERENCED_PARAMETER(NdisReserved1); DPrintf(5, ("[%s] (Message %d, source %d)\n", __FUNCTION__, MessageId, interruptSource)); interruptSource = ParaNdis_DPCWorkBody(pContext, PARANDIS_UNLIMITED_PACKETS_TO_INDICATE); if (interruptSource) { DPrintf(4, ("[%s] Queued additional DPC for %d\n", __FUNCTION__, interruptSource)); InterlockedOr(&pContext->InterruptStatus, interruptSource); NdisMQueueDpc(pContext->InterruptHandle, MessageId, 1 << KeGetCurrentProcessorNumber(), MiniportDpcContext); } #endif UNREFERENCED_PARAMETER(NdisReserved2); }