Compartir a través de


Control de una solicitud de energía set

Un controlador intermedio debe controlar las solicitudes para establecer la potencia en el estado de trabajo (un estado de alimentación del dispositivo de red de D0) y para los estados de suspensión (un estado de alimentación del dispositivo de red de D1, D2 o D3). El controlador intermedio también debe mantener las variables de estado de energía y una marca StandBy. Estos problemas se describen más adelante en este tema.

Para obtener ejemplos de administración intermedia de energía del controlador, consulte el ejemplo de controlador intermedio NDIS MUX y Notify Object driver en el repositorio de ejemplos de controladores de Windows en GitHub.

Control de una solicitud de energía establecida en un estado de suspensión

Hay dos casos en los que un controlador intermedio debe controlar una solicitud de energía establecida en un estado de suspensión:

  • NDIS solicita que el miniporte virtual superior del controlador intermedio vaya a un estado inactivo.

  • El borde inferior del protocolo de controlador intermedio controla la transición del controlador de miniport subyacente a un estado de suspensión cuando recibe una notificación de eventos Plug and Play (PnP).

Estos eventos pueden ocurrir en cualquier orden y un evento no necesariamente acompaña al otro.

Cuando el borde superior de miniporte virtual del controlador intermedio recibe una solicitud para establecer la potencia en un estado de suspensión, la secuencia de eventos para controlar la solicitud es la siguiente:

  1. NDIS llama a la función ProtocolNetPnPEvent de cada controlador de protocolo enlazado al miniport virtual. La llamada a ProtocolNetPnPEvent especifica un evento NetEventSetPower para un estado de suspensión. Los controladores de protocolo que están enlazados al controlador intermedio dejan de enviar datos de red y realizan solicitudes de OID al miniport virtual del controlador intermedio. El borde inferior del protocolo del controlador intermedio puede seguir enviando datos de red y solicitudes hasta que NDIS indica que el controlador de miniport subyacente está realizando la transición a un estado de suspensión.

  2. NDIS pone en pausa los controladores que sobreponen y, a continuación, el miniporte virtual después de emitir el evento NetEventSetPower . El motivo especificado para la pausa es una transición a un estado de baja potencia. Para obtener más información sobre cómo pausar un minipuerto virtual, consulte Pausar un adaptador.

    Nota No se pueden enviar solicitudes OID al miniport virtual mientras se encuentra en un estado de baja potencia, con la excepción de OID_PNP_SET_POWER.

  3. NDIS emite una solicitud de OID_PNP_SET_POWER a la miniporte virtual del controlador intermedio. El controlador intermedio acepta la solicitud devolviendo NDIS_STATUS_SUCCESS. El controlador intermedio no debe propagar la solicitud de OID_PNP_SET_POWER al controlador de miniport subyacente. Después de que el controlador intermedio complete esta solicitud, no debe indicar ningún dato de red recibido más o indicar el estado, incluso si sigue recibiendo datos de red y indicaciones de estado del controlador de miniport subyacente.

Cuando el borde inferior del protocolo del controlador intermedio pasa el controlador de miniporte subyacente a un estado de suspensión, la secuencia de eventos para controlar la transición es la siguiente:

  1. NDIS llama a la función ProtocolNetPnPEvent del borde inferior del protocolo de controlador intermedio. La llamada a ProtocolNetPnPEvent especifica un evento NetEventSetPower para un estado de suspensión. El controlador intermedio debe dejar de enviar datos de red y realizar solicitudes OID al controlador de miniport subyacente. Si hay solicitudes pendientes o envíos, el controlador intermedio debe devolver NDIS_STATUS_PENDING de la llamada a ProtocolNetPnPEvent. El controlador intermedio llama a NdisCompleteNetPnPEvent para completar la llamada a ProtocolNetPnPEvent. El borde del protocolo de un controlador intermedio todavía puede recibir indicaciones de paquete y estado del controlador de miniport subyacente. Se pueden omitir los datos de red recibidos. Si la implementación de un controlador intermedio depende de supervisar el estado del controlador de miniport subyacente, se deben supervisar las indicaciones de estado.

  2. NDIS pausa el borde del protocolo del controlador intermedio y, a continuación, pausa el adaptador de miniport subyacente después de emitir el evento NetEventSetPower . El motivo especificado para la pausa es una transición a un estado de baja potencia. Para obtener más información sobre cómo pausar un enlace de protocolo, consulte Pausar un enlace.

    Nota No se pueden enviar solicitudes OID al adaptador de miniport subyacente mientras se encuentra en un estado de baja potencia, con la excepción de OID_PNP_SET_POWER.

  3. NDIS emite una solicitud de OID_PNP_SET_POWER al controlador de miniport subyacente. Sin embargo, si el controlador de miniport subyacente no admite la administración de energía, se detendrá. En este caso, aunque NDIS detenga el controlador de miniport subyacente, no solicita el protocolo de controlador intermedio para desenlace desde el controlador de miniport subyacente y la NIC. Después de que el controlador de miniport subyacente haya completado correctamente el procesamiento del OID (o el controlador de miniporte está detenido), no indicará más datos de red ni estado.

