diff options
author | Greg Rose <gregory.v.rose@intel.com> | 2012-11-07 21:41:35 -0500 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2012-11-28 07:46:11 -0500 |
commit | 9b735984fba6d704fdf798b5831010980c1b8950 (patch) | |
tree | 1ac30cc4204584fe746d7626b53445fd1e1d8f8a /drivers/net/ethernet/intel/ixgbe | |
parent | 2afaa00d2fa2ae1fa806ebd229bc3f56df8449d5 (diff) |
ixgbe: Make the bridge mode setting sticky
The internal bridge mode setting needs to be sticky so that it can be
configured correctly after a device reset. This change is required now
that the driver supports setting the bridge mode to VEB or VEPA.
Signed-off-by: Greg Rose <gregory.v.rose@intel.com>
Acked-by: John Fastabend <john.r.fastabend@intel.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Tested-by: Sibai Li <Sibai.li@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe')
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 12 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 1 |
3 files changed, 10 insertions, 4 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h index 7ff4c4fdcb0d..8e786764c60e 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h | |||
@@ -483,6 +483,7 @@ struct ixgbe_adapter { | |||
483 | #define IXGBE_FLAG2_RSS_FIELD_IPV6_UDP (u32)(1 << 9) | 483 | #define IXGBE_FLAG2_RSS_FIELD_IPV6_UDP (u32)(1 << 9) |
484 | #define IXGBE_FLAG2_PTP_ENABLED (u32)(1 << 10) | 484 | #define IXGBE_FLAG2_PTP_ENABLED (u32)(1 << 10) |
485 | #define IXGBE_FLAG2_PTP_PPS_ENABLED (u32)(1 << 11) | 485 | #define IXGBE_FLAG2_PTP_PPS_ENABLED (u32)(1 << 11) |
486 | #define IXGBE_FLAG2_BRIDGE_MODE_VEB (u32)(1 << 12) | ||
486 | 487 | ||
487 | /* Tx fast path data */ | 488 | /* Tx fast path data */ |
488 | int num_tx_queues; | 489 | int num_tx_queues; |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index fc8cfad4ac9b..fee0f8c78041 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
@@ -3247,6 +3247,8 @@ static void ixgbe_configure_virtualization(struct ixgbe_adapter *adapter) | |||
3247 | IXGBE_WRITE_REG(hw, IXGBE_VFRE(reg_offset ^ 1), reg_offset - 1); | 3247 | IXGBE_WRITE_REG(hw, IXGBE_VFRE(reg_offset ^ 1), reg_offset - 1); |
3248 | IXGBE_WRITE_REG(hw, IXGBE_VFTE(reg_offset), (~0) << vf_shift); | 3248 | IXGBE_WRITE_REG(hw, IXGBE_VFTE(reg_offset), (~0) << vf_shift); |
3249 | IXGBE_WRITE_REG(hw, IXGBE_VFTE(reg_offset ^ 1), reg_offset - 1); | 3249 | IXGBE_WRITE_REG(hw, IXGBE_VFTE(reg_offset ^ 1), reg_offset - 1); |
3250 | if (adapter->flags2 & IXGBE_FLAG2_BRIDGE_MODE_VEB) | ||
3251 | IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN); | ||
3250 | 3252 | ||
3251 | /* Map PF MAC address in RAR Entry 0 to first pool following VFs */ | 3253 | /* Map PF MAC address in RAR Entry 0 to first pool following VFs */ |
3252 | hw->mac.ops.set_vmdq(hw, 0, VMDQ_P(0)); | 3254 | hw->mac.ops.set_vmdq(hw, 0, VMDQ_P(0)); |
@@ -7039,11 +7041,13 @@ static int ixgbe_ndo_bridge_setlink(struct net_device *dev, | |||
7039 | continue; | 7041 | continue; |
7040 | 7042 | ||
7041 | mode = nla_get_u16(attr); | 7043 | mode = nla_get_u16(attr); |
7042 | if (mode == BRIDGE_MODE_VEPA) | 7044 | if (mode == BRIDGE_MODE_VEPA) { |
7043 | reg = 0; | 7045 | reg = 0; |
7044 | else if (mode == BRIDGE_MODE_VEB) | 7046 | adapter->flags2 &= ~IXGBE_FLAG2_BRIDGE_MODE_VEB; |
7047 | } else if (mode == BRIDGE_MODE_VEB) { | ||
7045 | reg = IXGBE_PFDTXGSWC_VT_LBEN; | 7048 | reg = IXGBE_PFDTXGSWC_VT_LBEN; |
7046 | else | 7049 | adapter->flags2 |= IXGBE_FLAG2_BRIDGE_MODE_VEB; |
7050 | } else | ||
7047 | return -EINVAL; | 7051 | return -EINVAL; |
7048 | 7052 | ||
7049 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_PFDTXGSWC, reg); | 7053 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_PFDTXGSWC, reg); |
@@ -7064,7 +7068,7 @@ static int ixgbe_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, | |||
7064 | if (!(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)) | 7068 | if (!(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)) |
7065 | return 0; | 7069 | return 0; |
7066 | 7070 | ||
7067 | if (IXGBE_READ_REG(&adapter->hw, IXGBE_PFDTXGSWC) & 1) | 7071 | if (adapter->flags2 & IXGBE_FLAG2_BRIDGE_MODE_VEB) |
7068 | mode = BRIDGE_MODE_VEB; | 7072 | mode = BRIDGE_MODE_VEB; |
7069 | else | 7073 | else |
7070 | mode = BRIDGE_MODE_VEPA; | 7074 | mode = BRIDGE_MODE_VEPA; |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c index 4993642d1ce1..85cddac673ef 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | |||
@@ -119,6 +119,7 @@ void ixgbe_enable_sriov(struct ixgbe_adapter *adapter, | |||
119 | 119 | ||
120 | /* Initialize default switching mode VEB */ | 120 | /* Initialize default switching mode VEB */ |
121 | IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN); | 121 | IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN); |
122 | adapter->flags2 |= IXGBE_FLAG2_BRIDGE_MODE_VEB; | ||
122 | 123 | ||
123 | /* If call to enable VFs succeeded then allocate memory | 124 | /* If call to enable VFs succeeded then allocate memory |
124 | * for per VF control structures. | 125 | * for per VF control structures. |