警告
針對 ARM 和 ARM64 處理器,強烈建議 NDIS 驅動程式寫入器使用 WDF DMA 或 WDM DMA,而不是 NDIS 散佈/收集 DMA。
如需 WDF DMA 的詳細資訊,請參閱 處理 KMDF 驅動程式中的 DMA 作業。
如需 WDM DMA 的詳細資訊,請參閱 管理驅動程式輸入/輸出的 DMA 相關子主題。
總線主要迷你埠驅動程式會從 MiniportInitializeEx 呼叫 NdisMRegisterScatterGatherDma 函式,以初始化散佈/收集 DMA 通道。
語法
NDIS_STATUS NdisMRegisterScatterGatherDma(
[in] NDIS_HANDLE MiniportAdapterHandle,
[in, out] PNDIS_SG_DMA_DESCRIPTION DmaDescription,
[out] PNDIS_HANDLE NdisMiniportDmaHandle
);
參數
[in] MiniportAdapterHandle
NDIS 傳遞至 MiniportInitializeEx 的迷你埠句柄。
[in, out] DmaDescription
NDIS_SG_DMA_DESCRIPTION 結構的指標。 此結構描述迷你埠驅動程式的散佈/收集 DMA 屬性。 結構的定義如下:
typedef struct _NDIS_SG_DMA_DESCRIPTION {
NDIS_OBJECT_HEADER Header;
ULONG Flags;
ULONG MaximumPhysicalMapping;
MINIPORT_PROCESS_SG_LIST_HANDLER ProcessSGListHandler;
MINIPORT_ALLOCATE_SHARED_MEM_COMPLETE_HANDLER SharedMemAllocateCompleteHandler;
ULONG ScatterGatherListSize;
} NDIS_SG_DMA_DESCRIPTION, *PNDIS_SG_DMA_DESCRIPTION;
此結構包含下列成員:
標頭
NDIS_SG_DMA_DESCRIPTION 結構的NDIS_OBJECT_HEADER結構。 設定 Header 指定要NDIS_OBJECT_TYPE_SG_DMA_DESCRIPTION之結構的 Type 成員、要NDIS_SG_DMA_DESCRIPTION_REVISION_1的 Revision 成員,以及要NDIS_SIZEOF_SG_DMA_DESCRIPTION_REVISION_1的 Size 成員。
Flags
定義散佈/收集特性的一組位旗標。 將此成員設定為所有必要旗標的位 OR。
NDIS_SG_DMA_64_BIT_ADDRESS旗標指定 NIC 可以使用 64 位尋址進行 DMA 作業。 否則,NIC 會使用32位尋址。
如果不需要 64 位尋址,請將此成員設定為零。
MaximumPhysicalMapping
NIC 可以在單一 DMA 作業中傳輸的最大位元元組數。 配置 DMA 通道時,NDIS 會將此值提供給硬體抽象層 (HAL) ,而 HAL 會使用此值來判斷要保留給 NIC 的對應緩存器數目上限。
ProcessSGListHandler
NDIS 完成建置散佈/收集清單時, NDIS 會呼叫的 MiniportProcessSGList 函式。
SharedMemAllocateCompleteHandler
The MiniportSharedMemoryAllocateComplete 函式,用於呼叫的迷你埠驅動程式 NdisMAllocateSharedMemoryAsyncEx. 此欄位是選擇性的,如果迷你埠驅動程式未呼叫 NdisMAllocateSharedMemoryAsyncEx,它應該是 NULL。
ScatterGatherListSize
保存散佈/收集清單所需的記憶體大小,以位元組為單位。 NDIS 會先設定此值,再從 NdisMRegisterScatterGatherDma 傳回。 迷你埠驅動程序應該使用此大小來預先配置每個散佈/收集清單的記憶體。
[out] NdisMiniportDmaHandle
呼叫端提供的變數指標,而 NDIS 會填入句柄。 句柄會識別 NDIS 用來管理此 DMA 資源的內容區域。 迷你埠驅動程式會在後續呼叫涉及此 DMA 資源的 NDIS 中,將此句柄傳遞至 NDIS。
傳回值
NdisMRegisterScatterGatherDma 會傳回下列其中一項:
傳回碼 | Description |
---|---|
|
NdisMRegisterScatterGatherDma 已成功為總線主機 DMA 作業配置資源。 |
|
NdisMRegisterScatterGatherDma 因為資源不足而失敗。 |
|
NdisMRegisterScatterGatherDma 失敗,因為迷你埠未指定它支援 NDIS 6.0 或更新版本,或因為迷你埠驅動程式未指定其 NIC 是總線主機 DMA 裝置。 迷你埠驅動程式會在呼叫時指定其 NDIS 版本 NdisMRegisterMiniportDriver。 迷你埠驅動程式會在呼叫時指定它支援總線主機 DMA 裝置 NdisMSetMiniportAttributes。 |
|
目前的 NDIS 版本不支援 DmaDescription標頭結構的Revision 成員中指定的版本。 |
備註
NDIS 總線主要迷你埠驅動程式在其MiniportInitializeEx函式內呼叫 NdisMRegisterScatterGatherDma,以初始化散佈/收集 DMA 作業的資源。 迷你埠驅動程序傳遞至 NdisMRegisterScatterGatherDma 的 DmaDescription 參數包含 NDIS 用來初始化散佈/收集 DMA 資源的資訊。 在 NdisMRegisterScatterGatherDma 傳回之後,DmaDescription 的 ScatterGatherListSize 成員包含的緩衝區大小應該足以保存散佈/收集清單。 迷你埠驅動程序應該使用此大小來預先配置散佈/收集清單的記憶體。
DmaDescription 參數中的 ProcessSGListHandler 成員會在 MiniportProcessSGList 函式的迷你埠驅動程式中定義進入點。 迷你埠驅動程式呼叫時 NdisMAllocateNetBufferSGList, NDIS 會呼叫 HAL,以提供散佈/收集清單給迷你埠驅動程式。 HAL 會在 HAL 完成建置散佈/收集列表之後呼叫 MiniportProcessSGList 。 NDIS 可以在呼叫 NdisMAllocateNetBufferSGList 的內容之外呼叫 MiniportProcessSGList。
NdisMRegisterScatterGatherDma 會傳回不透明至迷你埠驅動程序的內容區域指標。 迷你埠驅動程序必須在後續呼叫 NDIS 散佈/收集 DMA 函式時使用此句柄。
總線主機迷你埠驅動程式呼叫 NdisMAllocateSharedMemoryAsyncEx 可動態配置共用記憶體以進行數據傳輸作業。 當高網路流量導致迷你埠驅動程式在初始化期間配置的共用記憶體空間不足時,需要此呼叫。 如果 NdisMAllocateSharedMemoryAsyncEx 傳回NDIS_STATUS_PENDING,NDIS 會呼叫 MiniportSharedMemoryAllocateComplete 函式可在稍後完成作業。 Miniport 驅動程式會在 DmaDescription 參數的 SharedMemAllocateCompletateCompleteHandler 成員中指定 MiniportSharedMemoryAllocateComplete 函式的進入點。
迷你埠驅動程式呼叫 NdisMDeregisterScatterGatherDma 函式,以解除分配 NdisMRegisterScatterGatherDma 配置的 DMA 資源。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | NDIS 6.0 和更新版本支援。 |
目標平台 | Universal |
標頭 | ndis.h (包含 Ndis.h) |
程式庫 | Ndis.lib |
IRQL | PASSIVE_LEVEL |
DDI 合規性規則 | Init_RegisterSG (ndis) 、 Irql_Gather_DMA_Function (ndis) |