表4 SCSI消息支持
消 息 |
支 持 |
ACA |
由SIM透明的支持 |
中止 |
不连续的功能码支持 |
中止标记 |
不连续的功能码支持 |
总线设备复位 |
不连续的功能码支持 |
清除ACA |
不连续的功能码支持 |
清除排队 |
不支持 |
命令完成 |
由SIM透明的支持 |
断开 |
由SIM透明的支持* |
识别 |
由SIM透明的支持 |
忽略宽度余项 |
由SIM透明的支持 |
启动恢复 |
不支持 |
启动设备检出错误 |
由SIM透明的支持 |
链接命令完成 |
由SIM透明的支持 |
消息奇偶校验错误 |
由SIM透明的支持 |
消息拒绝 |
由SIM透明的支持 |
修改数据指针 |
由SIM透明的支持 |
无操作 |
由SIM透明的支持 |
释放恢复 |
不支持 |
保存数据指针 |
由SIM透明的支持 |
同步数据传送请求 |
由SIM透明的支持* |
终止1/0处理 |
不连续的功能码支持 |
宽数据传送请求 |
由$IM透明的支持 |
排队标记消息 |
|
排队头标记 |
不连续的功能码支持 |
顺序捧队标记 |
不连续的功能码支持 |
简单持队标记 |
不连续的功能码支持 |
*通过CAM标记发出受外围驱动程序影响的消息 |
11.5 CAM-3 SCSl CCB表定义和值定义
表中定义了CAM-3 SCSI CCB。CCB的每个表有四栏,标题在表的顶部.XFI售方应定义数据结构作为对数据类型表标题和组成名称表标题栏的定义.这意味着数据类型和CCB数据结构组成名称等于CCB表的反映.XPT售方应按所示的顺序定义组成.
每个CCB表都显示了CAM-3 CCB_HEADER3.已定义的CCB包含CCB_tIEADER3数据结构作为一个内含的数据结构.例如对于一个连接CCB的CCB. HEADER3的logical_idOl成设置如下;
struct ccb_bind3*bind_ccb:
bind_ccb =(struct ccb_bind3*) xpt_ccb_alloc3 ((CAM_U32) XPT..WAITOK);
bind_ccb一>ccb_header3, logical_id=0xl001;
ORIG/RECP表标题反映了CCB的发送者,CCB的接收者和/或请求该组成设置的XPT.ORIG栏目表示CCB的发送者设置该组成,RECP栏目表示CCB的接收者设置该组成.XPT栏目表示在从xpt_ccb_alloc3()返回之前XPT设置该CCB组成.XPT也可能是一个CCB接收者(如:CCB对XPT寻址)..例如,外用驱
动程序通常是CCB的发送者而且是通常发送到SIM(接收者).若表字段是空白的,则该字段不能用.若字段用“***”标记,设置该组成的责任是明确描述每个CCB函数.
描述文本表标题(heading)是一个表示该组成含义的描述文本.
XPT售方按照表标号(如:表X ccb_header3.这里标号是ccb_header3)的反映定义CAM-3 CCB数据结构名称.
表中还定义了数据值常量.数据值常量的每个表有三栏,标题在表的顶部.XPT售方应定义数据常最名作为表标题鱼整栏的定义,定义数据常量值作为表标题HEX值栏的定义.
下表是更进一步阐明所描述文本的用法和含义.
”.6 CCB_HEADER3结构
XPT的供应者应定义CCB_HEADER3结构,如表5所示,
表5 ccb_header3
数据类型 |
组成名称 |
ORIG/RECP |
描 述 文 本 |
数据结构ccb_header3 指针 |
my_addr;
|
XPT
|
该CCB的地址
|
CAM_UI6 |
cam_ccb_len; |
XPT |
整个CCB的长度 |
CAM_U8 |
cam_funccode; |
ORIG |
XPT函数代码包含C^M-3 CCB标识符 |
CAM_U8 |
cam status; |
RECP |
返回的C心子系统状态 |
CAM_ U32 |
logical_id; |
*** |
分配的设备逻辑ID |
CAM-U32 |
cam_flags; |
ORIG |
子系统操作标记 |
CAM_U32 |
Cam3_ func codez |
ORIG |
Cg4-3 CCB的实际函数代码 |
CAM-U32 |
cam_protocol; |
ORIG |
协议类型SCSI.NETWORK,等 |
CAMU32 |
port_id; |
0RIG |
注册的SIM/HA端口号 |
CAMU32 |
addr_spec1[2] |
0RIG |
包含目标设备说明符的两个CAM—U32阵列 |
CAM.U32 |
addr_spec2 [2] .. |
ORIG |
包含LUN号的两个CAM_U32阵列 |
CAM_U32 |
Reservedl; |
|
为今后扩展保留 |
CAM-IU32 |
cam_sim_generation; |
*** |
由BIN) CCB返回的代号 |
CAM_VOID_OFFSET |
cam_sim_ bhandlle; |
*** |
由BIND ccB返回的S瑚连接处理 |
CAM_JOID_OFFSET |
cam_xpt_ptr; |
XPT |
指向XPT工作空间的指针 |
CAM_VOID_OFFSET |
cam_pdrv_ptrl; |
XPT |
揠向分配外围驱动程序工作空间的XPT的指针 |
CAM_ VOID_OFFSET |
cam_sim_ptr; |
XPT |
指向分配SIM工作空间的XPT的指针 |
CAM_U32 |
cam_pdrv_len; |
XPT |
外围驱动程序工作空间的长发,以字节为单位 |
CAM_U32 |
cam_sim_len; |
XPT |
SIM工作空间的长度,以字节为单位 |
ccb_header3的结构语言事例.
typedef struct ccb_header3
{
Struct ccb_header3* my_addr; /*该CCB的地址*/
CAM1 6 cam_ccb_len; /*整个CCB的长度*/
CAM U8 cam_func_code; /*XPT函数代码包含C~{-3 CCB标识符*/
CAM_U8 cam_status: /*返回的CAM子系统状态*/
CAM_U32 logical_id; /*分配的设备逻辑ID*/
CAM_U32 cam_flags: /*子系统操作标记*/
CAM_U32 cam3_func_code; /*CAM-3 CCB的实际函数代码*/
CAM_U32 cam_protocol; /*枣协议类型SCSI.NETWORK,等*/
CAM .U32 port_id;/*注册的SIM/HA端口号*/
CAM_U32 addr_specl[2] ;/*包含目标设备说明符的两个cAMu32阵列*/
CAM_U32 addr_spec2[2] ; /*包含LUN号的两个CAM-U32阵列*/
CAM_32 reservedl; /*为今后扩展保留*/
CAM_U32 cam_sim_generat ion; /*由BIND CCB返回的代号*/
CAM_VOID_OFFSET cam_sim_bhandle; /*由BIND CCB返回的STII连接处理*/
CAM_VOID_OFFSET cam_xpt_ptr; /*指向】(PT工作空间的指针*/
CAM_VOID OFFSET cam pdrv_ptr; /*111向分配外围驱动程序工作空间的XPT的指针*/
CAM_ VOID OFFSET cam sim_ptr; /*指向分配STM工作空间的XPT的指针*/
CAM_U32 cam_pdrv_len; /*外围驱动程序工作空伺的长度,以字节为单位*/
CAM _U32 cam_sim_len:/* SIM工作空间的长度,以字节为单位*/
}CCB_HEADER3;
11.6.1CCB_HEADER3结构的组成说明
一my_addr;
该指针包含这个CCB的物理或虚拟地址,地址类型(虚拟或物理)取决于操作系统.
一Cam_ccb_len;
该字段包含CCB的字节长度,总共包括该字段和该CCB的地址.
——cam_func_code;
该组成应包含XPT_CAII3_CCB的CAM-3函数代码。该函数代码表示传送的CCB是一个CAM-3 CCB, 有关XPT函数代码见表7.
——ca-status
该字段在完成这个功能之后由SIW返回.“0"状态表示该请求仍在进行或排队.cAM状态定义在表6中.
若自动断定信息可用,返回的代码应通过80h递增(如:04h表示发生了一个错误.84h表示发生了一个错误并且臼动断定信息可用于分析).
CAM状态代码定义见表6:
表6 CAM状态
名称 |
HEX值 |
描 述 文 本 |
CAM_REQ_INPROG |
00 h |
请求在进行 |
CAW_REQ_CMP |
Ol h |
无错误地完成请求 |
CAM_REQ _ABORTED |
02 h |
通过主机中止请求 |
CAM_UA_ABORT |
03 h |
不能中止请求 |
CAM_REQ_CMP_ERR |
04 h |
错误地完成请求 |
CAM_BUSY |
05 h |
CAM忙 |
CAM_REQ_INVALID |
06h |
无效请求 |
CAM_PATH_ INVALID |
O7h |
无效路径ID |
CAM_DEV_NOT_THERE |
08 h |
SCSI设备来安装 |
CAM_UA_TERMIO |
09 h |
不能终.止I/o处理 |
CAM_SEL_TIMEOUT |
Oa h |
日标设备选择超时 |
CAM_CMD_TIMEOUT |
OB h |
命令超时 |
|
OC h |
保留 |
表6(续)
名 称 |
HEX值 |
描 述 文 本 |
CAM_MSG_REJECT_REC |
OD h |
. 消息拒绝接收 |
CAM_SCSI_BUS_RESET. |
OE h |
SCSI总线复位发送/接收 |
CAM_UNCOR_PARITY |
OF h |
检出不正确的奇偶校验错误 |
CAM_AUTOSENSEFAIL |
10 h |
自动断定请求断定命令失效 |
CAM_NO_HA |
llh |
朱捡出HA |
CAM_DATA_RUN ERR |
12 h |
数据溢出 |
CAM_UNEXP_BUSFREE |
13 h |
不期望的总线空闲 |
CAM_SEOUE~CE_FAIL |
14 h |
目标设备总线阶段时序失效 |
CAM_ CCB..LEN_ERR |
15 h |
CcB长度不充足 |
CAM_PROVIDE_FAIL |
16 h |
不能提供请求的性能 |
CAM_BDR_SENT |
17 h |
总线设备复位发送 |
CAMREQJEIBilO |
18 h |
终止I/o处理 |
CAM_HA_ERR |
19 h |
不可恢复的主机总线适配器错误 |
|
IA h |
保留 |
CAW_NO_BIND |
1B h |
连接丢失或需要 |
CAMDISCOVERY_INPROG |
1C h |
发现过程需要或在进行巾 |
|
1D h-32 h |
保留‘ |
CAM_IDE |
33 h |
启动设备检出接收的错误 |
CAM_REsrc_UNAVAIL |
34 h |
资源不可用 |
CAM_UNACKED_EVENT |
35 h |
主机不被承认的事件 |
CAM_MESSAGERECV |
36 h |
接收的消息 |
CAMINVALXD_CDB |
37 h |
无效的CDB |
CAM_LUN_INVALID |
38 h |
无效的L州 |
CAM_TID_INVALID |
39h |
无效的目标设备ID |
CAM_FUNC_NOTAVAIL |
3Ah |
来实现的功能 |
CAM_NO_EXUS |
3Bh |
来建立的联系 |
CAM_lID_INVALID |
3Ch |
无效的启动设备ID |
CAM_CDB_INVALID |
3Dh |
接收的SCSI CDB |
CAM_LUN_ ALREADY_ENAB |
3Eh |
已允许的LUN |
CAM_SCSI_BUSY |
3Fh |
SCSI总线忙 |
CAM_SXM_QFRZN |
40h |
带有CAM状态的数值或ID表示冻结SIM摊队 |
CAM_AUTOSNS_VALI D |
80h |
带有CAM状态的数值或ID表示自动断定有效 |
CAM状态描述:
——00h,请求在进行中:该请求仍在进行中.
——01h~无错误她完成请求:该请求已完成,并且未遇到错误条件.
——02h:通过主机中止请求:该请求由SIWHA中止。
——03h;不能中止请求:按照外围驱动程序的指示,SIM/HA不能中止该请求。
——04h:错误地完成请求:该请求已完成并且遇到一个错误条件.
——05h: CAM忙:CAM不能在此时接受请求.
——06h:无效的请求:因为它无效,所以该请求已被拒绝。
——07h:无效的路径ID:表示该路径ID无效.
——08h: SCSI设备未安装:外围设备类型字段无效.
——09h,不能终止IlO处理:按照外围驱动程序的指示.SIM/tM不能终止请求。
——0Ah,目标设备选择超时:目标设备响应选择失效.
——0Bh,命令超时:指定的命令不能在CCB指定的定时器值中完成。
——0Dh:消息拒绝接收:SIWHA接收一个SCSI消息拒绝消息。
——0Eh;SCSI总线复位发送/接收:因为SCSI总线被复位,所以SCSI操作在某些点上被终止,
——0Fh,检出不正确的奇偶校验错误:一个不正确的SCSI总线奇偶校验错误被检出.
——l0h;自动断定请求断定命令失效:SIM/HA试图获得断定数据并失效,
——llh;未检出HA, HA不再响应SIH(假定是硬件问题).
——12h;数据溢出:目标设备传送的数据字节比外围驱动程序在CCB中表示的数据字节多——13h:不期望的总线空闲:一个不期望的总线空闲条件发生.
——14h;目标设备总线阶段时序失效:逻辑单元根据SJ 20631--97标准操作失效。
——15h;CCB长度不充足:CCB中需要较多的专用数据区域(更进一步的信息见9.2.3).
——16h:不能提供请求的性能:资源不能用于提供在CAM标记中请求的性能。
——l7h;总线设备复位发送:因为总线设备复位消息被发送到目标设备,该CCB被终止。
——18h;终止I/O处理:因为该CCB规定了一个终止TIO处理功能并且该CCB不是逻辑单元中的一个I/O处理,所以该CCB被终止.
——19h:不可恢复的主机总线适配器错误:因为姒检出一个硬件错误,所以该CCB被终止,该错误不表示SCSI总线有问题,而是HA或主机中的错误。
——IBh,连接丢失或需要:由于连接已被丢失或CCB的发送者还未执行连接功能,所以该CCB被终止.
——IChl发现需要或在进行中:由于需要或正在进行一个XPT发现功能,所以CCB被终止.
——33h:启动设备检出错误:表示SIWHA已接收一个启动设盔检出错误消息。
——34h:资源不可用:表示SIM/HA已用完处理连接的资源(仅是主机目标设备方式)。
——35h:不承认的事件:表示主机目标设备方式外围驱动程序还没有承认一个事件.
——36h:消息接收:表示消息已被请求注意的SIMIIIA接收。
——37h,无效的CDB=表示在接受一个CDB时SIM/IIA已检出一个错误条件。
——38h;无效的逻辑单元l表示指定的逻辑单元在SIM/HA支持的范围之外.
——39h;无效的目标设备ID:表示目标设备ID与由路径ID字段规定的HA使用的不一致.
——3Ah;功能未实现:表示不支持目标设备方式,
——3Bh,联系未建立。在指定的目标设备ID和任何启动设备的目标设备逻辑单元之间目前还没有建立连接.
——3Ch,无效的启动设备ID:指定的启动设备ID在支持的有效范围之外.
注13:若日标设备试图重新选择一个启动设备而不足先前连接的一个启动设各,该状态也能被返回.
——3Dh,接收SCSI CDB:表示目标设备已被选择并且SCSI CDB存在于当前的CCB中.
——3Eh:逻辑单元已允许:在允许的LUN CCB中标识的逻辑单元已被允许。
——3Fh: SCSI总线忙:在一些不同的总线空闲阶段期间.SIH未能赢得对SCSI总线的仲裁。
CAM状态数据值常盈定义事例:
#定义CAM_REQ_IRPROG Ox00 /*CCB请求在进行中*/
#定义CAM REQ_CMP Ox01 /*无错误完成CCB请求*/
#定义CAM REQ_ABORTED Ox02 /*CCB请求由主机中止*/
#定义CAM_UA_ABORT Ox03 /*不能中止CCB请求*/
#定义CAM-REO_CMPLERR Ox04 / *带有错误的完成CCB 请求*/
#定义CAM_BUSY Ox05 / * C AM子系统忙*/
#定义CAM_REO_INVALID 0x06 / * CCB 请求无效*/
#定义CAM_PATH_INALID Ox07 / *提供的路径ID 无效*/
#定义CAM_DEV_NOT_THERE Ox08 / * SCSI 设备未安装/there * /
#定义CAM_ UA_TERMTO Ox09 / *不能终止I / 0 CcB 请求*/
#定义CAM_SEL_TIMEOUT OxOA / *目标设备选择超时*/
#定义CAM-CWD_TIMEOUT OxOB / *命令超时*/
#定义CAM_MSG_REJECT_REC OxOD / *消息拒绝接收*/
#定义CAM_SCSI_BUS_RESET OxOE / * S CSI 总线复位发送/接收*/
#定义CAM_UNCOR_PARITY OxOF / *不正确奇偶校验错误发生*/
#定义CAM_AUTOSENSE_FAIL 0xlO / *自动断定:请求断定命令失效*/
#定义CAM_NO_HA Oxll / *未检出HA 错误*/
#定义CAM_DATA_RUN_ERR Ox12 / *数据溢出/欠载错误*/
#定义CAM_UNEXP_BUSFREE OxI3 / *不期望的总线空闲*/
#定义CAW_SEQUENCE_FAIL 0x14 / *目标设备总线阶段时序失效*/
#定义CAM_CCB_LEN_ERR OxI5 / *提供的CCB 长度不充足*/
#定义CAM_PROVIDE_FAIL Ox16 / *不能提供请求的性能*/
#定义CAM_ BDR_SENT Ox17 / * SCSI BDR 消息被发送到目标设备*/
#定义CAM_ REQ_TERWIO Ox18 / * CCB 请求由主机终止*/
#定义CAM_HA_ERR Ox19 / *不可恢复的主机总线适配器错误*/
#定义CAM_NO_BIND 0xlB / *连接己被丢失或未获得*/
#定义CAW_DISCOVERY_INPROG OxlC / *发现过程需要或在进行中*/
#定义CAM_IDE 0x33 / *启动设备检出接收的错误*/
#定义CAM_REsrc_UNAYAIL 0x34 / *资源不可用*/
#定义CAM_UNACKED_EVENT 0x35 / *主机不承认的事件*/
#定义CAM_LMESSAGE_RECV 0x36 / *以主机目标设备方式接收的消息*/
#定义CAM_INVALID_CDB 0x37 / *以HT 方式接收的无效CDB * /
#定义CAM_LUR..INVALID Ox38 / *提供的逻辑单元无效*/
#定义CAM_ TID_IRVALID 0x39 / *提供的目标设备ID 无效*/
#定义CAM_FUNC_NOTAVAIL Ox3A / *请求的函数不可用*/
抖定义CAM_.NO_NEXUS Ox3B / *联系未被建立*/
#定义CAM__TID_INVALID Ox3C / *启动设备ID 无效*/
#定义CAM_CDB_RECVD Ox3D / *已接收SCSI CDB * /
#定义CAM_LUN_ALLREADY_ENAB Ox3E / *己允许的逻辑单元*/
#抖定义CAM_SCSI_BUSY Ox3F / * SCSI 总线忙*/
#定义CAM_SIM-QFRZN Ox40 / *带有错误的SIM 排队被冻结*/
#定义CAM_AUTOSNS_VALID Ox80 / *目标设各自动断定数据有效*/
——logical_id
对指定协议而言,该组成是分配了设备逻辑标识符的XPT.多数功能不需要该组成由发送者设置.对于这些功能,推荐该组成为跟踪用途和调试设置一个有效值.
——cam_flags
CAM标记组成限定被执行的函数,并随函数代码变化.对定义的CAM标记见规定的CCB函数代码.
——cam3_func_code
该组成包含CAM-3 CCB的CAM-3函数代码。
用于识别正被请求的SCSI服务的函数代码列于表7中,函数代码的定义在表7中.
表7 CCB的CAM-3 SCSI功能代码
名称 |
HEX值 |
描述文本 |
XPT N00P XPT SCSI 10 XPT GDEV TYPE XPT _ PATH _ INQ XPT - - REL _ SIMQ XPT - SASYNC –CB XPT _ SDEV _ TYPE XPT SCAN BUS
XPT ABORT XPT DISCOV START TARGET ID XPT DISCOV ADDR
XPT ENG INQ XPT ENG EXEC
XPT EN LUN XPT TARGET I0 XPT ACCEP TARG XPT CONT TARG XPT IMMED NOTIFY XPT NOTIFY ACK
|
00-0F 00h 01h 02h 03h 04h 05h 06h 07h 08h-0Fh 10h-1Fh 10h 11h 12h 13h 14h 15h 16h 17h 18h 19h 1Ah 1Bh 1Ch 1Dh-1Fh 20h 21h 22h-2Fh 30h-3Fh 30h 31h 32h 33h 34h 35h 36h-3Fh 保留函数代码 |
命令功能 NOP 得到设备类型 路径查询 释放SIM 排队 设置异步回调 设置设备类型 扫描SCSI总线 保留 中止SCSI命令 复位SCSI 总线 复位SCSI 设备 终止I/O处理 扫描逻辑单元 CAM 一3 CCB 指示器 连接到一个连接ID 连接查询 连接释放 发现起始端口ID 发现起始目标设备标识符 发现得到地址 发现结束 保留 引擎查询 执行引擎 保留 目标设备方式 允许LUN 执行目标设备I/O 接受目标设备I/O 继续目标设备I/O 立即通知 通知应答 保留
|
表7(续)
名 称 |
HEX值 |
描 述 文 本 |
|
40h-7Fh |
保留 |
|
售方专用函数代码 |
售方定义 |
|
80h-FFh |
售方专用 |
|
1OOh-FFFFFFFFh |
保留 |
CAM一3函数代码数据值常量定义如下:
1668