]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
can: sun4i_can: sun4i_can_err(): fix {rx,tx}_errors statistics
authorDario Binacchi <dario.binacchi@amarulasolutions.com>
Fri, 22 Nov 2024 22:15:51 +0000 (23:15 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Tue, 26 Nov 2024 09:51:00 +0000 (10:51 +0100)
The sun4i_can_err() function only incremented the receive error counter
and never the transmit error counter, even if the STA_ERR_DIR flag
reported that an error had occurred during transmission.

Increment the receive/transmit error counter based on the value of the
STA_ERR_DIR flag.

Fixes: 0738eff14d81 ("can: Allwinner A10/A20 CAN Controller support - Kernel module")
Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
Link: https://patch.msgid.link/20241122221650.633981-11-dario.binacchi@amarulasolutions.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/sun4i_can.c

index 17f94cca93fbcca8b9ade937bd68dedb0e91b55f..4311c1f0eafd8d793e39373146b33a64a9328048 100644 (file)
@@ -579,11 +579,9 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)
                /* bus error interrupt */
                netdev_dbg(dev, "bus error interrupt\n");
                priv->can.can_stats.bus_error++;
-               stats->rx_errors++;
+               ecc = readl(priv->base + SUN4I_REG_STA_ADDR);
 
                if (likely(skb)) {
-                       ecc = readl(priv->base + SUN4I_REG_STA_ADDR);
-
                        cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
 
                        switch (ecc & SUN4I_STA_MASK_ERR) {
@@ -601,9 +599,15 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)
                                               >> 16;
                                break;
                        }
-                       /* error occurred during transmission? */
-                       if ((ecc & SUN4I_STA_ERR_DIR) == 0)
+               }
+
+               /* error occurred during transmission? */
+               if ((ecc & SUN4I_STA_ERR_DIR) == 0) {
+                       if (likely(skb))
                                cf->data[2] |= CAN_ERR_PROT_TX;
+                       stats->tx_errors++;
+               } else {
+                       stats->rx_errors++;
                }
        }
        if (isrc & SUN4I_INT_ERR_PASSIVE) {