SCSI 微型端口驱动程序的 HwScsiDmaStarted 例程

使用系统 DMA 控制器的 HBA 的微型端口驱动程序必须具有 HwScsiDmaStarted 例程。

对于数据传输操作,此类微型端口驱动程序必须调用 ScsiPortIoMapTransfer,将指针传入到其设备扩展(针对每个 HBA 数据)和请求传输的 SRB 的指针,以及将数据从中或传输到的缓冲区的逻辑地址范围。

请注意,传递给 ScsiPortIoMapTransfer 的逻辑地址范围必须是输入 SRB 的 DataBufferDataTransferLength 的映射值或此范围的正确子集。 对于大多数传输请求,微型端口驱动程序编写器可以假定输入 SRB 中指定的所有数据都可以在单个 DMA 操作中传输。

具体而言,仅当 HBA 提供应用程序专用支持且应用程序直接向微型端口驱动程序发送大型传输请求时,微型端口驱动程序可能必须执行多个从属 DMA 传输操作才能满足给定 SRB。 否则,存储类驱动程序负责将大型传输请求拆分为一组部分传输请求,每个请求的大小都适合 HBA 的功能 (请参阅 存储类驱动程序) 。

当系统 DMA 控制器准备好在系统内存和 HBA 之间传输数据时,ScsiPortIoMapTransfer 调用微型端口驱动程序的 HwScsiDmaStarted 例程。 HwScsiDmaStarted 必须为传输操作设置 HBA。

传输操作完成后,微型端口驱动程序必须先调用 ScsiPortFlushDma ,然后 才能使用 SRB 和/或调用 ScsiPortIoMapTransfer 为应用程序提供的缓冲区中的子范围再次设置 DMA 控制器(如果 HBA 专用于支持用户模式应用程序)。

ScsiPortFlushDma 刷新 DMA 控制器中缓存的任何剩余数据。 请注意,即使尚未调用微型端口驱动程序的 HwScsiDmaStarted 例程,也可以调用 ScsiPortFlushDma 来取消系统 DMA 传输。

有关详细信息 ,请参阅 ScsiPortIoMapTransferScsiPortFlushDma