Share via


Gestione della notifica di inattività selettiva NDIS

NDIS avvia un'operazione di sospensione selettiva se si verifica uno degli eventi seguenti:

Tramite l'operazione di sospensione selettiva, la scheda di rete viene passata a uno stato a basso consumo. NDIS avvia questa operazione chiamando la funzione del gestore MiniportIdleNotification per emettere una notifica di inattività al driver miniport.

Il driver miniport potrebbe dover eseguire azioni dipendenti dal bus quando gestisce la notifica di inattività. La figura seguente illustra i passaggi coinvolti nella gestione di una notifica di inattività da parte di un driver miniport per una scheda di rete USB.

Diagramma che mostra l'operazione di notifica inattiva.

Questo argomento include le informazioni seguenti su come gestire una notifica di inattività di sospensione selettiva NDIS:

Linee guida per la gestione della chiamata a MiniportIdleNotification

Linee guida per la chiamata a NdisMIdleNotificationConfirm

Annullamento e completamento di una notifica di inattività selettiva NDIS

Linee guida per la gestione della chiamata a MiniportIdleNotification

NDIS e il driver miniport seguono questi passaggi quando NDIS chiama MiniportIdleNotification:

  1. NDIS chiama la funzione del gestore MiniportIdleNotification per notificare al driver che la scheda di rete sottostante sembra essere inattiva. NDIS imposta il parametro ForceIdle della funzione del gestore MiniportIdleNotification su uno dei valori seguenti:

    • NDIS imposta il parametro ForceIdle su FALSE quando la scheda di rete è stata inattiva per più tempo rispetto al periodo di timeout di inattività.

    • NDIS imposta il parametro ForceIdle su TRUE quando un sistema conforme alla tecnologia Always On Always Connected (AOAC) sta passando a uno stato connected standby.

  2. Quando viene chiamato MiniportIdleNotification , il driver miniport può veto la notifica di inattività e l'operazione di sospensione selettiva restituendo NDIS_STATUS_BUSY. Ad esempio, il driver potrebbe impostare la notifica di inattività se il driver rileva l'attività nella scheda di rete.

    Se il driver miniport veto la notifica di inattività, NDIS riavvia il monitoraggio dell'attività nella scheda di rete. Se l'adattatore diventa nuovamente inattivo entro il periodo di timeout di inattività, NDIS chiama MiniportIdleNotification.

    Nota Il driver miniport non deve impostare la notifica di inattività se il parametro ForceIdle è impostato su TRUE. In questo caso, il driver deve continuare con l'operazione di sospensione selettiva.

  3. Se il driver miniport non ha il veto della notifica di inattività, deve eseguire operazioni specifiche del bus per preparare la scheda di rete per un'operazione di sospensione selettiva. Ad esempio, il driver miniport per una scheda di rete USB esegue i passaggi seguenti per determinare se la scheda di rete può passare a uno stato a basso consumo:

    1. Il driver miniport chiama IoCallDriver per emettere un pacchetto di richiesta I/O (IRP) per una richiesta di inattività USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) al driver del bus USB sottostante. In questo IRP, il driver miniport deve specificare una routine di callback e completamento.

      Il driver del bus USB non completa immediatamente l'IRP. L'IRP viene lasciato in uno stato in sospeso tramite la transizione a bassa potenza. Il conducente dell'autobus completa l'IRP in un secondo momento quando si verifica uno degli eventi seguenti:

      • Il driver miniport annulla l'IRP.

      • È necessaria una modifica dello stato di alimentazione del sistema.

      • Il dispositivo viene rimosso dall'hub USB.

    2. Dopo che il driver del bus USB determina che può inserire la scheda di rete in uno stato a basso consumo, chiama la routine di callback IRP del driver miniport. Questa chiamata conferma che la scheda di rete può passare a uno stato a basso consumo.

      Per linee guida su come scrivere una routine di callback per l'IRP della richiesta di inattività USB, vedere Implementazione di una routine di callback di richiesta inattiva USB.

  4. Dopo che il driver miniport completa la preparazione della scheda di rete per un'operazione di sospensione selettiva, chiama NdisMIdleNotificationConfirm. In questa chiamata, il driver miniport specifica lo stato di alimentazione più basso a cui la scheda di rete può passare.

    A seconda dei requisiti del bus per le operazioni di sospensione selettiva, il driver miniport chiama NdisMIdleNotificationConfirm in modo sincrono nel contesto della chiamata a MiniportIdleNotification o in modo asincrono dopo la restituzione di MiniportIdleNotification . Ad esempio, il driver miniport per una scheda di rete USB chiama NdisMIdleNotificationConfirm all'interno del contesto della routine di callback per la richiesta di inattività USB. Il driver del bus USB chiama la routine di callback in modo sincrono nel contesto della chiamata a IoCallDriver o in modo asincrono dopo la restituzione di MiniportIdleNotification .

  5. Se è possibile eseguire la transizione della scheda di rete a uno stato a basso consumo, il driver miniport restituisce NDIS_STATUS_PENDING dalla chiamata a MiniportIdleNotification.

    Nota Il driver miniport restituisce NDIS_STATUS_PENDING perché la notifica di inattività non viene completata fino a quando il driver chiama NdisMIdleNotificationComplete. Il driver miniport non deve restituire NDIS_STATUS_SUCCESS da MiniportIdleNotification.

