aboutsummaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorMichał Mirosław <mirq-linux@rere.qmqm.pl>2011-04-22 02:31:16 -0400
committerDavid S. Miller <davem@davemloft.net>2011-04-28 16:33:07 -0400
commit1742f183fc218798dab6fcf0ded25b6608fc0a48 (patch)
tree47910c74f188e8dc9eb4fbefba01a1cf29de9965 /net/core
parent96339d6c490a32de35fa798ca7922d13a8538ecd (diff)
net: fix netdev_increment_features()
Simplify and fix netdev_increment_features() to conform to what is stated in netdevice.h comments about NETIF_F_ONE_FOR_ALL. Include FCoE segmentation and VLAN-challedged flags in computation. Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/dev.c35
1 files changed, 11 insertions, 24 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index 3bbb4c2ce92e..7db99b52679f 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -6164,33 +6164,20 @@ static int dev_cpu_callback(struct notifier_block *nfb,
6164 */ 6164 */
6165u32 netdev_increment_features(u32 all, u32 one, u32 mask) 6165u32 netdev_increment_features(u32 all, u32 one, u32 mask)
6166{ 6166{
6167 /* If device needs checksumming, downgrade to it. */ 6167 if (mask & NETIF_F_GEN_CSUM)
6168 if (all & NETIF_F_NO_CSUM && !(one & NETIF_F_NO_CSUM)) 6168 mask |= NETIF_F_ALL_CSUM;
6169 all ^= NETIF_F_NO_CSUM | (one & NETIF_F_ALL_CSUM); 6169 mask |= NETIF_F_VLAN_CHALLENGED;
6170 else if (mask & NETIF_F_ALL_CSUM) {
6171 /* If one device supports v4/v6 checksumming, set for all. */
6172 if (one & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM) &&
6173 !(all & NETIF_F_GEN_CSUM)) {
6174 all &= ~NETIF_F_ALL_CSUM;
6175 all |= one & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
6176 }
6177
6178 /* If one device supports hw checksumming, set for all. */
6179 if (one & NETIF_F_GEN_CSUM && !(all & NETIF_F_GEN_CSUM)) {
6180 all &= ~NETIF_F_ALL_CSUM;
6181 all |= NETIF_F_HW_CSUM;
6182 }
6183 }
6184 6170
6185 /* If device can't no cache copy, don't do for all */ 6171 all |= one & (NETIF_F_ONE_FOR_ALL|NETIF_F_ALL_CSUM) & mask;
6186 if (!(one & NETIF_F_NOCACHE_COPY)) 6172 all &= one | ~NETIF_F_ALL_FOR_ALL;
6187 all &= ~NETIF_F_NOCACHE_COPY;
6188 6173
6189 one |= NETIF_F_ALL_CSUM; 6174 /* If device needs checksumming, downgrade to it. */
6175 if (all & (NETIF_F_ALL_CSUM & ~NETIF_F_NO_CSUM))
6176 all &= ~NETIF_F_NO_CSUM;
6190 6177
6191 one |= all & NETIF_F_ONE_FOR_ALL; 6178 /* If one device supports hw checksumming, set for all. */
6192 all &= one | NETIF_F_LLTX | NETIF_F_GSO | NETIF_F_UFO; 6179 if (all & NETIF_F_GEN_CSUM)
6193 all |= one & mask & NETIF_F_ONE_FOR_ALL; 6180 all &= ~(NETIF_F_ALL_CSUM & ~NETIF_F_GEN_CSUM);
6194 6181
6195 return all; 6182 return all;
6196} 6183}