* [PATCH 0/2] can: sun4i: bug fixes
@ 2017-08-17 13:59 GBert
  2017-08-17 13:59 ` [PATCH 1/2] can: sun4i: fix overrun GBert
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: GBert @ 2017-08-17 13:59 UTC (permalink / raw)
  To: linux-can; +Cc: Gerhard Bertelsmann
From: Gerhard Bertelsmann <info@gerhard-bertelsmann.de>
The patchset fixes two issues for Allwinner A10/A20 CAN IP
Gerhard Bertelsmann (2):
  can: sun4i: fix overrun
  can: sun4i: fix loopback mode
 drivers/net/can/sun4i_can.c |   18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)
-- 
1.7.9.5
^ permalink raw reply	[flat|nested] 6+ messages in thread
* [PATCH 1/2] can: sun4i: fix overrun
  2017-08-17 13:59 [PATCH 0/2] can: sun4i: bug fixes GBert
@ 2017-08-17 13:59 ` GBert
  2017-10-19 12:10   ` Marc Kleine-Budde
  2017-08-17 13:59 ` [PATCH 2/2] can: sun4i: fix loopback mode GBert
  2017-10-19 11:32 ` [PATCH 0/2] can: sun4i: bug fixes Gerhard Bertelsmann
  2 siblings, 1 reply; 6+ messages in thread
From: GBert @ 2017-08-17 13:59 UTC (permalink / raw)
  To: linux-can; +Cc: Gerhard Bertelsmann
From: Gerhard Bertelsmann <info@gerhard-bertelsmann.de>
SUN4Is CAN IP has a 64 byte deep FIFO buffer. If the buffer is not drained
fast enough (overrun) it's getting mangled. The fix resets the buffer for
faster recovery - unrecoverable data in the buffer will be ignored
Signed-off-by: Gerhard Bertelsmann <info@gerhard-bertelsmann.de>
---
 drivers/net/can/sun4i_can.c |   15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)
diff --git drivers/net/can/sun4i_can.c drivers/net/can/sun4i_can.c
index 68ef0a4..0d673ff 100644
--- drivers/net/can/sun4i_can.c
+++ drivers/net/can/sun4i_can.c
@@ -531,6 +531,7 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)
 	}
 
 	if (isrc & SUN4I_INT_DATA_OR) {
+		int err;
 		/* data overrun interrupt */
 		netdev_dbg(dev, "data overrun interrupt\n");
 		if (likely(skb)) {
@@ -539,6 +540,15 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)
 		}
 		stats->rx_over_errors++;
 		stats->rx_errors++;
+
+		/* reset the CAN IP by entering reset mode */
+		err = set_reset_mode(dev);
+		if (err)
+			netdev_err(dev, "could not enter reset mode\n");
+		err = set_normal_mode(dev);
+		if (err)
+			netdev_err(dev, "could not enter normal mode\n");
+
 		/* clear bit */
 		sun4i_can_write_cmdreg(priv, SUN4I_CMD_CLEAR_OR_FLAG);
 	}
@@ -653,8 +663,9 @@ static irqreturn_t sun4i_can_interrupt(int irq, void *dev_id)
 			netif_wake_queue(dev);
 			can_led_event(dev, CAN_LED_EVENT_TX);
 		}
-		if (isrc & SUN4I_INT_RBUF_VLD) {
-			/* receive interrupt */
+		if ((isrc & SUN4I_INT_RBUF_VLD) &&
+		    !(isrc & SUN4I_INT_DATA_OR)) {
+			/* receive interrupt - don't read if overrun occurred */
 			while (status & SUN4I_STA_RBUF_RDY) {
 				/* RX buffer is not empty */
 				sun4i_can_rx(dev);
-- 
1.7.9.5
^ permalink raw reply related	[flat|nested] 6+ messages in thread
* [PATCH 2/2] can: sun4i: fix loopback mode
  2017-08-17 13:59 [PATCH 0/2] can: sun4i: bug fixes GBert
  2017-08-17 13:59 ` [PATCH 1/2] can: sun4i: fix overrun GBert
