Lines Matching refs:team
75 static int team_port_set_team_dev_addr(struct team *team, in team_port_set_team_dev_addr() argument
78 return __set_port_dev_addr(port->dev, team->dev->dev_addr); in team_port_set_team_dev_addr()
81 int team_modeop_port_enter(struct team *team, struct team_port *port) in team_modeop_port_enter() argument
83 return team_port_set_team_dev_addr(team, port); in team_modeop_port_enter()
87 void team_modeop_port_change_dev_addr(struct team *team, in team_modeop_port_change_dev_addr() argument
90 team_port_set_team_dev_addr(team, port); in team_modeop_port_change_dev_addr()
114 static struct team_option *__team_find_option(struct team *team, in __team_find_option() argument
119 list_for_each_entry(option, &team->option_list, list) { in __team_find_option()
132 static void __team_option_inst_del_option(struct team *team, in __team_option_inst_del_option() argument
137 list_for_each_entry_safe(opt_inst, tmp, &team->option_inst_list, list) { in __team_option_inst_del_option()
143 static int __team_option_inst_add(struct team *team, struct team_option *option, in __team_option_inst_add() argument
164 list_add_tail(&opt_inst->list, &team->option_inst_list); in __team_option_inst_add()
166 err = option->init(team, &opt_inst->info); in __team_option_inst_add()
175 static int __team_option_inst_add_option(struct team *team, in __team_option_inst_add_option() argument
181 err = __team_option_inst_add(team, option, NULL); in __team_option_inst_add_option()
188 __team_option_inst_del_option(team, option); in __team_option_inst_add_option()
192 static void __team_option_inst_mark_removed_option(struct team *team, in __team_option_inst_mark_removed_option() argument
197 list_for_each_entry(opt_inst, &team->option_inst_list, list) { in __team_option_inst_mark_removed_option()
205 static void __team_option_inst_del_port(struct team *team, in __team_option_inst_del_port() argument
210 list_for_each_entry_safe(opt_inst, tmp, &team->option_inst_list, list) { in __team_option_inst_del_port()
217 static int __team_option_inst_add_port(struct team *team, in __team_option_inst_add_port() argument
223 list_for_each_entry(option, &team->option_list, list) { in __team_option_inst_add_port()
226 err = __team_option_inst_add(team, option, port); in __team_option_inst_add_port()
233 __team_option_inst_del_port(team, port); in __team_option_inst_add_port()
237 static void __team_option_inst_mark_removed_port(struct team *team, in __team_option_inst_mark_removed_port() argument
242 list_for_each_entry(opt_inst, &team->option_inst_list, list) { in __team_option_inst_mark_removed_port()
250 static int __team_options_register(struct team *team, in __team_options_register() argument
263 if (__team_find_option(team, option->name)) { in __team_options_register()
275 err = __team_option_inst_add_option(team, dst_opts[i]); in __team_options_register()
278 list_add_tail(&dst_opts[i]->list, &team->option_list); in __team_options_register()
286 __team_option_inst_del_option(team, dst_opts[i]); in __team_options_register()
297 static void __team_options_mark_removed(struct team *team, in __team_options_mark_removed() argument
306 del_opt = __team_find_option(team, option->name); in __team_options_mark_removed()
308 __team_option_inst_mark_removed_option(team, del_opt); in __team_options_mark_removed()
312 static void __team_options_unregister(struct team *team, in __team_options_unregister() argument
321 del_opt = __team_find_option(team, option->name); in __team_options_unregister()
323 __team_option_inst_del_option(team, del_opt); in __team_options_unregister()
330 static void __team_options_change_check(struct team *team);
332 int team_options_register(struct team *team, in team_options_register() argument
338 err = __team_options_register(team, option, option_count); in team_options_register()
341 __team_options_change_check(team); in team_options_register()
346 void team_options_unregister(struct team *team, in team_options_unregister() argument
350 __team_options_mark_removed(team, option, option_count); in team_options_unregister()
351 __team_options_change_check(team); in team_options_unregister()
352 __team_options_unregister(team, option, option_count); in team_options_unregister()
356 static int team_option_get(struct team *team, in team_option_get() argument
362 return opt_inst->option->getter(team, ctx); in team_option_get()
365 static int team_option_set(struct team *team, in team_option_set() argument
371 return opt_inst->option->setter(team, ctx); in team_option_set()
383 void team_options_change_check(struct team *team) in team_options_change_check() argument
385 __team_options_change_check(team); in team_options_change_check()
492 static bool team_dummy_transmit(struct team *team, struct sk_buff *skb) in team_dummy_transmit() argument
498 static rx_handler_result_t team_dummy_receive(struct team *team, in team_dummy_receive() argument
509 static bool team_is_mode_set(struct team *team) in team_is_mode_set() argument
511 return team->mode != &__team_no_mode; in team_is_mode_set()
514 static void team_set_no_mode(struct team *team) in team_set_no_mode() argument
516 team->user_carrier_enabled = false; in team_set_no_mode()
517 team->mode = &__team_no_mode; in team_set_no_mode()
520 static void team_adjust_ops(struct team *team) in team_adjust_ops() argument
527 if (!team->en_port_count || !team_is_mode_set(team) || in team_adjust_ops()
528 !team->mode->ops->transmit) in team_adjust_ops()
529 team->ops.transmit = team_dummy_transmit; in team_adjust_ops()
531 team->ops.transmit = team->mode->ops->transmit; in team_adjust_ops()
533 if (!team->en_port_count || !team_is_mode_set(team) || in team_adjust_ops()
534 !team->mode->ops->receive) in team_adjust_ops()
535 team->ops.receive = team_dummy_receive; in team_adjust_ops()
537 team->ops.receive = team->mode->ops->receive; in team_adjust_ops()
545 static int __team_change_mode(struct team *team, in __team_change_mode() argument
549 if (team_is_mode_set(team)) { in __team_change_mode()
550 void (*exit_op)(struct team *team) = team->ops.exit; in __team_change_mode()
553 memset(&team->ops, 0, sizeof(struct team_mode_ops)); in __team_change_mode()
554 team_adjust_ops(team); in __team_change_mode()
557 exit_op(team); in __team_change_mode()
558 team_mode_put(team->mode); in __team_change_mode()
559 team_set_no_mode(team); in __team_change_mode()
561 memset(&team->mode_priv, 0, in __team_change_mode()
562 sizeof(struct team) - offsetof(struct team, mode_priv)); in __team_change_mode()
571 err = new_mode->ops->init(team); in __team_change_mode()
576 team->mode = new_mode; in __team_change_mode()
577 memcpy(&team->ops, new_mode->ops, sizeof(struct team_mode_ops)); in __team_change_mode()
578 team_adjust_ops(team); in __team_change_mode()
583 static int team_change_mode(struct team *team, const char *kind) in team_change_mode() argument
586 struct net_device *dev = team->dev; in team_change_mode()
589 if (!list_empty(&team->port_list)) { in team_change_mode()
594 if (team_is_mode_set(team) && strcmp(team->mode->kind, kind) == 0) { in team_change_mode()
605 err = __team_change_mode(team, new_mode); in team_change_mode()
623 struct team *team; in team_notify_peers_work() local
626 team = container_of(work, struct team, notify_peers.dw.work); in team_notify_peers_work()
629 schedule_delayed_work(&team->notify_peers.dw, 0); in team_notify_peers_work()
632 val = atomic_dec_if_positive(&team->notify_peers.count_pending); in team_notify_peers_work()
637 call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, team->dev); in team_notify_peers_work()
640 schedule_delayed_work(&team->notify_peers.dw, in team_notify_peers_work()
641 msecs_to_jiffies(team->notify_peers.interval)); in team_notify_peers_work()
644 static void team_notify_peers(struct team *team) in team_notify_peers() argument
646 if (!team->notify_peers.count || !netif_running(team->dev)) in team_notify_peers()
648 atomic_add(team->notify_peers.count, &team->notify_peers.count_pending); in team_notify_peers()
649 schedule_delayed_work(&team->notify_peers.dw, 0); in team_notify_peers()
652 static void team_notify_peers_init(struct team *team) in team_notify_peers_init() argument
654 INIT_DELAYED_WORK(&team->notify_peers.dw, team_notify_peers_work); in team_notify_peers_init()
657 static void team_notify_peers_fini(struct team *team) in team_notify_peers_fini() argument
659 cancel_delayed_work_sync(&team->notify_peers.dw); in team_notify_peers_fini()
669 struct team *team; in team_mcast_rejoin_work() local
672 team = container_of(work, struct team, mcast_rejoin.dw.work); in team_mcast_rejoin_work()
675 schedule_delayed_work(&team->mcast_rejoin.dw, 0); in team_mcast_rejoin_work()
678 val = atomic_dec_if_positive(&team->mcast_rejoin.count_pending); in team_mcast_rejoin_work()
683 call_netdevice_notifiers(NETDEV_RESEND_IGMP, team->dev); in team_mcast_rejoin_work()
686 schedule_delayed_work(&team->mcast_rejoin.dw, in team_mcast_rejoin_work()
687 msecs_to_jiffies(team->mcast_rejoin.interval)); in team_mcast_rejoin_work()
690 static void team_mcast_rejoin(struct team *team) in team_mcast_rejoin() argument
692 if (!team->mcast_rejoin.count || !netif_running(team->dev)) in team_mcast_rejoin()
694 atomic_add(team->mcast_rejoin.count, &team->mcast_rejoin.count_pending); in team_mcast_rejoin()
695 schedule_delayed_work(&team->mcast_rejoin.dw, 0); in team_mcast_rejoin()
698 static void team_mcast_rejoin_init(struct team *team) in team_mcast_rejoin_init() argument
700 INIT_DELAYED_WORK(&team->mcast_rejoin.dw, team_mcast_rejoin_work); in team_mcast_rejoin_init()
703 static void team_mcast_rejoin_fini(struct team *team) in team_mcast_rejoin_fini() argument
705 cancel_delayed_work_sync(&team->mcast_rejoin.dw); in team_mcast_rejoin_fini()
718 struct team *team; in team_handle_frame() local
728 team = port->team; in team_handle_frame()
733 res = team->ops.receive(team, port, skb); in team_handle_frame()
738 pcpu_stats = this_cpu_ptr(team->pcpu_stats); in team_handle_frame()
746 skb->dev = team->dev; in team_handle_frame()
748 this_cpu_inc(team->pcpu_stats->rx_dropped); in team_handle_frame()
759 static int team_queue_override_init(struct team *team) in team_queue_override_init() argument
762 unsigned int queue_cnt = team->dev->num_tx_queues - 1; in team_queue_override_init()
770 team->qom_lists = listarr; in team_queue_override_init()
776 static void team_queue_override_fini(struct team *team) in team_queue_override_fini() argument
778 kfree(team->qom_lists); in team_queue_override_fini()
781 static struct list_head *__team_get_qom_list(struct team *team, u16 queue_id) in __team_get_qom_list() argument
783 return &team->qom_lists[queue_id - 1]; in __team_get_qom_list()
789 static bool team_queue_override_transmit(struct team *team, struct sk_buff *skb) in team_queue_override_transmit() argument
794 if (!team->queue_override_enabled || !skb->queue_mapping) in team_queue_override_transmit()
796 qom_list = __team_get_qom_list(team, skb->queue_mapping); in team_queue_override_transmit()
798 if (!team_dev_queue_xmit(team, port, skb)) in team_queue_override_transmit()
804 static void __team_queue_override_port_del(struct team *team, in __team_queue_override_port_del() argument
824 static void __team_queue_override_port_add(struct team *team, in __team_queue_override_port_add() argument
833 qom_list = __team_get_qom_list(team, port->queue_id); in __team_queue_override_port_add()
843 static void __team_queue_override_enabled_check(struct team *team) in __team_queue_override_enabled_check() argument
848 list_for_each_entry(port, &team->port_list, list) { in __team_queue_override_enabled_check()
854 if (enabled == team->queue_override_enabled) in __team_queue_override_enabled_check()
856 netdev_dbg(team->dev, "%s queue override\n", in __team_queue_override_enabled_check()
858 team->queue_override_enabled = enabled; in __team_queue_override_enabled_check()
861 static void team_queue_override_port_prio_changed(struct team *team, in team_queue_override_port_prio_changed() argument
866 __team_queue_override_port_del(team, port); in team_queue_override_port_prio_changed()
867 __team_queue_override_port_add(team, port); in team_queue_override_port_prio_changed()
868 __team_queue_override_enabled_check(team); in team_queue_override_port_prio_changed()
871 static void team_queue_override_port_change_queue_id(struct team *team, in team_queue_override_port_change_queue_id() argument
876 __team_queue_override_port_del(team, port); in team_queue_override_port_change_queue_id()
878 __team_queue_override_port_add(team, port); in team_queue_override_port_change_queue_id()
879 __team_queue_override_enabled_check(team); in team_queue_override_port_change_queue_id()
885 static void team_queue_override_port_add(struct team *team, in team_queue_override_port_add() argument
888 __team_queue_override_port_add(team, port); in team_queue_override_port_add()
889 __team_queue_override_enabled_check(team); in team_queue_override_port_add()
892 static void team_queue_override_port_del(struct team *team, in team_queue_override_port_del() argument
895 __team_queue_override_port_del(team, port); in team_queue_override_port_del()
896 __team_queue_override_enabled_check(team); in team_queue_override_port_del()
904 static bool team_port_find(const struct team *team, in team_port_find() argument
909 list_for_each_entry(cur, &team->port_list, list) in team_port_find()
921 static void team_port_enable(struct team *team, in team_port_enable() argument
926 port->index = team->en_port_count++; in team_port_enable()
928 team_port_index_hash(team, port->index)); in team_port_enable()
929 team_adjust_ops(team); in team_port_enable()
930 team_queue_override_port_add(team, port); in team_port_enable()
931 if (team->ops.port_enabled) in team_port_enable()
932 team->ops.port_enabled(team, port); in team_port_enable()
933 team_notify_peers(team); in team_port_enable()
934 team_mcast_rejoin(team); in team_port_enable()
937 static void __reconstruct_port_hlist(struct team *team, int rm_index) in __reconstruct_port_hlist() argument
942 for (i = rm_index + 1; i < team->en_port_count; i++) { in __reconstruct_port_hlist()
943 port = team_get_port_by_index(team, i); in __reconstruct_port_hlist()
947 team_port_index_hash(team, port->index)); in __reconstruct_port_hlist()
951 static void team_port_disable(struct team *team, in team_port_disable() argument
956 if (team->ops.port_disabled) in team_port_disable()
957 team->ops.port_disabled(team, port); in team_port_disable()
959 __reconstruct_port_hlist(team, port->index); in team_port_disable()
961 team->en_port_count--; in team_port_disable()
962 team_queue_override_port_del(team, port); in team_port_disable()
963 team_adjust_ops(team); in team_port_disable()
964 team_notify_peers(team); in team_port_disable()
965 team_mcast_rejoin(team); in team_port_disable()
972 static void ___team_compute_features(struct team *team) in ___team_compute_features() argument
980 list_for_each_entry(port, &team->port_list, list) { in ___team_compute_features()
990 team->dev->vlan_features = vlan_features; in ___team_compute_features()
991 team->dev->hard_header_len = max_hard_header_len; in ___team_compute_features()
993 team->dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; in ___team_compute_features()
995 team->dev->priv_flags |= IFF_XMIT_DST_RELEASE; in ___team_compute_features()
998 static void __team_compute_features(struct team *team) in __team_compute_features() argument
1000 ___team_compute_features(team); in __team_compute_features()
1001 netdev_change_features(team->dev); in __team_compute_features()
1004 static void team_compute_features(struct team *team) in team_compute_features() argument
1006 mutex_lock(&team->lock); in team_compute_features()
1007 ___team_compute_features(team); in team_compute_features()
1008 mutex_unlock(&team->lock); in team_compute_features()
1009 netdev_change_features(team->dev); in team_compute_features()
1012 static int team_port_enter(struct team *team, struct team_port *port) in team_port_enter() argument
1016 dev_hold(team->dev); in team_port_enter()
1017 if (team->ops.port_enter) { in team_port_enter()
1018 err = team->ops.port_enter(team, port); in team_port_enter()
1020 netdev_err(team->dev, "Device %s failed to enter team mode\n", in team_port_enter()
1029 dev_put(team->dev); in team_port_enter()
1034 static void team_port_leave(struct team *team, struct team_port *port) in team_port_leave() argument
1036 if (team->ops.port_leave) in team_port_leave()
1037 team->ops.port_leave(team, port); in team_port_leave()
1038 dev_put(team->dev); in team_port_leave()
1042 static int team_port_enable_netpoll(struct team *team, struct team_port *port) in team_port_enable_netpoll() argument
1047 if (!team->dev->npinfo) in team_port_enable_netpoll()
1077 static int team_port_enable_netpoll(struct team *team, struct team_port *port) in team_port_enable_netpoll() argument
1109 static int team_port_add(struct team *team, struct net_device *port_dev) in team_port_add() argument
1111 struct net_device *dev = team->dev; in team_port_add()
1145 port = kzalloc(sizeof(struct team_port) + team->mode->port_priv_size, in team_port_add()
1151 port->team = team; in team_port_add()
1163 err = team_port_enter(team, port); in team_port_add()
1184 err = team_port_enable_netpoll(team, port); in team_port_add()
1209 err = __team_option_inst_add_port(team, port); in team_port_add()
1217 list_add_tail_rcu(&port->list, &team->port_list); in team_port_add()
1218 team_port_enable(team, port); in team_port_add()
1219 __team_compute_features(team); in team_port_add()
1221 __team_options_change_check(team); in team_port_add()
1243 team_port_leave(team, port); in team_port_add()
1257 static int team_port_del(struct team *team, struct net_device *port_dev) in team_port_del() argument
1259 struct net_device *dev = team->dev; in team_port_del()
1264 if (!port || !team_port_find(team, port)) { in team_port_del()
1270 team_port_disable(team, port); in team_port_del()
1279 team_port_leave(team, port); in team_port_del()
1281 __team_option_inst_mark_removed_port(team, port); in team_port_del()
1282 __team_options_change_check(team); in team_port_del()
1283 __team_option_inst_del_port(team, port); in team_port_del()
1290 __team_compute_features(team); in team_port_del()
1300 static int team_mode_option_get(struct team *team, struct team_gsetter_ctx *ctx) in team_mode_option_get() argument
1302 ctx->data.str_val = team->mode->kind; in team_mode_option_get()
1306 static int team_mode_option_set(struct team *team, struct team_gsetter_ctx *ctx) in team_mode_option_set() argument
1308 return team_change_mode(team, ctx->data.str_val); in team_mode_option_set()
1311 static int team_notify_peers_count_get(struct team *team, in team_notify_peers_count_get() argument
1314 ctx->data.u32_val = team->notify_peers.count; in team_notify_peers_count_get()
1318 static int team_notify_peers_count_set(struct team *team, in team_notify_peers_count_set() argument
1321 team->notify_peers.count = ctx->data.u32_val; in team_notify_peers_count_set()
1325 static int team_notify_peers_interval_get(struct team *team, in team_notify_peers_interval_get() argument
1328 ctx->data.u32_val = team->notify_peers.interval; in team_notify_peers_interval_get()
1332 static int team_notify_peers_interval_set(struct team *team, in team_notify_peers_interval_set() argument
1335 team->notify_peers.interval = ctx->data.u32_val; in team_notify_peers_interval_set()
1339 static int team_mcast_rejoin_count_get(struct team *team, in team_mcast_rejoin_count_get() argument
1342 ctx->data.u32_val = team->mcast_rejoin.count; in team_mcast_rejoin_count_get()
1346 static int team_mcast_rejoin_count_set(struct team *team, in team_mcast_rejoin_count_set() argument
1349 team->mcast_rejoin.count = ctx->data.u32_val; in team_mcast_rejoin_count_set()
1353 static int team_mcast_rejoin_interval_get(struct team *team, in team_mcast_rejoin_interval_get() argument
1356 ctx->data.u32_val = team->mcast_rejoin.interval; in team_mcast_rejoin_interval_get()
1360 static int team_mcast_rejoin_interval_set(struct team *team, in team_mcast_rejoin_interval_set() argument
1363 team->mcast_rejoin.interval = ctx->data.u32_val; in team_mcast_rejoin_interval_set()
1367 static int team_port_en_option_get(struct team *team, in team_port_en_option_get() argument
1376 static int team_port_en_option_set(struct team *team, in team_port_en_option_set() argument
1382 team_port_enable(team, port); in team_port_en_option_set()
1384 team_port_disable(team, port); in team_port_en_option_set()
1388 static int team_user_linkup_option_get(struct team *team, in team_user_linkup_option_get() argument
1397 static void __team_carrier_check(struct team *team);
1399 static int team_user_linkup_option_set(struct team *team, in team_user_linkup_option_set() argument
1406 __team_carrier_check(port->team); in team_user_linkup_option_set()
1410 static int team_user_linkup_en_option_get(struct team *team, in team_user_linkup_en_option_get() argument
1419 static int team_user_linkup_en_option_set(struct team *team, in team_user_linkup_en_option_set() argument
1426 __team_carrier_check(port->team); in team_user_linkup_en_option_set()
1430 static int team_priority_option_get(struct team *team, in team_priority_option_get() argument
1439 static int team_priority_option_set(struct team *team, in team_priority_option_set() argument
1448 team_queue_override_port_prio_changed(team, port); in team_priority_option_set()
1452 static int team_queue_id_option_get(struct team *team, in team_queue_id_option_get() argument
1461 static int team_queue_id_option_set(struct team *team, in team_queue_id_option_set() argument
1469 if (new_queue_id >= team->dev->real_num_tx_queues) in team_queue_id_option_set()
1471 team_queue_override_port_change_queue_id(team, port, new_queue_id); in team_queue_id_option_set()
1563 struct team *team = netdev_priv(dev); in team_init() local
1567 team->dev = dev; in team_init()
1568 mutex_init(&team->lock); in team_init()
1569 team_set_no_mode(team); in team_init()
1571 team->pcpu_stats = netdev_alloc_pcpu_stats(struct team_pcpu_stats); in team_init()
1572 if (!team->pcpu_stats) in team_init()
1576 INIT_HLIST_HEAD(&team->en_port_hlist[i]); in team_init()
1577 INIT_LIST_HEAD(&team->port_list); in team_init()
1578 err = team_queue_override_init(team); in team_init()
1582 team_adjust_ops(team); in team_init()
1584 INIT_LIST_HEAD(&team->option_list); in team_init()
1585 INIT_LIST_HEAD(&team->option_inst_list); in team_init()
1587 team_notify_peers_init(team); in team_init()
1588 team_mcast_rejoin_init(team); in team_init()
1590 err = team_options_register(team, team_options, ARRAY_SIZE(team_options)); in team_init()
1600 team_mcast_rejoin_fini(team); in team_init()
1601 team_notify_peers_fini(team); in team_init()
1602 team_queue_override_fini(team); in team_init()
1604 free_percpu(team->pcpu_stats); in team_init()
1611 struct team *team = netdev_priv(dev); in team_uninit() local
1615 mutex_lock(&team->lock); in team_uninit()
1616 list_for_each_entry_safe(port, tmp, &team->port_list, list) in team_uninit()
1617 team_port_del(team, port->dev); in team_uninit()
1619 __team_change_mode(team, NULL); /* cleanup */ in team_uninit()
1620 __team_options_unregister(team, team_options, ARRAY_SIZE(team_options)); in team_uninit()
1621 team_mcast_rejoin_fini(team); in team_uninit()
1622 team_notify_peers_fini(team); in team_uninit()
1623 team_queue_override_fini(team); in team_uninit()
1624 mutex_unlock(&team->lock); in team_uninit()
1629 struct team *team = netdev_priv(dev); in team_destructor() local
1631 free_percpu(team->pcpu_stats); in team_destructor()
1650 struct team *team = netdev_priv(dev); in team_xmit() local
1654 tx_success = team_queue_override_transmit(team, skb); in team_xmit()
1656 tx_success = team->ops.transmit(team, skb); in team_xmit()
1660 pcpu_stats = this_cpu_ptr(team->pcpu_stats); in team_xmit()
1666 this_cpu_inc(team->pcpu_stats->tx_dropped); in team_xmit()
1698 struct team *team = netdev_priv(dev); in team_change_rx_flags() local
1703 list_for_each_entry_rcu(port, &team->port_list, list) { in team_change_rx_flags()
1718 struct team *team = netdev_priv(dev); in team_set_rx_mode() local
1722 list_for_each_entry_rcu(port, &team->port_list, list) { in team_set_rx_mode()
1732 struct team *team = netdev_priv(dev); in team_set_mac_address() local
1738 mutex_lock(&team->lock); in team_set_mac_address()
1739 list_for_each_entry(port, &team->port_list, list) in team_set_mac_address()
1740 if (team->ops.port_change_dev_addr) in team_set_mac_address()
1741 team->ops.port_change_dev_addr(team, port); in team_set_mac_address()
1742 mutex_unlock(&team->lock); in team_set_mac_address()
1748 struct team *team = netdev_priv(dev); in team_change_mtu() local
1756 mutex_lock(&team->lock); in team_change_mtu()
1757 team->port_mtu_change_allowed = true; in team_change_mtu()
1758 list_for_each_entry(port, &team->port_list, list) { in team_change_mtu()
1766 team->port_mtu_change_allowed = false; in team_change_mtu()
1767 mutex_unlock(&team->lock); in team_change_mtu()
1774 list_for_each_entry_continue_reverse(port, &team->port_list, list) in team_change_mtu()
1776 team->port_mtu_change_allowed = false; in team_change_mtu()
1777 mutex_unlock(&team->lock); in team_change_mtu()
1785 struct team *team = netdev_priv(dev); in team_get_stats64() local
1793 p = per_cpu_ptr(team->pcpu_stats, i); in team_get_stats64()
1822 struct team *team = netdev_priv(dev); in team_vlan_rx_add_vid() local
1830 mutex_lock(&team->lock); in team_vlan_rx_add_vid()
1831 list_for_each_entry(port, &team->port_list, list) { in team_vlan_rx_add_vid()
1836 mutex_unlock(&team->lock); in team_vlan_rx_add_vid()
1841 list_for_each_entry_continue_reverse(port, &team->port_list, list) in team_vlan_rx_add_vid()
1843 mutex_unlock(&team->lock); in team_vlan_rx_add_vid()
1850 struct team *team = netdev_priv(dev); in team_vlan_rx_kill_vid() local
1853 mutex_lock(&team->lock); in team_vlan_rx_kill_vid()
1854 list_for_each_entry(port, &team->port_list, list) in team_vlan_rx_kill_vid()
1856 mutex_unlock(&team->lock); in team_vlan_rx_kill_vid()
1866 static void __team_netpoll_cleanup(struct team *team) in __team_netpoll_cleanup() argument
1870 list_for_each_entry(port, &team->port_list, list) in __team_netpoll_cleanup()
1876 struct team *team = netdev_priv(dev); in team_netpoll_cleanup() local
1878 mutex_lock(&team->lock); in team_netpoll_cleanup()
1879 __team_netpoll_cleanup(team); in team_netpoll_cleanup()
1880 mutex_unlock(&team->lock); in team_netpoll_cleanup()
1886 struct team *team = netdev_priv(dev); in team_netpoll_setup() local
1890 mutex_lock(&team->lock); in team_netpoll_setup()
1891 list_for_each_entry(port, &team->port_list, list) { in team_netpoll_setup()
1892 err = team_port_enable_netpoll(team, port); in team_netpoll_setup()
1894 __team_netpoll_cleanup(team); in team_netpoll_setup()
1898 mutex_unlock(&team->lock); in team_netpoll_setup()
1905 struct team *team = netdev_priv(dev); in team_add_slave() local
1908 mutex_lock(&team->lock); in team_add_slave()
1909 err = team_port_add(team, port_dev); in team_add_slave()
1910 mutex_unlock(&team->lock); in team_add_slave()
1916 struct team *team = netdev_priv(dev); in team_del_slave() local
1919 mutex_lock(&team->lock); in team_del_slave()
1920 err = team_port_del(team, port_dev); in team_del_slave()
1921 mutex_unlock(&team->lock); in team_del_slave()
1929 struct team *team = netdev_priv(dev); in team_fix_features() local
1937 list_for_each_entry_rcu(port, &team->port_list, list) { in team_fix_features()
1951 struct team *team = netdev_priv(dev); in team_change_carrier() local
1953 team->user_carrier_enabled = true; in team_change_carrier()
2029 struct team *team = netdev_priv(dev); in team_dev_type_check_change() local
2035 if (!list_empty(&team->port_list)) { in team_dev_type_check_change()
2117 .priv_size = sizeof(struct team),
2188 static struct team *team_nl_team_get(struct genl_info *info) in team_nl_team_get()
2193 struct team *team; in team_nl_team_get() local
2206 team = netdev_priv(dev); in team_nl_team_get()
2207 mutex_lock(&team->lock); in team_nl_team_get()
2208 return team; in team_nl_team_get()
2211 static void team_nl_team_put(struct team *team) in team_nl_team_put() argument
2213 mutex_unlock(&team->lock); in team_nl_team_put()
2214 dev_put(team->dev); in team_nl_team_put()
2218 struct team *team, u32 portid);
2220 static int team_nl_send_unicast(struct sk_buff *skb, struct team *team, u32 portid) in team_nl_send_unicast() argument
2222 return genlmsg_unicast(dev_net(team->dev), skb, portid); in team_nl_send_unicast()
2225 static int team_nl_fill_one_option_get(struct sk_buff *skb, struct team *team, in team_nl_fill_one_option_get() argument
2235 err = team_option_get(team, opt_inst, &ctx); in team_nl_fill_one_option_get()
2307 struct team *team, u32 portid, in __send_and_alloc_skb() argument
2313 err = send_func(*pskb, team, portid); in __send_and_alloc_skb()
2323 static int team_nl_send_options_get(struct team *team, u32 portid, u32 seq, in team_nl_send_options_get() argument
2340 err = __send_and_alloc_skb(&skb, team, portid, send_func); in team_nl_send_options_get()
2349 if (nla_put_u32(skb, TEAM_ATTR_TEAM_IFINDEX, team->dev->ifindex)) in team_nl_send_options_get()
2358 err = team_nl_fill_one_option_get(skb, team, opt_inst); in team_nl_send_options_get()
2379 err = __send_and_alloc_skb(&skb, team, portid, send_func); in team_nl_send_options_get()
2385 return send_func(skb, team, portid); in team_nl_send_options_get()
2397 struct team *team; in team_nl_cmd_options_get() local
2402 team = team_nl_team_get(info); in team_nl_cmd_options_get()
2403 if (!team) in team_nl_cmd_options_get()
2406 list_for_each_entry(opt_inst, &team->option_inst_list, list) in team_nl_cmd_options_get()
2408 err = team_nl_send_options_get(team, info->snd_portid, info->snd_seq, in team_nl_cmd_options_get()
2412 team_nl_team_put(team); in team_nl_cmd_options_get()
2417 static int team_nl_send_event_options_get(struct team *team,
2422 struct team *team; in team_nl_cmd_options_set() local
2428 team = team_nl_team_get(info); in team_nl_cmd_options_set()
2429 if (!team) in team_nl_cmd_options_set()
2500 list_for_each_entry(opt_inst, &team->option_inst_list, list) { in team_nl_cmd_options_set()
2541 err = team_option_set(team, opt_inst, &ctx); in team_nl_cmd_options_set()
2553 err = team_nl_send_event_options_get(team, &opt_inst_list); in team_nl_cmd_options_set()
2556 team_nl_team_put(team); in team_nl_cmd_options_set()
2591 static int team_nl_send_port_list_get(struct team *team, u32 portid, u32 seq, in team_nl_send_port_list_get() argument
2604 port = list_first_entry_or_null(&team->port_list, in team_nl_send_port_list_get()
2608 err = __send_and_alloc_skb(&skb, team, portid, send_func); in team_nl_send_port_list_get()
2617 if (nla_put_u32(skb, TEAM_ATTR_TEAM_IFINDEX, team->dev->ifindex)) in team_nl_send_port_list_get()
2634 list_for_each_entry_from(port, &team->port_list, list) { in team_nl_send_port_list_get()
2657 err = __send_and_alloc_skb(&skb, team, portid, send_func); in team_nl_send_port_list_get()
2663 return send_func(skb, team, portid); in team_nl_send_port_list_get()
2676 struct team *team; in team_nl_cmd_port_list_get() local
2679 team = team_nl_team_get(info); in team_nl_cmd_port_list_get()
2680 if (!team) in team_nl_cmd_port_list_get()
2683 err = team_nl_send_port_list_get(team, info->snd_portid, info->snd_seq, in team_nl_cmd_port_list_get()
2686 team_nl_team_put(team); in team_nl_cmd_port_list_get()
2722 struct team *team, u32 portid) in team_nl_send_multicast() argument
2724 return genlmsg_multicast_netns(&team_nl_family, dev_net(team->dev), in team_nl_send_multicast()
2728 static int team_nl_send_event_options_get(struct team *team, in team_nl_send_event_options_get() argument
2731 return team_nl_send_options_get(team, 0, 0, 0, team_nl_send_multicast, in team_nl_send_event_options_get()
2735 static int team_nl_send_event_port_get(struct team *team, in team_nl_send_event_port_get() argument
2738 return team_nl_send_port_list_get(team, 0, 0, 0, team_nl_send_multicast, in team_nl_send_event_port_get()
2758 static void __team_options_change_check(struct team *team) in __team_options_change_check() argument
2764 list_for_each_entry(opt_inst, &team->option_inst_list, list) { in __team_options_change_check()
2768 err = team_nl_send_event_options_get(team, &sel_opt_inst_list); in __team_options_change_check()
2770 netdev_warn(team->dev, "Failed to send options change via netlink (err %d)\n", in __team_options_change_check()
2797 err = team_nl_send_event_port_get(port->team, port); in __team_port_change_send()
2799 netdev_warn(port->team->dev, "Failed to send port change of device %s via netlink (err %d)\n", in __team_port_change_send()
2804 static void __team_carrier_check(struct team *team) in __team_carrier_check() argument
2809 if (team->user_carrier_enabled) in __team_carrier_check()
2813 list_for_each_entry(port, &team->port_list, list) { in __team_carrier_check()
2821 netif_carrier_on(team->dev); in __team_carrier_check()
2823 netif_carrier_off(team->dev); in __team_carrier_check()
2830 __team_carrier_check(port->team); in __team_port_change_check()
2836 __team_carrier_check(port->team); in __team_port_change_port_added()
2843 __team_carrier_check(port->team); in __team_port_change_port_removed()
2848 struct team *team = port->team; in team_port_change_check() local
2850 mutex_lock(&team->lock); in team_port_change_check()
2852 mutex_unlock(&team->lock); in team_port_change_check()
2884 team_del_slave(port->team->dev, dev); in team_device_event()
2887 team_compute_features(port->team); in team_device_event()
2891 if (!port->team->port_mtu_change_allowed) in team_device_event()
2899 call_netdevice_notifiers(event, port->team->dev); in team_device_event()