LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 839|回复: 0

Redhat6.2下COMPAQ老服务器PCnet32网卡不能识别的解决方案

[复制链接]
发表于 2004-6-11 18:56:04 | 显示全部楼层 |阅读模式
硬件环境:COMPAQ Prosignia VS server
CPU: 486DX66
内存:28M(原机只有8M内存,后又杂牌72线内存扩到28M,但不太兼容,不影响使用)
总线类型:EISA
SCSI卡:NCR53C710(io=0x8000, irq=11),该机无IDE接口
硬盘:Conner 1G + Seagate 2G SCSI硬盘,无光驱
网卡:内置NetFlex-L网卡(使用AMD PCnet-32 AM79C965KC芯片,io=0x8800,irq=10),3c509b-tpo

软件环境: Redhat Linux 6.2(没有安装X)
初始内核版本:2.2.14-5.0
升级后内核版本:2.2.24-6.2.3

故障:
试遍pcnet32、lance、tlan各种网卡驱动程序及参数配置,死活找不到内置的这块PCnet网卡。

解决办法:
实际上还是使用pcnet32.o这个驱动程序,而原来的驱动程序不认这块网卡的原因在于系统自带的pcnet32.o驱动只认pci的网卡,所以不接受传递过来的io及irq等参数,于是我按照网上的资料对pcnet32.c进行了修改,重新编译后终于将问题解决。希望这个解决办法对于有同样或者类似问题的朋友有一些启发。

我参考的网上链接:
1、PCNet32 driver patch (for 2.4.2 kernel)
注意:这个链接上提供了针对2.4.2 kernel的pcnet32.c的patch,我就是根据这个patch修改了kernel 2.2.24的pcnet32.c,但由于两个kernel中的pcnet32.c的源代码有很大的不同(主要是相关函数的参数有很大的差别),所以不能原样照搬。

2、Linux Cross Reference - Linux/drivers/net/pcnet32.c
主要从这个链接个参考了kernel 2.4.9的pcnet32.c源代码(因为找不到kernel 2.4.2的源代码,不过两个版本应该相差较小)。

我自己修改的kernel 2.2.24-6.2.3中pcnet32.c与原pcnet32.c(这里命名为pcnet32o.c)的patch文件:
#diff -durN /usr/src/linux-2.2.24/drivers/net/pcnet32o.c /usr/src/linux-2.2.24/drivers/net/pcnet32.c
--- pcnet32o.c        Thu Jun 10 13:40:44 2004
+++ pcnet32.c        Thu Jun 10 16:31:42 2004
@@ -1496,6 +1496,8 @@
#endif  /* HAVE_PRIVATE_IOCTL */
                                            
#ifdef MODULE
+MODULE_PARM(io, "i");
+MODULE_PARM(irq, "i");
MODULE_PARM(debug, "i");
MODULE_PARM(max_interrupt_work, "i");
MODULE_PARM(rx_copybreak, "i");
@@ -1507,6 +1509,8 @@
/* An additional parameter that may be passed in... */
static int debug = -1;
static int tx_start_pt = -1;
+static int io = 0;
+static int irq = 0;

int
init_module(void)
@@ -1515,7 +1519,12 @@
        pcnet32_debug = debug;
     if ((tx_start_pt >= 0) && (tx_start_pt <= 3))
        tx_start = tx_start_pt;
-   
+    if (io > 0x1ff) {
+        if (check_region(io, PCNET32_TOTAL_SIZE) == 0)
+            return pcnet32_probe1(NULL, io, irq, 0, 0);
+        else
+            return -ENODEV;
+    }
     pcnet32_dev = NULL;
     return pcnet32_probe(NULL);
}

使用gcc编译时的命令行:
gcc -D__KERNEL__ -I/usr/src/linux/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe -fno-strength-reduce -m386 -DCPU=386 -DMODULE -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h   -c -o pcnet32.o pcnet32.c

编译完成后,将编译生成的pcnet32.o复制到/lib/modules/2.4.22-6.2.3/net目录下覆盖原来的即可。

/etc/modules.conf中的相关配置:
alias eth0 3c509
alias eth1 pcnet32
options pcnet32 io=0x8800 irq=10

然后:
modprobe eth1

相关文件的本地下载:
COMPAQ Prosignia VS 内置pcnet32网卡在Redhat 6.2(kernel 2.2.24-6.2.3)下的解决方案

机器图片:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表