1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (C) 2018-2021, Intel Corporation. */ 3 4 /* Link Aggregation code */ 5 6 #include "ice.h" 7 #include "ice_lib.h" 8 #include "ice_lag.h" 9 10 #define ICE_LAG_RES_SHARED BIT(14) 11 #define ICE_LAG_RES_VALID BIT(15) 12 13 #define ICE_TRAIN_PKT_LEN 16 14 static const u8 lacp_train_pkt[ICE_TRAIN_PKT_LEN] = { 0, 0, 0, 0, 0, 0, 15 0, 0, 0, 0, 0, 0, 16 0x88, 0x09, 0, 0 }; 17 static const u8 act_act_train_pkt[ICE_TRAIN_PKT_LEN] = { 0, 0, 0, 0, 0, 0, 18 0, 0, 0, 0, 0, 0, 19 0, 0, 0, 0 }; 20 21 #define ICE_RECIPE_LEN 64 22 #define ICE_LAG_SRIOV_CP_RECIPE 10 23 24 static const u8 ice_dflt_vsi_rcp[ICE_RECIPE_LEN] = { 25 0x05, 0, 0, 0, 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26 0x85, 0, 0x01, 0, 0, 0, 0xff, 0xff, 0x08, 0, 0, 0, 0, 0, 0, 0, 27 0, 0, 0, 0, 0, 0, 0x30 }; 28 static const u8 ice_lport_rcp[ICE_RECIPE_LEN] = { 29 0x05, 0, 0, 0, 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30 0x85, 0, 0x16, 0, 0, 0, 0xff, 0xff, 0x07, 0, 0, 0, 0, 0, 0, 0, 31 0, 0, 0, 0, 0, 0, 0x30 }; 32 33 /** 34 * ice_lag_set_primary - set PF LAG state as Primary 35 * @lag: LAG info struct 36 */ 37 static void ice_lag_set_primary(struct ice_lag *lag) 38 { 39 struct ice_pf *pf = lag->pf; 40 41 if (!pf) 42 return; 43 44 if (lag->role != ICE_LAG_UNSET && lag->role != ICE_LAG_BACKUP) { 45 dev_warn(ice_pf_to_dev(pf), "%s: Attempt to be Primary, but incompatible state.\n", 46 netdev_name(lag->netdev)); 47 return; 48 } 49 50 lag->role = ICE_LAG_PRIMARY; 51 } 52 53 /** 54 * ice_lag_set_bkup - set PF LAG state to Backup 55 * @lag: LAG info struct 56 */ 57 static void ice_lag_set_bkup(struct ice_lag *lag) 58 { 59 struct ice_pf *pf = lag->pf; 60 61 if (!pf) 62 return; 63 64 if (lag->role != ICE_LAG_UNSET && lag->role != ICE_LAG_PRIMARY) { 65 dev_dbg(ice_pf_to_dev(pf), "%s: Attempt to be Backup, but incompatible state\n", 66 netdev_name(lag->netdev)); 67 return; 68 } 69 70 lag->role = ICE_LAG_BACKUP; 71 } 72 73 /** 74 * netif_is_same_ice - determine if netdev is on the same ice NIC as local PF 75 * @pf: local PF struct 76 * @netdev: netdev we are evaluating 77 */ 78 static bool netif_is_same_ice(struct ice_pf *pf, struct net_device *netdev) 79 { 80 struct ice_netdev_priv *np; 81 struct ice_pf *test_pf; 82 struct ice_vsi *vsi; 83 84 if (!netif_is_ice(netdev)) 85 return false; 86 87 np = netdev_priv(netdev); 88 if (!np) 89 return false; 90 91 vsi = np->vsi; 92 if (!vsi) 93 return false; 94 95 test_pf = vsi->back; 96 if (!test_pf) 97 return false; 98 99 if (pf->pdev->bus != test_pf->pdev->bus || 100 pf->pdev->slot != test_pf->pdev->slot) 101 return false; 102 103 return true; 104 } 105 106 /** 107 * ice_lag_config_eswitch - configure eswitch to work with LAG 108 * @lag: lag info struct 109 * @netdev: active network interface device struct 110 * 111 * Updates all port representors in eswitch to use @netdev for Tx. 112 * 113 * Configures the netdev to keep dst metadata (also used in representor Tx). 114 * This is required for an uplink without switchdev mode configured. 115 */ 116 static void ice_lag_config_eswitch(struct ice_lag *lag, 117 struct net_device *netdev) 118 { 119 struct ice_repr *repr; 120 unsigned long id; 121 122 xa_for_each(&lag->pf->eswitch.reprs, id, repr) 123 repr->dst->u.port_info.lower_dev = netdev; 124 125 netif_keep_dst(netdev); 126 } 127 128 /** 129 * ice_netdev_to_lag - return pointer to associated lag struct from netdev 130 * @netdev: pointer to net_device struct to query 131 */ 132 static struct ice_lag *ice_netdev_to_lag(struct net_device *netdev) 133 { 134 struct ice_netdev_priv *np; 135 struct ice_vsi *vsi; 136 137 if (!netif_is_ice(netdev)) 138 return NULL; 139 140 np = netdev_priv(netdev); 141 if (!np) 142 return NULL; 143 144 vsi = np->vsi; 145 if (!vsi) 146 return NULL; 147 148 return vsi->back->lag; 149 } 150 151 /** 152 * ice_lag_find_hw_by_lport - return an hw struct from bond members lport 153 * @lag: lag struct 154 * @lport: lport value to search for 155 */ 156 static struct ice_hw * 157 ice_lag_find_hw_by_lport(struct ice_lag *lag, u8 lport) 158 { 159 struct ice_lag_netdev_list *entry; 160 struct net_device *tmp_netdev; 161 struct ice_netdev_priv *np; 162 struct ice_hw *hw; 163 164 list_for_each_entry(entry, lag->netdev_head, node) { 165 tmp_netdev = entry->netdev; 166 if (!tmp_netdev || !netif_is_ice(tmp_netdev)) 167 continue; 168 169 np = netdev_priv(tmp_netdev); 170 if (!np || !np->vsi) 171 continue; 172 173 hw = &np->vsi->back->hw; 174 if (hw->port_info->lport == lport) 175 return hw; 176 } 177 178 return NULL; 179 } 180 181 /** 182 * ice_pkg_has_lport_extract - check if lport extraction supported 183 * @hw: HW struct 184 */ 185 static bool ice_pkg_has_lport_extract(struct ice_hw *hw) 186 { 187 int i; 188 189 for (i = 0; i < hw->blk[ICE_BLK_SW].es.count; i++) { 190 u16 offset; 191 u8 fv_prot; 192 193 ice_find_prot_off(hw, ICE_BLK_SW, ICE_SW_DEFAULT_PROFILE, i, 194 &fv_prot, &offset); 195 if (fv_prot == ICE_FV_PROT_MDID && 196 offset == ICE_LP_EXT_BUF_OFFSET) 197 return true; 198 } 199 return false; 200 } 201 202 /** 203 * ice_lag_find_primary - returns pointer to primary interfaces lag struct 204 * @lag: local interfaces lag struct 205 */ 206 static struct ice_lag *ice_lag_find_primary(struct ice_lag *lag) 207 { 208 struct ice_lag *primary_lag = NULL; 209 struct list_head *tmp; 210 211 list_for_each(tmp, lag->netdev_head) { 212 struct ice_lag_netdev_list *entry; 213 struct ice_lag *tmp_lag; 214 215 entry = list_entry(tmp, struct ice_lag_netdev_list, node); 216 tmp_lag = ice_netdev_to_lag(entry->netdev); 217 if (tmp_lag && tmp_lag->primary) { 218 primary_lag = tmp_lag; 219 break; 220 } 221 } 222 223 return primary_lag; 224 } 225 226 /** 227 * ice_lag_cfg_fltr - Add/Remove rule for LAG 228 * @lag: lag struct for local interface 229 * @act: rule action 230 * @recipe_id: recipe id for the new rule 231 * @rule_idx: pointer to rule index 232 * @direction: ICE_FLTR_RX or ICE_FLTR_TX 233 * @add: boolean on whether we are adding filters 234 */ 235 static int 236 ice_lag_cfg_fltr(struct ice_lag *lag, u32 act, u16 recipe_id, u16 *rule_idx, 237 u8 direction, bool add) 238 { 239 struct ice_sw_rule_lkup_rx_tx *s_rule; 240 struct ice_hw *hw = &lag->pf->hw; 241 u16 s_rule_sz, vsi_num; 242 u8 *eth_hdr; 243 u32 opc; 244 int err; 245 246 vsi_num = ice_get_hw_vsi_num(hw, 0); 247 248 s_rule_sz = ICE_SW_RULE_RX_TX_ETH_HDR_SIZE(s_rule); 249 s_rule = kzalloc(s_rule_sz, GFP_KERNEL); 250 if (!s_rule) { 251 dev_err(ice_pf_to_dev(lag->pf), "error allocating rule for LAG\n"); 252 return -ENOMEM; 253 } 254 255 if (add) { 256 eth_hdr = s_rule->hdr_data; 257 ice_fill_eth_hdr(eth_hdr); 258 259 act |= FIELD_PREP(ICE_SINGLE_ACT_VSI_ID_M, vsi_num); 260 261 s_rule->recipe_id = cpu_to_le16(recipe_id); 262 if (direction == ICE_FLTR_RX) { 263 s_rule->hdr.type = 264 cpu_to_le16(ICE_AQC_SW_RULES_T_LKUP_RX); 265 s_rule->src = cpu_to_le16(hw->port_info->lport); 266 } else { 267 s_rule->hdr.type = 268 cpu_to_le16(ICE_AQC_SW_RULES_T_LKUP_TX); 269 s_rule->src = cpu_to_le16(vsi_num); 270 } 271 s_rule->act = cpu_to_le32(act); 272 s_rule->hdr_len = cpu_to_le16(DUMMY_ETH_HDR_LEN); 273 opc = ice_aqc_opc_add_sw_rules; 274 } else { 275 s_rule->index = cpu_to_le16(*rule_idx); 276 opc = ice_aqc_opc_remove_sw_rules; 277 } 278 279 err = ice_aq_sw_rules(&lag->pf->hw, s_rule, s_rule_sz, 1, opc, NULL); 280 if (err) 281 goto dflt_fltr_free; 282 283 if (add) 284 *rule_idx = le16_to_cpu(s_rule->index); 285 else 286 *rule_idx = 0; 287 288 dflt_fltr_free: 289 kfree(s_rule); 290 return err; 291 } 292 293 /** 294 * ice_lag_cfg_dflt_fltr - Add/Remove default VSI rule for LAG 295 * @lag: lag struct for local interface 296 * @add: boolean on whether to add filter 297 */ 298 static int 299 ice_lag_cfg_dflt_fltr(struct ice_lag *lag, bool add) 300 { 301 u32 act = ICE_SINGLE_ACT_VSI_FORWARDING | 302 ICE_SINGLE_ACT_VALID_BIT | ICE_SINGLE_ACT_LAN_ENABLE; 303 int err; 304 305 err = ice_lag_cfg_fltr(lag, act, lag->pf_recipe, &lag->pf_rx_rule_id, 306 ICE_FLTR_RX, add); 307 if (err) 308 goto err_rx; 309 310 act = ICE_SINGLE_ACT_VSI_FORWARDING | ICE_SINGLE_ACT_VALID_BIT | 311 ICE_SINGLE_ACT_LB_ENABLE; 312 err = ice_lag_cfg_fltr(lag, act, lag->pf_recipe, &lag->pf_tx_rule_id, 313 ICE_FLTR_TX, add); 314 if (err) 315 goto err_tx; 316 317 return 0; 318 319 err_tx: 320 ice_lag_cfg_fltr(lag, act, lag->pf_recipe, &lag->pf_rx_rule_id, 321 ICE_FLTR_RX, !add); 322 err_rx: 323 return err; 324 } 325 326 /** 327 * ice_lag_cfg_drop_fltr - Add/Remove lport drop rule 328 * @lag: lag struct for local interface 329 * @add: boolean on whether to add filter 330 */ 331 static int 332 ice_lag_cfg_drop_fltr(struct ice_lag *lag, bool add) 333 { 334 u32 act = ICE_SINGLE_ACT_VSI_FORWARDING | 335 ICE_SINGLE_ACT_VALID_BIT | 336 ICE_SINGLE_ACT_DROP; 337 338 return ice_lag_cfg_fltr(lag, act, lag->lport_recipe, 339 &lag->lport_rule_idx, ICE_FLTR_RX, add); 340 } 341 342 /** 343 * ice_lag_cfg_pf_fltrs_act_bkup - set filters up for new active port 344 * @lag: local interfaces lag struct 345 * @bonding_info: netdev event bonding info 346 */ 347 static void 348 ice_lag_cfg_pf_fltrs_act_bkup(struct ice_lag *lag, 349 struct netdev_bonding_info *bonding_info) 350 { 351 struct device *dev = ice_pf_to_dev(lag->pf); 352 353 /* interface not active - remove old default VSI rule */ 354 if (bonding_info->slave.state && lag->pf_rx_rule_id) { 355 if (ice_lag_cfg_dflt_fltr(lag, false)) 356 dev_err(dev, "Error removing old default VSI filter\n"); 357 if (ice_lag_cfg_drop_fltr(lag, true)) 358 dev_err(dev, "Error adding new drop filter\n"); 359 return; 360 } 361 362 /* interface becoming active - add new default VSI rule */ 363 if (!bonding_info->slave.state && !lag->pf_rx_rule_id) { 364 if (ice_lag_cfg_dflt_fltr(lag, true)) 365 dev_err(dev, "Error adding new default VSI filter\n"); 366 if (lag->lport_rule_idx && ice_lag_cfg_drop_fltr(lag, false)) 367 dev_err(dev, "Error removing old drop filter\n"); 368 } 369 } 370 371 /** 372 * ice_lag_cfg_lp_fltr - configure lport filters 373 * @lag: local interface's lag struct 374 * @add: add or remove rule 375 * @cp: control packet only or general PF lport rule 376 */ 377 static void 378 ice_lag_cfg_lp_fltr(struct ice_lag *lag, bool add, bool cp) 379 { 380 struct ice_sw_rule_lkup_rx_tx *s_rule; 381 struct ice_vsi *vsi = lag->pf->vsi[0]; 382 u16 buf_len, opc; 383 384 buf_len = ICE_SW_RULE_RX_TX_HDR_SIZE(s_rule, ICE_TRAIN_PKT_LEN); 385 s_rule = kzalloc(buf_len, GFP_KERNEL); 386 if (!s_rule) { 387 netdev_warn(lag->netdev, "-ENOMEM error configuring CP filter\n"); 388 return; 389 } 390 391 if (add) { 392 if (cp) { 393 s_rule->recipe_id = 394 cpu_to_le16(ICE_LAG_SRIOV_CP_RECIPE); 395 memcpy(s_rule->hdr_data, lacp_train_pkt, 396 ICE_TRAIN_PKT_LEN); 397 } else { 398 s_rule->recipe_id = cpu_to_le16(lag->act_act_recipe); 399 memcpy(s_rule->hdr_data, act_act_train_pkt, 400 ICE_TRAIN_PKT_LEN); 401 } 402 403 s_rule->src = cpu_to_le16(vsi->port_info->lport); 404 s_rule->act = cpu_to_le32(ICE_FWD_TO_VSI | 405 ICE_SINGLE_ACT_LAN_ENABLE | 406 ICE_SINGLE_ACT_VALID_BIT | 407 FIELD_PREP(ICE_SINGLE_ACT_VSI_ID_M, 408 vsi->vsi_num)); 409 s_rule->hdr_len = cpu_to_le16(ICE_TRAIN_PKT_LEN); 410 s_rule->hdr.type = cpu_to_le16(ICE_AQC_SW_RULES_T_LKUP_RX); 411 opc = ice_aqc_opc_add_sw_rules; 412 } else { 413 opc = ice_aqc_opc_remove_sw_rules; 414 if (cp) 415 s_rule->index = cpu_to_le16(lag->cp_rule_idx); 416 else 417 s_rule->index = cpu_to_le16(lag->act_act_rule_idx); 418 } 419 if (ice_aq_sw_rules(&lag->pf->hw, s_rule, buf_len, 1, opc, NULL)) { 420 netdev_warn(lag->netdev, "Error %s %s rule for aggregate\n", 421 add ? "ADDING" : "REMOVING", 422 cp ? "CONTROL PACKET" : "LPORT"); 423 goto err_cp_free; 424 } 425 426 if (add) { 427 if (cp) 428 lag->cp_rule_idx = le16_to_cpu(s_rule->index); 429 else 430 lag->act_act_rule_idx = le16_to_cpu(s_rule->index); 431 } else { 432 if (cp) 433 lag->cp_rule_idx = 0; 434 else 435 lag->act_act_rule_idx = 0; 436 } 437 438 err_cp_free: 439 kfree(s_rule); 440 } 441 442 /** 443 * ice_lag_cfg_pf_fltrs - set filters up for PF traffic 444 * @lag: local interfaces lag struct 445 * @ptr: opaque data containing notifier event 446 */ 447 static void 448 ice_lag_cfg_pf_fltrs(struct ice_lag *lag, void *ptr) 449 { 450 struct netdev_notifier_bonding_info *info = ptr; 451 struct netdev_bonding_info *bonding_info; 452 struct net_device *event_netdev; 453 454 event_netdev = netdev_notifier_info_to_dev(ptr); 455 if (event_netdev != lag->netdev) 456 return; 457 458 bonding_info = &info->bonding_info; 459 460 if (lag->bond_aa) { 461 if (lag->need_fltr_cfg) { 462 ice_lag_cfg_lp_fltr(lag, true, false); 463 lag->need_fltr_cfg = false; 464 } 465 } else { 466 ice_lag_cfg_pf_fltrs_act_bkup(lag, bonding_info); 467 } 468 } 469 470 /** 471 * ice_display_lag_info - print LAG info 472 * @lag: LAG info struct 473 */ 474 static void ice_display_lag_info(struct ice_lag *lag) 475 { 476 const char *name, *upper, *role, *bonded, *primary; 477 struct device *dev = &lag->pf->pdev->dev; 478 479 name = lag->netdev ? netdev_name(lag->netdev) : "unset"; 480 upper = lag->upper_netdev ? netdev_name(lag->upper_netdev) : "unset"; 481 primary = lag->primary ? "TRUE" : "FALSE"; 482 bonded = lag->bonded ? "BONDED" : "UNBONDED"; 483 484 switch (lag->role) { 485 case ICE_LAG_NONE: 486 role = "NONE"; 487 break; 488 case ICE_LAG_PRIMARY: 489 role = "PRIMARY"; 490 break; 491 case ICE_LAG_BACKUP: 492 role = "BACKUP"; 493 break; 494 case ICE_LAG_UNSET: 495 role = "UNSET"; 496 break; 497 default: 498 role = "ERROR"; 499 } 500 501 dev_dbg(dev, "%s %s, upper:%s, role:%s, primary:%s\n", name, bonded, 502 upper, role, primary); 503 } 504 505 /** 506 * ice_lag_qbuf_recfg - generate a buffer of queues for a reconfigure command 507 * @hw: HW struct that contains the queue contexts 508 * @qbuf: pointer to buffer to populate 509 * @vsi_num: index of the VSI in PF space 510 * @numq: number of queues to search for 511 * @tc: traffic class that contains the queues 512 * 513 * function returns the number of valid queues in buffer 514 */ 515 static u16 516 ice_lag_qbuf_recfg(struct ice_hw *hw, struct ice_aqc_cfg_txqs_buf *qbuf, 517 u16 vsi_num, u16 numq, u8 tc) 518 { 519 struct ice_pf *pf = hw->back; 520 struct ice_q_ctx *q_ctx; 521 u16 qid, count = 0; 522 int i; 523 524 for (i = 0; i < numq; i++) { 525 q_ctx = ice_get_lan_q_ctx(hw, vsi_num, tc, i); 526 if (!q_ctx) { 527 dev_dbg(ice_hw_to_dev(hw), "%s queue %d NO Q CONTEXT\n", 528 __func__, i); 529 continue; 530 } 531 if (q_ctx->q_teid == ICE_INVAL_TEID) { 532 dev_dbg(ice_hw_to_dev(hw), "%s queue %d INVAL TEID\n", 533 __func__, i); 534 continue; 535 } 536 if (q_ctx->q_handle == ICE_INVAL_Q_HANDLE) { 537 dev_dbg(ice_hw_to_dev(hw), "%s queue %d INVAL Q HANDLE\n", 538 __func__, i); 539 continue; 540 } 541 542 qid = pf->vsi[vsi_num]->txq_map[q_ctx->q_handle]; 543 qbuf->queue_info[count].q_handle = cpu_to_le16(qid); 544 qbuf->queue_info[count].tc = tc; 545 qbuf->queue_info[count].q_teid = cpu_to_le32(q_ctx->q_teid); 546 count++; 547 } 548 549 return count; 550 } 551 552 /** 553 * ice_lag_get_sched_parent - locate or create a sched node parent 554 * @hw: HW struct for getting parent in 555 * @tc: traffic class on parent/node 556 */ 557 static struct ice_sched_node * 558 ice_lag_get_sched_parent(struct ice_hw *hw, u8 tc) 559 { 560 struct ice_sched_node *tc_node, *aggnode, *parent = NULL; 561 u16 num_nodes[ICE_AQC_TOPO_MAX_LEVEL_NUM] = { 0 }; 562 struct ice_port_info *pi = hw->port_info; 563 struct device *dev; 564 u8 aggl, vsil; 565 int n; 566 567 dev = ice_hw_to_dev(hw); 568 569 tc_node = ice_sched_get_tc_node(pi, tc); 570 if (!tc_node) { 571 dev_warn(dev, "Failure to find TC node for LAG move\n"); 572 return parent; 573 } 574 575 aggnode = ice_sched_get_agg_node(pi, tc_node, ICE_DFLT_AGG_ID); 576 if (!aggnode) { 577 dev_warn(dev, "Failure to find aggregate node for LAG move\n"); 578 return parent; 579 } 580 581 aggl = ice_sched_get_agg_layer(hw); 582 vsil = ice_sched_get_vsi_layer(hw); 583 584 for (n = aggl + 1; n < vsil; n++) 585 num_nodes[n] = 1; 586 587 for (n = 0; n < aggnode->num_children; n++) { 588 parent = ice_sched_get_free_vsi_parent(hw, aggnode->children[n], 589 num_nodes); 590 if (parent) 591 return parent; 592 } 593 594 /* if free parent not found - add one */ 595 parent = aggnode; 596 for (n = aggl + 1; n < vsil; n++) { 597 u16 num_nodes_added; 598 u32 first_teid; 599 int err; 600 601 err = ice_sched_add_nodes_to_layer(pi, tc_node, parent, n, 602 num_nodes[n], &first_teid, 603 &num_nodes_added); 604 if (err || num_nodes[n] != num_nodes_added) 605 return NULL; 606 607 if (num_nodes_added) 608 parent = ice_sched_find_node_by_teid(tc_node, 609 first_teid); 610 else 611 parent = parent->children[0]; 612 if (!parent) { 613 dev_warn(dev, "Failure to add new parent for LAG move\n"); 614 return parent; 615 } 616 } 617 618 return parent; 619 } 620 621 /** 622 * ice_lag_move_vf_node_tc - move scheduling nodes for one VF on one TC 623 * @lag: lag info struct 624 * @oldport: lport of previous nodes location 625 * @newport: lport of destination nodes location 626 * @vsi_num: array index of VSI in PF space 627 * @tc: traffic class to move 628 */ 629 static void 630 ice_lag_move_vf_node_tc(struct ice_lag *lag, u8 oldport, u8 newport, 631 u16 vsi_num, u8 tc) 632 { 633 DEFINE_RAW_FLEX(struct ice_aqc_move_elem, buf, teid, 1); 634 struct device *dev = ice_pf_to_dev(lag->pf); 635 u16 numq, valq, num_moved, qbuf_size; 636 u16 buf_size = __struct_size(buf); 637 struct ice_aqc_cfg_txqs_buf *qbuf; 638 struct ice_sched_node *n_prt; 639 struct ice_hw *new_hw = NULL; 640 __le32 teid, parent_teid; 641 struct ice_vsi_ctx *ctx; 642 u32 tmp_teid; 643 644 ctx = ice_get_vsi_ctx(&lag->pf->hw, vsi_num); 645 if (!ctx) { 646 dev_warn(dev, "Unable to locate VSI context for LAG failover\n"); 647 return; 648 } 649 650 /* check to see if this VF is enabled on this TC */ 651 if (!ctx->sched.vsi_node[tc]) 652 return; 653 654 /* locate HW struct for destination port */ 655 new_hw = ice_lag_find_hw_by_lport(lag, newport); 656 if (!new_hw) { 657 dev_warn(dev, "Unable to locate HW struct for LAG node destination\n"); 658 return; 659 } 660 661 numq = ctx->num_lan_q_entries[tc]; 662 teid = ctx->sched.vsi_node[tc]->info.node_teid; 663 tmp_teid = le32_to_cpu(teid); 664 parent_teid = ctx->sched.vsi_node[tc]->info.parent_teid; 665 /* if no teid assigned or numq == 0, then this TC is not active */ 666 if (!tmp_teid || !numq) 667 return; 668 669 /* suspend VSI subtree for Traffic Class "tc" on 670 * this VF's VSI 671 */ 672 if (ice_sched_suspend_resume_elems(&lag->pf->hw, 1, &tmp_teid, true)) 673 dev_dbg(dev, "Problem suspending traffic for LAG node move\n"); 674 675 /* reconfigure all VF's queues on this Traffic Class 676 * to new port 677 */ 678 qbuf_size = struct_size(qbuf, queue_info, numq); 679 qbuf = kzalloc(qbuf_size, GFP_KERNEL); 680 if (!qbuf) { 681 dev_warn(dev, "Failure allocating memory for VF queue recfg buffer\n"); 682 goto resume_traffic; 683 } 684 685 /* add the per queue info for the reconfigure command buffer */ 686 valq = ice_lag_qbuf_recfg(&lag->pf->hw, qbuf, vsi_num, numq, tc); 687 if (!valq) { 688 dev_dbg(dev, "No valid queues found for LAG failover\n"); 689 goto qbuf_none; 690 } 691 692 if (ice_aq_cfg_lan_txq(&lag->pf->hw, qbuf, qbuf_size, valq, oldport, 693 newport, ICE_AQC_Q_CFG_TC_CHNG, NULL)) { 694 dev_warn(dev, "Failure to configure queues for LAG failover\n"); 695 goto qbuf_err; 696 } 697 698 qbuf_none: 699 kfree(qbuf); 700 701 /* find new parent in destination port's tree for VF VSI node on this 702 * Traffic Class 703 */ 704 n_prt = ice_lag_get_sched_parent(new_hw, tc); 705 if (!n_prt) 706 goto resume_traffic; 707 708 /* Move Vf's VSI node for this TC to newport's scheduler tree */ 709 buf->hdr.src_parent_teid = parent_teid; 710 buf->hdr.dest_parent_teid = n_prt->info.node_teid; 711 buf->hdr.num_elems = cpu_to_le16(1); 712 buf->hdr.mode = ICE_AQC_MOVE_ELEM_MODE_KEEP_OWN; 713 buf->teid[0] = teid; 714 715 if (ice_aq_move_sched_elems(&lag->pf->hw, buf, buf_size, &num_moved)) 716 dev_warn(dev, "Failure to move VF nodes for failover\n"); 717 else 718 ice_sched_update_parent(n_prt, ctx->sched.vsi_node[tc]); 719 720 goto resume_traffic; 721 722 qbuf_err: 723 kfree(qbuf); 724 725 resume_traffic: 726 /* restart traffic for VSI node */ 727 if (ice_sched_suspend_resume_elems(&lag->pf->hw, 1, &tmp_teid, false)) 728 dev_dbg(dev, "Problem restarting traffic for LAG node move\n"); 729 } 730 731 /** 732 * ice_lag_build_netdev_list - populate the lag struct's netdev list 733 * @lag: local lag struct 734 * @ndlist: pointer to netdev list to populate 735 */ 736 static void ice_lag_build_netdev_list(struct ice_lag *lag, 737 struct ice_lag_netdev_list *ndlist) 738 { 739 struct ice_lag_netdev_list *nl; 740 struct net_device *tmp_nd; 741 742 INIT_LIST_HEAD(&ndlist->node); 743 rcu_read_lock(); 744 for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) { 745 nl = kzalloc(sizeof(*nl), GFP_ATOMIC); 746 if (!nl) 747 break; 748 749 nl->netdev = tmp_nd; 750 list_add(&nl->node, &ndlist->node); 751 } 752 rcu_read_unlock(); 753 lag->netdev_head = &ndlist->node; 754 } 755 756 /** 757 * ice_lag_destroy_netdev_list - free lag struct's netdev list 758 * @lag: pointer to local lag struct 759 * @ndlist: pointer to lag struct netdev list 760 */ 761 static void ice_lag_destroy_netdev_list(struct ice_lag *lag, 762 struct ice_lag_netdev_list *ndlist) 763 { 764 struct ice_lag_netdev_list *entry, *n; 765 766 rcu_read_lock(); 767 list_for_each_entry_safe(entry, n, &ndlist->node, node) { 768 list_del(&entry->node); 769 kfree(entry); 770 } 771 rcu_read_unlock(); 772 lag->netdev_head = NULL; 773 } 774 775 /** 776 * ice_lag_move_single_vf_nodes - Move Tx scheduling nodes for single VF 777 * @lag: primary interface LAG struct 778 * @oldport: lport of previous interface 779 * @newport: lport of destination interface 780 * @vsi_num: SW index of VF's VSI 781 */ 782 static void 783 ice_lag_move_single_vf_nodes(struct ice_lag *lag, u8 oldport, u8 newport, 784 u16 vsi_num) 785 { 786 u8 tc; 787 788 ice_for_each_traffic_class(tc) 789 ice_lag_move_vf_node_tc(lag, oldport, newport, vsi_num, tc); 790 } 791 792 /** 793 * ice_lag_move_vf_nodes - move Tx scheduling nodes for all VFs to new port 794 * @lag: lag info struct 795 * @oldport: lport of previous interface 796 * @newport: lport of destination interface 797 */ 798 static void ice_lag_move_vf_nodes(struct ice_lag *lag, u8 oldport, u8 newport) 799 { 800 struct ice_pf *pf; 801 int i; 802 803 if (!lag->primary) 804 return; 805 806 pf = lag->pf; 807 ice_for_each_vsi(pf, i) 808 if (pf->vsi[i] && pf->vsi[i]->type == ICE_VSI_VF) 809 ice_lag_move_single_vf_nodes(lag, oldport, newport, i); 810 } 811 812 /** 813 * ice_lag_move_vf_nodes_cfg - move vf nodes outside LAG netdev event context 814 * @lag: local lag struct 815 * @src_prt: lport value for source port 816 * @dst_prt: lport value for destination port 817 * 818 * This function is used to move nodes during an out-of-netdev-event situation, 819 * primarily when the driver needs to reconfigure or recreate resources. 820 * 821 * Must be called while holding the lag_mutex to avoid lag events from 822 * processing while out-of-sync moves are happening. Also, paired moves, 823 * such as used in a reset flow, should both be called under the same mutex 824 * lock to avoid changes between start of reset and end of reset. 825 */ 826 void ice_lag_move_vf_nodes_cfg(struct ice_lag *lag, u8 src_prt, u8 dst_prt) 827 { 828 struct ice_lag_netdev_list ndlist; 829 830 ice_lag_build_netdev_list(lag, &ndlist); 831 ice_lag_move_vf_nodes(lag, src_prt, dst_prt); 832 ice_lag_destroy_netdev_list(lag, &ndlist); 833 } 834 835 /** 836 * ice_lag_prepare_vf_reset - helper to adjust vf lag for reset 837 * @lag: lag struct for interface that owns VF 838 * 839 * Context: must be called with the lag_mutex lock held. 840 * 841 * Return: active lport value or ICE_LAG_INVALID_PORT if nothing moved. 842 */ 843 u8 ice_lag_prepare_vf_reset(struct ice_lag *lag) 844 { 845 u8 pri_prt, act_prt; 846 847 if (lag && lag->bonded && lag->primary && lag->upper_netdev) { 848 if (!lag->bond_aa) { 849 pri_prt = lag->pf->hw.port_info->lport; 850 act_prt = lag->active_port; 851 if (act_prt != pri_prt && 852 act_prt != ICE_LAG_INVALID_PORT) { 853 ice_lag_move_vf_nodes_cfg(lag, act_prt, pri_prt); 854 return act_prt; 855 } 856 } else { 857 if (lag->port_bitmap & ICE_LAGS_M) { 858 lag->port_bitmap &= ~ICE_LAGS_M; 859 ice_lag_aa_failover(lag, ICE_LAGP_IDX, NULL); 860 lag->port_bitmap |= ICE_LAGS_M; 861 } 862 } 863 } 864 865 return ICE_LAG_INVALID_PORT; 866 } 867 868 /** 869 * ice_lag_complete_vf_reset - helper for lag after reset 870 * @lag: lag struct for primary interface 871 * @act_prt: which port should be active for lag 872 * 873 * Context: must be called while holding the lag_mutex. 874 */ 875 void ice_lag_complete_vf_reset(struct ice_lag *lag, u8 act_prt) 876 { 877 u8 pri_prt; 878 879 if (lag && lag->bonded && lag->primary) { 880 if (!lag->bond_aa) { 881 pri_prt = lag->pf->hw.port_info->lport; 882 if (act_prt != ICE_LAG_INVALID_PORT) 883 ice_lag_move_vf_nodes_cfg(lag, pri_prt, 884 act_prt); 885 } else { 886 ice_lag_aa_failover(lag, ICE_LAGS_IDX, NULL); 887 } 888 } 889 } 890 891 /** 892 * ice_lag_info_event - handle NETDEV_BONDING_INFO event 893 * @lag: LAG info struct 894 * @ptr: opaque data pointer 895 * 896 * ptr is to be cast to (netdev_notifier_bonding_info *) 897 */ 898 static void ice_lag_info_event(struct ice_lag *lag, void *ptr) 899 { 900 struct netdev_notifier_bonding_info *info = ptr; 901 struct netdev_bonding_info *bonding_info; 902 struct net_device *event_netdev; 903 const char *lag_netdev_name; 904 905 event_netdev = netdev_notifier_info_to_dev(ptr); 906 lag_netdev_name = netdev_name(lag->netdev); 907 bonding_info = &info->bonding_info; 908 909 if (event_netdev != lag->netdev || !lag->bonded || !lag->upper_netdev) 910 return; 911 912 if (bonding_info->master.bond_mode != BOND_MODE_ACTIVEBACKUP) { 913 netdev_dbg(lag->netdev, "Bonding event recv, but mode not active/backup\n"); 914 goto lag_out; 915 } 916 917 if (strcmp(bonding_info->slave.slave_name, lag_netdev_name)) { 918 netdev_dbg(lag->netdev, "Bonding event recv, but secondary info not for us\n"); 919 goto lag_out; 920 } 921 922 if (bonding_info->slave.state) 923 ice_lag_set_bkup(lag); 924 else 925 ice_lag_set_primary(lag); 926 927 lag_out: 928 ice_display_lag_info(lag); 929 } 930 931 /** 932 * ice_lag_aa_qbuf_recfg - fill a single queue buffer for recfg cmd 933 * @hw: HW struct that contains the queue context 934 * @qbuf: pointer to single queue buffer 935 * @vsi_num: index of the VF VSI in PF space 936 * @qnum: queue index 937 * 938 * Return: Zero on success, error code on failure. 939 */ 940 static int 941 ice_lag_aa_qbuf_recfg(struct ice_hw *hw, struct ice_aqc_cfg_txqs_buf *qbuf, 942 u16 vsi_num, int qnum) 943 { 944 struct ice_pf *pf = hw->back; 945 struct ice_q_ctx *q_ctx; 946 u16 q_id; 947 948 q_ctx = ice_get_lan_q_ctx(hw, vsi_num, 0, qnum); 949 if (!q_ctx) { 950 dev_dbg(ice_hw_to_dev(hw), "LAG queue %d no Q context\n", qnum); 951 return -ENOENT; 952 } 953 954 if (q_ctx->q_teid == ICE_INVAL_TEID) { 955 dev_dbg(ice_hw_to_dev(hw), "LAG queue %d INVAL TEID\n", qnum); 956 return -EINVAL; 957 } 958 959 if (q_ctx->q_handle == ICE_INVAL_Q_HANDLE) { 960 dev_dbg(ice_hw_to_dev(hw), "LAG queue %d INVAL Q HANDLE\n", qnum); 961 return -EINVAL; 962 } 963 964 q_id = pf->vsi[vsi_num]->txq_map[q_ctx->q_handle]; 965 qbuf->queue_info[0].q_handle = cpu_to_le16(q_id); 966 qbuf->queue_info[0].tc = 0; 967 qbuf->queue_info[0].q_teid = cpu_to_le32(q_ctx->q_teid); 968 969 return 0; 970 } 971 972 /** 973 * ice_lag_aa_move_vf_qs - Move some/all VF queues to destination 974 * @lag: primary interface's lag struct 975 * @dest: index of destination port 976 * @vsi_num: index of VF VSI in PF space 977 * @all: if true move all queues to destination 978 * @odd: VF wide q indicator for odd/even 979 * @e_pf: PF struct for the event interface 980 * 981 * the parameter "all" is to control whether we are splitting the queues 982 * between two interfaces or moving them all to the destination interface 983 */ 984 static void ice_lag_aa_move_vf_qs(struct ice_lag *lag, u8 dest, u16 vsi_num, 985 bool all, bool *odd, struct ice_pf *e_pf) 986 { 987 DEFINE_RAW_FLEX(struct ice_aqc_cfg_txqs_buf, qbuf, queue_info, 1); 988 struct ice_hw *old_hw, *new_hw, *pri_hw, *sec_hw; 989 struct device *dev = ice_pf_to_dev(lag->pf); 990 struct ice_vsi_ctx *pv_ctx, *sv_ctx; 991 struct ice_lag_netdev_list ndlist; 992 u16 num_q, qbuf_size, sec_vsi_num; 993 u8 pri_lport, sec_lport; 994 u32 pvf_teid, svf_teid; 995 u16 vf_id; 996 997 vf_id = lag->pf->vsi[vsi_num]->vf->vf_id; 998 /* If sec_vf[] not defined, then no second interface to share with */ 999 if (lag->sec_vf[vf_id]) 1000 sec_vsi_num = lag->sec_vf[vf_id]->idx; 1001 else 1002 return; 1003 1004 pri_lport = lag->bond_lport_pri; 1005 sec_lport = lag->bond_lport_sec; 1006 1007 if (pri_lport == ICE_LAG_INVALID_PORT || 1008 sec_lport == ICE_LAG_INVALID_PORT) 1009 return; 1010 1011 if (!e_pf) 1012 ice_lag_build_netdev_list(lag, &ndlist); 1013 1014 pri_hw = &lag->pf->hw; 1015 if (e_pf && lag->pf != e_pf) 1016 sec_hw = &e_pf->hw; 1017 else 1018 sec_hw = ice_lag_find_hw_by_lport(lag, sec_lport); 1019 1020 if (!pri_hw || !sec_hw) 1021 return; 1022 1023 if (dest == ICE_LAGP_IDX) { 1024 struct ice_vsi *vsi; 1025 1026 vsi = ice_get_main_vsi(lag->pf); 1027 if (!vsi) 1028 return; 1029 1030 old_hw = sec_hw; 1031 new_hw = pri_hw; 1032 ice_lag_config_eswitch(lag, vsi->netdev); 1033 } else { 1034 struct ice_pf *sec_pf = sec_hw->back; 1035 struct ice_vsi *vsi; 1036 1037 vsi = ice_get_main_vsi(sec_pf); 1038 if (!vsi) 1039 return; 1040 1041 old_hw = pri_hw; 1042 new_hw = sec_hw; 1043 ice_lag_config_eswitch(lag, vsi->netdev); 1044 } 1045 1046 pv_ctx = ice_get_vsi_ctx(pri_hw, vsi_num); 1047 if (!pv_ctx) { 1048 dev_warn(dev, "Unable to locate primary VSI %d context for LAG failover\n", 1049 vsi_num); 1050 return; 1051 } 1052 1053 sv_ctx = ice_get_vsi_ctx(sec_hw, sec_vsi_num); 1054 if (!sv_ctx) { 1055 dev_warn(dev, "Unable to locate secondary VSI %d context for LAG failover\n", 1056 vsi_num); 1057 return; 1058 } 1059 1060 num_q = pv_ctx->num_lan_q_entries[0]; 1061 qbuf_size = __struct_size(qbuf); 1062 1063 /* Suspend traffic for primary VSI VF */ 1064 pvf_teid = le32_to_cpu(pv_ctx->sched.vsi_node[0]->info.node_teid); 1065 ice_sched_suspend_resume_elems(pri_hw, 1, &pvf_teid, true); 1066 1067 /* Suspend traffic for secondary VSI VF */ 1068 svf_teid = le32_to_cpu(sv_ctx->sched.vsi_node[0]->info.node_teid); 1069 ice_sched_suspend_resume_elems(sec_hw, 1, &svf_teid, true); 1070 1071 for (int i = 0; i < num_q; i++) { 1072 struct ice_sched_node *n_prt, *q_node, *parent; 1073 struct ice_port_info *pi, *new_pi; 1074 struct ice_vsi_ctx *src_ctx; 1075 struct ice_sched_node *p; 1076 struct ice_q_ctx *q_ctx; 1077 u16 dst_vsi_num; 1078 1079 pi = old_hw->port_info; 1080 new_pi = new_hw->port_info; 1081 1082 *odd = !(*odd); 1083 if ((dest == ICE_LAGP_IDX && *odd && !all) || 1084 (dest == ICE_LAGS_IDX && !(*odd) && !all) || 1085 lag->q_home[vf_id][i] == dest) 1086 continue; 1087 1088 if (dest == ICE_LAGP_IDX) 1089 dst_vsi_num = vsi_num; 1090 else 1091 dst_vsi_num = sec_vsi_num; 1092 1093 n_prt = ice_sched_get_free_qparent(new_hw->port_info, 1094 dst_vsi_num, 0, 1095 ICE_SCHED_NODE_OWNER_LAN); 1096 if (!n_prt) 1097 continue; 1098 1099 q_ctx = ice_get_lan_q_ctx(pri_hw, vsi_num, 0, i); 1100 if (!q_ctx) 1101 continue; 1102 1103 if (dest == ICE_LAGP_IDX) 1104 src_ctx = sv_ctx; 1105 else 1106 src_ctx = pv_ctx; 1107 1108 q_node = ice_sched_find_node_by_teid(src_ctx->sched.vsi_node[0], 1109 q_ctx->q_teid); 1110 if (!q_node) 1111 continue; 1112 1113 qbuf->src_parent_teid = q_node->info.parent_teid; 1114 qbuf->dst_parent_teid = n_prt->info.node_teid; 1115 1116 /* Move the node in the HW/FW */ 1117 if (ice_lag_aa_qbuf_recfg(pri_hw, qbuf, vsi_num, i)) 1118 continue; 1119 1120 if (dest == ICE_LAGP_IDX) 1121 ice_aq_cfg_lan_txq(pri_hw, qbuf, qbuf_size, 1, 1122 sec_lport, pri_lport, 1123 ICE_AQC_Q_CFG_MOVE_TC_CHNG, 1124 NULL); 1125 else 1126 ice_aq_cfg_lan_txq(pri_hw, qbuf, qbuf_size, 1, 1127 pri_lport, sec_lport, 1128 ICE_AQC_Q_CFG_MOVE_TC_CHNG, 1129 NULL); 1130 1131 /* Move the node in the SW */ 1132 parent = q_node->parent; 1133 if (!parent) 1134 continue; 1135 1136 for (int n = 0; n < parent->num_children; n++) { 1137 int j; 1138 1139 if (parent->children[n] != q_node) 1140 continue; 1141 1142 for (j = n + 1; j < parent->num_children; 1143 j++) { 1144 parent->children[j - 1] = 1145 parent->children[j]; 1146 } 1147 parent->children[j] = NULL; 1148 parent->num_children--; 1149 break; 1150 } 1151 1152 p = pi->sib_head[0][q_node->tx_sched_layer]; 1153 while (p) { 1154 if (p->sibling == q_node) { 1155 p->sibling = q_node->sibling; 1156 break; 1157 } 1158 p = p->sibling; 1159 } 1160 1161 if (pi->sib_head[0][q_node->tx_sched_layer] == q_node) 1162 pi->sib_head[0][q_node->tx_sched_layer] = 1163 q_node->sibling; 1164 1165 q_node->parent = n_prt; 1166 q_node->info.parent_teid = n_prt->info.node_teid; 1167 q_node->sibling = NULL; 1168 p = new_pi->sib_head[0][q_node->tx_sched_layer]; 1169 if (p) { 1170 while (p) { 1171 if (!p->sibling) { 1172 p->sibling = q_node; 1173 break; 1174 } 1175 p = p->sibling; 1176 } 1177 } else { 1178 new_pi->sib_head[0][q_node->tx_sched_layer] = 1179 q_node; 1180 } 1181 1182 n_prt->children[n_prt->num_children++] = q_node; 1183 lag->q_home[vf_id][i] = dest; 1184 } 1185 1186 ice_sched_suspend_resume_elems(pri_hw, 1, &pvf_teid, false); 1187 ice_sched_suspend_resume_elems(sec_hw, 1, &svf_teid, false); 1188 1189 if (!e_pf) 1190 ice_lag_destroy_netdev_list(lag, &ndlist); 1191 } 1192 1193 /** 1194 * ice_lag_aa_failover - move VF queues in A/A mode 1195 * @lag: primary lag struct 1196 * @dest: index of destination port 1197 * @e_pf: PF struct for event port 1198 */ 1199 void ice_lag_aa_failover(struct ice_lag *lag, u8 dest, struct ice_pf *e_pf) 1200 { 1201 bool odd = true, all = false; 1202 int i; 1203 1204 /* Primary can be a target if down (cleanup), but secondary can't */ 1205 if (dest == ICE_LAGS_IDX && !(lag->port_bitmap & ICE_LAGS_M)) 1206 return; 1207 1208 /* Move all queues to a destination if only one port is active, 1209 * or no ports are active and dest is primary. 1210 */ 1211 if ((lag->port_bitmap ^ (ICE_LAGP_M | ICE_LAGS_M)) || 1212 (!lag->port_bitmap && dest == ICE_LAGP_IDX)) 1213 all = true; 1214 1215 ice_for_each_vsi(lag->pf, i) 1216 if (lag->pf->vsi[i] && lag->pf->vsi[i]->type == ICE_VSI_VF) 1217 ice_lag_aa_move_vf_qs(lag, dest, i, all, &odd, e_pf); 1218 } 1219 1220 /** 1221 * ice_lag_reclaim_vf_tc - move scheduling nodes back to primary interface 1222 * @lag: primary interface lag struct 1223 * @src_hw: HW struct current node location 1224 * @vsi_num: VSI index in PF space 1225 * @tc: traffic class to move 1226 */ 1227 static void 1228 ice_lag_reclaim_vf_tc(struct ice_lag *lag, struct ice_hw *src_hw, u16 vsi_num, 1229 u8 tc) 1230 { 1231 DEFINE_RAW_FLEX(struct ice_aqc_move_elem, buf, teid, 1); 1232 struct device *dev = ice_pf_to_dev(lag->pf); 1233 u16 numq, valq, num_moved, qbuf_size; 1234 u16 buf_size = __struct_size(buf); 1235 struct ice_aqc_cfg_txqs_buf *qbuf; 1236 struct ice_hw *hw = &lag->pf->hw; 1237 struct ice_sched_node *n_prt; 1238 __le32 teid, parent_teid; 1239 struct ice_vsi_ctx *ctx; 1240 u32 tmp_teid; 1241 1242 ctx = ice_get_vsi_ctx(hw, vsi_num); 1243 if (!ctx) { 1244 dev_warn(dev, "Unable to locate VSI context for LAG reclaim\n"); 1245 return; 1246 } 1247 1248 /* check to see if this VF is enabled on this TC */ 1249 if (!ctx->sched.vsi_node[tc]) 1250 return; 1251 1252 numq = ctx->num_lan_q_entries[tc]; 1253 teid = ctx->sched.vsi_node[tc]->info.node_teid; 1254 tmp_teid = le32_to_cpu(teid); 1255 parent_teid = ctx->sched.vsi_node[tc]->info.parent_teid; 1256 1257 /* if !teid or !numq, then this TC is not active */ 1258 if (!tmp_teid || !numq) 1259 return; 1260 1261 /* suspend traffic */ 1262 if (ice_sched_suspend_resume_elems(hw, 1, &tmp_teid, true)) 1263 dev_dbg(dev, "Problem suspending traffic for LAG node move\n"); 1264 1265 /* reconfig queues for new port */ 1266 qbuf_size = struct_size(qbuf, queue_info, numq); 1267 qbuf = kzalloc(qbuf_size, GFP_KERNEL); 1268 if (!qbuf) { 1269 dev_warn(dev, "Failure allocating memory for VF queue recfg buffer\n"); 1270 goto resume_reclaim; 1271 } 1272 1273 /* add the per queue info for the reconfigure command buffer */ 1274 valq = ice_lag_qbuf_recfg(hw, qbuf, vsi_num, numq, tc); 1275 if (!valq) { 1276 dev_dbg(dev, "No valid queues found for LAG reclaim\n"); 1277 goto reclaim_none; 1278 } 1279 1280 if (ice_aq_cfg_lan_txq(hw, qbuf, qbuf_size, numq, 1281 src_hw->port_info->lport, hw->port_info->lport, 1282 ICE_AQC_Q_CFG_TC_CHNG, NULL)) { 1283 dev_warn(dev, "Failure to configure queues for LAG failover\n"); 1284 goto reclaim_qerr; 1285 } 1286 1287 reclaim_none: 1288 kfree(qbuf); 1289 1290 /* find parent in primary tree */ 1291 n_prt = ice_lag_get_sched_parent(hw, tc); 1292 if (!n_prt) 1293 goto resume_reclaim; 1294 1295 /* Move node to new parent */ 1296 buf->hdr.src_parent_teid = parent_teid; 1297 buf->hdr.dest_parent_teid = n_prt->info.node_teid; 1298 buf->hdr.num_elems = cpu_to_le16(1); 1299 buf->hdr.mode = ICE_AQC_MOVE_ELEM_MODE_KEEP_OWN; 1300 buf->teid[0] = teid; 1301 1302 if (ice_aq_move_sched_elems(&lag->pf->hw, buf, buf_size, &num_moved)) 1303 dev_warn(dev, "Failure to move VF nodes for LAG reclaim\n"); 1304 else 1305 ice_sched_update_parent(n_prt, ctx->sched.vsi_node[tc]); 1306 1307 goto resume_reclaim; 1308 1309 reclaim_qerr: 1310 kfree(qbuf); 1311 1312 resume_reclaim: 1313 /* restart traffic */ 1314 if (ice_sched_suspend_resume_elems(hw, 1, &tmp_teid, false)) 1315 dev_warn(dev, "Problem restarting traffic for LAG node reclaim\n"); 1316 } 1317 1318 /** 1319 * ice_lag_reclaim_vf_nodes - When interface leaving bond primary reclaims nodes 1320 * @lag: primary interface lag struct 1321 * @src_hw: HW struct for current node location 1322 */ 1323 static void 1324 ice_lag_reclaim_vf_nodes(struct ice_lag *lag, struct ice_hw *src_hw) 1325 { 1326 struct ice_pf *pf; 1327 int i, tc; 1328 1329 if (!lag->primary || !src_hw) 1330 return; 1331 1332 pf = lag->pf; 1333 ice_for_each_vsi(pf, i) 1334 if (pf->vsi[i] && pf->vsi[i]->type == ICE_VSI_VF) 1335 ice_for_each_traffic_class(tc) 1336 ice_lag_reclaim_vf_tc(lag, src_hw, i, tc); 1337 } 1338 1339 /** 1340 * ice_lag_link - handle LAG link event 1341 * @lag: LAG info struct 1342 */ 1343 static void ice_lag_link(struct ice_lag *lag) 1344 { 1345 struct ice_pf *pf = lag->pf; 1346 1347 if (lag->bonded) 1348 dev_warn(ice_pf_to_dev(pf), "%s Already part of a bond\n", 1349 netdev_name(lag->netdev)); 1350 1351 lag->bonded = true; 1352 lag->role = ICE_LAG_UNSET; 1353 lag->need_fltr_cfg = true; 1354 netdev_info(lag->netdev, "Shared SR-IOV resources in bond are active\n"); 1355 } 1356 1357 /** 1358 * ice_lag_act_bkup_unlink - handle unlink event for A/B bond 1359 * @lag: LAG info struct 1360 */ 1361 static void ice_lag_act_bkup_unlink(struct ice_lag *lag) 1362 { 1363 u8 pri_port, act_port, loc_port; 1364 struct ice_pf *pf = lag->pf; 1365 1366 if (!lag->bonded) { 1367 netdev_dbg(lag->netdev, "bonding unlink event on non-LAG netdev\n"); 1368 return; 1369 } 1370 1371 if (lag->primary) { 1372 act_port = lag->active_port; 1373 pri_port = lag->pf->hw.port_info->lport; 1374 if (act_port != pri_port && act_port != ICE_LAG_INVALID_PORT) 1375 ice_lag_move_vf_nodes(lag, act_port, pri_port); 1376 lag->primary = false; 1377 lag->active_port = ICE_LAG_INVALID_PORT; 1378 1379 /* Config primary's eswitch back to normal operation. */ 1380 ice_lag_config_eswitch(lag, lag->netdev); 1381 } else { 1382 struct ice_lag *primary_lag; 1383 1384 primary_lag = ice_lag_find_primary(lag); 1385 if (primary_lag) { 1386 act_port = primary_lag->active_port; 1387 pri_port = primary_lag->pf->hw.port_info->lport; 1388 loc_port = pf->hw.port_info->lport; 1389 if (act_port == loc_port && 1390 act_port != ICE_LAG_INVALID_PORT) { 1391 ice_lag_reclaim_vf_nodes(primary_lag, 1392 &lag->pf->hw); 1393 primary_lag->active_port = ICE_LAG_INVALID_PORT; 1394 } 1395 } 1396 } 1397 } 1398 1399 /** 1400 * ice_lag_aa_unlink - handle unlink event for Active-Active bond 1401 * @lag: LAG info struct 1402 */ 1403 static void ice_lag_aa_unlink(struct ice_lag *lag) 1404 { 1405 struct ice_lag *pri_lag; 1406 1407 if (lag->primary) { 1408 pri_lag = lag; 1409 lag->port_bitmap &= ~ICE_LAGP_M; 1410 } else { 1411 pri_lag = ice_lag_find_primary(lag); 1412 if (pri_lag) 1413 pri_lag->port_bitmap &= ICE_LAGS_M; 1414 } 1415 1416 if (pri_lag) { 1417 ice_lag_aa_failover(pri_lag, ICE_LAGP_IDX, lag->pf); 1418 if (lag->primary) 1419 pri_lag->bond_lport_pri = ICE_LAG_INVALID_PORT; 1420 else 1421 pri_lag->bond_lport_sec = ICE_LAG_INVALID_PORT; 1422 } 1423 } 1424 1425 /** 1426 * ice_lag_link_unlink - helper function to call lag_link/unlink 1427 * @lag: lag info struct 1428 * @ptr: opaque pointer data 1429 */ 1430 static void ice_lag_link_unlink(struct ice_lag *lag, void *ptr) 1431 { 1432 struct net_device *netdev = netdev_notifier_info_to_dev(ptr); 1433 struct netdev_notifier_changeupper_info *info = ptr; 1434 1435 if (netdev != lag->netdev) 1436 return; 1437 1438 if (info->linking) { 1439 ice_lag_link(lag); 1440 } else { 1441 if (lag->bond_aa) 1442 ice_lag_aa_unlink(lag); 1443 else 1444 ice_lag_act_bkup_unlink(lag); 1445 1446 lag->bonded = false; 1447 lag->role = ICE_LAG_NONE; 1448 lag->upper_netdev = NULL; 1449 lag->bond_aa = false; 1450 lag->need_fltr_cfg = false; 1451 } 1452 } 1453 1454 /** 1455 * ice_lag_set_swid - set the SWID on secondary interface 1456 * @primary_swid: primary interface's SWID 1457 * @local_lag: local interfaces LAG struct 1458 * @link: Is this a linking activity 1459 * 1460 * If link is false, then primary_swid should be expected to not be valid 1461 * This function should never be called in interrupt context. 1462 */ 1463 static void 1464 ice_lag_set_swid(u16 primary_swid, struct ice_lag *local_lag, 1465 bool link) 1466 { 1467 struct ice_aqc_alloc_free_res_elem *buf; 1468 struct ice_aqc_set_port_params *cmd; 1469 struct libie_aq_desc desc; 1470 u16 buf_len, swid; 1471 int status, i; 1472 1473 buf_len = struct_size(buf, elem, 1); 1474 buf = kzalloc(buf_len, GFP_KERNEL); 1475 if (!buf) { 1476 dev_err(ice_pf_to_dev(local_lag->pf), "-ENOMEM error setting SWID\n"); 1477 return; 1478 } 1479 1480 buf->num_elems = cpu_to_le16(1); 1481 buf->res_type = cpu_to_le16(ICE_AQC_RES_TYPE_SWID); 1482 /* if unlinnking need to free the shared resource */ 1483 if (!link && local_lag->bond_swid) { 1484 buf->elem[0].e.sw_resp = cpu_to_le16(local_lag->bond_swid); 1485 status = ice_aq_alloc_free_res(&local_lag->pf->hw, buf, 1486 buf_len, ice_aqc_opc_free_res); 1487 if (status) 1488 dev_err(ice_pf_to_dev(local_lag->pf), "Error freeing SWID during LAG unlink\n"); 1489 local_lag->bond_swid = 0; 1490 } 1491 1492 if (link) { 1493 buf->res_type |= cpu_to_le16(ICE_LAG_RES_SHARED | 1494 ICE_LAG_RES_VALID); 1495 /* store the primary's SWID in case it leaves bond first */ 1496 local_lag->bond_swid = primary_swid; 1497 buf->elem[0].e.sw_resp = cpu_to_le16(local_lag->bond_swid); 1498 } else { 1499 buf->elem[0].e.sw_resp = 1500 cpu_to_le16(local_lag->pf->hw.port_info->sw_id); 1501 } 1502 1503 status = ice_aq_alloc_free_res(&local_lag->pf->hw, buf, buf_len, 1504 ice_aqc_opc_alloc_res); 1505 if (status) 1506 dev_err(ice_pf_to_dev(local_lag->pf), "Error subscribing to SWID 0x%04X\n", 1507 local_lag->bond_swid); 1508 1509 kfree(buf); 1510 1511 /* Configure port param SWID to correct value */ 1512 if (link) 1513 swid = primary_swid; 1514 else 1515 swid = local_lag->pf->hw.port_info->sw_id; 1516 1517 cmd = libie_aq_raw(&desc); 1518 ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_set_port_params); 1519 1520 cmd->swid = cpu_to_le16(ICE_AQC_PORT_SWID_VALID | swid); 1521 /* If this is happening in reset context, it is possible that the 1522 * primary interface has not finished setting its SWID to SHARED 1523 * yet. Allow retries to account for this timing issue between 1524 * interfaces. 1525 */ 1526 for (i = 0; i < ICE_LAG_RESET_RETRIES; i++) { 1527 status = ice_aq_send_cmd(&local_lag->pf->hw, &desc, NULL, 0, 1528 NULL); 1529 if (!status) 1530 break; 1531 1532 usleep_range(1000, 2000); 1533 } 1534 1535 if (status) 1536 dev_err(ice_pf_to_dev(local_lag->pf), "Error setting SWID in port params %d\n", 1537 status); 1538 } 1539 1540 /** 1541 * ice_lag_primary_swid - set/clear the SHARED attrib of primary's SWID 1542 * @lag: primary interface's lag struct 1543 * @link: is this a linking activity 1544 * 1545 * Implement setting primary SWID as shared using 0x020B 1546 */ 1547 static void ice_lag_primary_swid(struct ice_lag *lag, bool link) 1548 { 1549 struct ice_hw *hw = &lag->pf->hw; 1550 u16 swid = hw->port_info->sw_id; 1551 1552 if (ice_share_res(hw, ICE_AQC_RES_TYPE_SWID, link, swid)) 1553 dev_warn(ice_pf_to_dev(lag->pf), "Failure to set primary interface shared status\n"); 1554 } 1555 1556 /** 1557 * ice_lag_add_prune_list - Adds event_pf's VSI to primary's prune list 1558 * @lag: lag info struct 1559 * @event_pf: PF struct for VSI we are adding to primary's prune list 1560 */ 1561 static void ice_lag_add_prune_list(struct ice_lag *lag, struct ice_pf *event_pf) 1562 { 1563 u16 rule_buf_sz, vsi_list_id, event_vsi_num, prim_vsi_idx, num_vsi = 1; 1564 struct ice_sw_rule_vsi_list *s_rule; 1565 struct device *dev; 1566 1567 dev = ice_pf_to_dev(lag->pf); 1568 event_vsi_num = event_pf->vsi[0]->vsi_num; 1569 prim_vsi_idx = lag->pf->vsi[0]->idx; 1570 1571 if (!ice_find_vsi_list_entry(&lag->pf->hw, ICE_SW_LKUP_VLAN, 1572 prim_vsi_idx, &vsi_list_id)) { 1573 dev_warn(dev, "Could not locate prune list when setting up SRIOV LAG\n"); 1574 return; 1575 } 1576 1577 rule_buf_sz = (u16)ICE_SW_RULE_VSI_LIST_SIZE(s_rule, num_vsi); 1578 s_rule = kzalloc(rule_buf_sz, GFP_KERNEL); 1579 if (!s_rule) { 1580 dev_warn(dev, "Error allocating space for prune list when configuring SRIOV LAG\n"); 1581 return; 1582 } 1583 1584 s_rule->hdr.type = cpu_to_le16(ICE_AQC_SW_RULES_T_PRUNE_LIST_SET); 1585 s_rule->index = cpu_to_le16(vsi_list_id); 1586 s_rule->number_vsi = cpu_to_le16(num_vsi); 1587 s_rule->vsi[0] = cpu_to_le16(event_vsi_num); 1588 1589 if (ice_aq_sw_rules(&event_pf->hw, s_rule, rule_buf_sz, 1, 1590 ice_aqc_opc_update_sw_rules, NULL)) 1591 dev_warn(dev, "Error adding VSI prune list\n"); 1592 kfree(s_rule); 1593 } 1594 1595 /** 1596 * ice_lag_del_prune_list - Remove secondary's vsi from primary's prune list 1597 * @lag: primary interface's ice_lag struct 1598 * @event_pf: PF struct for unlinking interface 1599 */ 1600 static void ice_lag_del_prune_list(struct ice_lag *lag, struct ice_pf *event_pf) 1601 { 1602 u16 vsi_num, vsi_idx, rule_buf_sz, vsi_list_id, num_vsi = 1; 1603 struct ice_sw_rule_vsi_list *s_rule; 1604 struct device *dev; 1605 1606 dev = ice_pf_to_dev(lag->pf); 1607 vsi_num = event_pf->vsi[0]->vsi_num; 1608 vsi_idx = lag->pf->vsi[0]->idx; 1609 1610 if (!ice_find_vsi_list_entry(&lag->pf->hw, ICE_SW_LKUP_VLAN, 1611 vsi_idx, &vsi_list_id)) { 1612 dev_warn(dev, "Could not locate prune list when unwinding SRIOV LAG\n"); 1613 return; 1614 } 1615 1616 rule_buf_sz = (u16)ICE_SW_RULE_VSI_LIST_SIZE(s_rule, num_vsi); 1617 s_rule = kzalloc(rule_buf_sz, GFP_KERNEL); 1618 if (!s_rule) { 1619 dev_warn(dev, "Error allocating prune list when unwinding SRIOV LAG\n"); 1620 return; 1621 } 1622 1623 s_rule->hdr.type = cpu_to_le16(ICE_AQC_SW_RULES_T_PRUNE_LIST_CLEAR); 1624 s_rule->index = cpu_to_le16(vsi_list_id); 1625 s_rule->number_vsi = cpu_to_le16(num_vsi); 1626 s_rule->vsi[0] = cpu_to_le16(vsi_num); 1627 1628 if (ice_aq_sw_rules(&event_pf->hw, (struct ice_aqc_sw_rules *)s_rule, 1629 rule_buf_sz, 1, ice_aqc_opc_update_sw_rules, NULL)) 1630 dev_warn(dev, "Error clearing VSI prune list\n"); 1631 1632 kfree(s_rule); 1633 } 1634 1635 /** 1636 * ice_lag_init_feature_support_flag - Check for package and NVM support for LAG 1637 * @pf: PF struct 1638 */ 1639 static void ice_lag_init_feature_support_flag(struct ice_pf *pf) 1640 { 1641 struct ice_hw_common_caps *caps; 1642 1643 caps = &pf->hw.dev_caps.common_cap; 1644 if (caps->roce_lag) 1645 ice_set_feature_support(pf, ICE_F_ROCE_LAG); 1646 else 1647 ice_clear_feature_support(pf, ICE_F_ROCE_LAG); 1648 1649 if (caps->sriov_lag && ice_pkg_has_lport_extract(&pf->hw)) 1650 ice_set_feature_support(pf, ICE_F_SRIOV_LAG); 1651 else 1652 ice_clear_feature_support(pf, ICE_F_SRIOV_LAG); 1653 1654 if (caps->sriov_aa_lag && ice_pkg_has_lport_extract(&pf->hw)) 1655 ice_set_feature_support(pf, ICE_F_SRIOV_AA_LAG); 1656 else 1657 ice_clear_feature_support(pf, ICE_F_SRIOV_AA_LAG); 1658 } 1659 1660 /** 1661 * ice_lag_changeupper_event - handle LAG changeupper event 1662 * @lag: LAG info struct 1663 * @ptr: opaque pointer data 1664 */ 1665 static void ice_lag_changeupper_event(struct ice_lag *lag, void *ptr) 1666 { 1667 struct netdev_notifier_changeupper_info *info = ptr; 1668 struct ice_lag *primary_lag; 1669 struct net_device *netdev; 1670 1671 netdev = netdev_notifier_info_to_dev(ptr); 1672 1673 /* not for this netdev */ 1674 if (netdev != lag->netdev) 1675 return; 1676 1677 primary_lag = ice_lag_find_primary(lag); 1678 if (info->linking) { 1679 lag->upper_netdev = info->upper_dev; 1680 /* If there is not already a primary interface in the LAG, 1681 * then mark this one as primary. 1682 */ 1683 if (!primary_lag) { 1684 lag->primary = true; 1685 if (!ice_is_switchdev_running(lag->pf)) 1686 return; 1687 1688 /* Configure primary's SWID to be shared */ 1689 ice_lag_primary_swid(lag, true); 1690 primary_lag = lag; 1691 lag->bond_lport_pri = lag->pf->hw.port_info->lport; 1692 lag->bond_lport_sec = ICE_LAG_INVALID_PORT; 1693 lag->port_bitmap = 0; 1694 } else { 1695 u16 swid; 1696 1697 if (!ice_is_switchdev_running(primary_lag->pf)) 1698 return; 1699 1700 swid = primary_lag->pf->hw.port_info->sw_id; 1701 ice_lag_set_swid(swid, lag, true); 1702 ice_lag_add_prune_list(primary_lag, lag->pf); 1703 primary_lag->bond_lport_sec = 1704 lag->pf->hw.port_info->lport; 1705 } 1706 /* add filter for primary control packets */ 1707 ice_lag_cfg_lp_fltr(lag, true, true); 1708 } else { 1709 if (!primary_lag && lag->primary) 1710 primary_lag = lag; 1711 1712 if (primary_lag) { 1713 for (int i = 0; i < ICE_MAX_SRIOV_VFS; i++) { 1714 if (primary_lag->sec_vf[i]) { 1715 ice_vsi_release(primary_lag->sec_vf[i]); 1716 primary_lag->sec_vf[i] = NULL; 1717 } 1718 } 1719 } 1720 1721 if (!lag->primary) { 1722 ice_lag_set_swid(0, lag, false); 1723 if (primary_lag) 1724 primary_lag->bond_lport_sec = 1725 ICE_LAG_INVALID_PORT; 1726 } else { 1727 if (primary_lag && lag->primary) { 1728 ice_lag_primary_swid(lag, false); 1729 ice_lag_del_prune_list(primary_lag, lag->pf); 1730 } 1731 } 1732 /* remove filter for control packets */ 1733 ice_lag_cfg_lp_fltr(lag, false, !lag->bond_aa); 1734 } 1735 } 1736 1737 /** 1738 * ice_lag_monitor_link - monitor interfaces entering/leaving the aggregate 1739 * @lag: lag info struct 1740 * @ptr: opaque data containing notifier event 1741 * 1742 * This function only operates after a primary has been set. 1743 */ 1744 static void ice_lag_monitor_link(struct ice_lag *lag, void *ptr) 1745 { 1746 struct netdev_notifier_changeupper_info *info = ptr; 1747 struct ice_hw *prim_hw, *active_hw; 1748 struct net_device *event_netdev; 1749 struct ice_pf *pf; 1750 u8 prim_port; 1751 1752 if (!lag->primary) 1753 return; 1754 1755 event_netdev = netdev_notifier_info_to_dev(ptr); 1756 if (!netif_is_same_ice(lag->pf, event_netdev)) 1757 return; 1758 1759 if (info->upper_dev != lag->upper_netdev) 1760 return; 1761 1762 if (info->linking) 1763 return; 1764 1765 pf = lag->pf; 1766 prim_hw = &pf->hw; 1767 prim_port = prim_hw->port_info->lport; 1768 1769 /* Since there are only two interfaces allowed in SRIOV+LAG, if 1770 * one port is leaving, then nodes need to be on primary 1771 * interface. 1772 */ 1773 if (lag->bond_aa) { 1774 struct ice_netdev_priv *e_ndp; 1775 struct ice_pf *e_pf; 1776 1777 e_ndp = netdev_priv(event_netdev); 1778 e_pf = e_ndp->vsi->back; 1779 1780 if (lag->bond_lport_pri != ICE_LAG_INVALID_PORT && 1781 lag->port_bitmap & ICE_LAGS_M) { 1782 lag->port_bitmap &= ~ICE_LAGS_M; 1783 ice_lag_aa_failover(lag, ICE_LAGP_IDX, e_pf); 1784 lag->bond_lport_sec = ICE_LAG_INVALID_PORT; 1785 } 1786 } else { 1787 if (prim_port != lag->active_port && 1788 lag->active_port != ICE_LAG_INVALID_PORT) { 1789 active_hw = ice_lag_find_hw_by_lport(lag, 1790 lag->active_port); 1791 ice_lag_reclaim_vf_nodes(lag, active_hw); 1792 lag->active_port = ICE_LAG_INVALID_PORT; 1793 } 1794 } 1795 } 1796 1797 /** 1798 * ice_lag_monitor_act_bkup - keep track of which port is active in A/B LAG 1799 * @lag: lag info struct 1800 * @b_info: bonding info 1801 * @event_netdev: net_device got target netdev 1802 * 1803 * This function is for the primary PF to monitor changes in which port is 1804 * active and handle changes for SRIOV VF functionality 1805 */ 1806 static void ice_lag_monitor_act_bkup(struct ice_lag *lag, 1807 struct netdev_bonding_info *b_info, 1808 struct net_device *event_netdev) 1809 { 1810 struct ice_netdev_priv *event_np; 1811 struct ice_pf *pf, *event_pf; 1812 u8 prim_port, event_port; 1813 1814 pf = lag->pf; 1815 if (!pf) 1816 return; 1817 1818 event_np = netdev_priv(event_netdev); 1819 event_pf = event_np->vsi->back; 1820 event_port = event_pf->hw.port_info->lport; 1821 prim_port = pf->hw.port_info->lport; 1822 1823 if (!b_info->slave.state) { 1824 /* if no port is currently active, then nodes and filters exist 1825 * on primary port, check if we need to move them 1826 */ 1827 if (lag->active_port == ICE_LAG_INVALID_PORT) { 1828 if (event_port != prim_port) 1829 ice_lag_move_vf_nodes(lag, prim_port, 1830 event_port); 1831 lag->active_port = event_port; 1832 ice_lag_config_eswitch(lag, event_netdev); 1833 return; 1834 } 1835 1836 /* active port is already set and is current event port */ 1837 if (lag->active_port == event_port) 1838 return; 1839 /* new active port */ 1840 ice_lag_move_vf_nodes(lag, lag->active_port, event_port); 1841 lag->active_port = event_port; 1842 ice_lag_config_eswitch(lag, event_netdev); 1843 } else { 1844 /* port not set as currently active (e.g. new active port 1845 * has already claimed the nodes and filters 1846 */ 1847 if (lag->active_port != event_port) 1848 return; 1849 /* This is the case when neither port is active (both link down) 1850 * Link down on the bond - set active port to invalid and move 1851 * nodes and filters back to primary if not already there 1852 */ 1853 if (event_port != prim_port) 1854 ice_lag_move_vf_nodes(lag, event_port, prim_port); 1855 lag->active_port = ICE_LAG_INVALID_PORT; 1856 } 1857 } 1858 1859 /** 1860 * ice_lag_aa_clear_spoof - adjust the placeholder VSI spoofing for A/A LAG 1861 * @vsi: placeholder VSI to adjust 1862 */ 1863 static void ice_lag_aa_clear_spoof(struct ice_vsi *vsi) 1864 { 1865 ice_vsi_update_security(vsi, ice_vsi_ctx_clear_antispoof); 1866 } 1867 1868 /** 1869 * ice_lag_monitor_act_act - Keep track of active ports in A/A LAG 1870 * @lag: lag struct for primary interface 1871 * @b_info: bonding_info for event 1872 * @event_netdev: net_device for target netdev 1873 */ 1874 static void ice_lag_monitor_act_act(struct ice_lag *lag, 1875 struct netdev_bonding_info *b_info, 1876 struct net_device *event_netdev) 1877 { 1878 struct ice_netdev_priv *event_np; 1879 u8 prim_port, event_port; 1880 struct ice_pf *event_pf; 1881 1882 event_np = netdev_priv(event_netdev); 1883 event_pf = event_np->vsi->back; 1884 event_port = event_pf->hw.port_info->lport; 1885 prim_port = lag->pf->hw.port_info->lport; 1886 1887 if (b_info->slave.link == BOND_LINK_UP) { 1888 /* Port is coming up */ 1889 if (prim_port == event_port) { 1890 /* Processing event for primary interface */ 1891 if (lag->bond_lport_pri == ICE_LAG_INVALID_PORT) 1892 return; 1893 1894 if (!(lag->port_bitmap & ICE_LAGP_M)) { 1895 /* Primary port was not marked up before, move 1896 * some|all VF queues to it and mark as up 1897 */ 1898 lag->port_bitmap |= ICE_LAGP_M; 1899 ice_lag_aa_failover(lag, ICE_LAGP_IDX, event_pf); 1900 } 1901 } else { 1902 if (lag->bond_lport_sec == ICE_LAG_INVALID_PORT) 1903 return; 1904 1905 /* Create placeholder VSIs on secondary PF. 1906 * The placeholder is necessary so that we have 1907 * an element that represents the VF on the secondary 1908 * interface's scheduling tree. This will be a tree 1909 * root for scheduling nodes when they are moved to 1910 * the secondary interface. 1911 */ 1912 if (!lag->sec_vf[0]) { 1913 struct ice_vsi_cfg_params params = {}; 1914 struct ice_vsi *nvsi; 1915 struct ice_vf *vf; 1916 unsigned int bkt; 1917 1918 params.type = ICE_VSI_VF; 1919 params.port_info = event_pf->hw.port_info; 1920 params.flags = ICE_VSI_FLAG_INIT; 1921 1922 ice_for_each_vf(lag->pf, bkt, vf) { 1923 params.vf = vf; 1924 nvsi = ice_vsi_setup(event_pf, 1925 ¶ms); 1926 ice_lag_aa_clear_spoof(nvsi); 1927 lag->sec_vf[vf->vf_id] = nvsi; 1928 } 1929 } 1930 1931 if (!(lag->port_bitmap & ICE_LAGS_M)) { 1932 /* Secondary port was not marked up before, 1933 * move some|all VF queues to it and mark as up 1934 */ 1935 lag->port_bitmap |= ICE_LAGS_M; 1936 ice_lag_aa_failover(lag, ICE_LAGS_IDX, event_pf); 1937 } 1938 } 1939 } else { 1940 /* Port is going down */ 1941 if (prim_port == event_port) { 1942 lag->port_bitmap &= ~ICE_LAGP_M; 1943 ice_lag_aa_failover(lag, ICE_LAGS_IDX, event_pf); 1944 } else { 1945 lag->port_bitmap &= ~ICE_LAGS_M; 1946 ice_lag_aa_failover(lag, ICE_LAGP_IDX, event_pf); 1947 } 1948 } 1949 } 1950 1951 /** 1952 * ice_lag_monitor_info - Calls relevant A/A or A/B monitoring function 1953 * @lag: lag info struct 1954 * @ptr: opaque data containing notifier event 1955 * 1956 * This function is for the primary PF to monitor changes in which port is 1957 * active and handle changes for SRIOV VF functionality 1958 */ 1959 static void ice_lag_monitor_info(struct ice_lag *lag, void *ptr) 1960 { 1961 struct netdev_notifier_bonding_info *info = ptr; 1962 struct net_device *event_netdev, *event_upper; 1963 struct netdev_bonding_info *bonding_info; 1964 1965 if (!lag->primary) 1966 return; 1967 1968 event_netdev = netdev_notifier_info_to_dev(ptr); 1969 bonding_info = &info->bonding_info; 1970 rcu_read_lock(); 1971 event_upper = netdev_master_upper_dev_get_rcu(event_netdev); 1972 rcu_read_unlock(); 1973 if (!netif_is_ice(event_netdev) || event_upper != lag->upper_netdev) 1974 return; 1975 1976 if (lag->bond_aa) 1977 ice_lag_monitor_act_act(lag, bonding_info, event_netdev); 1978 else 1979 ice_lag_monitor_act_bkup(lag, bonding_info, event_netdev); 1980 } 1981 /** 1982 * ice_lag_chk_comp - evaluate bonded interface for feature support 1983 * @lag: lag info struct 1984 * @ptr: opaque data for netdev event info 1985 */ 1986 static bool 1987 ice_lag_chk_comp(struct ice_lag *lag, void *ptr) 1988 { 1989 struct netdev_notifier_bonding_info *info = ptr; 1990 struct net_device *event_netdev, *event_upper; 1991 struct netdev_bonding_info *bonding_info; 1992 struct list_head *tmp; 1993 struct device *dev; 1994 int count = 0; 1995 1996 /* All members need to know if bond A/A or A/B */ 1997 bonding_info = &info->bonding_info; 1998 lag->bond_mode = bonding_info->master.bond_mode; 1999 if (lag->bond_mode != BOND_MODE_ACTIVEBACKUP) 2000 lag->bond_aa = true; 2001 else 2002 lag->bond_aa = false; 2003 2004 if (!lag->primary) 2005 return true; 2006 2007 event_netdev = netdev_notifier_info_to_dev(ptr); 2008 rcu_read_lock(); 2009 event_upper = netdev_master_upper_dev_get_rcu(event_netdev); 2010 rcu_read_unlock(); 2011 if (event_upper != lag->upper_netdev) 2012 return true; 2013 2014 dev = ice_pf_to_dev(lag->pf); 2015 2016 /* only supporting switchdev mode for SRIOV VF LAG. 2017 * primary interface has to be in switchdev mode 2018 */ 2019 if (!ice_is_switchdev_running(lag->pf)) { 2020 dev_info(dev, "Primary interface not in switchdev mode - VF LAG disabled\n"); 2021 return false; 2022 } 2023 2024 if (lag->bond_aa && !ice_is_feature_supported(lag->pf, 2025 ICE_F_SRIOV_AA_LAG)) 2026 return false; 2027 2028 list_for_each(tmp, lag->netdev_head) { 2029 struct ice_dcbx_cfg *dcb_cfg, *peer_dcb_cfg; 2030 struct ice_lag_netdev_list *entry; 2031 struct ice_netdev_priv *peer_np; 2032 struct net_device *peer_netdev; 2033 struct ice_vsi *vsi, *peer_vsi; 2034 struct ice_pf *peer_pf; 2035 2036 entry = list_entry(tmp, struct ice_lag_netdev_list, node); 2037 peer_netdev = entry->netdev; 2038 if (!netif_is_ice(peer_netdev)) { 2039 dev_info(dev, "Found %s non-ice netdev in LAG - VF LAG disabled\n", 2040 netdev_name(peer_netdev)); 2041 return false; 2042 } 2043 2044 count++; 2045 if (count > 2) { 2046 dev_info(dev, "Found more than two netdevs in LAG - VF LAG disabled\n"); 2047 return false; 2048 } 2049 2050 peer_np = netdev_priv(peer_netdev); 2051 vsi = ice_get_main_vsi(lag->pf); 2052 peer_vsi = peer_np->vsi; 2053 if (lag->pf->pdev->bus != peer_vsi->back->pdev->bus || 2054 lag->pf->pdev->slot != peer_vsi->back->pdev->slot) { 2055 dev_info(dev, "Found %s on different device in LAG - VF LAG disabled\n", 2056 netdev_name(peer_netdev)); 2057 return false; 2058 } 2059 2060 dcb_cfg = &vsi->port_info->qos_cfg.local_dcbx_cfg; 2061 peer_dcb_cfg = &peer_vsi->port_info->qos_cfg.local_dcbx_cfg; 2062 if (memcmp(dcb_cfg, peer_dcb_cfg, 2063 sizeof(struct ice_dcbx_cfg))) { 2064 dev_info(dev, "Found %s with different DCB in LAG - VF LAG disabled\n", 2065 netdev_name(peer_netdev)); 2066 return false; 2067 } 2068 2069 peer_pf = peer_vsi->back; 2070 if (test_bit(ICE_FLAG_FW_LLDP_AGENT, peer_pf->flags)) { 2071 dev_warn(dev, "Found %s with FW LLDP agent active - VF LAG disabled\n", 2072 netdev_name(peer_netdev)); 2073 return false; 2074 } 2075 } 2076 2077 return true; 2078 } 2079 2080 /** 2081 * ice_lag_unregister - handle netdev unregister events 2082 * @lag: LAG info struct 2083 * @event_netdev: netdev struct for target of notifier event 2084 */ 2085 static void 2086 ice_lag_unregister(struct ice_lag *lag, struct net_device *event_netdev) 2087 { 2088 struct ice_netdev_priv *np; 2089 struct ice_pf *event_pf; 2090 struct ice_lag *p_lag; 2091 2092 p_lag = ice_lag_find_primary(lag); 2093 np = netdev_priv(event_netdev); 2094 event_pf = np->vsi->back; 2095 2096 if (p_lag) { 2097 if (p_lag->active_port != p_lag->pf->hw.port_info->lport && 2098 p_lag->active_port != ICE_LAG_INVALID_PORT) { 2099 struct ice_hw *active_hw; 2100 2101 active_hw = ice_lag_find_hw_by_lport(lag, 2102 p_lag->active_port); 2103 if (active_hw) 2104 ice_lag_reclaim_vf_nodes(p_lag, active_hw); 2105 lag->active_port = ICE_LAG_INVALID_PORT; 2106 } 2107 } 2108 2109 /* primary processing for primary */ 2110 if (lag->primary && lag->netdev == event_netdev) 2111 ice_lag_primary_swid(lag, false); 2112 2113 /* primary processing for secondary */ 2114 if (lag->primary && lag->netdev != event_netdev) 2115 ice_lag_del_prune_list(lag, event_pf); 2116 2117 /* secondary processing for secondary */ 2118 if (!lag->primary && lag->netdev == event_netdev) 2119 ice_lag_set_swid(0, lag, false); 2120 } 2121 2122 /** 2123 * ice_lag_monitor_rdma - set and clear rdma functionality 2124 * @lag: pointer to lag struct 2125 * @ptr: opaque data for netdev event info 2126 */ 2127 static void 2128 ice_lag_monitor_rdma(struct ice_lag *lag, void *ptr) 2129 { 2130 struct netdev_notifier_changeupper_info *info = ptr; 2131 struct net_device *netdev; 2132 2133 netdev = netdev_notifier_info_to_dev(ptr); 2134 2135 if (netdev != lag->netdev) 2136 return; 2137 2138 if (info->linking) 2139 ice_clear_rdma_cap(lag->pf); 2140 else 2141 ice_set_rdma_cap(lag->pf); 2142 } 2143 2144 /** 2145 * ice_lag_chk_disabled_bond - monitor interfaces entering/leaving disabled bond 2146 * @lag: lag info struct 2147 * @ptr: opaque data containing event 2148 * 2149 * as interfaces enter a bond - determine if the bond is currently 2150 * SRIOV LAG compliant and flag if not. As interfaces leave the 2151 * bond, reset their compliant status. 2152 */ 2153 static void ice_lag_chk_disabled_bond(struct ice_lag *lag, void *ptr) 2154 { 2155 struct net_device *netdev = netdev_notifier_info_to_dev(ptr); 2156 struct netdev_notifier_changeupper_info *info = ptr; 2157 struct ice_lag *prim_lag; 2158 2159 if (netdev != lag->netdev) 2160 return; 2161 2162 if (info->linking) { 2163 prim_lag = ice_lag_find_primary(lag); 2164 if (prim_lag && 2165 !ice_is_feature_supported(prim_lag->pf, ICE_F_SRIOV_LAG)) { 2166 ice_clear_feature_support(lag->pf, ICE_F_SRIOV_LAG); 2167 netdev_info(netdev, "Interface added to non-compliant SRIOV LAG aggregate\n"); 2168 } 2169 } else { 2170 ice_lag_init_feature_support_flag(lag->pf); 2171 } 2172 } 2173 2174 /** 2175 * ice_lag_disable_sriov_bond - set members of bond as not supporting SRIOV LAG 2176 * @lag: primary interfaces lag struct 2177 */ 2178 static void ice_lag_disable_sriov_bond(struct ice_lag *lag) 2179 { 2180 struct ice_pf *pf = ice_netdev_to_pf(lag->netdev); 2181 2182 ice_clear_feature_support(pf, ICE_F_SRIOV_LAG); 2183 ice_clear_feature_support(pf, ICE_F_SRIOV_AA_LAG); 2184 } 2185 2186 /** 2187 * ice_lag_preset_drop_fltr - preset drop filter for A/B bonds 2188 * @lag: local lag struct 2189 * @ptr: opaque data containing event 2190 * 2191 * Sets the initial drop filter for secondary interface in an 2192 * active-backup bond 2193 */ 2194 static void ice_lag_preset_drop_fltr(struct ice_lag *lag, void *ptr) 2195 { 2196 struct net_device *netdev = netdev_notifier_info_to_dev(ptr); 2197 2198 if (netdev != lag->netdev || lag->primary || !lag->need_fltr_cfg) 2199 return; 2200 2201 ice_lag_cfg_drop_fltr(lag, true); 2202 lag->need_fltr_cfg = false; 2203 } 2204 2205 /** 2206 * ice_lag_process_event - process a task assigned to the lag_wq 2207 * @work: pointer to work_struct 2208 */ 2209 static void ice_lag_process_event(struct work_struct *work) 2210 { 2211 struct netdev_notifier_changeupper_info *info; 2212 struct ice_lag_work *lag_work; 2213 struct net_device *netdev; 2214 struct list_head *tmp, *n; 2215 struct ice_pf *pf; 2216 2217 lag_work = container_of(work, struct ice_lag_work, lag_task); 2218 pf = lag_work->lag->pf; 2219 2220 mutex_lock(&pf->lag_mutex); 2221 lag_work->lag->netdev_head = &lag_work->netdev_list.node; 2222 2223 switch (lag_work->event) { 2224 case NETDEV_CHANGEUPPER: 2225 info = &lag_work->info.changeupper_info; 2226 ice_lag_chk_disabled_bond(lag_work->lag, info); 2227 if (ice_is_feature_supported(pf, ICE_F_SRIOV_LAG)) { 2228 ice_lag_monitor_link(lag_work->lag, info); 2229 ice_lag_changeupper_event(lag_work->lag, info); 2230 ice_lag_link_unlink(lag_work->lag, info); 2231 } 2232 ice_lag_monitor_rdma(lag_work->lag, info); 2233 break; 2234 case NETDEV_BONDING_INFO: 2235 if (ice_is_feature_supported(pf, ICE_F_SRIOV_LAG)) { 2236 if (!ice_lag_chk_comp(lag_work->lag, 2237 &lag_work->info.bonding_info)) { 2238 netdev = lag_work->info.bonding_info.info.dev; 2239 ice_lag_disable_sriov_bond(lag_work->lag); 2240 ice_lag_unregister(lag_work->lag, netdev); 2241 goto lag_cleanup; 2242 } 2243 ice_lag_cfg_pf_fltrs(lag_work->lag, 2244 &lag_work->info.bonding_info); 2245 ice_lag_preset_drop_fltr(lag_work->lag, 2246 &lag_work->info.bonding_info); 2247 ice_lag_monitor_info(lag_work->lag, 2248 &lag_work->info.bonding_info); 2249 } 2250 ice_lag_info_event(lag_work->lag, &lag_work->info.bonding_info); 2251 break; 2252 case NETDEV_UNREGISTER: 2253 if (ice_is_feature_supported(pf, ICE_F_SRIOV_LAG)) { 2254 netdev = lag_work->info.bonding_info.info.dev; 2255 if ((netdev == lag_work->lag->netdev || 2256 lag_work->lag->primary) && lag_work->lag->bonded) 2257 ice_lag_unregister(lag_work->lag, netdev); 2258 } 2259 break; 2260 default: 2261 break; 2262 } 2263 2264 lag_cleanup: 2265 /* cleanup resources allocated for this work item */ 2266 list_for_each_safe(tmp, n, &lag_work->netdev_list.node) { 2267 struct ice_lag_netdev_list *entry; 2268 2269 entry = list_entry(tmp, struct ice_lag_netdev_list, node); 2270 list_del(&entry->node); 2271 kfree(entry); 2272 } 2273 lag_work->lag->netdev_head = NULL; 2274 2275 mutex_unlock(&pf->lag_mutex); 2276 2277 kfree(lag_work); 2278 } 2279 2280 /** 2281 * ice_lag_event_handler - handle LAG events from netdev 2282 * @notif_blk: notifier block registered by this netdev 2283 * @event: event type 2284 * @ptr: opaque data containing notifier event 2285 */ 2286 static int 2287 ice_lag_event_handler(struct notifier_block *notif_blk, unsigned long event, 2288 void *ptr) 2289 { 2290 struct net_device *netdev = netdev_notifier_info_to_dev(ptr); 2291 struct net_device *upper_netdev; 2292 struct ice_lag_work *lag_work; 2293 struct ice_lag *lag; 2294 2295 if (!netif_is_ice(netdev)) 2296 return NOTIFY_DONE; 2297 2298 if (event != NETDEV_CHANGEUPPER && event != NETDEV_BONDING_INFO && 2299 event != NETDEV_UNREGISTER) 2300 return NOTIFY_DONE; 2301 2302 if (!(netdev->priv_flags & IFF_BONDING)) 2303 return NOTIFY_DONE; 2304 2305 lag = container_of(notif_blk, struct ice_lag, notif_block); 2306 if (!lag->netdev) 2307 return NOTIFY_DONE; 2308 2309 if (!net_eq(dev_net(netdev), &init_net)) 2310 return NOTIFY_DONE; 2311 2312 /* This memory will be freed at the end of ice_lag_process_event */ 2313 lag_work = kzalloc(sizeof(*lag_work), GFP_KERNEL); 2314 if (!lag_work) 2315 return -ENOMEM; 2316 2317 lag_work->event_netdev = netdev; 2318 lag_work->lag = lag; 2319 lag_work->event = event; 2320 if (event == NETDEV_CHANGEUPPER) { 2321 struct netdev_notifier_changeupper_info *info = ptr; 2322 2323 upper_netdev = info->upper_dev; 2324 } else { 2325 upper_netdev = netdev_master_upper_dev_get(netdev); 2326 } 2327 2328 INIT_LIST_HEAD(&lag_work->netdev_list.node); 2329 if (upper_netdev) { 2330 struct ice_lag_netdev_list *nd_list; 2331 struct net_device *tmp_nd; 2332 2333 rcu_read_lock(); 2334 for_each_netdev_in_bond_rcu(upper_netdev, tmp_nd) { 2335 nd_list = kzalloc(sizeof(*nd_list), GFP_ATOMIC); 2336 if (!nd_list) 2337 break; 2338 2339 nd_list->netdev = tmp_nd; 2340 list_add(&nd_list->node, &lag_work->netdev_list.node); 2341 } 2342 rcu_read_unlock(); 2343 } 2344 2345 switch (event) { 2346 case NETDEV_CHANGEUPPER: 2347 lag_work->info.changeupper_info = 2348 *((struct netdev_notifier_changeupper_info *)ptr); 2349 break; 2350 case NETDEV_BONDING_INFO: 2351 lag_work->info.bonding_info = 2352 *((struct netdev_notifier_bonding_info *)ptr); 2353 break; 2354 default: 2355 lag_work->info.notifier_info = 2356 *((struct netdev_notifier_info *)ptr); 2357 break; 2358 } 2359 2360 INIT_WORK(&lag_work->lag_task, ice_lag_process_event); 2361 queue_work(ice_lag_wq, &lag_work->lag_task); 2362 2363 return NOTIFY_DONE; 2364 } 2365 2366 /** 2367 * ice_register_lag_handler - register LAG handler on netdev 2368 * @lag: LAG struct 2369 */ 2370 static int ice_register_lag_handler(struct ice_lag *lag) 2371 { 2372 struct notifier_block *notif_blk = &lag->notif_block; 2373 struct device *dev = ice_pf_to_dev(lag->pf); 2374 2375 if (!notif_blk->notifier_call) { 2376 notif_blk->notifier_call = ice_lag_event_handler; 2377 if (register_netdevice_notifier(notif_blk)) { 2378 notif_blk->notifier_call = NULL; 2379 dev_err(dev, "FAIL register LAG event handler!\n"); 2380 return -EINVAL; 2381 } 2382 dev_dbg(dev, "LAG event handler registered\n"); 2383 } 2384 return 0; 2385 } 2386 2387 /** 2388 * ice_unregister_lag_handler - unregister LAG handler on netdev 2389 * @lag: LAG struct 2390 */ 2391 static void ice_unregister_lag_handler(struct ice_lag *lag) 2392 { 2393 struct notifier_block *notif_blk = &lag->notif_block; 2394 struct device *dev = ice_pf_to_dev(lag->pf); 2395 2396 if (notif_blk->notifier_call) { 2397 unregister_netdevice_notifier(notif_blk); 2398 dev_dbg(dev, "LAG event handler unregistered\n"); 2399 } 2400 } 2401 2402 /** 2403 * ice_create_lag_recipe 2404 * @hw: pointer to HW struct 2405 * @rid: pointer to u16 to pass back recipe index 2406 * @base_recipe: recipe to base the new recipe on 2407 * @prio: priority for new recipe 2408 * 2409 * function returns 0 on error 2410 */ 2411 static int ice_create_lag_recipe(struct ice_hw *hw, u16 *rid, 2412 const u8 *base_recipe, u8 prio) 2413 { 2414 struct ice_aqc_recipe_data_elem *new_rcp; 2415 int err; 2416 2417 err = ice_alloc_recipe(hw, rid); 2418 if (err) 2419 return err; 2420 2421 new_rcp = kzalloc(ICE_RECIPE_LEN * ICE_MAX_NUM_RECIPES, GFP_KERNEL); 2422 if (!new_rcp) 2423 return -ENOMEM; 2424 2425 memcpy(new_rcp, base_recipe, ICE_RECIPE_LEN); 2426 new_rcp->content.act_ctrl_fwd_priority = prio; 2427 new_rcp->content.rid = *rid | ICE_AQ_RECIPE_ID_IS_ROOT; 2428 new_rcp->recipe_indx = *rid; 2429 bitmap_zero((unsigned long *)new_rcp->recipe_bitmap, 2430 ICE_MAX_NUM_RECIPES); 2431 set_bit(*rid, (unsigned long *)new_rcp->recipe_bitmap); 2432 2433 err = ice_aq_add_recipe(hw, new_rcp, 1, NULL); 2434 if (err) 2435 *rid = 0; 2436 2437 kfree(new_rcp); 2438 return err; 2439 } 2440 2441 /** 2442 * ice_lag_move_vf_nodes_tc_sync - move a VF's nodes for a tc during reset 2443 * @lag: primary interfaces lag struct 2444 * @dest_hw: HW struct for destination's interface 2445 * @vsi_num: VSI index in PF space 2446 * @tc: traffic class to move 2447 */ 2448 static void 2449 ice_lag_move_vf_nodes_tc_sync(struct ice_lag *lag, struct ice_hw *dest_hw, 2450 u16 vsi_num, u8 tc) 2451 { 2452 DEFINE_RAW_FLEX(struct ice_aqc_move_elem, buf, teid, 1); 2453 struct device *dev = ice_pf_to_dev(lag->pf); 2454 u16 numq, valq, num_moved, qbuf_size; 2455 u16 buf_size = __struct_size(buf); 2456 struct ice_aqc_cfg_txqs_buf *qbuf; 2457 struct ice_hw *hw = &lag->pf->hw; 2458 struct ice_sched_node *n_prt; 2459 __le32 teid, parent_teid; 2460 struct ice_vsi_ctx *ctx; 2461 u32 tmp_teid; 2462 2463 ctx = ice_get_vsi_ctx(hw, vsi_num); 2464 if (!ctx) { 2465 dev_warn(dev, "LAG rebuild failed after reset due to VSI Context failure\n"); 2466 return; 2467 } 2468 2469 if (!ctx->sched.vsi_node[tc]) 2470 return; 2471 2472 numq = ctx->num_lan_q_entries[tc]; 2473 teid = ctx->sched.vsi_node[tc]->info.node_teid; 2474 tmp_teid = le32_to_cpu(teid); 2475 parent_teid = ctx->sched.vsi_node[tc]->info.parent_teid; 2476 2477 if (!tmp_teid || !numq) 2478 return; 2479 2480 if (ice_sched_suspend_resume_elems(hw, 1, &tmp_teid, true)) 2481 dev_dbg(dev, "Problem suspending traffic during reset rebuild\n"); 2482 2483 /* reconfig queues for new port */ 2484 qbuf_size = struct_size(qbuf, queue_info, numq); 2485 qbuf = kzalloc(qbuf_size, GFP_KERNEL); 2486 if (!qbuf) { 2487 dev_warn(dev, "Failure allocating VF queue recfg buffer for reset rebuild\n"); 2488 goto resume_sync; 2489 } 2490 2491 /* add the per queue info for the reconfigure command buffer */ 2492 valq = ice_lag_qbuf_recfg(hw, qbuf, vsi_num, numq, tc); 2493 if (!valq) { 2494 dev_warn(dev, "Failure to reconfig queues for LAG reset rebuild\n"); 2495 goto sync_none; 2496 } 2497 2498 if (ice_aq_cfg_lan_txq(hw, qbuf, qbuf_size, numq, hw->port_info->lport, 2499 dest_hw->port_info->lport, 2500 ICE_AQC_Q_CFG_TC_CHNG, NULL)) { 2501 dev_warn(dev, "Failure to configure queues for LAG reset rebuild\n"); 2502 goto sync_qerr; 2503 } 2504 2505 sync_none: 2506 kfree(qbuf); 2507 2508 /* find parent in destination tree */ 2509 n_prt = ice_lag_get_sched_parent(dest_hw, tc); 2510 if (!n_prt) 2511 goto resume_sync; 2512 2513 /* Move node to new parent */ 2514 buf->hdr.src_parent_teid = parent_teid; 2515 buf->hdr.dest_parent_teid = n_prt->info.node_teid; 2516 buf->hdr.num_elems = cpu_to_le16(1); 2517 buf->hdr.mode = ICE_AQC_MOVE_ELEM_MODE_KEEP_OWN; 2518 buf->teid[0] = teid; 2519 2520 if (ice_aq_move_sched_elems(&lag->pf->hw, buf, buf_size, &num_moved)) 2521 dev_warn(dev, "Failure to move VF nodes for LAG reset rebuild\n"); 2522 else 2523 ice_sched_update_parent(n_prt, ctx->sched.vsi_node[tc]); 2524 2525 goto resume_sync; 2526 2527 sync_qerr: 2528 kfree(qbuf); 2529 2530 resume_sync: 2531 if (ice_sched_suspend_resume_elems(hw, 1, &tmp_teid, false)) 2532 dev_warn(dev, "Problem restarting traffic for LAG node reset rebuild\n"); 2533 } 2534 2535 /** 2536 * ice_lag_move_vf_nodes_sync - move vf nodes to active interface 2537 * @lag: primary interfaces lag struct 2538 * @dest_hw: lport value for currently active port 2539 * 2540 * This function is used in a reset context, outside of event handling, 2541 * to move the VF nodes to the secondary interface when that interface 2542 * is the active interface during a reset rebuild 2543 */ 2544 static void 2545 ice_lag_move_vf_nodes_sync(struct ice_lag *lag, struct ice_hw *dest_hw) 2546 { 2547 struct ice_pf *pf; 2548 int i, tc; 2549 2550 if (!lag->primary || !dest_hw) 2551 return; 2552 2553 pf = lag->pf; 2554 ice_for_each_vsi(pf, i) 2555 if (pf->vsi[i] && pf->vsi[i]->type == ICE_VSI_VF) 2556 ice_for_each_traffic_class(tc) 2557 ice_lag_move_vf_nodes_tc_sync(lag, dest_hw, i, 2558 tc); 2559 } 2560 2561 /** 2562 * ice_init_lag - initialize support for LAG 2563 * @pf: PF struct 2564 * 2565 * Alloc memory for LAG structs and initialize the elements. 2566 * Memory will be freed in ice_deinit_lag 2567 */ 2568 int ice_init_lag(struct ice_pf *pf) 2569 { 2570 struct device *dev = ice_pf_to_dev(pf); 2571 struct ice_lag *lag; 2572 struct ice_vsi *vsi; 2573 u64 recipe_bits = 0; 2574 int n, err; 2575 2576 ice_lag_init_feature_support_flag(pf); 2577 if (!ice_is_feature_supported(pf, ICE_F_SRIOV_LAG)) 2578 return 0; 2579 2580 pf->lag = kzalloc(sizeof(*lag), GFP_KERNEL); 2581 if (!pf->lag) 2582 return -ENOMEM; 2583 lag = pf->lag; 2584 2585 vsi = ice_get_main_vsi(pf); 2586 if (!vsi) { 2587 dev_err(dev, "couldn't get main vsi, link aggregation init fail\n"); 2588 err = -EIO; 2589 goto lag_error; 2590 } 2591 2592 lag->pf = pf; 2593 lag->netdev = vsi->netdev; 2594 lag->role = ICE_LAG_NONE; 2595 lag->active_port = ICE_LAG_INVALID_PORT; 2596 lag->port_bitmap = 0x0; 2597 lag->bonded = false; 2598 lag->bond_aa = false; 2599 lag->need_fltr_cfg = false; 2600 lag->upper_netdev = NULL; 2601 lag->notif_block.notifier_call = NULL; 2602 memset(lag->sec_vf, 0, sizeof(lag->sec_vf)); 2603 2604 err = ice_register_lag_handler(lag); 2605 if (err) { 2606 dev_warn(dev, "INIT LAG: Failed to register event handler\n"); 2607 goto lag_error; 2608 } 2609 2610 err = ice_create_lag_recipe(&pf->hw, &lag->pf_recipe, 2611 ice_dflt_vsi_rcp, 1); 2612 if (err) 2613 goto lag_error; 2614 2615 err = ice_create_lag_recipe(&pf->hw, &lag->lport_recipe, 2616 ice_lport_rcp, 3); 2617 if (err) 2618 goto free_rcp_res; 2619 2620 err = ice_create_lag_recipe(&pf->hw, &lag->act_act_recipe, 2621 ice_lport_rcp, 1); 2622 if (err) 2623 goto free_lport_res; 2624 2625 /* associate recipes to profiles */ 2626 for (n = 0; n < ICE_PROFID_IPV6_GTPU_IPV6_TCP_INNER; n++) { 2627 err = ice_aq_get_recipe_to_profile(&pf->hw, n, 2628 &recipe_bits, NULL); 2629 if (err) 2630 continue; 2631 2632 if (recipe_bits & BIT(ICE_SW_LKUP_DFLT)) { 2633 recipe_bits |= BIT(lag->pf_recipe) | 2634 BIT(lag->lport_recipe) | 2635 BIT(lag->act_act_recipe); 2636 ice_aq_map_recipe_to_profile(&pf->hw, n, 2637 recipe_bits, NULL); 2638 } 2639 } 2640 2641 ice_display_lag_info(lag); 2642 2643 dev_dbg(dev, "INIT LAG complete\n"); 2644 return 0; 2645 2646 free_lport_res: 2647 ice_free_hw_res(&pf->hw, ICE_AQC_RES_TYPE_RECIPE, 1, 2648 &lag->lport_recipe); 2649 2650 free_rcp_res: 2651 ice_free_hw_res(&pf->hw, ICE_AQC_RES_TYPE_RECIPE, 1, 2652 &lag->pf_recipe); 2653 lag_error: 2654 kfree(lag); 2655 pf->lag = NULL; 2656 return err; 2657 } 2658 2659 /** 2660 * ice_deinit_lag - Clean up LAG 2661 * @pf: PF struct 2662 * 2663 * Clean up kernel LAG info and free memory 2664 * This function is meant to only be called on driver remove/shutdown 2665 */ 2666 void ice_deinit_lag(struct ice_pf *pf) 2667 { 2668 struct ice_lag *lag = pf->lag; 2669 2670 if (!lag) 2671 return; 2672 2673 if (lag->pf) 2674 ice_unregister_lag_handler(lag); 2675 2676 flush_workqueue(ice_lag_wq); 2677 2678 ice_free_hw_res(&pf->hw, ICE_AQC_RES_TYPE_RECIPE, 1, 2679 &pf->lag->pf_recipe); 2680 ice_free_hw_res(&pf->hw, ICE_AQC_RES_TYPE_RECIPE, 1, 2681 &pf->lag->lport_recipe); 2682 2683 kfree(lag); 2684 2685 pf->lag = NULL; 2686 } 2687 2688 /** 2689 * ice_lag_rebuild - rebuild lag resources after reset 2690 * @pf: pointer to local pf struct 2691 * 2692 * PF resets are promoted to CORER resets when interface in an aggregate. This 2693 * means that we need to rebuild the PF resources for the interface. Since 2694 * this will happen outside the normal event processing, need to acquire the lag 2695 * lock. 2696 * 2697 * This function will also evaluate the VF resources if this is the primary 2698 * interface. 2699 */ 2700 void ice_lag_rebuild(struct ice_pf *pf) 2701 { 2702 struct ice_lag_netdev_list ndlist; 2703 struct ice_lag *lag, *prim_lag; 2704 u8 act_port, loc_port; 2705 2706 if (!pf->lag || !pf->lag->bonded) 2707 return; 2708 2709 mutex_lock(&pf->lag_mutex); 2710 2711 lag = pf->lag; 2712 if (lag->primary) { 2713 prim_lag = lag; 2714 } else { 2715 ice_lag_build_netdev_list(lag, &ndlist); 2716 prim_lag = ice_lag_find_primary(lag); 2717 } 2718 2719 if (!prim_lag) { 2720 dev_dbg(ice_pf_to_dev(pf), "No primary interface in aggregate, can't rebuild\n"); 2721 goto lag_rebuild_out; 2722 } 2723 2724 act_port = prim_lag->active_port; 2725 loc_port = lag->pf->hw.port_info->lport; 2726 2727 /* configure SWID for this port */ 2728 if (lag->primary) { 2729 ice_lag_primary_swid(lag, true); 2730 } else { 2731 ice_lag_set_swid(prim_lag->pf->hw.port_info->sw_id, lag, true); 2732 ice_lag_add_prune_list(prim_lag, pf); 2733 if (act_port == loc_port) 2734 ice_lag_move_vf_nodes_sync(prim_lag, &pf->hw); 2735 } 2736 2737 if (!lag->bond_aa) { 2738 ice_lag_cfg_lp_fltr(lag, true, true); 2739 if (lag->pf_rx_rule_id) 2740 if (ice_lag_cfg_dflt_fltr(lag, true)) 2741 dev_err(ice_pf_to_dev(pf), "Error adding default VSI rule in rebuild\n"); 2742 } else { 2743 ice_lag_cfg_lp_fltr(lag, true, false); 2744 } 2745 2746 2747 ice_clear_rdma_cap(pf); 2748 lag_rebuild_out: 2749 ice_lag_destroy_netdev_list(lag, &ndlist); 2750 mutex_unlock(&pf->lag_mutex); 2751 } 2752 2753 /** 2754 * ice_lag_is_switchdev_running 2755 * @pf: pointer to PF structure 2756 * 2757 * Check if switchdev is running on any of the interfaces connected to lag. 2758 */ 2759 bool ice_lag_is_switchdev_running(struct ice_pf *pf) 2760 { 2761 struct ice_lag *lag = pf->lag; 2762 struct net_device *tmp_nd; 2763 2764 if (!ice_is_feature_supported(pf, ICE_F_SRIOV_LAG) || 2765 !lag || !lag->upper_netdev) 2766 return false; 2767 2768 rcu_read_lock(); 2769 for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) { 2770 struct ice_netdev_priv *priv = netdev_priv(tmp_nd); 2771 2772 if (!netif_is_ice(tmp_nd) || !priv || !priv->vsi || 2773 !priv->vsi->back) 2774 continue; 2775 2776 if (ice_is_switchdev_running(priv->vsi->back)) { 2777 rcu_read_unlock(); 2778 return true; 2779 } 2780 } 2781 rcu_read_unlock(); 2782 2783 return false; 2784 } 2785