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框架可参考微软文档,主架构如图:
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
| sp_DRIVER_INITIALIZE DriverEntry;
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
| HwInitData.HwInitialize = scsi_HwInitialize; HwInitData.HwStartIo = scsi_HwStartIO; HwInitData.HwBuildIo = scsi_HwBuildIO; 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
| 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
| switch(Srb->Function) { case SRB_FUNCTION_EXECUTE_SCSI: result = scsi_execute(pdx, Srb, &pending_io); break;
case SRB_FUNCTION_IO_CONTROL: result = io_control_execute(pdx, Srb, &pending_io); break;
case SRB_FUNCTION_PNP: switch(pPNPSrb->PnPAction) { case StorQueryCapabilities: StorQueryCapability(pdx, Srb); break; } break;
case SRB_FUNCTION_POWER: 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
| case SRB_FUNCTION_PNP: { PSCSI_PNP_REQUEST_BLOCK pPNPSrb = (PSCSI_PNP_REQUEST_BLOCK)Srb;
switch(pPNPSrb->PnPAction) { case StorQueryCapabilities: StorQueryCapability(pdx, Srb); break;
default: 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
| SCSI_UNIT_CONTROL_STATUS scsi_HwUnitControl( IN PVOID AdapterExtension, IN SCSI_UNIT_CONTROL_TYPE ControlType, IN PVOID Parameters ) { switch(ControlType) { case ScsiQuerySupportedUnitControlTypes: break;
case ScsiUnitStart: req_prepare_start(pdx); break;
case ScsiUnitPower: break;
case ScsiUnitPoFxPowerInfo: break;
case ScsiUnitPoFxPowerSetFState: 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
| typedef enum { POWER_D0 = 0, POWER_D1 = 1, POWER_D2 = 2, POWER_D3 = 3, } e_device_power_state;
typedef enum { SYSTEM_S0 = 0, SYSTEM_S1 = 1, SYSTEM_S2 = 2, SYSTEM_S3 = 3, SYSTEM_S4 = 4, SYSTEM_S5 = 5, } e_system_power_state;
typedef enum { RTD3_NONE = 0, RTD3_SUPPORTED, RTD3_IN_PROGRESS, RTD3_COMPLETE, } 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
| 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) { req_enter_d0(pdx); } else if(powerInfo->DevicePowerState == StorPowerDeviceD3) { 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
| BOOLEAN scsi_HwInitialize(IN PVOID DeviceExtension) { bht_dev_ext_t *pdx = (bht_dev_ext_t *)DeviceExtension;
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
| BOOLEAN StorHwPassiveInitialize(IN PVOID DeviceExtension) { bht_dev_ext_t *pdx = (bht_dev_ext_t *)DeviceExtension;
req_global_init(pdx);
DevMapAdd(pdx);
if(pdx->pm_state.rtd3_en != TRUE) goto Exit;
StorPortGetD3ColdSupport(DeviceExtension, NULL, &enableD3Cold);
StorPortInitializePoFxPower(...);
pdx->os.AdptPoFxDevice.Version = STOR_POFX_DEVICE_VERSION_V2; pdx->os.AdptPoFxDevice.ComponentCount = 1; pdx->os.AdptPoFxDevice.Components[0].FStateCount = 1;
status = StorPortInitializePoFxPower(...);
Exit: 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
| typedef struct srb_ext_s { request_t req;
dma_buf_t data_tbl;
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;
|
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() │ │ │ └─────────────────────────────────────────────────────────────────────┘
|
参考资料
- Storport Miniport Drivers
- HW_INITIALIZATION_DATA
- StorPort Power Management
- Scsiport vs Storport
文档生成日期: 2026-03-21
驱动版本: BHTSDDR