summaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorDon Skidmore <donald.c.skidmore@intel.com>2015-04-09 22:03:22 -0700
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2015-04-09 23:59:50 -0700
commit219efe97bb8a6989dfc93ae6bf97cd72e5b72de3 (patch)
tree5be6f105264f23cdeee8667d690ac3e0ffbe97fe /drivers/net
parentaa2bacb60963870919ec5bc59ac69f0c31572d26 (diff)
downloadlinux-219efe97bb8a6989dfc93ae6bf97cd72e5b72de3.tar.bz2
ixgbe: add new bridge mode support function.
This patch gathers together all the logic needed to configure bridge modes. Currently that it is rather simple but this is really laying the ground work for future X550 feature enhancement. Signed-off-by: Don Skidmore <donald.c.skidmore@intel.com> Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_main.c50
1 files changed, 34 insertions, 16 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index aceb13c7d42c..cb9c43f28e5e 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -7870,6 +7870,36 @@ static int ixgbe_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
return ndo_dflt_fdb_add(ndm, tb, dev, addr, vid, flags);
}
+/**
+ * ixgbe_configure_bridge_mode - set various bridge modes
+ * @adapter - the private structure
+ * @mode - requested bridge mode
+ *
+ * Configure some settings require for various bridge modes.
+ **/
+static int ixgbe_configure_bridge_mode(struct ixgbe_adapter *adapter,
+ __u16 mode)
+{
+ switch (mode) {
+ case BRIDGE_MODE_VEPA:
+ IXGBE_WRITE_REG(&adapter->hw, IXGBE_PFDTXGSWC, 0);
+ break;
+ case BRIDGE_MODE_VEB:
+ IXGBE_WRITE_REG(&adapter->hw, IXGBE_PFDTXGSWC,
+ IXGBE_PFDTXGSWC_VT_LBEN);
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ adapter->bridge_mode = mode;
+
+ e_info(drv, "enabling bridge mode: %s\n",
+ mode == BRIDGE_MODE_VEPA ? "VEPA" : "VEB");
+
+ return 0;
+}
+
static int ixgbe_ndo_bridge_setlink(struct net_device *dev,
struct nlmsghdr *nlh, u16 flags)
{
@@ -7885,6 +7915,7 @@ static int ixgbe_ndo_bridge_setlink(struct net_device *dev,
return -EINVAL;
nla_for_each_nested(attr, br_spec, rem) {
+ u32 status;
__u16 mode;
if (nla_type(attr) != IFLA_BRIDGE_MODE)
@@ -7894,22 +7925,9 @@ static int ixgbe_ndo_bridge_setlink(struct net_device *dev,
return -EINVAL;
mode = nla_get_u16(attr);
- switch (mode) {
- case BRIDGE_MODE_VEPA:
- IXGBE_WRITE_REG(&adapter->hw, IXGBE_PFDTXGSWC, 0);
- break;
- case BRIDGE_MODE_VEB:
- IXGBE_WRITE_REG(&adapter->hw, IXGBE_PFDTXGSWC,
- IXGBE_PFDTXGSWC_VT_LBEN);
- break;
- default:
- return -EINVAL;
- }
-
- adapter->bridge_mode = mode;
-
- e_info(drv, "enabling bridge mode: %s\n",
- mode == BRIDGE_MODE_VEPA ? "VEPA" : "VEB");
+ status = ixgbe_configure_bridge_mode(adapter, mode);
+ if (status)
+ return status;
break;
}