Skip to content

Commit 9d92fda

Browse files
Jimmy Assarssonmarckleinebudde
authored andcommitted
can: kvaser_pciefd: Add support for CAN_CTRLMODE_BERR_REPORTING
Add support for CAN_CTRLMODE_BERR_REPORTING, allowing Bus Error Reporting to be enabled or disabled. Previously, Bus Error Reporting was always active. Co-developed-by: Alison Below <[email protected]> Signed-off-by: Alison Below <[email protected]> Signed-off-by: Jimmy Assarsson <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Marc Kleine-Budde <[email protected]>
1 parent e048c5e commit 9d92fda

File tree

1 file changed

+16
-13
lines changed

1 file changed

+16
-13
lines changed

drivers/net/can/kvaser_pciefd.c

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -999,7 +999,8 @@ static int kvaser_pciefd_setup_can_ctrls(struct kvaser_pciefd *pcie)
999999
can->can.ctrlmode_supported = CAN_CTRLMODE_LISTENONLY |
10001000
CAN_CTRLMODE_FD |
10011001
CAN_CTRLMODE_FD_NON_ISO |
1002-
CAN_CTRLMODE_CC_LEN8_DLC;
1002+
CAN_CTRLMODE_CC_LEN8_DLC |
1003+
CAN_CTRLMODE_BERR_REPORTING;
10031004

10041005
status = ioread32(can->reg_base + KVASER_PCIEFD_KCAN_STAT_REG);
10051006
if (!(status & KVASER_PCIEFD_KCAN_STAT_FD)) {
@@ -1304,7 +1305,7 @@ static int kvaser_pciefd_rx_error_frame(struct kvaser_pciefd_can *can,
13041305
struct can_berr_counter bec;
13051306
enum can_state old_state, new_state, tx_state, rx_state;
13061307
struct net_device *ndev = can->can.dev;
1307-
struct sk_buff *skb;
1308+
struct sk_buff *skb = NULL;
13081309
struct can_frame *cf = NULL;
13091310

13101311
old_state = can->can.state;
@@ -1313,7 +1314,8 @@ static int kvaser_pciefd_rx_error_frame(struct kvaser_pciefd_can *can,
13131314
bec.rxerr = FIELD_GET(KVASER_PCIEFD_SPACK_RXERR_MASK, p->header[0]);
13141315

13151316
kvaser_pciefd_packet_to_state(p, &bec, &new_state, &tx_state, &rx_state);
1316-
skb = alloc_can_err_skb(ndev, &cf);
1317+
if (can->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
1318+
skb = alloc_can_err_skb(ndev, &cf);
13171319
if (new_state != old_state) {
13181320
kvaser_pciefd_change_state(can, &bec, cf, new_state, tx_state, rx_state);
13191321
}
@@ -1328,18 +1330,19 @@ static int kvaser_pciefd_rx_error_frame(struct kvaser_pciefd_can *can,
13281330
can->bec.txerr = bec.txerr;
13291331
can->bec.rxerr = bec.rxerr;
13301332

1331-
if (!skb) {
1332-
ndev->stats.rx_dropped++;
1333-
return -ENOMEM;
1333+
if (can->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) {
1334+
if (!skb) {
1335+
netdev_warn(ndev, "No memory left for err_skb\n");
1336+
ndev->stats.rx_dropped++;
1337+
return -ENOMEM;
1338+
}
1339+
kvaser_pciefd_set_skb_timestamp(can->kv_pcie, skb, p->timestamp);
1340+
cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_CNT;
1341+
cf->data[6] = bec.txerr;
1342+
cf->data[7] = bec.rxerr;
1343+
netif_rx(skb);
13341344
}
13351345

1336-
kvaser_pciefd_set_skb_timestamp(can->kv_pcie, skb, p->timestamp);
1337-
cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_CNT;
1338-
cf->data[6] = bec.txerr;
1339-
cf->data[7] = bec.rxerr;
1340-
1341-
netif_rx(skb);
1342-
13431346
return 0;
13441347
}
13451348

0 commit comments

Comments
 (0)