Add a new MAC operation: set_tx_loopback.
On 82599 and x540 MACs, this operation allows enabling/disabling
of the per-VF tx loopback configuration. By default, tx loopback
is disabled for all VF's.

Signed-off-by: Yotam Rubin <yo...@weka.io>
---
 drivers/net/ethernet/intel/ixgbe/ixgbe.h        |  1 +
 drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c  |  1 +
 drivers/net/ethernet/intel/ixgbe/ixgbe_common.c | 25 +++++++++++++++++++++++++
 drivers/net/ethernet/intel/ixgbe/ixgbe_common.h |  1 +
 drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c  |  9 +++++++++
 drivers/net/ethernet/intel/ixgbe/ixgbe_type.h   |  1 +
 drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c   |  1 +
 7 files changed, 39 insertions(+)

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h 
b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
index 7dcbbec..d40130f7 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
@@ -151,6 +151,7 @@ struct vf_data_storage {
        u16 tx_rate;
        u16 vlan_count;
        u8 spoofchk_enabled;
+       bool tx_loopback_enabled;
        unsigned int vf_api;
 };
 
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c
index cf55a0d..ae1356f 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c
@@ -2330,6 +2330,7 @@ static struct ixgbe_mac_operations mac_ops_82599 = {
        .setup_sfp              = &ixgbe_setup_sfp_modules_82599,
        .set_mac_anti_spoofing  = &ixgbe_set_mac_anti_spoofing,
        .set_vlan_anti_spoofing = &ixgbe_set_vlan_anti_spoofing,
+       .set_tx_loopback        = &ixgbe_set_tx_loopback,
        .acquire_swfw_sync      = &ixgbe_acquire_swfw_sync,
        .release_swfw_sync      = &ixgbe_release_swfw_sync,
        .get_thermal_sensor_data = &ixgbe_get_thermal_sensor_data_generic,
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
index 9c66bab..d82cf5e 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
@@ -3360,6 +3360,31 @@ void ixgbe_set_vlan_anti_spoofing(struct ixgbe_hw *hw, 
bool enable, int vf)
 }
 
 /**
+ *  ixgbe_set_tx_loopback - Enable/Disable Loopback TX
+ *  @hw: pointer to hardware structure
+ *  @enable: enable or disable switch for VLAN anti-spoofing
+ *  @vf: Virtual Function pool - VF Pool to set for VLAN anti-spoofing
+ *
+ **/
+void ixgbe_set_tx_loopback(struct ixgbe_hw *hw, bool enable, int vf)
+{
+       int vf_target_reg = vf >> 5;
+       int vf_target_shift = vf % 32;
+       u32 pfvmtxsw;
+
+       if (hw->mac.type == ixgbe_mac_82598EB)
+               return;
+
+       pfvmtxsw = IXGBE_READ_REG(hw, IXGBE_VMTXSW(vf_target_reg));
+       if (enable)
+               pfvmtxsw |= (1 << vf_target_shift);
+       else
+               pfvmtxsw &= ~(1 << vf_target_shift);
+
+       IXGBE_WRITE_REG(hw, IXGBE_VMTXSW(vf_target_reg), pfvmtxsw);
+}
+
+/**
  *  ixgbe_get_device_caps_generic - Get additional device capabilities
  *  @hw: pointer to hardware structure
  *  @device_caps: the EEPROM word with the extra device capabilities
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.h 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.h
index 8cfadcb..57b1e64 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.h
@@ -107,6 +107,7 @@ s32 ixgbe_blink_led_start_generic(struct ixgbe_hw *hw, u32 
index);
 s32 ixgbe_blink_led_stop_generic(struct ixgbe_hw *hw, u32 index);
 void ixgbe_set_mac_anti_spoofing(struct ixgbe_hw *hw, bool enable, int pf);
 void ixgbe_set_vlan_anti_spoofing(struct ixgbe_hw *hw, bool enable, int vf);
+void ixgbe_set_tx_loopback(struct ixgbe_hw *hw, bool enable, int vf);
 s32 ixgbe_get_device_caps_generic(struct ixgbe_hw *hw, u16 *device_caps);
 s32 ixgbe_set_fw_drv_ver_generic(struct ixgbe_hw *hw, u8 maj, u8 min,
                                 u8 build, u8 ver);
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
index 7f37fe7..00f74bb 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
@@ -108,6 +108,11 @@ static int __ixgbe_enable_sriov(struct ixgbe_adapter 
*adapter)
                /* enable spoof checking for all VFs */
                for (i = 0; i < adapter->num_vfs; i++)
                        adapter->vfinfo[i].spoofchk_enabled = true;
+
+               /* disable TX loopback for all VFs */
+               for (i = 0; i < adapter->num_vfs; i++)
+                       adapter->vfinfo[i].tx_loopback_enabled = false;
+
                return 0;
        }
 
@@ -526,6 +531,10 @@ static inline void ixgbe_vf_reset_event(struct 
ixgbe_adapter *adapter, u32 vf)
                        hw->mac.ops.set_vlan_anti_spoofing(hw, true, vf);
        }
 
+       /* Enable Tx loopback */
+       if (vfinfo->tx_loopback_enabled)
+               hw->mac.ops.set_tx_loopback(hw, true, vf);
+
        /* reset multicast table array for vf */
        adapter->vfinfo[vf].num_vf_mc_hashes = 0;
 
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
index fc5ecee..f12dd6f 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
@@ -3059,6 +3059,7 @@ struct ixgbe_mac_operations {
        s32 (*init_uta_tables)(struct ixgbe_hw *);
        void (*set_mac_anti_spoofing)(struct ixgbe_hw *, bool, int);
        void (*set_vlan_anti_spoofing)(struct ixgbe_hw *, bool, int);
+       void (*set_tx_loopback)(struct ixgbe_hw *, bool, int);
 
        /* Flow Control */
        s32 (*fc_enable)(struct ixgbe_hw *);
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c
index 4939542..735fef8 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c
@@ -812,6 +812,7 @@ static struct ixgbe_mac_operations mac_ops_X540 = {
        .setup_sfp              = NULL,
        .set_mac_anti_spoofing  = &ixgbe_set_mac_anti_spoofing,
        .set_vlan_anti_spoofing = &ixgbe_set_vlan_anti_spoofing,
+       .set_tx_loopback        = &ixgbe_set_tx_loopback,
        .acquire_swfw_sync      = &ixgbe_acquire_swfw_sync_X540,
        .release_swfw_sync      = &ixgbe_release_swfw_sync_X540,
        .disable_rx_buff        = &ixgbe_disable_rx_buff_generic,
-- 
1.9.1


------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel&#174; Ethernet, visit 
http://communities.intel.com/community/wired

Reply via email to