diff options
Diffstat (limited to 'drivers/net/team/team.c')
-rw-r--r-- | drivers/net/team/team.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 341b65dbbcd3..3ffe8a6e3c8b 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
@@ -848,7 +848,7 @@ static struct netpoll_info *team_netpoll_info(struct team *team) | |||
848 | } | 848 | } |
849 | #endif | 849 | #endif |
850 | 850 | ||
851 | static void __team_port_change_check(struct team_port *port, bool linkup); | 851 | static void __team_port_change_port_added(struct team_port *port, bool linkup); |
852 | 852 | ||
853 | static int team_port_add(struct team *team, struct net_device *port_dev) | 853 | static int team_port_add(struct team *team, struct net_device *port_dev) |
854 | { | 854 | { |
@@ -948,7 +948,7 @@ static int team_port_add(struct team *team, struct net_device *port_dev) | |||
948 | team_port_enable(team, port); | 948 | team_port_enable(team, port); |
949 | list_add_tail_rcu(&port->list, &team->port_list); | 949 | list_add_tail_rcu(&port->list, &team->port_list); |
950 | __team_compute_features(team); | 950 | __team_compute_features(team); |
951 | __team_port_change_check(port, !!netif_carrier_ok(port_dev)); | 951 | __team_port_change_port_added(port, !!netif_carrier_ok(port_dev)); |
952 | __team_options_change_check(team); | 952 | __team_options_change_check(team); |
953 | 953 | ||
954 | netdev_info(dev, "Port device %s added\n", portname); | 954 | netdev_info(dev, "Port device %s added\n", portname); |
@@ -983,6 +983,8 @@ err_set_mtu: | |||
983 | return err; | 983 | return err; |
984 | } | 984 | } |
985 | 985 | ||
986 | static void __team_port_change_port_removed(struct team_port *port); | ||
987 | |||
986 | static int team_port_del(struct team *team, struct net_device *port_dev) | 988 | static int team_port_del(struct team *team, struct net_device *port_dev) |
987 | { | 989 | { |
988 | struct net_device *dev = team->dev; | 990 | struct net_device *dev = team->dev; |
@@ -999,8 +1001,7 @@ static int team_port_del(struct team *team, struct net_device *port_dev) | |||
999 | __team_option_inst_mark_removed_port(team, port); | 1001 | __team_option_inst_mark_removed_port(team, port); |
1000 | __team_options_change_check(team); | 1002 | __team_options_change_check(team); |
1001 | __team_option_inst_del_port(team, port); | 1003 | __team_option_inst_del_port(team, port); |
1002 | port->removed = true; | 1004 | __team_port_change_port_removed(port); |
1003 | __team_port_change_check(port, false); | ||
1004 | team_port_disable(team, port); | 1005 | team_port_disable(team, port); |
1005 | list_del_rcu(&port->list); | 1006 | list_del_rcu(&port->list); |
1006 | netdev_rx_handler_unregister(port_dev); | 1007 | netdev_rx_handler_unregister(port_dev); |
@@ -2251,13 +2252,11 @@ static void __team_options_change_check(struct team *team) | |||
2251 | } | 2252 | } |
2252 | 2253 | ||
2253 | /* rtnl lock is held */ | 2254 | /* rtnl lock is held */ |
2254 | static void __team_port_change_check(struct team_port *port, bool linkup) | 2255 | |
2256 | static void __team_port_change_send(struct team_port *port, bool linkup) | ||
2255 | { | 2257 | { |
2256 | int err; | 2258 | int err; |
2257 | 2259 | ||
2258 | if (!port->removed && port->state.linkup == linkup) | ||
2259 | return; | ||
2260 | |||
2261 | port->changed = true; | 2260 | port->changed = true; |
2262 | port->state.linkup = linkup; | 2261 | port->state.linkup = linkup; |
2263 | team_refresh_port_linkup(port); | 2262 | team_refresh_port_linkup(port); |
@@ -2282,6 +2281,23 @@ send_event: | |||
2282 | 2281 | ||
2283 | } | 2282 | } |
2284 | 2283 | ||
2284 | static void __team_port_change_check(struct team_port *port, bool linkup) | ||
2285 | { | ||
2286 | if (port->state.linkup != linkup) | ||
2287 | __team_port_change_send(port, linkup); | ||
2288 | } | ||
2289 | |||
2290 | static void __team_port_change_port_added(struct team_port *port, bool linkup) | ||
2291 | { | ||
2292 | __team_port_change_send(port, linkup); | ||
2293 | } | ||
2294 | |||
2295 | static void __team_port_change_port_removed(struct team_port *port) | ||
2296 | { | ||
2297 | port->removed = true; | ||
2298 | __team_port_change_send(port, false); | ||
2299 | } | ||
2300 | |||
2285 | static void team_port_change_check(struct team_port *port, bool linkup) | 2301 | static void team_port_change_check(struct team_port *port, bool linkup) |
2286 | { | 2302 | { |
2287 | struct team *team = port->team; | 2303 | struct team *team = port->team; |