mc_record 32 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c int (*entry_add)(struct mlxsw_sp_nve_mc_record *mc_record, mc_record 35 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c void (*entry_del)(const struct mlxsw_sp_nve_mc_record *mc_record, mc_record 37 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c void (*entry_set)(const struct mlxsw_sp_nve_mc_record *mc_record, mc_record 40 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c bool (*entry_compare)(const struct mlxsw_sp_nve_mc_record *mc_record, mc_record 86 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_ipv4_entry_add(struct mlxsw_sp_nve_mc_record *mc_record, mc_record 96 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_ipv4_entry_del(const struct mlxsw_sp_nve_mc_record *mc_record, mc_record 102 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_ipv4_entry_set(const struct mlxsw_sp_nve_mc_record *mc_record, mc_record 112 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_ipv4_entry_compare(const struct mlxsw_sp_nve_mc_record *mc_record, mc_record 129 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_ipv6_entry_add(struct mlxsw_sp_nve_mc_record *mc_record, mc_record 139 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_ipv6_entry_del(const struct mlxsw_sp_nve_mc_record *mc_record, mc_record 145 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_ipv6_entry_set(const struct mlxsw_sp_nve_mc_record *mc_record, mc_record 155 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_ipv6_entry_compare(const struct mlxsw_sp_nve_mc_record *mc_record, mc_record 267 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve_mc_record *mc_record; mc_record 270 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record = kzalloc(struct_size(mc_record, entries, num_max_entries), mc_record 272 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c if (!mc_record) mc_record 276 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c &mc_record->kvdl_index); mc_record 280 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->ops = mlxsw_sp_nve_mc_record_ops_arr[proto]; mc_record 281 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->mlxsw_sp = mlxsw_sp; mc_record 282 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->mc_list = mc_list; mc_record 283 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->proto = proto; mc_record 284 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c list_add_tail(&mc_record->list, &mc_list->records_list); mc_record 286 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c return mc_record; mc_record 289 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c kfree(mc_record); mc_record 294 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_destroy(struct mlxsw_sp_nve_mc_record *mc_record) mc_record 296 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp *mlxsw_sp = mc_record->mlxsw_sp; mc_record 298 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c list_del(&mc_record->list); mc_record 300 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->kvdl_index); mc_record 301 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c WARN_ON(mc_record->num_entries); mc_record 302 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c kfree(mc_record); mc_record 310 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve_mc_record *mc_record; mc_record 312 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c list_for_each_entry_reverse(mc_record, &mc_list->records_list, list) { mc_record 313 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c unsigned int num_entries = mc_record->num_entries; mc_record 316 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c if (mc_record->proto == proto && mc_record 318 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c return mc_record; mc_record 325 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_put(struct mlxsw_sp_nve_mc_record *mc_record) mc_record 327 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c if (mc_record->num_entries != 0) mc_record 330 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_destroy(mc_record); mc_record 334 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_free_entry_find(struct mlxsw_sp_nve_mc_record *mc_record) mc_record 336 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve *nve = mc_record->mlxsw_sp->nve; mc_record 340 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c num_max_entries = nve->num_max_mc_entries[mc_record->proto]; mc_record 342 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c if (mc_record->entries[i].valid) mc_record 344 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c return &mc_record->entries[i]; mc_record 351 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_refresh(struct mlxsw_sp_nve_mc_record *mc_record) mc_record 353 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c enum mlxsw_reg_tnumt_record_type type = mc_record->ops->type; mc_record 354 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve_mc_list *mc_list = mc_record->mc_list; mc_record 355 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp *mlxsw_sp = mc_record->mlxsw_sp; mc_record 363 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c if (!list_is_last(&mc_record->list, &mc_list->records_list)) { mc_record 366 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c next_record = list_next_entry(mc_record, list); mc_record 372 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->kvdl_index, next_valid, mc_record 373 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c next_kvdl_index, mc_record->num_entries); mc_record 375 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c num_max_entries = mlxsw_sp->nve->num_max_mc_entries[mc_record->proto]; mc_record 379 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_entry = &mc_record->entries[i]; mc_record 382 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->ops->entry_set(mc_record, mc_entry, tnumt_pl, mc_record 386 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c WARN_ON(num_entries != mc_record->num_entries); mc_record 392 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_is_first(struct mlxsw_sp_nve_mc_record *mc_record) mc_record 394 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve_mc_list *mc_list = mc_record->mc_list; mc_record 400 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c return mc_record == first_record; mc_record 404 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_entry_find(struct mlxsw_sp_nve_mc_record *mc_record, mc_record 407 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve *nve = mc_record->mlxsw_sp->nve; mc_record 411 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c num_max_entries = nve->num_max_mc_entries[mc_record->proto]; mc_record 415 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_entry = &mc_record->entries[i]; mc_record 418 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c if (mc_record->ops->entry_compare(mc_record, mc_entry, addr)) mc_record 426 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_ip_add(struct mlxsw_sp_nve_mc_record *mc_record, mc_record 432 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_entry = mlxsw_sp_nve_mc_free_entry_find(mc_record); mc_record 436 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c err = mc_record->ops->entry_add(mc_record, mc_entry, addr); mc_record 439 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->num_entries++; mc_record 442 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c err = mlxsw_sp_nve_mc_record_refresh(mc_record); mc_record 449 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c if (mc_record->num_entries != 1 || mc_record 450 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_is_first(mc_record)) mc_record 453 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c err = mlxsw_sp_nve_mc_record_refresh(list_prev_entry(mc_record, list)); mc_record 462 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->num_entries--; mc_record 463 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->ops->entry_del(mc_record, mc_entry); mc_record 468 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_entry_del(struct mlxsw_sp_nve_mc_record *mc_record, mc_record 471 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve_mc_list *mc_list = mc_record->mc_list; mc_record 474 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->num_entries--; mc_record 479 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c if (mc_record->num_entries != 0) { mc_record 480 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_refresh(mc_record); mc_record 481 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->ops->entry_del(mc_record, mc_entry); mc_record 491 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c if (!mlxsw_sp_nve_mc_record_is_first(mc_record)) { mc_record 494 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c prev_record = list_prev_entry(mc_record, list); mc_record 495 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c list_del(&mc_record->list); mc_record 497 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c list_add_tail(&mc_record->list, &mc_list->records_list); mc_record 498 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->ops->entry_del(mc_record, mc_entry); mc_record 507 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c if (mlxsw_sp_nve_mc_record_is_first(mc_record) && mc_record 511 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c next_record = list_next_entry(mc_record, list); mc_record 512 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c swap(mc_record->kvdl_index, next_record->kvdl_index); mc_record 514 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->ops->entry_del(mc_record, mc_entry); mc_record 521 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record->ops->entry_del(mc_record, mc_entry); mc_record 530 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve_mc_record *mc_record; mc_record 532 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c list_for_each_entry(mc_record, &mc_list->records_list, list) { mc_record 533 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c if (mc_record->proto != proto) mc_record 536 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c *mc_entry = mlxsw_sp_nve_mc_entry_find(mc_record, addr); mc_record 538 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c return mc_record; mc_record 549 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve_mc_record *mc_record; mc_record 552 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record = mlxsw_sp_nve_mc_record_get(mlxsw_sp, mc_list, proto); mc_record 553 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c if (IS_ERR(mc_record)) mc_record 554 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c return PTR_ERR(mc_record); mc_record 556 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c err = mlxsw_sp_nve_mc_record_ip_add(mc_record, addr); mc_record 563 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_put(mc_record); mc_record 572 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve_mc_record *mc_record; mc_record 575 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record = mlxsw_sp_nve_mc_record_find(mc_list, proto, addr, mc_record 577 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c if (!mc_record) mc_record 580 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_entry_del(mc_record, mc_entry); mc_record 581 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_put(mc_record); mc_record 588 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve_mc_record *mc_record; mc_record 597 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record = list_first_entry(&mc_list->records_list, mc_record 600 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c return mlxsw_sp_fid_nve_flood_index_set(fid, mc_record->kvdl_index); mc_record 607 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve_mc_record *mc_record; mc_record 615 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mc_record = list_first_entry(&mc_list->records_list, mc_record 617 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c if (mc_record->num_entries != 1) mc_record 673 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_delete(struct mlxsw_sp_nve_mc_record *mc_record) mc_record 675 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve *nve = mc_record->mlxsw_sp->nve; mc_record 679 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c num_max_entries = nve->num_max_mc_entries[mc_record->proto]; mc_record 681 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve_mc_entry *mc_entry = &mc_record->entries[i]; mc_record 685 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_entry_del(mc_record, mc_entry); mc_record 688 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c WARN_ON(mc_record->num_entries); mc_record 689 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_put(mc_record); mc_record 695 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c struct mlxsw_sp_nve_mc_record *mc_record, *tmp; mc_record 709 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c list_for_each_entry_safe(mc_record, tmp, &mc_list->records_list, list) mc_record 710 drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c mlxsw_sp_nve_mc_record_delete(mc_record);