linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] can: D_CAN: perform a sofware reset on open
       [not found] <20190926085005.24805-1-jhofstee@victronenergy.com>
@ 2019-09-26  8:50 ` Jeroen Hofstee
  2019-10-01 13:39   ` Kurt Van Dijck
  2019-10-01 14:32   ` Marc Kleine-Budde
  2019-09-26  8:50 ` [PATCH 2/2] can: C_CAN: add bus recovery events Jeroen Hofstee
  1 sibling, 2 replies; 7+ messages in thread
From: Jeroen Hofstee @ 2019-09-26  8:50 UTC (permalink / raw)
  To: linux-can
  Cc: Jeroen Hofstee, Wolfgang Grandegger, Marc Kleine-Budde,
	David S. Miller, open list:NETWORKING DRIVERS, open list

When the C_CAN interface is closed it is put in power down mode, but
does not reset the error counters / state. So reset the D_CAN on open,
so the reported state and the actual state match.

According to [1], the C_CAN module doesn't have the software reset.

[1] http://www.bosch-semiconductors.com/media/ip_modules/pdf_2/c_can_fd8/users_manual_c_can_fd8_r210_1.pdf

Signed-off-by: Jeroen Hofstee <jhofstee@victronenergy.com>
---
 drivers/net/can/c_can/c_can.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
index 606b7d8ffe13..502a181d02e7 100644
--- a/drivers/net/can/c_can/c_can.c
+++ b/drivers/net/can/c_can/c_can.c
@@ -52,6 +52,7 @@
 #define CONTROL_EX_PDR		BIT(8)
 
 /* control register */
+#define CONTROL_SWR		BIT(15)
 #define CONTROL_TEST		BIT(7)
 #define CONTROL_CCE		BIT(6)
 #define CONTROL_DISABLE_AR	BIT(5)
@@ -569,6 +570,26 @@ static void c_can_configure_msg_objects(struct net_device *dev)
 				   IF_MCONT_RCV_EOB);
 }
 
+static int software_reset(struct net_device *dev)
+{
+	struct c_can_priv *priv = netdev_priv(dev);
+	int retry = 0;
+
+	if (priv->type != BOSCH_D_CAN)
+		return 0;
+
+	priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_SWR | CONTROL_INIT);
+	while (priv->read_reg(priv, C_CAN_CTRL_REG) & CONTROL_SWR) {
+		msleep(20);
+		if (retry++ > 100) {
+			netdev_err(dev, "CCTRL: software reset failed\n");
+			return -EIO;
+		}
+	}
+
+	return 0;
+}
+
 /*
  * Configure C_CAN chip:
  * - enable/disable auto-retransmission
@@ -578,6 +599,11 @@ static void c_can_configure_msg_objects(struct net_device *dev)
 static int c_can_chip_config(struct net_device *dev)
 {
 	struct c_can_priv *priv = netdev_priv(dev);
+	int err;
+
+	err = software_reset(dev);
+	if (err)
+		return err;
 
 	/* enable automatic retransmission */
 	priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_ENABLE_AR);
-- 
2.17.1


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

