【发布时间】:2021-07-17 00:00:47
【问题描述】:
我正在尝试在带有内核 v5.11 的 Ubuntu 21.04 上编译 Sangoma 的 wanpipe 驱动程序 v7.0.32,以便与我的 A200 电话卡一起使用。该驱动程序是为支持内核 5.8 而编写的。我已经使用 5.8 内核成功构建了它,但希望能够继续使用 5.11 内核,这样我就不必降级我的生产服务器。
我缺乏 C++ 知识来解决如何在编译 wanpipe 驱动程序时解决“'struct' 中字段的位置初始化和“''struct file_operation' 没有名为 'ioctl' 的成员”错误。
这是make的结果:
make KBUILD_VERBOSE=0 KBUILD_MODPOST_WARN=1 -C /lib/modules/5.11.0-22-generic/build M=/usr/src/wanpipe-7.0.32/patches/kdrivers/src/net EXTRA_FLAGS="-I/usr/src/wanpipe-7.0.32/patches/kdrivers/include -I/usr/src/wanpipe-7.0.32/patches/kdrivers/include/annexg -I/usr/src/wanpipe-7.0.32/patches/kdrivers/wanec -D__LINUX__ -I/usr/src/wanpipe-7.0.32/patches/kdrivers/wanec -I/usr/src/wanpipe-7.0.32/patches/kdrivers/wanec/oct6100_api -I/usr/src/wanpipe-7.0.32/patches/kdrivers/wanec/oct6100_api/include -DCONFIG_PRODUCT_WANPIPE_BASE -DCONFIG_PRODUCT_WANPIPE_AFT -DCONFIG_PRODUCT_WANPIPE_AFT_CORE -DCONFIG_PRODUCT_WANPIPE_AFT_TE1 -DCONFIG_PRODUCT_WANPIPE_AFT_TE3 -DCONFIG_PRODUCT_WANPIPE_AFT_56K -DCONFIG_WANPIPE_HWEC -DCONFIG_PRODUCT_WANPIPE_SOCK_DATASCOPE -DCONFIG_PRODUCT_WANPIPE_AFT_BRI -DCONFIG_PRODUCT_WANPIPE_AFT_SERIAL -DCONFIG_PRODUCT_WANPIPE_TDM_VOICE_DCHAN -DCONFIG_PRODUCT_WANPIPE_CODEC_SLINEAR_LAW -DCONFIG_PRODUCT_WANPIPE_AFT_RM -DCONFIG_PRODUCT_WANPIPE_USB -DCONFIG_PRODUCT_WANPIPE_A700 -DCONFIG_PRODUCT_A600 -DCONFIG_PRODUCT_WANPIPE_AFT_A600 -DCONFIG_PRODUCT_WANPIPE_AFT_A700 -DCONFIG_PRODUCT_WANPIPE_AFT_B601 -DCONFIG_PRODUCT_WANPIPE_AFT_B800 -I/lib/modules/5.11.0-22-generic/build/include/linux -I/usr/src/dahdi -DKERN_PROC_PDE_FEATURE=2 -DKERN_MEMCPY_FROM_MSG=1 -DKERN_MEMCPY_TO_MSG=1 -DKERN_SK_FOR_NODE_FEATURE=0 -DKERN_NETIF_TRANS_UPDATE=1 -DKERN_NDO_CHANGE_MTU_RH74=0 -DKERN_CLASS_DEV_GROUPS=1 -DKERN_TIMER_SETUP=2 -DKERN_REFCNT_UPDATE=3 -DKERN_SIG_UPDATE=11 -DKERN_CLASS_PROTO_OPS_UPDATE=0 -DKERN_DEV_CHG_FLAG_UPDATE=2 -DKERN_NDO_TIMEOUT_UPDATE=2 -DKERN_DO_GET_TIME=0 -DKERN_GET_KENEL_DS=0 -DKERN_PROC_CREATE=0 -DKERN_TIMER_32BIT=0 -DWANPIPE_USE_I_PRIVATE " ZAPDIR= ZAPHDLC= HOMEDIR=/usr/src/wanpipe-7.0.32 modules
make[1]: Entering directory '/usr/src/linux-headers-5.11.0-22-generic'
CC [M] /usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.o
In file included from /usr/src/wanpipe-7.0.32/patches/kdrivers/include/wanpipe_defines.h:30,
from /usr/src/wanpipe-7.0.32/patches/kdrivers/include/wanpipe_cdev_iface.h:9,
from /usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.c:16:
/usr/src/wanpipe-7.0.32/patches/kdrivers/include/wanpipe_kernel.h:96:25: error: ‘struct file_operations’ has no member named ‘ioctl’
96 | #define WAN_IOCTL ioctl
| ^~~~~
/usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.c:133:2: note: in expansion of macro ‘WAN_IOCTL’
133 | WAN_IOCTL: wp_cdev_ioctl,
| ^~~~~~~~~
/usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.c:133:13: error: positional initialization of field in ‘struct’ declared with ‘designated_init’ attribute [-Werror=designated-init]
133 | WAN_IOCTL: wp_cdev_ioctl,
| ^~~~~~~~~~~~~
/usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.c:133:13: note: (near initialization for ‘wp_cdev_fops’)
/usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.c:133:13: error: initialization of ‘int (*)(struct file *, loff_t, loff_t, int)’ {aka ‘int (*)(struct file *, long long int, long long int, int)’} from incompatible pointer type ‘int (*)(struct inode *, struct file *, unsigned int, long unsigned int)’ [-Werror=incompatible-pointer-types]
/usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.c:133:13: note: (near initialization for ‘wp_cdev_fops.fsync’)
cc1: some warnings being treated as errors
make[2]: *** [scripts/Makefile.build:287: /usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.o] Error 1
make[1]: *** [Makefile:1848: /usr/src/wanpipe-7.0.32/patches/kdrivers/src/net] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.11.0-22-generic'
make: *** [Makefile:399: all_kmod] Error 2
wanpipe_cdev_linux.c 部分:
/*=========================================================
* Static Defines
*=========================================================*/
static struct file_operations wp_cdev_fops = {
owner: THIS_MODULE,
llseek: NULL,
open: wp_cdev_open,
release: wp_cdev_release,
WAN_IOCTL: wp_cdev_ioctl,
read: wp_cdev_read,
write: wp_cdev_write,
poll: wp_cdev_poll,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
compat_ioctl: wp_cdev_compat_ioctl,
#endif
wanpipe_kernel.h:
/////////////2.6.36/////////////////////////////
#ifdef HAVE_UNLOCKED_IOCTL
#define WAN_IOCTL unlocked_ioctl
#define WAN_IOCTL_RET_TYPE long
#define WANDEF_IOCTL_FUNC(function, struct_ptr_file, cmd, data) function(struct_ptr_file, cmd, data)
#else
#define WAN_IOCTL ioctl
#define WAN_IOCTL_RET_TYPE int
#define WANDEF_IOCTL_FUNC(function, struct_ptr_file, cmd, data) function(struct inode *inode, struct_ptr_file, cmd, data)
#endif
////////////////////////////////////////////////
感谢任何帮助。
【问题讨论】:
-
驱动程序似乎配置错误:它遵循分支
#else(并使用#define WAN_IOCTL ioctl)而Linux内核5.11 hasunlocked_ioctl方法,所以@987654328 @ 应该被定义。
标签: c++ compilation asterisk kernel-module