linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/3] can: esd_usb: Some more preparation for supporting esd CAN-USB/3
@ 2023-02-16 19:04 Frank Jungclaus
  2023-02-16 19:04 ` [PATCH v3 1/3] can: esd_usb: Move mislocated storage of SJA1000_ECC_SEG bits in case of a bus error Frank Jungclaus
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Frank Jungclaus @ 2023-02-16 19:04 UTC (permalink / raw)
  To: linux-can, Marc Kleine-Budde, Wolfgang Grandegger, Vincent Mailhol
  Cc: Stefan Mätje, netdev, linux-kernel, Frank Jungclaus

Another small batch of patches to be seen as preparation for adding
support of the newly available esd CAN-USB/3 to esd_usb.c.

Due to some unresolved questions adding support for
CAN_CTRLMODE_BERR_REPORTING has been postponed to one of the future
patches.

*Resend of the whole series as v3 for easier handling.*
---
* Changelog *

v2 -> v3:
 * More specific subjects
 * Try to use imperative instead of past tense

v1 -> v2:
 * [Patch v2 1/3]: No changes.
 * [Patch v2 2/3]: Make use of can_change_state() and relocate testing
   alloc_can_err_skb() for NULL to the end of esd_usb_rx_event(), to
   have things like can_bus_off(), can_change_state() working even in
   out of memory conditions.
 * [Patch v2 3/3]: No changes. I will 'declare esd_usb_msg as an union
   instead of a struct' in a separate follow-up patch.

v1:
Link: https://lore.kernel.org/all/20221219212013.1294820-1-frank.jungclaus@esd.eu/
Link: https://lore.kernel.org/all/20221219212717.1298282-1-frank.jungclaus@esd.eu/


Frank Jungclaus (3):
  can: esd_usb: Move mislocated storage of SJA1000_ECC_SEG bits in case
    of a bus error
  can: esd_usb: Make use of can_change_state() and relocate checking skb
    for NULL
  can: esd_usb: Improve readability on decoding ESD_EV_CAN_ERROR_EXT
    messages

 drivers/net/can/usb/esd_usb.c | 70 ++++++++++++++++++++---------------
 1 file changed, 40 insertions(+), 30 deletions(-)


base-commit: fa1d915a624f72b153a9ff9700232056758a2b6c
-- 
2.25.1


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

* [PATCH v3 1/3] can: esd_usb: Move mislocated storage of SJA1000_ECC_SEG bits in case of a bus error
  2023-02-16 19:04 [PATCH v3 0/3] can: esd_usb: Some more preparation for supporting esd CAN-USB/3 Frank Jungclaus
@ 2023-02-16 19:04 ` Frank Jungclaus
  2023-02-16 19:04 ` [PATCH v3 2/3] can: esd_usb: Make use of can_change_state() and relocate checking skb for NULL Frank Jungclaus
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Frank Jungclaus @ 2023-02-16 19:04 UTC (permalink / raw)
  To: linux-can, Marc Kleine-Budde, Wolfgang Grandegger, Vincent Mailhol
  Cc: Stefan Mätje, netdev, linux-kernel, Frank Jungclaus

Move the supply for cf->data[3] (bit stream position of CAN error), in
case of a bus- or protocol-error, outside of the "switch (ecc &
SJA1000_ECC_MASK){}"-statement, because this bit stream position is
independent of the error type.

Fixes: 96d8e90382dc ("can: Add driver for esd CAN-USB/2 device")
Signed-off-by: Frank Jungclaus <frank.jungclaus@esd.eu>
---
 drivers/net/can/usb/esd_usb.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/can/usb/esd_usb.c b/drivers/net/can/usb/esd_usb.c
index 42323f5e6f3a..5e182fadd875 100644
--- a/drivers/net/can/usb/esd_usb.c
+++ b/drivers/net/can/usb/esd_usb.c
@@ -286,7 +286,6 @@ static void esd_usb_rx_event(struct esd_usb_net_priv *priv,
 				cf->data[2] |= CAN_ERR_PROT_STUFF;
 				break;
 			default:
-				cf->data[3] = ecc & SJA1000_ECC_SEG;
 				break;
 			}
 
@@ -294,6 +293,9 @@ static void esd_usb_rx_event(struct esd_usb_net_priv *priv,
 			if (!(ecc & SJA1000_ECC_DIR))
 				cf->data[2] |= CAN_ERR_PROT_TX;
 
+			/* Bit stream position in CAN frame as the error was detected */
+			cf->data[3] = ecc & SJA1000_ECC_SEG;
+
 			if (priv->can.state == CAN_STATE_ERROR_WARNING ||
 			    priv->can.state == CAN_STATE_ERROR_PASSIVE) {
 				cf->data[1] = (txerr > rxerr) ?
-- 
2.25.1


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

* [PATCH v3 2/3] can: esd_usb: Make use of can_change_state() and relocate checking skb for NULL
  2023-02-16 19:04 [PATCH v3 0/3] can: esd_usb: Some more preparation for supporting esd CAN-USB/3 Frank Jungclaus
  2023-02-16 19:04 ` [PATCH v3 1/3] can: esd_usb: Move mislocated storage of SJA1000_ECC_SEG bits in case of a bus error Frank Jungclaus
