diff options
Diffstat (limited to 'drivers/net/can/dev.c')
-rw-r--r-- | drivers/net/can/dev.c | 32 |
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; |