Re: [PATCH 2/2] can: flexcan: add support for ISO CAN-FD
From: Michael Walle <hidden>
Date: 2020-06-30 17:00:34
Also in:
linux-can, lkml
Am 2020-06-30 18:15, schrieb Oliver Hartkopp:
On 30.06.20 07:53, Michael Walle wrote:quoted
[+ Oliver] Hi Joakim, Am 2020-06-30 04:42, schrieb Joakim Zhang:quoted
quoted
-----Original Message----- From: Michael Walle <redacted> Sent: 2020年6月30日 2:18 To: linux-can@vger.kernel.org; netdev@vger.kernel.org; linux-kernel@vger.kernel.org Cc: Wolfgang Grandegger <redacted>; Marc Kleine-Budde [off-list ref]; David S . Miller [off-list ref]; Jakub Kicinski [off-list ref]; Joakim Zhang [off-list ref]; dl-linux-imx [off-list ref]; Michael Walle [off-list ref] Subject: [PATCH 2/2] can: flexcan: add support for ISO CAN-FD Up until now, the controller used non-ISO CAN-FD mode, although it supports it. Add support for ISO mode, too. By default the hardware is in non-ISO mode and an enable bit has to be explicitly set. Signed-off-by: Michael Walle <redacted> --- drivers/net/can/flexcan.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.cindex 183e094f8d66..a92d3cdf4195 100644--- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c@@ -94,6 +94,7 @@#define FLEXCAN_CTRL2_MRP BIT(18) #define FLEXCAN_CTRL2_RRS BIT(17) #define FLEXCAN_CTRL2_EACEN BIT(16) +#define FLEXCAN_CTRL2_ISOCANFDEN BIT(12) /* FLEXCAN memory error control register (MECR) bits */ #define FLEXCAN_MECR_ECRWRDIS BIT(31)@@ -1344,14 +1345,25 @@ static int flexcan_chip_start(structnet_device *dev) else reg_mcr |= FLEXCAN_MCR_SRX_DIS; - /* MCR - CAN-FD */ - if (priv->can.ctrlmode & CAN_CTRLMODE_FD) + /* MCR, CTRL2 + * + * CAN-FD mode + * ISO CAN-FD mode + */ + reg_ctrl2 = priv->read(®s->ctrl2); + if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { reg_mcr |= FLEXCAN_MCR_FDEN; - else + reg_ctrl2 |= FLEXCAN_CTRL2_ISOCANFDEN; + } else { reg_mcr &= ~FLEXCAN_MCR_FDEN; + } + + if (priv->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO) + reg_ctrl2 &= ~FLEXCAN_CTRL2_ISOCANFDEN;
[1]
quoted
[..]quoted
ip link set can0 up type can bitrate 1000000 dbitrate 5000000 fd on ip link set can0 up type can bitrate 1000000 dbitrate 5000000 fd on \ fd-non-iso onvs.quoted
ip link set can0 up type can bitrate 1000000 dbitrate 5000000 fd-non-iso onI haven't found anything if CAN_CTRLMODE_FD_NON_ISO depends on CAN_CTRLMODE_FD. I.e. wether CAN_CTRLMODE_FD_NON_ISO can only be set if CAN_CTRLMODE_FD is also set. Only the following piece of code, which might be a hint that you have to set CAN_CTRLMODE_FD if you wan't to use CAN_CTRLMODE_FD_NON_ISO: drivers/net/can/dev.c: /* do not check for static fd-non-iso if 'fd' is disabled */ if (!(maskedflags & CAN_CTRLMODE_FD)) ctrlstatic &= ~CAN_CTRLMODE_FD_NON_ISO; If CAN_CTRLMODE_FD_NON_ISO can be set without CAN_CTRLMODE_FD, what should be the mode if both are set at the same time?CAN_CTRLMODE_FD_NON_ISO is only relevant when CAN_CTRLMODE_FD is set. So in the example from above ip link set can0 up type can bitrate 1000000 dbitrate 5000000 fd-non-iso on either the setting of 'dbitrate 5000000' and 'fd-non-iso on' is pointless. When switching to FD-mode with 'fd on' the FD relevant settings need to be applied. FD ISO is the default. Did this help or did I get anything wrong?
Thanks for the explanation. Yes this helped a great deal and this patch should be correct; it sets ISO mode if CAN_CTRLMODE_FD is set and masks it again if CAN_CTRLMODE_FD_NON_ISO is set. See [1]. -michael