mirror of https://gitee.com/openkylin/linux.git
igc: Add support for the ntuple feature
Copy the ntuple feature into list of user selectable features. Enable the ntuple feature. Signed-off-by: Sasha Neftin <sasha.neftin@intel.com> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
36b9fea609
commit
65cd3a725e
|
@ -400,6 +400,9 @@
|
||||||
|
|
||||||
#define IGC_N0_QUEUE -1
|
#define IGC_N0_QUEUE -1
|
||||||
|
|
||||||
|
#define IGC_MAX_MAC_HDR_LEN 127
|
||||||
|
#define IGC_MAX_NETWORK_HDR_LEN 511
|
||||||
|
|
||||||
#define IGC_VLAPQF_QUEUE_SEL(_n, q_idx) ((q_idx) << ((_n) * 4))
|
#define IGC_VLAPQF_QUEUE_SEL(_n, q_idx) ((q_idx) << ((_n) * 4))
|
||||||
#define IGC_VLAPQF_P_VALID(_n) (0x1 << (3 + (_n) * 4))
|
#define IGC_VLAPQF_P_VALID(_n) (0x1 << (3 + (_n) * 4))
|
||||||
#define IGC_VLAPQF_QUEUE_MASK 0x03
|
#define IGC_VLAPQF_QUEUE_MASK 0x03
|
||||||
|
|
|
@ -2127,6 +2127,86 @@ static struct net_device_stats *igc_get_stats(struct net_device *netdev)
|
||||||
return &netdev->stats;
|
return &netdev->stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static netdev_features_t igc_fix_features(struct net_device *netdev,
|
||||||
|
netdev_features_t features)
|
||||||
|
{
|
||||||
|
/* Since there is no support for separate Rx/Tx vlan accel
|
||||||
|
* enable/disable make sure Tx flag is always in same state as Rx.
|
||||||
|
*/
|
||||||
|
if (features & NETIF_F_HW_VLAN_CTAG_RX)
|
||||||
|
features |= NETIF_F_HW_VLAN_CTAG_TX;
|
||||||
|
else
|
||||||
|
features &= ~NETIF_F_HW_VLAN_CTAG_TX;
|
||||||
|
|
||||||
|
return features;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int igc_set_features(struct net_device *netdev,
|
||||||
|
netdev_features_t features)
|
||||||
|
{
|
||||||
|
netdev_features_t changed = netdev->features ^ features;
|
||||||
|
struct igc_adapter *adapter = netdev_priv(netdev);
|
||||||
|
|
||||||
|
/* Add VLAN support */
|
||||||
|
if (!(changed & (NETIF_F_RXALL | NETIF_F_NTUPLE)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!(features & NETIF_F_NTUPLE)) {
|
||||||
|
struct hlist_node *node2;
|
||||||
|
struct igc_nfc_filter *rule;
|
||||||
|
|
||||||
|
spin_lock(&adapter->nfc_lock);
|
||||||
|
hlist_for_each_entry_safe(rule, node2,
|
||||||
|
&adapter->nfc_filter_list, nfc_node) {
|
||||||
|
igc_erase_filter(adapter, rule);
|
||||||
|
hlist_del(&rule->nfc_node);
|
||||||
|
kfree(rule);
|
||||||
|
}
|
||||||
|
spin_unlock(&adapter->nfc_lock);
|
||||||
|
adapter->nfc_filter_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
netdev->features = features;
|
||||||
|
|
||||||
|
if (netif_running(netdev))
|
||||||
|
igc_reinit_locked(adapter);
|
||||||
|
else
|
||||||
|
igc_reset(adapter);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static netdev_features_t
|
||||||
|
igc_features_check(struct sk_buff *skb, struct net_device *dev,
|
||||||
|
netdev_features_t features)
|
||||||
|
{
|
||||||
|
unsigned int network_hdr_len, mac_hdr_len;
|
||||||
|
|
||||||
|
/* Make certain the headers can be described by a context descriptor */
|
||||||
|
mac_hdr_len = skb_network_header(skb) - skb->data;
|
||||||
|
if (unlikely(mac_hdr_len > IGC_MAX_MAC_HDR_LEN))
|
||||||
|
return features & ~(NETIF_F_HW_CSUM |
|
||||||
|
NETIF_F_SCTP_CRC |
|
||||||
|
NETIF_F_HW_VLAN_CTAG_TX |
|
||||||
|
NETIF_F_TSO |
|
||||||
|
NETIF_F_TSO6);
|
||||||
|
|
||||||
|
network_hdr_len = skb_checksum_start(skb) - skb_network_header(skb);
|
||||||
|
if (unlikely(network_hdr_len > IGC_MAX_NETWORK_HDR_LEN))
|
||||||
|
return features & ~(NETIF_F_HW_CSUM |
|
||||||
|
NETIF_F_SCTP_CRC |
|
||||||
|
NETIF_F_TSO |
|
||||||
|
NETIF_F_TSO6);
|
||||||
|
|
||||||
|
/* We can only support IPv4 TSO in tunnels if we can mangle the
|
||||||
|
* inner IP ID field, so strip TSO if MANGLEID is not supported.
|
||||||
|
*/
|
||||||
|
if (skb->encapsulation && !(features & NETIF_F_TSO_MANGLEID))
|
||||||
|
features &= ~NETIF_F_TSO;
|
||||||
|
|
||||||
|
return features;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* igc_configure - configure the hardware for RX and TX
|
* igc_configure - configure the hardware for RX and TX
|
||||||
* @adapter: private board structure
|
* @adapter: private board structure
|
||||||
|
@ -3793,6 +3873,9 @@ static const struct net_device_ops igc_netdev_ops = {
|
||||||
.ndo_set_mac_address = igc_set_mac,
|
.ndo_set_mac_address = igc_set_mac,
|
||||||
.ndo_change_mtu = igc_change_mtu,
|
.ndo_change_mtu = igc_change_mtu,
|
||||||
.ndo_get_stats = igc_get_stats,
|
.ndo_get_stats = igc_get_stats,
|
||||||
|
.ndo_fix_features = igc_fix_features,
|
||||||
|
.ndo_set_features = igc_set_features,
|
||||||
|
.ndo_features_check = igc_features_check,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* PCIe configuration access */
|
/* PCIe configuration access */
|
||||||
|
@ -4022,6 +4105,9 @@ static int igc_probe(struct pci_dev *pdev,
|
||||||
if (err)
|
if (err)
|
||||||
goto err_sw_init;
|
goto err_sw_init;
|
||||||
|
|
||||||
|
/* copy netdev features into list of user selectable features */
|
||||||
|
netdev->hw_features |= NETIF_F_NTUPLE;
|
||||||
|
|
||||||
/* MTU range: 68 - 9216 */
|
/* MTU range: 68 - 9216 */
|
||||||
netdev->min_mtu = ETH_MIN_MTU;
|
netdev->min_mtu = ETH_MIN_MTU;
|
||||||
netdev->max_mtu = MAX_STD_JUMBO_FRAME_SIZE;
|
netdev->max_mtu = MAX_STD_JUMBO_FRAME_SIZE;
|
||||||
|
|
Loading…
Reference in New Issue