Il driver miniport deve eseguire le operazioni seguenti fino a quando la scheda di rete non viene sospesa e passata a uno stato a basso consumo:

Linee guida per la chiamata a NdisMIdleNotificationConfirm

NDIS e il driver miniport seguono questi passaggi quando il driver miniport chiama NdisMIdleNotificationConfirm:

  1. I problemi di NDIS IRP_MN_WAIT_WAKE al driver del bus sottostante. Questo protocollo IRP consente al driver del bus di riattivare la scheda di rete in risposta a un segnale di riattivazione esterno.

  2. NDIS emette una richiesta di set di identificatori di oggetto (OID) di OID_PM_PARAMETERS al driver miniport. Questa richiesta OID è associata a una struttura NDIS_PM_PARAMETERS che specifica le impostazioni in cui la scheda di rete genera un evento di riattivazione.

    Il driver miniport deve seguire queste linee guida quando elabora i membri della struttura NDIS_PM_PARAMETERS :

    • Se il parametro ForceIdle della funzione del gestore MiniportIdleNotification è stato impostato su FALSE, NDIS imposta solo il flag NDIS_PM_SELECTIVE_SUSPEND_ENABLED nel membro WakeUpFlags della struttura NDIS_PM_PARAMETERS . In questo caso, la scheda di rete può segnalare un evento di riattivazione quando si verifica uno degli eventi seguenti:

      • La scheda di rete riceve un pacchetto che corrisponde a un filtro di ricezione pacchetti. L'adattatore è configurato per l'uso di questi filtri tramite richieste di set OID di OID_GEN_CURRENT_PACKET_FILTER.

      • La scheda di rete rileva altri eventi esterni che richiedono l'elaborazione dallo stack di driver di rete, ad esempio quando lo stato del collegamento cambia in disconnessione multimediale o supporto connesso.

    • Se il parametro ForceIdle della funzione del gestore MiniportIdleNotification è stato impostato su TRUE, NDIS non imposta il flag NDIS_PM_SELECTIVE_SUSPEND_ENABLED nel membro WakeUpFlags della struttura NDIS_PM_PARAMETERS . In questo caso, NDIS imposta altri membri nella struttura NDIS_PM_PARAMETERS per gli eventi di riattivazione non correlati alla sospensione selettiva NDIS.

      Nota NDIS imposta il parametro ForceIdle su TRUE solo quando un sistema conforme alla tecnologia Always On Always Connected (AOAC) passa a uno stato connected standby.

      Il driver completa la richiesta OID con NDIS_STATUS_SUCCESS.

      Nota Se NDIS imposta il flag NDIS_PM_SELECTIVE_SUSPEND_ENABLED nel membro WakeUpFlags della struttura NDIS_PM_PARAMETERS , invia la richiesta del set OID di OID_PM_PARAMETERS direttamente al driver miniport. In questo modo NDIS può ignorare l'elaborazione filtrando i driver nello stack di driver di rete.

  3. Al termine della richiesta del set OID di OID_PM_PARAMETERS , NDIS invia una richiesta di set OID OID_PNP_SET_POWER al driver miniport.

    Quando gestisce questa richiesta di set OID, il driver prepara la scheda di rete per passare allo stato a basso consumo specificato nella richiesta OID. Il driver deve completare tutte le operazioni in sospeso nel modo seguente:

    • Il driver miniport attende che tutti i pacchetti di ricezione indicati in precedenza vengano restituiti tramite chiamate a MiniportReturnNetBufferLists.

    • Il driver miniport attende il completamento delle richieste di invio elaborate dall'hardware. Al termine delle richieste, il driver miniport deve chiamare NdisMSendNetBufferListsComplete.

    • Il driver miniport completa tutte le richieste di invio in sospeso chiamando NdisMSendNetBufferListsComplete.

    • Il driver miniport deve annullare tutti i timer e gli elementi di lavoro NDIS in sospeso. Dopo l'annullamento, il driver deve attendere il completamento di questi timer e elementi di lavoro.

    • Il driver miniport deve inserire la scheda di rete in uno stato quiescente. Ad esempio, il driver deve annullare tutti i timer hardware.

    Il driver miniport configura la scheda di rete sottostante per abilitare gli eventi di riattivazione specificati in precedenza nella richiesta del set OID di OID_PM_PARAMETERS. Dopo aver preparato la scheda di rete per la transizione a basso consumo, il driver miniport completa la richiesta di set OID di OID_PNP_SET_POWER con NDIS_STATUS_SUCCESS.

  4. NDIS rilascia un IRP_MN_SET_POWER al driver del bus sottostante. Questo protocollo IRP richiede che la scheda di rete venga passata a uno stato a basso consumo.

    Nota Durante un'operazione di sospensione selettiva, la scheda di rete verrà passata allo stato di alimentazione del dispositivo specificato nella chiamata a NdisMIdleNotificationConfirm. Il driver miniport specifica questo stato di alimentazione del dispositivo nel parametro IdlePowerState di questa funzione.

