summaryrefslogtreecommitdiff
path: root/drivers/net/can/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/can/dev.c')
-rw-r--r--drivers/net/can/dev.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c
index b0f69248cb71..802a6bf1ca8b 100644
--- a/drivers/net/can/dev.c
+++ b/drivers/net/can/dev.c
@@ -869,6 +869,30 @@ static int can_changelink(struct net_device *dev,
}
}
+#ifdef CONFIG_CAN_HWFILTER
+ if (data[IFLA_CAN_HARDWARE_FILTER]) {
+ struct can_hwfilter cf;
+
+ /* Do not allow changing hardware filter while running */
+ if (dev->flags & IFF_UP)
+ return -EBUSY;
+
+ memcpy(&cf, nla_data(data[IFLA_CAN_HARDWARE_FILTER]), sizeof(cf));
+
+ if (cf.count > priv->hwfilterbanks)
+ return -EINVAL;
+
+ memcpy(&priv->filter, &cf, sizeof(cf));
+
+ if (priv->do_set_hwfilter) {
+ /* Finally, set the bit-timing registers */
+ err = priv->do_set_hwfilter(dev);
+ if (err)
+ return err;
+ }
+ }
+#endif
+
return 0;
}
@@ -929,7 +953,13 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
(priv->data_bittiming_const &&
nla_put(skb, IFLA_CAN_DATA_BITTIMING_CONST,
sizeof(*priv->data_bittiming_const),
- priv->data_bittiming_const)))
+ priv->data_bittiming_const))
+#ifdef CONFIG_CAN_HWFILTER
+ || nla_put(skb, IFLA_CAN_HARDWARE_FILTER,
+ sizeof(priv->filter),
+ &priv->filter)
+#endif
+ )
return -EMSGSIZE;
return 0;