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=命令提供(对内建