Commit 72a7e2e7 authored by Dario Binacchi's avatar Dario Binacchi Committed by Marc Kleine-Budde
Browse files

can: ems_usb: ems_usb_rx_err(): fix {rx,tx}_errors statistics



The ems_usb_rx_err() function only incremented the receive error counter
and never the transmit error counter, even if the ECC_DIR flag reported
that an error had occurred during transmission.

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

Fixes: 702171ad ("ems_usb: Added support for EMS CPC-USB/ARM7 CAN/USB interface")
Signed-off-by: default avatarDario Binacchi <dario.binacchi@amarulasolutions.com>
Link: https://patch.msgid.link/20241122221650.633981-12-dario.binacchi@amarulasolutions.com


Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent 595a8198
Loading
Loading
Loading
Loading
+33 −25
Original line number Diff line number Diff line
@@ -335,14 +335,13 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg)
	struct net_device_stats *stats = &dev->netdev->stats;

	skb = alloc_can_err_skb(dev->netdev, &cf);
	if (skb == NULL)
		return;

	if (msg->type == CPC_MSG_TYPE_CAN_STATE) {
		u8 state = msg->msg.can_state;

		if (state & SJA1000_SR_BS) {
			dev->can.state = CAN_STATE_BUS_OFF;
			if (skb)
				cf->can_id |= CAN_ERR_BUSOFF;

			dev->can.can_stats.bus_off++;
@@ -361,8 +360,8 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg)

		/* bus error interrupt */
		dev->can.can_stats.bus_error++;
		stats->rx_errors++;

		if (skb) {
			cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;

			switch (ecc & SJA1000_ECC_MASK) {
@@ -379,25 +378,34 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg)
				cf->data[3] = ecc & SJA1000_ECC_SEG;
				break;
			}
		}

		/* Error occurred during transmission? */
		if ((ecc & SJA1000_ECC_DIR) == 0)
		if ((ecc & SJA1000_ECC_DIR) == 0) {
			stats->tx_errors++;
			if (skb)
				cf->data[2] |= CAN_ERR_PROT_TX;
		} else {
			stats->rx_errors++;
		}

		if (dev->can.state == CAN_STATE_ERROR_WARNING ||
		    dev->can.state == CAN_STATE_ERROR_PASSIVE) {
		if (skb && (dev->can.state == CAN_STATE_ERROR_WARNING ||
			    dev->can.state == CAN_STATE_ERROR_PASSIVE)) {
			cf->can_id |= CAN_ERR_CRTL;
			cf->data[1] = (txerr > rxerr) ?
			    CAN_ERR_CRTL_TX_PASSIVE : CAN_ERR_CRTL_RX_PASSIVE;
		}
	} else if (msg->type == CPC_MSG_TYPE_OVERRUN) {
		if (skb) {
			cf->can_id |= CAN_ERR_CRTL;
			cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
		}

		stats->rx_over_errors++;
		stats->rx_errors++;
	}

	if (skb)
		netif_rx(skb);
}