* [PATCH 2/2] can: C_CAN: add bus recovery events
       [not found] <20190926085005.24805-1-jhofstee@victronenergy.com>
  2019-09-26  8:50 ` [PATCH 1/2] can: D_CAN: perform a sofware reset on open Jeroen Hofstee
@ 2019-09-26  8:50 ` Jeroen Hofstee
  2019-10-01  7:40   ` Kurt Van Dijck
  1 sibling, 1 reply; 7+ messages in thread
From: Jeroen Hofstee @ 2019-09-26  8:50 UTC (permalink / raw)
  To: linux-can
  Cc: Jeroen Hofstee, Wolfgang Grandegger, Marc Kleine-Budde,
	David S. Miller, open list:NETWORKING DRIVERS, open list

While the state is update when the error counters increase and decrease,
there is no event when the bus recovers and the error counters decrease
again. So add that event as well.

Change the state going downward to be ERROR_PASSIVE -> ERROR_WARNING ->
ERROR_ACTIVE instead of directly to ERROR_ACTIVE again.

Signed-off-by: Jeroen Hofstee <jhofstee@victronenergy.com>
---
 drivers/net/can/c_can/c_can.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
index 502a181d02e7..5cfaab18e10b 100644
--- a/drivers/net/can/c_can/c_can.c
+++ b/drivers/net/can/c_can/c_can.c
@@ -912,6 +912,9 @@ static int c_can_handle_state_change(struct net_device *dev,
 	struct can_berr_counter bec;
 
 	switch (error_type) {
+	case C_CAN_NO_ERROR:
+		priv->can.state = CAN_STATE_ERROR_ACTIVE;
+		break;
 	case C_CAN_ERROR_WARNING:
 		/* error warning state */
 		priv->can.can_stats.error_warning++;
@@ -942,6 +945,13 @@ static int c_can_handle_state_change(struct net_device *dev,
 				ERR_CNT_RP_SHIFT;
 
 	switch (error_type) {
+	case C_CAN_NO_ERROR:
+		/* error warning state */
+		cf->can_id |= CAN_ERR_CRTL;
+		cf->data[1] = CAN_ERR_CRTL_ACTIVE;
+		cf->data[6] = bec.txerr;
+		cf->data[7] = bec.rxerr;
+		break;
 	case C_CAN_ERROR_WARNING:
 		/* error warning state */
 		cf->can_id |= CAN_ERR_CRTL;
@@ -1080,11 +1090,17 @@ static int c_can_poll(struct napi_struct *napi, int quota)
 	/* handle bus recovery events */
 	if ((!(curr & STATUS_BOFF)) && (last & STATUS_BOFF)) {
 		netdev_dbg(dev, "left bus off state\n");
-		priv->can.state = CAN_STATE_ERROR_ACTIVE;
+		work_done += c_can_handle_state_change(dev, C_CAN_ERROR_PASSIVE);
 	}
+
 	if ((!(curr & STATUS_EPASS)) && (last & STATUS_EPASS)) {
 		netdev_dbg(dev, "left error passive state\n");
-		priv->can.state = CAN_STATE_ERROR_ACTIVE;
+		work_done += c_can_handle_state_change(dev, C_CAN_ERROR_WARNING);
+	}
+
+	if ((!(curr & STATUS_EWARN)) && (last & STATUS_EWARN)) {
+		netdev_dbg(dev, "left error warning state\n");
+		work_done += c_can_handle_state_change(dev, C_CAN_NO_ERROR);
 	}
 
 	/* handle lec errors on the bus */
-- 
2.17.1


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

* Re: [PATCH 2/2] can: C_CAN: add bus recovery events
  2019-09-26  8:50 ` [PATCH 2/2] can: C_CAN: add bus recovery events Jeroen Hofstee
@ 2019-10-01  7:40   ` Kurt Van Dijck
  2019-10-01 13:37     ` Kurt Van Dijck
  0 siblings, 1 reply; 7+ messages in thread
From: Kurt Van Dijck @ 2019-10-01  7:40 UTC (permalink / raw)
  To: Jeroen Hofstee
  Cc: linux-can, Wolfgang Grandegger, Marc Kleine-Budde,
	David S. Miller, open list:NETWORKING DRIVERS, open list

On do, 26 sep 2019 08:50:51 +0000, Jeroen Hofstee wrote:
> While the state is update when the error counters increase and decrease,
> there is no event when the bus recovers and the error counters decrease
> again. So add that event as well.
> 
> Change the state going downward to be ERROR_PASSIVE -> ERROR_WARNING ->
> ERROR_ACTIVE instead of directly to ERROR_ACTIVE again.

This looks like a proper thing to do
Acked-by: Kurt Van Dijck <dev.kurt@vandijck-laurijssen.be>

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

* Re: [PATCH 2/2] can: C_CAN: add bus recovery events
  2019-10-01  7:40   ` Kurt Van Dijck
@ 2019-10-01 13:37     ` Kurt Van Dijck
  0 siblings, 0 replies; 7+ messages in thread
From: Kurt Van Dijck @ 2019-10-01 13:37 UTC (permalink / raw)
  To: Jeroen Hofstee, linux-can, Wolfgang Grandegger,
	Marc Kleine-Budde, David S. Miller, open list:NETWORKING DRIVERS,
	open list

