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.
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:
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.
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.
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:
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.
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.
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 .
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:
O driver de miniporte deve processar pacotes recebidos e indique-os para o NDIS chamando NdisMIndicateReceiveNetBufferLists.
O driver de miniporto deve processar pacotes de envio concluídos e indique-os para o NDIS chamando NdisMSendNetBufferListsComplete.
Nota O NDIS não chamará a função MiniportSendNetBufferLists do driver para enviar pacotes se MiniportIdleNotification retornar NDIS_STATUS_PENDING.
Diretrizes para a chamada para NdisMIdleNotificationConfirm
O NDIS e o driver de miniporto seguem estas etapas quando o driver de miniporto chama NdisMIdleNotificationConfirm:
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.
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.
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.
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.