@ 2017-08-17 13:59 ` GBert
  2017-10-24 11:04   ` Marc Kleine-Budde
  2017-10-19 11:32 ` [PATCH 0/2] can: sun4i: bug fixes Gerhard Bertelsmann
  2 siblings, 1 reply; 6+ messages in thread
From: GBert @ 2017-08-17 13:59 UTC (permalink / raw)
  To: linux-can; +Cc: Gerhard Bertelsmann
From: Gerhard Bertelsmann <info@gerhard-bertelsmann.de>
fix loopback mode by setting the right flag and remove presume mode
Signed-off-by: Gerhard Bertelsmann <info@gerhard-bertelsmann.de>
---
 drivers/net/can/sun4i_can.c |    3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git drivers/net/can/sun4i_can.c drivers/net/can/sun4i_can.c
index 0d673ff..c7413c5 100644
--- drivers/net/can/sun4i_can.c
+++ drivers/net/can/sun4i_can.c
@@ -342,7 +342,7 @@ static int sun4i_can_start(struct net_device *dev)
 
 	/* enter the selected mode */
 	mod_reg_val = readl(priv->base + SUN4I_REG_MSEL_ADDR);
-	if (priv->can.ctrlmode & CAN_CTRLMODE_PRESUME_ACK)
+	if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)
 		mod_reg_val |= SUN4I_MSEL_LOOPBACK_MODE;
 	else if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
 		mod_reg_val |= SUN4I_MSEL_LISTEN_ONLY_MODE;
@@ -822,7 +822,6 @@ static int sun4ican_probe(struct platform_device *pdev)
 	priv->can.ctrlmode_supported = CAN_CTRLMODE_BERR_REPORTING |
 				       CAN_CTRLMODE_LISTENONLY |
 				       CAN_CTRLMODE_LOOPBACK |
-				       CAN_CTRLMODE_PRESUME_ACK |
 				       CAN_CTRLMODE_3_SAMPLES;
 	priv->base = addr;
 	priv->clk = clk;
-- 
1.7.9.5
^ permalink raw reply related	[flat|nested] 6+ messages in thread
* Re: [PATCH 0/2] can: sun4i: bug fixes
  2017-08-17 13:59 [PATCH 0/2] can: sun4i: bug fixes GBert
  2017-08-17 13:59 ` [PATCH 1/2] can: sun4i: fix overrun GBert
  2017-08-17 13:59 ` [PATCH 2/2] can: sun4i: fix loopback mode GBert
@ 2017-10-19 11:32 ` Gerhard Bertelsmann
  2 siblings, 0 replies; 6+ messages in thread
From: Gerhard Bertelsmann @ 2017-10-19 11:32 UTC (permalink / raw)
  To: linux-can
Hi,
Am 2017-08-17 15:59, schrieb GBert:
> From: Gerhard Bertelsmann <info@gerhard-bertelsmann.de>
> 
> The patchset fixes two issues for Allwinner A10/A20 CAN IP
> 
> Gerhard Bertelsmann (2):
>   can: sun4i: fix overrun
>   can: sun4i: fix loopback mode
> 
>  drivers/net/can/sun4i_can.c |   18 ++++++++++++++----
>  1 file changed, 14 insertions(+), 4 deletions(-)
any chance to get these fixes integrated into the Linux kernel ?
Regards
Gerd
^ permalink raw reply	[flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] can: sun4i: fix overrun
  2017-08-17 13:59 ` [PATCH 1/2] can: sun4i: fix overrun GBert
@ 2017-10-19 12:10   ` Marc Kleine-Budde
  0 siblings, 0 replies; 6+ messages in thread
From: Marc Kleine-Budde @ 2017-10-19 12:10 UTC (permalink / raw)
  To: GBert, linux-can
