@@ -999,7 +999,8 @@ static int kvaser_pciefd_setup_can_ctrls(struct kvaser_pciefd *pcie)
999
999
can -> can .ctrlmode_supported = CAN_CTRLMODE_LISTENONLY |
1000
1000
CAN_CTRLMODE_FD |
1001
1001
CAN_CTRLMODE_FD_NON_ISO |
1002
- CAN_CTRLMODE_CC_LEN8_DLC ;
1002
+ CAN_CTRLMODE_CC_LEN8_DLC |
1003
+ CAN_CTRLMODE_BERR_REPORTING ;
1003
1004
1004
1005
status = ioread32 (can -> reg_base + KVASER_PCIEFD_KCAN_STAT_REG );
1005
1006
if (!(status & KVASER_PCIEFD_KCAN_STAT_FD )) {
@@ -1304,7 +1305,7 @@ static int kvaser_pciefd_rx_error_frame(struct kvaser_pciefd_can *can,
1304
1305
struct can_berr_counter bec ;
1305
1306
enum can_state old_state , new_state , tx_state , rx_state ;
1306
1307
struct net_device * ndev = can -> can .dev ;
1307
- struct sk_buff * skb ;
1308
+ struct sk_buff * skb = NULL ;
1308
1309
struct can_frame * cf = NULL ;
1309
1310
1310
1311
old_state = can -> can .state ;
@@ -1313,7 +1314,8 @@ static int kvaser_pciefd_rx_error_frame(struct kvaser_pciefd_can *can,
1313
1314
bec .rxerr = FIELD_GET (KVASER_PCIEFD_SPACK_RXERR_MASK , p -> header [0 ]);
1314
1315
1315
1316
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 );
1317
1319
if (new_state != old_state ) {
1318
1320
kvaser_pciefd_change_state (can , & bec , cf , new_state , tx_state , rx_state );
1319
1321
}
@@ -1328,18 +1330,19 @@ static int kvaser_pciefd_rx_error_frame(struct kvaser_pciefd_can *can,
1328
1330
can -> bec .txerr = bec .txerr ;
1329
1331
can -> bec .rxerr = bec .rxerr ;
1330
1332
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 );
1334
1344
}
1335
1345
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
-
1343
1346
return 0 ;
1344
1347
}
1345
1348
0 commit comments