AR8132网卡的Linux版驱动可以在Atheros的官方站点上下载到,Readme中说可以支持2.6x的内核。于是我按照Reame上的步骤进行安装,结果报错了。
/root/driver/src/atl1c_main.c: In function ‘atl1c_set_rxbufsize’: /root/driver/src/atl1c_main.c:438: error: implicit declaration of function ‘roundup’ /root/driver/src/atl1c_main.c: In function ‘atl1c_cal_tpd_req’: /root/driver/src/atl1c_main.c:2027: error: ‘SKB_GSO_TCPV6’ undeclared (first use in this function) /root/driver/src/atl1c_main.c:2027: error: (Each undeclared identifier is reported only once /root/driver/src/atl1c_main.c:2027: error: for each function it appears in.) /root/driver/src/atl1c_main.c: In function ‘atl1c_tso_csum’: /root/driver/src/atl1c_main.c:2076: error: ‘SKB_GSO_TCPV6’ undeclared (first use in this function) /root/driver/src/atl1c_main.c: In function ‘atl1c_init_netdev’: /root/driver/src/atl1c_main.c:2697: error: ‘NETIF_F_TSO6’ undeclared (first use in this function) |
很明显,atl1c_main.c中使用了没有定义的函数以及一些宏定义。于是偶下载了最新的内核,在/include/linux/kernel.h中可以看到roundup的定义:
#define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
在/include/linux/netdevice.h中可以看到NETIF_F_TSO6的定义:
#define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT)
在/include/linux/skbuff.h中可以看到SKB_GSO_TCPV6的定义:
enum {
SKB_GSO_TCPV4 = 1 << 0,
SKB_GSO_UDP = 1 << 1,
/* This indicates the skb is from an untrusted source. */
SKB_GSO_DODGY = 1 << 2,
/* This indicates the tcp segment has CWR set. */
SKB_GSO_TCP_ECN = 1 << 3,
SKB_GSO_TCPV6 = 1 << 4,
SKB_GSO_FCOE = 1 << 5,
};
若希望直接不修改这份驱动就能顺利编译通过,一是先升级内核,二是在有更新内核的环境下先编译。其实这两种都有很大的风险,尤其是当前系统已经部属了其他应用的情况下,升级内核可能会导致不可预测的后果。鉴于编译时错误的地方不是很多,丢失的宏定义也很简单,我采取简单的修改驱动来修复编译错误。
在atl1c.h中添加
#define dev_notice(dev, format, arg...) dev_printk(KERN_NOTICE , dev , format , ## arg) enum { /* This indicates the tcp segment has CWR set. */ SKB_GSO_TCP_ECN = 1 << 3, SKB_GSO_TCPV6 = 1 << 4, SKB_GSO_FCOE = 1 << 5, }; #define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT) #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) |
如何在SUSE中让驱动自动加载?可以在系统启动时使用命令modprobe来加载驱动,但在SUSE中最简单的方式是在/etc/sysconfig/hardware目录下添加设备描述文件,实现步骤
1、先找到设备的描述信息,如网卡使用pci bus。可以使用ls -l /sys/class/net/ethx/device看到该网卡使用了哪个pci通道。也可以使用lspci命令来了解。
2、参照/etc/sysconfig/hardware目录下的文件的命名规则,添加一个文件。比如我当前主机环境下的文件名是:hwcfg-bus-pci-0000:02:00.0 ,内容:
在atl1c.h中添加
MODULE='atl1e' MODULE_OPTIONS='' STARTMODE='auto' |
完成后重启测试。。。。