NCR53C8XX/SYM53C8XX 驱动程序

作者:Gerard Roudier <groudier@free.fr>

21 Rue Carnot

95170 DEUIL LA BARRE - 法国

1999 年 5 月 29 日

1. 简介

最初的 Linux ncr53c8xx 驱动程序是 1995 年 11 月由以下人员完成的 FreeBSD ncr 驱动程序的移植:

原始驱动程序是由以下人员为 386bsd 和 FreeBSD 编写的:

它现在可以作为 2 个驱动程序的捆绑包使用

  • ncr53c8xx 通用驱动程序,支持包括最早的 810 rev. 1、最新的 896(2 通道 LVD SCSI 控制器)和新的 895A(1 通道 LVD SCSI 控制器)在内的所有 SYM53C8XX 系列。

  • sym53c8xx 增强型驱动程序(又名 896 驱动程序),它放弃了对最旧芯片的支持,以便利用新功能,例如自 810A 以来的 LOAD/STORE 指令,以及 896 和 895A 可用的硬件相位不匹配。

您可以在 Michael Will 编写的 PCI-HOWTO 和 Drew Eckhardt 编写的 SCSI-HOWTO 中找到有关 NCR 8xx 系列的技术信息。

有关新芯片的信息可在 LSILOGIC Web 服务器上找到

SCSI 标准文档可在 SYMBIOS ftp 服务器上找到

Eric Youngdale 编写的有用 SCSI 工具可在 tsx-11 上找到

这些工具不是 ALPHA 版本的,但非常干净,并且运行良好。您必须拥有“scsiinfo”软件包。

此简短文档描述了通用驱动程序和增强型驱动程序的功能,可通过 proc SCSI 文件系统读取/写入操作获得的配置参数和控制命令。

此驱动程序已在 linux/i386、Linux/Alpha 和 Linux/PPC 上通过测试。

最新的驱动程序版本和补丁可在以下位置找到

我不是以英语为母语的人,此 README 文件中可能有很多错误。欢迎任何帮助。

2. 支持的芯片和 SCSI 功能

所有芯片都支持以下功能

  • 同步协商

  • 断开连接

  • 标记命令队列

  • SCSI 奇偶校验

  • 主奇偶校验

对于允许“宽协商”的芯片,支持“宽协商”。下表显示了 NCR 8xx 系列芯片的一些特性以及哪些驱动程序支持它们。

芯片

板载 SDMS BIOS

SCSI 标准

最大同步

通用驱动程序支持

增强型驱动程序支持

810

N

N

FAST10

10 MB/秒

N

810A

N

N

FAST10

10 MB/秒

815

N

FAST10

10 MB/秒

N

825

FAST10

20 MB/秒

N

825A

FAST10

20 MB/秒

860

N

N

FAST20

20 MB/秒

875

FAST20

40 MB/秒

876

FAST20

40 MB/秒

895

FAST40

80 MB/秒

895A

FAST40

80 MB/秒

896

FAST40

80 MB/秒

897

FAST40

80 MB/秒

1510D

FAST40

80 MB/秒

1010

FAST80

160 MB/秒

N

1010_66 [1]

FAST80

160 MB/秒

N

其他支持的功能概述

模块

允许加载驱动程序

内存映射 I/O

提高性能

分析信息

从 proc SCSI 文件系统读取操作

控制命令

对 proc SCSI 文件系统的写入操作

调试信息

写入系统日志(仅限专家)

串行 NVRAM

Symbios 和 Tekram 格式

  • 分散/聚集

  • 共享中断

  • 启动设置命令

3. 增强型 896 驱动程序的优势

3.1 优化的 SCSI 脚本

810A、825A、875、895、896 和 895A 支持名为 LOAD 和 STORE 的新 SCSI 脚本指令,这些指令允许将多达 1 个 DWORD 从/向 IO 寄存器移动到/从内存,速度比 53c7xx 和 53c8xx 系列支持的 MOVE MEMORY 指令快得多。LOAD/STORE 指令支持绝对和 DSA 相对寻址模式。SCSI 脚本已完全使用 LOAD/STORE 而不是 MOVE MEMORY 指令重写。

3.2 SYM53C896 的新功能(64 位 PCI 双 LVD SCSI 控制器)

896 和 895A 允许从 SCRIPTS 处理相位不匹配上下文(避免了相位不匹配中断,该中断会停止 SCSI 处理器,直到 C 代码保存传输上下文)。在不使用 LOAD/STORE 指令的情况下实现此目的会很麻烦,我甚至不想尝试它。

896 芯片支持 64 位 PCI 事务和寻址,而 895A 支持 32 位 PCI 事务和 64 位寻址。这些芯片的 SCRIPTS 处理器不是真正的 64 位,而是使用段寄存器表示位 32-63。另一个有趣的功能是,寻址片上 RAM (8k) 的 LOAD/STORE 指令仍然在芯片内部。

由于使用了 LOAD/STORE 脚本指令,此驱动程序不支持以下芯片

  • SYM53C810 修订版 < 0x10 (16)

  • SYM53C815 所有修订版

  • SYM53C825 修订版 < 0x10 (16)

4. 内存映射 I/O 与普通 I/O

内存映射 I/O 的延迟比普通 I/O 短。自 linux-1.3.x 以来,使用内存映射 I/O 而不是普通 I/O。内存映射 I/O 在大多数硬件配置上似乎都能正常工作,但一些设计不良的主板可能会破坏此功能。

配置选项 CONFIG_SCSI_NCR53C8XX_IOMAPPED 强制驱动程序在所有情况下都使用普通 I/O。

5. 标记命令队列

一次向设备排队多个命令可以使其根据实际磁头位置及其机械特性执行优化。此功能还可以减少平均命令延迟。为了真正利用此功能的优势,设备必须具有合理的缓存大小(对于具有 128 KB 或更少的低端硬盘,不应期望奇迹)。一些已知的 SCSI 设备不支持正确标记命令队列。通常,修复此类问题的固件修订版可在各自的供应商网站/ftp 站点上找到。我所能说的是,我在我的机器上使用的硬盘在使用此驱动程序并启用标记命令队列时表现良好

  • IBM S12 0662

  • Conner 1080S

  • Quantum Atlas I

  • Quantum Atlas II

如果您的控制器具有 NVRAM,则可以从用户设置工具中为每个目标配置此功能。Tekram 设置程序允许将最大排队命令数调整到最多 32 个。Symbios 设置仅允许启用或禁用此功能。

目前,默认情况下设置为每个设备排队的最大同步标记命令数为 8。此值适用于大多数 SCSI 磁盘。对于大型 SCSI 磁盘(>= 2GB,缓存 >= 512KB,平均寻道时间 <= 10 ms),使用更大的值可能会获得更好的性能。

sym53c8xx 驱动程序支持每个设备最多 255 个命令,通用 ncr53c8xx 驱动程序支持最多 64 个命令,但除非您使用的是非常大的磁盘或磁盘阵列,否则通常不值得使用超过 32 个命令。值得注意的是,最近的大多数硬盘似乎都不接受超过 64 个同步命令。因此,使用超过 64 个排队命令可能只是浪费资源。

如果您的控制器没有 NVRAM,或者由 SDMS BIOS/SETUP 管理,您可以从启动命令行配置标记队列功能和设备队列深度。例如

ncr53c8xx=tags:4/t2t3q15-t4q7/t1u0q32

将按如下方式设置标记命令队列深度

  • 控制器 0 上的目标 2 所有 lun --> 15

  • 控制器 0 上的目标 3 所有 lun --> 15

  • 控制器 0 上的目标 4 所有 lun --> 7

  • 控制器 1 上的目标 1 lun 0 --> 32

  • 所有其他目标/lun --> 4

在某些特殊情况下,某些 SCSI 磁盘固件可能会为 SCSI 命令返回 QUEUE FULL 状态。此行为由驱动程序使用以下启发式方法进行管理

  • 每次返回 QUEUE FULL 状态时,标记队列深度都会减少到实际断开连接的命令数。

  • 每成功完成 1000 个 SCSI 命令,如果当前限制允许,则可排队的最大命令数将增加。

