Commit 3e464593 authored by Dario Binacchi's avatar Dario Binacchi Committed by Marc Kleine-Budde
Browse files

can: hi311x: hi3110_can_ist(): fix {rx,tx}_errors statistics



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: 57e83fb9 ("can: hi311x: Add Holt HI-311x CAN driver")
Signed-off-by: default avatarDario Binacchi <dario.binacchi@amarulasolutions.com>
Link: https://patch.msgid.link/20241122221650.633981-9-dario.binacchi@amarulasolutions.com


Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent bb03d568
Loading
Loading
Loading
Loading
+29 −18
Original line number Diff line number Diff line
@@ -696,29 +696,40 @@ 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;

				priv->can.can_stats.bus_error++;
				priv->net->stats.rx_errors++;
				if (eflag & HI3110_ERR_BITERR)
				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)
				} 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)
				} 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)
				} 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)
				} 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");
				if (skb) {
					cf->data[6] = hi3110_read(spi, HI3110_READ_TEC);
					cf->data[7] = hi3110_read(spi, HI3110_READ_REC);
				netdev_dbg(priv->net, "Bus Error\n");
					netif_rx(skb);
				}
			}
		}

		if (priv->tx_busy && statf & HI3110_STAT_TXMTY) {
			net->stats.tx_packets++;