Compartilhar via


Manipulando a notificação de suspensão seletiva do NDIS

O NDIS iniciará uma operação de suspensão seletiva se ocorrer um dos seguintes eventos:

  • O adaptador de rede está inativo há mais tempo do que um período de tempo limite ocioso. A duração desse período de tempo limite é especificada pelo valor da palavra-chave INF padronizada *SSIdleTimeout. Para obter mais informações sobre esse palavra-chave, consulte Palavras-chave INF padronizadas para suspensão seletiva do NDIS.

    Para obter mais informações sobre como o NDIS determina que um adaptador de rede está ocioso, confira Como o NDIS detecta adaptadores de rede ociosos.

  • O sistema que está em conformidade com a tecnologia Always On Always Connected (AOAC) está sendo transferido para um estado de Espera Conectado.

Por meio da operação de suspensão seletiva, o adaptador de rede é transferido para um estado de baixa potência. O NDIS inicia essa operação chamando a função de manipulador MiniportIdleNotification para emitir uma notificação ociosa para o driver de miniport.

O driver de miniporte pode precisar executar ações dependentes do barramento quando ele lida com a notificação ociosa. A figura a seguir mostra as etapas envolvidas no tratamento de uma notificação ociosa por um driver de miniporto para um adaptador de rede USB.

Diagrama que mostra a operação de notificação ociosa.

Este tópico inclui as seguintes informações sobre como lidar com uma notificação ociosa de suspensão seletiva do NDIS:

Diretrizes para lidar com a chamada para MiniportIdleNotification

Diretrizes para a chamada para NdisMIdleNotificationConfirm

Cancelando e concluindo uma notificação ociosa de suspensão seletiva do NDIS

Diretrizes para lidar com a chamada para MiniportIdleNotification

O NDIS e o driver de miniporte seguem estas etapas quando o NDIS chama MiniportIdleNotification:

  1. O NDIS chama a função de manipulador MiniportIdleNotification para notificar o driver de que o adaptador de rede subjacente parece estar ocioso. O NDIS define o parâmetro ForceIdle da função de manipulador MiniportIdleNotification como um dos seguintes valores:

    • O NDIS define o parâmetro ForceIdle como FALSE quando o adaptador de rede está inativo há mais tempo do que o período de tempo limite ocioso.

    • O NDIS define o parâmetro ForceIdle como TRUE quando um sistema que está em conformidade com a tecnologia aoAC (Always On Always Connected) está fazendo a transição para um estado de Espera Conectado.

  2. Quando MiniportIdleNotification é chamado, o driver de miniport pode vetar a notificação ociosa e a operação de suspensão seletiva retornando NDIS_STATUS_BUSY. Por exemplo, o driver poderá vetar a notificação ociosa se o driver detectar atividade no adaptador de rede.

    Se o driver de miniporto vetar a notificação ociosa, o NDIS reiniciará o monitor da atividade no adaptador de rede. Se o adaptador ficar inativo novamente dentro do período de tempo limite ocioso, o NDIS chamará MiniportIdleNotification.

    Nota O driver de miniporto não deve vetar a notificação ociosa se o parâmetro ForceIdle estiver definido como TRUE. Nesse caso, o driver deve continuar com a operação de suspensão seletiva.

  3. Se o driver de miniporto não vetar a notificação ociosa, ele deverá executar quaisquer operações específicas do barramento para preparar o adaptador de rede para uma operação de suspensão seletiva. Por exemplo, o driver de miniporto para um adaptador de rede USB executa as seguintes etapas para determinar se o adaptador de rede pode fazer a transição para um estado de baixa potência:

    1. O driver de miniporto chama IoCallDriver para emitir um IRP (pacote de solicitação de E/S) para uma solicitação ociosa USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) para o driver de ônibus USB subjacente. Nesse IRP, o driver de miniporto deve especificar um retorno de chamada e uma rotina de conclusão.

      O driver do ônibus USB não conclui imediatamente o IRP. O IRP é deixado em um estado pendente por meio da transição de baixa potência. O motorista do barramento conclui o IRP posteriormente quando ocorrem qualquer um dos seguintes eventos:

      • O driver de miniporta cancela o IRP.

      • Uma alteração de estado de energia do sistema é necessária.

      • O dispositivo é removido do hub USB.

    2. Depois que o driver de barramento USB determina que ele pode colocar o adaptador de rede em um estado de baixa potência, ele chama a rotina de retorno de chamada IRP do driver de miniport. Essa chamada confirma que o adaptador de rede pode fazer a transição para um estado de baixa potência.

      Para obter diretrizes sobre como gravar uma rotina de retorno de chamada para o IRP de solicitação ociosa USB, consulte Implementando uma rotina de retorno de chamada IRP de solicitação ociosa USB.

  4. Depois que o driver de miniporto concluir a preparação do adaptador de rede para uma operação de suspensão seletiva, ele chamará NdisMIdleNotificationConfirm. Nessa chamada, o driver de miniporto especifica o estado de energia mais baixo para o qual o adaptador de rede pode fazer a transição.

    Dependendo dos requisitos de barramento para operações de suspensão seletiva, o driver de miniporto chama NdisMIdleNotificationConfirm de forma síncrona no contexto da chamada para MiniportIdleNotification ou de forma assíncrona após o retorno de MiniportIdleNotification . Por exemplo, o driver de miniporto para um adaptador de rede USB chama NdisMIdleNotificationConfirm dentro do contexto da rotina de retorno de chamada para a solicitação ociosa USB. O driver de barramento USB chama a rotina de retorno de chamada de forma síncrona no contexto da chamada para IoCallDriver ou de forma assíncrona após o retorno de MiniportIdleNotification .

  5. Se o adaptador de rede puder ser transferido para um estado de baixa potência, o driver de miniporto retornará NDIS_STATUS_PENDING da chamada para MiniportIdleNotification.

    Nota O driver de miniporto retorna NDIS_STATUS_PENDING porque a notificação ociosa não é concluída até que o driver chame NdisMIdleNotificationComplete. O driver de miniporte não deve retornar NDIS_STATUS_SUCCESS de MiniportIdleNotification.