由于接收和处理 QUEUE FULL 状态会浪费资源,因此驱动程序默认情况下会向用户通知此问题,方法是指示使用的实际命令数及其状态,以及其对设备队列深度更改的决定。驱动程序在处理 QUEUE FULL 时使用的启发式方法可确保对性能的影响不会太差。您可以通过将详细级别设置为零来消除消息,如下所示

第一种方法

使用 'ncr53c8xx=verb:0' 选项启动您的系统。

第二种方法

启动后,将“setverbose 0”控制命令应用于与您的控制器对应的 proc fs 条目。

6. 奇偶校验

该驱动程序支持 SCSI 奇偶校验和 PCI 总线主奇偶校验。必须启用这些功能以确保安全的数据传输。但是,一些有缺陷的设备或主板在奇偶校验方面会出现问题。您可以通过从启动命令行输入相应的选项来禁用 PCI 奇偶校验或 SCSI 奇偶校验。(请参阅 10:启动设置命令)。

7. 分析信息

可通过 proc SCSI 文件系统获得分析信息。由于收集分析信息可能会影响性能,因此默认情况下禁用此功能,并且需要将编译配置选项设置为 Y。

与主机关联的设备具有以下路径名

/proc/scsi/ncr53c8xx/N     (N=0,1,2 ....)

通常,硬件配置中只使用 1 个板卡,该设备是

/proc/scsi/ncr53c8xx/0

但是,如果驱动程序被制作成模块,则每次加载驱动程序时,主机的数量都会递增。

为了显示性能分析信息,只需输入

cat /proc/scsi/ncr53c8xx/0

您将得到类似以下文本的内容

General information:
Chip NCR53C810, device id 0x1, revision id 0x2
IO port address 0x6000, IRQ number 10
Using memory mapped IO at virtual address 0x282c000
Synchronous transfer period 25, max commands per lun 4
Profiling information:
num_trans    = 18014
num_kbytes   = 671314
num_disc     = 25763
num_break    = 1673
num_int      = 1685
num_fly      = 18038
ms_setup     = 4940
ms_data      = 369940
ms_disc      = 183090
ms_post      = 1320

一般信息很容易理解。设备 ID 和修订 ID 按如下方式标识 SCSI 芯片

芯片

设备 ID

修订 ID

810

0x1

< 0x10

810A

0x1

>= 0x10

815

0x4

825

0x3

< 0x10

860

0x6

825A

0x3

>= 0x10

875

0xf

895

0xc

性能分析信息会在 SCSI 命令完成后更新。当主机适配器连接时,会分配一个数据结构并将其清零。因此,如果驱动程序是一个模块,则每次加载驱动程序时,性能计数器都会被清除。“clearprof” 命令允许您随时清除这些计数器。

以下计数器可用

(“num” 前缀表示“数量”,“ms” 表示毫秒)

num_trans

已完成命令的数量。上面的示例:已完成 18014 个命令

num_kbytes

传输的千字节数量。上面的示例:已传输 671 MB

num_disc

SCSI 断开连接的数量。上面的示例:25763 次 SCSI 断开连接

num_break

脚本中断(相位不匹配)的数量。上面的示例:1673 次脚本中断

num_int

除 “on the fly” 之外的中断数量。上面的示例:1685 次非 “on the fly” 中断

num_fly

“on the fly” 中断的数量。上面的示例:18038 次 “on the fly” 中断

ms_setup

SCSI 命令设置的耗时。上面的示例:4.94 秒

ms_data

数据传输的耗时。上面的示例:用于数据传输的 369.94 秒

ms_disc

SCSI 断开连接的耗时。上面的示例:断开连接的 183.09 秒

ms_post

命令后处理的耗时(从获取 SCSI 状态到命令完成调用之间的时间)。上面的示例:用于后处理的 1.32 秒

由于系统时钟的 1/100 秒刻度,“ms_post” 时间可能不正确。

在上面的示例中,我们得到了 18038 次 “on the fly” 中断,只有 1673 次脚本中断,通常是由于分散列表段内的断开连接造成的。

8. 控制命令

可以使用写入 proc SCSI 文件系统的操作将控制命令发送到驱动程序。通用命令语法如下

echo "<verb> <parameters>" >/proc/scsi/ncr53c8xx/0
(assumes controller number is 0)

将 “all” 用于以下命令的 “<target>” 参数将应用于 SCSI 链的所有目标(控制器除外)。

可用命令

8.1 设置最小同步周期因子

setsync <目标> <周期因子>

target:

目标编号

period:

最小同步周期。最大速度 = 1000/(4*周期因子),以下特殊情况除外。

指定周期为 255,以强制异步传输模式。

  • 10 表示 25 纳秒的同步周期

  • 11 表示 30 纳秒的同步周期

  • 12 表示 50 纳秒的同步周期

8.2 设置宽度

setwide <目标> <大小>

target:

目标编号

size:

0=8 位,1=16 位

8.3 设置并发标记命令的最大数量

settags <目标> <标记>

target:

目标编号

tags:

并发标记命令的数量不得大于 SCSI_NCR_MAX_TAGS(默认值:8)

8.4 设置标记命令的顺序类型

setorder <顺序>

order:

3 个可能的值

simple

对所有操作(读取和写入)使用 SIMPLE TAG

ordered

对所有操作使用 ORDERED TAG

default

使用默认标记类型,读取操作使用 SIMPLE TAG,写入操作使用 ORDERED TAG

8.5 设置调试模式

setdebug <调试标志列表>

可用调试标志

alloc

打印有关内存分配的信息(ccb,lcb)

queue

打印有关插入命令启动队列的信息

result

打印 CHECK CONDITION 状态下的感知数据

scatter

打印有关分散过程的信息

scripts

打印有关脚本绑定过程的信息

tiny

打印最少的调试信息

timing

打印 NCR 芯片的定时信息

nego

打印有关 SCSI 协商的信息

phase

打印有关脚本中断的信息

使用不带参数的 “setdebug” 来重置调试标志。

8.6 清除性能计数器

clearprof

当传输的数据量达到 1000 GB 时,为了避免溢出,性能计数器会自动清除。“clearprof” 命令允许您随时清除这些计数器。

8.7 设置标志 (no_disc)

setflag <目标> <标志>

target: 目标编号

目前,只有一个标志可用

no_disc: 不允许目标断开连接。

不要指定任何标志以重置该标志。例如

setflag 4

将为目标 4 重置 no_disc 标志,因此允许其断开连接。

setflag all

将允许 SCSI 总线上所有设备断开连接。

8.8 设置详细级别

setverbose #级别

驱动程序的默认详细级别为 1。此命令允许在启动后更改驱动程序的详细级别。

8.9 重置目标的所有逻辑单元

resetdev <目标>

target:

目标编号

驱动程序将尝试向目标发送 BUS DEVICE RESET 消息。(仅 SYM53C8XX 驱动程序支持,仅供测试使用)

8.10 中止目标的所有逻辑单元的所有任务

cleardev <目标>

target:

目标编号

驱动程序将尝试向目标的所有逻辑单元发送 ABORT 消息。

(仅 SYM53C8XX 驱动程序支持,仅供测试使用)

9. 配置参数

如果所有设备的固件都足够完善,则可以在启动时启用驱动程序支持的所有功能。但是,如果只有一个设备在某些 SCSI 功能方面存在缺陷,则可以在 Linux 启动时禁用驱动程序对该功能的支持,并且仅对安全支持该功能的设备在启动后启用该功能。

CONFIG_SCSI_NCR53C8XX_IOMAPPED(默认答案:n)

如果您怀疑您的主板不允许内存映射 I/O,则回答 “y”。

可能会稍微降低性能。Linux/PPC 需要此选项,无论您在此处选择什么,都会使用此选项。Linux/PPC 使用此选项不会造成性能损失,因为所有 I/O 都是内存映射的。

CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS(默认答案:8)

默认的标记命令队列深度。

CONFIG_SCSI_NCR53C8XX_MAX_TAGS(默认答案:8)

此选项允许您指定可以排队到设备的最大标记命令数。支持的最大值为 32。

CONFIG_SCSI_NCR53C8XX_SYNC(默认答案:5)

此选项允许您指定驱动程序在启动时用于同步数据传输协商的频率(以 MHz 为单位)。可以使用 “setsync” 控制命令稍后更改此频率。0 表示 “异步数据传输”。

CONFIG_SCSI_NCR53C8XX_FORCE_SYNC_NEGO(默认答案:n)

强制对所有 SCSI-2 设备进行同步协商。

某些 SCSI-2 设备不会在查询响应的字节 7 中报告此功能,但确实正确支持它(例如 TAMARACK 扫描仪)。

CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT(默认且唯一合理的答案:n)

如果您怀疑您的某个设备不能正确支持断开连接,则可以回答 “y”。然后,即使执行较长的 SCSI 操作,所有 SCSI 设备也不会断开总线连接。

CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT

真正的 SYMBIOS 板将 GPIO0 用于控制器 LED 的输出,并将 GPIO3 位用作标志,指示单端/差分接口。如果您系统的所有板卡都是真正的 SYMBIOS 板卡,或者使用 SYMBIOS 的 BIOS 和驱动程序,则需要启用此选项。

如果您的系统至少有一个带有特定于供应商的 BIOS 的基于 53C8XX 的 SCSI 板,则不应启用此选项。例如,Tekram DC-390/U、DC-390/W 和 DC-390/F SCSI 控制器使用特定于供应商的 BIOS,并且已知不使用 SYMBIOS 兼容的 GPIO 布线。因此,如果您的系统安装了此类板卡,则不应启用此选项。

CONFIG_SCSI_NCR53C8XX_NVRAM_DETECT

启用对读取 Symbios 和某些 Symbios 兼容卡以及 Tekram DC390W/U/F 卡上的串行 NVRAM 数据的支持。对于具有多个 Symbios 兼容控制器的系统(其中至少一个具有串行 NVRAM)或对于混合使用 Symbios 和 Tekram 卡的系统非常有用。允许将主机适配器的启动顺序设置为默认顺序或 “反向探测” 顺序之外的顺序。还允许区分 Symbios 和 Tekram 卡,以便在混合使用 Symbios 和 Tekram 卡的系统中设置 CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT,从而使 Symbios 卡可以充分利用 Symbios 功能的全部范围、差分、LED 引脚,而不会对 Tekram 卡造成问题。

10. 启动设置命令

10.1 语法

可以使用启动时或使用 ‘insmod’ 作为字符串变量将设置命令传递给驱动程序。

ncr53c8xx (sym53c8xx) 驱动程序的引导设置命令以驱动程序名称 “ncr53c8xx=”(sym53c8xx) 开头。内核语法解析器接着会期望一个可选的整数列表(以逗号分隔),后面跟着一个可选的字符串列表(以逗号分隔)。以下是 lilo 提示符下的引导设置命令示例:

lilo: linux root=/dev/hda2 ncr53c8xx=tags:4,sync:10,debug:0x200
  • 启用标记命令,最多可排队 4 个标记命令。

  • 将同步协商速度设置为 10 兆传输/秒。

  • 设置 DEBUG_NEGO 标志。

由于在使用 ‘insmod’ 定义字符串变量时似乎不允许使用逗号,因此驱动程序也接受 <空格> 作为选项分隔符。以下命令将安装具有与上述相同选项的驱动程序模块:

insmod ncr53c8xx.o ncr53c8xx="tags:4 sync:10 debug:0x200"

目前,驱动程序会丢弃整数参数列表。将来将使用它来允许每个控制器的设置。

每个字符串参数必须指定为“关键字:值”。只允许使用小写字符和数字。

在包含多个 53C8xx 适配器的系统中,insmod 将在每个适配器上安装指定的驱动程序。要排除某个芯片,请使用 ‘excl’ 关键字。

以下命令序列

insmod sym53c8xx sym53c8xx=excl:0x1400
insmod ncr53c8xx

在除 IO 端口地址为 0x1400 的适配器之外的所有适配器上安装 sym53c8xx 驱动程序,然后在 IO 端口地址为 0x1400 的适配器上安装 ncr53c8xx 驱动程序。

10.2 可用参数

10.2.1 主奇偶校验

mpar:y

已启用

mpar:n

已禁用

10.2.2 Scsi 奇偶校验

spar:y

已启用

spar:n

已禁用

10.2.3 Scsi 断开连接

disc:y

已启用

disc:n

已禁用

10.2.4 特殊功能

仅适用于 810A、825A、860、875 和 895 控制器。对其他控制器无效。

specf:y

(或 1)已启用

specf:n

(或 0)已禁用

specf:3

已启用,但内存写入和无效除外

默认的驱动程序设置为 ‘specf:3’。因此,必须在引导设置命令中指定选项 ‘specf:y’ 才能启用内存写入和无效。

10.2.5 Ultra SCSI 支持

仅适用于 860、875、895、895a、896、1010 和 1010_66 控制器。对其他控制器无效。

ultra:n

启用所有 Ultra 速度

ultra:2

启用 Ultra2

ultra:1

启用 Ultra

ultra:0

禁用 Ultra 速度

10.2.6 标记命令的默认数量

tags:0 (或 tags:1)

禁用标记命令队列

tags:#tags (#tags > 1)

启用标记命令队列

#tags 将被截断为最大排队命令配置参数。此选项还允许为支持标记命令队列的每个设备指定命令队列深度。

示例

ncr53c8xx=tags:10/t2t3q16-t5q24/t1u2q32

将按如下方式设置设备队列深度:

  • 控制器 #0 目标 #2 和目标 #3 -> 16 个命令,

  • 控制器 #0 目标 #5 -> 24 个命令,

  • 控制器 #1 目标 #1 逻辑单元 #2 -> 32 个命令,

  • 所有其他逻辑单元(所有目标,所有控制器)-> 10 个命令。

10.2.7 默认同步周期因子

sync:255

已禁用(异步传输模式)

sync:#factor

#factor = 10

Ultra-2 SCSI 40 兆传输/秒

#factor = 11

Ultra-2 SCSI 33 兆传输/秒

#factor < 25

Ultra SCSI 20 兆传输/秒

#factor < 50

快速 SCSI-2

在所有情况下,驱动程序都将根据 NCR53C8XX 芯片类型使用控制器支持的最小传输周期。

10.2.8 与所有设备协商同步

(强制同步协商)

fsn:y

已启用

fsn:n

已禁用

10.2.9 详细程度

verb:0

最小

verb:1

正常

verb:2

太多

10.2.10 调试模式

debug:0

清除调试标志

debug:#x

设置调试标志

#x 是一个整数值,它组合了以下 2 的幂值:

DEBUG_ALLOC

0x1

DEBUG_PHASE

0x2

DEBUG_POLL

0x4

DEBUG_QUEUE

0x8

DEBUG_RESULT

0x10

DEBUG_SCATTER

0x20

DEBUG_SCRIPT

0x40

DEBUG_TINY

0x80

DEBUG_TIMING

0x100

DEBUG_NEGO

0x200

DEBUG_TAGS

0x400

DEBUG_FREEZE

0x800

DEBUG_RESTART

0x1000

您可以安全地使用 DEBUG_NEGO。但是,其中一些标志可能会生成大量的系统日志消息。

10.2.11 最大突发

burst:0

禁用突发

burst:255

从初始 IO 寄存器设置获取突发长度。

burst:#x

