linux-can.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* RFC [PATCH v2 1/2] can: flexcan: fix mailbox initialization
@ 2014-09-02 15:03 Marc Kleine-Budde
  2014-09-02 15:03 ` RFC: [PATCH v2 1/2] can: flexcan: Correctly initialize mailboxes Marc Kleine-Budde
  2014-09-02 15:03 ` RFC: [PATCH v2 2/2] can: flexcan: increase FLEXCAN_MCR_MAXMB() macro to 7 bits Marc Kleine-Budde
  0 siblings, 2 replies; 7+ messages in thread
From: Marc Kleine-Budde @ 2014-09-02 15:03 UTC (permalink / raw)
  To: linux-can; +Cc: david

Picking up David's patch....


^ permalink raw reply	[flat|nested] 7+ messages in thread

* RFC: [PATCH v2 1/2] can: flexcan: Correctly initialize mailboxes
  2014-09-02 15:03 RFC [PATCH v2 1/2] can: flexcan: fix mailbox initialization Marc Kleine-Budde
@ 2014-09-02 15:03 ` Marc Kleine-Budde
  2014-09-03  6:58   ` David Jander
  2014-09-03 14:34   ` David Jander
  2014-09-02 15:03 ` RFC: [PATCH v2 2/2] can: flexcan: increase FLEXCAN_MCR_MAXMB() macro to 7 bits Marc Kleine-Budde
  1 sibling, 2 replies; 7+ messages in thread
From: Marc Kleine-Budde @ 2014-09-02 15:03 UTC (permalink / raw)
  To: linux-can; +Cc: david, Marc Kleine-Budde

From: David Jander <david@protonic.nl>

Apparently mailboxes may contain random data at startup, causing some of
them being prepared for message reception. This causes overruns being
missed or even confusing the IRQ check for trasmitted messages, increasing
the transmit counter instead of the error counter.

Signed-off-by: David Jander <david@protonic.nl>
[mkl: adjust starting value of loop]
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
Changes since v1:
- don't remove existing initialization of FLEXCAN_TX_BUF_ID
- start loop at FLEXCAN_TX_BUF_ID + 1

Marc

 drivers/net/can/flexcan.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
index 630c7bf..6ec49bd 100644
--- a/drivers/net/can/flexcan.c
+++ b/drivers/net/can/flexcan.c
@@ -801,6 +801,7 @@ static int flexcan_chip_start(struct net_device *dev)
 	struct flexcan_regs __iomem *regs = priv->base;
 	int err;
 	u32 reg_mcr, reg_ctrl;
+	int i;
 
 	/* enable module */
 	err = flexcan_chip_enable(priv);
@@ -870,6 +871,11 @@ static int flexcan_chip_start(struct net_device *dev)
 	/* Abort any pending TX, mark Mailbox as INACTIVE */
 	flexcan_write(FLEXCAN_MB_CNT_CODE(0x4),
 		      &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl);
