diff options
author | Matthew Vick <matthew.vick@intel.com> | 2015-01-29 02:17:27 -0500 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2015-03-03 04:07:22 -0500 |
commit | 5bf33dc687e8bf2dfc033930ad06437efeea01d9 (patch) | |
tree | 96fbae244da90ec09e8c43ee7356c701822fe7ec /drivers/net/ethernet | |
parent | 8c1a90aa497dc4e2f971028c4484566629757357 (diff) |
fm10k: Implement ndo_features_check
The introduction of ndo_features_check allows drivers to report their
offload capabilities per-skb. Implement this in fm10k to take advantage
of this new functionality.
Reported-by: Joe Stringer <joestringer@nicira.com>
Signed-off-by: Matthew Vick <matthew.vick@intel.com>
Tested-by: Krishneil Singh <Krishneil.k.singh@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_main.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_netdev.c | 11 |
3 files changed, 13 insertions, 1 deletions
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k.h b/drivers/net/ethernet/intel/fm10k/fm10k.h index 42eb4344a9dc..59edfd4446cd 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k.h +++ b/drivers/net/ethernet/intel/fm10k/fm10k.h | |||
@@ -439,6 +439,7 @@ extern char fm10k_driver_name[]; | |||
439 | extern const char fm10k_driver_version[]; | 439 | extern const char fm10k_driver_version[]; |
440 | int fm10k_init_queueing_scheme(struct fm10k_intfc *interface); | 440 | int fm10k_init_queueing_scheme(struct fm10k_intfc *interface); |
441 | void fm10k_clear_queueing_scheme(struct fm10k_intfc *interface); | 441 | void fm10k_clear_queueing_scheme(struct fm10k_intfc *interface); |
442 | __be16 fm10k_tx_encap_offload(struct sk_buff *skb); | ||
442 | netdev_tx_t fm10k_xmit_frame_ring(struct sk_buff *skb, | 443 | netdev_tx_t fm10k_xmit_frame_ring(struct sk_buff *skb, |
443 | struct fm10k_ring *tx_ring); | 444 | struct fm10k_ring *tx_ring); |
444 | void fm10k_tx_timeout_reset(struct fm10k_intfc *interface); | 445 | void fm10k_tx_timeout_reset(struct fm10k_intfc *interface); |
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_main.c b/drivers/net/ethernet/intel/fm10k/fm10k_main.c index a7d379802e7c..0cb6971bfbf8 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_main.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_main.c | |||
@@ -718,7 +718,7 @@ static struct ethhdr *fm10k_gre_is_nvgre(struct sk_buff *skb) | |||
718 | return (struct ethhdr *)(&nvgre_hdr->tni); | 718 | return (struct ethhdr *)(&nvgre_hdr->tni); |
719 | } | 719 | } |
720 | 720 | ||
721 | static __be16 fm10k_tx_encap_offload(struct sk_buff *skb) | 721 | __be16 fm10k_tx_encap_offload(struct sk_buff *skb) |
722 | { | 722 | { |
723 | u8 l4_hdr = 0, inner_l4_hdr = 0, inner_l4_hlen; | 723 | u8 l4_hdr = 0, inner_l4_hdr = 0, inner_l4_hlen; |
724 | struct ethhdr *eth_hdr; | 724 | struct ethhdr *eth_hdr; |
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c b/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c index cfde8bac1aeb..2a9b467d1042 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c | |||
@@ -1350,6 +1350,16 @@ static void fm10k_dfwd_del_station(struct net_device *dev, void *priv) | |||
1350 | } | 1350 | } |
1351 | } | 1351 | } |
1352 | 1352 | ||
1353 | static netdev_features_t fm10k_features_check(struct sk_buff *skb, | ||
1354 | struct net_device *dev, | ||
1355 | netdev_features_t features) | ||
1356 | { | ||
1357 | if (!skb->encapsulation || fm10k_tx_encap_offload(skb)) | ||
1358 | return features; | ||
1359 | |||
1360 | return features & ~(NETIF_F_ALL_CSUM | NETIF_F_GSO_MASK); | ||
1361 | } | ||
1362 | |||
1353 | static const struct net_device_ops fm10k_netdev_ops = { | 1363 | static const struct net_device_ops fm10k_netdev_ops = { |
1354 | .ndo_open = fm10k_open, | 1364 | .ndo_open = fm10k_open, |
1355 | .ndo_stop = fm10k_close, | 1365 | .ndo_stop = fm10k_close, |
@@ -1372,6 +1382,7 @@ static const struct net_device_ops fm10k_netdev_ops = { | |||
1372 | .ndo_do_ioctl = fm10k_ioctl, | 1382 | .ndo_do_ioctl = fm10k_ioctl, |
1373 | .ndo_dfwd_add_station = fm10k_dfwd_add_station, | 1383 | .ndo_dfwd_add_station = fm10k_dfwd_add_station, |
1374 | .ndo_dfwd_del_station = fm10k_dfwd_del_station, | 1384 | .ndo_dfwd_del_station = fm10k_dfwd_del_station, |
1385 | .ndo_features_check = fm10k_features_check, | ||
1375 | }; | 1386 | }; |
1376 | 1387 | ||
1377 | #define DEFAULT_DEBUG_LEVEL_SHIFT 3 | 1388 | #define DEFAULT_DEBUG_LEVEL_SHIFT 3 |