6) 你還可以從Don的FTP站點(在howto中也提及了)獲取ne2k的診斷程序,看看你在啟動進入Linux後能否用它檢測你的網卡。使用“-p 0xNNN”選項告訴它在哪裡尋找你的網卡。(缺省情況下只檢測0x300,與啟動時的探測不同,不會檢測其它的地址。)在找到網卡時的輸出如下: -------------------------------------------------------------------------------- Checking the ethercard at 0x300. Register 0x0d (0x30d) is 00 Passed initial NE2000 probe, value 00. 8390 registers: 0a 00 00 00 63 00 00 00 01 00 30 01 00 00 00 00 SA PROM 0: 00 00 00 00 c0 c0 b0 b0 05 05 65 65 05 05 20 20 SA PROM 0x10: 00 00 07 07 0d 0d 01 01 14 14 02 02 57 57 57 57 NE2000 found at 0x300, using start page 0x40 and end page 0x80. -------------------------------------------------------------------------------- 你的注冊值和PROM值可能會不一樣。注意,對16比特網卡,所有PROM值都增加一倍,以太網卡地址(00:00:c0:b0:05:65)出現在第一行,加倍後的0x57標識出現在PROM的結尾。 在0x300處沒有安裝網卡時的輸出如下: -------------------------------------------------------------------------------- Checking the ethercard at 0x300. Register 0x0d (0x30d) is ff Failed initial NE2000 probe, value ff. 8390 registers: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff SA PROM 0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff SA PROM 0x10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff Invalid signature found, Wordlength 2. -------------------------------------------------------------------------------- 出現值0xff的原因是在讀取空I/O口時返回的就是該值。如果在檢測的區域內有其它硬件,你可以看到一些非0xff的值。 7) 嘗試在運行提供的DOS驅動程序或配置程序之後,從DOS啟動軟盤(通過loadlin)熱啟動進入Linux。這可能會進行一些額外的(即非標准的)“魔法”來初始化網卡。 8) 試一下Russ Nelson的ne2000.com包驅動程序,看它能否看見你的網卡 -- 如果還不行,事情就不大妙了。例如: A:> ne2000 0x60 10 0x300 所用參數為軟件中斷向量、硬件IRQ和I/O地址。你可以從任意的msdos存檔中的pktdrv11.zip裡找到它 -- 現在的版本大概是11以上了。 5 SMC Ultra/EtherEZ和WD80*3網卡的問題 問題:你得到了如下信息: eth0: bogus packet size: 65531, status=0xff, nXPg=0xff 原因:是共享內存的問題。 解決方案:最普遍的原因是配置的PCI機器沒有映射到ISA內存設備裡。因此你讀到的是PC的RAM(全都是0xff值),而不是存放接收數據包數據的網卡上的RAM。 另一個容易解決的典型問題是板卡沖突,在此區域有緩存或“shadow ROM”,或者你的ISA總線運行速度高於8Mhz。以太網卡上的內存失效的數目也令人驚奇,所以如果你的以太網卡有診斷程序的話,運行一下。 問題:SMC EtherEZ在非共享內存(PIO)模式下不工作。 原因:老版本的Ultra驅動程序只支持共享內存模式下的操作。 解決方案:版本2.0以上的內核所附驅動程序就支持可編程I/O模式的操作。升級到v2.0以上版本。 問題:老的wd8003或可跳線的wd8013總是得到錯誤的IRQ。 原因:老的wd8003網卡或可跳線的wd8013兼容卡沒有驅動程序可以從中讀取設置的IRQ的EEPROM。如果驅動程序無法讀到IRQ,就嘗試用auto-IRQ發現它。若auto-IRQ返回0,那麼驅動程序就給8比特網卡分配IRQ 5,或者為16比特網卡分配IRQ 16。 解決方案: 使auto-IRQ代碼無效,並在你的模塊配置文件(對於內建的驅動程序則通過啟動參數)告訴內核你把網卡跳成了什麼IRQ。 問題:SMC Ultra網卡被檢測成了wd8013,但IRQ和共享內存地址是錯的。 原因:Ultra網卡看起來跟wd8013很相象,如果內核裡沒有Ultra驅動程序,wd驅動程序就會把ultra誤認為wd8013。ultra檢測在wd之前,所以一般不會出問題。ultra在EEPROM保存的IRQ和內存地址與wd8013保存的位置不同,所以報告的值是假的。 解決方案:只保留需要的驅動程序重新編譯內核。如果你在同一台機器上同時使用wd和ultra網卡,並使用模塊,那麼首先載入ultra模塊就行了。 6 3Com網卡的問題 問題:3c503選擇了IRQ N,但其它設備也需要IRQ N。(比如CD ROM驅動程序、 modem等。)可以不編譯進內核就解決這個問題嗎? 解決方案:3c503驅動程序按照順序{5, 9/2, 3, 4}檢測空閒的IRQ線,從中找到一個未被使用的IRQ。在網卡被ifconfig操作配置時選擇中斷IRQ。 如果你使用的是模塊化的驅動程序,可以用模塊參數設置各種情況,包括中斷IRQ的值。 下面的語句選擇IRQ9、基址0x300、和if_port #1(外部收發器)。 io=0x300 irq=9 xcvr=1 如果驅動程序被編譯進了內核,你還可以通過LILO在啟動時傳遞參數來設置同樣的值。 LILO: linux ether=9,0x300,0,1,eth0 下面的語句選擇IRQ3、檢測基址、和缺省if_port #0(外部收發器)。 LILO: linux ether=3,0,0,0,eth0 問題:3c503: configured interrupt X invalid, will use autoIRQ. 原因:3c503網卡只能使用中斷IRQ{5, 2/9, 3, 4}中的一個(這些是網卡所能連接的中斷線。)如果你使用一個不在其中的IRQ值,就會得到如上的提示。一般情況下,沒必要為3c503指定中斷值。3c503會在ifconfig配置時使用autoIRQ,並從IRQ{5, 2/9, 3, 4}中選擇一個。 解決方案:使用上述的合法IRQ值,或者不指定IRQ以啟用autoIRQ。 問題:提供的3c503驅動程序無法使用AUI(粗纜以太網)端口。怎樣才能不使用缺省的細纜以太網端口而選擇AUI端口? 解決方案:3c503的AUI端口對於內建驅動程序可以在啟動時選擇,對於模塊化驅動程序可以在插入模塊時選擇。這一選擇會覆蓋未使用的dev->rmem_start變量的低比特位,所以啟動參數: LILO: linux ether=0,0,0,1,eth0 對內建在內核的驅動程序起作用。 要在載入模塊時指定AUI端口,只需把xcvr=1附加在模塊選項包含你的I/O和IRQ值的那一行就行了。。 7 非特定網卡的FAQs Linux與ISA的即插即用以太網卡 要獲得最佳效果(問題最少),推薦使用隨網卡附的程序(通常是DOS程序)取消PnP機制,並給網卡設置一個固定的I/O地址和IRQ。確定你使用的I/O地址在啟動時被驅動程序檢測到,如果使用模塊,則在/etc/conf.modules中使用io=選項提供地址。你也可以進入BIOS/CMOS設置,把IRQ從PnP改為Legacy-ISA(如果你的計算機有此選項的話)。 注意,運行基於DOS的配置程序一般並不需要安裝DOS。可以用DOS軟盤啟動,然後從提供的軟盤上運行它們就可以了。你可以自由地下載OpenDOS和FreeDOS。 如果需要使用PnP以與其它操作系統兼容,你就得每次啟動時都使用Linux的isapnptools包配置網卡。你還需要確定為網卡選擇的I/O地址被驅動程序檢測到,或用io=選項提供I/O地址。 啟動時沒有檢測到以太網卡 出現這個問題的常見原因是人們使用的內核不支持特定的網卡。對於模塊化的內核,這一般說明要求的模塊尚未被載入,或者需要用模塊選項指定其I/O地址。 如果你使用的是模塊化的內核,就象大多數用Linux發行版安裝的那樣,試著用一下該發行版的配置工具來選擇網卡所用模塊。對於ISA網卡一個較好的主意是,確定網卡的I/O地址,如果配置工具要求選項則把它作為一個選項(如io=0x340)加進去。如果沒有配置工具,那麼你需要在/etc/conf.modules裡添加正確的模塊名稱(及選項)-- 閱讀man modprobe以了解更多的細節。 如果你使用的發行版套件裡的預編譯內核,那麼查看文檔以確定你安裝的是哪一種內核,以及是否支持你所用的網卡。如果不支持的話,要麼試著找一個支持你網卡的內核,要麼自己生成一個內核。 只保留所需的驅動程序生成自己的內核是個聰明的主意,因為這會減小內核大小(為應用程序保留寶貴的RAM!),減少打擾敏感硬件的設備檢測數目。生成內核並不象聽起來那麼復雜。你只需要對一些有關你想要哪些驅動程序的問題回答是或不是,其它的事都由程序完成。 另一個主要原因是其它的設備占用了網卡所需的部分I/O空間。大多數網卡在I/O空間裡占用了16或32個字節。如果你的網卡設在0x300並要求32個字節,那麼驅動程序就要求0x300-0x31f。如果某個其它設備驅動程序注冊了哪怕其中一個端口,驅動程序就不會對該地址進行檢測,而是靜悄悄地進入下一個檢測地址。所以,在啟動之後,運行一下cat /proc/ioports以確定網卡要求的全部I/O空間都是空的。 還有一個問題就是網卡跳到的I/O地址不是缺省檢測的地址。每個驅動程序的檢測地址列表可以很容易地在驅動程序源碼中的文本注釋裡找到。即使網卡設定的I/O地址不在檢測地址列表上,你也可以在啟動時用ether=命令提供(對內建