Add package for sllin driver to image 15/17615/2
authorJan-Simon Möller <jsmoeller@linuxfoundation.org>
Wed, 31 Oct 2018 14:01:52 +0000 (15:01 +0100)
committerJan-Simon Möller <jsmoeller@linuxfoundation.org>
Wed, 31 Oct 2018 20:55:30 +0000 (21:55 +0100)
The sllin driver is needed for the AGL demo unit to drive the actuator and fan.

Change-Id: I76a8e7876148b6c2fcbc526a64a7ec132668c754
Signed-off-by: Jan-Simon Möller <jsmoeller@linuxfoundation.org>
recipes-kernel/sllin/files/0001_update_makefile.patch [new file with mode: 0644]
recipes-kernel/sllin/files/0002_fix_null_operation_check.patch [new file with mode: 0644]
recipes-kernel/sllin/files/0003-Allow-recent-kernels-newer-4.11.x-to-build.patch [new file with mode: 0644]
recipes-kernel/sllin/sllin.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-demo-platform.bb

diff --git a/recipes-kernel/sllin/files/0001_update_makefile.patch b/recipes-kernel/sllin/files/0001_update_makefile.patch
new file mode 100644 (file)
index 0000000..7db5780
--- /dev/null
@@ -0,0 +1,21 @@
+diff --git a/sllin/Makefile b/sllin/Makefile
+index 8ae7510..037846f 100644
+--- a/sllin/Makefile
++++ b/sllin/Makefile
+@@ -1,10 +1,11 @@
+ obj-m += sllin.o
+-KPATH=/lib/modules/$(shell uname -r)/build
++KPATH=$(KERNEL_SRC)
+ #KPATH=/mnt/data/_dokumenty_/_w_/_dce_can_/src/can-benchmark/kernel/build/shark/3.0.4
+ #KPATH=/mnt/data/_dokumenty_/_w_/_dce_can_/src/can-benchmark/kernel/build/shark/2.6.36
+-
++SRC := $(shell pwd)
+ all:
+-      make -C ${KPATH} M=$(PWD) modules
+-
++      make -C ${KPATH} M=$(SRC) modules
++modules_install:
++      make -C ${KPATH} M=$(SRC) modules_install
+ clean:
+-      make -C ${KPATH} M=$(PWD) clean
++      make -C ${KPATH} M=$(SRC) clean
diff --git a/recipes-kernel/sllin/files/0002_fix_null_operation_check.patch b/recipes-kernel/sllin/files/0002_fix_null_operation_check.patch
new file mode 100644 (file)
index 0000000..896e268
--- /dev/null
@@ -0,0 +1,176 @@
+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
new file mode 100644 (file)
index 0000000..c8f2f92
--- /dev/null
@@ -0,0 +1,69 @@
+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/sllin.bb b/recipes-kernel/sllin/sllin.bb
new file mode 100644 (file)
index 0000000..eecd439
--- /dev/null
@@ -0,0 +1,21 @@
+DESCRIPTION = "slLIN driver module"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6"
+
+inherit module
+
+DEPENDS = "virtual/kernel"
+
+SRC_URI = "git://github.com/trainman419/linux-lin.git;protocol=https"
+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 \
+"
+
+
index f5c9f0d..d79a36b 100755 (executable)
@@ -22,6 +22,7 @@ RDEPENDS_${PN} += "\
 
 MOST_DRIVERS = " \
     most \
+    sllin \
     "
 
 # HVAC dependencies depend on drivers above