+	/* Clear and invalidate all mailboxes first */
+	for (i = FLEXCAN_TX_BUF_ID + 1; i < ARRAY_SIZE(regs->cantxfg; i++) {
+		flexcan_write(FLEXCAN_MB_CNT_CODE(0),
+		      &regs->cantxfg[i].can_ctrl);
+	}
 
 	/* acceptance mask/acceptance code (accept everything) */
 	flexcan_write(0x0, &regs->rxgmask);
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* RFC: [PATCH v2 2/2] can: flexcan: increase FLEXCAN_MCR_MAXMB() macro to 7 bits
  2014-09-02 15:03 RFC [PATCH v2 1/2] can: flexcan: fix mailbox initialization Marc Kleine-Budde
  2014-09-02 15:03 ` RFC: [PATCH v2 1/2] can: flexcan: Correctly initialize mailboxes Marc Kleine-Budde
@ 2014-09-02 15:03 ` Marc Kleine-Budde
  1 sibling, 0 replies; 7+ messages in thread
From: Marc Kleine-Budde @ 2014-09-02 15:03 UTC (permalink / raw)
  To: linux-can; +Cc: david, Marc Kleine-Budde

This patch increases the mask in the FLEXCAN_MCR_MAXMB() to 7 bits as in the
newer flexcan cores the MAXMB field is 7 bits wide.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---

Changes since v1:
- new

 drivers/net/can/flexcan.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
index 6ec49bd..44ba836 100644
--- a/drivers/net/can/flexcan.c
+++ b/drivers/net/can/flexcan.c
@@ -62,7 +62,7 @@
 #define FLEXCAN_MCR_BCC			BIT(16)
 #define FLEXCAN_MCR_LPRIO_EN		BIT(13)
 #define FLEXCAN_MCR_AEN			BIT(12)
-#define FLEXCAN_MCR_MAXMB(x)		((x) & 0x1f)
+#define FLEXCAN_MCR_MAXMB(x)		((x) & 0x7f)
 #define FLEXCAN_MCR_IDAM_A		(0 << 8)
 #define FLEXCAN_MCR_IDAM_B		(1 << 8)
 #define FLEXCAN_MCR_IDAM_C		(2 << 8)
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: RFC: [PATCH v2 1/2] can: flexcan: Correctly initialize mailboxes
  2014-09-02 15:03 ` RFC: [PATCH v2 1/2] can: flexcan: Correctly initialize mailboxes Marc Kleine-Budde
@ 2014-09-03  6:58   ` David Jander
  2014-09-03  9:18     ` Marc Kleine-Budde
  2014-09-03 14:34   ` David Jander
  1 sibling, 1 reply; 7+ messages in thread
From: David Jander @ 2014-09-03  6:58 UTC (permalink / raw)
  To: Marc Kleine-Budde; +Cc: linux-can

On Tue,  2 Sep 2014 17:03:35 +0200
Marc Kleine-Budde <mkl@pengutronix.de> wrote:

> From: David Jander <david@protonic.nl>
> 
> Apparently mailboxes may contain random data at startup, causing some of
> them being prepared for message reception. This causes overruns being
> missed or even confusing the IRQ check for trasmitted messages, increasing
> the transmit counter instead of the error counter.
> 
> Signed-off-by: David Jander <david@protonic.nl>
> [mkl: adjust starting value of loop]
> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
> ---
> Changes since v1:
> - don't remove existing initialization of FLEXCAN_TX_BUF_ID
> - start loop at FLEXCAN_TX_BUF_ID + 1
> 
> Marc
> 
>  drivers/net/can/flexcan.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
> index 630c7bf..6ec49bd 100644
> --- a/drivers/net/can/flexcan.c
> +++ b/drivers/net/can/flexcan.c
> @@ -801,6 +801,7 @@ static int flexcan_chip_start(struct net_device *dev)
>  	struct flexcan_regs __iomem *regs = priv->base;
>  	int err;
>  	u32 reg_mcr, reg_ctrl;
> +	int i;
>  
>  	/* enable module */
>  	err = flexcan_chip_enable(priv);
> @@ -870,6 +871,11 @@ static int flexcan_chip_start(struct net_device *dev)
>  	/* Abort any pending TX, mark Mailbox as INACTIVE */
>  	flexcan_write(FLEXCAN_MB_CNT_CODE(0x4),
>  		      &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl);
> +	/* Clear and invalidate all mailboxes first */
> +	for (i = FLEXCAN_TX_BUF_ID + 1; i < ARRAY_SIZE(regs->cantxfg; i++) {
> +		flexcan_write(FLEXCAN_MB_CNT_CODE(0),
> +		      &regs->cantxfg[i].can_ctrl);
> +	}
>  
>  	/* acceptance mask/acceptance code (accept everything) */
>  	flexcan_write(0x0, &regs->rxgmask);

This assumes that FLEXCAN_TX_BUF_ID is the ID of the first available MB. Other
than that, it should work I believe.
OTOH, since this loop is more like a memset(...0...), wouldn't it be nice to
just clear all MB's CODE registers and then initialize TX_BUF (and others)
afterwards?

Best regards,

-- 
David Jander
Protonic Holland.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: RFC: [PATCH v2 1/2] can: flexcan: Correctly initialize mailboxes
  2014-09-03  6:58   ` David Jander
@ 2014-09-03  9:18     ` Marc Kleine-Budde
  0 siblings, 0 replies; 7+ messages in thread
From: Marc Kleine-Budde @ 2014-09-03  9:18 UTC (permalink / raw)
  To: David Jander; +Cc: linux-can

[-- Attachment #1: Type: text/plain, Size: 2914 bytes --]

On 09/03/2014 08:58 AM, David Jander wrote:
> On Tue,  2 Sep 2014 17:03:35 +0200
> Marc Kleine-Budde <mkl@pengutronix.de> wrote:
> 
>> From: David Jander <david@protonic.nl>
>>
>> Apparently mailboxes may contain random data at startup, causing some of
>> them being prepared for message reception. This causes overruns being
>> missed or even confusing the IRQ check for trasmitted messages, increasing
>> the transmit counter instead of the error counter.
>>
>> Signed-off-by: David Jander <david@protonic.nl>
>> [mkl: adjust starting value of loop]
>> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
>> ---
>> Changes since v1:
>> - don't remove existing initialization of FLEXCAN_TX_BUF_ID
>> - start loop at FLEXCAN_TX_BUF_ID + 1
>>
>> Marc
>>
>>  drivers/net/can/flexcan.c | 6 ++++++
>>  1 file changed, 6 insertions(+)
>>
>> diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
>> index 630c7bf..6ec49bd 100644
>> --- a/drivers/net/can/flexcan.c
>> +++ b/drivers/net/can/flexcan.c
>> @@ -801,6 +801,7 @@ static int flexcan_chip_start(struct net_device *dev)
>>  	struct flexcan_regs __iomem *regs = priv->base;
>>  	int err;
>>  	u32 reg_mcr, reg_ctrl;
>> +	int i;
>>  
>>  	/* enable module */
>>  	err = flexcan_chip_enable(priv);
>> @@ -870,6 +871,11 @@ static int flexcan_chip_start(struct net_device *dev)
>>  	/* Abort any pending TX, mark Mailbox as INACTIVE */
>>  	flexcan_write(FLEXCAN_MB_CNT_CODE(0x4),
>>  		      &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl);
>> +	/* Clear and invalidate all mailboxes first */
>> +	for (i = FLEXCAN_TX_BUF_ID + 1; i < ARRAY_SIZE(regs->cantxfg; i++) {
>> +		flexcan_write(FLEXCAN_MB_CNT_CODE(0),
>> +		      &regs->cantxfg[i].can_ctrl);
>> +	}
>>  
>>  	/* acceptance mask/acceptance code (accept everything) */
>>  	flexcan_write(0x0, &regs->rxgmask);
> 
> This assumes that FLEXCAN_TX_BUF_ID is the ID of the first available MB. Other
> than that, it should work I believe.
> OTOH, since this loop is more like a memset(...0...), wouldn't it be nice to
> just clear all MB's CODE registers and then initialize TX_BUF (and others)
> afterwards?

See patch v3, I've changed the order, first do the loop, then initialize
FLEXCAN_TX_BUF_ID as 0x4. I've pushed this series to the testing branch
of the linux-can repo on gitorious. Make your imx6 errata fix patch
based on this branch.

You probably have to change FLEXCAN_TX_BUF_ID and/or introduce a new
define for the invalid mailbox. When your patch is ready we can look at
the patches and see if it makes sense to shuffle some changes around.

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: RFC: [PATCH v2 1/2] can: flexcan: Correctly initialize mailboxes
  2014-09-02 15:03 ` RFC: [PATCH v2 1/2] can: flexcan: Correctly initialize mailboxes Marc Kleine-Budde
  2014-09-03  6:58   ` David Jander
@ 2014-09-03 14:34   ` David Jander
  2014-09-03 14:36     ` Marc Kleine-Budde
  1 sibling, 1 reply; 7+ messages in thread
From: David Jander @ 2014-09-03 14:34 UTC (permalink / raw)
  To: Marc Kleine-Budde; +Cc: linux-can

On Tue,  2 Sep 2014 17:03:35 +0200
Marc Kleine-Budde <mkl@pengutronix.de> wrote:

> From: David Jander <david@protonic.nl>
> 
> Apparently mailboxes may contain random data at startup, causing some of
> them being prepared for message reception. This causes overruns being
> missed or even confusing the IRQ check for trasmitted messages, increasing
> the transmit counter instead of the error counter.
> 
> Signed-off-by: David Jander <david@protonic.nl>
> [mkl: adjust starting value of loop]
> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
> ---
> Changes since v1:
> - don't remove existing initialization of FLEXCAN_TX_BUF_ID
> - start loop at FLEXCAN_TX_BUF_ID + 1
> 
> Marc
> 
>  drivers/net/can/flexcan.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
> index 630c7bf..6ec49bd 100644
> --- a/drivers/net/can/flexcan.c
> +++ b/drivers/net/can/flexcan.c
> @@ -801,6 +801,7 @@ static int flexcan_chip_start(struct net_device *dev)
>  	struct flexcan_regs __iomem *regs = priv->base;
>  	int err;
>  	u32 reg_mcr, reg_ctrl;
> +	int i;
>  
>  	/* enable module */
>  	err = flexcan_chip_enable(priv);
> @@ -870,6 +871,11 @@ static int flexcan_chip_start(struct net_device *dev)
>  	/* Abort any pending TX, mark Mailbox as INACTIVE */
>  	flexcan_write(FLEXCAN_MB_CNT_CODE(0x4),
>  		      &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl);
> +	/* Clear and invalidate all mailboxes first */
> +	for (i = FLEXCAN_TX_BUF_ID + 1; i < ARRAY_SIZE(regs->cantxfg; i++) {

Oops! You are missing a closing parenthesis in this line.
I will assume you amend this commit and base mine on top of that...

> +		flexcan_write(FLEXCAN_MB_CNT_CODE(0),
> +		      &regs->cantxfg[i].can_ctrl);
> +	}
>  
>  	/* acceptance mask/acceptance code (accept everything) */
>  	flexcan_write(0x0, &regs->rxgmask);

Best regards,

-- 
David Jander
Protonic Holland.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: RFC: [PATCH v2 1/2] can: flexcan: Correctly initialize mailboxes
  2014-09-03 14:34   ` David Jander
@ 2014-09-03 14:36     ` Marc Kleine-Budde
  0 siblings, 0 replies; 7+ messages in thread
From: Marc Kleine-Budde @ 2014-09-03 14:36 UTC (permalink / raw)
  To: David Jander; +Cc: linux-can

[-- Attachment #1: Type: text/plain, Size: 2194 bytes --]

On 09/03/2014 04:34 PM, David Jander wrote:
> On Tue,  2 Sep 2014 17:03:35 +0200
> Marc Kleine-Budde <mkl@pengutronix.de> wrote:
> 
>> From: David Jander <david@protonic.nl>
>>
>> Apparently mailboxes may contain random data at startup, causing some of
>> them being prepared for message reception. This causes overruns being
>> missed or even confusing the IRQ check for trasmitted messages, increasing
>> the transmit counter instead of the error counter.
>>
>> Signed-off-by: David Jander <david@protonic.nl>
>> [mkl: adjust starting value of loop]
>> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
>> ---
>> Changes since v1:
>> - don't remove existing initialization of FLEXCAN_TX_BUF_ID
>> - start loop at FLEXCAN_TX_BUF_ID + 1
>>
>> Marc
>>
>>  drivers/net/can/flexcan.c | 6 ++++++
>>  1 file changed, 6 insertions(+)
>>
>> diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
>> index 630c7bf..6ec49bd 100644
>> --- a/drivers/net/can/flexcan.c
>> +++ b/drivers/net/can/flexcan.c
>> @@ -801,6 +801,7 @@ static int flexcan_chip_start(struct net_device *dev)
>>  	struct flexcan_regs __iomem *regs = priv->base;
>>  	int err;
>>  	u32 reg_mcr, reg_ctrl;
>> +	int i;
>>  
>>  	/* enable module */
>>  	err = flexcan_chip_enable(priv);
>> @@ -870,6 +871,11 @@ static int flexcan_chip_start(struct net_device *dev)
>>  	/* Abort any pending TX, mark Mailbox as INACTIVE */
>>  	flexcan_write(FLEXCAN_MB_CNT_CODE(0x4),
>>  		      &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl);
>> +	/* Clear and invalidate all mailboxes first */
>> +	for (i = FLEXCAN_TX_BUF_ID + 1; i < ARRAY_SIZE(regs->cantxfg; i++) {
> 
> Oops! You are missing a closing parenthesis in this line.
> I will assume you amend this commit and base mine on top of that...

Doh! I introduced this problem, when converting the 64 to
ARRAY_SIZE(...without the closing ).

Fixed.

Marc
-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2014-09-03 14:36 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-02 15:03 RFC [PATCH v2 1/2] can: flexcan: fix mailbox initialization Marc Kleine-Budde
2014-09-02 15:03 ` RFC: [PATCH v2 1/2] can: flexcan: Correctly initialize mailboxes Marc Kleine-Budde
2014-09-03  6:58   ` David Jander
2014-09-03  9:18     ` Marc Kleine-Budde
2014-09-03 14:34   ` David Jander
2014-09-03 14:36     ` Marc Kleine-Budde
2014-09-02 15:03 ` RFC: [PATCH v2 2/2] can: flexcan: increase FLEXCAN_MCR_MAXMB() macro to 7 bits Marc Kleine-Budde

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).