Storport SD Controller架构(一):Storport Miniport驱动接口与回调机制

Storport SD Controller 架构(一):Storport Miniport 驱动接口与回调机制

日期: 2026-03-21
系列: Storport SD Controller 架构解析
适用: Windows 驱动开发者、存储系统工程师


1. 概述

1.1 架构定位

本系列文章深入解析 Bayhub SD Host Controller (BHTSDDR) 驱动的架构设计。该驱动是一款基于 Storport Miniport 框架的 Windows 存储设备驱动,支持 SD/MMC/eMMC/UHS-II 多种存储卡类型。

Storport框架可参考微软文档,主架构如图:

image-20260519161053721 image-20260519161128022

1.2 代码组织结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
C:\gitlab-bht\storport\
└── SDSTORDriver/
└── sdstor/
├── include/ # 公共头文件 (OS 独立)
│ ├── basic.h # 基础类型定义
│ ├── host.h # Host 控制器结构
│ ├── card.h # 存储卡结构
│ └── cfgmng.h # 配置管理

├── windows_os/ # Windows 平台实现
│ ├── winscsientry.c # 驱动入口 + 回调函数
│ ├── winapi.c # Windows API 封装
│ └── windump.c # 调试信息

├── linux_os/ # Linux 平台实现
├── host/ # Host 控制器层
├── card/ # 存储卡层
├── main/ # 核心业务逻辑
└── tagqueue/ # DMA 传输队列

1.3 模块层次架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
┌─────────────────────────────────────────────────────────────────────┐
│ Storport Miniport 驱动层次 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ Windows OS Abstraction Layer (winscsientry.c) │ │
│ │ │ │
│ │ DriverEntry ←────── 驱动入口点 │ │
│ │ │ │ │
│ │ ├── HwFindAdapter ←── 适配器发现与配置 │ │
│ │ ├── HwInitialize ←─── 硬件初始化 │ │
│ │ ├── HwStartIO ←────── I/O 请求处理 ★ 核心入口 │ │
│ │ ├── HwInterrupt ←───── 中断处理 │ │
│ │ ├── HwAdapterControl ← 适配器控制 (电源/休眠) │ │
│ │ └── StorHwPassiveInitialize ←── 被动初始化 │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ Core Business Layer (main/) │ │
│ │ │ │
│ │ reqmng.c ←─── 请求管理层 (SRB 生命周期) │ │
│ │ │ │ │
│ │ ├── pmfunc.c ←─── 电源管理 (D0/D3/S3/S4/RTD3) │ │
│ │ ├── cfgmng.c ←─── 配置管理 (INF/注册表) │ │
│ │ └── thread.c ←─── 工作线程 (卡初始化/事件处理) │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ Tag Queue Layer (tagqueue/) │ │
│ │ │ │
│ │ tagqueue.c ←─── 标签队列核心 │ │
│ │ │ │ │
│ │ ├── tqadma2.c ←── ADMA2 传输 (高性能) │ │
│ │ ├── tqsdma.c ←─── SDMA 传输 (简单) │ │
│ │ └── tqpolicy.c ←── 传输策略管理 │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────┴───────────────┐ │
│ ▼ ▼ │
│ ┌───────────────────────┐ ┌───────────────────────┐ │
│ │ Host Layer │ │ Card Layer │ │
│ │ (host/) │ │ (card/) │ │
│ │ │ │ │ │
│ │ host.c ←─────── │ │ cardcommon.c ←──── │ │
│ │ 寄存器读写/中断处理 │ │ 通用卡操作 │ │
│ │ │ │ │ │
│ │ cmdhandler.c ←──── │ │ sd.c ←─────────── │ │
│ │ SD 命令发送/响应 │ │ SD 卡协议 │ │
│ │ │ │ │ │
│ │ transhandler.c ←─── │ │ mmc.c ←─────────── │ │
│ │ 传输完成处理 │ │ eMMC 协议 │ │
│ │ │ │ │ │
│ └───────────────────────┘ │ uhs2.c ←─────────── │ │
│ │ UHS-II 协议 │ │
│ └───────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘

