From 46c3f354b38291ee400bdbece6945ae6ab883b29 Mon Sep 17 00:00:00 2001 From: Pavel Pisa Date: Wed, 15 Jan 2025 10:48:12 +0100 Subject: [PATCH] drivers/can: ctucanfd the first round of fixes - mainly for char dev Corrected CAN FD messages sending in character driver mode. Assign CAN FD format flag in reception of CAN FD messages. Corrected some defines mismatches. The code has been tested in QEMU qemu-system-x86_64 -m 2G -enable-kvm -smp 1 \ -cpu host,+pcid,+x2apic,+tsc-deadline,+xsave,+rdrand \ -kernel nuttx/nuttx \ -nographic -serial mon:stdio \ -object can-bus,id=canbus0-bus \ -object can-host-socketcan,if=can0,canbus=canbus0-bus,id=canbus0-socketcan \ -device ctucan_pci,canbus0=canbus0-bus,canbus1=canbus0-bus The overall state of this third party CTU CAN FD driver in NuttX is far from ideal. It would worth to consult and follow more closely our Linux kernel driver and even better RTEMS CAN/CAN FD stack design https://canbus.pages.fel.cvut.cz/#cancan-fd-subsystem-and-drivers-for-rtems Signed-off-by: Pavel Pisa --- drivers/can/ctucanfd_pci.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/drivers/can/ctucanfd_pci.c b/drivers/can/ctucanfd_pci.c index 789c01b0da6..8f48ad4e09f 100644 --- a/drivers/can/ctucanfd_pci.c +++ b/drivers/can/ctucanfd_pci.c @@ -626,7 +626,7 @@ static int ctucanfd_chrdev_send(FAR struct can_dev_s *dev, fmt.s.rtr = msg->cm_hdr.ch_rtr; -#ifdef CONFIG_NET_CAN_EXTID +#ifdef CONFIG_CAN_EXTID if (msg->cm_hdr.ch_extid) { fmt.s.ide = 1; @@ -639,6 +639,15 @@ static int ctucanfd_chrdev_send(FAR struct can_dev_s *dev, id.s.id = msg->cm_hdr.ch_id; } +#ifdef CONFIG_CAN_FD + + /* Set CAN FD specific flags */ + + fmt.s.brs = msg->cm_hdr.ch_brs; + fmt.s.esi_rsv = msg->cm_hdr.ch_esi; + fmt.s.fdf = msg->cm_hdr.ch_edl; +#endif + /* Write frame */ ctucanfd_putreg(priv, offset + CTUCANFD_TXBUF_FMT, fmt.u32); @@ -800,7 +809,7 @@ static void ctucanfd_chardev_receive(FAR struct ctucanfd_can_s *priv) #ifdef CONFIG_CAN_FD hdr.ch_esi = frame.fmt.esi_rsv; - hdr.ch_edl = 0; + hdr.ch_edl = frame.fmt.fdf; hdr.ch_brs = frame.fmt.brs; #else if (frame.fmt.fdf) @@ -1808,6 +1817,7 @@ static int ctucanfd_probe(FAR struct pci_device_s *dev) if (!priv->bar0_base) { pcierr("Not found BAR0\n"); + ret = -ENODEV; goto errout; } @@ -1823,6 +1833,7 @@ static int ctucanfd_probe(FAR struct pci_device_s *dev) if (!priv->canfd_base) { pcierr("Not found CANFD bar\n"); + ret = -ENODEV; goto errout; } @@ -1922,11 +1933,11 @@ errout: { if (priv->devs[i].pcidev) { -#ifdef CONFIG_CAN_KVASER_SOCKET +#ifdef CONFIG_CAN_CTUCANFD_SOCKET netdev_unregister(&priv->devs[i].dev); #endif -#ifdef CONFIG_CAN_KVASER_CHARDEV +#ifdef CONFIG_CAN_CTUCANFD_CHARDEV unregister_driver(devpath); #endif }