Control de una solicitud de energía establecida en el estado de trabajo

Hay dos casos en los que un controlador intermedio controla una solicitud de energía establecida en el estado de trabajo:

  • NDIS solicita que el miniporte virtual superior del controlador intermedio vaya al estado de trabajo.

  • El borde inferior del protocolo de controlador intermedio controla la transición del controlador de miniport subyacente al estado de trabajo, cuando recibe una notificación de eventos Plug and Play (PnP).

Estos eventos pueden producirse en cualquier orden y un evento no acompaña necesariamente al otro.

Cuando el miniporte virtual borde superior del controlador intermedio recibe una solicitud para establecer la potencia en un estado de trabajo, la secuencia de eventos para controlar la solicitud es la siguiente:

  1. NDIS emite una OID_PNP_SET_POWER a la miniporte virtual del controlador intermedio. El controlador intermedio devuelve NDIS_STATUS_SUCCESS a la solicitud de energía establecida. El controlador intermedio no debe propagar la solicitud de OID_PNP_SET_POWER al controlador de miniport subyacente.

  2. NDIS reinicia la minipuerto virtual y, a continuación, reinicia los controladores que se sobreponen después de emitir el OID de energía establecido. Para obtener más información sobre cómo reiniciar un minipuerto virtual, consulte Iniciar un adaptador.

  3. NDIS llama a la función ProtocolNetPnPEvent de los controladores de protocolo excesivos. La llamada a ProtocolNetPnPEvent especifica un evento NetEventSetPower para establecer el estado de trabajo (D0). Los controladores de protocolo enlazados pueden empezar a enviar datos de red al miniport virtual del controlador intermedio.

Cuando el borde inferior del protocolo del controlador intermedio realiza la transición del controlador de miniport subyacente a un estado de trabajo, la secuencia de eventos para controlar la transición es la siguiente:

  1. NDIS emite un OID_PNP_SET_POWER al controlador de miniport subyacente o llama a su controlador MiniportInitializeEx si se detuvo el controlador de miniporte subyacente.

  2. NDIS reinicia el controlador de miniport subyacente y, a continuación, el borde del protocolo del NDIS intermedio y el adaptador de miniport subyacente después de emitir el OID. Para obtener más información sobre cómo pausar un enlace de protocolo, consulte Reinicio de un enlace.

  3. NDIS llama a la función ProtocolNetPnPEvent del controlador intermedio. La llamada a ProtocolNetPnPEvent especifica un evento NetEventSetPower para establecer el estado de trabajo (D0). El controlador intermedio puede empezar a enviar datos de red al controlador de miniport subyacente.

Power States y la marca en espera

El controlador intermedio debe mantener una variable de estado de energía independiente para cada instancia de miniport virtual y para cada controlador de miniport subyacente al que está enlazado el controlador. El controlador intermedio también debe mantener una marca StandingBy para cada minipuerto virtual que sea:

  • Establézcalo en TRUE cuando el estado de energía de la minipuerda virtual o el controlador de miniport subyacente deja D0.

  • Establézcalo en FALSE cuando el estado de energía de la miniport virtual o el controlador de miniport subyacente vuelva a D0.

Nota Para los controladores intermedios de MUX, puede haber varios miniportes virtuales asociados a un controlador de miniport subyacente o varios miniportes subyacentes asociados a cada minipuerto virtual. Cuando cambia el estado de alimentación de cualquier adaptador de miniporte, el comportamiento de todos los miniportes asociados también se ve afectado. Cómo se ve afectado el comportamiento es específico de la implementación. Por ejemplo, un controlador que implementa una solución de conmutación por error de equilibrio de carga (LBFO) podría no desactivar los miniportes virtuales cuando se desactiva un único controlador de miniport subyacente. Sin embargo, una implementación del controlador que depende de todos los controladores de miniport subyacentes requeriría la desactivación de miniportes virtuales cuando se desactiva cualquier controlador de miniport subyacente.

El controlador intermedio debe usar las variables de estado de energía y marca StandingBy al procesar las solicitudes como se indica a continuación:

  • La función MiniportSendNetBufferLists del controlador debe producir un error a menos que la miniporte virtual y su adaptador de miniport subyacente estén en D0.

  • La función MiniportOidRequest del controlador siempre debe realizarse correctamente OID_PNP_QUERY_POWER para asegurarse de que el controlador recibe las solicitudes de OID_PNP_SET_POWER posteriores.

  • La función MiniportOidRequest del controlador debe producir un error si el miniport virtual no está en D0 o si StandingBy es TRUE. De lo contrario, debe poner en cola una única solicitud si el controlador de miniport subyacente no está en D0. Una solicitud en cola debe procesarse cuando el estado del controlador de miniport subyacente se convierte en D0.

  • El miniporte virtual del controlador intermedio solo debe notificar el estado si el controlador de miniport subyacente y el miniport virtual están en D0.