diff options
-rw-r--r-- | kmod/igb/igb_main.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/kmod/igb/igb_main.c b/kmod/igb/igb_main.c index 3310680d..c8a4a7e3 100644 --- a/kmod/igb/igb_main.c +++ b/kmod/igb/igb_main.c @@ -181,8 +181,14 @@ static void igb_restore_vf_multicasts(struct igb_adapter *adapter); static void igb_process_mdd_event(struct igb_adapter *); #ifdef IFLA_VF_MAX static int igb_ndo_set_vf_mac(struct net_device *netdev, int vf, u8 *mac); +#ifdef IFLA_VF_VLAN_INFO_MAX +static int igb_ndo_set_vf_vlan(struct net_device *netdev, + int vf, u16 vlan, u8 qos, __be16 vlan_proto); +#else static int igb_ndo_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, u8 qos); +#endif /*IFLA_VF_VLAN_INFO_MAX*/ + #ifdef HAVE_VF_SPOOFCHK_CONFIGURE static int igb_ndo_set_vf_spoofchk(struct net_device *netdev, int vf, bool setting); @@ -6648,9 +6654,15 @@ static void igb_set_vmvir(struct igb_adapter *adapter, u32 vid, u32 vf) else E1000_WRITE_REG(hw, E1000_VMVIR(vf), 0); } +#ifdef IFLA_VF_VLAN_INFO_MAX +static int igb_ndo_set_vf_vlan(struct net_device *netdev, + int vf, u16 vlan, u8 qos, __be16 vlan_proto) +#else static int igb_ndo_set_vf_vlan(struct net_device *netdev, - int vf, u16 vlan, u8 qos) + int vf, u16 vlan, u8 qos) +#endif /*IFLA_VF_VLAN_INFO_MAX*/ + { int err = 0; struct igb_adapter *adapter = netdev_priv(netdev); @@ -6659,6 +6671,7 @@ static int igb_ndo_set_vf_vlan(struct net_device *netdev, if ((vf >= adapter->vfs_allocated_count) || (vlan > VLAN_VID_MASK-1) || (qos > 7)) return -EINVAL; + if (vlan || qos) { err = igb_vlvf_set(adapter, vlan, !!vlan, vf); if (err) @@ -6816,9 +6829,16 @@ static inline void igb_vf_reset(struct igb_adapter *adapter, u32 vf) igb_clear_vf_vfta(adapter, vf); #ifdef IFLA_VF_MAX if (adapter->vf_data[vf].pf_vlan) +#ifdef IFLA_VF_VLAN_INFO_MAX + igb_ndo_set_vf_vlan(adapter->netdev, vf, + adapter->vf_data[vf].pf_vlan, + adapter->vf_data[vf].pf_qos, 0); +#else + igb_ndo_set_vf_vlan(adapter->netdev, vf, adapter->vf_data[vf].pf_vlan, adapter->vf_data[vf].pf_qos); +#endif else igb_clear_vf_vfta(adapter, vf); #endif |