3Com Vortex 设备驱动程序

Andrew Morton

2000 年 4 月 30 日

本文档描述了 Linux 3Com “Vortex” 设备驱动程序 3c59x.c 的用法和勘误。

该驱动程序由 Donald Becker <becker@scyld.com> 编写

Don 不再是该驱动程序版本的主要维护者。请将问题报告给以下一个或多个地址:

请注意文件末尾的“报告和诊断问题”部分。

自内核 2.3.99-pre6 以来,此驱动程序包含了对 3c575 系列 Cardbus 卡的支持,该卡以前由 3c575_cb.c 处理。

此驱动程序支持以下硬件

  • 3c590 Vortex 10Mbps

  • 3c592 EISA 10Mbps Demon/Vortex

  • 3c597 EISA Fast Demon/Vortex

  • 3c595 Vortex 100baseTx

  • 3c595 Vortex 100baseT4

  • 3c595 Vortex 100base-MII

  • 3c900 Boomerang 10baseT

  • 3c900 Boomerang 10Mbps Combo

  • 3c900 Cyclone 10Mbps TPO

  • 3c900 Cyclone 10Mbps Combo

  • 3c900 Cyclone 10Mbps TPC

  • 3c900B-FL Cyclone 10base-FL

  • 3c905 Boomerang 100baseTx

  • 3c905 Boomerang 100baseT4

  • 3c905B Cyclone 100baseTx

  • 3c905B Cyclone 10/100/BNC

  • 3c905B-FX Cyclone 100baseFx

  • 3c905C Tornado

  • 3c920B-EMB-WNM (ATI Radeon 9100 IGP)

  • 3c980 Cyclone

  • 3c980C Python-T

  • 3cSOHO100-TX Hurricane

  • 3c555 Laptop Hurricane

  • 3c556 Laptop Tornado

  • 3c556B Laptop Hurricane

  • 3c575 [Megahertz] 10/100 LAN CardBus

  • 3c575 Boomerang CardBus

  • 3CCFE575BT Cyclone CardBus

  • 3CCFE575CT Tornado CardBus

  • 3CCFE656 Cyclone CardBus

  • 3CCFEM656B Cyclone+Winmodem CardBus

  • 3CXFEM656C Tornado+Winmodem CardBus

  • 3c450 HomePNA Tornado

  • 3c920 Tornado

  • 3c982 Hydra Dual Port A

  • 3c982 Hydra Dual Port B

  • 3c905B-T4

  • 3c920B-EMB-WNM Tornado

模块参数

