aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJohn Fastabend <john.r.fastabend@intel.com>2012-04-15 02:44:19 -0400
committerDavid S. Miller <davem@davemloft.net>2012-04-15 13:06:04 -0400
commit0f4b0add851a741e9859b97558594fbfe6e19a2b (patch)
tree4c3441c6b7bc810ceabdf4a1032b7da536fcb7c2 /drivers
parent3ff661c38c8492a2859e39e0ea1e3b6d30e89bf5 (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.c71
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
6684static 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
6714static 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
6739static 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
6684static const struct net_device_ops ixgbe_netdev_ops = { 6752static 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
6722static void __devinit ixgbe_probe_vf(struct ixgbe_adapter *adapter, 6793static void __devinit ixgbe_probe_vf(struct ixgbe_adapter *adapter,