@ 2023-02-16 19:04 ` Frank Jungclaus
  2023-02-16 19:04 ` [PATCH v3 3/3] can: esd_usb: Improve readability on decoding ESD_EV_CAN_ERROR_EXT messages Frank Jungclaus
  2023-02-16 20:05 ` [PATCH v3 0/3] can: esd_usb: Some more preparation for supporting esd CAN-USB/3 Marc Kleine-Budde
  3 siblings, 0 replies; 5+ messages in thread
From: Frank Jungclaus @ 2023-02-16 19:04 UTC (permalink / raw)
  To: linux-can, Marc Kleine-Budde, Wolfgang Grandegger, Vincent Mailhol
  Cc: Stefan Mätje, netdev, linux-kernel, Frank Jungclaus

Start a rework initiated by Vincents remarks "You should not report
the greatest of txerr and rxerr but the one which actually increased."
[1] and "As far as I understand, those flags should be set only when
the threshold is reached" [2] .

Therefore make use of can_change_state() to (among others) set the
flags CAN_ERR_CRTL_[RT]X_WARNING and CAN_ERR_CRTL_[RT]X_PASSIVE,
maintain CAN statistic counters for error_warning, error_passive and
bus_off.

Relocate testing alloc_can_err_skb() for NULL to the end of
esd_usb_rx_event(), to have things like can_bus_off(),
can_change_state() working even in out of memory conditions.

Fixes: 96d8e90382dc ("can: Add driver for esd CAN-USB/2 device")
Signed-off-by: Frank Jungclaus <frank.jungclaus@esd.eu>
Link: [1] https://lore.kernel.org/all/CAMZ6RqKGBWe15aMkf8-QLf-cOQg99GQBebSm+1wEzTqHgvmNuw@mail.gmail.com/
Link: [2] https://lore.kernel.org/all/CAMZ6Rq+QBO1yTX_o6GV0yhdBj-RzZSRGWDZBS0fs7zbSTy4hmA@mail.gmail.com/
---
 drivers/net/can/usb/esd_usb.c | 50 +++++++++++++++++------------------
 1 file changed, 25 insertions(+), 25 deletions(-)

diff --git a/drivers/net/can/usb/esd_usb.c b/drivers/net/can/usb/esd_usb.c
index 5e182fadd875..578b25f873e5 100644
--- a/drivers/net/can/usb/esd_usb.c
+++ b/drivers/net/can/usb/esd_usb.c
@@ -239,41 +239,42 @@ static void esd_usb_rx_event(struct esd_usb_net_priv *priv,
 			   msg->msg.rx.dlc, state, ecc, rxerr, txerr);
 
 		skb = alloc_can_err_skb(priv->netdev, &cf);
-		if (skb == NULL) {
-			stats->rx_dropped++;
-			return;
-		}
 
 		if (state != priv->old_state) {
+			enum can_state tx_state, rx_state;
+			enum can_state new_state = CAN_STATE_ERROR_ACTIVE;
+
 			priv->old_state = state;
 
 			switch (state & ESD_BUSSTATE_MASK) {
 			case ESD_BUSSTATE_BUSOFF:
-				priv->can.state = CAN_STATE_BUS_OFF;
-				cf->can_id |= CAN_ERR_BUSOFF;
-				priv->can.can_stats.bus_off++;
+				new_state = CAN_STATE_BUS_OFF;
 				can_bus_off(priv->netdev);
 				break;
 			case ESD_BUSSTATE_WARN:
-				priv->can.state = CAN_STATE_ERROR_WARNING;
-				priv->can.can_stats.error_warning++;
+				new_state = CAN_STATE_ERROR_WARNING;
 				break;
 			case ESD_BUSSTATE_ERRPASSIVE:
-				priv->can.state = CAN_STATE_ERROR_PASSIVE;
-				priv->can.can_stats.error_passive++;
+				new_state = CAN_STATE_ERROR_PASSIVE;
 				break;
 			default:
-				priv->can.state = CAN_STATE_ERROR_ACTIVE;
+				new_state = CAN_STATE_ERROR_ACTIVE;
 				txerr = 0;
 				rxerr = 0;
 				break;
 			}
-		} else {
+
+			if (new_state != priv->can.state) {
+				tx_state = (txerr >= rxerr) ? new_state : 0;
+				rx_state = (txerr <= rxerr) ? new_state : 0;
+				can_change_state(priv->netdev, cf,
+						 tx_state, rx_state);
+			}
+		} else if (skb) {
 			priv->can.can_stats.bus_error++;
 			stats->rx_errors++;
 
-			cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR |
-				      CAN_ERR_CNT;
+			cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
 
 			switch (ecc & SJA1000_ECC_MASK) {
 			case SJA1000_ECC_BIT:
@@ -295,21 +296,20 @@ static void esd_usb_rx_event(struct esd_usb_net_priv *priv,
 
 			/* Bit stream position in CAN frame as the error was detected */
 			cf->data[3] = ecc & SJA1000_ECC_SEG;
-
-			if (priv->can.state == CAN_STATE_ERROR_WARNING ||
-			    priv->can.state == CAN_STATE_ERROR_PASSIVE) {
-				cf->data[1] = (txerr > rxerr) ?
-					CAN_ERR_CRTL_TX_PASSIVE :
-					CAN_ERR_CRTL_RX_PASSIVE;
-			}
-			cf->data[6] = txerr;
-			cf->data[7] = rxerr;
 		}
 
 		priv->bec.txerr = txerr;
 		priv->bec.rxerr = rxerr;
 
-		netif_rx(skb);
+		if (skb) {
+			cf->can_id |= CAN_ERR_CNT;
+			cf->data[6] = txerr;
+			cf->data[7] = rxerr;
+
+			netif_rx(skb);
+		} else {
+			stats->rx_dropped++;
+		}
 	}
 }
 
-- 
2.25.1


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

* [PATCH v3 3/3] can: esd_usb: Improve readability on decoding ESD_EV_CAN_ERROR_EXT messages
  2023-02-16 19:04 [PATCH v3 0/3] can: esd_usb: Some more preparation for supporting esd CAN-USB/3 Frank Jungclaus
  2023-02-16 19:04 ` [PATCH v3 1/3] can: esd_usb: Move mislocated storage of SJA1000_ECC_SEG bits in case of a bus error Frank Jungclaus
  2023-02-16 19:04 ` [PATCH v3 2/3] can: esd_usb: Make use of can_change_state() and relocate checking skb for NULL Frank Jungclaus
@ 2023-02-16 19:04 ` Frank Jungclaus
  2023-02-16 20:05 ` [PATCH v3 0/3] can: esd_usb: Some more preparation for supporting esd CAN-USB/3 Marc Kleine-Budde
  3 siblings, 0 replies; 5+ messages in thread
From: Frank Jungclaus @ 2023-02-16 19:04 UTC (permalink / raw)
  To: linux-can, Marc Kleine-Budde, Wolfgang Grandegger, Vincent Mailhol
  Cc: Stefan Mätje, netdev, linux-kernel, Frank Jungclaus

As suggested by Marc introduce a union plus a struct ev_can_err_ext
for easier decoding of an ESD_EV_CAN_ERROR_EXT event message (which
simply is a rx_msg with some dedicated data).

Suggested-by: Marc Kleine-Budde <mkl@pengutronix.de>
Link: https://lore.kernel.org/linux-can/20220621071152.ggyhrr5sbzvwpkpx@pengutronix.de/
Signed-off-by: Frank Jungclaus <frank.jungclaus@esd.eu>
---
 drivers/net/can/usb/esd_usb.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/drivers/net/can/usb/esd_usb.c b/drivers/net/can/usb/esd_usb.c
index 578b25f873e5..55b36973952d 100644
--- a/drivers/net/can/usb/esd_usb.c
+++ b/drivers/net/can/usb/esd_usb.c
@@ -127,7 +127,15 @@ struct rx_msg {
 	u8 dlc;
 	__le32 ts;
 	__le32 id; /* upper 3 bits contain flags */
-	u8 data[8];
+	union {
+		u8 data[8];
+		struct {
+			u8 status; /* CAN Controller Status */
+			u8 ecc;    /* Error Capture Register */
+			u8 rec;    /* RX Error Counter */
+			u8 tec;    /* TX Error Counter */
+		} ev_can_err_ext;  /* For ESD_EV_CAN_ERROR_EXT */
+	};
 };
 
 struct tx_msg {
@@ -229,10 +237,10 @@ static void esd_usb_rx_event(struct esd_usb_net_priv *priv,
 	u32 id = le32_to_cpu(msg->msg.rx.id) & ESD_IDMASK;
 
 	if (id == ESD_EV_CAN_ERROR_EXT) {
-		u8 state = msg->msg.rx.data[0];
-		u8 ecc = msg->msg.rx.data[1];
-		u8 rxerr = msg->msg.rx.data[2];
-		u8 txerr = msg->msg.rx.data[3];
+		u8 state = msg->msg.rx.ev_can_err_ext.status;
+		u8 ecc = msg->msg.rx.ev_can_err_ext.ecc;
+		u8 rxerr = msg->msg.rx.ev_can_err_ext.rec;
+		u8 txerr = msg->msg.rx.ev_can_err_ext.tec;
 
 		netdev_dbg(priv->netdev,
 			   "CAN_ERR_EV_EXT: dlc=%#02x state=%02x ecc=%02x rec=%02x tec=%02x\n",
-- 
2.25.1


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

* Re: [PATCH v3 0/3] can: esd_usb: Some more preparation for supporting esd CAN-USB/3
  2023-02-16 19:04 [PATCH v3 0/3] can: esd_usb: Some more preparation for supporting esd CAN-USB/3 Frank Jungclaus
                   ` (2 preceding siblings ...)
  2023-02-16 19:04 ` [PATCH v3 3/3] can: esd_usb: Improve readability on decoding ESD_EV_CAN_ERROR_EXT messages Frank Jungclaus
@ 2023-02-16 20:05 ` Marc Kleine-Budde
  3 siblings, 0 replies; 5+ messages in thread
