Lines Matching full:lag

29  * ice_lag_set_primary - set PF LAG state as Primary
30 * @lag: LAG info struct
32 static void ice_lag_set_primary(struct ice_lag *lag) in ice_lag_set_primary() argument
34 struct ice_pf *pf = lag->pf; in ice_lag_set_primary()
39 if (lag->role != ICE_LAG_UNSET && lag->role != ICE_LAG_BACKUP) { in ice_lag_set_primary()
41 netdev_name(lag->netdev)); in ice_lag_set_primary()
45 lag->role = ICE_LAG_PRIMARY; in ice_lag_set_primary()
49 * ice_lag_set_backup - set PF LAG state to Backup
50 * @lag: LAG info struct
52 static void ice_lag_set_backup(struct ice_lag *lag) in ice_lag_set_backup() argument
54 struct ice_pf *pf = lag->pf; in ice_lag_set_backup()
59 if (lag->role != ICE_LAG_UNSET && lag->role != ICE_LAG_PRIMARY) { in ice_lag_set_backup()
61 netdev_name(lag->netdev)); in ice_lag_set_backup()
65 lag->role = ICE_LAG_BACKUP; in ice_lag_set_backup()
102 * ice_netdev_to_lag - return pointer to associated lag struct from netdev
121 return vsi->back->lag; in ice_netdev_to_lag()
126 * @lag: lag struct
130 ice_lag_find_hw_by_lport(struct ice_lag *lag, u8 lport) in ice_lag_find_hw_by_lport() argument
137 list_for_each_entry(entry, lag->netdev_head, node) { in ice_lag_find_hw_by_lport()
176 * ice_lag_find_primary - returns pointer to primary interfaces lag struct
177 * @lag: local interfaces lag struct
179 static struct ice_lag *ice_lag_find_primary(struct ice_lag *lag) in ice_lag_find_primary() argument
184 list_for_each(tmp, lag->netdev_head) { in ice_lag_find_primary()
200 * ice_lag_cfg_fltr - Add/Remove rule for LAG
201 * @lag: lag struct for local interface
209 ice_lag_cfg_fltr(struct ice_lag *lag, u32 act, u16 recipe_id, u16 *rule_idx, in ice_lag_cfg_fltr() argument
219 hw = &lag->pf->hw; in ice_lag_cfg_fltr()
225 dev_err(ice_pf_to_dev(lag->pf), "error allocating rule for LAG\n"); in ice_lag_cfg_fltr()
253 err = ice_aq_sw_rules(&lag->pf->hw, s_rule, s_rule_sz, 1, opc, NULL); in ice_lag_cfg_fltr()
268 * ice_lag_cfg_dflt_fltr - Add/Remove default VSI rule for LAG
269 * @lag: lag struct for local interface
273 ice_lag_cfg_dflt_fltr(struct ice_lag *lag, bool add) in ice_lag_cfg_dflt_fltr() argument
279 err = ice_lag_cfg_fltr(lag, act, lag->pf_recipe, &lag->pf_rx_rule_id, in ice_lag_cfg_dflt_fltr()
286 err = ice_lag_cfg_fltr(lag, act, lag->pf_recipe, &lag->pf_tx_rule_id, in ice_lag_cfg_dflt_fltr()
294 ice_lag_cfg_fltr(lag, act, lag->pf_recipe, &lag->pf_rx_rule_id, in ice_lag_cfg_dflt_fltr()
302 * @lag: lag struct for local interface
306 ice_lag_cfg_drop_fltr(struct ice_lag *lag, bool add) in ice_lag_cfg_drop_fltr() argument
312 return ice_lag_cfg_fltr(lag, act, lag->lport_recipe, in ice_lag_cfg_drop_fltr()
313 &lag->lport_rule_idx, ICE_FLTR_RX, add); in ice_lag_cfg_drop_fltr()
318 * @lag: local interfaces lag struct
322 ice_lag_cfg_pf_fltrs(struct ice_lag *lag, void *ptr) in ice_lag_cfg_pf_fltrs() argument
331 if (event_netdev != lag->netdev) in ice_lag_cfg_pf_fltrs()
336 dev = ice_pf_to_dev(lag->pf); in ice_lag_cfg_pf_fltrs()
339 if (bonding_info->slave.state && lag->pf_rx_rule_id) { in ice_lag_cfg_pf_fltrs()
340 if (ice_lag_cfg_dflt_fltr(lag, false)) in ice_lag_cfg_pf_fltrs()
342 if (ice_lag_cfg_drop_fltr(lag, true)) in ice_lag_cfg_pf_fltrs()
348 if (!bonding_info->slave.state && !lag->pf_rx_rule_id) { in ice_lag_cfg_pf_fltrs()
349 if (ice_lag_cfg_dflt_fltr(lag, true)) in ice_lag_cfg_pf_fltrs()
351 if (lag->lport_rule_idx && ice_lag_cfg_drop_fltr(lag, false)) in ice_lag_cfg_pf_fltrs()
357 * ice_display_lag_info - print LAG info
358 * @lag: LAG info struct
360 static void ice_display_lag_info(struct ice_lag *lag) in ice_display_lag_info() argument
363 struct device *dev = &lag->pf->pdev->dev; in ice_display_lag_info()
365 name = lag->netdev ? netdev_name(lag->netdev) : "unset"; in ice_display_lag_info()
366 upper = lag->upper_netdev ? netdev_name(lag->upper_netdev) : "unset"; in ice_display_lag_info()
367 primary = lag->primary ? "TRUE" : "FALSE"; in ice_display_lag_info()
368 bonded = lag->bonded ? "BONDED" : "UNBONDED"; in ice_display_lag_info()
370 switch (lag->role) { in ice_display_lag_info()
458 dev_warn(dev, "Failure to find TC node for LAG move\n"); in ice_lag_get_sched_parent()
464 dev_warn(dev, "Failure to find aggregate node for LAG move\n"); in ice_lag_get_sched_parent()
500 dev_warn(dev, "Failure to add new parent for LAG move\n"); in ice_lag_get_sched_parent()
510 * @lag: lag info struct
517 ice_lag_move_vf_node_tc(struct ice_lag *lag, u8 oldport, u8 newport, in ice_lag_move_vf_node_tc() argument
521 struct device *dev = ice_pf_to_dev(lag->pf); in ice_lag_move_vf_node_tc()
531 ctx = ice_get_vsi_ctx(&lag->pf->hw, vsi_num); in ice_lag_move_vf_node_tc()
533 dev_warn(dev, "Unable to locate VSI context for LAG failover\n"); in ice_lag_move_vf_node_tc()
542 new_hw = ice_lag_find_hw_by_lport(lag, newport); in ice_lag_move_vf_node_tc()
544 dev_warn(dev, "Unable to locate HW struct for LAG node destination\n"); in ice_lag_move_vf_node_tc()
559 if (ice_sched_suspend_resume_elems(&lag->pf->hw, 1, &tmp_teid, true)) in ice_lag_move_vf_node_tc()
560 dev_dbg(dev, "Problem suspending traffic for LAG node move\n"); in ice_lag_move_vf_node_tc()
573 valq = ice_lag_qbuf_recfg(&lag->pf->hw, qbuf, vsi_num, numq, tc); in ice_lag_move_vf_node_tc()
575 dev_dbg(dev, "No valid queues found for LAG failover\n"); in ice_lag_move_vf_node_tc()
579 if (ice_aq_cfg_lan_txq(&lag->pf->hw, qbuf, qbuf_size, valq, oldport, in ice_lag_move_vf_node_tc()
581 dev_warn(dev, "Failure to configure queues for LAG failover\n"); in ice_lag_move_vf_node_tc()
602 if (ice_aq_move_sched_elems(&lag->pf->hw, buf, buf_size, &num_moved)) in ice_lag_move_vf_node_tc()
614 if (ice_sched_suspend_resume_elems(&lag->pf->hw, 1, &tmp_teid, false)) in ice_lag_move_vf_node_tc()
615 dev_dbg(dev, "Problem restarting traffic for LAG node move\n"); in ice_lag_move_vf_node_tc()
619 * ice_lag_build_netdev_list - populate the lag struct's netdev list
620 * @lag: local lag struct
623 static void ice_lag_build_netdev_list(struct ice_lag *lag, in ice_lag_build_netdev_list() argument
631 for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) { in ice_lag_build_netdev_list()
640 lag->netdev_head = &ndlist->node; in ice_lag_build_netdev_list()
644 * ice_lag_destroy_netdev_list - free lag struct's netdev list
645 * @lag: pointer to local lag struct
646 * @ndlist: pointer to lag struct netdev list
648 static void ice_lag_destroy_netdev_list(struct ice_lag *lag, in ice_lag_destroy_netdev_list() argument
659 lag->netdev_head = NULL; in ice_lag_destroy_netdev_list()
664 * @lag: primary interface LAG struct
670 ice_lag_move_single_vf_nodes(struct ice_lag *lag, u8 oldport, u8 newport, in ice_lag_move_single_vf_nodes() argument
676 ice_lag_move_vf_node_tc(lag, oldport, newport, vsi_num, tc); in ice_lag_move_single_vf_nodes()
691 struct ice_lag *lag; in ice_lag_move_new_vf_nodes() local
704 lag = pf->lag; in ice_lag_move_new_vf_nodes()
707 if (!lag->bonded) in ice_lag_move_new_vf_nodes()
711 act_port = lag->active_port; in ice_lag_move_new_vf_nodes()
713 if (lag->upper_netdev) in ice_lag_move_new_vf_nodes()
714 ice_lag_build_netdev_list(lag, &ndlist); in ice_lag_move_new_vf_nodes()
717 lag->bonded && lag->primary && pri_port != act_port && in ice_lag_move_new_vf_nodes()
718 !list_empty(lag->netdev_head)) in ice_lag_move_new_vf_nodes()
719 ice_lag_move_single_vf_nodes(lag, pri_port, act_port, vsi->idx); in ice_lag_move_new_vf_nodes()
721 ice_lag_destroy_netdev_list(lag, &ndlist); in ice_lag_move_new_vf_nodes()
729 * @lag: lag info struct
733 static void ice_lag_move_vf_nodes(struct ice_lag *lag, u8 oldport, u8 newport) in ice_lag_move_vf_nodes() argument
738 if (!lag->primary) in ice_lag_move_vf_nodes()
741 pf = lag->pf; in ice_lag_move_vf_nodes()
744 ice_lag_move_single_vf_nodes(lag, oldport, newport, i); in ice_lag_move_vf_nodes()
748 * ice_lag_move_vf_nodes_cfg - move vf nodes outside LAG netdev event context
749 * @lag: local lag struct
756 * Must be called while holding the lag_mutex to avoid lag events from
761 void ice_lag_move_vf_nodes_cfg(struct ice_lag *lag, u8 src_prt, u8 dst_prt) in ice_lag_move_vf_nodes_cfg() argument
765 ice_lag_build_netdev_list(lag, &ndlist); in ice_lag_move_vf_nodes_cfg()
766 ice_lag_move_vf_nodes(lag, src_prt, dst_prt); in ice_lag_move_vf_nodes_cfg()
767 ice_lag_destroy_netdev_list(lag, &ndlist); in ice_lag_move_vf_nodes_cfg()
775 * @lag: local interface's lag struct
779 ice_lag_cfg_cp_fltr(struct ice_lag *lag, bool add) in ice_lag_cfg_cp_fltr() argument
785 vsi = lag->pf->vsi[0]; in ice_lag_cfg_cp_fltr()
791 netdev_warn(lag->netdev, "-ENOMEM error configuring CP filter\n"); in ice_lag_cfg_cp_fltr()
808 s_rule->index = cpu_to_le16(lag->cp_rule_idx); in ice_lag_cfg_cp_fltr()
810 if (ice_aq_sw_rules(&lag->pf->hw, s_rule, buf_len, 1, opc, NULL)) { in ice_lag_cfg_cp_fltr()
811 netdev_warn(lag->netdev, "Error %s CP rule for fail-over\n", in ice_lag_cfg_cp_fltr()
817 lag->cp_rule_idx = le16_to_cpu(s_rule->index); in ice_lag_cfg_cp_fltr()
819 lag->cp_rule_idx = 0; in ice_lag_cfg_cp_fltr()
827 * @lag: LAG info struct
832 static void ice_lag_info_event(struct ice_lag *lag, void *ptr) in ice_lag_info_event() argument
841 lag_netdev_name = netdev_name(lag->netdev); in ice_lag_info_event()
844 if (event_netdev != lag->netdev || !lag->bonded || !lag->upper_netdev) in ice_lag_info_event()
848 netdev_dbg(lag->netdev, "Bonding event recv, but mode not active/backup\n"); in ice_lag_info_event()
853 netdev_dbg(lag->netdev, "Bonding event recv, but secondary info not for us\n"); in ice_lag_info_event()
858 ice_lag_set_backup(lag); in ice_lag_info_event()
860 ice_lag_set_primary(lag); in ice_lag_info_event()
863 ice_display_lag_info(lag); in ice_lag_info_event()
868 * @lag: primary interface lag struct
874 ice_lag_reclaim_vf_tc(struct ice_lag *lag, struct ice_hw *src_hw, u16 vsi_num, in ice_lag_reclaim_vf_tc() argument
878 struct device *dev = ice_pf_to_dev(lag->pf); in ice_lag_reclaim_vf_tc()
888 hw = &lag->pf->hw; in ice_lag_reclaim_vf_tc()
891 dev_warn(dev, "Unable to locate VSI context for LAG reclaim\n"); in ice_lag_reclaim_vf_tc()
910 dev_dbg(dev, "Problem suspending traffic for LAG node move\n"); in ice_lag_reclaim_vf_tc()
923 dev_dbg(dev, "No valid queues found for LAG reclaim\n"); in ice_lag_reclaim_vf_tc()
930 dev_warn(dev, "Failure to configure queues for LAG failover\n"); in ice_lag_reclaim_vf_tc()
949 if (ice_aq_move_sched_elems(&lag->pf->hw, buf, buf_size, &num_moved)) in ice_lag_reclaim_vf_tc()
950 dev_warn(dev, "Failure to move VF nodes for LAG reclaim\n"); in ice_lag_reclaim_vf_tc()
962 dev_warn(dev, "Problem restarting traffic for LAG node reclaim\n"); in ice_lag_reclaim_vf_tc()
967 * @lag: primary interface lag struct
971 ice_lag_reclaim_vf_nodes(struct ice_lag *lag, struct ice_hw *src_hw) in ice_lag_reclaim_vf_nodes() argument
976 if (!lag->primary || !src_hw) in ice_lag_reclaim_vf_nodes()
979 pf = lag->pf; in ice_lag_reclaim_vf_nodes()
983 ice_lag_reclaim_vf_tc(lag, src_hw, i, tc); in ice_lag_reclaim_vf_nodes()
987 * ice_lag_link - handle LAG link event
988 * @lag: LAG info struct
990 static void ice_lag_link(struct ice_lag *lag) in ice_lag_link() argument
992 struct ice_pf *pf = lag->pf; in ice_lag_link()
994 if (lag->bonded) in ice_lag_link()
996 netdev_name(lag->netdev)); in ice_lag_link()
998 lag->bonded = true; in ice_lag_link()
999 lag->role = ICE_LAG_UNSET; in ice_lag_link()
1000 netdev_info(lag->netdev, "Shared SR-IOV resources in bond are active\n"); in ice_lag_link()
1004 * ice_lag_config_eswitch - configure eswitch to work with LAG
1005 * @lag: lag info struct
1013 static void ice_lag_config_eswitch(struct ice_lag *lag, in ice_lag_config_eswitch() argument
1019 xa_for_each(&lag->pf->eswitch.reprs, id, repr) in ice_lag_config_eswitch()
1027 * @lag: LAG info struct
1029 static void ice_lag_unlink(struct ice_lag *lag) in ice_lag_unlink() argument
1032 struct ice_pf *pf = lag->pf; in ice_lag_unlink()
1034 if (!lag->bonded) { in ice_lag_unlink()
1035 netdev_dbg(lag->netdev, "bonding unlink event on non-LAG netdev\n"); in ice_lag_unlink()
1039 if (lag->primary) { in ice_lag_unlink()
1040 act_port = lag->active_port; in ice_lag_unlink()
1041 pri_port = lag->pf->hw.port_info->lport; in ice_lag_unlink()
1043 ice_lag_move_vf_nodes(lag, act_port, pri_port); in ice_lag_unlink()
1044 lag->primary = false; in ice_lag_unlink()
1045 lag->active_port = ICE_LAG_INVALID_PORT; in ice_lag_unlink()
1048 ice_lag_config_eswitch(lag, lag->netdev); in ice_lag_unlink()
1052 primary_lag = ice_lag_find_primary(lag); in ice_lag_unlink()
1060 &lag->pf->hw); in ice_lag_unlink()
1066 lag->bonded = false; in ice_lag_unlink()
1067 lag->role = ICE_LAG_NONE; in ice_lag_unlink()
1068 lag->upper_netdev = NULL; in ice_lag_unlink()
1073 * @lag: lag info struct
1076 static void ice_lag_link_unlink(struct ice_lag *lag, void *ptr) in ice_lag_link_unlink() argument
1081 if (netdev != lag->netdev) in ice_lag_link_unlink()
1085 ice_lag_link(lag); in ice_lag_link_unlink()
1087 ice_lag_unlink(lag); in ice_lag_link_unlink()
1093 * @local_lag: local interfaces LAG struct
1124 dev_err(ice_pf_to_dev(local_lag->pf), "Error freeing SWID during LAG unlink\n"); in ice_lag_set_swid()
1178 * @lag: primary interface's lag struct
1183 static void ice_lag_primary_swid(struct ice_lag *lag, bool link) in ice_lag_primary_swid() argument
1188 hw = &lag->pf->hw; in ice_lag_primary_swid()
1192 dev_warn(ice_pf_to_dev(lag->pf), "Failure to set primary interface shared status\n"); in ice_lag_primary_swid()
1197 * @lag: lag info struct
1200 static void ice_lag_add_prune_list(struct ice_lag *lag, struct ice_pf *event_pf) in ice_lag_add_prune_list() argument
1208 dev = ice_pf_to_dev(lag->pf); in ice_lag_add_prune_list()
1210 prim_vsi_idx = lag->pf->vsi[0]->idx; in ice_lag_add_prune_list()
1212 if (!ice_find_vsi_list_entry(&lag->pf->hw, ICE_SW_LKUP_VLAN, in ice_lag_add_prune_list()
1214 dev_warn(dev, "Could not locate prune list when setting up SRIOV LAG\n"); in ice_lag_add_prune_list()
1221 dev_warn(dev, "Error allocating space for prune list when configuring SRIOV LAG\n"); in ice_lag_add_prune_list()
1238 * @lag: primary interface's ice_lag struct
1241 static void ice_lag_del_prune_list(struct ice_lag *lag, struct ice_pf *event_pf) in ice_lag_del_prune_list() argument
1249 dev = ice_pf_to_dev(lag->pf); in ice_lag_del_prune_list()
1251 vsi_idx = lag->pf->vsi[0]->idx; in ice_lag_del_prune_list()
1253 if (!ice_find_vsi_list_entry(&lag->pf->hw, ICE_SW_LKUP_VLAN, in ice_lag_del_prune_list()
1255 dev_warn(dev, "Could not locate prune list when unwinding SRIOV LAG\n"); in ice_lag_del_prune_list()
1262 dev_warn(dev, "Error allocating prune list when unwinding SRIOV LAG\n"); in ice_lag_del_prune_list()
1279 * ice_lag_init_feature_support_flag - Check for package and NVM support for LAG
1299 * ice_lag_changeupper_event - handle LAG changeupper event
1300 * @lag: LAG info struct
1303 static void ice_lag_changeupper_event(struct ice_lag *lag, void *ptr) in ice_lag_changeupper_event() argument
1313 if (netdev != lag->netdev) in ice_lag_changeupper_event()
1316 primary_lag = ice_lag_find_primary(lag); in ice_lag_changeupper_event()
1318 lag->upper_netdev = info->upper_dev; in ice_lag_changeupper_event()
1319 /* If there is not already a primary interface in the LAG, in ice_lag_changeupper_event()
1323 lag->primary = true; in ice_lag_changeupper_event()
1325 ice_lag_primary_swid(lag, true); in ice_lag_changeupper_event()
1326 primary_lag = lag; in ice_lag_changeupper_event()
1331 ice_lag_set_swid(swid, lag, true); in ice_lag_changeupper_event()
1332 ice_lag_add_prune_list(primary_lag, lag->pf); in ice_lag_changeupper_event()
1333 ice_lag_cfg_drop_fltr(lag, true); in ice_lag_changeupper_event()
1336 ice_lag_cfg_cp_fltr(lag, true); in ice_lag_changeupper_event()
1338 if (!primary_lag && lag->primary) in ice_lag_changeupper_event()
1339 primary_lag = lag; in ice_lag_changeupper_event()
1341 if (!lag->primary) { in ice_lag_changeupper_event()
1342 ice_lag_set_swid(0, lag, false); in ice_lag_changeupper_event()
1344 if (primary_lag && lag->primary) { in ice_lag_changeupper_event()
1345 ice_lag_primary_swid(lag, false); in ice_lag_changeupper_event()
1346 ice_lag_del_prune_list(primary_lag, lag->pf); in ice_lag_changeupper_event()
1350 ice_lag_cfg_cp_fltr(lag, false); in ice_lag_changeupper_event()
1356 * @lag: lag info struct
1361 static void ice_lag_monitor_link(struct ice_lag *lag, void *ptr) in ice_lag_monitor_link() argument
1369 if (!lag->primary) in ice_lag_monitor_link()
1373 if (!netif_is_same_ice(lag->pf, event_netdev)) in ice_lag_monitor_link()
1376 pf = lag->pf; in ice_lag_monitor_link()
1381 if (info->upper_dev != lag->upper_netdev) in ice_lag_monitor_link()
1385 /* Since there are only two interfaces allowed in SRIOV+LAG, if in ice_lag_monitor_link()
1389 if (prim_port != lag->active_port && in ice_lag_monitor_link()
1390 lag->active_port != ICE_LAG_INVALID_PORT) { in ice_lag_monitor_link()
1391 active_hw = ice_lag_find_hw_by_lport(lag, in ice_lag_monitor_link()
1392 lag->active_port); in ice_lag_monitor_link()
1393 ice_lag_reclaim_vf_nodes(lag, active_hw); in ice_lag_monitor_link()
1394 lag->active_port = ICE_LAG_INVALID_PORT; in ice_lag_monitor_link()
1401 * @lag: lag info struct
1407 static void ice_lag_monitor_active(struct ice_lag *lag, void *ptr) in ice_lag_monitor_active() argument
1416 if (!lag->primary) in ice_lag_monitor_active()
1419 pf = lag->pf; in ice_lag_monitor_active()
1427 if (!netif_is_ice(event_netdev) || event_upper != lag->upper_netdev) in ice_lag_monitor_active()
1442 if (lag->active_port == ICE_LAG_INVALID_PORT) { in ice_lag_monitor_active()
1444 ice_lag_move_vf_nodes(lag, prim_port, in ice_lag_monitor_active()
1446 lag->active_port = event_port; in ice_lag_monitor_active()
1447 ice_lag_config_eswitch(lag, event_netdev); in ice_lag_monitor_active()
1452 if (lag->active_port == event_port) in ice_lag_monitor_active()
1455 ice_lag_move_vf_nodes(lag, lag->active_port, event_port); in ice_lag_monitor_active()
1456 lag->active_port = event_port; in ice_lag_monitor_active()
1457 ice_lag_config_eswitch(lag, event_netdev); in ice_lag_monitor_active()
1462 if (lag->active_port != event_port) in ice_lag_monitor_active()
1469 ice_lag_move_vf_nodes(lag, event_port, prim_port); in ice_lag_monitor_active()
1470 lag->active_port = ICE_LAG_INVALID_PORT; in ice_lag_monitor_active()
1476 * @lag: lag info struct
1480 ice_lag_chk_comp(struct ice_lag *lag, void *ptr) in ice_lag_chk_comp() argument
1489 if (!lag->primary) in ice_lag_chk_comp()
1496 if (event_upper != lag->upper_netdev) in ice_lag_chk_comp()
1499 dev = ice_pf_to_dev(lag->pf); in ice_lag_chk_comp()
1501 /* only supporting switchdev mode for SRIOV VF LAG. in ice_lag_chk_comp()
1504 if (!ice_is_switchdev_running(lag->pf)) { in ice_lag_chk_comp()
1505 dev_info(dev, "Primary interface not in switchdev mode - VF LAG disabled\n"); in ice_lag_chk_comp()
1511 lag->bond_mode = bonding_info->master.bond_mode; in ice_lag_chk_comp()
1512 if (lag->bond_mode != BOND_MODE_ACTIVEBACKUP) { in ice_lag_chk_comp()
1513 dev_info(dev, "Bond Mode not ACTIVE-BACKUP - VF LAG disabled\n"); in ice_lag_chk_comp()
1517 list_for_each(tmp, lag->netdev_head) { in ice_lag_chk_comp()
1528 dev_info(dev, "Found %s non-ice netdev in LAG - VF LAG disabled\n", in ice_lag_chk_comp()
1535 dev_info(dev, "Found more than two netdevs in LAG - VF LAG disabled\n"); in ice_lag_chk_comp()
1540 vsi = ice_get_main_vsi(lag->pf); in ice_lag_chk_comp()
1542 if (lag->pf->pdev->bus != peer_vsi->back->pdev->bus || in ice_lag_chk_comp()
1543 lag->pf->pdev->slot != peer_vsi->back->pdev->slot) { in ice_lag_chk_comp()
1544 dev_info(dev, "Found %s on different device in LAG - VF LAG disabled\n", in ice_lag_chk_comp()
1553 dev_info(dev, "Found %s with different DCB in LAG - VF LAG disabled\n", in ice_lag_chk_comp()
1560 dev_warn(dev, "Found %s with FW LLDP agent active - VF LAG disabled\n", in ice_lag_chk_comp()
1571 * @lag: LAG info struct
1575 ice_lag_unregister(struct ice_lag *lag, struct net_device *event_netdev) in ice_lag_unregister() argument
1581 p_lag = ice_lag_find_primary(lag); in ice_lag_unregister()
1590 active_hw = ice_lag_find_hw_by_lport(lag, in ice_lag_unregister()
1594 lag->active_port = ICE_LAG_INVALID_PORT; in ice_lag_unregister()
1599 if (lag->primary && lag->netdev == event_netdev) in ice_lag_unregister()
1600 ice_lag_primary_swid(lag, false); in ice_lag_unregister()
1603 if (lag->primary && lag->netdev != event_netdev) in ice_lag_unregister()
1604 ice_lag_del_prune_list(lag, event_pf); in ice_lag_unregister()
1607 if (!lag->primary && lag->netdev == event_netdev) in ice_lag_unregister()
1608 ice_lag_set_swid(0, lag, false); in ice_lag_unregister()
1613 * @lag: pointer to lag struct
1617 ice_lag_monitor_rdma(struct ice_lag *lag, void *ptr) in ice_lag_monitor_rdma() argument
1625 if (netdev != lag->netdev) in ice_lag_monitor_rdma()
1629 ice_clear_rdma_cap(lag->pf); in ice_lag_monitor_rdma()
1631 ice_set_rdma_cap(lag->pf); in ice_lag_monitor_rdma()
1636 * @lag: lag info struct
1640 * SRIOV LAG compliant and flag if not. As interfaces leave the
1643 static void ice_lag_chk_disabled_bond(struct ice_lag *lag, void *ptr) in ice_lag_chk_disabled_bond() argument
1649 if (netdev != lag->netdev) in ice_lag_chk_disabled_bond()
1653 prim_lag = ice_lag_find_primary(lag); in ice_lag_chk_disabled_bond()
1656 ice_clear_feature_support(lag->pf, ICE_F_SRIOV_LAG); in ice_lag_chk_disabled_bond()
1657 netdev_info(netdev, "Interface added to non-compliant SRIOV LAG aggregate\n"); in ice_lag_chk_disabled_bond()
1660 ice_lag_init_feature_support_flag(lag->pf); in ice_lag_chk_disabled_bond()
1665 * ice_lag_disable_sriov_bond - set members of bond as not supporting SRIOV LAG
1666 * @lag: primary interfaces lag struct
1668 static void ice_lag_disable_sriov_bond(struct ice_lag *lag) in ice_lag_disable_sriov_bond() argument
1673 np = netdev_priv(lag->netdev); in ice_lag_disable_sriov_bond()
1691 pf = lag_work->lag->pf; in ice_lag_process_event()
1694 lag_work->lag->netdev_head = &lag_work->netdev_list.node; in ice_lag_process_event()
1699 ice_lag_chk_disabled_bond(lag_work->lag, info); in ice_lag_process_event()
1701 ice_lag_monitor_link(lag_work->lag, info); in ice_lag_process_event()
1702 ice_lag_changeupper_event(lag_work->lag, info); in ice_lag_process_event()
1703 ice_lag_link_unlink(lag_work->lag, info); in ice_lag_process_event()
1705 ice_lag_monitor_rdma(lag_work->lag, info); in ice_lag_process_event()
1709 if (!ice_lag_chk_comp(lag_work->lag, in ice_lag_process_event()
1712 ice_lag_disable_sriov_bond(lag_work->lag); in ice_lag_process_event()
1713 ice_lag_unregister(lag_work->lag, netdev); in ice_lag_process_event()
1716 ice_lag_monitor_active(lag_work->lag, in ice_lag_process_event()
1718 ice_lag_cfg_pf_fltrs(lag_work->lag, in ice_lag_process_event()
1721 ice_lag_info_event(lag_work->lag, &lag_work->info.bonding_info); in ice_lag_process_event()
1726 if ((netdev == lag_work->lag->netdev || in ice_lag_process_event()
1727 lag_work->lag->primary) && lag_work->lag->bonded) in ice_lag_process_event()
1728 ice_lag_unregister(lag_work->lag, netdev); in ice_lag_process_event()
1744 lag_work->lag->netdev_head = NULL; in ice_lag_process_event()
1752 * ice_lag_event_handler - handle LAG events from netdev
1764 struct ice_lag *lag; in ice_lag_event_handler() local
1776 lag = container_of(notif_blk, struct ice_lag, notif_block); in ice_lag_event_handler()
1777 if (!lag->netdev) in ice_lag_event_handler()
1789 lag_work->lag = lag; in ice_lag_event_handler()
1839 * ice_register_lag_handler - register LAG handler on netdev
1840 * @lag: LAG struct
1842 static int ice_register_lag_handler(struct ice_lag *lag) in ice_register_lag_handler() argument
1844 struct device *dev = ice_pf_to_dev(lag->pf); in ice_register_lag_handler()
1847 notif_blk = &lag->notif_block; in ice_register_lag_handler()
1853 dev_err(dev, "FAIL register LAG event handler!\n"); in ice_register_lag_handler()
1856 dev_dbg(dev, "LAG event handler registered\n"); in ice_register_lag_handler()
1862 * ice_unregister_lag_handler - unregister LAG handler on netdev
1863 * @lag: LAG struct
1865 static void ice_unregister_lag_handler(struct ice_lag *lag) in ice_unregister_lag_handler() argument
1867 struct device *dev = ice_pf_to_dev(lag->pf); in ice_unregister_lag_handler()
1870 notif_blk = &lag->notif_block; in ice_unregister_lag_handler()
1873 dev_dbg(dev, "LAG event handler unregistered\n"); in ice_unregister_lag_handler()
1918 * @lag: primary interfaces lag struct
1924 ice_lag_move_vf_nodes_tc_sync(struct ice_lag *lag, struct ice_hw *dest_hw, in ice_lag_move_vf_nodes_tc_sync() argument
1928 struct device *dev = ice_pf_to_dev(lag->pf); in ice_lag_move_vf_nodes_tc_sync()
1938 hw = &lag->pf->hw; in ice_lag_move_vf_nodes_tc_sync()
1941 dev_warn(dev, "LAG rebuild failed after reset due to VSI Context failure\n"); in ice_lag_move_vf_nodes_tc_sync()
1970 dev_warn(dev, "Failure to reconfig queues for LAG reset rebuild\n"); in ice_lag_move_vf_nodes_tc_sync()
1976 dev_warn(dev, "Failure to configure queues for LAG reset rebuild\n"); in ice_lag_move_vf_nodes_tc_sync()
1995 if (ice_aq_move_sched_elems(&lag->pf->hw, buf, buf_size, &num_moved)) in ice_lag_move_vf_nodes_tc_sync()
1996 dev_warn(dev, "Failure to move VF nodes for LAG reset rebuild\n"); in ice_lag_move_vf_nodes_tc_sync()
2007 dev_warn(dev, "Problem restarting traffic for LAG node reset rebuild\n"); in ice_lag_move_vf_nodes_tc_sync()
2012 * @lag: primary interfaces lag struct
2020 ice_lag_move_vf_nodes_sync(struct ice_lag *lag, struct ice_hw *dest_hw) in ice_lag_move_vf_nodes_sync() argument
2025 if (!lag->primary || !dest_hw) in ice_lag_move_vf_nodes_sync()
2028 pf = lag->pf; in ice_lag_move_vf_nodes_sync()
2032 ice_lag_move_vf_nodes_tc_sync(lag, dest_hw, i, in ice_lag_move_vf_nodes_sync()
2037 * ice_init_lag - initialize support for LAG
2040 * Alloc memory for LAG structs and initialize the elements.
2046 struct ice_lag *lag; in ice_init_lag() local
2055 pf->lag = kzalloc(sizeof(*lag), GFP_KERNEL); in ice_init_lag()
2056 if (!pf->lag) in ice_init_lag()
2058 lag = pf->lag; in ice_init_lag()
2067 lag->pf = pf; in ice_init_lag()
2068 lag->netdev = vsi->netdev; in ice_init_lag()
2069 lag->role = ICE_LAG_NONE; in ice_init_lag()
2070 lag->active_port = ICE_LAG_INVALID_PORT; in ice_init_lag()
2071 lag->bonded = false; in ice_init_lag()
2072 lag->upper_netdev = NULL; in ice_init_lag()
2073 lag->notif_block.notifier_call = NULL; in ice_init_lag()
2075 err = ice_register_lag_handler(lag); in ice_init_lag()
2077 dev_warn(dev, "INIT LAG: Failed to register event handler\n"); in ice_init_lag()
2081 err = ice_create_lag_recipe(&pf->hw, &lag->pf_recipe, in ice_init_lag()
2086 err = ice_create_lag_recipe(&pf->hw, &lag->lport_recipe, in ice_init_lag()
2099 recipe_bits |= BIT(lag->pf_recipe) | in ice_init_lag()
2100 BIT(lag->lport_recipe); in ice_init_lag()
2106 ice_display_lag_info(lag); in ice_init_lag()
2108 dev_dbg(dev, "INIT LAG complete\n"); in ice_init_lag()
2113 &pf->lag->pf_recipe); in ice_init_lag()
2115 kfree(lag); in ice_init_lag()
2116 pf->lag = NULL; in ice_init_lag()
2121 * ice_deinit_lag - Clean up LAG
2124 * Clean up kernel LAG info and free memory
2129 struct ice_lag *lag; in ice_deinit_lag() local
2131 lag = pf->lag; in ice_deinit_lag()
2133 if (!lag) in ice_deinit_lag()
2136 if (lag->pf) in ice_deinit_lag()
2137 ice_unregister_lag_handler(lag); in ice_deinit_lag()
2142 &pf->lag->pf_recipe); in ice_deinit_lag()
2144 &pf->lag->lport_recipe); in ice_deinit_lag()
2146 kfree(lag); in ice_deinit_lag()
2148 pf->lag = NULL; in ice_deinit_lag()
2152 * ice_lag_rebuild - rebuild lag resources after reset
2157 * this will happen outside the normal event processing, need to acquire the lag
2166 struct ice_lag *lag, *prim_lag; in ice_lag_rebuild() local
2169 if (!pf->lag || !pf->lag->bonded) in ice_lag_rebuild()
2174 lag = pf->lag; in ice_lag_rebuild()
2175 if (lag->primary) { in ice_lag_rebuild()
2176 prim_lag = lag; in ice_lag_rebuild()
2178 ice_lag_build_netdev_list(lag, &ndlist); in ice_lag_rebuild()
2179 prim_lag = ice_lag_find_primary(lag); in ice_lag_rebuild()
2188 loc_port = lag->pf->hw.port_info->lport; in ice_lag_rebuild()
2191 if (lag->primary) { in ice_lag_rebuild()
2192 ice_lag_primary_swid(lag, true); in ice_lag_rebuild()
2194 ice_lag_set_swid(prim_lag->pf->hw.port_info->sw_id, lag, true); in ice_lag_rebuild()
2200 ice_lag_cfg_cp_fltr(lag, true); in ice_lag_rebuild()
2202 if (lag->pf_rx_rule_id) in ice_lag_rebuild()
2203 if (ice_lag_cfg_dflt_fltr(lag, true)) in ice_lag_rebuild()
2208 ice_lag_destroy_netdev_list(lag, &ndlist); in ice_lag_rebuild()
2216 * Check if switchdev is running on any of the interfaces connected to lag.
2220 struct ice_lag *lag = pf->lag; in ice_lag_is_switchdev_running() local
2223 if (!ice_is_feature_supported(pf, ICE_F_SRIOV_LAG) || !lag) in ice_lag_is_switchdev_running()
2227 for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) { in ice_lag_is_switchdev_running()