]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
can: hi311x: hi3110_can_ist(): fix {rx,tx}_errors statistics
authorDario Binacchi <dario.binacchi@amarulasolutions.com>
Fri, 22 Nov 2024 22:15:49 +0000 (23:15 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Tue, 26 Nov 2024 09:50:48 +0000 (10:50 +0100)
The hi3110_can_ist() function was incorrectly incrementing only the
receive error counter, even in cases of bit or acknowledgment errors that
occur during transmission.

The fix the issue by incrementing the appropriate counter based on the
type of error.

Fixes: 57e83fb9b746 ("can: hi311x: Add Holt HI-311x CAN driver")
Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
Link: https://patch.msgid.link/20241122221650.633981-9-dario.binacchi@amarulasolutions.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/spi/hi311x.c

index 25d9b32f57011af6441d28f9fe17710106a5b6bb..09ae218315d73d49c2ec4280707911966fce1c31 100644 (file)
@@ -696,27 +696,38 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id)
                        /* Check for protocol errors */
                        if (eflag & HI3110_ERR_PROTOCOL_MASK) {
                                skb = alloc_can_err_skb(net, &cf);
-                               if (!skb)
-                                       break;
+                               if (skb)
+                                       cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
 
-                               cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
                                priv->can.can_stats.bus_error++;
-                               priv->net->stats.rx_errors++;
-                               if (eflag & HI3110_ERR_BITERR)
-                                       cf->data[2] |= CAN_ERR_PROT_BIT;
-                               else if (eflag & HI3110_ERR_FRMERR)
-                                       cf->data[2] |= CAN_ERR_PROT_FORM;
-                               else if (eflag & HI3110_ERR_STUFERR)
-                                       cf->data[2] |= CAN_ERR_PROT_STUFF;
-                               else if (eflag & HI3110_ERR_CRCERR)
-                                       cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ;
-                               else if (eflag & HI3110_ERR_ACKERR)
-                                       cf->data[3] |= CAN_ERR_PROT_LOC_ACK;
-
-                               cf->data[6] = hi3110_read(spi, HI3110_READ_TEC);
-                               cf->data[7] = hi3110_read(spi, HI3110_READ_REC);
+                               if (eflag & HI3110_ERR_BITERR) {
+                                       priv->net->stats.tx_errors++;
+                                       if (skb)
+                                               cf->data[2] |= CAN_ERR_PROT_BIT;
+                               } else if (eflag & HI3110_ERR_FRMERR) {
+                                       priv->net->stats.rx_errors++;
+                                       if (skb)
+                                               cf->data[2] |= CAN_ERR_PROT_FORM;
+                               } else if (eflag & HI3110_ERR_STUFERR) {
+                                       priv->net->stats.rx_errors++;
+                                       if (skb)
+                                               cf->data[2] |= CAN_ERR_PROT_STUFF;
+                               } else if (eflag & HI3110_ERR_CRCERR) {
+                                       priv->net->stats.rx_errors++;
+                                       if (skb)
+                                               cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ;
+                               } else if (eflag & HI3110_ERR_ACKERR) {
+                                       priv->net->stats.tx_errors++;
+                                       if (skb)
+                                               cf->data[3] |= CAN_ERR_PROT_LOC_ACK;
+                               }
+
                                netdev_dbg(priv->net, "Bus Error\n");
-                               netif_rx(skb);
+                               if (skb) {
+                                       cf->data[6] = hi3110_read(spi, HI3110_READ_TEC);
+                                       cf->data[7] = hi3110_read(spi, HI3110_READ_REC);
+                                       netif_rx(skb);
+                               }
                        }
                }