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. 當卡發生故障時,執行上述命令。 傳送兩組輸出。

最後,請耐心並準備好做一些工作。 您最終可能會花一週或更長時間來解決此問題,因為維護人員會提出更多問題、要求進行更多測試、要求應用補丁等。最後,問題甚至可能仍然無法解決。