3Com Vortex 设备驱动程序¶
Andrew Morton
2000 年 4 月 30 日
本文档描述了 Linux 的 3Com “Vortex” 设备驱动程序 (3c59x.c) 的用法和勘误。
该驱动程序由 Donald Becker <becker@scyld.com> 编写
唐不再是此版本驱动程序的主要维护者。请向以下一个或多个报告问题
Andrew Morton
Netdev 邮件列表 <netdev@vger.kernel.org>
Linux 内核邮件列表 <linux-kernel@vger.kernel.org>
请注意本文档末尾的“报告和诊断问题”部分。
自内核 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 发行版)。
如果您的可以重现问题,那就太棒了。请尝试以下操作
增加调试级别。通常通过以下方式完成
modprobe driver debug=7
在 /etc/modprobe.d/driver.conf 中:options driver debug=7
使用较高的调试级别重现问题,将所有日志发送给维护人员。
从 Donald Becker 的网站 <http://www.scyld.com/ethercard_diag.html> 下载您网卡的诊断工具。同时下载 mii-diag.c。构建它们。
当网卡正常工作时,运行 ‘vortex-diag -aaee’ 和 ‘mii-diag -v’。保存输出。
当网卡出现故障时,运行上述命令。发送两组输出。
最后,请耐心并准备好做一些工作。您可能最终会为此问题工作一周或更长时间,因为维护人员会提出更多问题、要求进行更多测试、要求应用补丁等等。最后,问题甚至可能仍然无法解决。