summaryrefslogtreecommitdiffstats
path: root/recipes-kernel/sllin
diff options
context:
space:
mode:
authorScott Murray <scott.murray@konsulko.com>2022-05-30 18:51:36 -0400
committerScott Murray <scott.murray@konsulko.com>2022-05-31 10:05:28 -0400
commit797bcf304890120d1e81dd1f5726c7de23da51cb (patch)
tree2c7c316e7221874ee93566eb175c3217d4adcd33 /recipes-kernel/sllin
parent63512e51692b48ad645dba0a21858cc48d5b416f (diff)
sllin: switch to updated upstream
Changes: - Switch the SRC_URI of the sllin driver recipe to point at the new revived upstream location, update to their latest commit to get newer kernel support, and drop all the now unnecessary local patches. - Added a patch to fix compilation against 5.4 kernels before 5.4.110. This will be worked with upstream as time permits. - Rename the sllin driver recipe with a _git suffix to match OE style expectations. - Added the sllin driver to packagegroup-agl-demo as was being done in previous releases. - Split the demo script + service unit and lin_config configuration out of the sllin driver recipe into a new sllin-demo recipe so that they're no longer conflated. This should make it easier for others to reuse the sllin driver recipe. - Update the SRC_URI and SRCREV of the lin_config recipe to also point at the new upstream location/version since it comes out of the same repository. - Add the new master mode "-m" flag to the lin_config command line in the start_lin_demo.sh script (now in sllin-demo). This turns out to be required for our demo usecase as upstream seem to have inadvertently changed the default behavior. Bug-AGL: SPEC-4404 Signed-off-by: Scott Murray <scott.murray@konsulko.com> Change-Id: Ic6081184d43c516fc4372919b2cf1ed597a90624
Diffstat (limited to 'recipes-kernel/sllin')
-rw-r--r--recipes-kernel/sllin/files/0001-Disable-sllin-driver-debug-log.patch27
-rw-r--r--recipes-kernel/sllin/files/0002_fix_null_operation_check.patch176
-rw-r--r--recipes-kernel/sllin/files/0003-Allow-recent-kernels-newer-4.11.x-to-build.patch69
-rw-r--r--recipes-kernel/sllin/files/0004-Fix-build-with-5.9-kernel.patch48
-rw-r--r--recipes-kernel/sllin/files/sllin-demo.service2
-rwxr-xr-xrecipes-kernel/sllin/files/start_lin_demo.sh2
-rw-r--r--recipes-kernel/sllin/sllin-demo.bb29
-rw-r--r--recipes-kernel/sllin/sllin.bb45
-rw-r--r--recipes-kernel/sllin/sllin/0001-update-makefile.patch (renamed from recipes-kernel/sllin/files/0001_update_makefile.patch)0
-rw-r--r--recipes-kernel/sllin/sllin/0002-5.4-less-than-110-fix.patch25
-rw-r--r--recipes-kernel/sllin/sllin_git.bb22
11 files changed, 77 insertions, 368 deletions
diff --git a/recipes-kernel/sllin/files/0001-Disable-sllin-driver-debug-log.patch b/recipes-kernel/sllin/files/0001-Disable-sllin-driver-debug-log.patch
deleted file mode 100644
index 99d6183ab..000000000
--- a/recipes-kernel/sllin/files/0001-Disable-sllin-driver-debug-log.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 04ffb4b8f828c19e914987e271aaf3aa7eab28bf Mon Sep 17 00:00:00 2001
-From: Yuichi Kusakabe <yuichi.kusakabe@denso-ten.com>
-Date: Thu, 29 Nov 2018 22:12:00 +0900
-Subject: [PATCH] Disable sllin driver debug log
-
-Signed-off-by: Yuichi Kusakabe <yuichi.kusakabe@denso-ten.com>
----
- sllin/sllin.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/sllin/sllin.c b/sllin/sllin.c
-index 77b2cb8..133d6e9 100644
---- a/sllin/sllin.c
-+++ b/sllin/sllin.c
-@@ -41,7 +41,9 @@
- * Funded by: Volkswagen Group Research
- */
-
-+#if 0
- #define DEBUG 1 /* Enables pr_debug() printouts */
-+#endif
-
- #include <linux/module.h>
- #include <linux/moduleparam.h>
---
-2.7.4
-
diff --git a/recipes-kernel/sllin/files/0002_fix_null_operation_check.patch b/recipes-kernel/sllin/files/0002_fix_null_operation_check.patch
deleted file mode 100644
index 896e2680d..000000000
--- a/recipes-kernel/sllin/files/0002_fix_null_operation_check.patch
+++ /dev/null
@@ -1,176 +0,0 @@
-diff --git a/sllin/sllin.c b/sllin/sllin.c
-index 2db896f..2969448 100644
---- a/sllin/sllin.c
-+++ b/sllin/sllin.c
-@@ -869,7 +869,6 @@ static int sllin_send_tx_buff(struct sllin *sl)
- #else
- remains = sl->tx_lim - sl->tx_cnt;
- #endif
--
- res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
- if (res < 0)
- goto error_in_write;
-@@ -916,10 +915,25 @@ static int sllin_send_break(struct sllin *sl)
- unsigned long break_baud;
- int res;
-
-+ netdev_dbg(sl->dev, "%s()#<BREAK_BY_BAUD> invoke.\n", __func__);
-+ if (tty == NULL) {
-+ netdev_dbg(sl->dev, "%s() tty == NULL.\n", __func__);
-+ sl->lin_state = SLSTATE_IDLE;
-+ return -1;
-+ }
-+ if (tty->ops == NULL) {
-+ netdev_dbg(sl->dev, "%s() tty->ops == NULL.\n", __func__);
-+ sl->lin_state = SLSTATE_IDLE;
-+ return -1;
-+ }
- break_baud = ((sl->lin_baud * 2) / 3);
- sltty_change_speed(tty, break_baud);
-
-- tty->ops->flush_buffer(tty);
-+ if (tty->ops->flush_buffer) {
-+ tty->ops->flush_buffer(tty);
-+ } else {
-+ netdev_dbg(sl->dev, "%s() tty->ops->flush_buffer is NULL.\n", __func__);
-+ }
- sl->rx_cnt = SLLIN_BUFF_BREAK;
-
- sl->rx_expect = SLLIN_BUFF_BREAK + 1;
-@@ -943,6 +957,17 @@ static int sllin_send_break(struct sllin *sl)
- unsigned long usleep_range_min;
- unsigned long usleep_range_max;
-
-+ netdev_dbg(sl->dev, "%s() invoke.\n", __func__);
-+ if (tty == NULL) {
-+ netdev_dbg(sl->dev, "%s() tty == NULL.\n", __func__);
-+ sl->lin_state = SLSTATE_IDLE;
-+ return -1;
-+ }
-+ if (tty->ops == NULL) {
-+ netdev_dbg(sl->dev, "%s() tty->ops == NULL.\n", __func__);
-+ sl->lin_state = SLSTATE_IDLE;
-+ return -1;
-+ }
- break_baud = ((sl->lin_baud * 2) / 3);
- sl->rx_cnt = SLLIN_BUFF_BREAK;
- sl->rx_expect = SLLIN_BUFF_BREAK + 1;
-@@ -950,21 +975,31 @@ static int sllin_send_break(struct sllin *sl)
-
- /* Do the break ourselves; Inspired by
- http://lxr.linux.no/#linux+v3.1.2/drivers/tty/tty_io.c#L2452 */
-- retval = tty->ops->break_ctl(tty, -1);
-- if (retval)
-- return retval;
-+ if (tty->ops->break_ctl) {
-+ retval = tty->ops->break_ctl(tty, -1);
-+ if (retval)
-+ return retval;
-+ } else {
-+ netdev_dbg(sl->dev, "%s() tty->ops->break_ctl is NULL.\n", __func__);
-+ }
-
- /* udelay(712); */
- usleep_range_min = (1000000l * SLLIN_SAMPLES_PER_CHAR) / break_baud;
- usleep_range_max = usleep_range_min + 50;
- usleep_range(usleep_range_min, usleep_range_max);
-
-- retval = tty->ops->break_ctl(tty, 0);
-+ if(tty->ops->break_ctl) {
-+ retval = tty->ops->break_ctl(tty, 0);
-+ }
- usleep_range_min = (1000000l * 1 /* 1 bit */) / break_baud;
- usleep_range_max = usleep_range_min + 30;
- usleep_range(usleep_range_min, usleep_range_max);
-
-- tty->ops->flush_buffer(tty);
-+ if ( tty->ops->flush_buffer) {
-+ tty->ops->flush_buffer(tty);
-+ } else {
-+ netdev_dbg(sl->dev, "%s() tty->ops->flush_buffer is NULL.\n", __func__);
-+ }
-
- sl->tx_cnt = SLLIN_BUFF_SYNC;
-
-@@ -1028,6 +1063,12 @@ static int sllin_kwthread(void *ptr)
- int lin_dlc;
- u8 lin_data_buff[SLLIN_DATA_MAX];
-
-+ if (sl == NULL) {
-+ pr_err("sllin: sl is NULL\n");
-+ }
-+ if (sl->dev == NULL) {
-+ pr_err("sllin: sl->dev is NULL\n");
-+ }
-
- if ((sl->lin_state == SLSTATE_IDLE) && sl->lin_master &&
- sl->id_to_send) {
-@@ -1036,6 +1077,7 @@ static int sllin_kwthread(void *ptr)
- }
- }
-
-+ netdev_dbg(sl->dev, "sllin_kthread <WAIT_EVENT>\n");
- wait_event_killable(sl->kwt_wq, kthread_should_stop() ||
- test_bit(SLF_RXEVENT, &sl->flags) ||
- test_bit(SLF_TXEVENT, &sl->flags) ||
-@@ -1046,6 +1088,7 @@ static int sllin_kwthread(void *ptr)
- (sl->lin_state == SLSTATE_RESPONSE_WAIT))
- && test_bit(SLF_MSGEVENT, &sl->flags)));
-
-+ netdev_dbg(sl->dev, "sllin_kthread <WAKEUPED>\n");
- if (test_and_clear_bit(SLF_RXEVENT, &sl->flags)) {
- netdev_dbg(sl->dev, "sllin_kthread RXEVENT\n");
- }
-@@ -1078,21 +1121,25 @@ static int sllin_kwthread(void *ptr)
- sl->lin_state = SLSTATE_IDLE;
- }
-
-+ netdev_dbg(sl->dev, "sllin_kthread: lin_state <%08x>\n",sl->lin_state);
- switch (sl->lin_state) {
- case SLSTATE_IDLE:
- if (!test_bit(SLF_MSGEVENT, &sl->flags))
- break;
--
-+ if (sl->tx_req_skb == NULL)
-+ netdev_dbg(sl->dev, "sl->tx_req_skb == NULL\n");
-+ if (sl->tx_req_skb->data == NULL)
-+ netdev_dbg(sl->dev, "sl->tx_req_skb->data == NULL\n");
- cf = (struct can_frame *)sl->tx_req_skb->data;
-
- /* SFF RTR CAN frame -> LIN header */
- if (cf->can_id & CAN_RTR_FLAG) {
- struct sllin_conf_entry *sce;
-
-- netdev_dbg(sl->dev, "%s: RTR SFF CAN frame, ID = %x\n",
-- __func__, cf->can_id & LIN_ID_MASK);
-
- sce = &sl->linfr_cache[cf->can_id & LIN_ID_MASK];
-+ netdev_dbg(sl->dev, "%s: RTR SFF CAN frame, ID = %x dlc=%d\n",
-+ __func__, cf->can_id & LIN_ID_MASK, sce->dlc);
- spin_lock_irqsave(&sl->linfr_lock, flags);
-
- /* Is there Slave response in linfr_cache to be sent? */
-@@ -1114,8 +1161,8 @@ static int sllin_kwthread(void *ptr)
- spin_unlock_irqrestore(&sl->linfr_lock, flags);
-
- } else { /* SFF NON-RTR CAN frame -> LIN header + LIN response */
-- netdev_dbg(sl->dev, "%s: NON-RTR SFF CAN frame, ID = %x\n",
-- __func__, (int)cf->can_id & LIN_ID_MASK);
-+ netdev_dbg(sl->dev, "%s: NON-RTR SFF CAN frame, ID = %x\n dlc=%d",
-+ __func__, (int)cf->can_id & LIN_ID_MASK, cf->can_dlc);
-
- lin_data = cf->data;
- lin_dlc = cf->can_dlc;
-@@ -1140,6 +1187,7 @@ static int sllin_kwthread(void *ptr)
- hrtimer_start(&sl->rx_timer,
- ktime_add(ktime_get(), sl->rx_timer_timeout),
- HRTIMER_MODE_ABS);
-+ netdev_dbg(sl->dev, "sllin_kthread: SLSTATE finish\n");
- break;
-
- case SLSTATE_BREAK_SENT:
-@@ -1654,3 +1702,4 @@ static void __exit sllin_exit(void)
-
- module_init(sllin_init);
- module_exit(sllin_exit);
-+
diff --git a/recipes-kernel/sllin/files/0003-Allow-recent-kernels-newer-4.11.x-to-build.patch b/recipes-kernel/sllin/files/0003-Allow-recent-kernels-newer-4.11.x-to-build.patch
deleted file mode 100644
index c8f2f9268..000000000
--- a/recipes-kernel/sllin/files/0003-Allow-recent-kernels-newer-4.11.x-to-build.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From fcebb8f510bbb5c681f1f9af4506b4de241837dd Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jan-Simon=20M=C3=B6ller?= <jsmoeller@linuxfoundation.org>
-Date: Wed, 31 Oct 2018 20:48:20 +0000
-Subject: [PATCH] Allow recent kernels newer 4.11.x to build
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-API changes enforce porting.
-
-Signed-off-by: Jan-Simon Möller <jsmoeller@linuxfoundation.org>
----
- sllin/sllin.c | 13 +++++++++++++
- 1 file changed, 13 insertions(+)
-
-diff --git a/sllin/sllin.c b/sllin/sllin.c
-index 2969448..7e17127 100644
---- a/sllin/sllin.c
-+++ b/sllin/sllin.c
-@@ -56,7 +56,12 @@
- #include <linux/rtnetlink.h>
- #include <linux/if_arp.h>
- #include <linux/if_ether.h>
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)
- #include <linux/sched.h>
-+#else
-+#include <uapi/linux/sched/types.h>
-+#endif
- #include <linux/delay.h>
- #include <linux/init.h>
- #include <linux/can.h>
-@@ -447,7 +451,9 @@ static int sll_open(struct net_device *dev)
- static void sll_free_netdev(struct net_device *dev)
- {
- int i = dev->base_addr;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,11,9)
- free_netdev(dev);
-+#endif
- sllin_devs[i] = NULL;
- }
-
-@@ -460,7 +466,12 @@ static const struct net_device_ops sll_netdev_ops = {
- static void sll_setup(struct net_device *dev)
- {
- dev->netdev_ops = &sll_netdev_ops;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,11,9)
- dev->destructor = sll_free_netdev;
-+#else
-+ dev->needs_free_netdev = true;
-+ dev->priv_destructor = sll_free_netdev;
-+#endif
-
- dev->hard_header_len = 0;
- dev->addr_len = 0;
-@@ -1685,8 +1696,10 @@ static void __exit sllin_exit(void)
- sl = netdev_priv(dev);
- if (sl->tty) {
- netdev_dbg(sl->dev, "tty discipline still running\n");
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,11,9)
- /* Intentionally leak the control block. */
- dev->destructor = NULL;
-+#endif
- }
-
- unregister_netdev(dev);
---
-2.13.7
-
diff --git a/recipes-kernel/sllin/files/0004-Fix-build-with-5.9-kernel.patch b/recipes-kernel/sllin/files/0004-Fix-build-with-5.9-kernel.patch
deleted file mode 100644
index f3bcda9fe..000000000
--- a/recipes-kernel/sllin/files/0004-Fix-build-with-5.9-kernel.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-Use sched_set_fifo on newer kernels
-
-The 5.9 kernel removed the export of sched_setscheduler, use
-the new sched_set_fifo API if building on 5.9 or newer. There
-is a slight difference in resulting priority level, the new
-API will yield a priority of 50 instead of the explicit value
-of 40 being used with sched_setscheduler, but this should not
-be an issue.
-
-Upstream-Status: Inappropriate [no upstream]
-Signed-off-by: Scott Murray <scott.murray@konsulko.com>
-
----
-diff --git a/sllin/sllin.c b/sllin/sllin.c
-index 133d6e9..92c52ad 100644
---- a/sllin/sllin.c
-+++ b/sllin/sllin.c
-@@ -1059,14 +1059,20 @@ static int sllin_kwthread(void *ptr)
- {
- struct sllin *sl = (struct sllin *)ptr;
- struct tty_struct *tty = sl->tty;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(5,9,0)
- struct sched_param schparam = { .sched_priority = 40 };
-+#endif
- int tx_bytes = 0; /* Used for Network statistics */
- unsigned long flags;
- int lin_id;
- struct sllin_conf_entry *sce;
-
- netdev_dbg(sl->dev, "sllin_kwthread started.\n");
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(5,9,0)
- sched_setscheduler(current, SCHED_FIFO, &schparam);
-+#else
-+ sched_set_fifo(current);
-+#endif
-
- clear_bit(SLF_ERROR, &sl->flags);
- sltty_change_speed(tty, sl->lin_baud);
-@@ -1274,8 +1280,8 @@ slstate_response_wait:
- sl->lin_state = SLSTATE_RESPONSE_WAIT_BUS;
- }
- }
-+ fallthrough;
-
-- /* Be aware, no BREAK here */
- case SLSTATE_RESPONSE_WAIT_BUS:
- if (sl->rx_cnt < sl->rx_expect)
- continue;
diff --git a/recipes-kernel/sllin/files/sllin-demo.service b/recipes-kernel/sllin/files/sllin-demo.service
index e3e7432f3..e6af0be59 100644
--- a/recipes-kernel/sllin/files/sllin-demo.service
+++ b/recipes-kernel/sllin/files/sllin-demo.service
@@ -1,8 +1,6 @@
[Unit]
Description=LIN demo configuration
ConditionPathExists=/dev/ttyUSB0
-After=afm-system-daemon.service
-Before=can-dev-mapping-helper.service
[Service]
Type=forking
diff --git a/recipes-kernel/sllin/files/start_lin_demo.sh b/recipes-kernel/sllin/files/start_lin_demo.sh
index c7627ca74..c97f0a2c5 100755
--- a/recipes-kernel/sllin/files/start_lin_demo.sh
+++ b/recipes-kernel/sllin/files/start_lin_demo.sh
@@ -3,7 +3,7 @@
# Attach serial LIN->CAN bridge and set up LIN polling
if [ -c /dev/ttyUSB0 ]; then
sleep 1
- /usr/bin/lin_config -c /etc/lin_config.conf -a sllin:/dev/ttyUSB0
+ /usr/bin/lin_config -m -c /etc/lin_config.conf -a sllin:/dev/ttyUSB0
mkdir -p /run/lin_config/
pidof lin_config > /run/lin_config/lin_config.pid
sleep 1
diff --git a/recipes-kernel/sllin/sllin-demo.bb b/recipes-kernel/sllin/sllin-demo.bb
new file mode 100644
index 000000000..bd764bea6
--- /dev/null
+++ b/recipes-kernel/sllin/sllin-demo.bb
@@ -0,0 +1,29 @@
+DESCRIPTION = "AGL IVI demo slLIN driver configuration"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+inherit allarch systemd
+
+SRC_URI = " \
+ file://sllin-demo.service \
+ file://start_lin_demo.sh \
+ file://lin_config.conf \
+"
+
+SYSTEMD_SERVICE:${PN} = "sllin-demo.service"
+
+do_install:append () {
+ install -d 644 ${D}/${bindir}
+ install -m 0755 ${WORKDIR}/start_lin_demo.sh ${D}/${bindir}/start_lin_demo.sh
+ install -d ${D}${systemd_system_unitdir}
+ install -m 0644 ${WORKDIR}/sllin-demo.service ${D}${systemd_system_unitdir}/
+ install -d ${D}${sysconfdir}
+ install -m 0644 ${WORKDIR}/lin_config.conf ${D}${sysconfdir}/
+}
+
+FILES:${PN} += " \
+ ${bindir}/start_lin_demo.sh \
+ ${sysconfdir}/lin_config.conf \
+"
+
+RDEPENDS:${PN} += "lin-config"
diff --git a/recipes-kernel/sllin/sllin.bb b/recipes-kernel/sllin/sllin.bb
deleted file mode 100644
index 70d1a9311..000000000
--- a/recipes-kernel/sllin/sllin.bb
+++ /dev/null
@@ -1,45 +0,0 @@
-DESCRIPTION = "slLIN driver module"
-LICENSE = "GPLv2"
-LIC_FILES_CHKSUM = "file://sllin.c;beginline=7;endline=37;md5=6408e14dba951f8cbe3c2a003a0d89d2"
-
-inherit module systemd
-
-DEPENDS = "virtual/kernel"
-
-SRC_URI = "git://github.com/trainman419/linux-lin.git;protocol=https;branch=master"
-SRCREV = "155d885e8ccc907a56f6c86c4b159fac27ef6fec"
-S = "${WORKDIR}/git/sllin"
-
-PV = "0.1+git${SRCPV}"
-
-SRC_URI:append = " \
- file://0001_update_makefile.patch;pnum=2 \
- file://0002_fix_null_operation_check.patch;pnum=2 \
- file://0003-Allow-recent-kernels-newer-4.11.x-to-build.patch;pnum=2 \
- file://0001-Disable-sllin-driver-debug-log.patch;pnum=2 \
- file://0004-Fix-build-with-5.9-kernel.patch;pnum=2 \
- file://sllin-demo.service \
- file://start_lin_demo.sh \
- file://lin_config.conf \
-"
-
-KERNEL_MODULE_AUTOLOAD:append = " sllin"
-KERNEL_MODULE_PROBECONF:append = " sllin"
-
-SLLINBAUDRATE ??= "9600"
-module_conf_sllin = "options sllin baudrate=${SLLINBAUDRATE}"
-
-SYSTEMD_SERVICE:${PN} = "sllin-demo.service"
-
-do_install:append () {
- install -d 644 ${D}/${bindir}
- install -m 755 ${WORKDIR}/start_lin_demo.sh ${D}/${bindir}/start_lin_demo.sh
- install -d ${D}${systemd_system_unitdir}
- install -m 0644 ${WORKDIR}/sllin-demo.service ${D}${systemd_system_unitdir}/
- install -d ${D}${sysconfdir}
- install -m 0644 ${WORKDIR}/lin_config.conf ${D}${sysconfdir}/
-}
-
-FILES:${PN} += "${bindir}/start_lin_demo.sh ${sysconfdir}/lin_config.conf"
-
-RDEPENDS:${PN} += "lin-config"
diff --git a/recipes-kernel/sllin/files/0001_update_makefile.patch b/recipes-kernel/sllin/sllin/0001-update-makefile.patch
index 7db57802b..7db57802b 100644
--- a/recipes-kernel/sllin/files/0001_update_makefile.patch
+++ b/recipes-kernel/sllin/sllin/0001-update-makefile.patch
diff --git a/recipes-kernel/sllin/sllin/0002-5.4-less-than-110-fix.patch b/recipes-kernel/sllin/sllin/0002-5.4-less-than-110-fix.patch
new file mode 100644
index 000000000..8c13bfb53
--- /dev/null
+++ b/recipes-kernel/sllin/sllin/0002-5.4-less-than-110-fix.patch
@@ -0,0 +1,25 @@
+Fix compilation against kernels < 5.4.110
+
+The fix to handle the backport of 4e096a18 to linux-5.4.y is a bit
+too broad, as it breaks building against kernels older than 5.4.110,
+add a version check to fix.
+
+Upstream-Status: pending
+Signed-off-by: Scott Murray <scott.murray@konsulko.com>
+
+diff --git a/sllin/sllin.c b/sllin/sllin.c
+index b3f2636..a6fb120 100644
+--- a/sllin/sllin.c
++++ b/sllin/sllin.c
+@@ -1604,7 +1604,11 @@ static struct sllin *sll_alloc(dev_t line)
+ sl = netdev_priv(dev);
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)
+ can_ml = (void *)sl + ALIGN(sizeof(*sl), NETDEV_ALIGN);
++ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 110)
+ can_set_ml_priv(dev, can_ml);
++ #else
++ dev->ml_priv = can_ml;
++ #endif
+ #endif
+ /* Initialize channel control data */
+ sl->magic = SLLIN_MAGIC;
diff --git a/recipes-kernel/sllin/sllin_git.bb b/recipes-kernel/sllin/sllin_git.bb
new file mode 100644
index 000000000..07e9cff70
--- /dev/null
+++ b/recipes-kernel/sllin/sllin_git.bb
@@ -0,0 +1,22 @@
+DESCRIPTION = "slLIN driver module"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://sllin.c;beginline=7;endline=37;md5=6408e14dba951f8cbe3c2a003a0d89d2"
+
+inherit module
+
+DEPENDS = "virtual/kernel"
+
+SRC_URI = "git://github.com/lin-bus/linux-lin.git;protocol=https;branch=master \
+ file://0001-update-makefile.patch;pnum=2 \
+ file://0002-5.4-less-than-110-fix.patch;pnum=2 \
+"
+SRCREV = "beb057d7505e0c4d7c61f3f4927b76916ec00e88"
+S = "${WORKDIR}/git/sllin"
+
+PV = "0.1+git${SRCPV}"
+
+KERNEL_MODULE_AUTOLOAD:append = " sllin"
+KERNEL_MODULE_PROBECONF:append = " sllin"
+
+SLLINBAUDRATE ??= "9600"
+module_conf_sllin = "options sllin baudrate=${SLLINBAUDRATE}"