2. DriverEntry 驱动入口

2.1 入口函数定义

1
2
3
4
5
6
7
8
// winscsientry.c:42
sp_DRIVER_INITIALIZE DriverEntry;

// winscsientry.c:2540
ULONG DriverEntry(
IN PVOID DriverObject,
IN PVOID RegistryPath
)

2.2 初始化流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DriverEntry 执行流程:

┌─────────────────────────────────────────────────────────────────────┐
│ 1. 调试系统初始化 │
│ ├── os_random_init() // 随机数生成器 │
│ └── DbgRamInit() // RAM 调试缓冲区 │
├─────────────────────────────────────────────────────────────────────┤
│ 2. 设备映射表初始化 │
│ └── os_memset(gDevMap, 0, sizeof(gDevMap)) │
├─────────────────────────────────────────────────────────────────────┤
│ 3. HW_INITIALIZATION_DATA 结构填充 ★ 核心 │
│ ├── 设置 DeviceExtensionSize = sizeof(bht_dev_ext_t) │
│ ├── 设置 SrbExtensionSize = 2 * sizeof(srb_ext_t) │
│ ├── 注册所有 HW 回调函数 │
│ └── 配置 PCI 总线参数 (VendorId, DeviceId) │
├─────────────────────────────────────────────────────────────────────┤
│ 4. 调用 StorPortInitialize │
│ └── 传递 HW_INITIALIZATION_DATA 给 Storport 框架 │
└─────────────────────────────────────────────────────────────────────┘

2.3 关键配置参数

配置项 说明
AdapterInterfaceType PCIBus PCI 总线设备
VendorId “1217” Bayhub PCI Vendor ID
DeviceId “8220” 设备 ID (可配置)
DeviceExtensionSize sizeof(bht_dev_ext_t) 设备扩展大小
SrbExtensionSize 2 * sizeof(srb_ext_t) SRB 扩展大小
NumberOfAccessRanges 2 BAR0 + BAR1 两个寄存器区域
MapBuffers TRUE 需要缓冲区映射
NeedPhysicalAddresses TRUE 需要物理地址
TaggedQueuing TRUE 支持 tagged queue
AutoRequestSense TRUE 自动 sense

3. 回调函数接口体系

3.1 回调函数注册表

1
2
3
4
5
6
7
8
9
// winscsientry.c 中注册的所有回调函数
HwInitData.HwInitialize = scsi_HwInitialize; // 初始化
HwInitData.HwStartIo = scsi_HwStartIO; // I/O 入口 ★
HwInitData.HwBuildIo = scsi_HwBuildIO; // I/O 构建
HwInitData.HwInterrupt = scsi_HwInterrupt; // 中断处理
HwInitData.HwFindAdapter = scsi_HwFindAdapter; // 适配器发现
HwInitData.HwResetBus = scsi_HwResetBus; // 总线复位
HwInitData.HwAdapterControl = scsi_HwAdapterControl; // 适配器控制
HwInitData.HwPassiveInitialize = StorHwPassiveInitialize; // 被动初始化

3.2 回调函数调用时序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Storport Miniport 回调时序图:

