diff options
author | John Fastabend <john.r.fastabend@intel.com> | 2012-04-15 02:44:19 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-15 13:06:04 -0400 |
commit | 0f4b0add851a741e9859b97558594fbfe6e19a2b (patch) | |
tree | 4c3441c6b7bc810ceabdf4a1032b7da536fcb7c2 /drivers | |
parent | 3ff661c38c8492a2859e39e0ea1e3b6d30e89bf5 (diff) |
ixgbe: enable FDB netdevice ops
Enable FDB ops on ixgbe when in SR-IOV mode.
Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 3e26b1f9ac75..8b373951f644 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
@@ -6681,6 +6681,74 @@ static int ixgbe_set_features(struct net_device *netdev, | |||
6681 | return 0; | 6681 | return 0; |
6682 | } | 6682 | } |
6683 | 6683 | ||
6684 | static int ixgbe_ndo_fdb_add(struct ndmsg *ndm, | ||
6685 | struct net_device *dev, | ||
6686 | unsigned char *addr, | ||
6687 | u16 flags) | ||
6688 | { | ||
6689 | struct ixgbe_adapter *adapter = netdev_priv(dev); | ||
6690 | int err = -EOPNOTSUPP; | ||
6691 | |||
6692 | if (ndm->ndm_state & NUD_PERMANENT) { | ||
6693 | pr_info("%s: FDB only supports static addresses\n", | ||
6694 | ixgbe_driver_name); | ||
6695 | return -EINVAL; | ||
6696 | } | ||
6697 | |||
6698 | if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) { | ||
6699 | if (is_unicast_ether_addr(addr)) | ||
6700 | err = dev_uc_add_excl(dev, addr); | ||
6701 | else if (is_multicast_ether_addr(addr)) | ||
6702 | err = dev_mc_add_excl(dev, addr); | ||
6703 | else | ||
6704 | err = -EINVAL; | ||
6705 | } | ||
6706 | |||
6707 | /* Only return duplicate errors if NLM_F_EXCL is set */ | ||
6708 | if (err == -EEXIST && !(flags & NLM_F_EXCL)) | ||
6709 | err = 0; | ||
6710 | |||
6711 | return err; | ||
6712 | } | ||
6713 | |||
6714 | static int ixgbe_ndo_fdb_del(struct ndmsg *ndm, | ||
6715 | struct net_device *dev, | ||
6716 | unsigned char *addr) | ||
6717 | { | ||
6718 | struct ixgbe_adapter *adapter = netdev_priv(dev); | ||
6719 | int err = -EOPNOTSUPP; | ||
6720 | |||
6721 | if (ndm->ndm_state & NUD_PERMANENT) { | ||
6722 | pr_info("%s: FDB only supports static addresses\n", | ||
6723 | ixgbe_driver_name); | ||
6724 | return -EINVAL; | ||
6725 | } | ||
6726 | |||
6727 | if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) { | ||
6728 | if (is_unicast_ether_addr(addr)) | ||
6729 | err = dev_uc_del(dev, addr); | ||
6730 | else if (is_multicast_ether_addr(addr)) | ||
6731 | err = dev_mc_del(dev, addr); | ||
6732 | else | ||
6733 | err = -EINVAL; | ||
6734 | } | ||
6735 | |||
6736 | return err; | ||
6737 | } | ||
6738 | |||
6739 | static int ixgbe_ndo_fdb_dump(struct sk_buff *skb, | ||
6740 | struct netlink_callback *cb, | ||
6741 | struct net_device *dev, | ||
6742 | int idx) | ||
6743 | { | ||
6744 | struct ixgbe_adapter *adapter = netdev_priv(dev); | ||
6745 | |||
6746 | if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) | ||
6747 | idx = ndo_dflt_fdb_dump(skb, cb, dev, idx); | ||
6748 | |||
6749 | return idx; | ||
6750 | } | ||
6751 | |||
6684 | static const struct net_device_ops ixgbe_netdev_ops = { | 6752 | static const struct net_device_ops ixgbe_netdev_ops = { |
6685 | .ndo_open = ixgbe_open, | 6753 | .ndo_open = ixgbe_open, |
6686 | .ndo_stop = ixgbe_close, | 6754 | .ndo_stop = ixgbe_close, |
@@ -6717,6 +6785,9 @@ static const struct net_device_ops ixgbe_netdev_ops = { | |||
6717 | #endif /* IXGBE_FCOE */ | 6785 | #endif /* IXGBE_FCOE */ |
6718 | .ndo_set_features = ixgbe_set_features, | 6786 | .ndo_set_features = ixgbe_set_features, |
6719 | .ndo_fix_features = ixgbe_fix_features, | 6787 | .ndo_fix_features = ixgbe_fix_features, |
6788 | .ndo_fdb_add = ixgbe_ndo_fdb_add, | ||
6789 | .ndo_fdb_del = ixgbe_ndo_fdb_del, | ||
6790 | .ndo_fdb_dump = ixgbe_ndo_fdb_dump, | ||
6720 | }; | 6791 | }; |
6721 | 6792 | ||
6722 | static void __devinit ixgbe_probe_vf(struct ixgbe_adapter *adapter, | 6793 | static void __devinit ixgbe_probe_vf(struct ixgbe_adapter *adapter, |