Lines Matching +full:interface +full:- +full:node

1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (C) 2018-2021, Intel Corporation. */
29 * ice_lag_set_primary - set PF LAG state as Primary
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
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()
69 * netif_is_same_ice - determine if netdev is on the same ice NIC as local PF
86 vsi = np->vsi; in netif_is_same_ice()
90 test_pf = vsi->back; in netif_is_same_ice()
94 if (pf->pdev->bus != test_pf->pdev->bus || in netif_is_same_ice()
95 pf->pdev->slot != test_pf->pdev->slot) in netif_is_same_ice()
102 * ice_netdev_to_lag - return pointer to associated lag struct from netdev
117 vsi = np->vsi; in ice_netdev_to_lag()
121 return vsi->back->lag; in ice_netdev_to_lag()
125 * ice_lag_find_hw_by_lport - return an hw struct from bond members lport
137 list_for_each_entry(entry, lag->netdev_head, node) { in ice_lag_find_hw_by_lport()
138 tmp_netdev = entry->netdev; in ice_lag_find_hw_by_lport()
143 if (!np || !np->vsi) in ice_lag_find_hw_by_lport()
146 hw = &np->vsi->back->hw; in ice_lag_find_hw_by_lport()
147 if (hw->port_info->lport == lport) in ice_lag_find_hw_by_lport()
155 * ice_pkg_has_lport_extract - check if lport extraction supported
162 for (i = 0; i < hw->blk[ICE_BLK_SW].es.count; i++) { in ice_pkg_has_lport_extract()
176 * ice_lag_find_primary - returns pointer to primary interfaces lag struct
184 list_for_each(tmp, lag->netdev_head) { in ice_lag_find_primary()
188 entry = list_entry(tmp, struct ice_lag_netdev_list, node); in ice_lag_find_primary()
189 tmp_lag = ice_netdev_to_lag(entry->netdev); in ice_lag_find_primary()
190 if (tmp_lag && tmp_lag->primary) { in ice_lag_find_primary()
200 * ice_lag_cfg_fltr - Add/Remove rule for LAG
201 * @lag: lag struct for local interface
218 hw = &lag->pf->hw; in ice_lag_cfg_fltr()
224 dev_err(ice_pf_to_dev(lag->pf), "error allocating rule for LAG\n"); in ice_lag_cfg_fltr()
225 return -ENOMEM; in ice_lag_cfg_fltr()
229 eth_hdr = s_rule->hdr_data; in ice_lag_cfg_fltr()
234 s_rule->hdr.type = cpu_to_le16(ICE_AQC_SW_RULES_T_LKUP_RX); in ice_lag_cfg_fltr()
235 s_rule->recipe_id = cpu_to_le16(recipe_id); in ice_lag_cfg_fltr()
236 s_rule->src = cpu_to_le16(hw->port_info->lport); in ice_lag_cfg_fltr()
237 s_rule->act = cpu_to_le32(act); in ice_lag_cfg_fltr()
238 s_rule->hdr_len = cpu_to_le16(DUMMY_ETH_HDR_LEN); in ice_lag_cfg_fltr()
241 s_rule->index = cpu_to_le16(*rule_idx); in ice_lag_cfg_fltr()
245 err = ice_aq_sw_rules(&lag->pf->hw, s_rule, s_rule_sz, 1, opc, NULL); in ice_lag_cfg_fltr()
250 *rule_idx = le16_to_cpu(s_rule->index); in ice_lag_cfg_fltr()
260 * ice_lag_cfg_dflt_fltr - Add/Remove default VSI rule for LAG
261 * @lag: lag struct for local interface
270 return ice_lag_cfg_fltr(lag, act, lag->pf_recipe, in ice_lag_cfg_dflt_fltr()
271 &lag->pf_rule_id, add); in ice_lag_cfg_dflt_fltr()
275 * ice_lag_cfg_drop_fltr - Add/Remove lport drop rule
276 * @lag: lag struct for local interface
286 return ice_lag_cfg_fltr(lag, act, lag->lport_recipe, in ice_lag_cfg_drop_fltr()
287 &lag->lport_rule_idx, add); in ice_lag_cfg_drop_fltr()
291 * ice_lag_cfg_pf_fltrs - set filters up for new active port
305 if (event_netdev != lag->netdev) in ice_lag_cfg_pf_fltrs()
309 bonding_info = &info->bonding_info; in ice_lag_cfg_pf_fltrs()
310 dev = ice_pf_to_dev(lag->pf); in ice_lag_cfg_pf_fltrs()
312 /* interface not active - remove old default VSI rule */ in ice_lag_cfg_pf_fltrs()
313 if (bonding_info->slave.state && lag->pf_rule_id) { in ice_lag_cfg_pf_fltrs()
321 /* interface becoming active - add new default VSI rule */ in ice_lag_cfg_pf_fltrs()
322 if (!bonding_info->slave.state && !lag->pf_rule_id) { in ice_lag_cfg_pf_fltrs()
325 if (lag->lport_rule_idx && ice_lag_cfg_drop_fltr(lag, false)) in ice_lag_cfg_pf_fltrs()
331 * ice_display_lag_info - print LAG info
337 struct device *dev = &lag->pf->pdev->dev; in ice_display_lag_info()
339 name = lag->netdev ? netdev_name(lag->netdev) : "unset"; in ice_display_lag_info()
340 upper = lag->upper_netdev ? netdev_name(lag->upper_netdev) : "unset"; in ice_display_lag_info()
341 primary = lag->primary ? "TRUE" : "FALSE"; in ice_display_lag_info()
342 bonded = lag->bonded ? "BONDED" : "UNBONDED"; in ice_display_lag_info()
344 switch (lag->role) { in ice_display_lag_info()
366 * ice_lag_qbuf_recfg - generate a buffer of queues for a reconfigure command
384 pf = hw->back; in ice_lag_qbuf_recfg()
392 if (q_ctx->q_teid == ICE_INVAL_TEID) { in ice_lag_qbuf_recfg()
397 if (q_ctx->q_handle == ICE_INVAL_Q_HANDLE) { in ice_lag_qbuf_recfg()
403 qid = pf->vsi[vsi_num]->txq_map[q_ctx->q_handle]; in ice_lag_qbuf_recfg()
404 qbuf->queue_info[count].q_handle = cpu_to_le16(qid); in ice_lag_qbuf_recfg()
405 qbuf->queue_info[count].tc = tc; in ice_lag_qbuf_recfg()
406 qbuf->queue_info[count].q_teid = cpu_to_le32(q_ctx->q_teid); in ice_lag_qbuf_recfg()
414 * ice_lag_get_sched_parent - locate or create a sched node parent
416 * @tc: traffic class on parent/node
423 struct ice_port_info *pi = hw->port_info; in ice_lag_get_sched_parent()
432 dev_warn(dev, "Failure to find TC node for LAG move\n"); in ice_lag_get_sched_parent()
438 dev_warn(dev, "Failure to find aggregate node for LAG move\n"); in ice_lag_get_sched_parent()
448 for (n = 0; n < aggnode->num_children; n++) { in ice_lag_get_sched_parent()
449 parent = ice_sched_get_free_vsi_parent(hw, aggnode->children[n], in ice_lag_get_sched_parent()
455 /* if free parent not found - add one */ in ice_lag_get_sched_parent()
472 parent = parent->children[0]; in ice_lag_get_sched_parent()
483 * ice_lag_move_vf_node_tc - move scheduling nodes for one VF on one TC
495 struct device *dev = ice_pf_to_dev(lag->pf); in ice_lag_move_vf_node_tc()
505 ctx = ice_get_vsi_ctx(&lag->pf->hw, vsi_num); in ice_lag_move_vf_node_tc()
512 if (!ctx->sched.vsi_node[tc]) in ice_lag_move_vf_node_tc()
518 dev_warn(dev, "Unable to locate HW struct for LAG node destination\n"); in ice_lag_move_vf_node_tc()
522 numq = ctx->num_lan_q_entries[tc]; in ice_lag_move_vf_node_tc()
523 teid = ctx->sched.vsi_node[tc]->info.node_teid; in ice_lag_move_vf_node_tc()
525 parent_teid = ctx->sched.vsi_node[tc]->info.parent_teid; in ice_lag_move_vf_node_tc()
533 if (ice_sched_suspend_resume_elems(&lag->pf->hw, 1, &tmp_teid, true)) in ice_lag_move_vf_node_tc()
534 dev_dbg(dev, "Problem suspending traffic for LAG node move\n"); in ice_lag_move_vf_node_tc()
547 valq = ice_lag_qbuf_recfg(&lag->pf->hw, qbuf, vsi_num, numq, tc); in ice_lag_move_vf_node_tc()
553 if (ice_aq_cfg_lan_txq(&lag->pf->hw, qbuf, qbuf_size, valq, oldport, in ice_lag_move_vf_node_tc()
562 /* find new parent in destination port's tree for VF VSI node on this in ice_lag_move_vf_node_tc()
569 /* Move Vf's VSI node for this TC to newport's scheduler tree */ in ice_lag_move_vf_node_tc()
570 buf->hdr.src_parent_teid = parent_teid; in ice_lag_move_vf_node_tc()
571 buf->hdr.dest_parent_teid = n_prt->info.node_teid; in ice_lag_move_vf_node_tc()
572 buf->hdr.num_elems = cpu_to_le16(1); in ice_lag_move_vf_node_tc()
573 buf->hdr.mode = ICE_AQC_MOVE_ELEM_MODE_KEEP_OWN; in ice_lag_move_vf_node_tc()
574 buf->teid[0] = teid; in ice_lag_move_vf_node_tc()
576 if (ice_aq_move_sched_elems(&lag->pf->hw, buf, buf_size, &num_moved)) in ice_lag_move_vf_node_tc()
579 ice_sched_update_parent(n_prt, ctx->sched.vsi_node[tc]); in ice_lag_move_vf_node_tc()
587 /* restart traffic for VSI node */ in ice_lag_move_vf_node_tc()
588 if (ice_sched_suspend_resume_elems(&lag->pf->hw, 1, &tmp_teid, false)) in ice_lag_move_vf_node_tc()
589 dev_dbg(dev, "Problem restarting traffic for LAG node move\n"); in ice_lag_move_vf_node_tc()
593 * ice_lag_build_netdev_list - populate the lag struct's netdev list
603 INIT_LIST_HEAD(&ndlist->node); in ice_lag_build_netdev_list()
605 for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) { in ice_lag_build_netdev_list()
610 nl->netdev = tmp_nd; in ice_lag_build_netdev_list()
611 list_add(&nl->node, &ndlist->node); in ice_lag_build_netdev_list()
614 lag->netdev_head = &ndlist->node; in ice_lag_build_netdev_list()
618 * ice_lag_destroy_netdev_list - free lag struct's netdev list
628 list_for_each_entry_safe(entry, n, &ndlist->node, node) { in ice_lag_destroy_netdev_list()
629 list_del(&entry->node); in ice_lag_destroy_netdev_list()
633 lag->netdev_head = NULL; in ice_lag_destroy_netdev_list()
637 * ice_lag_move_single_vf_nodes - Move Tx scheduling nodes for single VF
638 * @lag: primary interface LAG struct
639 * @oldport: lport of previous interface
640 * @newport: lport of destination interface
654 * ice_lag_move_new_vf_nodes - Move Tx scheduling nodes for a VF if required
674 if (WARN_ON(vsi->type != ICE_VSI_VF)) in ice_lag_move_new_vf_nodes()
677 pf = vf->pf; in ice_lag_move_new_vf_nodes()
678 lag = pf->lag; in ice_lag_move_new_vf_nodes()
680 mutex_lock(&pf->lag_mutex); in ice_lag_move_new_vf_nodes()
681 if (!lag->bonded) in ice_lag_move_new_vf_nodes()
684 pri_port = pf->hw.port_info->lport; in ice_lag_move_new_vf_nodes()
685 act_port = lag->active_port; in ice_lag_move_new_vf_nodes()
687 if (lag->upper_netdev) in ice_lag_move_new_vf_nodes()
691 lag->bonded && lag->primary && pri_port != act_port && in ice_lag_move_new_vf_nodes()
692 !list_empty(lag->netdev_head)) in ice_lag_move_new_vf_nodes()
693 ice_lag_move_single_vf_nodes(lag, pri_port, act_port, vsi->idx); in ice_lag_move_new_vf_nodes()
698 mutex_unlock(&pf->lag_mutex); in ice_lag_move_new_vf_nodes()
702 * ice_lag_move_vf_nodes - move Tx scheduling nodes for all VFs to new port
704 * @oldport: lport of previous interface
705 * @newport: lport of destination interface
712 if (!lag->primary) in ice_lag_move_vf_nodes()
715 pf = lag->pf; in ice_lag_move_vf_nodes()
717 if (pf->vsi[i] && (pf->vsi[i]->type == ICE_VSI_VF || in ice_lag_move_vf_nodes()
718 pf->vsi[i]->type == ICE_VSI_SWITCHDEV_CTRL)) in ice_lag_move_vf_nodes()
723 * ice_lag_move_vf_nodes_cfg - move vf nodes outside LAG netdev event context
728 * This function is used to move nodes during an out-of-netdev-event situation,
732 * processing while out-of-sync moves are happening. Also, paired moves,
749 * ice_lag_cfg_cp_fltr - configure filter for control packets
750 * @lag: local interface's lag struct
760 vsi = lag->pf->vsi[0]; in ice_lag_cfg_cp_fltr()
766 netdev_warn(lag->netdev, "-ENOMEM error configuring CP filter\n"); in ice_lag_cfg_cp_fltr()
771 s_rule->hdr.type = cpu_to_le16(ICE_AQC_SW_RULES_T_LKUP_RX); in ice_lag_cfg_cp_fltr()
772 s_rule->recipe_id = cpu_to_le16(ICE_LAG_SRIOV_CP_RECIPE); in ice_lag_cfg_cp_fltr()
773 s_rule->src = cpu_to_le16(vsi->port_info->lport); in ice_lag_cfg_cp_fltr()
774 s_rule->act = cpu_to_le32(ICE_FWD_TO_VSI | in ice_lag_cfg_cp_fltr()
777 FIELD_PREP(ICE_SINGLE_ACT_VSI_ID_M, vsi->vsi_num)); in ice_lag_cfg_cp_fltr()
778 s_rule->hdr_len = cpu_to_le16(ICE_LAG_SRIOV_TRAIN_PKT_LEN); in ice_lag_cfg_cp_fltr()
779 memcpy(s_rule->hdr_data, lacp_train_pkt, LACP_TRAIN_PKT_LEN); in ice_lag_cfg_cp_fltr()
783 s_rule->index = cpu_to_le16(lag->cp_rule_idx); in ice_lag_cfg_cp_fltr()
785 if (ice_aq_sw_rules(&lag->pf->hw, s_rule, buf_len, 1, opc, NULL)) { in ice_lag_cfg_cp_fltr()
786 netdev_warn(lag->netdev, "Error %s CP rule for fail-over\n", in ice_lag_cfg_cp_fltr()
792 lag->cp_rule_idx = le16_to_cpu(s_rule->index); in ice_lag_cfg_cp_fltr()
794 lag->cp_rule_idx = 0; in ice_lag_cfg_cp_fltr()
801 * ice_lag_info_event - handle NETDEV_BONDING_INFO event
816 lag_netdev_name = netdev_name(lag->netdev); in ice_lag_info_event()
817 bonding_info = &info->bonding_info; in ice_lag_info_event()
819 if (event_netdev != lag->netdev || !lag->bonded || !lag->upper_netdev) in ice_lag_info_event()
822 if (bonding_info->master.bond_mode != BOND_MODE_ACTIVEBACKUP) { in ice_lag_info_event()
823 netdev_dbg(lag->netdev, "Bonding event recv, but mode not active/backup\n"); in ice_lag_info_event()
827 if (strcmp(bonding_info->slave.slave_name, lag_netdev_name)) { in ice_lag_info_event()
828 netdev_dbg(lag->netdev, "Bonding event recv, but secondary info not for us\n"); in ice_lag_info_event()
832 if (bonding_info->slave.state) in ice_lag_info_event()
842 * ice_lag_reclaim_vf_tc - move scheduling nodes back to primary interface
843 * @lag: primary interface lag struct
844 * @src_hw: HW struct current node location
853 struct device *dev = ice_pf_to_dev(lag->pf); in ice_lag_reclaim_vf_tc()
863 hw = &lag->pf->hw; in ice_lag_reclaim_vf_tc()
871 if (!ctx->sched.vsi_node[tc]) in ice_lag_reclaim_vf_tc()
874 numq = ctx->num_lan_q_entries[tc]; in ice_lag_reclaim_vf_tc()
875 teid = ctx->sched.vsi_node[tc]->info.node_teid; in ice_lag_reclaim_vf_tc()
877 parent_teid = ctx->sched.vsi_node[tc]->info.parent_teid; in ice_lag_reclaim_vf_tc()
885 dev_dbg(dev, "Problem suspending traffic for LAG node move\n"); in ice_lag_reclaim_vf_tc()
903 src_hw->port_info->lport, hw->port_info->lport, in ice_lag_reclaim_vf_tc()
917 /* Move node to new parent */ in ice_lag_reclaim_vf_tc()
918 buf->hdr.src_parent_teid = parent_teid; in ice_lag_reclaim_vf_tc()
919 buf->hdr.dest_parent_teid = n_prt->info.node_teid; in ice_lag_reclaim_vf_tc()
920 buf->hdr.num_elems = cpu_to_le16(1); in ice_lag_reclaim_vf_tc()
921 buf->hdr.mode = ICE_AQC_MOVE_ELEM_MODE_KEEP_OWN; in ice_lag_reclaim_vf_tc()
922 buf->teid[0] = teid; in ice_lag_reclaim_vf_tc()
924 if (ice_aq_move_sched_elems(&lag->pf->hw, buf, buf_size, &num_moved)) in ice_lag_reclaim_vf_tc()
927 ice_sched_update_parent(n_prt, ctx->sched.vsi_node[tc]); in ice_lag_reclaim_vf_tc()
937 dev_warn(dev, "Problem restarting traffic for LAG node reclaim\n"); in ice_lag_reclaim_vf_tc()
941 * ice_lag_reclaim_vf_nodes - When interface leaving bond primary reclaims nodes
942 * @lag: primary interface lag struct
943 * @src_hw: HW struct for current node location
951 if (!lag->primary || !src_hw) in ice_lag_reclaim_vf_nodes()
954 pf = lag->pf; in ice_lag_reclaim_vf_nodes()
956 if (pf->vsi[i] && (pf->vsi[i]->type == ICE_VSI_VF || in ice_lag_reclaim_vf_nodes()
957 pf->vsi[i]->type == ICE_VSI_SWITCHDEV_CTRL)) in ice_lag_reclaim_vf_nodes()
963 * ice_lag_link - handle LAG link event
968 struct ice_pf *pf = lag->pf; in ice_lag_link()
970 if (lag->bonded) in ice_lag_link()
972 netdev_name(lag->netdev)); in ice_lag_link()
974 lag->bonded = true; in ice_lag_link()
975 lag->role = ICE_LAG_UNSET; in ice_lag_link()
976 netdev_info(lag->netdev, "Shared SR-IOV resources in bond are active\n"); in ice_lag_link()
980 * ice_lag_unlink - handle unlink event
986 struct ice_pf *pf = lag->pf; in ice_lag_unlink()
988 if (!lag->bonded) { in ice_lag_unlink()
989 netdev_dbg(lag->netdev, "bonding unlink event on non-LAG netdev\n"); in ice_lag_unlink()
993 if (lag->primary) { in ice_lag_unlink()
994 act_port = lag->active_port; in ice_lag_unlink()
995 pri_port = lag->pf->hw.port_info->lport; in ice_lag_unlink()
998 lag->primary = false; in ice_lag_unlink()
999 lag->active_port = ICE_LAG_INVALID_PORT; in ice_lag_unlink()
1005 act_port = primary_lag->active_port; in ice_lag_unlink()
1006 pri_port = primary_lag->pf->hw.port_info->lport; in ice_lag_unlink()
1007 loc_port = pf->hw.port_info->lport; in ice_lag_unlink()
1011 &lag->pf->hw); in ice_lag_unlink()
1012 primary_lag->active_port = ICE_LAG_INVALID_PORT; in ice_lag_unlink()
1017 lag->bonded = false; in ice_lag_unlink()
1018 lag->role = ICE_LAG_NONE; in ice_lag_unlink()
1019 lag->upper_netdev = NULL; in ice_lag_unlink()
1023 * ice_lag_link_unlink - helper function to call lag_link/unlink
1032 if (netdev != lag->netdev) in ice_lag_link_unlink()
1035 if (info->linking) in ice_lag_link_unlink()
1042 * ice_lag_set_swid - set the SWID on secondary interface
1043 * @primary_swid: primary interface's SWID
1063 dev_err(ice_pf_to_dev(local_lag->pf), "-ENOMEM error setting SWID\n"); in ice_lag_set_swid()
1067 buf->num_elems = cpu_to_le16(1); in ice_lag_set_swid()
1068 buf->res_type = cpu_to_le16(ICE_AQC_RES_TYPE_SWID); in ice_lag_set_swid()
1070 if (!link && local_lag->bond_swid) { in ice_lag_set_swid()
1071 buf->elem[0].e.sw_resp = cpu_to_le16(local_lag->bond_swid); in ice_lag_set_swid()
1072 status = ice_aq_alloc_free_res(&local_lag->pf->hw, buf, in ice_lag_set_swid()
1075 dev_err(ice_pf_to_dev(local_lag->pf), "Error freeing SWID during LAG unlink\n"); in ice_lag_set_swid()
1076 local_lag->bond_swid = 0; in ice_lag_set_swid()
1080 buf->res_type |= cpu_to_le16(ICE_LAG_RES_SHARED | in ice_lag_set_swid()
1083 local_lag->bond_swid = primary_swid; in ice_lag_set_swid()
1084 buf->elem[0].e.sw_resp = cpu_to_le16(local_lag->bond_swid); in ice_lag_set_swid()
1086 buf->elem[0].e.sw_resp = in ice_lag_set_swid()
1087 cpu_to_le16(local_lag->pf->hw.port_info->sw_id); in ice_lag_set_swid()
1090 status = ice_aq_alloc_free_res(&local_lag->pf->hw, buf, buf_len, in ice_lag_set_swid()
1093 dev_err(ice_pf_to_dev(local_lag->pf), "Error subscribing to SWID 0x%04X\n", in ice_lag_set_swid()
1094 local_lag->bond_swid); in ice_lag_set_swid()
1102 swid = local_lag->pf->hw.port_info->sw_id; in ice_lag_set_swid()
1107 cmd->swid = cpu_to_le16(ICE_AQC_PORT_SWID_VALID | swid); in ice_lag_set_swid()
1109 * primary interface has not finished setting its SWID to SHARED in ice_lag_set_swid()
1114 status = ice_aq_send_cmd(&local_lag->pf->hw, &desc, NULL, 0, in ice_lag_set_swid()
1123 dev_err(ice_pf_to_dev(local_lag->pf), "Error setting SWID in port params %d\n", in ice_lag_set_swid()
1128 * ice_lag_primary_swid - set/clear the SHARED attrib of primary's SWID
1129 * @lag: primary interface's lag struct
1139 hw = &lag->pf->hw; in ice_lag_primary_swid()
1140 swid = hw->port_info->sw_id; in ice_lag_primary_swid()
1143 dev_warn(ice_pf_to_dev(lag->pf), "Failure to set primary interface shared status\n"); in ice_lag_primary_swid()
1147 * ice_lag_add_prune_list - Adds event_pf's VSI to primary's prune list
1159 dev = ice_pf_to_dev(lag->pf); in ice_lag_add_prune_list()
1160 event_vsi_num = event_pf->vsi[0]->vsi_num; in ice_lag_add_prune_list()
1161 prim_vsi_idx = lag->pf->vsi[0]->idx; in ice_lag_add_prune_list()
1163 if (!ice_find_vsi_list_entry(&lag->pf->hw, ICE_SW_LKUP_VLAN, in ice_lag_add_prune_list()
1176 s_rule->hdr.type = cpu_to_le16(ICE_AQC_SW_RULES_T_PRUNE_LIST_SET); in ice_lag_add_prune_list()
1177 s_rule->index = cpu_to_le16(vsi_list_id); in ice_lag_add_prune_list()
1178 s_rule->number_vsi = cpu_to_le16(num_vsi); in ice_lag_add_prune_list()
1179 s_rule->vsi[0] = cpu_to_le16(event_vsi_num); in ice_lag_add_prune_list()
1181 if (ice_aq_sw_rules(&event_pf->hw, s_rule, rule_buf_sz, 1, in ice_lag_add_prune_list()
1188 * ice_lag_del_prune_list - Remove secondary's vsi from primary's prune list
1189 * @lag: primary interface's ice_lag struct
1190 * @event_pf: PF struct for unlinking interface
1200 dev = ice_pf_to_dev(lag->pf); in ice_lag_del_prune_list()
1201 vsi_num = event_pf->vsi[0]->vsi_num; in ice_lag_del_prune_list()
1202 vsi_idx = lag->pf->vsi[0]->idx; in ice_lag_del_prune_list()
1204 if (!ice_find_vsi_list_entry(&lag->pf->hw, ICE_SW_LKUP_VLAN, in ice_lag_del_prune_list()
1217 s_rule->hdr.type = cpu_to_le16(ICE_AQC_SW_RULES_T_PRUNE_LIST_CLEAR); in ice_lag_del_prune_list()
1218 s_rule->index = cpu_to_le16(vsi_list_id); in ice_lag_del_prune_list()
1219 s_rule->number_vsi = cpu_to_le16(num_vsi); in ice_lag_del_prune_list()
1220 s_rule->vsi[0] = cpu_to_le16(vsi_num); in ice_lag_del_prune_list()
1222 if (ice_aq_sw_rules(&event_pf->hw, (struct ice_aqc_sw_rules *)s_rule, in ice_lag_del_prune_list()
1230 * ice_lag_init_feature_support_flag - Check for package and NVM support for LAG
1237 caps = &pf->hw.dev_caps.common_cap; in ice_lag_init_feature_support_flag()
1238 if (caps->roce_lag) in ice_lag_init_feature_support_flag()
1243 if (caps->sriov_lag && ice_pkg_has_lport_extract(&pf->hw)) in ice_lag_init_feature_support_flag()
1250 * ice_lag_changeupper_event - handle LAG changeupper event
1264 if (netdev != lag->netdev) in ice_lag_changeupper_event()
1268 if (info->linking) { in ice_lag_changeupper_event()
1269 lag->upper_netdev = info->upper_dev; in ice_lag_changeupper_event()
1270 /* If there is not already a primary interface in the LAG, in ice_lag_changeupper_event()
1274 lag->primary = true; in ice_lag_changeupper_event()
1281 swid = primary_lag->pf->hw.port_info->sw_id; in ice_lag_changeupper_event()
1283 ice_lag_add_prune_list(primary_lag, lag->pf); in ice_lag_changeupper_event()
1289 if (!primary_lag && lag->primary) in ice_lag_changeupper_event()
1292 if (!lag->primary) { in ice_lag_changeupper_event()
1295 if (primary_lag && lag->primary) { in ice_lag_changeupper_event()
1297 ice_lag_del_prune_list(primary_lag, lag->pf); in ice_lag_changeupper_event()
1306 * ice_lag_monitor_link - monitor interfaces entering/leaving the aggregate
1320 if (!lag->primary) in ice_lag_monitor_link()
1324 if (!netif_is_same_ice(lag->pf, event_netdev)) in ice_lag_monitor_link()
1327 pf = lag->pf; in ice_lag_monitor_link()
1328 prim_hw = &pf->hw; in ice_lag_monitor_link()
1329 prim_port = prim_hw->port_info->lport; in ice_lag_monitor_link()
1332 if (info->upper_dev != lag->upper_netdev) in ice_lag_monitor_link()
1335 if (!info->linking) { in ice_lag_monitor_link()
1338 * interface. in ice_lag_monitor_link()
1340 if (prim_port != lag->active_port && in ice_lag_monitor_link()
1341 lag->active_port != ICE_LAG_INVALID_PORT) { in ice_lag_monitor_link()
1343 lag->active_port); in ice_lag_monitor_link()
1345 lag->active_port = ICE_LAG_INVALID_PORT; in ice_lag_monitor_link()
1351 * ice_lag_monitor_active - main PF keep track of which port is active
1367 if (!lag->primary) in ice_lag_monitor_active()
1370 pf = lag->pf; in ice_lag_monitor_active()
1378 if (!netif_is_ice(event_netdev) || event_upper != lag->upper_netdev) in ice_lag_monitor_active()
1382 event_pf = event_np->vsi->back; in ice_lag_monitor_active()
1383 event_port = event_pf->hw.port_info->lport; in ice_lag_monitor_active()
1384 prim_port = pf->hw.port_info->lport; in ice_lag_monitor_active()
1387 bonding_info = &info->bonding_info; in ice_lag_monitor_active()
1389 if (!bonding_info->slave.state) { in ice_lag_monitor_active()
1393 if (lag->active_port == ICE_LAG_INVALID_PORT) { in ice_lag_monitor_active()
1397 lag->active_port = event_port; in ice_lag_monitor_active()
1402 if (lag->active_port == event_port) in ice_lag_monitor_active()
1405 ice_lag_move_vf_nodes(lag, lag->active_port, event_port); in ice_lag_monitor_active()
1406 lag->active_port = event_port; in ice_lag_monitor_active()
1411 if (lag->active_port != event_port) in ice_lag_monitor_active()
1414 * Link down on the bond - set active port to invalid and move in ice_lag_monitor_active()
1419 lag->active_port = ICE_LAG_INVALID_PORT; in ice_lag_monitor_active()
1424 * ice_lag_chk_comp - evaluate bonded interface for feature support
1438 if (!lag->primary) in ice_lag_chk_comp()
1445 if (event_upper != lag->upper_netdev) in ice_lag_chk_comp()
1448 dev = ice_pf_to_dev(lag->pf); in ice_lag_chk_comp()
1451 * primary interface has to be in switchdev mode in ice_lag_chk_comp()
1453 if (!ice_is_switchdev_running(lag->pf)) { in ice_lag_chk_comp()
1454 dev_info(dev, "Primary interface not in switchdev mode - VF LAG disabled\n"); in ice_lag_chk_comp()
1459 bonding_info = &info->bonding_info; in ice_lag_chk_comp()
1460 lag->bond_mode = bonding_info->master.bond_mode; in ice_lag_chk_comp()
1461 if (lag->bond_mode != BOND_MODE_ACTIVEBACKUP) { in ice_lag_chk_comp()
1462 dev_info(dev, "Bond Mode not ACTIVE-BACKUP - VF LAG disabled\n"); in ice_lag_chk_comp()
1466 list_for_each(tmp, lag->netdev_head) { in ice_lag_chk_comp()
1474 entry = list_entry(tmp, struct ice_lag_netdev_list, node); in ice_lag_chk_comp()
1475 peer_netdev = entry->netdev; in ice_lag_chk_comp()
1477 dev_info(dev, "Found %s non-ice netdev in LAG - VF LAG disabled\n", in ice_lag_chk_comp()
1484 dev_info(dev, "Found more than two netdevs in LAG - VF LAG disabled\n"); in ice_lag_chk_comp()
1489 vsi = ice_get_main_vsi(lag->pf); in ice_lag_chk_comp()
1490 peer_vsi = peer_np->vsi; in ice_lag_chk_comp()
1491 if (lag->pf->pdev->bus != peer_vsi->back->pdev->bus || in ice_lag_chk_comp()
1492 lag->pf->pdev->slot != peer_vsi->back->pdev->slot) { in ice_lag_chk_comp()
1493 dev_info(dev, "Found %s on different device in LAG - VF LAG disabled\n", in ice_lag_chk_comp()
1498 dcb_cfg = &vsi->port_info->qos_cfg.local_dcbx_cfg; in ice_lag_chk_comp()
1499 peer_dcb_cfg = &peer_vsi->port_info->qos_cfg.local_dcbx_cfg; in ice_lag_chk_comp()
1502 dev_info(dev, "Found %s with different DCB in LAG - VF LAG disabled\n", in ice_lag_chk_comp()
1507 peer_pf = peer_vsi->back; in ice_lag_chk_comp()
1508 if (test_bit(ICE_FLAG_FW_LLDP_AGENT, peer_pf->flags)) { in ice_lag_chk_comp()
1509 dev_warn(dev, "Found %s with FW LLDP agent active - VF LAG disabled\n", in ice_lag_chk_comp()
1519 * ice_lag_unregister - handle netdev unregister events
1532 event_pf = np->vsi->back; in ice_lag_unregister()
1535 if (p_lag->active_port != p_lag->pf->hw.port_info->lport && in ice_lag_unregister()
1536 p_lag->active_port != ICE_LAG_INVALID_PORT) { in ice_lag_unregister()
1540 p_lag->active_port); in ice_lag_unregister()
1543 lag->active_port = ICE_LAG_INVALID_PORT; in ice_lag_unregister()
1548 if (lag->primary && lag->netdev == event_netdev) in ice_lag_unregister()
1552 if (lag->primary && lag->netdev != event_netdev) in ice_lag_unregister()
1556 if (!lag->primary && lag->netdev == event_netdev) in ice_lag_unregister()
1561 * ice_lag_monitor_rdma - set and clear rdma functionality
1574 if (netdev != lag->netdev) in ice_lag_monitor_rdma()
1577 if (info->linking) in ice_lag_monitor_rdma()
1578 ice_clear_rdma_cap(lag->pf); in ice_lag_monitor_rdma()
1580 ice_set_rdma_cap(lag->pf); in ice_lag_monitor_rdma()
1584 * ice_lag_chk_disabled_bond - monitor interfaces entering/leaving disabled bond
1588 * as interfaces enter a bond - determine if the bond is currently
1598 if (netdev != lag->netdev) in ice_lag_chk_disabled_bond()
1601 if (info->linking) { in ice_lag_chk_disabled_bond()
1604 !ice_is_feature_supported(prim_lag->pf, ICE_F_SRIOV_LAG)) { in ice_lag_chk_disabled_bond()
1605 ice_clear_feature_support(lag->pf, ICE_F_SRIOV_LAG); in ice_lag_chk_disabled_bond()
1606 netdev_info(netdev, "Interface added to non-compliant SRIOV LAG aggregate\n"); in ice_lag_chk_disabled_bond()
1609 ice_lag_init_feature_support_flag(lag->pf); in ice_lag_chk_disabled_bond()
1614 * ice_lag_disable_sriov_bond - set members of bond as not supporting SRIOV LAG
1622 np = netdev_priv(lag->netdev); in ice_lag_disable_sriov_bond()
1623 pf = np->vsi->back; in ice_lag_disable_sriov_bond()
1628 * ice_lag_process_event - process a task assigned to the lag_wq
1640 pf = lag_work->lag->pf; in ice_lag_process_event()
1642 mutex_lock(&pf->lag_mutex); in ice_lag_process_event()
1643 lag_work->lag->netdev_head = &lag_work->netdev_list.node; in ice_lag_process_event()
1645 switch (lag_work->event) { in ice_lag_process_event()
1647 info = &lag_work->info.changeupper_info; in ice_lag_process_event()
1648 ice_lag_chk_disabled_bond(lag_work->lag, info); in ice_lag_process_event()
1650 ice_lag_monitor_link(lag_work->lag, info); in ice_lag_process_event()
1651 ice_lag_changeupper_event(lag_work->lag, info); in ice_lag_process_event()
1652 ice_lag_link_unlink(lag_work->lag, info); in ice_lag_process_event()
1654 ice_lag_monitor_rdma(lag_work->lag, info); in ice_lag_process_event()
1658 if (!ice_lag_chk_comp(lag_work->lag, in ice_lag_process_event()
1659 &lag_work->info.bonding_info)) { in ice_lag_process_event()
1660 netdev = lag_work->info.bonding_info.info.dev; in ice_lag_process_event()
1661 ice_lag_disable_sriov_bond(lag_work->lag); in ice_lag_process_event()
1662 ice_lag_unregister(lag_work->lag, netdev); in ice_lag_process_event()
1665 ice_lag_monitor_active(lag_work->lag, in ice_lag_process_event()
1666 &lag_work->info.bonding_info); in ice_lag_process_event()
1667 ice_lag_cfg_pf_fltrs(lag_work->lag, in ice_lag_process_event()
1668 &lag_work->info.bonding_info); in ice_lag_process_event()
1670 ice_lag_info_event(lag_work->lag, &lag_work->info.bonding_info); in ice_lag_process_event()
1674 netdev = lag_work->info.bonding_info.info.dev; in ice_lag_process_event()
1675 if ((netdev == lag_work->lag->netdev || in ice_lag_process_event()
1676 lag_work->lag->primary) && lag_work->lag->bonded) in ice_lag_process_event()
1677 ice_lag_unregister(lag_work->lag, netdev); in ice_lag_process_event()
1686 list_for_each_safe(tmp, n, &lag_work->netdev_list.node) { in ice_lag_process_event()
1689 entry = list_entry(tmp, struct ice_lag_netdev_list, node); in ice_lag_process_event()
1690 list_del(&entry->node); in ice_lag_process_event()
1693 lag_work->lag->netdev_head = NULL; in ice_lag_process_event()
1695 mutex_unlock(&pf->lag_mutex); in ice_lag_process_event()
1701 * ice_lag_event_handler - handle LAG events from netdev
1722 if (!(netdev->priv_flags & IFF_BONDING)) in ice_lag_event_handler()
1726 if (!lag->netdev) in ice_lag_event_handler()
1735 return -ENOMEM; in ice_lag_event_handler()
1737 lag_work->event_netdev = netdev; in ice_lag_event_handler()
1738 lag_work->lag = lag; in ice_lag_event_handler()
1739 lag_work->event = event; in ice_lag_event_handler()
1744 upper_netdev = info->upper_dev; in ice_lag_event_handler()
1749 INIT_LIST_HEAD(&lag_work->netdev_list.node); in ice_lag_event_handler()
1760 nd_list->netdev = tmp_nd; in ice_lag_event_handler()
1761 list_add(&nd_list->node, &lag_work->netdev_list.node); in ice_lag_event_handler()
1768 lag_work->info.changeupper_info = in ice_lag_event_handler()
1772 lag_work->info.bonding_info = in ice_lag_event_handler()
1776 lag_work->info.notifier_info = in ice_lag_event_handler()
1781 INIT_WORK(&lag_work->lag_task, ice_lag_process_event); in ice_lag_event_handler()
1782 queue_work(ice_lag_wq, &lag_work->lag_task); in ice_lag_event_handler()
1788 * ice_register_lag_handler - register LAG handler on netdev
1793 struct device *dev = ice_pf_to_dev(lag->pf); in ice_register_lag_handler()
1796 notif_blk = &lag->notif_block; in ice_register_lag_handler()
1798 if (!notif_blk->notifier_call) { in ice_register_lag_handler()
1799 notif_blk->notifier_call = ice_lag_event_handler; in ice_register_lag_handler()
1801 notif_blk->notifier_call = NULL; in ice_register_lag_handler()
1803 return -EINVAL; in ice_register_lag_handler()
1811 * ice_unregister_lag_handler - unregister LAG handler on netdev
1816 struct device *dev = ice_pf_to_dev(lag->pf); in ice_unregister_lag_handler()
1819 notif_blk = &lag->notif_block; in ice_unregister_lag_handler()
1820 if (notif_blk->notifier_call) { in ice_unregister_lag_handler()
1847 return -ENOMEM; in ice_create_lag_recipe()
1850 new_rcp->content.act_ctrl_fwd_priority = prio; in ice_create_lag_recipe()
1851 new_rcp->content.rid = *rid | ICE_AQ_RECIPE_ID_IS_ROOT; in ice_create_lag_recipe()
1852 new_rcp->recipe_indx = *rid; in ice_create_lag_recipe()
1853 bitmap_zero((unsigned long *)new_rcp->recipe_bitmap, in ice_create_lag_recipe()
1855 set_bit(*rid, (unsigned long *)new_rcp->recipe_bitmap); in ice_create_lag_recipe()
1866 * ice_lag_move_vf_nodes_tc_sync - move a VF's nodes for a tc during reset
1868 * @dest_hw: HW struct for destination's interface
1877 struct device *dev = ice_pf_to_dev(lag->pf); in ice_lag_move_vf_nodes_tc_sync()
1887 hw = &lag->pf->hw; in ice_lag_move_vf_nodes_tc_sync()
1894 if (!ctx->sched.vsi_node[tc]) in ice_lag_move_vf_nodes_tc_sync()
1897 numq = ctx->num_lan_q_entries[tc]; in ice_lag_move_vf_nodes_tc_sync()
1898 teid = ctx->sched.vsi_node[tc]->info.node_teid; in ice_lag_move_vf_nodes_tc_sync()
1900 parent_teid = ctx->sched.vsi_node[tc]->info.parent_teid; in ice_lag_move_vf_nodes_tc_sync()
1923 if (ice_aq_cfg_lan_txq(hw, qbuf, qbuf_size, numq, hw->port_info->lport, in ice_lag_move_vf_nodes_tc_sync()
1924 dest_hw->port_info->lport, NULL)) { in ice_lag_move_vf_nodes_tc_sync()
1937 /* Move node to new parent */ in ice_lag_move_vf_nodes_tc_sync()
1938 buf->hdr.src_parent_teid = parent_teid; in ice_lag_move_vf_nodes_tc_sync()
1939 buf->hdr.dest_parent_teid = n_prt->info.node_teid; in ice_lag_move_vf_nodes_tc_sync()
1940 buf->hdr.num_elems = cpu_to_le16(1); in ice_lag_move_vf_nodes_tc_sync()
1941 buf->hdr.mode = ICE_AQC_MOVE_ELEM_MODE_KEEP_OWN; in ice_lag_move_vf_nodes_tc_sync()
1942 buf->teid[0] = teid; in ice_lag_move_vf_nodes_tc_sync()
1944 if (ice_aq_move_sched_elems(&lag->pf->hw, buf, buf_size, &num_moved)) in ice_lag_move_vf_nodes_tc_sync()
1947 ice_sched_update_parent(n_prt, ctx->sched.vsi_node[tc]); in ice_lag_move_vf_nodes_tc_sync()
1956 dev_warn(dev, "Problem restarting traffic for LAG node reset rebuild\n"); in ice_lag_move_vf_nodes_tc_sync()
1960 * ice_lag_move_vf_nodes_sync - move vf nodes to active interface
1965 * to move the VF nodes to the secondary interface when that interface
1966 * is the active interface during a reset rebuild
1974 if (!lag->primary || !dest_hw) in ice_lag_move_vf_nodes_sync()
1977 pf = lag->pf; in ice_lag_move_vf_nodes_sync()
1979 if (pf->vsi[i] && (pf->vsi[i]->type == ICE_VSI_VF || in ice_lag_move_vf_nodes_sync()
1980 pf->vsi[i]->type == ICE_VSI_SWITCHDEV_CTRL)) in ice_lag_move_vf_nodes_sync()
1987 * ice_init_lag - initialize support for LAG
2005 pf->lag = kzalloc(sizeof(*lag), GFP_KERNEL); in ice_init_lag()
2006 if (!pf->lag) in ice_init_lag()
2007 return -ENOMEM; in ice_init_lag()
2008 lag = pf->lag; in ice_init_lag()
2013 err = -EIO; in ice_init_lag()
2017 lag->pf = pf; in ice_init_lag()
2018 lag->netdev = vsi->netdev; in ice_init_lag()
2019 lag->role = ICE_LAG_NONE; in ice_init_lag()
2020 lag->active_port = ICE_LAG_INVALID_PORT; in ice_init_lag()
2021 lag->bonded = false; in ice_init_lag()
2022 lag->upper_netdev = NULL; in ice_init_lag()
2023 lag->notif_block.notifier_call = NULL; in ice_init_lag()
2031 err = ice_create_lag_recipe(&pf->hw, &lag->pf_recipe, in ice_init_lag()
2036 err = ice_create_lag_recipe(&pf->hw, &lag->lport_recipe, in ice_init_lag()
2043 err = ice_aq_get_recipe_to_profile(&pf->hw, n, in ice_init_lag()
2049 recipe_bits |= BIT(lag->pf_recipe) | in ice_init_lag()
2050 BIT(lag->lport_recipe); in ice_init_lag()
2051 ice_aq_map_recipe_to_profile(&pf->hw, n, in ice_init_lag()
2062 ice_free_hw_res(&pf->hw, ICE_AQC_RES_TYPE_RECIPE, 1, in ice_init_lag()
2063 &pf->lag->pf_recipe); in ice_init_lag()
2066 pf->lag = NULL; in ice_init_lag()
2071 * ice_deinit_lag - Clean up LAG
2081 lag = pf->lag; in ice_deinit_lag()
2086 if (lag->pf) in ice_deinit_lag()
2091 ice_free_hw_res(&pf->hw, ICE_AQC_RES_TYPE_RECIPE, 1, in ice_deinit_lag()
2092 &pf->lag->pf_recipe); in ice_deinit_lag()
2093 ice_free_hw_res(&pf->hw, ICE_AQC_RES_TYPE_RECIPE, 1, in ice_deinit_lag()
2094 &pf->lag->lport_recipe); in ice_deinit_lag()
2098 pf->lag = NULL; in ice_deinit_lag()
2102 * ice_lag_rebuild - rebuild lag resources after reset
2105 * PF resets are promoted to CORER resets when interface in an aggregate. This
2106 * means that we need to rebuild the PF resources for the interface. Since
2111 * interface.
2119 if (!pf->lag || !pf->lag->bonded) in ice_lag_rebuild()
2122 mutex_lock(&pf->lag_mutex); in ice_lag_rebuild()
2124 lag = pf->lag; in ice_lag_rebuild()
2125 if (lag->primary) { in ice_lag_rebuild()
2133 dev_dbg(ice_pf_to_dev(pf), "No primary interface in aggregate, can't rebuild\n"); in ice_lag_rebuild()
2137 act_port = prim_lag->active_port; in ice_lag_rebuild()
2138 loc_port = lag->pf->hw.port_info->lport; in ice_lag_rebuild()
2141 if (lag->primary) { in ice_lag_rebuild()
2144 ice_lag_set_swid(prim_lag->pf->hw.port_info->sw_id, lag, true); in ice_lag_rebuild()
2147 ice_lag_move_vf_nodes_sync(prim_lag, &pf->hw); in ice_lag_rebuild()
2152 if (lag->pf_rule_id) in ice_lag_rebuild()
2159 mutex_unlock(&pf->lag_mutex); in ice_lag_rebuild()
2170 struct ice_lag *lag = pf->lag; in ice_lag_is_switchdev_running()
2177 for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) { in ice_lag_is_switchdev_running()
2180 if (!netif_is_ice(tmp_nd) || !priv || !priv->vsi || in ice_lag_is_switchdev_running()
2181 !priv->vsi->back) in ice_lag_is_switchdev_running()
2184 if (ice_is_switchdev_running(priv->vsi->back)) { in ice_lag_is_switchdev_running()