┌─────────────────────────────────────────────────────────────────────┐
│ 系统启动阶段 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ DriverEntry │
│ │ │
│ ▼ │
│ StorPortInitialize() │
│ │ │
│ ▼ │
│ HwFindAdapter() ←── 发现 PCI 设备,读取配置空间 │
│ │ │
│ ▼ │
│ HwInitialize() ←── 初始化 Host 控制器寄存器 │
│ │ │
│ ▼ │
│ HwStartIo() ←── 处理系统启动后的第一个请求 │
│ │
├─────────────────────────────────────────────────────────────────────┤
│ 正常运行阶段 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ HwStartIo() ★ 核心回调 │ │
│ │ │ │
│ │ 每当上层 (文件系统/存储栈) 有请求下发时,Storport 调用此函数: │ │
│ │ │ │
│ │ Srb->Function: │ │
│ │ ├── SRB_FUNCTION_EXECUTE_SCSI ←── 读/写/查询命令 │ │
│ │ ├── SRB_FUNCTION_IO_CONTROL ←── IOCTL 私有命令 │ │
│ │ ├── SRB_FUNCTION_PNP ←── PnP 查询能力 │ │
│ │ ├── SRB_FUNCTION_POWER ←── 电源请求 │ │
│ │ ├── SRB_FUNCTION_RESET_BUS ←── 总线复位 │ │
│ │ └── SRB_FUNCTION_ABORT_COMMAND ←── 命令中止 │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ HwInterrupt() │ │
│ │ │ │
│ │ 硬件中断发生时,Storport 调度此函数: │ │
│ │ ├── 传输完成中断 │ │
│ │ ├── 命令完成中断 │ │
│ │ └── 卡插入/拔出中断 │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
├─────────────────────────────────────────────────────────────────────┤
│ 电源管理阶段 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ HwAdapterControl() ←── 处理电源 IRP │
│ │ │
│ ├── AdapterControlPower ←── D0/D3 电源状态 │
│ ├── AdapterControlStart ←── 设备启动 │
│ └── AdapterControlStop ←── 设备停止 │
│ │
│ StorHwPassiveInitialize() ←── Passive Level 初始化 │
│ │ │
│ └── 创建工作线程,初始化 PoFx 电源管理 │
│ │
└─────────────────────────────────────────────────────────────────────┘

4. HwStartIO 核心 I/O 入口

4.1 函数原型

1
2
3
4
5
// winscsientry.c:677
BOOLEAN scsi_HwStartIO(
IN PVOID DeviceExtension,
IN PSCSI_REQUEST_BLOCK Srb
)

4.2 请求类型分发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// winscsientry.c:689-765
switch(Srb->Function)
{
case SRB_FUNCTION_EXECUTE_SCSI:
// ★ 核心 SCSI 命令处理 (读/写/查询等)
result = scsi_execute(pdx, Srb, &pending_io);
break;

case SRB_FUNCTION_IO_CONTROL:
// 私有 IOCTL 命令 (用于固件升级、调试等)
result = io_control_execute(pdx, Srb, &pending_io);
break;

case SRB_FUNCTION_PNP:
// PnP 能力查询
switch(pPNPSrb->PnPAction)
{
case StorQueryCapabilities:
StorQueryCapability(pdx, Srb);
break;
}
break;

case SRB_FUNCTION_POWER:
// 电源请求 (Storport 模式)
Srb->SrbStatus = SRB_STATUS_SUCCESS;
StorPortNotification(RequestComplete, pdx, Srb);
break;

case SRB_FUNCTION_RESET_BUS:
Srb->SrbStatus = SRB_STATUS_SUCCESS;
break;

case SRB_FUNCTION_ABORT_COMMAND:
Srb->SrbStatus = SRB_STATUS_ABORT_FAILED;
break;
}

4.3 SRB 状态机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SRB 处理状态机:

┌─────────────────────────────────────────────────────────────────────┐
│ │
│ Srb->SrbStatus │
│ │ │
│ ├── SRB_STATUS_PENDING ←─── 请求被接受,等待异步完成 │
│ │ │ │
│ │ │ (异步处理完成后) │
│ │ ▼ │
│ ├── SRB_STATUS_SUCCESS ←─── 请求成功完成 │
│ │ │ │
│ │ ▼ │
│ │ StorPortNotification(RequestComplete, ...) │
│ │ │ │
│ │ ▼ │
│ └── SRB_STATUS_BUSY ←─── 请求繁忙,稍后重试 │
│ │ │
│ ▼ │
│ OS_PortNotification(RequestComplete, ...) │
│ │
└─────────────────────────────────────────────────────────────────────┘

5. PnP 与 IRP 处理

