diff options
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/dev.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 6cc8a70350ac..a76021c71207 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -3993,6 +3993,45 @@ static int __init netdev_dma_register(void) | |||
3993 | static int __init netdev_dma_register(void) { return -ENODEV; } | 3993 | static int __init netdev_dma_register(void) { return -ENODEV; } |
3994 | #endif /* CONFIG_NET_DMA */ | 3994 | #endif /* CONFIG_NET_DMA */ |
3995 | 3995 | ||
3996 | /** | ||
3997 | * netdev_compute_feature - compute conjunction of two feature sets | ||
3998 | * @all: first feature set | ||
3999 | * @one: second feature set | ||
4000 | * | ||
4001 | * Computes a new feature set after adding a device with feature set | ||
4002 | * @one to the master device with current feature set @all. Returns | ||
4003 | * the new feature set. | ||
4004 | */ | ||
4005 | int netdev_compute_features(unsigned long all, unsigned long one) | ||
4006 | { | ||
4007 | /* if device needs checksumming, downgrade to hw checksumming */ | ||
4008 | if (all & NETIF_F_NO_CSUM && !(one & NETIF_F_NO_CSUM)) | ||
4009 | all ^= NETIF_F_NO_CSUM | NETIF_F_HW_CSUM; | ||
4010 | |||
4011 | /* if device can't do all checksum, downgrade to ipv4/ipv6 */ | ||
4012 | if (all & NETIF_F_HW_CSUM && !(one & NETIF_F_HW_CSUM)) | ||
4013 | all ^= NETIF_F_HW_CSUM | ||
4014 | | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; | ||
4015 | |||
4016 | if (one & NETIF_F_GSO) | ||
4017 | one |= NETIF_F_GSO_SOFTWARE; | ||
4018 | one |= NETIF_F_GSO; | ||
4019 | |||
4020 | /* If even one device supports robust GSO, enable it for all. */ | ||
4021 | if (one & NETIF_F_GSO_ROBUST) | ||
4022 | all |= NETIF_F_GSO_ROBUST; | ||
4023 | |||
4024 | all &= one | NETIF_F_LLTX; | ||
4025 | |||
4026 | if (!(all & NETIF_F_ALL_CSUM)) | ||
4027 | all &= ~NETIF_F_SG; | ||
4028 | if (!(all & NETIF_F_SG)) | ||
4029 | all &= ~NETIF_F_GSO_MASK; | ||
4030 | |||
4031 | return all; | ||
4032 | } | ||
4033 | EXPORT_SYMBOL(netdev_compute_features); | ||
4034 | |||
3996 | /* | 4035 | /* |
3997 | * Initialize the DEV module. At boot time this walks the device list and | 4036 | * Initialize the DEV module. At boot time this walks the device list and |
3998 | * unhooks any devices that fail to initialise (normally hardware not | 4037 | * unhooks any devices that fail to initialise (normally hardware not |