On di, 01 okt 2019 09:40:57 +0200, Kurt Van Dijck wrote:
> On do, 26 sep 2019 08:50:51 +0000, Jeroen Hofstee wrote:
> > While the state is update when the error counters increase and decrease,
> > there is no event when the bus recovers and the error counters decrease
> > again. So add that event as well.
> > 
> > Change the state going downward to be ERROR_PASSIVE -> ERROR_WARNING ->
> > ERROR_ACTIVE instead of directly to ERROR_ACTIVE again.
> 
> This looks like a proper thing to do
> Acked-by: Kurt Van Dijck <dev.kurt@vandijck-laurijssen.be>

Thanks for this, now I see when the bus is normal again.

Tested-by: Kurt Van Dijck <dev.kurt@vandijck-laurijssen.be>

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

* Re: [PATCH 1/2] can: D_CAN: perform a sofware reset on open
  2019-09-26  8:50 ` [PATCH 1/2] can: D_CAN: perform a sofware reset on open Jeroen Hofstee
@ 2019-10-01 13:39   ` Kurt Van Dijck
  2019-10-01 14:32   ` Marc Kleine-Budde
  1 sibling, 0 replies; 7+ messages in thread
From: Kurt Van Dijck @ 2019-10-01 13:39 UTC (permalink / raw)
  To: Jeroen Hofstee
  Cc: linux-can, Wolfgang Grandegger, Marc Kleine-Budde,
	David S. Miller, open list:NETWORKING DRIVERS, open list

On do, 26 sep 2019 08:50:44 +0000, Jeroen Hofstee wrote:
> When the C_CAN interface is closed it is put in power down mode, but
> does not reset the error counters / state. So reset the D_CAN on open,
> so the reported state and the actual state match.
> 
> According to [1], the C_CAN module doesn't have the software reset.
> 
> [1] http://www.bosch-semiconductors.com/media/ip_modules/pdf_2/c_can_fd8/users_manual_c_can_fd8_r210_1.pdf
> 
> Signed-off-by: Jeroen Hofstee <jhofstee@victronenergy.com>

I observed no problems after applying the patch.

Tested-by: Kurt Van Dijck <dev.kurt@vandijck-laurijssen.be>

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

* Re: [PATCH 1/2] can: D_CAN: perform a sofware reset on open
  2019-09-26  8:50 ` [PATCH 1/2] can: D_CAN: perform a sofware reset on open Jeroen Hofstee
  2019-10-01 13:39   ` Kurt Van Dijck
@ 2019-10-01 14:32   ` Marc Kleine-Budde
  2019-10-01 21:17     ` Jeroen Hofstee
  1 sibling, 1 reply; 7+ messages in thread
From: Marc Kleine-Budde @ 2019-10-01 14:32 UTC (permalink / raw)
  To: Jeroen Hofstee, linux-can
  Cc: Wolfgang Grandegger, David S. Miller,
	open list:NETWORKING DRIVERS, open list


[-- Attachment #1.1: Type: text/plain, Size: 2484 bytes --]

On 9/26/19 10:50 AM, Jeroen Hofstee wrote:
> When the C_CAN interface is closed it is put in power down mode, but
> does not reset the error counters / state. So reset the D_CAN on open,
> so the reported state and the actual state match.
> 
> According to [1], the C_CAN module doesn't have the software reset.
> 
> [1] http://www.bosch-semiconductors.com/media/ip_modules/pdf_2/c_can_fd8/users_manual_c_can_fd8_r210_1.pdf
> 
> Signed-off-by: Jeroen Hofstee <jhofstee@victronenergy.com>
> ---
>  drivers/net/can/c_can/c_can.c | 26 ++++++++++++++++++++++++++
>  1 file changed, 26 insertions(+)
> 
> diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
> index 606b7d8ffe13..502a181d02e7 100644
> --- a/drivers/net/can/c_can/c_can.c
> +++ b/drivers/net/can/c_can/c_can.c
> @@ -52,6 +52,7 @@
>  #define CONTROL_EX_PDR		BIT(8)
>  
>  /* control register */
> +#define CONTROL_SWR		BIT(15)
>  #define CONTROL_TEST		BIT(7)
>  #define CONTROL_CCE		BIT(6)
>  #define CONTROL_DISABLE_AR	BIT(5)
> @@ -569,6 +570,26 @@ static void c_can_configure_msg_objects(struct net_device *dev)
>  				   IF_MCONT_RCV_EOB);
>  }
>  
> +static int software_reset(struct net_device *dev)

Please add the common prefix "c_can_" to the function

> +{
> +	struct c_can_priv *priv = netdev_priv(dev);
> +	int retry = 0;
> +
> +	if (priv->type != BOSCH_D_CAN)
> +		return 0;
> +
> +	priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_SWR | CONTROL_INIT);
> +	while (priv->read_reg(priv, C_CAN_CTRL_REG) & CONTROL_SWR) {
> +		msleep(20);
> +		if (retry++ > 100) {
> +			netdev_err(dev, "CCTRL: software reset failed\n");
> +			return -EIO;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
>  /*
>   * Configure C_CAN chip:
>   * - enable/disable auto-retransmission
> @@ -578,6 +599,11 @@ static void c_can_configure_msg_objects(struct net_device *dev)
>  static int c_can_chip_config(struct net_device *dev)
>  {
>  	struct c_can_priv *priv = netdev_priv(dev);
> +	int err;
> +
> +	err = software_reset(dev);
> +	if (err)
> +		return err;
>  
>  	/* enable automatic retransmission */
>  	priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_ENABLE_AR);
> 

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] 7+ messages in thread

* Re: [PATCH 1/2] can: D_CAN: perform a sofware reset on open
  2019-10-01 14:32   ` Marc Kleine-Budde