5.1 PnP 查询处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// winscsientry.c:713-729
case SRB_FUNCTION_PNP:
{
PSCSI_PNP_REQUEST_BLOCK pPNPSrb = (PSCSI_PNP_REQUEST_BLOCK)Srb;

switch(pPNPSrb->PnPAction)
{
case StorQueryCapabilities:
// 返回设备能力 (可移除媒体、设备类型等)
StorQueryCapability(pdx, Srb);
break;

default:
// 其他 PnP 请求默认失败
Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
StorPortNotification(RequestComplete, pdx, Srb);
break;
}
goto end;
}

5.2 HwUnitControl 处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// winscsientry.c:1374-1470
SCSI_UNIT_CONTROL_STATUS scsi_HwUnitControl(
IN PVOID AdapterExtension,
IN SCSI_UNIT_CONTROL_TYPE ControlType,
IN PVOID Parameters
)
{
switch(ControlType)
{
case ScsiQuerySupportedUnitControlTypes:
// 报告支持的单元控制类型
// 支持: ScsiUnitStart, ScsiUnitPower, ScsiUnitPoFx* 等
break;

case ScsiUnitStart:
// 设备启动 - 卡片初始化
req_prepare_start(pdx);
break;

case ScsiUnitPower:
// 设备电源管理
break;

case ScsiUnitPoFxPowerInfo:
// PoFx 电源信息查询
break;

case ScsiUnitPoFxPowerSetFState:
// PoFx 电源状态设置
break;
}
}

6. 电源管理接口

6.1 电源状态枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 设备电源状态 (Device Power State)
typedef enum {
POWER_D0 = 0, // 完全工作状态
POWER_D1 = 1, // 浅睡眠
POWER_D2 = 2, // 深睡眠
POWER_D3 = 3, // 深度睡眠/关闭
} e_device_power_state;

// 系统电源状态 (System Power State)
typedef enum {
SYSTEM_S0 = 0, // 工作状态
SYSTEM_S1 = 1, // 待机 (Standby)
SYSTEM_S2 = 2, // 待机 (可选)
SYSTEM_S3 = 3, // 休眠 (Suspend to RAM)
SYSTEM_S4 = 4, // 休眠 (Suspend to Disk)
SYSTEM_S5 = 5, // 软关机
} e_system_power_state;

// 运行时 D3 (Runtime D3)
typedef enum {
RTD3_NONE = 0, // 不支持 RTD3
RTD3_SUPPORTED, // 支持 RTD3
RTD3_IN_PROGRESS, // RTD3 进入中
RTD3_COMPLETE, // RTD3 完成
} e_rtd3_state;

6.2 AdapterControl 电源处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// winscsientry.c:1535-1600
SCSI_ADAPTER_CONTROL_STATUS scsi_HwAdapterControl(
IN PVOID DeviceExtension,
IN SCSI_ADAPTER_CONTROL_TYPE ControlType,
IN PVOID Parameters
)
{
bht_dev_ext_t *pdx = (bht_dev_ext_t *)DeviceExtension;

switch(ControlType)
{
case AdapterControlPower:
{
PSCSI_POWER_INFO powerInfo = (PSCSI_POWER_INFO)Parameters;

if(powerInfo->DevicePowerState == StorPowerDeviceD0)
{
// 进入 D0 (工作状态)
req_enter_d0(pdx);
}
else if(powerInfo->DevicePowerState == StorPowerDeviceD3)
{
// 进入 D3 (低功耗状态)
req_enter_d3(pdx);
}

powerInfo->SupportedPowerStates = (1 << StorPowerDeviceD0) |
(1 << StorPowerDeviceD3);
break;
}

case AdapterControlStart:
// 设备启动
break;

case AdapterControlStop:
// 设备停止
req_prepare_stop(pdx);
break;

case AdapterControlResetBus:
// 总线复位
req_bus_reset(pdx);
break;
}

return ScsiAdapterControlSuccess;
}

