diff options
-rw-r--r-- | drivers/net/bonding/bond_main.c | 3 | ||||
-rw-r--r-- | drivers/net/team/team.c | 3 | ||||
-rw-r--r-- | net/core/dev.c | 15 |
3 files changed, 11 insertions, 10 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index b9b34566b9b8..8575fee8b359 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -1526,6 +1526,9 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
1526 | } | 1526 | } |
1527 | #endif | 1527 | #endif |
1528 | 1528 | ||
1529 | if (!(bond_dev->features & NETIF_F_LRO)) | ||
1530 | dev_disable_lro(slave_dev); | ||
1531 | |||
1529 | res = netdev_rx_handler_register(slave_dev, bond_handle_frame, | 1532 | res = netdev_rx_handler_register(slave_dev, bond_handle_frame, |
1530 | new_slave); | 1533 | new_slave); |
1531 | if (res) { | 1534 | if (res) { |
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 2368395d8ae5..93e224217e24 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
@@ -1179,6 +1179,9 @@ static int team_port_add(struct team *team, struct net_device *port_dev) | |||
1179 | goto err_enable_netpoll; | 1179 | goto err_enable_netpoll; |
1180 | } | 1180 | } |
1181 | 1181 | ||
1182 | if (!(dev->features & NETIF_F_LRO)) | ||
1183 | dev_disable_lro(port_dev); | ||
1184 | |||
1182 | err = netdev_rx_handler_register(port_dev, team_handle_frame, | 1185 | err = netdev_rx_handler_register(port_dev, team_handle_frame, |
1183 | port); | 1186 | port); |
1184 | if (err) { | 1187 | if (err) { |
diff --git a/net/core/dev.c b/net/core/dev.c index bb09b0364619..1ab168e0fdf7 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1437,22 +1437,17 @@ EXPORT_SYMBOL(dev_close); | |||
1437 | */ | 1437 | */ |
1438 | void dev_disable_lro(struct net_device *dev) | 1438 | void dev_disable_lro(struct net_device *dev) |
1439 | { | 1439 | { |
1440 | /* | 1440 | struct net_device *lower_dev; |
1441 | * If we're trying to disable lro on a vlan device | 1441 | struct list_head *iter; |
1442 | * use the underlying physical device instead | ||
1443 | */ | ||
1444 | if (is_vlan_dev(dev)) | ||
1445 | dev = vlan_dev_real_dev(dev); | ||
1446 | |||
1447 | /* the same for macvlan devices */ | ||
1448 | if (netif_is_macvlan(dev)) | ||
1449 | dev = macvlan_dev_real_dev(dev); | ||
1450 | 1442 | ||
1451 | dev->wanted_features &= ~NETIF_F_LRO; | 1443 | dev->wanted_features &= ~NETIF_F_LRO; |
1452 | netdev_update_features(dev); | 1444 | netdev_update_features(dev); |
1453 | 1445 | ||
1454 | if (unlikely(dev->features & NETIF_F_LRO)) | 1446 | if (unlikely(dev->features & NETIF_F_LRO)) |
1455 | netdev_WARN(dev, "failed to disable LRO!\n"); | 1447 | netdev_WARN(dev, "failed to disable LRO!\n"); |
1448 | |||
1449 | netdev_for_each_lower_dev(dev, lower_dev, iter) | ||
1450 | dev_disable_lro(lower_dev); | ||
1456 | } | 1451 | } |
1457 | EXPORT_SYMBOL(dev_disable_lro); | 1452 | EXPORT_SYMBOL(dev_disable_lro); |
1458 | 1453 | ||