aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/igb
diff options
context:
space:
mode:
authorAlexander Duyck <aduyck@mirantis.com>2016-01-07 02:11:11 -0500
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2016-02-15 19:39:57 -0500
commita15d92598a5a741037b873fd4a43595a63048bbd (patch)
treea581436820ee0ade3fc8cbe308a7526dc53e8446 /drivers/net/ethernet/intel/igb
parent8b77c6b20f32511175dfd00322ae82fb31949d55 (diff)
igb: Clean-up configuration of VF port VLANs
This patch is meant to clean-up the configuration of the VF port based VLAN configuration. The original logic was a bit muddled and had some undesirable side effects such as VLANs being either completely stripped from the port or VLANs being left when they shouldn't be. The idea behind this code is to avoid any events such as spurious spoof notifications when we are removing one VLAN tag and replacing it with another. Signed-off-by: Alexander Duyck <aduyck@mirantis.com> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/igb')
-rw-r--r--drivers/net/ethernet/intel/igb/igb_main.c181
1 files changed, 110 insertions, 71 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index e7c3a9451b3f..6876ae5e18a9 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -5786,53 +5786,6 @@ static void igb_clear_vf_vfta(struct igb_adapter *adapter, u32 vf)
5786 } 5786 }
5787} 5787}
5788 5788
5789static void igb_set_vmvir(struct igb_adapter *adapter, u32 vid, u32 vf)
5790{
5791 struct e1000_hw *hw = &adapter->hw;
5792
5793 if (vid)
5794 wr32(E1000_VMVIR(vf), (vid | E1000_VMVIR_VLANA_DEFAULT));
5795 else
5796 wr32(E1000_VMVIR(vf), 0);
5797}
5798
5799static int igb_ndo_set_vf_vlan(struct net_device *netdev,
5800 int vf, u16 vlan, u8 qos)
5801{
5802 struct igb_adapter *adapter = netdev_priv(netdev);
5803 struct e1000_hw *hw = &adapter->hw;
5804 int err = 0;
5805
5806 if ((vf >= adapter->vfs_allocated_count) || (vlan > 4095) || (qos > 7))
5807 return -EINVAL;
5808 if (vlan || qos) {
5809 err = igb_vfta_set(hw, vlan, vf, !!vlan, false);
5810 if (err)
5811 goto out;
5812 igb_set_vmvir(adapter, vlan | (qos << VLAN_PRIO_SHIFT), vf);
5813 igb_set_vmolr(adapter, vf, !vlan);
5814 adapter->vf_data[vf].pf_vlan = vlan;
5815 adapter->vf_data[vf].pf_qos = qos;
5816 dev_info(&adapter->pdev->dev,
5817 "Setting VLAN %d, QOS 0x%x on VF %d\n", vlan, qos, vf);
5818 if (test_bit(__IGB_DOWN, &adapter->state)) {
5819 dev_warn(&adapter->pdev->dev,
5820 "The VF VLAN has been set, but the PF device is not up.\n");
5821 dev_warn(&adapter->pdev->dev,
5822 "Bring the PF device up before attempting to use the VF device.\n");
5823 }
5824 } else {
5825 igb_vfta_set(hw, adapter->vf_data[vf].pf_vlan, vf,
5826 false, false);
5827 igb_set_vmvir(adapter, vlan, vf);
5828 igb_set_vmolr(adapter, vf, true);
5829 adapter->vf_data[vf].pf_vlan = 0;
5830 adapter->vf_data[vf].pf_qos = 0;
5831 }
5832out:
5833 return err;
5834}
5835
5836static int igb_find_vlvf_entry(struct igb_adapter *adapter, int vid) 5789static int igb_find_vlvf_entry(struct igb_adapter *adapter, int vid)
5837{ 5790{
5838 struct e1000_hw *hw = &adapter->hw; 5791 struct e1000_hw *hw = &adapter->hw;
@@ -5853,23 +5806,25 @@ static int igb_find_vlvf_entry(struct igb_adapter *adapter, int vid)
5853 return i; 5806 return i;
5854} 5807}
5855 5808
5856static int igb_set_vf_vlan(struct igb_adapter *adapter, u32 *msgbuf, u32 vf) 5809static s32 igb_set_vf_vlan(struct igb_adapter *adapter, u32 vid,
5810 bool add, u32 vf)
5857{ 5811{
5812 int pf_id = adapter->vfs_allocated_count;
5858 struct e1000_hw *hw = &adapter->hw; 5813 struct e1000_hw *hw = &adapter->hw;
5859 int add = (msgbuf[0] & E1000_VT_MSGINFO_MASK) >> E1000_VT_MSGINFO_SHIFT; 5814 int err;
5860 int vid = (msgbuf[1] & E1000_VLVF_VLANID_MASK);
5861 int err = 0;
5862 5815
5863 /* If in promiscuous mode we need to make sure the PF also has 5816 /* If VLAN overlaps with one the PF is currently monitoring make
5864 * the VLAN filter set. 5817 * sure that we are able to allocate a VLVF entry. This may be
5818 * redundant but it guarantees PF will maintain visibility to
5819 * the VLAN.
5865 */ 5820 */
5866 if (add && (adapter->netdev->flags & IFF_PROMISC)) 5821 if (add && (adapter->netdev->flags & IFF_PROMISC)) {
5867 err = igb_vfta_set(hw, vid, adapter->vfs_allocated_count, 5822 err = igb_vfta_set(hw, vid, pf_id, true, false);
5868 true, false); 5823 if (err)
5869 if (err) 5824 return err;
5870 goto out; 5825 }
5871 5826
5872 err = igb_vfta_set(hw, vid, vf, !!add, false); 5827 err = igb_vfta_set(hw, vid, vf, add, false);
5873 5828
5874 if (err) 5829 if (err)
5875 goto out; 5830 goto out;
@@ -5904,23 +5859,107 @@ out:
5904 return err; 5859 return err;
5905} 5860}
5906 5861
5907static inline void igb_vf_reset(struct igb_adapter *adapter, u32 vf) 5862static void igb_set_vmvir(struct igb_adapter *adapter, u32 vid, u32 vf)
5908{ 5863{
5909 /* clear flags - except flag that indicates PF has set the MAC */ 5864 struct e1000_hw *hw = &adapter->hw;
5910 adapter->vf_data[vf].flags &= IGB_VF_FLAG_PF_SET_MAC;
5911 adapter->vf_data[vf].last_nack = jiffies;
5912 5865
5913 /* reset offloads to defaults */ 5866 if (vid)
5867 wr32(E1000_VMVIR(vf), (vid | E1000_VMVIR_VLANA_DEFAULT));
5868 else
5869 wr32(E1000_VMVIR(vf), 0);
5870}
5871
5872static int igb_enable_port_vlan(struct igb_adapter *adapter, int vf,
5873 u16 vlan, u8 qos)
5874{
5875 int err;
5876
5877 err = igb_set_vf_vlan(adapter, vlan, true, vf);
5878 if (err)
5879 return err;
5880
5881 igb_set_vmvir(adapter, vlan | (qos << VLAN_PRIO_SHIFT), vf);
5882 igb_set_vmolr(adapter, vf, !vlan);
5883
5884 /* revoke access to previous VLAN */
5885 if (vlan != adapter->vf_data[vf].pf_vlan)
5886 igb_set_vf_vlan(adapter, adapter->vf_data[vf].pf_vlan,
5887 false, vf);
5888
5889 adapter->vf_data[vf].pf_vlan = vlan;
5890 adapter->vf_data[vf].pf_qos = qos;
5891 dev_info(&adapter->pdev->dev,
5892 "Setting VLAN %d, QOS 0x%x on VF %d\n", vlan, qos, vf);
5893 if (test_bit(__IGB_DOWN, &adapter->state)) {
5894 dev_warn(&adapter->pdev->dev,
5895 "The VF VLAN has been set, but the PF device is not up.\n");
5896 dev_warn(&adapter->pdev->dev,
5897 "Bring the PF device up before attempting to use the VF device.\n");
5898 }
5899
5900 return err;
5901}
5902
5903static int igb_disable_port_vlan(struct igb_adapter *adapter, int vf)
5904{
5905 /* Restore tagless access via VLAN 0 */
5906 igb_set_vf_vlan(adapter, 0, true, vf);
5907
5908 igb_set_vmvir(adapter, 0, vf);
5914 igb_set_vmolr(adapter, vf, true); 5909 igb_set_vmolr(adapter, vf, true);
5915 5910
5911 /* Remove any PF assigned VLAN */
5912 if (adapter->vf_data[vf].pf_vlan)
5913 igb_set_vf_vlan(adapter, adapter->vf_data[vf].pf_vlan,
5914 false, vf);
5915
5916 adapter->vf_data[vf].pf_vlan = 0;
5917 adapter->vf_data[vf].pf_qos = 0;
5918
5919 return 0;
5920}
5921
5922static int igb_ndo_set_vf_vlan(struct net_device *netdev,
5923 int vf, u16 vlan, u8 qos)
5924{
5925 struct igb_adapter *adapter = netdev_priv(netdev);
5926
5927 if ((vf >= adapter->vfs_allocated_count) || (vlan > 4095) || (qos > 7))
5928 return -EINVAL;
5929
5930 return (vlan || qos) ? igb_enable_port_vlan(adapter, vf, vlan, qos) :
5931 igb_disable_port_vlan(adapter, vf);
5932}
5933
5934static int igb_set_vf_vlan_msg(struct igb_adapter *adapter, u32 *msgbuf, u32 vf)
5935{
5936 int add = (msgbuf[0] & E1000_VT_MSGINFO_MASK) >> E1000_VT_MSGINFO_SHIFT;
5937 int vid = (msgbuf[1] & E1000_VLVF_VLANID_MASK);
5938
5939 if (adapter->vf_data[vf].pf_vlan)
5940 return -1;
5941
5942 /* VLAN 0 is a special case, don't allow it to be removed */
5943 if (!vid && !add)
5944 return 0;
5945
5946 return igb_set_vf_vlan(adapter, vid, !!add, vf);
5947}
5948
5949static inline void igb_vf_reset(struct igb_adapter *adapter, u32 vf)
5950{
5951 struct vf_data_storage *vf_data = &adapter->vf_data[vf];
5952
5953 /* clear flags - except flag that indicates PF has set the MAC */
5954 vf_data->flags &= IGB_VF_FLAG_PF_SET_MAC;
5955 vf_data->last_nack = jiffies;
5956
5916 /* reset vlans for device */ 5957 /* reset vlans for device */
5917 igb_clear_vf_vfta(adapter, vf); 5958 igb_clear_vf_vfta(adapter, vf);
5918 if (adapter->vf_data[vf].pf_vlan) 5959 igb_set_vf_vlan(adapter, vf_data->pf_vlan, true, vf);
5919 igb_ndo_set_vf_vlan(adapter->netdev, vf, 5960 igb_set_vmvir(adapter, vf_data->pf_vlan |
5920 adapter->vf_data[vf].pf_vlan, 5961 (vf_data->pf_qos << VLAN_PRIO_SHIFT), vf);
5921 adapter->vf_data[vf].pf_qos); 5962 igb_set_vmolr(adapter, vf, !vf_data->pf_vlan);
5922 else
5923 igb_clear_vf_vfta(adapter, vf);
5924 5963
5925 /* reset multicast table array for vf */ 5964 /* reset multicast table array for vf */
5926 adapter->vf_data[vf].num_vf_mc_hashes = 0; 5965 adapter->vf_data[vf].num_vf_mc_hashes = 0;
@@ -6065,7 +6104,7 @@ static void igb_rcv_msg_from_vf(struct igb_adapter *adapter, u32 vf)
6065 "VF %d attempted to override administratively set VLAN tag\nReload the VF driver to resume operations\n", 6104 "VF %d attempted to override administratively set VLAN tag\nReload the VF driver to resume operations\n",
6066 vf); 6105 vf);
6067 else 6106 else
6068 retval = igb_set_vf_vlan(adapter, msgbuf, vf); 6107 retval = igb_set_vf_vlan_msg(adapter, msgbuf, vf);
6069 break; 6108 break;
6070 default: 6109 default:
6071 dev_err(&pdev->dev, "Unhandled Msg %08x\n", msgbuf[0]); 6110 dev_err(&pdev->dev, "Unhandled Msg %08x\n", msgbuf[0]);