[-- Attachment #1.1: Type: text/plain, Size: 2410 bytes --]
On 08/17/2017 03:59 PM, GBert wrote:
> From: Gerhard Bertelsmann <info@gerhard-bertelsmann.de>
> 
> SUN4Is CAN IP has a 64 byte deep FIFO buffer. If the buffer is not drained
> fast enough (overrun) it's getting mangled.
What does that mean?
> The fix resets the buffer for faster recovery - unrecoverable data in
> the buffer will be ignored
So already received CAN frames are dropped?
> Signed-off-by: Gerhard Bertelsmann <info@gerhard-bertelsmann.de>
> ---
>  drivers/net/can/sun4i_can.c |   15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git drivers/net/can/sun4i_can.c drivers/net/can/sun4i_can.c
> index 68ef0a4..0d673ff 100644
> --- drivers/net/can/sun4i_can.c
> +++ drivers/net/can/sun4i_can.c
> @@ -531,6 +531,7 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)
>  	}
>  
>  	if (isrc & SUN4I_INT_DATA_OR) {
> +		int err;
>  		/* data overrun interrupt */
>  		netdev_dbg(dev, "data overrun interrupt\n");
>  		if (likely(skb)) {
> @@ -539,6 +540,15 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)
>  		}
>  		stats->rx_over_errors++;
>  		stats->rx_errors++;
> +
> +		/* reset the CAN IP by entering reset mode */
> +		err = set_reset_mode(dev);
> +		if (err)
> +			netdev_err(dev, "could not enter reset mode\n");
No need to print an error here set_{reset,normal}_mode() already do this.
> +		err = set_normal_mode(dev);
> +		if (err)
> +			netdev_err(dev, "could not enter normal mode\n");
> +
>  		/* clear bit */
>  		sun4i_can_write_cmdreg(priv, SUN4I_CMD_CLEAR_OR_FLAG);
>  	}
> @@ -653,8 +663,9 @@ static irqreturn_t sun4i_can_interrupt(int irq, void *dev_id)
>  			netif_wake_queue(dev);
>  			can_led_event(dev, CAN_LED_EVENT_TX);
>  		}
> -		if (isrc & SUN4I_INT_RBUF_VLD) {
> -			/* receive interrupt */
> +		if ((isrc & SUN4I_INT_RBUF_VLD) &&
> +		    !(isrc & SUN4I_INT_DATA_OR)) {
> +			/* receive interrupt - don't read if overrun occurred */
>  			while (status & SUN4I_STA_RBUF_RDY) {
>  				/* RX buffer is not empty */
>  				sun4i_can_rx(dev);
> 
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: 488 bytes --]
^ permalink raw reply	[flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] can: sun4i: fix loopback mode
  2017-08-17 13:59 ` [PATCH 2/2] can: sun4i: fix loopback mode GBert
@ 2017-10-24 11:04   ` Marc Kleine-Budde
  0 siblings, 0 replies; 6+ messages in thread
From: Marc Kleine-Budde @ 2017-10-24 11:04 UTC (permalink / raw)
  To: GBert, linux-can
[-- Attachment #1.1: Type: text/plain, Size: 569 bytes --]
On 08/17/2017 03:59 PM, GBert wrote:
> From: Gerhard Bertelsmann <info@gerhard-bertelsmann.de>
> 
> fix loopback mode by setting the right flag and remove presume mode
> 
> Signed-off-by: Gerhard Bertelsmann <info@gerhard-bertelsmann.de>
Added to can and added stable on Cc.
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: 488 bytes --]
^ permalink raw reply	[flat|nested] 6+ messages in thread
end of thread, other threads:[~2017-10-24 11:04 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-08-17 13:59 [PATCH 0/2] can: sun4i: bug fixes GBert
2017-08-17 13:59 ` [PATCH 1/2] can: sun4i: fix overrun GBert
2017-10-19 12:10   ` Marc Kleine-Budde
2017-08-17 13:59 ` [PATCH 2/2] can: sun4i: fix loopback mode GBert
2017-10-24 11:04   ` Marc Kleine-Budde
2017-10-19 11:32 ` [PATCH 0/2] can: sun4i: bug fixes Gerhard Bertelsmann
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).