1、问题描述
硬件配置:泰山2280V2、1822网卡
软件OS版本:centos8.1 aarch64、内核4.18.0-147.el8.aarch64
问题描述:
泰山2280V2安装centos8.1系统,内核4.18,编译1822网卡源码时报错如下所示:
使用的网卡源码版本:
SPC102:hinic-1.8.3.3
SPC104:hinic-1.8.3.14
[root@localhost hinic]# make
make -C /lib/modules/`uname -r`/build M=/home/hinic-1.8.3.3/hinic -W modules
make[1]: Entering directory '/usr/src/kernels/4.18.0-147.el8.aarch64'
CC [M] /home/hinic-1.8.3.3/hinic/hinic_nic_cfg.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_nic_io.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_nic_dbg.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_hwif.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_msix_attr.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_eqs.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_mbox.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_api_cmd.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_mgmt.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_wq.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_cmdq.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_hwdev.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_cfg.o
CC [M] /home/hinic-1.8.3.3/hinic/ossl_knl_linux.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_sml_counter.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_sml_lt.o
CC [M] /home/hinic-1.8.3.3/hinic/hinic_main.o
/home/hinic-1.8.3.3/hinic/hinic_main.c: In function ‘hinic_select_queue’:
/home/hinic-1.8.3.3/hinic/hinic_main.c:1074:9: error: too few arguments to function ‘fallback’
return fallback(netdev, skb);
^~~~~~~~
/home/hinic-1.8.3.3/hinic/hinic_main.c: At top level:
/home/hinic-1.8.3.3/hinic/hinic_main.c:1958:22: error: initialization of ‘u16 (*)(struct net_device *, struct sk_buff *, struct net_device *, u16 (*)(struct net_device *, struct sk_buff *, struct net_device *))’ {aka ‘short unsigned int (*)(struct net_device *, struct sk_buff *, struct net_device *, short unsigned int (*)(struct net_device *, struct sk_buff *, struct net_device *))’} from incompatible pointer type ‘u16 (*)(struct net_device *, struct sk_buff *, void *, u16 (*)(struct net_device *, struct sk_buff *, struct net_device *))’ {aka ‘short unsigned int (*)(struct net_device *, struct sk_buff *, void *, short unsigned int (*)(struct net_device *, struct sk_buff *, struct net_device *))’} [-Werror=incompatible-pointer-types]
.ndo_select_queue = hinic_select_queue,
^~~~~~~~~~~~~~~~~~
/home/hinic-1.8.3.3/hinic/hinic_main.c:1958:22: note: (near initialization for ‘hinic_netdev_ops.ndo_select_queue’)
/home/hinic-1.8.3.3/hinic/hinic_main.c:2039:22: error: initialization of ‘u16 (*)(struct net_device *, struct sk_buff *, struct net_device *, u16 (*)(struct net_device *, struct sk_buff *, struct net_device *))’ {aka ‘short unsigned int (*)(struct net_device *, struct sk_buff *, struct net_device *, short unsigned int (*)(struct net_device *, struct sk_buff *, struct net_device *))’} from incompatible pointer type ‘u16 (*)(struct net_device *, struct sk_buff *, void *, u16 (*)(struct net_device *, struct sk_buff *, struct net_device *))’ {aka ‘short unsigned int (*)(struct net_device *, struct sk_buff *, void *, short unsigned int (*)(struct net_device *, struct sk_buff *, struct net_device *))’} [-Werror=incompatible-pointer-types]
.ndo_select_queue = hinic_select_queue,
^~~~~~~~~~~~~~~~~~
/home/hinic-1.8.3.3/hinic/hinic_main.c:2039:22: note: (near initialization for ‘hinicvf_netdev_ops.ndo_select_queue’)
/home/hinic-1.8.3.3/hinic/hinic_main.c: In function ‘hinic_select_queue’:
/home/hinic-1.8.3.3/hinic/hinic_main.c:1077:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
cc1: some warnings being treated as errors
make[2]: *** [scripts/Makefile.build:313: /home/hinic-1.8.3.3/hinic/hinic_main.o] Error 1
make[1]: *** [Makefile:1547: _module_/home/hinic-1.8.3.3/hinic] Error 2
make[1]: Leaving directory '/usr/src/kernels/4.18.0-147.el8.aarch64'
make: *** [Makefile:17: all] Error 2
[root@localhost hinic]#
2、原因分析及解决方法
CentOS8.1系统,虽然内核版本是4.18,但是其中的内核接口使用新内核接口,需要修改源码进行适配。
在SPC102版本上具体的修改点为:
修改ossl_knl_linux.h文件,从1731行开始
/*****************************************************************************/
#if (KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE)
#else /* >= 4.19 */
#define HAVE_NDO_SELECT_QUEUE_SB_DEV
#endif
修改为:
/*****************************************************************************/
#if (KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE)
#if (RHEL_RELEASE_CODE && (RHEL_RELEASE_VERSION(8, 0) <= RHEL_RELEASE_CODE ))
#define HAVE_NDO_SELECT_QUEUE_SB_DEV
#endif
#else /* >= 4.19 */
#define HAVE_NDO_SELECT_QUEUE_SB_DEV
#endif /* 4.19.0 */
SPC104版本的1822网卡源码修改方法同上。
3、设置驱动开机加载
cp hinic.ko /lib/modules/`uname -r`/updates
depmod `uname -r`