Skip to content

Commit 6e2c9e4

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 <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Marc Kleine-Budde <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 1ed979b commit 6e2c9e4

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
@@ -334,15 +334,14 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg)
334334
struct net_device_stats *stats = &dev->netdev->stats;
335335

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

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

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

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

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

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

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

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

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

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

400-
netif_rx(skb);
407+
if (skb)
408+
netif_rx(skb);
401409
}
402410

403411
/*

0 commit comments

Comments
 (0)