6.3 电源状态转换图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
┌─────────────────────────────────────────────────────────────────────┐
│ 电源状态转换图 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ S0/S0ix S1 S2 S3 S4/S5 │
│ │ │ │ │ │ │
│ D0 ◄─────────┼────────┼────────┼────────┼────────────┼───────────► D0 │
│ │ │ │ │ │ │ │
│ │ (运行时 D3 进入) │ │ │ │ │
│ │ │ │ │ │ │ │
│ ▼ ▼ │ │ │ │ │
│ Runtime D3 ────────┼────────┼────────┼────────────┼───────────► │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ ▼ ▼ │ │ │ │ │
│ Runtime D0 ◄────────┼────────┼────────┼────────────┼───────────► │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ ▼ │
│ │ │ │ │ │ S4 (休眠) │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ ▼ │
│ │ │ │ │ │ S5 (关机) │
│ │ │ │ │ │ │ │
│ ▼ ▼ ▼ ▼ ▼ ▼ │
│ Card Removed (媒体移除时物理状态) │
│ │
└─────────────────────────────────────────────────────────────────────┘

7. 被动初始化 (Passive Initialize)

7.1 被动初始化机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// winscsientry.c:483-498
BOOLEAN scsi_HwInitialize(IN PVOID DeviceExtension)
{
bht_dev_ext_t *pdx = (bht_dev_ext_t *)DeviceExtension;

// ★ 关键:启用被动初始化回调
// 这允许 Storport 在合适的 IRQL 下调用 StorHwPassiveInitialize
StorPortEnablePassiveInitialization(
DeviceExtension,
StorHwPassiveInitialize // 被动初始化回调
);

return TRUE;
}

7.2 被动初始化流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// winscsientry.c:366-448
BOOLEAN StorHwPassiveInitialize(IN PVOID DeviceExtension)
{
bht_dev_ext_t *pdx = (bht_dev_ext_t *)DeviceExtension;

// 1. 全局请求管理层初始化
req_global_init(pdx);

// 2. 添加到设备映射表
DevMapAdd(pdx);

// 3. 检查是否启用 RTD3
if(pdx->pm_state.rtd3_en != TRUE)
goto Exit;

// 4. 查询 D3Cold 支持
StorPortGetD3ColdSupport(DeviceExtension, NULL, &enableD3Cold);

// 5. 初始化 PoFx (电源框架)
StorPortInitializePoFxPower(...);

// 6. 设置 PoFx 设备信息
pdx->os.AdptPoFxDevice.Version = STOR_POFX_DEVICE_VERSION_V2;
pdx->os.AdptPoFxDevice.ComponentCount = 1;
pdx->os.AdptPoFxDevice.Components[0].FStateCount = 1;

// 7. 注册运行时电源管理
status = StorPortInitializePoFxPower(...);

Exit:
// 8. ★ 在最后创建工作线程
os_create_thread(pdx, &pdx->os.thread[0], pdx, thread_main);

return TRUE;
}

7.3 PoFx 电源框架初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
┌─────────────────────────────────────────────────────────────────────┐
│ PoFx (Power Framework) 初始化流程 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ StorHwPassiveInitialize() │
│ │ │
│ ▼ │
│ StorPortInitializePoFxPower() │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ STOR_POFX_DEVICE_V2 结构配置: │ │
│ │ │ │
│ │ ComponentCount = 1 │ │
│ │ Components[0].FStateCount = 1 │ │
│ │ Components[0].DeepestWakeableFState = 0 │ │
│ │ Components[0].TransitionLatency = 0 │ │
│ │ │ │
│ │ Flags: │ │
│ │ ├── IDLE_TIMEOUT ← 启用空闲超时 │ │
│ │ ├── ADAPTER_D3_WAKE ← D3 可唤醒 │ │
│ │ └── NO_DUMP_ACTIVE ← 转储模式不激活 │ │
│ │ │ │
│ │ AdapterIdleTimeoutInMS = cfg.adapter_idle_time_s * 1000 │ │
│ │ (可配置: 默认 10 秒空闲后进入 D3) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ PoFx 电源管理激活成功 │
│ │ │
│ ▼ │
│ 创建工作线程 (thread_main) │
│ │
└─────────────────────────────────────────────────────────────────────┘