O driver de miniporte deve executar as seguintes operações até que o adaptador de rede seja suspenso e transferido para um estado de baixa potência:

Diretrizes para a chamada para NdisMIdleNotificationConfirm

O NDIS e o driver de miniporto seguem estas etapas quando o driver de miniporto chama NdisMIdleNotificationConfirm:

  1. Problemas de NDIS IRP_MN_WAIT_WAKE para o motorista de ônibus subjacente. Esse IRP permite que o motorista do barramento ative o adaptador de rede em resposta a um sinal de ativação externo.

  2. O NDIS emite uma solicitação de conjunto de OID (identificador de objeto) de OID_PM_PARAMETERS para o driver de miniport. Essa solicitação OID está associada a uma estrutura NDIS_PM_PARAMETERS que especifica as configurações sob as quais o adaptador de rede gera um evento de ativação.

    O driver de miniporte deve seguir estas diretrizes ao processar os membros da estrutura NDIS_PM_PARAMETERS :

    • Se o parâmetro ForceIdle da função do manipulador MiniportIdleNotification tiver sido definido como FALSE, o NDIS definirá apenas o sinalizador NDIS_PM_SELECTIVE_SUSPEND_ENABLED no membro WakeUpFlags da estrutura NDIS_PM_PARAMETERS . Nesse caso, o adaptador de rede pode sinalizar um evento de ativação quando ocorre um dos seguintes eventos:

      • O adaptador de rede recebe um pacote que corresponde a um filtro de pacote de recebimento. O adaptador é configurado para usar esses filtros por meio de solicitações de conjunto de OID de OID_GEN_CURRENT_PACKET_FILTER.

      • O adaptador de rede detecta outros eventos externos que exigem processamento pela pilha do driver de rede, como quando o estado do link é alterado para desconexão de mídia ou mídia conectada.

    • Se o parâmetro ForceIdle da função do manipulador MiniportIdleNotification tiver sido definido como TRUE, o NDIS não definirá o sinalizador NDIS_PM_SELECTIVE_SUSPEND_ENABLED no membro WakeUpFlags da estrutura NDIS_PM_PARAMETERS . Nesse caso, o NDIS define outros membros na estrutura NDIS_PM_PARAMETERS para eventos de ativação não relacionados à suspensão seletiva do NDIS.

      Nota O NDIS define o parâmetro ForceIdle como TRUE somente quando um sistema em conformidade com a tecnologia aoAC (Always Connected) Always On está fazendo a transição para um estado de Espera Conectado.

      O driver conclui a solicitação OID com NDIS_STATUS_SUCCESS.

      Nota Se o NDIS definir o sinalizador NDIS_PM_SELECTIVE_SUSPEND_ENABLED no membro WakeUpFlags de NDIS_PM_PARAMETERS estrutura, ele emitirá a solicitação de conjunto de OID de OID_PM_PARAMETERS diretamente para o driver de miniporte. Isso permite que o NDIS ignore o processamento por drivers de filtro na pilha do driver de rede.

  3. Depois que a solicitação de conjunto de OID de OID_PM_PARAMETERS for concluída com êxito, o NDIS emitirá uma solicitação de conjunto de OID OID_PNP_SET_POWER para o driver de miniporto.

    Quando trata essa solicitação de conjunto de OID, o driver prepara o adaptador de rede para fazer a transição para o estado de baixa potência especificado na solicitação OID. O driver deve concluir todas as operações pendentes da seguinte maneira:

    • O driver de miniporto aguarda que todos os pacotes de recebimento indicados anteriormente sejam retornados por meio de chamadas para MiniportReturnNetBufferLists.

    • O driver de miniporto aguarda a conclusão das solicitações de envio processadas pelo hardware. Depois que as solicitações forem concluídas, o driver de miniporto deverá chamar NdisMSendNetBufferListsComplete.

    • O driver de miniporte conclui todas as solicitações de envio pendentes chamando NdisMSendNetBufferListsComplete.

    • O driver de miniporte deve cancelar todos os temporizadores NDIS pendentes e itens de trabalho. Depois que eles forem cancelados, o driver deverá aguardar a conclusão desses temporizadores e itens de trabalho.

    • O driver de miniporto deve colocar o adaptador de rede em um estado quiescente. Por exemplo, o driver deve cancelar todos os temporizadores de hardware.

    O driver de miniporte configura o adaptador de rede subjacente para habilitar os eventos de ativação especificados que foram especificados anteriormente na solicitação de conjunto de OID de OID_PM_PARAMETERS. Depois que o adaptador de rede é preparado para a transição de baixa potência, o driver de miniporto conclui a solicitação de conjunto de OID de OID_PNP_SET_POWER com NDIS_STATUS_SUCCESS.

  4. O NDIS emite uma IRP_MN_SET_POWER para o motorista de ônibus subjacente. Esse IRP solicita que o adaptador de rede seja transferido para um estado de baixa potência.

    Nota Durante uma operação de suspensão seletiva, o adaptador de rede será transferido para o estado de energia do dispositivo especificado na chamada para NdisMIdleNotificationConfirm. O driver de miniporto especifica esse estado de energia do dispositivo no parâmetro IdlePowerState dessa função.

