|
@@ -2252,6 +2252,28 @@ static int i40evf_change_mtu(struct net_device *netdev, int new_mtu)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+#define I40EVF_VLAN_FEATURES (NETIF_F_HW_VLAN_CTAG_TX |\
|
|
|
+ NETIF_F_HW_VLAN_CTAG_RX |\
|
|
|
+ NETIF_F_HW_VLAN_CTAG_FILTER)
|
|
|
+
|
|
|
+/**
|
|
|
+ * i40evf_fix_features - fix up the netdev feature bits
|
|
|
+ * @netdev: our net device
|
|
|
+ * @features: desired feature bits
|
|
|
+ *
|
|
|
+ * Returns fixed-up features bits
|
|
|
+ **/
|
|
|
+static netdev_features_t i40evf_fix_features(struct net_device *netdev,
|
|
|
+ netdev_features_t features)
|
|
|
+{
|
|
|
+ struct i40evf_adapter *adapter = netdev_priv(netdev);
|
|
|
+
|
|
|
+ features &= ~I40EVF_VLAN_FEATURES;
|
|
|
+ if (adapter->vf_res->vf_offload_flags & I40E_VIRTCHNL_VF_OFFLOAD_VLAN)
|
|
|
+ features |= I40EVF_VLAN_FEATURES;
|
|
|
+ return features;
|
|
|
+}
|
|
|
+
|
|
|
static const struct net_device_ops i40evf_netdev_ops = {
|
|
|
.ndo_open = i40evf_open,
|
|
|
.ndo_stop = i40evf_close,
|
|
@@ -2264,6 +2286,7 @@ static const struct net_device_ops i40evf_netdev_ops = {
|
|
|
.ndo_tx_timeout = i40evf_tx_timeout,
|
|
|
.ndo_vlan_rx_add_vid = i40evf_vlan_rx_add_vid,
|
|
|
.ndo_vlan_rx_kill_vid = i40evf_vlan_rx_kill_vid,
|
|
|
+ .ndo_fix_features = i40evf_fix_features,
|
|
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
|
.ndo_poll_controller = i40evf_netpoll,
|
|
|
#endif
|