問題:在用v2.0.x啟動時沒有檢測到PCI NE2000兼容網卡。
原因:在v2.0.30之前的ne.c驅動程序只知道基於RealTek 8029的兼容網卡的PCI ID號。在此只後才出現了使用其它PCI ID號的PCI NE2000兼容網卡,所以驅動程序無法檢測這些網卡。
解決方案:最簡單的方法是把Linux內核升級到v2.0.31以上版本。它可以識別五種不同的NE2000-PCI芯片的ID號,在啟動或載入模塊時自動檢測到它們。如果你升級到了2.0.34以上版本,會有一個比原先的ISA/PCI驅動程序稍小但更高效的PCI專用NE2000驅動程序。
問題:啟動時PCI NE2000兼容網卡被報告為ne1000(8比特網卡!)或者在v2.0.x下載入ne.o模塊不起作用。
原因:某些PCI兼容網卡不支持字節存取(因此不是百分之百的兼容NE2000)。這使檢測時被誤認為NE1000網卡。
解決方案:你需要升級到v2.0.31以上版本。現在的驅動程序會檢測到這種硬件Bug。
問題:PCI NE2000網卡的性能很差,即使按照性能技巧章節所說的減小了窗口大小。
原因:十多年前設計和出售的初始8390芯片的技術數據手冊上提到,為了得到最高的可靠性,在每次寫操作之前需要一個讀操作。驅動程序能夠輕易地做到這一點,但從v1.2內核時代起,缺省情況下取消了這一操作。有一個用戶報告說重新使用這一“錯誤的特性”就可以改善廉價的PCI NE2000兼容網卡的性能。
解決方案:由於只有一個用戶提出報告把它作為解決方案,不要對此寄予太大的希望。重新使用寫之前的讀操作可以簡單地編輯linux/drivers/net/下的驅動程序文件,取消包含NE_RW_BUGFIX的那一行的注釋,然後重建內核或載入相應的模塊。如果這樣確實有效,請給我發一封e-mail,描述性能上的差異和你所使用的網卡/芯片類型。(對ne2k-pci.c驅動程序也可以如法炮制。)
問題:ne2k-pci.c驅動程序對PCI NE2000網卡報告諸如timeout waiting for Tx RDC錯誤信息,無法正常工作。
原因:你的網卡或網卡到PCI總線的連接無法處理該驅動程序使用的長字I/O優化。
解決方案:首先,檢查BIOS/CMOS設置,看看與PCI總線相關的計時對於可靠的操作是否過於嚴格了。否則,使用ISA/PCI的ne.c驅動程序(或者刪除ne2k-pci.c中的#define USE_LONGIO),使你的網卡可用。
問題:沒檢測到ISA的即插即用NE2000網卡(如RealTek 8019)。
原因:初始的NE2000特性不支持即插即用,因此Linux的NE2000驅動程序也不支持即插即用。
解決方案:使用網卡所附的DOS配置盤取消PnP,並為該網卡設置一個指定的I/O地址和IRQ。在/etc/conf.modules裡增加這樣的一行options ne io=0xNNN,這裡0xNNN是你為網卡設置的16進制I/O地址。(假設你使用的是模塊化驅動程序;否則,在啟動時使用一個ether=0,0xNNN,eth0參數。你也可以進入BIOS/CMOS設置,把IRQ從PnP改為Legacy-ISA。如果你需要為兼容其它的操作系統而保留PnP設置,那麼你可以看一下isapnptools包。使用man isapnp看看它是否已經安裝在你的系統上了。如果沒有,浏覽一下下面的連接:SA PNP Tools
問題:在啟動檢測時NE*000驅動程序報告“not found (no reset ack)”。
原因:這跟上面所說的改動有關。在證實8390處於所檢測的I/O地址之後,進行重新設置。在網卡完成重新設置後,應當通知重新設置完成。你的網卡沒有通知,所以驅動程序認為不存在NE網卡。
解決方案:你可以在啟動時使用一個未被使用的mem_end16進制值0xbad,告訴驅動程序你有一個壞網卡。在使用0xbad撤消時你必須為網卡提供一個非零的I/O地址。例如,在0x340的網卡不響應重新設置,則使用如下方法:
LILO: linux ether=0,0x340,0,0xbad,eth0
這樣,即使你的網卡不響應重新設置,網卡檢測還能繼續下去。如果你是以模塊方式使用驅動程序,那麼可以象提供I/O地址一樣提供選項bad=0xbad。
問題:NE*000網卡使機器在第一次網絡訪問時死機。
原因:這個問題從早期的1.1.57內核到現在都出現過,而且只在有限的幾種軟件配置的兼容網卡上出現。看來是需要用某些特殊的方法來初始化它們。
解決方案:有幾個人報告在熱啟動(即loadlin或Ctrl-Alt-Del)Linux之前,運行提供的DOS軟件配置程序或提供的DOS驅動程序可以使網卡工作。這表明這些卡需要以某種特殊的方式初始化,與當前的Linux驅動程序稍有區別。
問題:在0x360的NE*000以太網卡沒有檢測到。
原因:你的NE2000網卡在I/O空間占據了0x20個字節,使它與0x378處的並口發生沖突。其它可能的設備是0x370處的第二個軟盤控制器(如果有的話),以及0x376--0x377處的第二個IDE控制器。如果該口已被其它驅動程序注冊,內核將不再進行檢測。
解決方案:把你的網卡移到0x280, 0x340, 0x320一類的地址,或者在編譯時不支持並行打印機。
問題:每次打印時網絡都斷開(NE2000)。
原因:與上一個問題相同,但你的內核比較老,不支持對重疊I/O區域的檢查。使用如上的解決方案,有空時獲取一個新的內核。
問題:沒檢測到0xNNN: 00 00 C5 ... 處的NE*000以太網卡。(非法標識yy zz)
原因:首先,你是否在地址0xNNN處有一個NE1000或NE2000網卡?如果有,報告的硬件地址是否象一個合法地址?如果是的話,那麼你的NE*000兼容網卡很差勁。所有的 NE*000兼容網卡都假定網卡上的SA PROM的第14和15字節為0x57。而你的網卡不是這樣 -- 它的值為“yy zz”。
解決方案:有兩種解決方法。最簡單的方法就是如上所述的“no reset ack” 解決方案,使用一個0xbad的mem_end值。這樣在提供一個非零的I/O地址時就可以忽略標識檢查。此方法無需重新編譯內核。
第二種方法(對黑客)需要修改驅動程序,並重新編譯內核(或模塊)。在驅動程序(/usr/src/linux/drivers/net/ne.c)的42行有一個“Hall of Shame”列表。這個表是用來檢測那些差勁的兼容網卡的。例如,DFI網卡在PROM的前三個字節使用“DFI”,而不是象要求的那樣在第14和15字節使用0x57。
問題:機器在啟動時出現“8390...”或“WD....”信息後死機。拔掉NE2000就好了。
解決方案:把你的NE2000地址改為0x340一類的地址。此外,你可以在和“ether=”參數一起使用“reserve=”啟動參數,保護網卡不受其它設備驅動程序檢測的影響。
原因:你的NE2000兼容網卡兼容性不好。一個激活的NE2000是個無底洞,會使其它的驅動程序陷在其空間內進行自動檢測。把NE2000改到一個不常用的地址就可以從其它的自動檢測中消除這一陷阱,機器也就可以啟動了。
問題:機器啟動時在進行SCSI檢測時死機。
原因:這個問題跟上面的一樣,改變以太網卡的地址,或使用reserve/ether啟動參數。
問題:機器啟動時在進行聲卡檢測時死機。
原因:不可能,實際上是發生在靜默方式的SCSI檢測過程中,與上面的問題一樣。
問題:啟動時檢測不到NE2000 - 根本就沒有啟動信息。
解決方案:因為造成檢測不到的原因很多,所以沒有“神奇的解決方案”。下面列出了可能有所幫助的一些措施。
1) 構建一個只包含需要的設備驅動程序的內核。證實你確實是從新內核啟動的。忘記運行lilo等會使你從老的內核啟動。(仔細觀察啟動時報告的構建時間/日期。)聽起來很明顯,但我們以前都犯過這個錯。通過檢查System.map文件裡ne_probe一類的名稱,確定驅動程序已包含在新的內核裡。
2) 仔細觀察啟動信息。看看它是否提及正在進行諸如“NE*000 probe at 0xNNN: not found (blah blah)”一類的ne2k檢測,或者就是靜悄悄地失敗了。這裡的區別很大。使用dmesgmore在登錄後浏覽啟動信息,或者在啟動完成顯示登錄提示符時使用Shift-PgUp卷回屏幕。
3) 啟動後,執行cat /proc/ioports,證實網卡要求的全部I/O空間是空的。如果網卡在0x300,那麼ne2k驅動程序要求的空間為0x300-0x31f。如果其它設備的驅動程序注冊了其中的一個口,就不會對該地址進行檢測,而是靜悄悄地檢測下一個要檢測的地址。常見的情況是lp驅動程序保留了0x378,或者第二個IDE通道保留了0x376,這就使ne驅動程序停止檢測0x360-0x380。
4) 與上面一樣執行cat /proc/interrupts。確定沒有其它設備注冊了你為以太網卡設置的中斷。這種情況下,檢測可以進行,以太網卡驅動程序會在啟動時大聲抱怨無法得到所要求的IRQ中斷線。
5) 如果你還為驅動程序靜悄悄地失敗而苦惱,那麼編輯並給檢測增加一些printk()。比如,對於ne2k,你可以在linux/drivers/net/ne.c中增加/刪除某些行(用 “+”或“-”表示),如下所示:
-------------------------------------------------------
int reg0 = inb_p(ioaddr);
+ printk("NE2k probe - now checking %x
",ioaddr);
- if (reg0 == 0xFF)
+ if (reg0 == 0xFF) {
+ printk("NE2k probe - got 0xFF (vacant I/O port)
");
return ENODEV;
+ }
----------------------------------