can: kvaser_usb: 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.

Signed-off-by: Jimmy Assarsson <extja@kvaser.com>
Link: https://patch.msgid.link/20241230142645.128244-2-extja@kvaser.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
Jimmy Assarsson 2024-12-30 15:26:43 +01:00 committed by Marc Kleine-Budde
parent 3749637b71
commit 0dfa617c3f
3 changed files with 26 additions and 19 deletions

View File

@ -818,7 +818,8 @@ static int kvaser_usb_init_one(struct kvaser_usb *dev, int channel)
init_completion(&priv->stop_comp);
init_completion(&priv->flush_comp);
init_completion(&priv->get_busparams_comp);
priv->can.ctrlmode_supported = CAN_CTRLMODE_CC_LEN8_DLC;
priv->can.ctrlmode_supported = CAN_CTRLMODE_CC_LEN8_DLC |
CAN_CTRLMODE_BERR_REPORTING;
priv->dev = dev;
priv->netdev = netdev;

View File

@ -1084,8 +1084,8 @@ kvaser_usb_hydra_error_frame(struct kvaser_usb_net_priv *priv,
{
struct net_device *netdev = priv->netdev;
struct net_device_stats *stats = &netdev->stats;
struct can_frame *cf;
struct sk_buff *skb;
struct can_frame *cf = NULL;
struct sk_buff *skb = NULL;
struct can_berr_counter bec;
enum can_state new_state, old_state;
u8 bus_status;
@ -1101,21 +1101,24 @@ kvaser_usb_hydra_error_frame(struct kvaser_usb_net_priv *priv,
kvaser_usb_hydra_bus_status_to_can_state(priv, bus_status, &bec,
&new_state);
skb = alloc_can_err_skb(netdev, &cf);
if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
skb = alloc_can_err_skb(netdev, &cf);
if (new_state != old_state)
kvaser_usb_hydra_change_state(priv, &bec, cf, new_state);
if (skb) {
struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) {
if (skb) {
struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
shhwtstamps->hwtstamp = hwtstamp;
cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_CNT;
cf->data[6] = bec.txerr;
cf->data[7] = bec.rxerr;
netif_rx(skb);
} else {
stats->rx_dropped++;
netdev_warn(netdev, "No memory left for err_skb\n");
shhwtstamps->hwtstamp = hwtstamp;
cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_CNT;
cf->data[6] = bec.txerr;
cf->data[7] = bec.rxerr;
netif_rx(skb);
} else {
stats->rx_dropped++;
netdev_warn(netdev, "No memory left for err_skb\n");
}
}
priv->bec.txerr = bec.txerr;

View File

@ -1120,8 +1120,8 @@ kvaser_usb_leaf_rx_error_update_can_state(struct kvaser_usb_net_priv *priv,
static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev,
const struct kvaser_usb_err_summary *es)
{
struct can_frame *cf;
struct sk_buff *skb;
struct can_frame *cf = NULL;
struct sk_buff *skb = NULL;
struct net_device_stats *stats;
struct kvaser_usb_net_priv *priv;
struct kvaser_usb_net_leaf_priv *leaf;
@ -1142,7 +1142,8 @@ static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev,
return;
old_state = priv->can.state;
skb = alloc_can_err_skb(priv->netdev, &cf);
if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
skb = alloc_can_err_skb(priv->netdev, &cf);
kvaser_usb_leaf_rx_error_update_can_state(priv, es, cf);
new_state = priv->can.state;
@ -1176,8 +1177,10 @@ static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev,
}
if (!skb) {
stats->rx_dropped++;
netdev_warn(priv->netdev, "No memory left for err_skb\n");
if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) {
stats->rx_dropped++;
netdev_warn(priv->netdev, "No memory left for err_skb\n");
}
return;
}