Skip to content

Commit 0dfa617

Browse files
Jimmy Assarssonmarckleinebudde
authored andcommitted
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 <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Marc Kleine-Budde <[email protected]>
1 parent 3749637 commit 0dfa617

File tree

3 files changed

+26
-19
lines changed

3 files changed

+26
-19
lines changed

drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -818,7 +818,8 @@ static int kvaser_usb_init_one(struct kvaser_usb *dev, int channel)
818818
init_completion(&priv->stop_comp);
819819
init_completion(&priv->flush_comp);
820820
init_completion(&priv->get_busparams_comp);
821-
priv->can.ctrlmode_supported = CAN_CTRLMODE_CC_LEN8_DLC;
821+
priv->can.ctrlmode_supported = CAN_CTRLMODE_CC_LEN8_DLC |
822+
CAN_CTRLMODE_BERR_REPORTING;
822823

823824
priv->dev = dev;
824825
priv->netdev = netdev;

drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,8 +1084,8 @@ kvaser_usb_hydra_error_frame(struct kvaser_usb_net_priv *priv,
10841084
{
10851085
struct net_device *netdev = priv->netdev;
10861086
struct net_device_stats *stats = &netdev->stats;
1087-
struct can_frame *cf;
1088-
struct sk_buff *skb;
1087+
struct can_frame *cf = NULL;
1088+
struct sk_buff *skb = NULL;
10891089
struct can_berr_counter bec;
10901090
enum can_state new_state, old_state;
10911091
u8 bus_status;
@@ -1101,21 +1101,24 @@ kvaser_usb_hydra_error_frame(struct kvaser_usb_net_priv *priv,
11011101
kvaser_usb_hydra_bus_status_to_can_state(priv, bus_status, &bec,
11021102
&new_state);
11031103

1104-
skb = alloc_can_err_skb(netdev, &cf);
1104+
if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
1105+
skb = alloc_can_err_skb(netdev, &cf);
11051106
if (new_state != old_state)
11061107
kvaser_usb_hydra_change_state(priv, &bec, cf, new_state);
11071108

1108-
if (skb) {
1109-
struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
1109+
if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) {
1110+
if (skb) {
1111+
struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
11101112

1111-
shhwtstamps->hwtstamp = hwtstamp;
1112-
cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_CNT;
1113-
cf->data[6] = bec.txerr;
1114-
cf->data[7] = bec.rxerr;
1115-
netif_rx(skb);
1116-
} else {
1117-
stats->rx_dropped++;
1118-
netdev_warn(netdev, "No memory left for err_skb\n");
1113+
shhwtstamps->hwtstamp = hwtstamp;
1114+
cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_CNT;
1115+
cf->data[6] = bec.txerr;
1116+
cf->data[7] = bec.rxerr;
1117+
netif_rx(skb);
1118+
} else {
1119+
stats->rx_dropped++;
1120+
netdev_warn(netdev, "No memory left for err_skb\n");
1121+
}
11191122
}
11201123

11211124
priv->bec.txerr = bec.txerr;

drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,8 +1120,8 @@ kvaser_usb_leaf_rx_error_update_can_state(struct kvaser_usb_net_priv *priv,
11201120
static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev,
11211121
const struct kvaser_usb_err_summary *es)
11221122
{
1123-
struct can_frame *cf;
1124-
struct sk_buff *skb;
1123+
struct can_frame *cf = NULL;
1124+
struct sk_buff *skb = NULL;
11251125
struct net_device_stats *stats;
11261126
struct kvaser_usb_net_priv *priv;
11271127
struct kvaser_usb_net_leaf_priv *leaf;
@@ -1142,7 +1142,8 @@ static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev,
11421142
return;
11431143

11441144
old_state = priv->can.state;
1145-
skb = alloc_can_err_skb(priv->netdev, &cf);
1145+
if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
1146+
skb = alloc_can_err_skb(priv->netdev, &cf);
11461147
kvaser_usb_leaf_rx_error_update_can_state(priv, es, cf);
11471148
new_state = priv->can.state;
11481149

@@ -1176,8 +1177,10 @@ static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev,
11761177
}
11771178

11781179
if (!skb) {
1179-
stats->rx_dropped++;
1180-
netdev_warn(priv->netdev, "No memory left for err_skb\n");
1180+
if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) {
1181+
stats->rx_dropped++;
1182+
netdev_warn(priv->netdev, "No memory left for err_skb\n");
1183+
}
11811184
return;
11821185
}
11831186

0 commit comments

Comments
 (0)