From: Marc Kleine-Budde @ 2023-02-16 20:05 UTC (permalink / raw)
  To: Frank Jungclaus
  Cc: linux-can, Wolfgang Grandegger, Vincent Mailhol,
	Stefan Mätje, netdev, linux-kernel

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

On 16.02.2023 20:04:47, Frank Jungclaus wrote:
> Another small batch of patches to be seen as preparation for adding
> support of the newly available esd CAN-USB/3 to esd_usb.c.
> 
> Due to some unresolved questions adding support for
> CAN_CTRLMODE_BERR_REPORTING has been postponed to one of the future
> patches.
> 
> *Resend of the whole series as v3 for easier handling.*

Applied to linux-can-next/testing.

Thanks,
Marc

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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

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

end of thread, other threads:[~2023-02-16 20:05 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-16 19:04 [PATCH v3 0/3] can: esd_usb: Some more preparation for supporting esd CAN-USB/3 Frank Jungclaus
2023-02-16 19:04 ` [PATCH v3 1/3] can: esd_usb: Move mislocated storage of SJA1000_ECC_SEG bits in case of a bus error Frank Jungclaus
2023-02-16 19:04 ` [PATCH v3 2/3] can: esd_usb: Make use of can_change_state() and relocate checking skb for NULL Frank Jungclaus
2023-02-16 19:04 ` [PATCH v3 3/3] can: esd_usb: Improve readability on decoding ESD_EV_CAN_ERROR_EXT messages Frank Jungclaus
2023-02-16 20:05 ` [PATCH v3 0/3] can: esd_usb: Some more preparation for supporting esd CAN-USB/3 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).