Skip to content

Commit 51251ed

Browse files
passgatgregkh
authored andcommitted
can: ems_usb: ems_usb_rx_err(): fix {rx,tx}_errors statistics
[ Upstream commit 72a7e2e ] 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: 702171a ("ems_usb: Added support for EMS CPC-USB/ARM7 CAN/USB interface") Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com> Link: https://patch.msgid.link/20241122221650.633981-12-dario.binacchi@amarulasolutions.com Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 0d515ff commit 51251ed

File tree

1 file changed

+33
-25
lines changed

1 file changed

+33
-25
lines changed

drivers/net/can/usb/ems_usb.c

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -335,15 +335,14 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg)
335335
struct net_device_stats *stats = &dev->netdev->stats;
336336

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

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

344342
if (state & SJA1000_SR_BS) {
345343
dev->can.state = CAN_STATE_BUS_OFF;
346-
cf->can_id |= CAN_ERR_BUSOFF;
344+
if (skb)
345+
cf->can_id |= CAN_ERR_BUSOFF;
347346

348347
dev->can.can_stats.bus_off++;
349348
can_bus_off(dev->netdev);
@@ -361,44 +360,53 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg)
361360

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

366-
cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
364+
if (skb) {
365+
cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
367366

368-
switch (ecc & SJA1000_ECC_MASK) {
369-
case SJA1000_ECC_BIT:
370-
cf->data[2] |= CAN_ERR_PROT_BIT;
371-
break;
372-
case SJA1000_ECC_FORM:
373-
cf->data[2] |= CAN_ERR_PROT_FORM;
374-
break;
375-
case SJA1000_ECC_STUFF:
376-
cf->data[2] |= CAN_ERR_PROT_STUFF;
377-
break;
378-
default:
379-
cf->data[3] = ecc & SJA1000_ECC_SEG;
380-
break;
367+
switch (ecc & SJA1000_ECC_MASK) {
368+
case SJA1000_ECC_BIT:
369+
cf->data[2] |= CAN_ERR_PROT_BIT;
370+
break;
371+
case SJA1000_ECC_FORM:
372+
cf->data[2] |= CAN_ERR_PROT_FORM;
373+
break;
374+
case SJA1000_ECC_STUFF:
375+
cf->data[2] |= CAN_ERR_PROT_STUFF;
376+
break;
377+
default:
378+
cf->data[3] = ecc & SJA1000_ECC_SEG;
379+
break;
380+
}
381381
}
382382

383383
/* Error occurred during transmission? */
384-
if ((ecc & SJA1000_ECC_DIR) == 0)
385-
cf->data[2] |= CAN_ERR_PROT_TX;
384+
if ((ecc & SJA1000_ECC_DIR) == 0) {
385+
stats->tx_errors++;
386+
if (skb)
387+
cf->data[2] |= CAN_ERR_PROT_TX;
388+
} else {
389+
stats->rx_errors++;
390+
}
386391

387-
if (dev->can.state == CAN_STATE_ERROR_WARNING ||
388-
dev->can.state == CAN_STATE_ERROR_PASSIVE) {
392+
if (skb && (dev->can.state == CAN_STATE_ERROR_WARNING ||
393+
dev->can.state == CAN_STATE_ERROR_PASSIVE)) {
389394
cf->can_id |= CAN_ERR_CRTL;
390395
cf->data[1] = (txerr > rxerr) ?
391396
CAN_ERR_CRTL_TX_PASSIVE : CAN_ERR_CRTL_RX_PASSIVE;
392397
}
393398
} else if (msg->type == CPC_MSG_TYPE_OVERRUN) {
394-
cf->can_id |= CAN_ERR_CRTL;
395-
cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
399+
if (skb) {
400+
cf->can_id |= CAN_ERR_CRTL;
401+
cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
402+
}
396403

397404
stats->rx_over_errors++;
398405
stats->rx_errors++;
399406
}
400407

401-
netif_rx(skb);
408+
if (skb)
409+
netif_rx(skb);
402410
}
403411

404412
/*

0 commit comments

Comments
 (0)