aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.GB2312/books/arch-handbook/scsi/chapter.xml
diff options
context:
space:
mode:
Diffstat (limited to 'zh_CN.GB2312/books/arch-handbook/scsi/chapter.xml')
-rw-r--r--zh_CN.GB2312/books/arch-handbook/scsi/chapter.xml60
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-&gt;ccb_h.func_code</structfield>。因此,通常
+ <varname remap="structfield">ccb-&gt;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-&gt;ccb_h.status</structfield> 中,并且通过
+ 被设置到 <varname remap="structfield">ccb-&gt;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请求