|
|
@@ -44,6 +44,7 @@
|
|
|
#include <linux/ethtool.h>
|
|
|
#include <linux/if.h>
|
|
|
#include <linux/if_vlan.h>
|
|
|
+#include <linux/if_bridge.h>
|
|
|
#include <linux/prefetch.h>
|
|
|
#include <scsi/fc/fc_fcoe.h>
|
|
|
|
|
|
@@ -3224,7 +3225,6 @@ static void ixgbe_configure_virtualization(struct ixgbe_adapter *adapter)
|
|
|
IXGBE_WRITE_REG(hw, IXGBE_VFRE(reg_offset ^ 1), reg_offset - 1);
|
|
|
IXGBE_WRITE_REG(hw, IXGBE_VFTE(reg_offset), (~0) << vf_shift);
|
|
|
IXGBE_WRITE_REG(hw, IXGBE_VFTE(reg_offset ^ 1), reg_offset - 1);
|
|
|
- IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN);
|
|
|
|
|
|
/* Map PF MAC address in RAR Entry 0 to first pool following VFs */
|
|
|
hw->mac.ops.set_vmdq(hw, 0, VMDQ_P(0));
|
|
|
@@ -3247,8 +3247,6 @@ static void ixgbe_configure_virtualization(struct ixgbe_adapter *adapter)
|
|
|
|
|
|
IXGBE_WRITE_REG(hw, IXGBE_GCR_EXT, gcr_ext);
|
|
|
|
|
|
- /* enable Tx loopback for VF/PF communication */
|
|
|
- IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN);
|
|
|
|
|
|
/* Enable MAC Anti-Spoofing */
|
|
|
hw->mac.ops.set_mac_anti_spoofing(hw, (adapter->num_vfs != 0),
|
|
|
@@ -7025,6 +7023,59 @@ static int ixgbe_ndo_fdb_dump(struct sk_buff *skb,
|
|
|
return idx;
|
|
|
}
|
|
|
|
|
|
+static int ixgbe_ndo_bridge_setlink(struct net_device *dev,
|
|
|
+ struct nlmsghdr *nlh)
|
|
|
+{
|
|
|
+ struct ixgbe_adapter *adapter = netdev_priv(dev);
|
|
|
+ struct nlattr *attr, *br_spec;
|
|
|
+ int rem;
|
|
|
+
|
|
|
+ if (!(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED))
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
+ br_spec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC);
|
|
|
+
|
|
|
+ nla_for_each_nested(attr, br_spec, rem) {
|
|
|
+ __u16 mode;
|
|
|
+ u32 reg = 0;
|
|
|
+
|
|
|
+ if (nla_type(attr) != IFLA_BRIDGE_MODE)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ mode = nla_get_u16(attr);
|
|
|
+ if (mode == BRIDGE_MODE_VEPA)
|
|
|
+ reg = 0;
|
|
|
+ else if (mode == BRIDGE_MODE_VEB)
|
|
|
+ reg = IXGBE_PFDTXGSWC_VT_LBEN;
|
|
|
+ else
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ IXGBE_WRITE_REG(&adapter->hw, IXGBE_PFDTXGSWC, reg);
|
|
|
+
|
|
|
+ e_info(drv, "enabling bridge mode: %s\n",
|
|
|
+ mode == BRIDGE_MODE_VEPA ? "VEPA" : "VEB");
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int ixgbe_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
|
|
|
+ struct net_device *dev)
|
|
|
+{
|
|
|
+ struct ixgbe_adapter *adapter = netdev_priv(dev);
|
|
|
+ u16 mode;
|
|
|
+
|
|
|
+ if (!(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (IXGBE_READ_REG(&adapter->hw, IXGBE_PFDTXGSWC) & 1)
|
|
|
+ mode = BRIDGE_MODE_VEB;
|
|
|
+ else
|
|
|
+ mode = BRIDGE_MODE_VEPA;
|
|
|
+
|
|
|
+ return ndo_dflt_bridge_getlink(skb, pid, seq, dev, mode);
|
|
|
+}
|
|
|
+
|
|
|
static const struct net_device_ops ixgbe_netdev_ops = {
|
|
|
.ndo_open = ixgbe_open,
|
|
|
.ndo_stop = ixgbe_close,
|
|
|
@@ -7064,6 +7115,8 @@ static const struct net_device_ops ixgbe_netdev_ops = {
|
|
|
.ndo_fdb_add = ixgbe_ndo_fdb_add,
|
|
|
.ndo_fdb_del = ixgbe_ndo_fdb_del,
|
|
|
.ndo_fdb_dump = ixgbe_ndo_fdb_dump,
|
|
|
+ .ndo_bridge_setlink = ixgbe_ndo_bridge_setlink,
|
|
|
+ .ndo_bridge_getlink = ixgbe_ndo_bridge_getlink,
|
|
|
};
|
|
|
|
|
|
/**
|