* [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 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.