Signed-off-by: Dario Binacchi <dario...@libero.it> ---
Changes in v5: - Add the patch to the series. include/cobalt/uapi/corectl.h | 2 ++ kernel/drivers/can/Makefile | 4 +-- kernel/drivers/can/corectl.c | 41 +++++++++++++++++++++++++++++++ kernel/drivers/can/rtcan_module.c | 6 +++++ 4 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 kernel/drivers/can/corectl.c diff --git a/include/cobalt/uapi/corectl.h b/include/cobalt/uapi/corectl.h index 98d989d63..412684626 100644 --- a/include/cobalt/uapi/corectl.h +++ b/include/cobalt/uapi/corectl.h @@ -62,6 +62,8 @@ # define _CC_COBALT_NET_CAP 0x00000800 # define _CC_COBALT_NET_PROXY 0x00001000 +#define _CC_COBALT_GET_CAN_CONFIG 10 +# define _CC_COBALT_CAN 0x00000001 enum cobalt_run_states { COBALT_STATE_DISABLED, diff --git a/kernel/drivers/can/Makefile b/kernel/drivers/can/Makefile index f78f6afdf..339a1c99f 100644 --- a/kernel/drivers/can/Makefile +++ b/kernel/drivers/can/Makefile @@ -1,10 +1,10 @@ -ccflags-y += -I$(srctree)/drivers/xenomai/can +ccflags-y += -I$(srctree)/drivers/xenomai/can -I$(srctree)/kernel/ obj-$(CONFIG_XENO_DRIVERS_CAN) += xeno_can.o mscan/ sja1000/ peak_canfd/ obj-$(CONFIG_XENO_DRIVERS_CAN_FLEXCAN) += xeno_can_flexcan.o obj-$(CONFIG_XENO_DRIVERS_CAN_VIRT) += xeno_can_virt.o -xeno_can-y := rtcan_dev.o rtcan_socket.o rtcan_module.o rtcan_raw.o rtcan_raw_dev.o rtcan_raw_filter.o +xeno_can-y := corectl.o rtcan_dev.o rtcan_socket.o rtcan_module.o rtcan_raw.o rtcan_raw_dev.o rtcan_raw_filter.o xeno_can_virt-y := rtcan_virt.o xeno_can_flexcan-y := rtcan_flexcan.o diff --git a/kernel/drivers/can/corectl.c b/kernel/drivers/can/corectl.c new file mode 100644 index 000000000..317e1f82f --- /dev/null +++ b/kernel/drivers/can/corectl.c @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright 2021, Dario Binacchi <dario...@libero.it> + */ + +#include <asm/xenomai/syscall.h> +#include <xenomai/posix/corectl.h> + +static int rtcan_corectl_call(struct notifier_block *self, unsigned long arg, + void *cookie) +{ + struct cobalt_config_vector *vec = cookie; + int ret = 0; + + if (arg != _CC_COBALT_GET_CAN_CONFIG) + return NOTIFY_DONE; + + if (vec->u_bufsz < sizeof(ret)) + return notifier_from_errno(-EINVAL); + + if (IS_ENABLED(CONFIG_XENO_DRIVERS_CAN)) + ret |= _CC_COBALT_CAN; + + ret = cobalt_copy_to_user(vec->u_buf, &ret, sizeof(ret)); + + return ret ? notifier_from_errno(-EFAULT) : NOTIFY_STOP; +} + +static struct notifier_block rtcan_corectl_notifier = { + .notifier_call = rtcan_corectl_call, +}; + +void rtcan_corectl_register(void) +{ + cobalt_add_config_chain(&rtcan_corectl_notifier); +} + +void rtcan_corectl_unregister(void) +{ + cobalt_remove_config_chain(&rtcan_corectl_notifier); +} diff --git a/kernel/drivers/can/rtcan_module.c b/kernel/drivers/can/rtcan_module.c index 3d07eaed9..94b8c6412 100644 --- a/kernel/drivers/can/rtcan_module.c +++ b/kernel/drivers/can/rtcan_module.c @@ -35,6 +35,8 @@ MODULE_LICENSE("GPL"); +void rtcan_corectl_register(void); +void rtcan_corectl_unregister(void); const char rtcan_rtdm_provider_name[] = "(C) 2006 RT-Socket-CAN Development Team"; @@ -419,6 +421,8 @@ int __init rtcan_init(void) goto out; #endif + rtcan_corectl_register(); + out: return err; } @@ -426,6 +430,8 @@ int __init rtcan_init(void) void __exit rtcan_exit(void) { + rtcan_corectl_unregister(); + rtcan_raw_proto_unregister(); #ifdef CONFIG_PROC_FS rtcan_proc_unregister(); -- 2.17.1