diff options
Diffstat (limited to 'zh_CN.GB2312/books/arch-handbook/scsi/chapter.xml')
-rw-r--r-- | zh_CN.GB2312/books/arch-handbook/scsi/chapter.xml | 60 |
1 files changed, 24 insertions, 36 deletions
diff --git a/zh_CN.GB2312/books/arch-handbook/scsi/chapter.xml b/zh_CN.GB2312/books/arch-handbook/scsi/chapter.xml index be793ee339..5fa24cc16e 100644 --- a/zh_CN.GB2312/books/arch-handbook/scsi/chapter.xml +++ b/zh_CN.GB2312/books/arch-handbook/scsi/chapter.xml @@ -6,34 +6,22 @@ Original Revision: 1.18 $FreeBSD$ --> - -<chapter id="scsi"> - <chapterinfo> +<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="scsi"> + <info><title>通用访问方法SCSI控制器</title> <authorgroup> - <author> - <firstname>Sergey</firstname> - <surname>Babkin</surname> - <contrib>&cnproj.written.by;</contrib> - </author> + <author><personname><firstname>Sergey</firstname><surname>Babkin</surname></personname><contrib>&cnproj.written.by;</contrib></author> </authorgroup> <authorgroup> - <author> - <firstname>Murray</firstname> - <surname>Stokely</surname> - <contrib>&cnproj.modified.for.handbook.by;</contrib> - </author> + <author><personname><firstname>Murray</firstname><surname>Stokely</surname></personname><contrib>&cnproj.modified.for.handbook.by;</contrib></author> </authorgroup> <authorgroup> - <author> - &author.cn.spellar; - <contrib>&cnproj.translated.by;</contrib> - </author> + <author><personname/><contrib>&cnproj.translated.by;</contrib></author> </authorgroup> - </chapterinfo> + </info> - <title>通用访问方法SCSI控制器</title> + - <sect1 id="scsi-synopsis"> + <sect1 xml:id="scsi-synopsis"> <title>提纲</title> <indexterm><primary>SCSI(小型计算机系统接口)</primary></indexterm> @@ -70,7 +58,7 @@ </sect1> - <sect1 id="scsi-general"> + <sect1 xml:id="scsi-general"> <title>通用基础结构</title> <indexterm><primary>Common Access Method (CAM, 通用访问方法)</primary></indexterm> @@ -141,15 +129,15 @@ }</programlisting> <para>注意如果我们不能创建SIM描述符,我们也释放 - <structname>devq</structname>,因为我们对其无法做任何其他事情, + <varname remap="structname">devq</varname>,因为我们对其无法做任何其他事情, 而且我们想节约内存。</para> <indexterm><primary>SCSI(小型计算机系统接口)</primary><secondary>bus(总线)</secondary></indexterm> <para>如果SCSI卡上有多条SCSI总线,则每条总线需要它自己的 - <structname>cam_sim</structname> 结构。</para> + <varname remap="structname">cam_sim</varname> 结构。</para> <para>一个有趣的问题是,如果SCSI卡有不只一条SCSI总线我们该怎么做, - 每个卡需要一个<structname>devq</structname>结构还是每条SCSI总线? + 每个卡需要一个<varname remap="structname">devq</varname>结构还是每条SCSI总线? 在CAM代码的注释中给出的答案是:任一方式均可,由驱动程序的作者 选择。</para> @@ -184,7 +172,7 @@ <listitem><para>driver_name - 实际驱动程序的名字,例如 <quote>ncr</quote>或<quote>wds</quote>。</para></listitem> - <listitem><para><structname>softc</structname> - 指向这个SCSI卡 + <listitem><para><varname remap="structname">softc</varname> - 指向这个SCSI卡 驱动程序的内部描述符的指针。这个指针以后被驱动程序用来获取 私有数据。</para></listitem> @@ -214,13 +202,13 @@ error; /* 一些错误处理代码 */ }</programlisting> - <para>如果每条SCSI总线有一个<structname>devq</structname>结构(即, + <para>如果每条SCSI总线有一个<varname remap="structname">devq</varname>结构(即, 我们将带有多条总线的卡看作多个卡,每个卡带有一条总线),则总线号 总是为0,否则SCSI卡上的每条总线应当有不同的号。每条总线需要 它自己单独的cam_sim结构。</para> <para>这之后我们的控制器完全挂接到CAM系统。现在 - <structname>devq</structname>的值可以被丢弃:在所有以后从CAM发出的 + <varname remap="structname">devq</varname>的值可以被丢弃:在所有以后从CAM发出的 调用中将以sim为参量,devq可以由它导出。</para> <para>CAM为这些异步事件提供了框架。有些事件来自底层(SIM驱动程序), @@ -270,7 +258,7 @@ <para>如果驱动程序不能分配这个路径,它将不能正常工作,因此那样情况下 我们卸除(dismantle)那个SCSI总线。</para> - <para>我们在<structname>softc</structname>结构中保存路径指针以便以后 + <para>我们在<varname remap="structname">softc</varname>结构中保存路径指针以便以后 使用。这之后我们保存sim的值(或者如果我们愿意,也可以在从 <function>xxx_probe()</function>退出时丢弃它)。</para> @@ -340,7 +328,7 @@ 函数得到单元号和指向它的softc结构的指针。</para> <para>请求的类型被存储在 - <structfield>ccb->ccb_h.func_code</structfield>。因此,通常 + <varname remap="structfield">ccb->ccb_h.func_code</varname>。因此,通常 <function>xxx_action()</function>由一个大的switch组成:</para> <programlisting> struct xxx_softc *softc = (struct xxx_softc *) cam_sim_softc(sim); @@ -358,7 +346,7 @@ }</programlisting> <para>从default case语句部分可以看出(如果收到未知命令),命令的返回码 - 被设置到 <structfield>ccb->ccb_h.status</structfield> 中,并且通过 + 被设置到 <varname remap="structfield">ccb->ccb_h.status</varname> 中,并且通过 调用<function>xpt_done(ccb)</function>将整个CCB返回到CAM中。</para> <para><function>xpt_done()</function>不必从 @@ -1277,7 +1265,7 @@ </sect1> - <sect1 id="scsi-polling"> + <sect1 xml:id="scsi-polling"> <title>轮询</title> <funcsynopsis><funcprototype> @@ -1296,7 +1284,7 @@ 弄出一个单独的函数来呢?这是由于不同的调用约定。 <function>xxx_poll</function>例程取结构cam_sim的指针作为参量, 而PCI中断例程按照普通约定取的是指向结构 - <structname>xxx_softc</structname>的指针,ISA中断例程只是取设备号, + <varname remap="structname">xxx_softc</varname>的指针,ISA中断例程只是取设备号, 因此轮询例程一般看起来像:</para> <programlisting>static void @@ -1315,7 +1303,7 @@ xxx_poll(struct cam_sim *sim) </sect1> - <sect1 id="scsi-async"> + <sect1 xml:id="scsi-async"> <title>异步事件</title> <para>如果建立了异步事件回调,则应当定义回调函数。</para> @@ -1363,7 +1351,7 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)< </sect1> - <sect1 id="scsi-interrupts"> + <sect1 xml:id="scsi-interrupts"> <title>中断</title> <indexterm><primary>SCSI(小型计算机系统接口)</primary><secondary>interrupts(中断)</secondary></indexterm> @@ -1709,7 +1697,7 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)< </sect1> - <sect1 id="scsi-errors"> + <sect1 xml:id="scsi-errors"> <title>错误总览</title> <indexterm><primary>SCSI(小型计算机系统接口)</primary><secondary>errors(出错)</secondary></indexterm> @@ -1785,7 +1773,7 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)< </itemizedlist> </sect1> - <sect1 id="scsi-timeout"> + <sect1 xml:id="scsi-timeout"> <title>超时处理</title> <para>当HCB的超时期满时,请求就应当被中止,就像处理XPT_ABORT请求 |