@ 2019-10-01 21:17     ` Jeroen Hofstee
  0 siblings, 0 replies; 7+ messages in thread
From: Jeroen Hofstee @ 2019-10-01 21:17 UTC (permalink / raw)
  To: Marc Kleine-Budde, linux-can
  Cc: Wolfgang Grandegger, David S. Miller,
	open list:NETWORKING DRIVERS, open list

Hello Marc,

On 10/1/19 4:32 PM, Marc Kleine-Budde wrote:
> On 9/26/19 10:50 AM, Jeroen Hofstee wrote:
>> When the C_CAN interface is closed it is put in power down mode, but
>> does not reset the error counters / state. So reset the D_CAN on open,
>> so the reported state and the actual state match.
>>
>> According to [1], the C_CAN module doesn't have the software reset.
>>
>> [1] http://www.bosch-semiconductors.com/media/ip_modules/pdf_2/c_can_fd8/users_manual_c_can_fd8_r210_1.pdf
>>
>> Signed-off-by: Jeroen Hofstee <jhofstee@victronenergy.com>
>> ---
>>   drivers/net/can/c_can/c_can.c | 26 ++++++++++++++++++++++++++
>>   1 file changed, 26 insertions(+)
>>
>> diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
>> index 606b7d8ffe13..502a181d02e7 100644
>> --- a/drivers/net/can/c_can/c_can.c
>> +++ b/drivers/net/can/c_can/c_can.c
>> @@ -52,6 +52,7 @@
>>   #define CONTROL_EX_PDR		BIT(8)
>>   
>>   /* control register */
>> +#define CONTROL_SWR		BIT(15)
>>   #define CONTROL_TEST		BIT(7)
>>   #define CONTROL_CCE		BIT(6)
>>   #define CONTROL_DISABLE_AR	BIT(5)
>> @@ -569,6 +570,26 @@ static void c_can_configure_msg_objects(struct net_device *dev)
>>   				   IF_MCONT_RCV_EOB);
>>   }
>>   
>> +static int software_reset(struct net_device *dev)
> Please add the common prefix "c_can_" to the function

Fine with me, I did sent a v2.

Regards,
Jeroen


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

end of thread, other threads:[~2019-10-01 21:17 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20190926085005.24805-1-jhofstee@victronenergy.com>
2019-09-26  8:50 ` [PATCH 1/2] can: D_CAN: perform a sofware reset on open Jeroen Hofstee
2019-10-01 13:39   ` Kurt Van Dijck
2019-10-01 14:32   ` Marc Kleine-Budde
2019-10-01 21:17     ` Jeroen Hofstee
2019-09-26  8:50 ` [PATCH 2/2] can: C_CAN: add bus recovery events Jeroen Hofstee
2019-10-01  7:40   ` Kurt Van Dijck
2019-10-01 13:37     ` Kurt Van Dijck

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