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
>
WARNING: multiple messages have this Message-ID (diff)
From: b29396@freescale.com (Dong Aisheng)
To: linux-arm-kernel@lists.infradead.org
Subject: 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 at imx6sxsabresd:~# cansend can0 123##1001122334566778899AABBC566778899AABB334
Rx side:
root at 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
>
WARNING: multiple messages have this Message-ID (diff)
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 9:04 UTC|newest]
Thread overview: 46+ 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 ` Dong Aisheng
2014-11-05 13:16 ` 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 13:16 ` Dong Aisheng
2014-11-05 13:16 ` Dong Aisheng
2014-11-05 14:31 ` Marc Kleine-Budde
2014-11-05 14:31 ` Marc Kleine-Budde
2014-11-05 14:42 ` Oliver Hartkopp
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 13:16 ` Dong Aisheng
2014-11-05 13:16 ` Dong Aisheng
2014-11-05 14:29 ` Marc Kleine-Budde
2014-11-05 14:29 ` Marc Kleine-Budde
2014-11-05 18:15 ` M_CAN message RAM initialization AppNote - was: " Oliver Hartkopp
2014-11-05 18:15 ` Oliver Hartkopp
2014-11-06 1:57 ` Dong Aisheng
2014-11-06 1:57 ` Dong Aisheng
2014-11-06 1:57 ` Dong Aisheng
2014-11-06 7:04 ` Oliver Hartkopp
2014-11-06 7:04 ` Oliver Hartkopp
2014-11-06 8:09 ` Dong Aisheng
2014-11-06 8:09 ` Dong Aisheng
2014-11-06 8:09 ` Dong Aisheng
2014-11-06 12:33 ` Oliver Hartkopp
2014-11-06 12:33 ` Oliver Hartkopp
2014-11-06 12:47 ` Marc Kleine-Budde
2014-11-06 12:47 ` Marc Kleine-Budde
[not found] ` <545BA039.7080108@hartkopp.net>
2014-11-07 8:15 ` Dong Aisheng
2015-02-05 19:04 ` new M_CAN IP rev 3.2.x documentation available - was: Re: M_CAN message RAM initialization AppNote Oliver Hartkopp
2014-11-07 8:40 ` M_CAN message RAM initialization AppNote - was: Re: [PATCH V3 3/3] can: m_can: workaround for transmit data less than 4 bytes Dong Aisheng
2014-11-07 8:40 ` Dong Aisheng
2014-11-07 8:40 ` Dong Aisheng
2014-11-07 8:34 ` Dong Aisheng [this message]
2014-11-07 8:34 ` Dong Aisheng
2014-11-07 8:34 ` Dong Aisheng
2014-11-06 9:00 ` Marc Kleine-Budde
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 16:22 ` Eric Dumazet
2014-11-05 17:33 ` Oliver Hartkopp
2014-11-05 17:33 ` Oliver Hartkopp
2014-11-06 1:52 ` Dong Aisheng
2014-11-06 1:52 ` Dong Aisheng
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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.