Condividi tramite


Filtro delle risorse MSI-X

I driver Miniport devono registrare una funzione di filtro dei requisiti delle risorse se supportano MSI-X e modificheranno l'affinità di interruzione per ogni messaggio MSI-X o rimuoveranno le risorse di interruzione dei messaggi.

NDIS chiama la funzione MiniportFilterResourceRequirements dopo che NDIS riceve il pacchetto di richiesta I/O IRP_MN_FILTER_RESOURCE_REQUIREMENTS per una scheda di interfaccia di rete. NDIS chiama MiniportFilterResourceRequirements dopo che i driver di funzione sottostanti nello stack di dispositivi hanno completato l'IRP.

NDIS chiamerà MiniportFilterResourceRequirements dopo che la funzione MiniportAddDevice restituisce NDIS_STATUS_SUCCESS. NDIS può chiamare nuovamente MiniportFilterResourceRequirements in qualsiasi momento prima di chiamare MiniportRemoveDevice. NDIS può chiamare MiniportFilterResourceRequirements mentre il miniport è in esecuzione. Anche se il miniport può modificare l'elenco di risorse come descritto di seguito, il miniport non deve tentare immediatamente di usare le nuove risorse. NDIS interromperà e ri-inizializzerà il miniport con le nuove risorse; solo allora il miniport tenta di usare le nuove risorse.

IRP_MN_FILTER_RESOURCE_REQUIREMENTS fornisce un elenco di risorse come struttura IO_RESOURCE_REQUIREMENTS_LIST in Irp-IoStatus.Information>. Le risorse nell'elenco sono descritte dalle strutture IO_RESOURCE_DESCRIPTOR .

Un driver miniport può modificare i criteri di affinità di interruzione per ogni risorsa di tipo CmResourceTypeInterrupt che descrive un messaggio MSI-X. Se un criterio di affinità richiede la destinazione per un set specifico di processori, il driver miniport imposta anche una maschera KAFFINITY in Interrupt.TargetedProcessors nella struttura IO_RESOURCE_DESCRIPTOR.

Un driver miniport può rimuovere tutte le risorse di tipo CmResourceTypeInterrupt che sono risorse di interrupt del messaggio. Il driver può quindi registrarsi per gli interrupt basati su riga nella funzione MiniportInitializeEx . Se il driver miniport non rimuove queste risorse di interrupt del messaggio, il sistema operativo avrà esito negativo se il driver tenta di registrare interruzioni basate su riga in MiniportInitializeEx.

Un driver miniport NDIS 6.1 o versione successiva può aggiungere risorse di interruzione dei messaggi all'elenco delle risorse. Ad esempio, in un computer con otto CPU, se la scheda di interfaccia di rete può generare quattro messaggi MSI-X e se il sistema operativo abilita le quattro interruzioni del messaggio, il sistema operativo inizializza quattro voci della tabella messaggi nello spazio di configurazione MSI-X del dispositivo e inserisce quattro risorse di interruzione del messaggio nell'elenco delle risorse. In questo caso, poiché il driver miniport richiede più risorse di interrupt dei messaggi, può allocare altre quattro risorse di interrupt del messaggio all'elenco delle risorse e impostare l'affinità di ogni messaggio MSI-X su una CPU. Se il sistema operativo può fornire più risorse di interruzione dei messaggi, l'adattatore miniport riceve otto risorse di interruzione dei messaggi all'avvio. In questo caso, i messaggi hanno numeri compresi tra 0 e 7.

A ogni risorsa di interrupt del messaggio nell'elenco viene assegnato un numero di messaggio successivo che corrisponde all'ordine visualizzato nell'elenco. Ad esempio, la prima risorsa di interruzione del messaggio nell'elenco viene assegnata al messaggio 0, la seconda viene assegnata al messaggio 1 e così via.

Per assegnare una voce di tabella MSI-X a una CPU in fase di esecuzione, il driver miniport può chiamare la funzione NdisMConfigMSIXTableEntry , che esegue il mapping di una voce di tabella a un messaggio MSI-X che ha già l'affinità impostata sulla CPU. Per altre informazioni sulle operazioni di configurazione per le voci di tabella MSI-X, vedere Modifica dell'affinità CPU delle voci di tabella MSI-X.

Per allocare memoria per un nuovo elenco di requisiti delle risorse, usare la funzione NdisAllocateMemoryWithTagPriority . È possibile liberare la memoria per l'elenco dei requisiti di risorse precedenti con la funzione NdisFreeMemory .

I driver Miniport non devono modificare altre risorse, ad esempio le risorse CmResourceTypeMemory e CmResourceTypePort . I driver Miniport devono evitare di aggiungere una nuova risorsa all'elenco di risorse. Tuttavia, i driver miniport NDIS 6.1 e versioni successive possono aggiungere altre risorse di interruzione dei messaggi. Se il driver miniport aggiunge altre risorse di interruzione dei messaggi, non deve rimuoverle dalla funzione MiniportStartDevice .

Per altre informazioni sull'aggiunta e la rimozione di risorse, vedere IRP_MN_FILTER_RESOURCE_REQUIREMENTS.