diff options
| -rw-r--r-- | drivers/net/bonding/bond_main.c | 7 | ||||
| -rw-r--r-- | include/linux/netdevice.h | 3 | ||||
| -rw-r--r-- | net/bridge/br_if.c | 3 | ||||
| -rw-r--r-- | net/core/dev.c | 6 | ||||
| -rw-r--r-- | net/core/ethtool.c | 6 | ||||
| -rw-r--r-- | net/ipv4/ip_output.c | 2 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 10 |
7 files changed, 13 insertions, 24 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 46326cdfb277..8171cae06688 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -1199,8 +1199,7 @@ int bond_sethwaddr(struct net_device *bond_dev, struct net_device *slave_dev) | |||
| 1199 | } | 1199 | } |
| 1200 | 1200 | ||
| 1201 | #define BOND_INTERSECT_FEATURES \ | 1201 | #define BOND_INTERSECT_FEATURES \ |
| 1202 | (NETIF_F_SG|NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM|\ | 1202 | (NETIF_F_SG | NETIF_F_ALL_CSUM | NETIF_F_TSO | NETIF_F_UFO) |
| 1203 | NETIF_F_TSO|NETIF_F_UFO) | ||
| 1204 | 1203 | ||
| 1205 | /* | 1204 | /* |
| 1206 | * Compute the common dev->feature set available to all slaves. Some | 1205 | * Compute the common dev->feature set available to all slaves. Some |
| @@ -1218,9 +1217,7 @@ static int bond_compute_features(struct bonding *bond) | |||
| 1218 | features &= (slave->dev->features & BOND_INTERSECT_FEATURES); | 1217 | features &= (slave->dev->features & BOND_INTERSECT_FEATURES); |
| 1219 | 1218 | ||
| 1220 | if ((features & NETIF_F_SG) && | 1219 | if ((features & NETIF_F_SG) && |
| 1221 | !(features & (NETIF_F_IP_CSUM | | 1220 | !(features & NETIF_F_ALL_CSUM)) |
| 1222 | NETIF_F_NO_CSUM | | ||
| 1223 | NETIF_F_HW_CSUM))) | ||
| 1224 | features &= ~NETIF_F_SG; | 1221 | features &= ~NETIF_F_SG; |
| 1225 | 1222 | ||
| 1226 | /* | 1223 | /* |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 067b9ccafd87..e432b743dda2 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -312,6 +312,9 @@ struct net_device | |||
| 312 | #define NETIF_F_LLTX 4096 /* LockLess TX */ | 312 | #define NETIF_F_LLTX 4096 /* LockLess TX */ |
| 313 | #define NETIF_F_UFO 8192 /* Can offload UDP Large Send*/ | 313 | #define NETIF_F_UFO 8192 /* Can offload UDP Large Send*/ |
| 314 | 314 | ||
| 315 | #define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) | ||
| 316 | #define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM) | ||
| 317 | |||
| 315 | struct net_device *next_sched; | 318 | struct net_device *next_sched; |
| 316 | 319 | ||
| 317 | /* Interface index. Unique device identifier */ | 320 | /* Interface index. Unique device identifier */ |
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index f5d47bf4f967..90c95f59dc82 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c | |||
| @@ -376,8 +376,7 @@ void br_features_recompute(struct net_bridge *br) | |||
| 376 | checksum = br->feature_mask & NETIF_F_IP_CSUM; | 376 | checksum = br->feature_mask & NETIF_F_IP_CSUM; |
| 377 | 377 | ||
| 378 | list_for_each_entry(p, &br->port_list, list) { | 378 | list_for_each_entry(p, &br->port_list, list) { |
| 379 | if (!(p->dev->features | 379 | if (!(p->dev->features & NETIF_F_ALL_CSUM)) |
| 380 | & (NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM))) | ||
| 381 | checksum = 0; | 380 | checksum = 0; |
| 382 | features &= p->dev->features; | 381 | features &= p->dev->features; |
| 383 | } | 382 | } |
diff --git a/net/core/dev.c b/net/core/dev.c index 91361bc2b682..ab39fe17cb58 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1284,7 +1284,7 @@ int dev_queue_xmit(struct sk_buff *skb) | |||
| 1284 | * checksumming for this protocol, complete checksumming here. | 1284 | * checksumming for this protocol, complete checksumming here. |
| 1285 | */ | 1285 | */ |
| 1286 | if (skb->ip_summed == CHECKSUM_HW && | 1286 | if (skb->ip_summed == CHECKSUM_HW && |
| 1287 | (!(dev->features & (NETIF_F_HW_CSUM | NETIF_F_NO_CSUM)) && | 1287 | (!(dev->features & NETIF_F_GEN_CSUM) && |
| 1288 | (!(dev->features & NETIF_F_IP_CSUM) || | 1288 | (!(dev->features & NETIF_F_IP_CSUM) || |
| 1289 | skb->protocol != htons(ETH_P_IP)))) | 1289 | skb->protocol != htons(ETH_P_IP)))) |
| 1290 | if (skb_checksum_help(skb, 0)) | 1290 | if (skb_checksum_help(skb, 0)) |
| @@ -2789,9 +2789,7 @@ int register_netdevice(struct net_device *dev) | |||
| 2789 | 2789 | ||
| 2790 | /* Fix illegal SG+CSUM combinations. */ | 2790 | /* Fix illegal SG+CSUM combinations. */ |
| 2791 | if ((dev->features & NETIF_F_SG) && | 2791 | if ((dev->features & NETIF_F_SG) && |
| 2792 | !(dev->features & (NETIF_F_IP_CSUM | | 2792 | !(dev->features & NETIF_F_ALL_CSUM)) { |
| 2793 | NETIF_F_NO_CSUM | | ||
| 2794 | NETIF_F_HW_CSUM))) { | ||
| 2795 | printk("%s: Dropping NETIF_F_SG since no checksum feature.\n", | 2793 | printk("%s: Dropping NETIF_F_SG since no checksum feature.\n", |
| 2796 | dev->name); | 2794 | dev->name); |
| 2797 | dev->features &= ~NETIF_F_SG; | 2795 | dev->features &= ~NETIF_F_SG; |
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index e6f76106a99b..3f269e4e9438 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c | |||
| @@ -30,7 +30,7 @@ u32 ethtool_op_get_link(struct net_device *dev) | |||
| 30 | 30 | ||
| 31 | u32 ethtool_op_get_tx_csum(struct net_device *dev) | 31 | u32 ethtool_op_get_tx_csum(struct net_device *dev) |
| 32 | { | 32 | { |
| 33 | return (dev->features & (NETIF_F_IP_CSUM | NETIF_F_HW_CSUM)) != 0; | 33 | return (dev->features & NETIF_F_ALL_CSUM) != 0; |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | int ethtool_op_set_tx_csum(struct net_device *dev, u32 data) | 36 | int ethtool_op_set_tx_csum(struct net_device *dev, u32 data) |
| @@ -551,9 +551,7 @@ static int ethtool_set_sg(struct net_device *dev, char __user *useraddr) | |||
| 551 | return -EFAULT; | 551 | return -EFAULT; |
| 552 | 552 | ||
| 553 | if (edata.data && | 553 | if (edata.data && |
| 554 | !(dev->features & (NETIF_F_IP_CSUM | | 554 | !(dev->features & NETIF_F_ALL_CSUM)) |
| 555 | NETIF_F_NO_CSUM | | ||
| 556 | NETIF_F_HW_CSUM))) | ||
| 557 | return -EINVAL; | 555 | return -EINVAL; |
| 558 | 556 | ||
| 559 | return __ethtool_set_sg(dev, edata.data); | 557 | return __ethtool_set_sg(dev, edata.data); |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index d4bb3fae4e49..8538aac3d148 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -840,7 +840,7 @@ int ip_append_data(struct sock *sk, | |||
| 840 | */ | 840 | */ |
| 841 | if (transhdrlen && | 841 | if (transhdrlen && |
| 842 | length + fragheaderlen <= mtu && | 842 | length + fragheaderlen <= mtu && |
| 843 | rt->u.dst.dev->features&(NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM) && | 843 | rt->u.dst.dev->features & NETIF_F_ALL_CSUM && |
| 844 | !exthdrlen) | 844 | !exthdrlen) |
| 845 | csummode = CHECKSUM_HW; | 845 | csummode = CHECKSUM_HW; |
| 846 | 846 | ||
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index ff6ccda9ff46..74998f250071 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -622,14 +622,10 @@ ssize_t tcp_sendpage(struct socket *sock, struct page *page, int offset, | |||
| 622 | ssize_t res; | 622 | ssize_t res; |
| 623 | struct sock *sk = sock->sk; | 623 | struct sock *sk = sock->sk; |
| 624 | 624 | ||
| 625 | #define TCP_ZC_CSUM_FLAGS (NETIF_F_IP_CSUM | NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) | ||
| 626 | |||
| 627 | if (!(sk->sk_route_caps & NETIF_F_SG) || | 625 | if (!(sk->sk_route_caps & NETIF_F_SG) || |
| 628 | !(sk->sk_route_caps & TCP_ZC_CSUM_FLAGS)) | 626 | !(sk->sk_route_caps & NETIF_F_ALL_CSUM)) |
| 629 | return sock_no_sendpage(sock, page, offset, size, flags); | 627 | return sock_no_sendpage(sock, page, offset, size, flags); |
| 630 | 628 | ||
| 631 | #undef TCP_ZC_CSUM_FLAGS | ||
| 632 | |||
| 633 | lock_sock(sk); | 629 | lock_sock(sk); |
| 634 | TCP_CHECK_TIMER(sk); | 630 | TCP_CHECK_TIMER(sk); |
| 635 | res = do_tcp_sendpages(sk, &page, offset, size, flags); | 631 | res = do_tcp_sendpages(sk, &page, offset, size, flags); |
| @@ -726,9 +722,7 @@ new_segment: | |||
| 726 | /* | 722 | /* |
| 727 | * Check whether we can use HW checksum. | 723 | * Check whether we can use HW checksum. |
| 728 | */ | 724 | */ |
| 729 | if (sk->sk_route_caps & | 725 | if (sk->sk_route_caps & NETIF_F_ALL_CSUM) |
| 730 | (NETIF_F_IP_CSUM | NETIF_F_NO_CSUM | | ||
| 731 | NETIF_F_HW_CSUM)) | ||
| 732 | skb->ip_summed = CHECKSUM_HW; | 726 | skb->ip_summed = CHECKSUM_HW; |
| 733 | 727 | ||
| 734 | skb_entail(sk, tp, skb); | 728 | skb_entail(sk, tp, skb); |
