NCR53C8XX/SYM53C8XX 驱动程序

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

21 Rue Carnot

95170 DEUIL LA BARRE - FRANCE

1999 年 5 月 29 日

1. 简介

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

最初的驱动程序由以下人员为 386bsd 和 FreeBSD 编写:

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

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

  • 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/s

N

810A

N

N

FAST10

10 MB/s

815

N

FAST10

10 MB/s

N

825

FAST10

20 MB/s

N

825A

FAST10

20 MB/s

860

N

N

FAST20

20 MB/s

875

FAST20

40 MB/s

876

FAST20

40 MB/s

895

FAST40

80 MB/s

895A

FAST40

80 MB/s

896

FAST40

80 MB/s

897

FAST40

80 MB/s

1510D

FAST40

80 MB/s

1010

FAST80

160 MB/s

N

1010_66 [1]

FAST80

160 MB/s

N

其他支持功能的摘要

模块:

允许加载驱动程序

内存映射 I/O:

提高性能

分析信息:

从 proc SCSI 文件系统读取操作

控制命令:

写入 proc SCSI 文件系统

调试信息:

写入 syslog(仅限专家)

串行 NVRAM:

Symbios 和 Tekram 格式

  • 分散/聚集

  • 共享中断

  • 引导设置命令

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

3.1 优化的 SCSI 脚本

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

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

896 和 895A 允许从脚本处理相位不匹配上下文(避免相位不匹配中断,该中断会停止 SCSI 处理器,直到 C 代码保存传输的上下文)。如果不使用 LOAD/STORE 指令来实现这一点将是痛苦的,我什至不想尝试。

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

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

  • 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 设备不正确地支持标记命令队列。通常,修复此类问题的固件修订版可在各个供应商的 Web/ftp 站点上找到。我只能说,我机器上使用的硬盘在使用此驱动程序且启用了标记命令队列的情况下运行良好

  • IBM S12 0662

  • Conner 1080S

  • Quantum Atlas I

  • Quantum Atlas II

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

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

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 时使用的启发式方法可确保对性能的影响不会太大。您可以通过将详细级别设置为零来摆脱消息,如下所示

第 1 种方法

使用“ncr53c8xx=verb:0”选项启动系统。

第 2 种方法

启动后,将“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

已传输的 kbytes 数上面的示例:已传输 671 MB

num_disc

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

num_break

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

num_int

除“动态”之外的其他中断数上面的示例:1685 个非“动态”中断

num_fly

“动态”中断的数量上面的示例:18038 个“动态”中断

ms_setup

SCSI 命令设置的已用时间上面的示例:4.94 秒

ms_data

数据传输的已用时间上面的示例:369.94 秒用于数据传输

ms_disc

SCSI 断开连接的已用时间上面的示例:183.09 秒用于断开连接

ms_post

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

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

在上面的示例中,我们得到了 18038 个“动态”中断和仅 1673 个脚本中断,通常是由于分散列表段中的断开连接。

8. 控制命令

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

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

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

可用命令

8.1 设置最小同步周期因子

setsync <target> <period factor>

target:

目标编号

period:

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

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

  • 10 表示 25 纳秒同步周期

  • 11 表示 30 纳秒同步周期

  • 12 表示 50 纳秒同步周期

8.2 设置宽度大小

setwide <target> <size>

target:

目标编号

size:

0=8 位,1=16 位

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

settags <target> <tags>

target:

目标编号

tags:

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

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

setorder <order>

order:

3 个可能的值

simple

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

ordered

对所有操作使用 ORDERED TAG

default

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

8.5 设置调试模式

setdebug <list of debug flags>

可用调试标志

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> <flag>

target:目标编号

目前,只有一个标志可用

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

请勿指定任何标志以重置标志。例如

setflag 4

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

setflag all

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

8.8 设置详细级别

setverbose #level

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

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

resetdev <target>

target:

目标编号

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

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

cleardev <target>

target:

目标编号

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

(仅 SYM53C8XX 驱动程序支持,并提供用于测试目的)

9. 配置参数

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

CONFIG_SCSI_NCR53C8XX_IOMAPPED(默认答案:n)

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

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

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 和驱动程序,您可能需要启用此选项。

如果您的系统至少有一块基于 53C8XX 的 SCSI 板卡,并且具有特定于供应商的 BIOS,则不得启用此选项。例如,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 Mega-transfers/秒。

  • 设置 DEBUG_NEGO 标志。

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

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

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

每个字符串参数必须指定为“keyword:value”。只允许小写字符和数字。

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

命令序列

insmod sym53c8xx sym53c8xx=excl:0x1400
insmod ncr53c8xx

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

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 Mega-transfers/秒

#factor = 11

Ultra-2 SCSI 33 Mega-transfers/秒

#factor < 25

Ultra SCSI 20 Mega-transfers/秒

#factor < 50

Fast 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。但是,其中一些标志可能会生成大量的 syslog 消息。

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:<option bits>

可用选项位

0x0

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

0x1

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

0x2

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

0x4

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

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

10.2.18 串行 NVRAM

nvram:n

不查找串行 NVRAM

nvram:y

测试控制器是否存在板载串行 NVRAM

(备用二进制形式)mvram=<bits options>

0x01

查找 NVRAM(相当于 nvram=y)

0x02

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

0x04

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

0x08

忽略 NVRAM“在启动时扫描”参数

0x80

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

10.2.19 检查 SCSI 总线

buschk:<option bits>

可用选项位

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 启用 IMMEDIATE ARBITRATION 的使用

(仅受 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

Ultra 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:<option bits>

可用选项位

0x1

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

0x2

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

使用“pcifix:3”以允许驱动程序修复两个 PCI 功能。

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

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

此修复在我的先前系统上完美运行。(MB 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=<bits options>

0x01

查找 NVRAM(相当于 nvram=y)

0x02

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

0x04

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

0x08

忽略 NVRAM“在启动时扫描”参数

0x80

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

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

ncr53c8xx 始终尝试附加所有控制器。选项 0x80 未添加到 ncr53c8xx 驱动程序,因为据报道,它会使长期使用此驱动程序的用户感到困惑。如果您不希望在 Linux 启动时通过 ncr53c8xx 驱动程序附加控制器,则必须使用“excl”驱动程序启动选项。

10.6 SCSI 总线检查启动选项。

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

  • 仅安装 1 个终端器。

  • 终端器放置错误。

  • 劣质终端器。

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

10.7 IMMEDIATE ARBITRATION 启动选项

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

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

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

由于无法知道哪些设备正在尝试仲裁总线,因此使用此功能可能非常不公平。因此,不建议您启用它,或者最多仅在芯片丢失了先前的仲裁时启用此功能(启动选项“iarb:1”)。

此功能具有以下优点

  1. 允许 ID 为 7 的发起方在需要时赢得仲裁。

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

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

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

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

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

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 <target> <maxtags>”更改

SCSI_NCR_SETUP_DEFAULT_SYNC(默认:50)

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

可以使用“setsync <target> <period factor>”更改

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 <target> <period>”更改

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 位设备与 WIDE SCSI 控制器一起使用

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

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

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

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

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

发生这种情况时,芯片可能会在仅填充了传输中涉及的最后一个缓存行的部分之后完成写入并使无效命令,从而导致此缓存行的其余部分数据损坏。

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

唯一大于 8 个 DWORDS 且由 SCRIPTS 处理器移动的驱动程序内部数据结构是包含 SCSI 传输上下文的“CCB 标头”。此数据结构与 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 STATUS)

位 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. 对大端序的支持

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

18.1 大端序 CPU

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

18.2 NCR 芯片在大端序操作模式下

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