Shared IST for NDIS
9/8/2008
Normalmente, a Windows Embedded CE A especificação da interface do driver de rede Implementação (NDIS) cria uma interrupção serviço segmento (ist) para cada solicitação instância de adaptador interrupção (IRQ). Em cenários roteamento, você pode freqüentemente melhorar a taxa de transferência combinando manipulação interrupção em um ist que serviços todas as IRQs. Isso reduz o número de opções segmento durante o roteamento processamento. No entanto, como desempenho pode ser específico para configuração rede, OS e hardware, você deve perfil seu desempenho sistema com e sem o ist compartilhado para confirmar que ele melhora desempenho.
Para obter uma melhoria desempenho, o driver de miniporta deve indicar múltiplo pacotes, de exemplo, usando NdisMIndicateReceivePacket. O driver de miniporta também deve receber NDIS_STATUS_SUCCESS, permitindo que ele para manter os pacotes para processamento.
Para habilitar o comportamento ist compartilhado, você deve também implementar alterações em codificar camada (OAL) de abstração de OEM. A seguinte lista mostra as variáveis globais que você deve adicionar entre NDIS e a rotina serviço interrupção (ISR):
- OEMIntrMask Armazena o valor máscara de bits do 1 < < IRQ.
- OEMIntrEnable Armazena o número de IRQ.
Se a consulta para retorna IOCTL_HAL_SYSINTR_NETWORK_SHARED FALSE, a funcionalidade ist compartilhada não estiver habilitado e o sistema se comporta como antes.
O seguinte exemplo de código mostra como NDIS usa o IOCTL_HAL_SYSINTR_NETWORK_SHARED para consulta o endereço das OEMIntrMask e OEMIntrEnable Variáveis:
ULONG OEMIntrEnable = 0;
ULONG OEMIntrMask = 0;
BOOL OEMIoControl(
DWORD code, PVOID pInpBuffer, DWORD inpSize, PVOID pOutBuffer, DWORD outSize,
DWORD *pOutSize
) {
BOOL ok = TRUE;
....
case IOCTL_HAL_SYSINTR_NETWORK_SHARED:
if (outSize < 2*sizeof(ULONG) || pOutBuffer == NULL) {
ok = FALSE;
SetLastError(ERROR_INVALID_PARAMETER);
break;
}
((ULONG*)pOutBuffer)[0] = (ULONG)&OEMIntrMask;
((ULONG*)pOutBuffer)[1] = (ULONG)&OEMIntrEnable;
if (pOutSize != NULL) *pOutSize = 2*sizeof(ULONG);
break;
...
return ok;
}
O seguinte MIPS exemplo de código mostra como o OEMIntrMask variável é atualizado pelo codificar ISR como SYSINTR_NETWORK_SHARED é retornado:
la a0, OEMIntrMask
lw a1, 0(a0)
or a1, (1 << IRQ_MAC1)
sw a1, 0(a0)
j ra
li v0, SYSINTR_NETWORK_SHARED
O OEMIntrEnable variável é atualizado pelo NDIS antes ele chama InterruptDone e InterurptDisable, que mapa (n.); mapear (v.) para OEMInterruptEnable e OEMInterruptDisable respectivamente.
O seguinte mostra como, em seguida, deve considerar a codificar HAL exemplo de código OEMIntrEnable Para determinar a interrupção para habilitar ou desativar:
BOOL OEMInterruptEnable(DWORD sysIntr, LPVOID pvData, DWORD cbData)
{
DEBUGMSG(FALSE, (L"+OEMInterruptEnable %d\n", sysIntr));
switch (sysIntr) {
case SYSINTR_NETWORK_SHARED:
if (OEMIntrEnable == IRQ_PCI) {
OUT32(PCI_BASE + PCI_INTMASK, PCI_INT_PA);
OEMIntrEnable = 0x00;
}
break;