Compartilhar via


Shared IST for NDIS

Windows Mobile Not SupportedWindows Embedded CE Supported

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;

See Also

Concepts

Improving Performance of an NDIS Miniport Driver