From: Dong Aisheng <b29396@freescale.com>
To: Oliver Hartkopp <socketcan@hartkopp.net>
Cc: Marc Kleine-Budde <mkl@pengutronix.de>,
<linux-can@vger.kernel.org>, <wg@grandegger.com>,
<varkabhadram@gmail.com>, <netdev@vger.kernel.org>,
<linux-arm-kernel@lists.infradead.org>
Subject: Re: M_CAN message RAM initialization AppNote - was: Re: [PATCH V3 3/3] can: m_can: workaround for transmit data less than 4 bytes
Date: Fri, 7 Nov 2014 16:34:50 +0800 [thread overview]
Message-ID: <20141107083447.GA23086@shlinux1.ap.freescale.net> (raw)
In-Reply-To: <545B6AB4.70003@hartkopp.net>
On Thu, Nov 06, 2014 at 01:33:56PM +0100, Oliver Hartkopp wrote:
> On 06.11.2014 09:09, Dong Aisheng wrote:
> >On Thu, Nov 06, 2014 at 08:04:17AM +0100, Oliver Hartkopp wrote:
>
>
> >>To prevent the M_CAN controller detecting checksum errors when
> >>reading potentially uninitialized TX message RAM content to transmit
> >>CAN frames the TX message RAM has to be written with (any kind of)
> >>initial data.
> >>
> >
> >The key point of the issue is that why M_CAN will read potentially uninitialized
> >TX message RAM content which should not happen?
> >e.g. for our case of the issue, if we sending a no data frame or a less
> >than 4 bytes frame, why m_can will read extra 4 bytes uninitialized/unset
> >data which seems not reasonable?
> >
> > From IP code logic, it will read full 8 bytes of data no matter how many data
> >actually to be transfered which is strange.
>
> Yes.
>
> >
> >For sending data over 4 bytes, since the Message RAM content will be filled
> >with the real data to be transfered so there's no such issue.
>
> E.g. think about the transfer of a CAN FD frame with 32 byte.
> When you only fill up content until 28 byte the last four bytes
> still remain uninitialized.
>
> Did you try this 28 byte use-case with an uninitialized TX message RAM ?
>
> cansend can0 123##1001122334566778899AABBCCDDEEFF001122334566778899AABB
>
> To me it looks too risky when we only initialize the first 8 byte.
>
I tried 28 byte case with two MX6SX SDB board and it worked.
See below:
Tx side:
root@imx6sxsabresd:~# cansend can0 123##1001122334566778899AABBC566778899AABB334
Rx side:
root@imx6sxsabresd:~# candump -x can0
can0 RX B - 123 [32] 00 11 22 33 45 66 77 88 99 AA BB CC DD EE FF 00 11 22 33 45 66 77 88 99 AA BB 00 00 00 00 00 00
I think this is mainly because the driver will ensure to write
the full 32 bytes to Message RAM even we only fill up content of
28 bytes. The remain 4 bytes written to M_RAM are default 0.
This seems avoid the possibility of reading uninitialized TX message RAM
for transfer.
The code is done as follows:
for (i = 0; i < cf->len; i += 4)
m_can_fifo_write(priv, 0, M_CAN_FIFO_DATA(i / 4),
*(u32 *)(cf->data + i));
cf->len will be rounded to 32 in cansend.
> >
> >>---
> >>
> >>Then the code should memset() the entire TX FIFO element - and not
> >>only the 8 data bytes we are addressing now.
> >>
> >
> >Our IC guy told me the issue only happened on transferring a data size
> >of less than 4 bytes and my test also proved that.
>
> 'less than'?
>
As i said before, from IP code logic, M_CAN will read extra data bytes
from TX buffer only for sending data less than 4 bytes.
e.g.
cansnd can0 123#
cansnd can0 123#112233
Both case will read the full 8 byte from TX buffer even it sends no data
and a 3 bytes data.
But
cansnd can0 123#1122334455
it read 8 bytes
cansnd can0 123##1112233445566778899001122
it read 12 bytes.
No extra uninitialized data read.
> So you might try to use 26 bytes too:
>
> cansend can0 123##1001122334566778899AABBCCDDEEFF001122334566778899
>
>
It works too.
> >So i'm not sure memset() the entire TX FIFO element is neccesary...
>
> It's no big deal - so we should be defensive here.
> And memset() is not working as Marc pointed out in another mail.
>
> So we would need to loop with
>
> m_can_fifo_write(priv, 0, M_CAN_FIFO_DATA(i), 0x0);
>
This simple loop may not work.
m_can_fifo_write is only for Tx Buffer.
Since Message RAM may be shared, we may want to initialize each part of
Message RAM used by this M_CAN controller.
Something like follows in probe() function:
/* initialize the entire Message RAM in use to avoid possible
* ECC/parity checksum errors when reading an uninitialized buffer
*/
start = priv->mcfg[MRAM_SIDF].off;
end = priv->mcfg[MRAM_TXB].off +
priv->mcfg[MRAM_TXB].num * TXB_ELEMENT_SIZE;
for (i = start; i < end; i += 4)
writel(0x0, priv->mram_base + i);
I will send a updated patch for this.
Regards
Dong Aisheng
> >
> >Do you think we could keep the current solution firstly and updated later
> >if needed?
>
> No :-)
>
> I would like to have all data bytes to be written at startup.
>
> Regards,
> Oliver
>
next prev parent reply other threads:[~2014-11-07 8:34 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-05 13:16 [PATCH V3 1/3] can: add can_is_canfd_skb() API Dong Aisheng
2014-11-05 13:16 ` [PATCH V3 2/3] can: m_can: update to support CAN FD features Dong Aisheng
2014-11-05 14:31 ` Marc Kleine-Budde
2014-11-05 14:42 ` Oliver Hartkopp
2014-11-05 13:16 ` [PATCH V3 3/3] can: m_can: workaround for transmit data less than 4 bytes Dong Aisheng
2014-11-05 14:29 ` Marc Kleine-Budde
2014-11-05 18:15 ` M_CAN message RAM initialization AppNote - was: " Oliver Hartkopp
2014-11-06 1:57 ` Dong Aisheng
2014-11-06 7:04 ` Oliver Hartkopp
2014-11-06 8:09 ` Dong Aisheng
2014-11-06 12:33 ` Oliver Hartkopp
2014-11-06 12:47 ` Marc Kleine-Budde
2014-11-07 8:40 ` Dong Aisheng
2014-11-07 8:34 ` Dong Aisheng [this message]
2014-11-06 9:00 ` Marc Kleine-Budde
2014-11-05 16:22 ` [PATCH V3 1/3] can: add can_is_canfd_skb() API Eric Dumazet
2014-11-05 17:33 ` Oliver Hartkopp
2014-11-06 1:52 ` Dong Aisheng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141107083447.GA23086@shlinux1.ap.freescale.net \
--to=b29396@freescale.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-can@vger.kernel.org \
--cc=mkl@pengutronix.de \
--cc=netdev@vger.kernel.org \
--cc=socketcan@hartkopp.net \
--cc=varkabhadram@gmail.com \
--cc=wg@grandegger.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).