加载模块时,可以为驱动程序提供几个参数。 这些参数通常放置在 /etc/modprobe.d/*.conf 配置文件中。 例如

options 3c59x debug=3 rx_copybreak=300

如果您使用的是 PCMCIA 工具 (cardmgr),则选项可以放置在 /etc/pcmcia/config.opts 中

module "3c59x" opts "debug=3 rx_copybreak=300"

支持的参数有

debug=N

其中 N 是 0 到 7 之间的数字。任何高于 3 的值都会在系统日志中产生大量输出。 debug=1 是默认值。

options=N1,N2,N3,...

列表中的每个数字都为相应的网卡提供一个选项。 因此,如果您有两张 3c905 卡,并且希望为它们提供选项 0x204,则可以使用

options=0x204,0x204

各个选项由多个位域组成,这些位域具有以下含义

可能的媒体类型设置

0

10baseT

1

10Mbs AUI

2

未定义

3

10base2 (BNC)

4

100base-TX

5

100base-FX

6

MII(媒体独立接口)

7

使用 EEPROM 中的默认设置

8

自动协商

9

外部 MII

10

使用 EEPROM 中的默认设置

在为 “options” 设置生成值时,可以将上述媒体选择值与以下值进行 OR 运算(或添加到):

0x8000

将驱动程序调试级别设置为 7

0x4000

将驱动程序调试级别设置为 2

0x0400

启用局域网唤醒

0x0200

强制全双工模式。

0x0010

总线主控启用位(仅限旧 Vortex 卡)

例如

insmod 3c59x options=0x204

将强制全双工 100base-TX,而不是允许通常的自动协商。

global_options=N

为机器中的所有 3c59x NIC 设置 options 参数。 上面 options 数组中的条目将覆盖此设置。

full_duplex=N1,N2,N3...

类似于 “options” 的第 9 位。 强制相应的卡进入全双工模式。 请优先使用此参数,而不是 options 参数。

事实上,请不要使用它! 最好让自动协商正常工作。

global_full_duplex=N1

为机器中的所有 3c59x NIC 设置全双工模式。 上面 full_duplex 数组中的条目将覆盖此设置。

flow_ctrl=N1,N2,N3...

使用 802.3x MAC 层流量控制。 3com 卡仅支持 PAUSE 命令,这意味着如果它们收到来自链路伙伴的 PAUSE 帧,它们将停止发送数据包一小段时间。

驱动程序仅允许在以全双工模式运行的链路上进行流量控制。

此功能似乎不适用于 3c905 - 仅测试了 3c905B 和 3c905C。

3com 卡似乎只响应发送到 01:80:c2:00:00:01 保留目标地址的 PAUSE 帧。 它们不接受发送到站点 MAC 地址的 PAUSE 帧。

rx_copybreak=M

驱动程序预分配 32 个全尺寸(1536 字节)网络缓冲区用于接收。 当数据包到达时,驱动程序必须决定是将数据包保留在其全尺寸缓冲区中,还是分配一个较小的缓冲区并将数据包复制到其中。

这是一种速度/空间权衡。

rx_copybreak 的值用于决定何时进行复制。 如果数据包大小小于 rx_copybreak,则复制数据包。 rx_copybreak 的默认值为 200 字节。

max_interrupt_work=N

驱动程序的中断服务例程可以在一次调用中处理许多接收和发送数据包。 它在一个循环中完成此操作。 max_interrupt_work 的值控制中断服务例程循环的次数。 默认值为 32 个循环。 如果超出此值,中断服务例程将放弃并生成警告消息 “eth0: Too much work in interrupt”。

hw_checksums=N1,N2,N3,...

最近的 3com NIC 能够在硬件中生成 IPv4、TCP 和 UDP 校验和。 Linux 已经使用了 Rx 校验和很长时间了。 计划用于 2.4 内核系列的“零复制”补丁允许您使用 NIC 的 DMA 散布/收集和传输校验和。

该驱动程序已设置好,以便在应用 zerocopy 补丁后,所有 Tornado 和 Cyclone 设备都将使用 S/G 和 Tx 校验和。

已提供此模块参数,因此您可以覆盖此决定。 如果您认为 Tx 校验和导致问题,则可以使用 hw_checksums=0 禁用该功能。

如果您认为您的 NIC 应该执行 Tx 校验和,但驱动程序未启用它,则可以使用 hw_checksums=1 强制使用硬件 Tx 校验和。

驱动程序会在日志文件中删除一条消息,以指示它是否使用硬件散布/收集和硬件 Tx 校验和。

散布/收集和硬件校验和为 sendfile() 系统调用提供了相当大的性能改进,但 send() 的吞吐量略有下降。 对接收效率没有影响。

compaq_ioaddr=N, compaq_irq=N, compaq_device_id=N

“解决 Compaq PCI BIOS32 问题的变量”....

watchdog=N

设置内核确定发送器已卡住并需要重置的时间(以毫秒为单位)。 这主要用于调试目的,尽管在冲突率非常高的 LAN 上增加此值可能是有利的。 默认值为 5000(5.0 秒)。

enable_wol=N1,N2,N3,...

为相关接口启用局域网唤醒支持。 Donald Becker 的 ether-wake 应用程序可用于唤醒挂起的计算机。

还启用 NIC 的电源管理支持。

global_enable_wol=N

为机器中的所有 3c59x NIC 设置 enable_wol 模式。 上面 enable_wol 数组中的条目将覆盖此设置。

媒体选择

许多较旧的 NIC(例如 3c590 和 3c900 系列)都具有 10base2 和 AUI 接口。

在 2001 年 1 月之前,如果此驱动程序未检测到 10baseT 端口上的活动,它将自动选择 10base2 或 AUI 端口。 然后它会卡在 10base2 端口上,并且需要重新加载驱动程序才能切换回 10baseT。 无法使用模块选项覆盖来阻止此行为。

更高版本(当前版本)的驱动程序_确实_支持锁定媒体类型。 因此,如果您使用以下命令加载驱动程序模块

modprobe 3c59x options=0

它将永久选择 10baseT 端口。 不会发生自动选择其他媒体类型的情况。

传输错误,Tx 状态寄存器 82

这是一个常见的错误,几乎总是由同一网络上的另一台主机处于全双工模式,而此主机处于半双工模式引起的。 您需要找到另一台主机并使其以半双工模式运行,或者修复此主机以全双工模式运行。

作为最后的手段,您可以使用以下命令强制 3c59x 驱动程序进入全双工模式

options 3c59x full_duplex=1

但这必须被视为损坏的网络设备的解决方法,并且只应真正用于无法自动协商的设备。

其他资源

设备驱动程序实现的详细信息位于源文件的顶部。

其他文档可在 Don Becker 的 Linux Drivers 站点上找到

Donald Becker 的驱动程序开发站点

Donald 的 vortex-diag 程序可用于检查 NIC 的状态

Donald 的 mii-diag 程序可用于检查和操作 NIC 的媒体独立接口子系统

Donald 的局域网唤醒页面

3Com 的基于 DOS 的应用程序,用于设置 NIC 的 EEPROM

自动协商注意事项

如果链路已启动,驱动程序使用一分钟的心跳来适应外部 LAN 环境的变化,如果链路已关闭,则使用 5 秒的心跳。 这意味着,例如,当一台机器从集线器 10baseT LAN 拔下并插入到交换 100baseT LAN 时,吞吐量将在长达 60 秒的时间内非常糟糕。 请耐心等待。

来自 Walter Wong <wcw+@CMU.EDU> 的 Cisco 互操作性说明

另一方面,添加 HAS_NWAY 似乎与 Cisco 6509 交换机共享一个问题。 具体来说,您需要将机器插入的端口的生成树参数更改为 “portfast” 模式。 否则,协商将失败。 这是我们注意到一段时间的问题,但没有时间进行跟踪。

Cisco 交换机(Jeff Busch <jbusch@deja.com>)

我的 “标准配置”,用于 PC/服务器直接连接的端口

interface FastEthernet0/N
description machinename
load-interval 30
spanning-tree portfast

如果自动协商存在问题,您可能还需要指定 “speed 100” 和 “duplex full”(或 “speed 10” 和 “duplex half”)。

警告:不要将集线器/交换机/网桥连接到这些特殊配置的端口! 交换机将会变得非常困惑。

报告和诊断问题

维护人员发现准确和完整的问题报告对于解决驱动程序问题非常宝贵。 我们经常无法重现问题,并且必须依靠您的耐心和努力来弄清楚问题的根源。

如果您认为您有驱动程序问题,以下是您应该采取的一些步骤

  • 这真的是驱动程序问题吗?

    消除一些变量:尝试不同的卡、不同的计算机、不同的电缆、交换机/集线器上的不同端口、不同版本的内核或驱动程序等。

  • 好的,这是一个驱动程序问题。

    您需要生成一份报告。 通常,这是发送给维护人员和/或 netdev@vger.kernel.org 的电子邮件。 维护人员的电子邮件地址将在驱动程序源或 MAINTAINERS 文件中。

  • 您的报告的内容将因问题而异。 如果是内核崩溃,则应参考 “报告问题”。

    但对于大多数问题,提供以下信息很有用

    • 内核版本,驱动程序版本

    • 驱动程序初始化时生成的横幅消息的副本。 例如

      eth0: 3Com PCI 3c905C Tornado at 0xa400, 00:50:da:6a:88:f0, IRQ 19 8K byte-wide RAM 5:3 Rx:Tx split, autoselect/Autonegotiate interface. MII transceiver found at address 24, status 782d. Enabling bus-master transmits and whole-frame receives.

      注意:您必须提供 debug=2 modprobe 选项才能生成完整的检测消息。 请这样做

      modprobe 3c59x debug=2
      
    • 如果是 PCI 设备,则来自 “lspci -vx” 的相关输出,例如

      00:09.0 Ethernet controller: 3Com Corporation 3c905C-TX [Fast Etherlink] (rev 74)
              Subsystem: 3Com Corporation: Unknown device 9200
              Flags: bus master, medium devsel, latency 32, IRQ 19
              I/O ports at a400 [size=128]
              Memory at db000000 (32-bit, non-prefetchable) [size=128]
              Expansion ROM at <unassigned> [disabled] [size=128K]
              Capabilities: [dc] Power Management version 2
      00: b7 10 00 92 07 00 10 02 74 00 00 02 08 20 00 00
      10: 01 a4 00 00 00 00 00 db 00 00 00 00 00 00 00 00
      20: 00 00 00 00 00 00 00 00 00 00 00 00 b7 10 00 10
      30: 00 00 00 00 dc 00 00 00 00 00 00 00 05 01 0a 0a
      
    • 环境的描述:10baseT? 100baseT? 全/半双工? 交换或集线?

    • 您可能正在为驱动程序提供的任何其他模块参数。

    • 生成的任何内核日志。 越多越好。 如果这是一个大文件并且您要将您的报告发送到邮件列表,请提及您有日志文件,但不要发送它。 如果您直接向维护人员报告,则只需发送它即可。

      为确保所有内核日志都可用,请将以下行添加到 /etc/syslog.conf

      kern.* /var/log/messages
      

      然后使用以下命令重新启动 syslogd

      /etc/rc.d/init.d/syslog restart
      

      (以上可能因您使用的 Linux 发行版而异)。

    • 如果您的问题可以重现,那太好了。 尝试以下操作

      1. 提高调试级别。 通常,这通过以下方式完成

        1. modprobe driver debug=7

        2. 在 /etc/modprobe.d/driver.conf 中: options driver debug=7

      2. 使用更高的调试级别重现问题,将所有日志发送给维护人员。

      3. 从 Donald Becker 的网站 <http://www.scyld.com/ethercard_diag.html> 下载您的卡诊断工具。 同时下载 mii-diag.c。 构建这些。

        1. 当卡正常工作时,运行 “vortex-diag -aaee” 和 “mii-diag -v”。 保存输出。

        2. 当卡发生故障时,运行上述命令。 发送两组输出。

最后,请耐心并准备好做一些工作。 您最终可能会花一周或更长时间来解决此问题,因为维护人员会提出更多问题、要求进行更多测试、要求应用补丁等。最后,问题甚至可能仍然无法解决。