本节描述了 PCMCIA 子系统一些最常见的故障模式。尝试将您的症状与示例进行匹配。本节仅描述不特定于特定客户端驱动程序或卡类型的常见故障。
在尝试诊断问题之前,您必须知道系统日志的保存位置(请参阅关于特定 Linux 发行版的说明)。您还应该熟悉基本的诊断工具,如 dmesg
和 lsmod
。此外,请注意,大多数驱动程序组件(包括所有内核模块)都有自己的独立手册页。
在 3.1.15 及更高版本中,PCMCIA 源代码树的 debug-tools
子目录中有一些脚本,可以帮助诊断一些最常见的配置问题。test_setup
脚本检查您的 PCMCIA 安装是否完整。test_network
和 test_modem
脚本将尝试诊断 PCMCIA 网络卡和调制解调器卡的问题。如果您不熟悉 Linux 并且不确定如何解决问题,这些脚本会特别有帮助。
尝试尽可能精确地定义您的问题。如果您有多张卡,请分别尝试每张卡,以及不同的组合。尝试冷启动 Linux,以及从 Windows 热启动。比较启动时插入卡,以及启动后插入卡。如果您通常在笔记本电脑连接底座时使用,请尝试在未连接底座时使用。有时,两个插槽的行为会有所不同。
为了调试设备配置脚本中的问题,使用 ``-v
'' 选项启动 cardmgr
可能会很有用。对于 3.1.23 或更高版本的 PCMCIA 软件包,这将导致大多数重要的脚本操作记录在系统日志中。
尝试通过 PCMCIA 设备安装 Linux 时遇到的驱动程序问题几乎不可能调试。即使您可以根据症状识别问题,安装盘也很难修改,尤其是在无法访问正在运行的 Linux 系统的情况下。安装盘的自定义完全取决于 Linux 发行版的选择,并且超出了本文档的范围。一般来说,最好的做法是使用其他方式安装 Linux,获取最新的驱动程序,然后在问题仍然存在时进行调试。
症状
lsmod
不显示任何 PCMCIA 模块。cardmgr
在系统日志中报告 ``/proc/devices
中没有 pcmcia 驱动程序''。内核模块包含版本信息,模块加载时会针对当前内核检查这些信息。检查类型取决于 CONFIG_MODVERSIONS
内核选项的设置。如果此选项为 false,则内核版本号会被编译到每个模块中,并且 insmod
会检查它是否与正在运行的内核匹配。如果 CONFIG_MODVERSIONS
为 true,则内核导出的每个符号都会被赋予一种校验和。这些代码都会与编译到模块中的相应代码进行比较。这样做的目的是使模块对版本的依赖性降低,因为只有在内核接口发生更改时校验和才会更改,并且通常会在次要内核更新中保持不变。但在实践中,校验和反而更具限制性,因为许多内核接口都依赖于编译时内核选项设置。此外,事实证明,校验和对兼容性的判断过于悲观。
实际结果是,内核模块与内核版本以及许多内核配置选项的设置紧密相关。一般来说,为某个 2.2.19 内核编译的一组模块不会加载到另一个 2.2.19 内核上,除非特别注意确保两者使用相似的配置构建。这使得预编译内核模块的发布成为一项棘手的业务。
您有以下几个选项
Documentation/Changes
文件中列出的模块实用程序和 binutils 的“最低要求”。
症状
pcmcia_core
, ds
, i82365
) 加载正确。cardmgr
在系统日志中报告版本不匹配错误。一些驱动程序模块需要内核服务,这些服务可能存在也可能不存在,具体取决于内核配置。例如,SCSI 卡驱动程序要求内核配置了 SCSI 支持,而网络驱动程序需要网络内核。如果内核缺少必要的功能,insmod
可能会报告未定义的符号并拒绝加载特定模块。请注意,insmod
错误消息不区分版本不匹配错误和缺少符号错误。
具体来说
serial_cs
要求内核串行驱动程序启用 CONFIG_SERIAL
。此驱动程序可以构建为模块。CONFIG_SERIAL_SHARE_IRQ
。CONFIG_SCSI
,以及相应的顶层驱动程序选项(对于 2.2 及更高版本的内核,为 CONFIG_BLK_DEV_SD
、CONFIG_BLK_DEV_SR
等)。这些可以构建为模块。CONFIG_INET
。内核网络支持不能编译为模块。CONFIG_TR
。有两种方法可以继续
/etc/pcmcia/config
以预加载这些模块。/etc/pcmcia/config
文件可以指定需要为特定客户端加载的其他模块。例如,对于串行驱动程序,可以使用
device "serial_cs"
class "serial" module "misc/serial", "serial_cs"
模块路径是相对于当前内核版本的顶层模块目录指定的;如果未给出相对路径,则路径默认为 pcmcia
子目录。
症状
在识别主机控制器类型后,套接字驱动程序会探测空闲的 ISA 总线中断。探测包括为每个看似空闲的中断编程控制器,然后生成一个“软”中断,以查看是否可以正确检测到该中断。在某些 cases, 探测特定中断可能会干扰另一个系统设备。
探测的原因是识别那些看似空闲的中断(即,未被任何其他 Linux 设备驱动程序保留),但要么未物理连接到主机控制器,要么连接到没有驱动程序的另一个设备。
在系统日志中,成功的探测可能如下所示
Intel PCIC probe:
TI 1130 CardBus at mem 0x10211000, 2 sockets
...
ISA irqs (scanned) = 5,7,9,10 status change on irq 10
有两种方法可以继续
irq_list
参数将 ISA 中断探测限制为中断列表。例如,“irq_list=5,9,10
”会将扫描限制为三个中断。所有 16 位 PCMCIA 设备都将被限制为使用这些中断(假设它们通过探测)。您可能需要通过反复试验来找出哪些中断可以安全地探测。do_scan=0
'' 选项加载套接字驱动程序来完全禁用中断探测。在这种情况下,将使用默认中断列表,该列表仅避免已分配给其他设备的中断。在任何一种情况下,都可以使用 PCMCIA 启动脚本中的 PCIC_OPTS
定义来指定探测选项,例如
PCIC_OPTS="irq_list=5,9,10"
应该注意的是,在诊断中断探测问题时,/proc/interrupts
完全没用。探测足够明智,永远不会尝试使用已被另一个 Linux 驱动程序使用的中断。因此,PCMCIA 驱动程序已经使用了 /proc/interrupts
中的所有信息。根据系统设计,即使设备处于非活动状态,如果为 PCMCIA 探测它,仍然可能占用中断并引起麻烦。
症状
cardmgr
时,系统会锁定。对于 3.1.24,即使没有插入卡也会发生锁定;对于 3.1.25,必须插入卡。当 cardmgr
处理 /etc/pcmcia/config.opts
中列出的 IO 端口范围时,内核会探测这些范围以检测占用 IO 空间但未与 Linux 驱动程序关联的潜在设备。探测是只读的,但在极少数 cases, 从设备读取可能会干扰重要的系统功能,从而导致锁定。
您的系统用户指南可能包含系统设备映射,显示其 IO 和内存范围。这些可以在 config.opts
中显式排除。
或者,如果探测在您的系统上不可靠,可以通过将 CORE_OPTS
设置为 ``probe_io=0
'' 来禁用它。在这种情况下,您应该非常小心,仅在 config.opts
中指定真正可用的端口范围,而不是使用默认设置。
症状
或者,或者
核心模块在首次插入 16 位卡时执行内存扫描。此扫描可能会干扰其他内存映射设备。此外,3.0.0 之前的驱动程序包执行的扫描比更新的驱动程序更具侵略性。内存窗口在 /etc/pcmcia/config.opts
中定义。默认窗口很大,因此将扫描限制在较窄的范围内可能会有所帮助。可以尝试的合理范围包括 0xd0000-0xdffff、0xc0000-0xcffff、0xc8000-0xcffff 或 0xd8000-0xdffff。
如果您有 DOS 或 Windows PCMCIA 驱动程序,您或许可以推断出这些驱动程序使用的内存区域。请注意,DOS 内存地址通常以“段”形式指定,这会省略最后一个十六进制数字(因此,绝对地址 0xd0000 可能表示为 0xd000)。在更改 config.opts
时,请务必添加回额外的数字。
更改影响设备映射方式的 BIOS 设置有时可能很有用。尝试更改 BIOS 阴影或“即插即用操作系统支持”的设置。
在不常见的 cases, 内存探测失败可能表明主机控制器的时序寄存器设置存在问题。有关处理常见时序问题的信息,请参阅启动选项部分。这实际上只适用于 ISA 到 PCMCIA 总线桥接器。
cs: 警告:没有可用的高内存空间!
CardBus 桥接器可以在 ISA 总线架构中的 640KB-1MB “内存空洞”之外分配内存窗口。通常,最好将 CardBus 桥接器配置为使用高内存窗口,因为这些窗口不太可能与其他设备冲突。此外,CardBus 卡可能需要较大的内存窗口,这可能很难或不可能放入低内存中。如果 config.opts
中同时定义了低内存窗口和高内存窗口,Card Services 将优先在高内存中为 CardBus 桥接器分配窗口。默认的 config.opts
包括几个候选的高内存窗口,其中一个在大多数情况下都可以工作。
症状
在大多数 cases, 套接字驱动程序(i82365
或 tcic
)将自动探测并选择适当的中断来指示卡状态更改。自动中断探测在某些 Intel 兼容控制器上不起作用,包括 Cirrus 芯片和某些 IBM ThinkPad 中使用的芯片。如果设备在探测时处于非活动状态,则其中断也可能显示为可用。在这些 cases, 套接字驱动程序可能会选择被另一个设备使用的中断。
对于 i82365
和 tcic
驱动程序,可以使用 irq_list
选项来限制将要测试的中断。此列表限制了 PCMCIA 卡可以使用的中断集,以及用于监视卡状态更改的中断集。cs_irq
选项也可以用于显式设置用于监视卡状态更改的中断。
如果您找不到可用的中断号,还有一种轮询状态模式:i82365
和 tcic
都接受 poll_interval=100
选项,以每秒轮询一次卡状态更改。如果您的系统可用于 PCMCIA 卡的中断短缺,也应使用此选项。特别是对于具有多个主机控制器的系统,专门使用中断来监视卡状态更改意义不大。
所有这些选项都应在 PCIC_OPTS=
行中设置,位于 /etc/rc.d/rc.pcmcia
或 /etc/sysconfig/pcmcia
中,具体取决于您的站点设置。
症状
最简单的中断传递问题是由于与其他系统设备冲突造成的。这些通常可以通过在 /etc/pcmcia/config.opts
中排除问题中断来解决。要测试,只需逐个排除中断,直到问题得到解决或您用完中断。如果所有中断都不起作用,那么设备冲突可能不是问题所在。
对于 CardBus 桥接器,可能会出现各种其他中断传递问题。有关完整讨论,请参阅PCI 中断传递问题。
症状
RequestIO: Resource in use
RequestIRQ: Resource in use
RequestWindow: Resource in use
GetNextTuple: No more items
could not allocate nn IO ports for CardBus socket n
could not allocate nnK memory for CardBus socket n
could not allocate interrupt for CardBus socket n
中断匮乏通常表明中断探测存在问题(请参阅中断扫描失败)。在某些 cases, 探测似乎可以工作,但只报告一个或两个可用的中断。检查您的系统日志,看看扫描结果是否合理。禁用探测并手动选择中断应该会有所帮助。
如果中断探测工作不正常,即使中断太少不适合这样做,套接字驱动程序也可能会分配一个中断来监视卡插入。您可以通过将 PCIC_OPTS
设置为 ``poll_interval=100
'' 将控制器切换到轮询模式。或者,如果您有 CardBus 控制器和旧版本的 PCMCIA 驱动程序,请尝试 ``pci_csc=1
'',它会选择一个 PCI 中断(如果可用)用于卡状态更改。
在某些 cases, 内核配置错误也可能导致明显的中断短缺。在 2.4 及更高版本的内核上,如果未启用 CONFIG_ISA
,则 PCMCIA 驱动程序将假定没有可用的 ISA 总线中断。
IO 端口匮乏不太常见,但有时发生在需要大片连续、对齐的 IO 端口空间区域,或者仅识别少数特定 IO 端口位置的卡上。/etc/pcmcia/config.opts
中的默认 IO 端口范围通常足够,但可以扩展。如果这是问题所在,请尝试取消注释 config.opts
中的 ``include port 0x1000-0x17ff
'' 行。在极少数 cases, 匮乏可能表明 IO 端口探测失败(请参阅IO 端口扫描失败)。
使用 config.opts
中的默认内存窗口设置,内存匮乏也不常见。CardBus 卡可能比典型的 16 位卡需要更大的内存区域。由于 CardBus 内存窗口可以映射到主机 PCI 地址空间中的任何位置(而不仅仅是 PC 系统中的 640K-1MB “空洞”中),因此在高内存中指定大内存窗口很有帮助,例如 0xa0000000-0xa0ffffff。
症状
这通常表明与 Linux 不知道的系统设备存在资源冲突。PCMCIA 设备是动态配置的,因此,例如,中断是根据需要分配的,而不是专门分配给特定卡或插槽。给定一个看似可用的资源列表,卡会按照配置顺序分配资源。在这种情况下,最后配置的卡被分配了一个实际上并不空闲的资源。
检查系统日志,查看无法工作的卡使用了哪些资源。在 /etc/pcmcia/config.opts
中排除这些资源,并重新启动 cardmgr
守护程序以重新加载资源数据库。
症状
这表明卡已成功识别,但是,cardmgr
由于某种原因无法完成配置过程。最可能的原因是卡设置脚本中的某个步骤被阻止。一个很好的例子是,如果插入了没有实际网络连接的网络卡,则网络脚本会阻塞。
要查明问题所在,您可以手动运行设置脚本以查看它在哪里阻塞。脚本位于 /etc/pcmcia
目录中。它们接受两个参数:设备名称和操作。cardmgr
守护程序在系统日志中记录配置命令。例如,如果系统日志显示命令 ``./network start eth0
'' 是 cardmgr
执行的最后一个命令,则以下命令将跟踪脚本
sh -x /etc/pcmcia/network start eth0