启用突发(最大 1<<#x 次突发传输)

#x 是一个整数值,它是最大突发传输次数的以 2 为底的对数。

NCR53C875 和 NCR53C825A 支持最多 128 次突发传输 (#x = 7)。

其他芯片仅支持最多 16 次突发传输 (#x = 4)。

这是一个最大值。驱动程序根据芯片和修订 ID 设置突发长度。默认情况下,驱动程序使用芯片支持的最大值。

10.2.12 LED 支持

led:1

启用 LED 支持

led:0

禁用 LED 支持

如果您的 scsi 板不使用 SDMS BIOS,请不要启用 LED 支持。(请参阅“配置参数”)

10.2.13 最大宽度

wide:1

启用宽 scsi

wide:0

禁用宽 scsi

某些 scsi 板使用 875(超宽),但仅提供窄连接器。如果您已使用 50 针到 68 针电缆转换器连接了宽设备,则任何接受的宽协商都会中断进一步的数据传输。在这种情况下,在启动命令中使用“wide:0”会有所帮助。

10.2.14 差分模式

diff:0

从不设置差分模式

diff:1

如果 BIOS 设置了差分模式,则设置差分模式

diff:2

始终设置差分模式

diff:3

如果未设置 GPIO3,则设置差分模式

10.2.15 IRQ 模式

irqm:0

始终开漏

irqm:1

与初始设置相同(假定 BIOS 设置)

irqm:2

始终推挽

irqm:0x10

驱动程序在请求 irq 时将不使用 IRQF_SHARED 标志

(位 0x10 和 0x20 可以与硬件 irq 模式选项组合使用)

10.2.16 反向探测

revprob:n

按以下顺序从 PCI 配置中探测芯片 ID:810、815、820、860、875、885、895、896

revprob:y

按相反顺序探测芯片 ID。

10.2.17 修复 PCI 配置空间

pcifix:<选项位>

可用选项位

0x0

不尝试修复 PCI 配置空间寄存器值。

0x1

如果未设置,则设置 PCI 缓存行大小寄存器。

0x2

在 PCI 命令寄存器中设置写入和无效位。

0x4

根据最大突发值增加必要的 PCI 延迟计时器。

使用 ‘pcifix:7’ 以允许驱动程序修复所有 PCI 功能。

10.2.18 串行 NVRAM

nvram:n

不查找串行 NVRAM

nvram:y

测试控制器是否具有板载串行 NVRAM

(备用二进制形式)mvram=<位选项>

0x01

查找 NVRAM(等效于 nvram=y)

0x02

忽略所有设备的 NVRAM “同步协商” 参数

0x04

忽略所有设备的 NVRAM “宽协商” 参数

0x08

忽略所有设备的 NVRAM “启动时扫描” 参数

0x80

还附加在 NVRAM 中设置为 OFF 的控制器(仅限 sym53c8xx)

10.2.19 检查 SCSI 总线

buschk:<选项位>

可用选项位

0x0

不检查。

0x1

检查并且在出错时不附加控制器。

0x2

检查并且仅在出错时发出警告。

0x4

禁用 SCSI 总线完整性检查。

10.2.20 排除要附加的主机

excl=<io_address>

阻止附加给定 io 地址的主机。例如 ‘ncr53c8xx=excl:0xb400,excl:0xc000’ 指示 ncr53c8xx 驱动程序不要附加地址为 0xb400 和 0xc000 的主机。

10.2.21 为主机建议默认 SCSI ID

hostid:255

不建议使用 ID。

hostid:#x

(0 < x < 7)建议 x 用于主机 SCSI ID。

如果可以从 NVRAM 获取主机 SCSI ID,则驱动程序将忽略作为引导选项提供的任何值。否则,如果提供了与 255 不同的建议值,它将使用该值。否则,它将尝试推断先前在硬件中设置的值,如果硬件值为零,则使用值 7。

10.2.22 启用使用直接仲裁

(仅 sym53c8xx 驱动程序支持。有关详细信息,请参阅 10.7)

iarb:0

不使用此功能。

iarb:#x

根据以下位字段使用此功能:

位 0 (1)

当启动器为 SCSI 总线进行仲裁时,每次重新选择启动器时都启用 IARB。

(#x >> 4)

如果启动器赢得仲裁并且它有其他命令要发送到设备,则 IARB 的最大连续设置次数。

引导故障安全

safe:y 加载以下假定的故障安全初始设置:

主奇偶校验

已禁用

mpar:n

scsi 奇偶校验

已启用

spar:y

断开连接

不允许

disc:n

特殊功能

已禁用

specf:n

超高速 scsi

已禁用

ultra:n

强制同步协商

已禁用

fsn:n

反向探测

已禁用

revprob:n

PCI 修复

已禁用

pcifix:0

串行 NVRAM

已启用

nvram:y

详细程度

2

verb:2

标记命令队列

已禁用

tags:0

同步协商

已禁用

sync:255

调试标志

debug:0

突发长度

来自 BIOS 设置

burst:255

LED 支持

已禁用

led:0

宽支持

已禁用

wide:0

稳定时间

10 秒

settle:10

差分支持

来自 BIOS 设置

diff:1

irq 模式

来自 BIOS 设置

irqm:1

SCSI 总线检查

在出错时不附加

buschk:1

直接仲裁

已禁用

iarb:0

10.3 建议的引导设置命令

如果驱动程序已使用默认选项配置,则等效的引导设置为

ncr53c8xx=mpar:y,spar:y,disc:y,specf:3,fsn:n,ultra:2,fsn:n,revprob:n,verb:1\
          tags:0,sync:50,debug:0,burst:7,led:0,wide:1,settle:2,diff:0,irqm:0

对于安装软盘或安全但速度不快的系统,引导设置可以是

ncr53c8xx=safe:y,mpar:y,disc:y
ncr53c8xx=safe:y,disc:y
ncr53c8xx=safe:y,mpar:y
ncr53c8xx=safe:y

我的个人系统使用以下等效设置完美运行

ncr53c8xx=mpar:y,spar:y,disc:y,specf:1,fsn:n,ultra:2,fsn:n,revprob:n,verb:1\
          tags:32,sync:12,debug:0,burst:7,led:1,wide:1,settle:2,diff:0,irqm:0

当详细级别为 2 时,驱动程序会打印其实际设置。您可以尝试 “ncr53c8xx=verb:2” 以获取驱动程序的 “静态” 设置,或将 “verb:2” 添加到引导设置命令中,以检查驱动程序正在使用的实际设置。

10.4 PCI 配置修复引导选项

pcifix:<选项位>

可用选项位

0x1

如果未设置,则设置 PCI 缓存行大小寄存器。

0x2

在 PCI 命令寄存器中设置写入和无效位。

使用 ‘pcifix:3’ 以允许驱动程序修复 PCI 功能。

这些选项仅适用于新的 SYMBIOS 芯片 810A、825A、860、875 和 895,并且仅支持奔腾和 486 类处理器。较新的 SYMBIOS 53C8XX SCSI 处理器能够使用 PCI 读取多重和 PCI 写入并使无效命令。这些功能要求在芯片的 PCI 配置空间中正确设置缓存行大小寄存器。另一方面,只有当 PCI 命令寄存器中相应的位设置为 1 时,芯片才会使用 PCI 写入并使无效命令。

并非所有 PCI BIOS 都会在 53C8XX 芯片的 PCI 配置空间中设置 PCI 缓存行寄存器和 PCI 写入并使无效位。对于某些 PCI/内存控制器,优化的 PCI 访问可能会中断,或者会给某些 PCI 板卡带来问题。

此修复程序在我的上一系统中运行完美。(主板 Triton HX / 53C875 / 53C810A)我使用这些选项的风险自负,如果您决定也使用它们,您也将承担同样的风险。

10.5 串行 NVRAM 支持引导选项

nvram:n

不查找串行 NVRAM

nvram:y

测试控制器是否具有板载串行 NVRAM

此选项也可以输入为十六进制值,用于控制驱动程序将从 NVRAM 获取哪些信息以及忽略哪些信息。有关详细信息,请参阅“17. 串行 NVRAM 支持”。

启用此选项后,驱动程序会尝试检测所有使用串行 NVRAM 的板卡。此内存用于保存用户设置的参数。

驱动程序能够从 NVRAM 获取的参数取决于所使用的数据格式,如下所示

Tekram 格式

Symbios 格式

通用和主机参数

  • 启动顺序

N

  • 主机 SCSI ID

  • SCSI 奇偶校验

  • 详细启动消息

N

SCSI 设备参数

  • 同步传输速度

  • 16 位宽/窄

  • 已启用标记命令队列

  • 已启用断开连接

  • 启动时扫描

N

为了加快系统启动速度,对于每个未配置“启动时扫描”选项的设备,驱动程序会在为此设备收到的第一个 TEST UNIT READY 命令上强制执行错误。

某些 SDMS BIOS 版本似乎无法通过非常快的硬盘干净启动。在这种情况下,您无法使用优化的参数值配置 NVRAM。

‘nvram’ 引导选项可以十六进制形式输入,以便忽略 NVRAM 中配置的某些选项,如下所示

mvram=<位选项>

0x01

查找 NVRAM(等效于 nvram=y)

0x02

忽略所有设备的 NVRAM “同步协商” 参数

0x04

忽略所有设备的 NVRAM “宽协商” 参数

0x08

忽略所有设备的 NVRAM “启动时扫描” 参数

0x80

还附加在 NVRAM 中设置为 OFF 的控制器(仅限 sym53c8xx)

选项 0x80 仅由 sym53c8xx 驱动程序支持,默认情况下禁用。结果是,默认情况下(未设置选项),sym53c8xx 驱动程序不会附加在 NVRAM 中设置为 OFF 的控制器。

ncr53c8xx 始终尝试附加所有控制器。选项 0x80 没有添加到 ncr53c8xx 驱动程序中,因为据报告它会使用户感到困惑,因为这些用户已经长期使用此驱动程序。如果您希望 ncr53c8xx 驱动程序在 Linux 启动时不附加控制器,则必须使用 ‘excl’ 驱动程序引导选项。

10.6 SCSI 总线检查引导选项。

当此选项设置为非零值时,驱动程序会在断言 SCSI RESET 线 100 微秒后检查 SCSI 线的逻辑状态。驱动程序仅读取 SCSI 线并检查除 RESET 之外的所有读取为 FALSE 的线。由于 SCSI 设备应在断言 SCSI RESET 后最多 800 纳秒释放总线,因此任何为 TRUE 的信号都可能表示 SCSI 总线问题。不幸的是,以下常见的 SCSI 总线问题未被检测到

  • 仅安装了 1 个终端器。

  • 终端器放置错误。

  • 劣质终端器。

另一方面,布线不良、设备损坏、不合规的设备等可能会导致驱动程序读取时 SCSI 信号错误。

10.7 立即仲裁引导选项

此选项仅由 SYM53C8XX 驱动程序支持(而不是 NCR53C8XX)。

SYMBIOS 53C8XX 芯片能够在检测到预期的断开连接(总线空闲阶段)后立即仲裁 SCSI 总线。为了启动此过程,当芯片连接到 SCSI 总线时,必须设置 SCNTL1 IO 寄存器的位 1。

当为当前连接启用此功能时,如果只有优先级较低的设备正在竞争 SCSI 总线,则芯片有很大机会赢得仲裁。顺便说一句,当芯片使用 SCSI ID 7 时,它肯定会赢得下一次 SCSI 总线仲裁。

由于没有办法知道哪些设备正在尝试仲裁总线,因此使用此功能可能非常不公平。因此,不建议启用它,或者最多仅在芯片丢失上次仲裁时启用此功能(引导选项 ‘iarb:1’)。

此功能具有以下优点

  1. 允许 ID 为 7 的启动器在需要时赢得仲裁。

  2. 将仲裁时间的至少 4 微秒与处理当前连接结束并启动下一个作业的脚本的执行重叠。

嗯...但是 (a) 可能只是阻止其他设备重新选择启动器,并延迟数据传输或状态/完成,并且 (b) 如果脚本执行持续超过 4 微秒,则可能只是浪费 SCSI 总线带宽。

IARB 的使用需要在编译时定义 SCSI_NCR_IARB_SUPPORT 选项,并在启动时将 ‘iarb’ 引导选项设置为非零值。它对于实际工作不是很有用,但可以用来对 SCSI 设备进行压力测试,或用于某些可以从中受益的应用程序。顺便说一句,如果您在使用高 IO 负载的 IARB 时遇到诸如“意外断开连接”、“不良重选”等问题,您不应该感到惊讶,因为强制馈送任何东西并在同一时间阻止它的屁股是无法长时间工作的。:-))

11. ncr53c8xx.h 头文件的一些常量和标志

其中一些是从配置参数定义的。要更改其他“定义”,必须编辑头文件。仅在您知道自己在做什么的情况下才这样做。

SCSI_NCR_SETUP_SPECIAL_FEATURES(默认值:已定义)

如果已定义,驱动程序将根据芯片和修订 ID 启用一些特殊功能。

对于 810A、860、825A、875 和 895 SCSI 芯片,此选项启用以下功能的支持,这些功能可在 SCSI 传输处理期间减少 PCI 总线和内存访问的负载:突发操作码获取、读取多重、读取行、预取、缓存行、写入并使无效、突发 128(仅 875)、大型 DMA FIFO(仅 875)、偏移量 16(仅 875)。可以通过以下引导设置命令更改

ncr53c8xx=specf:n
SCSI_NCR_IOMAPPED(默认值:未定义)

如果已定义,则强制使用正常的 I/O。

SCSI_NCR_SHARE_IRQ(默认值:已定义)

如果已定义,则请求共享 IRQ。

SCSI_NCR_MAX_TAGS(默认值:8)

发送到设备的同时标记命令的最大数量。

可以通过 “settags <目标> <最大标记数>” 更改

SCSI_NCR_SETUP_DEFAULT_SYNC(默认值:50)

驱动程序将在启动时用于同步协商的传输周期因子。0 表示异步。

可以通过 “setsync <目标> <周期因子>” 更改

SCSI_NCR_SETUP_DEFAULT_TAGS(默认值:8)

发送到设备的同时标记命令的默认数量。

< 1 表示启动时禁用标记命令队列。

SCSI_NCR_ALWAYS_SIMPLE_TAG(默认值:已定义)

对读取和写入命令使用 SIMPLE TAG。

可以通过 “setorder <ordered|simple|default>” 更改

SCSI_NCR_SETUP_DISCONNECTION(默认值:已定义)

如果已定义,则允许目标断开连接。

SCSI_NCR_SETUP_FORCE_SYNC_NEGO(默认值:未定义)

如果已定义,则尝试对所有 SCSI-2 设备进行同步协商。

可以通过 “setsync <目标> <周期>” 更改

SCSI_NCR_SETUP_MASTER_PARITY(默认值:已定义)

如果已定义,则启用主奇偶校验。

SCSI_NCR_SETUP_SCSI_PARITY(默认值:已定义)

如果已定义,则启用 SCSI 奇偶校验。

SCSI_NCR_PROFILE_SUPPORT(默认值:未定义)

如果已定义,则收集性能分析信息。

SCSI_NCR_MAX_SCATTER(默认值:128)

驱动程序 CCB 的散列列表大小。

SCSI_NCR_MAX_TARGET(默认值:16)

每个主机的最大目标数。

SCSI_NCR_MAX_HOST(默认值:2)

最大主机控制器数。

SCSI_NCR_SETTLE_TIME(默认值:2)

驱动程序在重置后将等待的秒数。

SCSI_NCR_TIMEOUT_ALERT(默认值:3)

如果挂起的命令在此时间后超时,则将对下一个命令使用有序标记。

避免无序标记命令的超时。

SCSI_NCR_CAN_QUEUE(默认值:7*SCSI_NCR_MAX_TAGS)

可以排队到主机的最大命令数。

SCSI_NCR_CMD_PER_LUN(默认值:SCSI_NCR_MAX_TAGS)

排队到主机以供设备使用的最大命令数。

SCSI_NCR_SG_TABLESIZE(默认值:SCSI_NCR_MAX_SCATTER-1)

Linux 散列/收集列表的最大大小。

SCSI_NCR_MAX_LUN(默认值:8)

每个目标的最大 LUN 数。

12. 安装

此驱动程序是 Linux 内核发行版的一部分。驱动程序文件位于内核源代码树的子目录“drivers/scsi”中。

驱动程序文件

README.ncr53c8xx        : this file
ChangeLog.ncr53c8xx     : change log
ncr53c8xx.h             : definitions
ncr53c8xx.c             : the driver code

新的驱动程序版本会单独提供,以便在将其包含到 Linux 内核发行版之前允许测试更改和新功能。以下 URL 提供了有关最新可用补丁的信息

13. 体系结构相关的功能

<尚未编写>

14. 已知问题

14.1 使用 Iomega Jaz 设备的标记命令

我没有尝试过此设备,但是有人向我报告了以下内容:此设备能够进行标记命令队列。但是,在启动时,它会拒绝标记命令。此行为符合 SCSI-2 规范的 6.8.2。驱动程序在这种情况下的当前行为不令人满意。因此,不要为能够停止旋转的设备启用标记命令队列。可能出现的另一个问题是超时。避免超时的唯一方法似乎是编辑 linux/drivers/scsi/sd.c 并增加当前的超时值。

14.2 添加另一个控制器时设备名称会更改

当您向已有一个或多个此系列控制器的系统添加新的基于 NCR53C8XX 芯片的控制器时,驱动程序将其注册到内核的顺序可能会由于设备名称更改而导致问题。当至少一个控制器使用 NvRAM 时,SDMS BIOS 版本 4 允许您定义 BIOS 将扫描 SCSI 板的顺序。如果设置了 NvRAM 检测选项,驱动程序将根据 BIOS 信息附加控制器。

如果您的控制器没有 NvRAM,您可以

  • 要求驱动程序从引导命令行以相反的顺序探测芯片 ID:ncr53c8xx=revprob:y

  • 在 fstab 中进行适当的更改。

  • 使用 Eric Youngdale 的 ‘scsidev’ 工具。

14.3 将 8 位设备与宽 SCSI 控制器一起使用

当只有 8 位窄设备连接到 16 位宽 SCSI 控制器时,您必须确保 SCSI 总线宽部分的线路被上拉。这可以通过启用 SCSI 控制器卡的宽终端器部分来实现。

有关此类设置,TYAN 1365 文档修订版 1.2 不正确。(第 10 页,图 3.3)。

14.4 内存写入和失效期间可能发生的数据损坏

此问题在 SYMBIOS DEL 397, 部件号 69-039241, 项目 4 中描述。

在某些复杂情况下,53C875 芯片修订版 <= 3 可能会在未与缓存行对齐的 4 个 DWORDS 边界处启动 PCI 写入和失效命令。只有当缓存行大小为 8 个 DWORDS 或更大时,才可能发生这种情况。奔腾系统使用 8 个 DWORDS 的缓存行大小,因此受此芯片错误的影响,而使用 4 个 DWORDS 缓存行大小的 i486 系统则不受影响。

当发生这种情况时,芯片可能在仅填充了传输中涉及的最后一个缓存行的一部分后,就完成了写入和失效命令,导致该缓存行的其余部分数据损坏。

不使用写入和失效显然可以消除此芯片错误,因此它现在是驱动程序的默认设置。但是,对于像我这样想要启用此功能的人,我添加了 SYMBIOS 建议的部分解决方法。当进入 DATA IN 阶段时,此解决方法会重置寻址逻辑,从而防止在阶段的第一个 SCSI MOVE 中触发该错误。根据以下内容,此解决方法应该足够了

唯一大于 8 个 DWORDS 并且由 SCRIPTS 处理器移动的驱动程序内部数据结构是“CCB 标头”,其中包含 SCSI 传输的上下文。此数据结构与 8 个 DWORDS 边界(奔腾缓存行大小)对齐,因此至少在奔腾系统上,不会受到此芯片错误的影响。

但是,当使用 4 个 DWORDS 但未与缓存行对齐的缓冲区执行 SCSI 读取命令时,可能会满足此错误的条件。当使用散列/聚集列表时,这种情况在 Linux 下不会发生,因为它们仅引用对齐良好的系统缓冲区。因此,只有在不使用散列/聚集列表并且在阶段不匹配后重新进入 SCSI DATA IN 阶段时,才可能需要在 Linux 下进行解决方法。

15. SCSI 问题故障排除

15.1 问题跟踪

大多数 SCSI 问题都是由于不符合标准的 SCSI 总线或有缺陷的设备引起的。如果不幸遇到 SCSI 问题,您可以检查以下事项

  • SCSI 总线电缆

  • SCSI 链两端的终端

  • linux 系统日志消息(其中一些可能对您有所帮助)

如果您找不到问题的根源,您可以配置驱动程序时不启用任何功能。

  • 仅异步数据传输

  • 禁用标记命令

  • 不允许断开连接

现在,如果您的 SCSI 总线正常,那么您的系统很有可能在这种安全配置下工作,但性能将不是最佳的。

如果仍然失败,那么您可以将您的问题描述发送到相应的邮件列表或新闻组。给我发送一份副本,以确保我会收到。显然,驱动程序代码中可能存在错误。

我的电子邮件地址:Gerard Roudier <groudier@free.fr>

如果您在 SCSI 总线上使用多个设备,则允许断开连接很重要,但是通常会导致有缺陷的设备出现问题。同步数据传输提高了硬盘等快速设备的吞吐量。具有大缓存的良好 SCSI 硬盘可以利用标记命令队列的优势。

尝试使用控制命令一次启用一个功能。例如

echo "setsync all 25" >/proc/scsi/ncr53c8xx/0

将为所有目标启用快速同步数据传输协商。

echo "setflag 3" >/proc/scsi/ncr53c8xx/0

将重置目标 3 的标志 (no_disc),因此将允许其断开 SCSI 总线。

echo "settags 3 8" >/proc/scsi/ncr53c8xx/0

如果设备支持,将为目标 3 启用标记命令队列。

一旦您找到导致问题的设备和功能,只需为该设备禁用该功能即可。

15.2 理解硬件错误报告

当驱动程序检测到意外的错误情况时,它可能会显示以下模式的消息

sym53c876-0:1: ERROR (0:48) (1-21-65) (f/95) @ (script 7c0:19000000).
sym53c876-0: script cmd = 19000000
sym53c876-0: regdump: da 10 80 95 47 0f 01 07 75 01 81 21 80 01 09 00.

此类消息中的某些字段可以帮助您理解问题的原因,如下所示

sym53c876-0:1: ERROR (0:48) (1-21-65) (f/95) @ (script 7c0:19000000).
............A.........B.C....D.E..F....G.H.......I.....J...K.......
字段 A目标编号。

控制器在发生错误时正在与之通信的设备的 SCSI ID。

字段 BDSTAT io 寄存器 (DMA 状态)

位 0x40

MDPE 主数据奇偶校验错误 在 PCI 总线上检测到数据奇偶校验错误。

位 0x20

BF 总线故障 检测到 PCI 总线故障情况

位 0x01

IID 检测到非法指令 当芯片在某些使指令非法的条件下检测到非法指令格式时设置。

位 0x80

DFE Dma Fifo 空 纯状态位,不表示错误。

如果报告的 DSTAT 值包含 MDPE (0x40) 和 BF (0x20) 的组合,那么原因可能很可能是由于 PCI 总线问题引起的。

字段 CSIST io 寄存器 (SCSI 中断状态)

位 0x08

SGE SCSI 严重错误 表示芯片在 SCSI 总线上检测到严重的错误情况,从而阻止 SCSI 协议正常运行。

位 0x04

UDC 意外断开连接 表示设备在芯片不期望发生这种情况时释放了 SCSI 总线。设备可能会这样做来向 SCSI 发起者指示发生了无法使用 SCSI 协议报告的错误情况。

位 0x02

RST SCSI 总线复位 通常,SCSI 目标不会复位 SCSI 总线,尽管总线上的任何设备都可以随时复位它。

位 0x01

PAR 奇偶校验 检测到 SCSI 奇偶校验错误。

在有故障的 SCSI 总线上,芯片可能会检测到 SGE (0x08)、UDC (0x04) 和 PAR (0x01) 中的任何错误情况。如果您的 SCSI 系统有时会遇到此类错误情况,尤其是 SCSI 严重错误,那么 SCSI 总线问题很可能是这些错误的原因。

对于字段 D、E、F、G 和 H,您可以查看 sym53c8xx_defs.h 文件,其中包含关于 IO 寄存器位的一些最少的注释。

字段 DSOCL Scsi 输出控制锁存器

此寄存器反映了芯片想要驱动或比较的 SCSI 控制线的状态。

字段 ESBCL Scsi 总线控制线

SCSI 总线上控制线的实际值。

字段 FSBDL Scsi 总线数据线

SCSI 总线上数据线的实际值。

字段 GSXFER SCSI 传输

包含输出的同步周期的设置和当前同步偏移量(偏移量 0 表示异步)。

字段 HSCNTL3 Scsi 控制寄存器 3

包含异步和同步数据传输的定时值的设置。

理解字段 I、J、K 和转储需要对 SCSI 标准、芯片内核功能和内部驱动程序数据结构有很好的了解。您不需要解码和理解它们,除非您想帮助维护驱动程序代码。

16. 同步传输协商表

下面的表是通过调用驱动程序用于同步协商定时计算和芯片设置的例程创建的。第一个表对应于具有 80 MHz 时钟和 5 个时钟分频器的 Ultra 芯片 53875 和 53C860。第二个表是通过将 scsi 时钟设置为 40 Mhz 并使用 4 个时钟分频器计算的,因此适用于快速 SCSI-2 模式下的所有 NCR53C8XX 芯片。

周期以纳秒为单位,速度以兆传输每秒为单位。1 兆传输/秒表示使用 8 位 SCSI 为 1 MB/s,使用 Wide16 SCSI 为 2 MB/s。

16.1 53C895、53C875 和 53C860 SCSI 控制器的同步定时

协商

NCR 设置

系数

周期

速度

周期

速度

10

25

40.000

25

40.000

(仅限 53C895)

11

30.2

33.112

31.25

32.000

(仅限 53C895)

12

50

20.000

50

20.000

13

52

19.230

62

16.000

14

56

17.857

62

16.000

15

60

16.666

62

16.000

16

64

15.625

75

13.333

17

68

14.705

75

13.333

18

72

13.888

75

13.333

19

76

13.157

87

11.428

20

80

12.500

87

11.428

21

84

11.904

87

11.428

22

88

11.363

93

10.666

23

92

10.869

93

10.666

24

96

10.416

100

10.000

25

100

10.000

100

10.000

26

104

9.615

112

8.888

27

108

9.259

112

8.888

28

112

8.928

112

8.888

29

116

8.620

125

8.000

30

120

8.333

125

8.000

31

124

8.064

125

8.000

32

128

7.812

131

7.619

33

132

7.575

150

6.666

34

136

7.352

150

6.666

35

140

7.142

150

6.666

36

144

6.944

150

6.666

37

148

6.756

150

6.666

38

152

6.578

175

5.714

39

156

6.410

175

5.714

40

160

6.250

175

5.714

41

164

6.097

175

5.714

42

168

5.952

175

5.714

43

172

5.813

175

5.714

44

176

5.681

187

5.333

45

180

5.555

187

5.333

46

184

5.434

187

5.333

47

188

5.319

200

5.000

48

192

5.208

200

5.000

49

196

5.102

200

5.000

16.2 快速 SCSI-2 53C8XX 控制器的同步定时

协商

NCR 设置

系数

周期

速度

周期

速度

25

100

10.000

100

10.000

26

104

9.615

125

8.000

27

108

9.259

125

8.000

28

112

8.928

125

8.000

29

116

8.620

125

8.000

30

120

8.333

125

8.000

31

124

8.064

125

8.000

32

128

7.812

131

7.619

33

132

7.575

150

6.666

34

136

7.352

150

6.666

35

140

7.142

150

6.666

36

144

6.944

150

6.666

37

148

6.756

150

6.666

38

152

6.578

175

5.714

39

156

6.410

175

5.714

40

160

6.250

175

5.714

41

164

6.097

175

5.714

42

168

5.952

175

5.714

43

172

5.813

175

5.714

44

176

5.681

187

5.333

45

180

5.555

187

5.333

46

184

5.434

187

5.333

47

188

5.319

200

5.000

48

192

5.208

200

5.000

49

196

5.102

200

5.000

17. 串行 NVRAM

(由 Richard Waltham 添加:dormouse@farsrobt.demon.co.uk

17.1 特性

启用串行 NVRAM 支持可以检测 Symbios 和一些 Symbios 兼容主机适配器以及 Tekram 板上包含的串行 NVRAM。Symbios 和 Tekram 使用串行 NVRAM 来保存主机适配器及其连接的驱动器的设置参数。

Symbios NVRAM 还保存着系统中具有多个主机适配器的启动顺序数据。这使得可以更改在主机适配器检测期间使用的默认顺序扫描卡以查找驱动器。

目前可以使用“反向探测”在一定程度上完成此操作,但这只会更改检测不同类型卡片的顺序。NVRAM 启动顺序设置可以执行此操作,并更改扫描相同类型卡片的顺序,这是“反向探测”无法做到的。

使用 Symbios 芯片的 Tekram 板(DC390W/F/U)具有 NVRAM,可以检测到它们,并用于区分 Symbios 兼容和 Tekram 主机适配器。如果设置了 CONFIG_SCSI_53C8XX_SYMBIOS_COMPAT 配置参数,这将用于禁用 Tekram 板上错误设置的 Symbios 兼容“diff”设置,从而使 Symbios 和 Tekram 板可以一起使用,Symbios 卡可以使用其所有功能,包括“diff”支持。(使用 Tekram 卡时,Symbios 兼容卡的“led pin”支持可以保持启用状态。它对 Tekram 主机适配器没有任何用处,但也不会引起问题。)

17.2 Symbios NVRAM 布局

NVRAM 地址 0x100 (53c810a NVRAM) 处的典型数据

00 00
64 01
8e 0b

00 30 00 00 00 00 07 00 00 00 00 00 00 00 07 04 10 04 00 00

04 00 0f 00 00 10 00 50 00 00 01 00 00 62
04 00 03 00 00 10 00 58 00 00 01 00 00 63
04 00 01 00 00 10 00 48 00 00 01 00 00 61
00 00 00 00 00 00 00 00 00 00 00 00 00 00

0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00

0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00

fe fe
00 00
00 00

NVRAM 布局详细信息

NVRAM 地址

0x000-0x0ff

未使用

0x100-0x26f

初始化数据

0x270-0x7ff

未使用

常规布局

header  -   6 bytes,
data    - 356 bytes (checksum is byte sum of this data)
trailer -   6 bytes
          ---
total     368 bytes

数据区域布局

controller set up  -  20 bytes
boot configuration -  56 bytes (4x14 bytes)
device set up      - 128 bytes (16x8 bytes)
unused (spare?)    - 152 bytes (19x8 bytes)
                     ---
total                356 bytes

标头

00 00   - ?? start marker
64 01   - byte count (lsb/msb excludes header/trailer)
8e 0b   - checksum (lsb/msb excludes header/trailer)

控制器设置

00 30 00 00 00 00 07 00 00 00 00 00 00 00 07 04 10 04 00 00
                |     |           |     |
                |     |           |      -- host ID
                |     |           |
                |     |            --Removable Media Support
                |     |               0x00 = none
                |     |               0x01 = Bootable Device
                |     |               0x02 = All with Media
                |     |
                |      --flag bits 2
                |        0x00000001= scan order hi->low
                |            (default 0x00 - scan low->hi)
                    --flag bits 1
                    0x00000001 scam enable
                    0x00000010 parity enable
                    0x00000100 verbose boot msgs

剩余字节未知 - 在我当前的任何控制器设置中,它们似乎都不会更改。

53c810a 和 53c875 NVRAM 的默认设置相同(添加了可移动介质 Symbios BIOS 版本 4.09)

启动配置

由该表中设备的顺序设置的启动顺序

04 00 0f 00 00 10 00 50 00 00 01 00 00 62 -- 1st controller
04 00 03 00 00 10 00 58 00 00 01 00 00 63    2nd controller
04 00 01 00 00 10 00 48 00 00 01 00 00 61    3rd controller
00 00 00 00 00 00 00 00 00 00 00 00 00 00    4th controller
    |  |  |  |     |        |     |  |
    |  |  |  |     |        |      ---- PCI io port adr
    |  |  |  |     |         --0x01 init/scan at boot time
    |  |  |  |      --PCI device/function number (0xdddddfff)
    |  |   ----- ?? PCI vendor ID (lsb/msb)
        ----PCI device ID (lsb/msb)

?? use of this data is a guess but seems reasonable

剩余字节未知 - 在我当前的设置中,它们似乎都不会更改

53c810a 和 53c875 NVRAM 的默认设置相同

设备设置(最多 16 个设备 - 包括控制器)

0f 00 08 08 64 00 0a 00 - id 0
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00

0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00
0f 00 08 08 64 00 0a 00 - id 15
|     |  |  |     |  |
|     |  |  |      ----timeout (lsb/msb)
|     |  |   --synch period (0x?? 40 Mtrans/sec- fast 40) (probably 0x28)
|     |  |                  (0x30 20 Mtrans/sec- fast 20)
|     |  |                  (0x64 10 Mtrans/sec- fast )
|     |  |                  (0xc8  5 Mtrans/sec)
|     |  |                  (0x00  asynchronous)
|     |   -- ?? max sync offset (0x08 in NVRAM on 53c810a)
|     |                         (0x10 in NVRAM on 53c875)
|      --device bus width (0x08 narrow)
|                         (0x10 16 bit wide)
--flag bits
    0x00000001 - disconnect enabled
    0x00000010 - scan at boot time
    0x00000100 - scan luns
    0x00001000 - queue tags enabled

剩余字节未知 - 在我当前的设置中,它们似乎都不会更改

?? 此数据的用途是猜测,但似乎是合理的(但它可能是最大总线宽度)

53c810a NVRAM 的默认设置 53c875 NVRAM 的默认设置

  • 总线宽度 - 0x10

  • 同步偏移量? - 0x10

  • 同步周期 - 0x30

?? 备用设备空间(32 位总线 ??)

00 00 00 00 00 00 00 00  (19x8bytes)
.
.
00 00 00 00 00 00 00 00

53c810a 和 53c875 NVRAM 的默认设置相同

结尾

fe fe   - ? end marker ?
00 00
00 00

53c810a 和 53c875 NVRAM 的默认设置相同

17.3 Tekram NVRAM 布局

nvram 64x16 (1024 位)

驱动器设置

Drive ID 0-15 (addr 0x0yyyy0 = device setup, yyyy = ID)
            (addr 0x0yyyy1 = 0x0000)

    x x x x  x x x x  x x x x  x x x x
            | | |      | |  | | | |
            | | |      | |  | | |  ----- parity check   0 - off
            | | |      | |  | | |                       1 - on
            | | |      | |  | | |
            | | |      | |  | |  ------- sync neg       0 - off
            | | |      | |  | |                         1 - on
            | | |      | |  | |
            | | |      | |  |  --------- disconnect     0 - off
            | | |      | |  |                           1 - on
            | | |      | |  |
            | | |      | |   ----------- start cmd      0 - off
            | | |      | |                              1 - on
            | | |      | |
            | | |      |  -------------- tagged cmds    0 - off
            | | |      |                                1 - on
            | | |      |
            | | |       ---------------- wide neg       0 - off
            | | |                                       1 - on
            | | |
                --------------------------- sync rate      0 - 10.0 Mtrans/sec
                                                        1 -  8.0
                                                        2 -  6.6
                                                        3 -  5.7
                                                        4 -  5.0
                                                        5 -  4.0
                                                        6 -  3.0
                                                        7 -  2.0
                                                        7 -  2.0
                                                        8 - 20.0
                                                        9 - 16.7
                                                        a - 13.9
                                                        b - 11.9

全局设置

主机标志 0(地址 0x100000, 32)

x x x x  x x x x  x x x x  x x x x
| | | |  | | | |           | | | |
| | | |  | | | |            ----------- host ID    0x00 - 0x0f
| | | |  | | | |
| | | |  | | |  ----------------------- support for    0 - off
| | | |  | | |                          > 2 drives     1 - on
| | | |  | | |
| | | |  | |  ------------------------- support drives 0 - off
| | | |  | |                            > 1Gbytes      1 - on
| | | |  | |
| | | |  |  --------------------------- bus reset on   0 - off
| | | |  |                                power on     1 - on
| | | |  |
| | | |   ----------------------------- active neg     0 - off
| | | |                                                1 - on
| | | |
| | |  -------------------------------- imm seek       0 - off
| | |                                                  1 - on
| | |
| |  ---------------------------------- scan luns      0 - off
| |                                                    1 - on
| |
 -------------------------------------- removable      0 - disable
                                        as BIOS dev    1 - boot device
                                                       2 - all

主机标志 1(地址 0x100001, 33)

x x x x  x x x x  x x x x  x x x x
           | | |             | | |
           | | |              --------- boot delay     0 -   3 sec
           | | |                                       1 -   5
           | | |                                       2 -  10
           | | |                                       3 -  20
           | | |                                       4 -  30
           | | |                                       5 -  60
           | | |                                       6 - 120
           | | |
            --------------------------- max tag cmds   0 -  2
                                                       1 -  4
                                                       2 -  8
                                                       3 - 16
                                                       4 - 32

主机标志 2(地址 0x100010, 34)

x x x x  x x x x  x x x x  x x x x
                                 |
                                  ----- F2/F6 enable   0 - off ???
                                                       1 - on  ???

校验和(地址 0x111111)

校验和 = 0x1234 - (地址 0-63 的总和)


默认 nvram 数据

0x0037 0x0000 0x0037 0x0000 0x0037 0x0000 0x0037 0x0000
0x0037 0x0000 0x0037 0x0000 0x0037 0x0000 0x0037 0x0000
0x0037 0x0000 0x0037 0x0000 0x0037 0x0000 0x0037 0x0000
0x0037 0x0000 0x0037 0x0000 0x0037 0x0000 0x0037 0x0000

0x0f07 0x0400 0x0001 0x0000 0x0000 0x0000 0x0000 0x0000
0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0xfbbc

18. 对 Big Endian 的支持

PCI 本地总线主要为 x86 架构设计。因此,PCI 设备通常期望使用小端字节顺序的 DWORDS。

18.1 Big Endian CPU

为了支持大端架构上的 NCR 芯片,驱动程序每次都需要执行字节重排。此功能由 Cort <cort@cs.nmt.edu> 添加到驱动程序中,并且在 2.5 及更高版本的驱动程序中可用。目前,大端支持仅在 Linux/PPC (PowerPC) 上进行了测试。

18.2 大端模式下 NCR 芯片的操作

在 SYMBIOS 文档中可以了解到,某些芯片支持一种特殊的大端模式,理论上包括:53C815、53C825A、53C875、53C875N、53C895。这种操作模式不是软件可选的,而是需要将名为 BigLit 的引脚上拉。使用这种模式,当驱动程序在大端 CPU 上运行时,应该可以避免大多数的字节重排。理论上,驱动程序 2.5 版本也为该功能做好了准备。