Al termine dell'IRP, NDIS torna dalla chiamata a NdisMIdleNotificationConfirm.

Annullamento e completamento di una notifica di inattività selettiva NDIS

Dopo l'emissione della notifica inattiva, può essere annullata e completata nei modi seguenti:

  • NDIS può annullare la notifica di inattività in sospeso se sono vere le condizioni seguenti:

    • Un driver di protocollo o filtro eccessiva genera una richiesta di invio di pacchetti o una richiesta OID al driver miniport.

    • L'adattatore sottostante segnala un evento di riattivazione, ad esempio la ricezione di un pacchetto corrispondente a un modello di riattivazione LAN (WOL) o il rilevamento di una modifica dello stato della connessione multimediale.

    NDIS annulla la notifica di inattività chiamando MiniportCancelIdleNotification. Quando questa funzione del gestore viene chiamata, il driver miniport annulla tutti gli IRP specifici del bus che potrebbero essere stati rilasciati in precedenza per la notifica di inattività. Infine, il driver miniport chiama NdisMIdleNotificationComplete per completare la notifica di inattività.

    Per altre informazioni su come NDIS annulla la notifica di inattività, vedere Annullamento della notifica di inattività selettiva NDIS.

  • Dopo che la scheda di rete è in stato a basso consumo, il driver miniport può completare la notifica di inattività per riprendere la scheda a uno stato di alimentazione completa. I motivi di questa operazione sono specifici della progettazione e dei requisiti del driver e dell'adattatore. Il driver miniport completa la notifica di inattività chiamando NdisMIdleNotificationComplete.

    Per altre informazioni su come il driver miniport completa la notifica di inattività, vedere Completamento della notifica di inattività selettiva NDIS.