Depois que o IRP for concluído, o NDIS retornará da chamada para NdisMIdleNotificationConfirm.

Cancelando e concluindo uma notificação ociosa de suspensão seletiva do NDIS

Depois que a notificação ociosa for emitida, ela poderá ser cancelada e concluída das seguintes maneiras:

  • O NDIS poderá cancelar a notificação ociosa pendente se as seguintes condições forem verdadeiras:

    • Um protocolo sobreposto ou um driver de filtro emite uma solicitação de envio de pacotes ou uma solicitação OID para o driver de miniporte.

    • O adaptador subjacente sinaliza um evento de ativação, como receber um pacote que corresponde a um padrão WOL (wake-on-LAN) ou detectar uma alteração em sua conexão de mídia status.

    O NDIS cancela a notificação ociosa chamando MiniportCancelIdleNotification. Quando essa função de manipulador é chamada, o driver de miniporto cancela todos os IRPs específicos do barramento que ele pode ter emitido anteriormente para a notificação ociosa. Por fim, o driver de miniporto chama NdisMIdleNotificationComplete para concluir a notificação ociosa.

    Para obter mais informações sobre como o NDIS cancela a notificação ociosa, consulte Cancelando a notificação ociosa de suspensão seletiva do NDIS.

  • Depois que o adaptador de rede estiver em um estado de baixa potência, o driver de miniporta poderá concluir a notificação ociosa em si para retomar o adaptador para um estado de energia total. Os motivos para fazer isso são específicos para o design e os requisitos do driver e do adaptador. O driver de miniporto conclui a notificação ociosa chamando NdisMIdleNotificationComplete.

    Para obter mais informações sobre como o driver de miniporto conclui a notificação ociosa, consulte Concluindo a notificação ociosa de suspensão seletiva do NDIS.