PORT_CONFIGURATION_INFORMATION 結構 (srb.h)
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 的中斷使用方式,因此預設值為零。 此成員與設定 BusInterruptLevel 成員為其 HBA 的驅動程序無關。 這與使用插斷向量之 I/O 總線類型的 HBA 相關,例如 PCIBus。
InterruptMode
指定 HBA 是否使用 LevelSensitive 或 Latched (有時稱為「邊緣觸發」) 中斷。 OS 特定的埠驅動程式會將此成員初始化為總線的適當值,例如 PCIBus 的 LevelSensitive。 如果適配卡已設定層級敏感中斷, Eisa HBA 的驅動程式必須重設此值,因為 I/O 總線上使用層級敏感中斷的 HBA 驅動程式必須重設此值,例如 MicroChannel 類型總線。
MaximumTransferLength
指定 HBA 可以在單一傳輸作業中傳輸的最大位元元數目。 根據預設,此成員的值會SP_UNINITIALIZED_VALUE,表示傳輸大小無限制。 如果 HBA 的傳輸支援有限,迷你埠驅動程式必須根據 HBA 的傳輸容量重設此成員。 如果迷你埠驅動程式的 HwScsiInterrupt 例程無法停用 HBA 上的中斷,則可以在驅動程式開發期間調整此成員,以確保該迷你埠驅動程式 ISR 所花費的時間不會讓滑鼠「跳躍」或序列/平行輸送量下降至使用者可注意的層級。
NumberOfPhysicalBreaks
指定 HBA 支援散佈/收集時,數據緩衝區可以擁有之位址範圍之間的中斷數目上限。 換句話說,散佈/收集清單的數目減一。 根據預設,此成員的值會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 控制器,且指定的 AdapterInterfaceType 為 MicroChannel,迷你埠驅動程式必須設定此成員。
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 元素數目,如下所述。 OS 特定的埠驅動程式一律會將這個成員設定為在名為 ScsiPortInitialize 的迷你埠驅動程式時,在HW_INITIALIZATION_DATA 結構中傳遞的值。
AccessRanges
Reserved
保留供系統使用,且無法供迷你埠驅動程式使用。
NumberOfBuses
指定 HBA 所控制的 SCSI 總線數目。 根據預設,這個成員的值是零。
InitiatorBusId[8]
指出啟動器總線標識碼。 如果輸入 InitiatorBusId[0] 的值為零,迷你埠驅動程式如果 HBA 不需要使用特定值, (s) 查詢 HBA 來決定,則迷你埠驅動程式可以指派預設值。 否則,迷你埠驅動程序應該盡可能使用埠驅動程式指派的任何非零值。 每個迷你埠驅動程式都必須更新 InitiatorBusId 規格,以符合其 HBA 所使用的規格,必要時查詢 HBA 以判斷適當的值 (s) 。
迷你埠驅動程序必須針對 HBA 支援的每個 SCSI 總線設定專案,如 NumberOfBuses 的值所指出。
ScatterGather
指出 HBA 支援散佈/收集的 TRUE 。 當 FALSE 時,HBA 不支援散佈/收集。 根據預設,這個成員的值是 FALSE。
Master
指出 HBA 是總線主機的 TRUE 。 當 為 FALSE 時,HBA 不是總線主機。 根據預設,這個成員的值是 FALSE。
CachesData
指出 HBA 快取數據或在周邊上維護快取狀態的 TRUE 。 當 FALSE 時,HBA 不會快取數據或維護周邊上的快取狀態。 根據預設,這個成員的值是 FALSE。 如果這會重設為 TRUE,OS 特定的埠驅動程式會在發生特定系統事件時通知迷你埠驅動程式,例如檔案系統快取排清和系統關機。 例如,如果總線上的控制器會鏡像兩個磁碟,迷你埠驅動程式通常會將此成員設定為 TRUE。
AdapterScansDown
指出 HBA 的 BIOS 掃描 SCSI 總線目標從 7 到零的時機。 當為 FALSE 時,HBA 的 BIOS 會尋找 SCSI 總線目標,從標識元零開始,然後向上掃描至 (,但不包含 ) MaximumTargetIds。 根據預設, AdapterScansDown 的值為 FALSE。
AtdiskPrimaryClaimed
指出主要 「AT」 (WD1003 相容) 磁碟位址範圍0x1F0 0x1FF在登錄中已由另一個驅動程式為其裝置宣告的 TRUE。 OS 特定的埠驅動程式一律會初始化這個成員。 如果此成員的輸入值為 TRUE,迷你埠驅動程序應該假設已載入的驅動程式已宣告裝置範圍。 如果輸入值為 FALSE,迷你埠驅動程式可以宣告模擬 「AT」 磁碟控制器的 HBA 位址範圍,並將此成員重設為 TRUE,藉此防止 「AT」 磁碟驅動程式或後續載入的迷你埠驅動程式存取此範圍。
AtdiskSecondaryClaimed
指出次要 AT 磁碟位址範圍何時為 TRUE,0x170 至0x17F已由另一個驅動程式在其裝置的登錄中宣告。 當 FALSE 時,其他驅動程式尚未在登錄中宣告次要 AT 磁碟位址範圍。 OS 特定的埠驅動程式一律會初始化這個成員。 Miniport 驅動程式應該將此成員視為 AtdiskPrimaryClaimed。
Dma32BitAddresses
指出 HBA 有 32 個位址行,而且可以存取大於0x00FFFFFF之實體地址的記憶體。 當 FALSE 時,HBA 有 32 以外的 DMA 位址行數。 根據預設,這個成員的值是 FALSE。 如果迷你埠驅動程式設定 Dma64BitAddresses,此成員必須是 FALSE。
DemandMode
指出系統 DMA 控制器應該針對需求模式進行程序設計,而不是單一循環作業的 TRUE。 如果 HBA 不是次級裝置,則此成員應該是 FALSE。
MapBuffers
指出數據緩衝區必須對應至系統虛擬位址範圍的 TRUE 。 當 FALSE 時,數據緩衝區不需要對應至系統虛擬位址。 當迷你埠驅動程式呼叫 ScsiPortInitialize 時,OS 特定埠驅動程式一律會將這個成員設定為傳入HW_INITIALIZATION_DATA (SCSI) 結構中的值。 迷你埠驅動程式可以針對它所控制的任何特定 HBA 重設此值。 如果 為 FALSE,迷你埠驅動程式不得直接存取 Srb.DataBuffer 。
NeedPhysicalAddresses
指出迷你埠驅動程序必須視 HBA 需要將虛擬地址轉譯為實體位址的 TRUE 。 當 為 FALSE 時,迷你埠驅動程式不需要將虛擬位址轉譯為實體位址。 當迷你埠驅動程式呼叫 ScsiPortInitialize 時,OS 特定埠驅動程式一律會將這個成員設定為傳入HW_INITIALIZATION_DATA (SCSI) 結構中的值。 迷你埠驅動程式可以針對它所控制的任何特定 HBA 重設此值。
TaggedQueuing
指出 HBA 支援使用 SCSI 標籤對多個要求的佇列時為 TRUE 。 當為 FALSE 時,HBA 不支援 SCSI 標記的佇列。 當迷你埠驅動程式呼叫 ScsiPortInitialize 時,OS 特定埠驅動程式一律會將這個成員設定為傳入HW_INITIALIZATION_DATA (SCSI) 結構中的值。 迷你埠驅動程式可以針對它所控制的任何特定 HBA 重設此值。
AutoRequestSense
指出 HBA 支援自動要求感知的 TRUE 。 當 FALSE 時,HBA 不支援自動要求感知。 當迷你埠驅動程式呼叫 ScsiPortInitialize 時,OS 特定埠驅動程式一律會將這個成員設定為傳入HW_INITIALIZATION_DATA (SCSI) 結構中的值。 迷你埠驅動程式可以針對它所控制的任何特定 HBA 重設此值。 此成員必須在總線主機 HBA 的驅動程式呼叫 ScsiPortGetUncachedExtension 之前設定為 TRUE。
MultipleRequestPerLu
指出 HBA 支援每個邏輯單元多個要求時的 TRUE 。 當 FALSE 時,HBA 不支援每個邏輯單元的多個要求。 配接器快取要求的機制是配接器定義的。 當迷你埠驅動程式呼叫 ScsiPortInitialize 時,OS 特定埠驅動程式一律會將這個成員設定為傳入HW_INITIALIZATION_DATA (SCSI) 結構中的值。 迷你埠驅動程式可以針對它所控制的任何特定 HBA 重設此值。
ReceiveEvent
指出 HBA 支援 SCSI 接收事件作業的 TRUE 。 當 FALSE 時,HBA 不支援 SCSI 接收事件作業。 當迷你埠驅動程式呼叫 ScsiPortInitialize 時,OS 特定埠驅動程式一律會將這個成員設定為傳入HW_INITIALIZATION_DATA (SCSI) 結構中的值。 迷你埠驅動程式可以針對它所控制的任何特定 HBA 重設此值。
RealModeInitialized
指出 (僅限 x86) 實模式驅動程式已初始化 HBA 的 TRUE。 當 FALSE 時,HBA 先前尚未由真實模式驅動程式初始化。 OS 相依埠驅動程式一律會初始化這個成員。 如果此設定為 TRUE,如果驅動程式的初始化順序與實際模式 HBA 初始化相同,迷你埠驅動程式就不得初始化其 HBA;在這些情況下,不會重新初始化 HBA,可讓迷你埠驅動程式載入更快速。 這個成員的值與在 x86 型平臺上以受保護模式執行時,一律初始化其 HBA 的任何迷你埠驅動程序無關,以及它們是在 CISC 或 RISC 型平臺上執行的所有迷你埠驅動程序無關。
BufferAccessScsiPortControlled
指出迷你埠驅動程式一律會呼叫 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
指定在迷你埠驅動程式呼叫 ScsiPortInitialize 時,HW_INITIALIZATION_DATA (SCSI) 結構中所指定之 VendorId 和 DeviceId 的 HBA 位置編號。
BusInterruptLevel2
保留供系統使用,且無法供迷你埠驅動程式使用。
BusInterruptVector2
保留供系統使用,且無法供迷你埠驅動程式使用。
InterruptMode2
保留供系統使用,且無法供迷你埠驅動程式使用。
DmaChannel2
保留供系統使用,且無法供迷你埠驅動程式使用。
DmaPort2
保留供系統使用,且無法供迷你埠驅動程式使用。
DmaWidth2
保留供系統使用,且無法供迷你埠驅動程式使用。
DmaSpeed2
保留供系統使用,且無法供迷你埠驅動程式使用。
DeviceExtensionSize
針對每個 HBA 裝置擴充功能,指定迷你埠驅動程式所需的位元組大小,以處理大於 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
指出迷你埠驅動程序回應 Windows Management Instrumentation (WMI) 要求時的 TRUE 。 當 FALSE 時,迷你埠驅動程式不會回應 Windows Management Instrumentation (WMI) 要求。 根據預設,這個成員的值是 FALSE。
備註
初始化的特定成員取決於 HBA 迷你埠驅動程式,以及 OS 特定埠驅動程式可用的組態資訊。 OS 特定的埠驅動程式會在所有成員中設定預設值,而這些成員無法將組態資訊提供給迷你埠驅動程式的 HwScsiFindAdapter 例程。
如果 OS 特定埠驅動程式未傳入所有初始化的值,則所有 HBA 迷你埠驅動程式都應該至少有一組預設值用於相關成員。
HwScsiFindAdapter 例程必須更新與驅動程序支援的 HBA 相關的所有成員。
Windows NT 記憶體類別驅動程式,此驅動程式比迷你埠驅動程序還要晚,取決於每個迷你埠驅動程式的 HwScsiFindAdapter 例程所提供的資訊,以設定其後續的 I/O 要求。 例如,每個迷你埠驅動程式所提供的 MaximumTransferLength 和 NumberOfPhysicalBreaks 值都會控制類別驅動程式是否必須將大型傳輸要求分割成一組部分傳輸,以符合 HBA 的限制。
PORT_CONFIGURATION_INFORMATION的 Dma64BitAddresses 成員不應再視為 BOOLEAN 值。 SCSI_DMA64_SYSTEM_SUPPORTED值表示埠/迷你埠驅動程式需要支援 64 位尋址,但 ScsiPortGetUncachedExtension 例程仍會解譯 Dma64BitAddresses 的任何非零值,表示需要 64 位支援。 這表示當舊版驅動程式將 BOOLEAN 值指派給 Dma64BitAddresses 時,ScsiPortGetUncachedExtension 仍然正常運作。
除了 Dma64BitAddresses 之外,PORT_CONFIGURATION_INFORMATION和HW_INITIALIZATION_DATA都有一組稱為 SpecificLuExtensionSize 和 SrbExtensionSize 的成員,其值現在必須以不同的方式處理。 迷你埠驅動程式必須根據 HBA 能夠接收 32 位位址的假設,在 HW_INITIALIZATION_DATA 中計算 SpecificLuExtensionSize 和 SrbExtensionSize 的初始值,不論控制器可以實際支持什麼。 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) |