#定义XPT NOOP Ox00 /*什么也不执行*/
#定义XPT_SCSI_IO Ox01 /*执行请求的SCSI I/O*/
#定义XPT GDEV TYPE 0x02 / *得到设备类型信息*/
#定义XPT_PATH_INQ 0x03 / *路径查询*/
#定义XPT_REL_SIMQ Ox04 /*释放被冻结的SIM排队*/
#定义XPT_SASYNC_CB Ox05 /*设置异步回调参数*/
#定义XPT_ SDEV_TYPE Ox06 /*设置设备类型信息*/
#定义XPT_SCAN..BUS Ox07 /*扫描SCSI总线*/
/* XPT SCST控制函数,OxlO-OxlF*/
#定义XPT.ABORT OxlO /*中止选择的CCB*/
#定义XPT_RESET_BUS Oxll /*复位SCSI总线*/
#定义XPT RESET_DEV Ox12 /*复位SCSI设备,BDR*/
#定义XPT_TERM_IO Ox13 /*终止I/O处理*/
#定义XPT_SCANLUN Ox14 /*扫描逻辑单元*/
#定义XPT_CAM3 CCB Ox15 /*CAM-3 CCB指示器*/
#定义XPT_BIND 0x16 /*连接一个连接*/
#定义XPT BIND OUERY Ox17 /*若连接存在查询或选项*/
#定义XPT_BINDREL Ox18 /*释放你的连接*/
#定义XPT_DISCOV_START_PORT_ID Ox19 /*发现起始端口ID*/
#定义XPT_DISCOV START_TARGET_ID OxlA /*发现起始目标设备标识符*/
#定义XPT_ DISGOV-ADDR OxlB /*发现得到地址*/
#定义XPT_ DISCOV _END OxlC /*发现结束*/
2F*/#定义XPT_ENG_INQ Ox20 /*HA引擎查询*/
#定义XPT.ENG_EXEC Ox21 /*HA执行引擎请求*/
/*目标设备方式命令.Ox30-Ox3F*/
#定义XPT_ EN- LUN Ox30 /*允许LUN,目标设备方式支持*/
#定义XPT_TARGET_IO Ox31 /*执行目标设备I/0请求*/
#定义XPT_ACCEPTTARG 0x32 /*接受主机目标设备方式CDB*/
#定义XPT_CONT_TARG 0x33 /*继续主目标设备r/0连接*/
#定义XPT_IMMED_NOTIFY 0x34 /*通知事件的主目标设备驱动程序*/
#定义XPT NOTIFY ACK 0x35 /*事件应答*/
若不支持的函数代码被发送到XPT或SIM.XPT或SIM应完成请求并记入无效请求的CAM状态,
——cam_orotocol:
有效的CAM定义协议类型(如:SCSI、NETWORK).
--port_id;
该组成是XPT分配的所描述设备的端口号(如:SCSI总线号).
--addr_specl[2]
包含SCSI目标设备说明符的两个CAM_U32阵列.addr_specl[0]组成应包含SCSI目标设备说明符的低32位(最低有效部分),addr_specl[1]组成应包含SCSI目标设备说明符的高32位(最高有效部分).
——addr_spec2[2]
包含SCSI逻辑单元说明符的两个CAM_U32阵列。addr_specl[O]组成应包含SCSI逻辑单元说明符的低32位(最低有效部分),addr_specl[1]组成应包含SCSI逻辑单元说明符的高32位(最高有效部分).
——cars_sim_generation:
该组成反映了与一个连接有关的SIM代号.成功实现连接功能后该值被返回.
--cam_sim.bhandle;
该组成反映了在外围驱动程序执行一个连接操作时被返回的SIM连接处理。
--cam_xpt.ptr~
指向XPT工作空间的指针.XPT售方可以为它认为合适的任何用途使用该空间。
——cam_pdrv_ptr:
指向XPT分配的外围驱动程序工作空间的指针.外围驱动程序如何请求分配符合该外围驱动程序的需要的这个空间的更进一步信息见9.3.3.13.
——cam_sim_ ptr:
指向分配SIM工作空间的XPT的指针.SIM如何请求分配符合SIM需要的这个空间的更进一步信息见10.7.1.
——cam_pdrv_1en:
按照cam_pdrv_ptr组成的指向,外围驱动程序工作空间的字节长度.
——cam_sim_len
按照cam_sim- ptr组成的指向,SIM工作空间的字节长度.
11.7 SCSl CAM-3专用COB函数格式
11.7.1 CAM-3 NOP CCB
外围驱动程序能够随时执行该函数.若路径ID有效.XPT应调用表示发送该CCB的SIR的sim_actionO例程.SIM应立即返回.
XPT的供给者应定义CAM-3 NOP CCB结构,如表8所示:
表8 ccb_noop3
数据类型 |
组成名称 |
OPIG/RECP |
描述文本 |
数据结构ccb _ header3 指针 CAM U16 CAMVOID OFFSET CAMVOID OFFSET CAMVOID OFFSET CAM U32 |
My addr
Camccb len Camfunc code Camstatus Logical id Camflags Cam3 func code Camprotocol Port id Addr spec1[2] Addr spec2[2] Reserved1 cam sim generation cam sim bhandle cam xpt ptr cam pdrv ptr cam sim ptr cam pdrv len cam sim len |
XPT
XPT ORIG RECP
ORIG ORIG ORIG
XPT XPT XPT XPT XPT |
该CCB的地址
整个CCB 的长度 XPT 函数代码包含CAM 一3 CCB 标识符 返回的CAM子系统状态 协议类型SCSI 包含LUN 说明符的两个CAM 32 阵列 为今后扩展保留 指向XPT 工作空间的指针 指向分配SIM 工作空间的XPT 的指针 外围驱动程序工作空间的字节长度 SIM 工作空间的字节长度 |
ccb_noop3事例如下;
typedef struct ccb_noop3
(
CCB_HEADER3 ccb_header3; /* CCB_IIEADER3信息字段*/
) CCB_NOOP3;
11.7.1.1 HOP的组成说明
——请求应由CCB的发送者设置的CCB_ HEADER3组成的信息
· cam_func_codet
该组成应包含XPt CAM 3 CCB函数代码,
· cam3..func_code
该组成应包含XPT_NOOP函数代码
· port_id;
该组成应包含一个端口号(如:SCSI总线号).
· cam_flags
对于该函数不存在定义的CAM标记.
7.1.2NOP返回
该函数应返回CAM状态,
——请求无错误完成的CAM状态。
——无效路径ID的CAM状态表示未安装指定的路径ID.
11,7.2发现CCB函数
本条描述了获得SCSI设备拓扑信息的CM-3发现CCB函数,XPT和SIM的行为的详细情况见11.1.
11.7.2.1 CAM-3发现开始CCB -扫描端口ID函数
发现开始CCB -扫描端口ID函数为指定的端口ID开始一个拓扑发现过程。
XPT的供给者应定义CAM-3发现开始CCB -扫描端口ID函数结构,如表9所示.
表9 ccb_disCov_oort_id3
数据类型 |
组成名称 |
ORIG/RECP |
描述文本 |
数据结构ccb_header3指针 |
My addr |
XPT |
该CCB的地址 |
CAM-U16 |
Camccb_lent |
XPT |
整个CCB的长度 |
CAMU8 |
Camfunc_code |
ORIG |
XPT函数代码包含CAM-3 CCB标识符 |
CAM_U8 |
cam_status |
RECP |
返回的CAM子系统状态 |
CAM.U32 |
logical_id |
|
分配的设备逻辑ID |
CAM U32 |
cam flagss |
|
子系统操作标记 |
CAM_U32 |
cam3_func_cod |
ORIG |
CAM-3 CCB的实际函数代码 |
CAMU32 |
caLprotocols |
ORIG |
协议类型SCSI |
CAMU32 |
port_idw |
ORIG |
注册的SIM/HA端口号 |
CAM_U32
|
eddr_specl[2]
|
|
包含目标设备说明符的两个CAM_U32阵列 |
CAM_U32 |
oddr_spec2 [2] |
|
包含LUN说明符的两个CAM-U32阵列 |
CAM_U32 |
reservedl |
|
为今后扩展保留 |
CAMU32 |
cam_sim_generation |
|
连接CCB返回的代号 |
CAMVOID_OFFSET
|
cam_sim_bhandllel
|
|
连接CCB返回的SIM连接处理 (Handle) |
CAMYOID OFFSET |
cam_xpt_ptr |
XPT |
指向XPT工作空间的指针 |
CAW_VOID_OFFSET
|
cam_pdrv_ptr
|
XPT
|
指向分配外围驱动程序工作空间的XPT的指针 |
CAW_VOID OFFSBT |
cam_s im_ptr |
XPT |
指向分配SIM工作空间的XPT的指针 |
CAM-U32 |
cam_pdrv_len |
XPT |
外围驱动程序工作空间的字节长度 |
CAM._U32 |
cam_sim_ len |
XPT |
SIM工作空间的字节长度 |
ccb_disc_vort_id3的事例:
typedef struct ccb_disc_port_id3
{
CCB_HKADER3 ccb_header3; /* CCB_HEADER3信息字段*/
} CCB DISCOV_PORT_ID3
11.7.2.1.1发现开始CCB -端口ID函数的组成说明
——请求对由CCB的发送者设置的CCB_HEADER3组成的信息
.cam_func—code
该组成应包含XPT CAM一3-CCB函数代码.
cam3_func_code
该组成应包含XPT_DISCOV_START_PORT ID函数代码。
. port_id
该组成应包含一个端口号(如:SCSI总线号).
· cam_flags
此函数无定义的CAM标记.
11.7.2. 1.2发现开始CCB的返回一端口ID函数
该函数应返回的CAM状态为:
——请求无错误完成,
——无效的路径ID表示指定的路径ID尚未安装。
——进行中的发现表示指定的端口ID已存在拓扑发现过程。
11.7.2.2 CAM-3发现开始CCB -扫描目标设备ID函数
发现开始CCB—扫描目标设备ID函数对指定的端口ID和目标设备标识符开始一个拓扑发现过程.
XPT的供给者应定义CAM-3发现开始ccB一扫描目标设备ID函数结构,如表10所示,
表10 ccb_discov_target_id3
数据类型 |
组成名称 |
ORIG/RECP |
描述文本 |
数据结构ccb _ header3 指针 |
my addr : |
XPT |
该CCB 的地址 |
CAMU16 |
cam ccb len |
XPT |
整个CCB 的长度 |
CAM US |
cam func _ code : |
ORIG |
XPT 函数代码包含CAM 一3 CCB 标识符 |
CAM US |
Camstatus . |
RECP |
返回的CAM子系统状态 |
CAMU32 |
logical _ id |
|
分配的设备逻辑ID |
CAMU32 |
Camflags |
|
子系统操作标记 |
CAMU32 |
cam3 _ func _ cod |
ORIG |
CAM 一3 CCB 的实际函数代码 |
CAMU32 |
Camprotocol |
ORIG |
协议类型SCSI |
CAMU32 |
port _ id |
ORIC |
注册的SIM /HA端口号 |
CAMU32 |
addr _ specl [2] |
|
包含目标设备说明符的两个CAM U32 阵列 |
CAMU32 |
addr _ spec2 [ 2 ] |
|
包含LUN 说明符的两个CAM 32 阵列 |
CAMU32 |
reservedl |
|
为今后扩展保留 |
CAMU32 |
cam sim generation |
|
连接CCB 返回的代号 |
CAMVOID OFFSET |
Camsim bhandlle |
|
连接CCB 返回的SIM 连接处理( Handle ) |
CAMVOID OFFSET |
Camxpt _ ptr |
XPT |
指向XPT 工作空间的指针 |
CAMVOID OFFSET |
Campdrv ptr : |
XPT |
指向分配外围驱动程序工作空间的XPT 的指针 |
CAMVOID OFFSET |
Camsim ptr |
XPT |
指向分配SIM工作空间的XPT 的指针 |
CAMU32 |
Campdry _ len |
XPT |
外围驱动程序工作空间的字节长度 |
CAMU32 |
Camsim _ len |
XPT |
SIM 工作空间的字节长度 |
ccb_discov_targetid3的事例
typedef struct ccb_discov_, target _id3
(
CCS HEADER3 ccb_header3: /* CCB_HEADER3信息字段*/
) CCB_DISCOV_ TARGET—ID3
11.7.2.2.1发现开始CCB一目标设备ID函数的组成说明
——请求由CCB的发送者设置的CCB_HEADER3组成的信息。
· cam_func__code:
该组成应包含XPT_CAM_3_CCB函数代码。
· cam3_func_code
该组成应包含XPT_DISCOV_START_TARGETID函数代码.
· port_id
该组成应包含一个端口号(如:SCSI总线号)。
· addr_specl
该组成应包含SCSI目标设备说明符.
。 cam_flags
此函数无定义的CAM标记.
11.7.2.2.2发现开始CCB -目标设备ID函数返回
该函数应返回的CAM状态为:
——请求无错误完成,
——无效的路径ID表示指定的路径ID尚未安装.
——进行中的发现表示指定的端口ID或目标设备标识符已存在拓扑发现过程.
11.7.2.3 CAM-3发现编址CCB
发现编址CCB函数为相邻可用的还没有被先前的发现编址CCB函数返回的目标设备标识符查询已标识的SIM/HA.SIM/HA返回ccb_header3 addr_specl组成中相邻可用的目标设备标识符.
XPT的供给者应定义发现编址ccB结构,如表11所示.
表11 ccb_discov_ addr3
数据类型 |
组成名称 |
ORIG/RECP |
描述文本 |
数据结构ccb_header3指针 |
my..addr |
XPT |
这个CCB的地址 |
CAM-U16 |
cam_ccb_len |
XPT |
整个CCB的长度 |
CAMU8 |
cam_func_code |
ORIG |
XPT函数代码包含饥卅3 CCB标识符 |
CAM-U8 |
cam_status |
RECP |
返回的CAM子系统状态 |
CAMU32 |
logical_id |
|
分配的设备逻辑ID |
CAM-U32 |
cam_flags |
|
子系统的操作标记 |
CAMU32 |
cam3func=cod |
ORIG |
CAM-3 CCB的实际函数代码 |
CAMU32 |
cam_protocol |
ORIG |
协议类型SCSI |
CAMU32 |
port_id |
ORIO |
注册的SIM/HA端口号 |
CAM-U32 |
Addr specl[2]
|
RECP
|
包含目标设备说明符的两个CAM.U32阵列 |
CAMU32 |
addr_spec2[2], |
|
包含LUN说明符的两个CAM_U32阵列 |
CAM_U32 |
reservedl |
|
为今后扩展保留 |
CAMU32 |
cam_sim_generations |
|
连接CCB返回的代号 |
CAM_VOID_OFFSET |
cam_s im..bhandlle |
|
连接CCB返回的SN连接处理 |
CAMVOID OFFSET |
cam_xpt_ptr~ |
XPT |
指向XPT工作空间的指针 |
CAM_VOID OFFSET
|
cam_pdrv_ptr
|
XPT
|
指向分配外围驱动程序工作空间的XPT的指针 |
CAM_VOID_OFFSET |
cem_s im_ptr |
XPT |
指向分配SIU工作空间的XPT的指针 |
CAM_U32 |
cam_pdrv_len |
XPT |
外围驱动程序工作空间的字节长度 |
CAMU32 |
Camslm len |
XPT |
SIM工作空间的字节长度 |
ccb_dlscov_ addr3的事例:
typedef struct ccb_discov—addr3
{
CCB.HEADER3 ccb header3: /* CCB-HEADER3信息字段*/
) CCS_DISCOV_ADDR3
11.7.2.3.1发现编址CCB函数的组成说明
·请求由CCB的发送者设置的CCB..HEADER3组成的信息.
· cam_ func_code
该组成应包含XPT.._CAM_3_CCB函数代码.
· cam3 func_code
该组成应包含XPT_DISCOV_ADDR函数代码.
· por id
该组成应包含一个端口号(如:SCSI总线号).
· addr_specl,
在成功完成该CCB之前,该组成应由SIM/HA设置.该值应是拓扑发现过程未返
回的相邻可用的目标设备标识符.
· cam__ flags
该函数不存在定义的CAM标记.
11.7.2.3.2发现编址CCB函数返回
该函数应返回的CAM状态为:
——请求无错误完成。
——无效的路径ID表示指定的路径ID尚未安装.
——无效的请求表示SIM不支持该CCB函数.
——带有错误的完成请求表示这个拓扑发现过程没有更多的可用目标设备标识符(全部获得).
11.7.2.4 CAM-3发现结束CCB
发现结束CCB函数终止标识SIH/HA的拓扑发现过程.
XPT的供给者定义发现结束CCB结构,如表12所示.
表12 ccb_discovend3
数据类型 |
组成名称 |
ORIG/RECP |
描述文本 |
数据结构ccb-header3指针 |
my_addr~
|
XPT
|
这个CCB的地址
|
CAM_U16 |
Cam_ccb_len, |
XPT |
整个CCB的长度 |
CAM一U8 |
cam_funccode |
ORIG |
XPT功能代码包含CAM一3 CCB标识符 |
CAMU8 |
cam_status |
RECP |
返回的CAM子系统状态 |
CAM_U32 |
logical_id |
|
分配的设备逻辑ID |
CAM_U32 |
cam_flags |
|
子系统的操作标i己 |
CAM_U32 |
cam3_func_code |
ORIG |
CAM-3 CCB的实际函数代码 |
CAMU32 |
cam_protocol |
ORIG |
协议类型SCSI |
CAM_U32 |
port_id |
ORIG |
注册的SIM/HA端口号 |
CAMU32 |
addr_spccl[2] |
RECP |
包含日标设备说明符的两个CAM U32阵列 |
CAM_U32 |
addr_spec2[2] |
|
包台LUN说明符的两个CAM-U32阵列 |
CAMU32 |
reservedl |
|
为今后扩展保留 |
CAMU32 |
cam_sim_gcneration |
|
由连接CCB返回的代号 |
CAMVOID_OFFSET |
cam_sim..bhandlle |
|
由连接CCB返回的SIM连接处理 |
CAM_VOID OFFSET |
cam_xpt ptr |
XPT |
指向XPT工作空间的指针 |
CAMVOIDOFFSET
|
cam_pdrv_ptr
|
XPT
|
指向分配外围驱动程序工作空间的XPT的指针 |
CAM_VOID_OFFSET |
cam_sim ptr |
XPT |
指向分配SIM工作空间的XPT的指针 |
CAMU32 |
cam_pdrv len. |
XPI" |
外围驱动程序工作空间的字节长度 |
CAM_U32 |
cam_sire_len |
XPT |
SIM工作空间的字节长度 |
ccb_discov_ end3的事例:
typedef struct ccb_discov_ end3
{
CCB_HEADER3 ccb_header31 /*CCB_HEADER3信息字段*/
} CCB_DISCOY END3;
11.7.2.4.1发现结束CCB函数的组成说明
——请求由CCB的发送者设置的CCBREADER3组成的信息,
·cam_func_code:
该组成应包含XPT_CAM 3_CCB函数代码。
·cam3_func_code:
该组成应包含XPT_DISCOVEND函数代码。
·port_id:
该组成应包含一个端口号(如:SCSI总线号).
·cam flags
该函数不存在定义的CAM标记.
11.7.2.4.2发现编址CCB函数返回
该函数应返回的CAM状态为:
——请求无错误完成.
——无效的路径ID表示指定的路径ID尚未安装。
11.7.3连接CCB函数
本章条描述了CAM-3的连接函数和外围驱动程序与SIM的行为.
11.7.3.1 CAM-3连接CCB
连接函数把该CCB的发送者连接到SIM中一个逻辑单元的逻辑表示。对于一个逻辑单元.CCB (XPT 或外围驱动程序)的发送者不应发送需要一个SIM连接处理的任何CCB,而该连接处理不是首先执行一个连接函数.这意味着对特定的CCB函数已证明了的说明应规定一个SIM连接处理是否需要如下组成
--cam..sim.bhandle:
该组成反映当前连接操作返回的SIM连接处理.
连接函数允许SIM为指定设备的操作准备就绪,连接函数也为能引起设备互连地址说明符发生变化的那些事件提供外围驱动程序和SIM之间的一个互锁.
把支持SCSI协议的SIM记入一个设备(如:FCP).SIM应引起一个专用协议登录到该设备.若专用协议登录失败.Sltl应按规定放弃连接.
COB(外围驱动程序)的发送者应为每个将发送CCB的连接ID执行一个有效的连接函数.
对于特定的端口ID和连接ID(如:互连地址说明符),一个设备仅有一个连接,除非第二个连接来自XPT.若一个连接ID上现有一个连接.SIM将第二个连接请求cam..pdrv_reg组成与XPT外围驱动程序注册号的请求相比较.若比较结果等于XPT的外围驱动程序注册号,则第二个连接应被允许.
若一个连接是现行连接,XPT应共享当前的连接参数,以允许需要的XPT操作去执行一个发现过程(如:发送直迩命令到指定的设备).若因为一些原因设备报告该连接已被丢失(如:设备报告一个记录溢出).SIM应释放原始连接.按照原始连接的规定STM也应执行异步事件通知,并为XPT的请求进行连接,
注14,上述情况是在发现过程中产生,并且XPT正在发现拓扑结构.
实际上在不同的端口ID或相同的端口ID上可能有多个对唯一识别的设备(逻辑ID)的连接.例如,难一标识的设备(逻辑ID)能够被来自多SIM/HA(多启动设备)上的同一主机看到.外围驱动程序可以通过每个标识的端口ID连接到设备.
称作一个成功连接函数的SIM如下所示:
一没有相对于连接ID的现行连接;
一请求的连接操作属性能被实现;
指定的连接ID有一个成功的连接函数时,SIH应有如下实现:
一设置cam_sim_generation组成以使它反映与一个连接有关的SIH的代号,该值应是唯一的,而且对每个成功的连接是不同的,
一为连接ID设置cam..sim_bhandle为它的SIM连接处理.SIM的cam_sim_bhandle能够是一个指针或一个号.推荐SIM连接处理是指向表示所描述设备(连接ID)的SIM专用数据结构的指针.
当一个成功连接被完成时.SIM应存储下列信息:
一cam_pdrv_reg组成值
—Ibgical_id组成值:
若由于请求的连接操作属性不能被供给,连接功能不成功,SIM应清除不支持的连接操作属性标记并返回规定的错误指示.
若互连协议支持命令传送时间报告的概念(如:FC),SIM应把cam_.delivery_time组成置入以秒为单位的当前时间,以便传送一个命令给设备.SIM总是上舍入(进位舍入)时间到最近的秒数(如:125毫秒上舍入成1秒).由于协议中没有机制置该值为“0”(如:SPI)所以SIM不能确定一个命令的传送时间。
若SIH根据协议的报告检测到传送时间变化,则SIM应传送一个异步事件.这意味着若传送时间变化,则传送时间就不同.这就是现行连接中所报告的,随后SIM应传送异步事件.更进一步的信息见SCSI异步事件.
如果由XPT通知时,SIM能通过对设备异步事件回调的变化自动释放一个连接。设备的这种变化能引起一个连接的自动释放,如下所示。
——设备有一个新连接ID:
——设备不再存在;
——设备已改变类型l
应释放一个连接并执行一个异步事件;
--SIM检测到该设备已执行的显式协议专用事件,此事件表示设备的通信丢失(如FCP注销).为释放一个连接(若存在一个连接),当SIM(或通知或XPT)自动中断一个连接时,SIH应:
——对带有连接中断的CAM状态的那个连接ID返回所有CCB.
连接的发送者(外围驱动程序)应准备处理一个连接的自动释放.
XPT的供给者定义CAM-3连接CCB如下所示:
typedef struct ccb_bind3
{
CCB_HEADER3 ccb_header3; /* CCB._HEADER3信息字段*/
CAM U32 cam- bind_ops; /*操作属性*/
CAM-U32 cam_pdrv_reg: /*请求者驱动程序注册号*/
CAM U32 cam delivery_time; /*有效时的命令传送时间*/
} CCB._BIND3;
11.7.3.1.1对连接的组成说明
——请求由CCB的发送者设置的CCB_HEADER3组成的信息。
· cam.func—code;
该组成应包含XPT CAM 3_CCB函数代码。
· cam3_func_code:
该组成应包含XPT_BIND函数代码.
· logical_id
该组成应反映连接ID正确的逻辑标识符.
. port_id:
该组成应包含一个端口号(如:SCSI总线号).
· addr_specl;
该组成皮包禽SCSI目标设备说明符。
· addr_spec1
该组成应包含SCSI逻辑单元说明符。
· cam_flags:
该函数不存在定义的CAM标记。
——cam_bind_ops;
没有当前定义的操作属性,该组成应被置为“O”.
——cam_pdrv_reg.
该组成是请求者外围驱动程序注册号,由获得外围驱动程序注册号的请求者设置。
11.7.3.1.2连接返回
——无错误完成的请求:连接函数成功实现。
1749