3Com Vortex 设备驱动程序

Andrew Morton

2000 年 4 月 30 日

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

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

唐不再是此版本驱动程序的主要维护者。请向以下一个或多个报告问题

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

自内核 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 双端口 A

  • 3c982 Hydra 双端口 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:中断中工作过多”。

hw_checksums=N1,N2,N3,...

最近的 3com 网卡能够在硬件中生成 IPv4、TCP 和 UDP 校验和。Linux 长期以来一直使用 Rx 校验和。“零复制”补丁计划用于 2.4 内核系列,允许您使用 NIC 的 DMA 散射/聚集和传输校验和。

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

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

如果您认为您的网卡应该执行 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 应用程序可用于唤醒挂起的计算机。

还启用了网卡的电源管理支持。

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 驱动程序站点获取

Donald Becker 的驱动程序开发站点

Donald 的 vortex-diag 程序对于检查网卡状态非常有用

Donald 的 mii-diag 程序可以用于检查和操作网卡的介质无关接口子系统

Donald 的网络唤醒 (wake-on-LAN) 页面

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

自动协商注意事项

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

Walter Wong <wcw+@CMU.EDU> 的思科互操作性说明

顺便说一句,添加 HAS_NWAY 似乎与思科 6509 交换机存在一个问题。具体来说,您需要将机器所连接的端口的生成树参数更改为 ‘portfast’ 模式。否则,协商将失败。我们已经注意到这个问题有一段时间了,但还没有时间去追踪它。

思科交换机(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 文件中。

  • 报告的内容会因问题而异。如果是内核崩溃,那么您应该参考 ‘报告问题’。

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

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

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

      eth0:3Com PCI 3c905C Tornado,地址 0xa400,00:50:da:6a:88:f0,IRQ 19,8K 字节宽 RAM,5:3 Rx:Tx 分割,自动选择/自动协商接口。MII 收发器在地址 24 找到,状态 782d。启用总线主控传输和全帧接收。

      注意:您必须提供 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. 当网卡出现故障时,运行上述命令。发送两组输出。

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