8. SRB 扩展结构

8.1 SRB Extension 布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// basic.h 中定义
typedef struct srb_ext_s {
request_t req; // 请求结构

// DMA 缓冲区 (用于 SDMA/PIO 模式)
dma_buf_t data_tbl;

// DMA 描述符表
dma_desc_buf_t *dma_desc_buf;

// 传输上下文
trans_context_t trans_ctx;

// 中断信息
intr_info_t intr_info;

// 调试信息
u32 tag;
u32 dbg_trace;
} srb_ext_t;

// sizeof(srb_ext_t) ≈ 256 bytes
// DriverEntry 中配置: SrbExtensionSize = 2 * sizeof(srb_ext_t)

8.2 SRB Extension 分配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
┌─────────────────────────────────────────────────────────────────────┐
│ SRB Extension 分配机制 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Storport 框架 │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ SRB (SCSI_REQUEST_BLOCK) │ │
│ │ │ │ │
│ │ │ Srb->SrbExtension 指向: │ │
│ │ ▼ │ │
│ │ ┌────────────────────────────────────────────────┐ │ │
│ │ │ srb_ext_t[0] (主 SRB 扩展) │ │ │
│ │ │ ├── request_t req │ │ │
│ │ │ ├── dma_buf_t data_tbl │ │ │
│ │ │ └── ... │ │ │
│ │ └────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ │ (SrbExtensionSize = 2 * sizeof(srb_ext_t)) │ │
│ │ ▼ │ │
│ │ ┌────────────────────────────────────────────────┐ │ │
│ │ │ srb_ext_t[1] (备用 SRB 扩展) │ │ │
│ │ └────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 作用: │
│ - 支持 SRB 链式处理 │
│ - 错误恢复时的备份空间 │
│ │
└─────────────────────────────────────────────────────────────────────┘

9. 总结

9.1 接口设计要点

要点 说明
分层架构 OS 抽象层 → 核心业务层 → Tag Queue 层 → Host/Card 层
回调驱动 通过 HW_INITIALIZATION_DATA 注册所有回调
状态机 SRB 使用 pending/success/busy 三状态模型
被动初始化 通过 StorPortEnablePassiveInitialization 实现延迟初始化
电源管理 支持 D0/D3 + S3/S4 + Runtime D3

9.2 回调函数调用关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
┌─────────────────────────────────────────────────────────────────────┐
│ 回调函数调用关系图 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ DriverEntry │
│ │ │
│ ├── StorPortInitialize() │
│ │ │ │
│ │ └── HwFindAdapter() ←── 配置适配器 │
│ │ │ │
│ │ └── HwInitialize() │
│ │ │ │
│ │ └── StorPortEnablePassive... │
│ │ │ │
│ │ ▼ │
│ │ StorHwPassiveInitialize() │
│ │ │ │
│ │ ├── req_global_init() │
│ │ ├── PoFx 初始化 │
│ │ └── os_create_thread()│
│ │ │ │
│ │ ▼ │
│ │ ←─────────── HwStartIo() ★ 核心 ──────────────────────► │
│ │ (每个 I/O 请求调用一次) │
│ │ │ │
│ │ ├── scsi_execute() │
│ │ ├── io_control_execute() │
│ │ └── PnP/Power 处理 │
│ │ │
│ ▼ │
│ HwInterrupt() ←─── 硬件中断触发 │
│ │ │
│ └── sdhci_irq() │
│ │ │
│ └── tagqueue_done() │
│ │
└─────────────────────────────────────────────────────────────────────┘

参考资料

  1. Storport Miniport Drivers
  2. HW_INITIALIZATION_DATA
  3. StorPort Power Management
  4. Scsiport vs Storport

文档生成日期: 2026-03-21
驱动版本: BHTSDDR