PORT_CONFIGURATION_INFORMATION(SCSI)包含 HBA 的配置信息。 特定于 OS 的端口驱动程序分配并初始化此结构,提供尽可能多的特定于 HBA 的配置信息,并将该结构传递给微型端口驱动程序的 HwScsiFindAdapter 例程。 端口驱动程序从微型端口驱动程序HW_INITIALIZATION_DATA结构中获取此结构的一些信息。 微型端口驱动程序的 HwScsiFindAdapter 例程负责确定微型端口驱动程序是否可以支持 HBA;如果是,则用于填写PORT_CONFIGURATION_INFORMATION结构中相关信息。
注意
将来可能会更改 SCSI 端口驱动程序和 SCSI 微型端口驱动程序模型或不可用。 请改用 Storport 驱动程序 和 Storport 微型端口 驱动程序模型。
语法
typedef struct _PORT_CONFIGURATION_INFORMATION {
ULONG Length;
ULONG SystemIoBusNumber;
INTERFACE_TYPE AdapterInterfaceType;
ULONG BusInterruptLevel;
ULONG BusInterruptVector;
KINTERRUPT_MODE InterruptMode;
ULONG MaximumTransferLength;
ULONG NumberOfPhysicalBreaks;
ULONG DmaChannel;
ULONG DmaPort;
DMA_WIDTH DmaWidth;
DMA_SPEED DmaSpeed;
ULONG AlignmentMask;
ULONG NumberOfAccessRanges;
ACCESS_RANGE( ) *AccessRanges[];
PVOID Reserved;
UCHAR NumberOfBuses;
UCHAR InitiatorBusId[8];
BOOLEAN ScatterGather;
BOOLEAN Master;
BOOLEAN CachesData;
BOOLEAN AdapterScansDown;
BOOLEAN AtdiskPrimaryClaimed;
BOOLEAN AtdiskSecondaryClaimed;
BOOLEAN Dma32BitAddresses;
BOOLEAN DemandMode;
BOOLEAN MapBuffers;
BOOLEAN NeedPhysicalAddresses;
BOOLEAN TaggedQueuing;
BOOLEAN AutoRequestSense;
BOOLEAN MultipleRequestPerLu;
BOOLEAN ReceiveEvent;
BOOLEAN RealModeInitialized;
BOOLEAN BufferAccessScsiPortControlled;
UCHAR MaximumNumberOfTargets;
UCHAR ReservedUchars[2];
ULONG SlotNumber;
ULONG BusInterruptLevel2;
ULONG BusInterruptVector2;
KINTERRUPT_MODE InterruptMode2;
ULONG DmaChannel2;
ULONG DmaPort2;
DMA_WIDTH DmaWidth2;
DMA_SPEED DmaSpeed2;
ULONG DeviceExtensionSize;
ULONG SpecificLuExtensionSize;
ULONG SrbExtensionSize;
UCHAR Dma64BitAddresses;
BOOLEAN ResetTargetSupported;
UCHAR MaximumNumberOfLogicalUnits;
BOOLEAN WmiDataProvider;
} PORT_CONFIGURATION_INFORMATION, *PPORT_CONFIGURATION_INFORMATION;
成员
Length
指定此结构的大小(以字节为单位)。 实际上,此成员始终由特定于 OS 的端口驱动程序初始化,表示端口驱动程序使用的此结构的版本。
SystemIoBusNumber
指定 HBA 连接到的系统分配的 I/O 总线数。 特定于 OS 的端口驱动程序始终初始化此成员。 其值是系统分配的,因为平台可能有多个给定 AdapterInterfaceType的 I/O 总线。
AdapterInterfaceType
标识 I/O 总线接口。 特定于 OS 的端口驱动程序始终将此成员设置为 HW_INITIALIZATION_DATA (SCSI) 结构中微型端口驱动程序指定的值。
BusInterruptLevel
指定总线相对中断请求级别。 特定于 OS 的端口驱动程序对 HBA 的中断用法没有假设,因此默认值为零。 根据给定 AdapterInterfaceType 和 HBA,为此成员设置的值可以对应于总线的 IRQL,例如 Isa 和 MicroChannel 类型总线。 如果为适配器配置了级别敏感中断,则 Eisa HBA 的驱动程序必须将此值设置为 HBA 的总线相对 IRQL。
BusInterruptVector
指定 HBA 返回的总线相对向量。 特定于 OS 的端口驱动程序对 HBA 的中断用法没有假设,因此默认值为零。 此成员与为其 HBA 设置 BusInterruptLevel 成员的驱动程序无关。 它适用于使用中断矢量的 I/O 总线类型的 HBA,例如 PCIBus。
InterruptMode
指定 HBA 是使用 LevelSensitive 还是 闩锁(有时称为“边缘触发”)中断。 特定于 OS 的端口驱动程序将此成员初始化为总线和设备的相应值,例如,LevelSensitivePCIBus。 如果适配器配置为级别敏感中断,则 Eisa HBA 的驱动程序必须重置此值,因为使用级别敏感中断的 I/O 总线上的 HBA 的驱动程序(如 MicroChannel 类型总线)的驱动程序也必须重置此值。
MaximumTransferLength
指定 HBA 可以在单个传输作中传输的最大字节数。 默认情况下,此成员的值SP_UNINITIALIZED_VALUE,表示最大传输大小不受限制。 如果 HBA 的传输支持有限,微型端口驱动程序必须根据 HBA 的传输容量重置此成员。 如果微型端口驱动程序的 HwScsiInterrupt 例程无法禁用 HBA 上的中断,则可以在驱动程序开发期间调整此成员,以确保在该微型端口驱动程序的 ISR 中花费的时间不会导致鼠标“跳转”或串行/并行吞吐量下降到用户明显级别。
NumberOfPhysicalBreaks
指定数据缓冲区在 HBA 支持散点/收集时可以具有的地址范围之间的最大中断数。 换句话说,散点/收集列表的数量减去 1。 默认情况下,此成员的值SP_UNINITIALIZED_VALUE,表示 HBA 可以支持无限数量的物理中断。 如果端口驱动程序为此成员设置一个值,微型端口驱动程序可以调整较低的值,但不能调整更高值。 如果此成员SP_UNINITIALIZED_VALUE,微型端口驱动程序必须根据 HBA 的散点/收集容量重置此成员,零表示没有散点/收集支持。
DmaChannel
指定从属 HBA 使用的 DMA 通道。 默认情况下,此成员的值SP_UNINITIALIZED_VALUE。 如果 HBA 使用系统 DMA 控制器,并且给定的 AdapterInterfaceType 是除 microChannel 之外的任何值,则微型端口驱动程序必须重置此成员。
DmaPort
指定从属 HBA 使用的 DMA 端口。 默认情况下,此成员的值SP_UNINITIALIZED_VALUE。 如果 HBA 使用系统 DMA 控制器,并且给定的 AdapterInterfaceTypeMicroChannel,则微型端口驱动程序必须设置此成员。
DmaWidth
如果 HBA 使用 DMA,则指定 DMA 传输的宽度。 默认情况下,此成员的值为零。 如果 HBA 执行 DMA,微型端口驱动程序必须将此成员重置为以下成员之一:Width8Bits、Width16Bits或 Width32Bits。
DmaSpeed
指定 Eisa HBA 的 DMA 数据传输速度。 默认情况下,此成员的值指定兼容性计时。 此成员的可接受值为以下任一值:兼容、TypeA、TypeB或 TypeC。
AlignmentMask
包含一个掩码,指示 HBA 对传输作所需的缓冲区的对齐限制。 有效掩码值也受不同版本的 Windows 上的内存管理器特征的限制。 在 Windows 95 或 Windows 98 下允许的掩码值为 0(字节对齐)、1(单词对齐)或 3(DWORD 对齐)。 在 Windows NT 和 Windows 2000 下,有效掩码值为 0(字节对齐)、1(单词对齐)、3(DWORD 对齐)和 7(双 DWORD 对齐)。 如果 HBA 支持散点/收集,微型端口驱动程序应设置此掩码。
NumberOfAccessRanges
指定数组中 AccessRanges 元素的数量,如下所述。 当 称为 ScsiPortInitialize 的微型端口驱动程序时,特定于 OS 的端口驱动程序始终将此成员设置为在HW_INITIALIZATION_DATA结构中传递的值。
AccessRanges
Reserved
保留供系统使用,不能供微型端口驱动程序使用。
NumberOfBuses
指定 HBA 控制的 SCSI 总线数。 默认情况下,此成员的值为零。
InitiatorBusId[8]
指示发起程序总线 ID。 如果输入 InitiatorBusId[0] 具有值 0,则微型端口驱动程序可以在 HBA 不需要使用通过查询 HBA 确定的特定值时分配默认值。 否则,微型端口驱动程序应尽可能使用端口驱动程序分配的任何非零值。 每个微型端口驱动程序必须更新 InitiatorBusId 规范,以匹配其 HBA 使用的内容(如有必要)查询 HBA 以确定适当的值。
微型端口驱动程序必须为 HBA 支持的每个 SCSI 总线设置一个条目,如 NumberOfBuses的值指示。
ScatterGather
指示何时 TRUE HBA 支持散点/收集。 FALSE HBA 不支持散点/收集。 默认情况下,此成员的值 FALSE。
Master
指示何时 TRUE HBA 是总线主控形状。 当 FALSE时,HBA 不是总线主控形状。 默认情况下,此成员的值 FALSE。
CachesData
指示何时 TRUE HBA 缓存数据或在外围设备上维护缓存状态。 FALSE HBA 不会缓存数据或在外围设备上维护缓存状态。 默认情况下,此成员的值 FALSE。 如果重置为 TRUE,则 OS 特定的端口驱动程序会在发生某些系统事件(例如文件系统缓存刷新和系统关闭)时通知微型端口驱动程序。 例如,如果总线上的控制器镜像两个磁盘,微型端口驱动程序通常会将此成员设置为 TRUE。
AdapterScansDown
指示何时 TRUE HBA 的 BIOS 扫描 SCSI 总线目标(从 7 到零)。 当 FALSE时,HBA 的 BIOS 会查找 SCSI 总线目标,从 ID 零开始,向上扫描(但不包括)MaximumTargetIds。 默认情况下,AdapterScansDown 的值 FALSE。
AtdiskPrimaryClaimed
指示 TRUE 主“AT”(WD1003 兼容)磁盘地址范围(0x1F0到0x1FF)已被另一个驱动程序在其设备的注册表中声明。 特定于 OS 的端口驱动程序始终初始化此成员。 如果此成员的输入值 TRUE,则微型端口驱动程序应假定已加载的驱动程序已声明设备范围。 如果输入值 FALSE,微型端口驱动程序可以声明模拟“AT”磁盘控制器的 HBA 的地址范围,并将此成员重置为 TRUE,从而阻止“AT”磁盘驱动程序或随后加载的微型端口驱动程序访问此范围。
AtdiskSecondaryClaimed
指示当 TRUE 辅助 AT 磁盘地址范围时,0x170 0x17F已在注册表中由另一个驱动程序为其设备声明。 FALSE 另一个驱动程序未在注册表中声明辅助 AT 磁盘地址范围。 特定于 OS 的端口驱动程序始终初始化此成员。 微型端口驱动程序应将此成员视为 AtdiskPrimaryClaimed。
Dma32BitAddresses
指示何时 TRUE HBA 有 32 个地址行,并且可以访问物理地址大于0x00FFFFFF的内存。 FALSE HBA 具有除 32 以外的 DMA 地址行数之一。 默认情况下,此成员的值 FALSE。 如果微型端口驱动程序 Dma64BitAddresses 设置,则此成员必须 FALSE。
DemandMode
指示何时 TRUE 系统 DMA 控制器应针对需求模式而不是单周期作进行编程。 如果 HBA 不是从属设备,则此成员应 FALSE。
MapBuffers
指示何时 TRUE 必须将数据缓冲区映射到系统虚拟地址范围。 FALSE 数据缓冲区不必映射到系统虚拟地址。 当微型端口驱动程序调用 ScsiPortInitialize时,特定于 OS 的端口驱动程序始终将此成员设置为传入 HW_INITIALIZATION_DATA(SCSI) 结构中的值。 微型端口驱动程序可以为它控制的任何特定 HBA 重置此值。 如果 FALSE,微型端口驱动程序不得直接访问 Srb.DataBuffer。
NeedPhysicalAddresses
指示何时 TRUE 微型端口驱动程序必须根据需要将虚拟地址转换为物理地址。 FALSE时,微型端口驱动程序不必将虚拟地址转换为物理地址。 当微型端口驱动程序调用 ScsiPortInitialize时,特定于 OS 的端口驱动程序始终将此成员设置为传入 HW_INITIALIZATION_DATA(SCSI) 结构中的值。 微型端口驱动程序可以为它控制的任何特定 HBA 重置此值。
TaggedQueuing
指示何时 TRUE HBA 支持使用 SCSI 标记对多个请求进行队列。 FALSE时,HBA 不支持 SCSI 标记的队列。 当微型端口驱动程序调用 ScsiPortInitialize时,特定于 OS 的端口驱动程序始终将此成员设置为传入 HW_INITIALIZATION_DATA(SCSI) 结构中的值。 微型端口驱动程序可以为它控制的任何特定 HBA 重置此值。
AutoRequestSense
指示何时 TRUE HBA 支持自动请求感知。 FALSE HBA 不支持自动请求感知。 当微型端口驱动程序调用 ScsiPortInitialize时,特定于 OS 的端口驱动程序始终将此成员设置为传入 HW_INITIALIZATION_DATA(SCSI) 结构中的值。 微型端口驱动程序可以为它控制的任何特定 HBA 重置此值。 在总线主 HBA 驱动程序调用 ScsiPortGetUncachedExtension之前,必须将此成员设置为 TRUE。
MultipleRequestPerLu
指示何时 TRUE HBA 支持每个逻辑单元的多个请求。 FALSE HBA 不支持每个逻辑单元的多个请求。 适配器缓存请求的机制是适配器定义的。 当微型端口驱动程序调用 ScsiPortInitialize时,特定于 OS 的端口驱动程序始终将此成员设置为传入 HW_INITIALIZATION_DATA(SCSI) 结构中的值。 微型端口驱动程序可以为它控制的任何特定 HBA 重置此值。
ReceiveEvent
指示 HBA 何时 TRUE HBA 支持 SCSI 接收事件作。 FALSE HBA 不支持 SCSI 接收事件作。 当微型端口驱动程序调用 ScsiPortInitialize时,特定于 OS 的端口驱动程序始终将此成员设置为传入 HW_INITIALIZATION_DATA(SCSI) 结构中的值。 微型端口驱动程序可以为它控制的任何特定 HBA 重置此值。
RealModeInitialized
指示何时 TRUE 已初始化 HBA(仅限 x86)的实际模式驱动程序。 FALSE HBA 之前尚未由真实模式驱动程序初始化。 依赖于 OS 的端口驱动程序始终初始化此成员。 如果设置为 TRUE,则如果驱动程序的初始化序列与实际模式 HBA 初始化相同,则微型端口驱动程序不得初始化其 HBA;在这些情况下,不重新初始化 HBA 会使微型端口驱动程序加载速度要快得多。 此成员的值与在基于 x86 的平台的受保护模式下运行时始终初始化其 HBA 的任何微型端口驱动程序以及无论它们是在基于 CISC 还是基于 RISC 的平台上运行,都无关紧要。
BufferAccessScsiPortControlled
指示当 TRUE 微型端口驱动程序始终调用 ScsiPortXxx 来访问 SRB 中的数据缓冲区和/或请求感知信息,从而允许特定于 OS 的端口驱动程序优化 I/O 请求处理。 当 FALSE 微型端口驱动程序无需调用 ScsiPortXxx 例程来访问数据缓冲区或请求感知信息。 将此成员设置为 FALSE 可能会降低 HBA 的 I/O 性能。 调用除 ScsiPortXxx 以外的例程会使微型端口驱动程序在Microsoft作系统中不可移植。
MaximumNumberOfTargets
指定 HBA 可以控制的目标外围设备数。 默认情况下,此成员的值根据 SCSI 标准SCSI_MAXIMUM_TARGETS。 如果 HBA 的功能有限或值更大,微型端口驱动程序可以将此成员重置为较小的值,指示 HBA 具有宽 SCSI 或光纤通道功能。 此值限制为SCSI_MAXIMUM_TARGETS_PER_BUS。
ReservedUchars[2]
保留供系统使用,不能供微型端口驱动程序使用。
SlotNumber
指定 HBA 的槽号,其值与 VendorId 和 DeviceId(在 HW_INITIALIZATION_DATA (SCSI) 结构中指定的微型端口驱动程序调用 ScsiPortInitialize时指定。
BusInterruptLevel2
保留供系统使用,不能供微型端口驱动程序使用。
BusInterruptVector2
保留供系统使用,不能供微型端口驱动程序使用。
InterruptMode2
保留供系统使用,不能供微型端口驱动程序使用。
DmaChannel2
保留供系统使用,不能供微型端口驱动程序使用。
DmaPort2
保留供系统使用,不能供微型端口驱动程序使用。
DmaWidth2
保留供系统使用,不能供微型端口驱动程序使用。
DmaSpeed2
保留供系统使用,不能供微型端口驱动程序使用。
DeviceExtensionSize
指定微型端口驱动程序处理大于 64K 的数据传输所需的大小(以字节为单位),这可能需要比此驱动程序注册表中定义的大小更大的散点/收集列表。
SpecificLuExtensionSize
指定微型端口驱动程序处理大于 64K 的数据传输(如果有的话)所需的大小(以字节为单位)。 如果微型端口驱动程序不维护需要存储的每个 LU 信息,请将此成员保留为零。 此值基于 HBA 能够接收 32 位地址的假设,无论控制器实际支持什么。 如果在 LUN 或 SRB 扩展中需要额外的空间来处理 64 位地址,则必须在将此值与例程(如 ScsiPortGetUncachedExtension)一起使用之前对其进行适当的调整。
SrbExtensionSize
指定微型端口驱动程序处理大于 64K 的数据传输所需的大小(如果有)。 在调用 ScsiPortGetUncachedExtension 之前设置此成员,以基于 NumberOfPhysicalBreaks更改每个请求存储的大小。 如果微型端口驱动程序不维护需要存储的每个 SRB 信息,请将此成员保留为零。 此值基于 HBA 能够接收 32 位地址的假设,无论控制器实际支持什么。 如果在 LUN 或 SRB 扩展中需要额外的空间来处理 64 位地址,则必须在将此值与例程(如 ScsiPortGetUncachedExtension)一起使用之前对其进行适当的调整。
Dma64BitAddresses
指示 HBA 能够访问大于 4 GB 的地址,或者如果 Dma64BitAddresses 包含值SCSI_DMA64_MINIPORT_SUPPORTED,则0x0FFFFFFFF。 在 Windows 2000 之前,ScsiPort 根据 HW_INITIALIZATION_DATA (SCSI)的内容设置此值。 情况不再如此。 在 Windows 2000 中,Dma64BitAddresses 的值单独由微型端口驱动程序回调 HwScsiFindAdapter 确定。 如果作系统支持 64 位地址空间,端口驱动程序会将SCSI_DMA64_SYSTEM_SUPPORTED值传递给此成员中的微型端口驱动程序。 如果PORT_CONFIGURATION_INFORMATION所述的 HBA 还支持大于 32 位的地址空间,则需要端口/微型端口驱动程序来支持完整的 64 位寻址, 和微型端口驱动程序的回调 HwScsiFindAdapter 通过将SCSI_DMA64_MINIPORT_SUPPORTED值分配给 Dma64BitAddresses来指示这一点,并写入端口驱动程序分配的任何先前值。 在微型端口驱动程序调用 ScsiPortGetUncachedExtension之前,必须将正确的值分配给 Dma64BitAddresses 成员。
ResetTargetSupported
过时。 ScsiPort 驱动程序不再向其微型端口驱动程序发送SRB_FUNCTION_RESET_DEVICE请求。 请勿使用此成员。
MaximumNumberOfLogicalUnits
指定 HBA 可以控制的每个目标的最大逻辑单元数。 默认情况下,此成员的值SCSI_MAXIMUM_LOGICAL_UNITS。 如果 HBA 的功能有限或值更大,微型端口驱动程序可以将此成员重置为较小的值,指示 HBA 具有 SCSI-3 功能。
WmiDataProvider
指示 TRUE 微型端口驱动程序响应 Windows Management Instrumentation (WMI) 请求时。 FALSE 微型端口驱动程序不会响应 Windows Management Instrumentation (WMI) 请求。 默认情况下,此成员的值 FALSE。
言论
初始化的特定成员取决于 HBA 微型端口驱动程序以及特定于 OS 的端口驱动程序可用的配置信息。 特定于 OS 的端口驱动程序在无法向微型端口驱动程序的 HwScsiFindAdapter 例程提供配置信息的所有成员中设置默认值。
如果特定于 OS 的端口驱动程序未传入所有初始化值,则所有 HBA 微型端口驱动程序应至少有一组默认值用于相关成员。
HwScsiFindAdapter 例程必须更新与驱动程序支持的 HBA 相关的所有成员。
Windows NT 存储类驱动程序(加载时间晚于微型端口驱动程序)取决于每个微型端口驱动程序 HwScsiFindAdapter 例程提供的信息来设置其后续 I/O 请求。 例如,每个微型端口驱动程序提供的 MaximumTransferLength 和 NumberOfPhysicalBreaks 值控制类驱动程序是否必须将大型传输请求拆分成一组部分传输,以满足 HBA 的限制。
Dma64BitAddresses PORT_CONFIGURATION_INFORMATION成员不应再被视为 BOOLEAN 值。 SCSI_DMA64_SYSTEM_SUPPORTED值指示端口/微型端口驱动程序需要支持 64 位寻址,但 ScsiPortGetUncachedExtension 例程仍将 Dma64BitAddresses 的任何非零值解释为指示需要 64 位支持。 这意味着,ScsiPortGetUncachedExtension 在旧驱动程序调用时仍然正常运行,该驱动程序将 BOOLEAN 值分配给 Dma64BitAddresses。
除了 Dma64BitAddresses之外,PORT_CONFIGURATION_INFORMATION和HW_INITIALIZATION_DATA还有一对 成员称为 specificLuExtensionSize,SrbExtensionSize 其值现在必须以不同的方式处理。 微型端口驱动程序必须根据 HBA 能够接收 32 位地址的假设,计算 SpecificLuExtensionSize 的初始值,并 SrbExtensionSize HW_INITIALIZATION_DATA,具体取决于 HBA 能够接收 32 位地址。 PORT_CONFIGURATION_INFORMATION中的 SpecificLuExtensionSize 和 SrbExtensionSize 的默认值也将基于 32 位寻址的假设,因为PORT_CONFIGURATION_INFORMATION中的值派生自HW_INITIALIZATION_DATA中的值。
这意味着,如果微型端口驱动程序需要 LUN 扩展或 SRB 扩展中的其他空间来处理 64 位物理地址, 它必须在PORT_CONFIGURATION_INFORMATION中修改 SpecificLuExtensionSize 和 SrbExtensionSize 的值,然后再将PORT_CONFIGURATION_INFORMATION传递给 ScsiPortGetUncachedExtension。
要求
要求 | 价值 |
---|---|
标头 | srb.h (包括 Srb.h、Storport.h、Strmini.h) |