Lines Matching refs:erp_table

45 	struct mlxsw_sp_acl_erp_table *erp_table;  member
72 (*erp_create)(struct mlxsw_sp_acl_erp_table *erp_table,
74 void (*erp_destroy)(struct mlxsw_sp_acl_erp_table *erp_table,
79 mlxsw_sp_acl_erp_mask_create(struct mlxsw_sp_acl_erp_table *erp_table,
82 mlxsw_sp_acl_erp_mask_destroy(struct mlxsw_sp_acl_erp_table *erp_table,
85 mlxsw_sp_acl_erp_second_mask_create(struct mlxsw_sp_acl_erp_table *erp_table,
88 mlxsw_sp_acl_erp_second_mask_destroy(struct mlxsw_sp_acl_erp_table *erp_table,
91 mlxsw_sp_acl_erp_first_mask_create(struct mlxsw_sp_acl_erp_table *erp_table,
94 mlxsw_sp_acl_erp_first_mask_destroy(struct mlxsw_sp_acl_erp_table *erp_table,
97 mlxsw_sp_acl_erp_no_mask_destroy(struct mlxsw_sp_acl_erp_table *erp_table,
121 mlxsw_sp_acl_erp_table_is_used(const struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_table_is_used() argument
123 return erp_table->ops != &erp_single_mask_ops && in mlxsw_sp_acl_erp_table_is_used()
124 erp_table->ops != &erp_no_mask_ops; in mlxsw_sp_acl_erp_table_is_used()
130 return erp->index % erp->erp_table->erp_core->num_erp_banks; in mlxsw_sp_acl_erp_bank_get()
134 mlxsw_sp_acl_erp_table_entry_size(const struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_table_entry_size() argument
136 struct mlxsw_sp_acl_atcam_region *aregion = erp_table->aregion; in mlxsw_sp_acl_erp_table_entry_size()
137 struct mlxsw_sp_acl_erp_core *erp_core = erp_table->erp_core; in mlxsw_sp_acl_erp_table_entry_size()
142 static int mlxsw_sp_acl_erp_id_get(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_id_get() argument
147 id = find_first_zero_bit(erp_table->erp_id_bitmap, in mlxsw_sp_acl_erp_id_get()
150 __set_bit(id, erp_table->erp_id_bitmap); in mlxsw_sp_acl_erp_id_get()
158 static void mlxsw_sp_acl_erp_id_put(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_id_put() argument
161 __clear_bit(id, erp_table->erp_id_bitmap); in mlxsw_sp_acl_erp_id_put()
181 mlxsw_sp_acl_erp_master_mask_update(struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_master_mask_update() argument
183 struct mlxsw_sp_acl_tcam_region *region = erp_table->aregion->region; in mlxsw_sp_acl_erp_master_mask_update()
190 bitmap_to_arr32((u32 *) master_mask, erp_table->master_mask.bitmap, in mlxsw_sp_acl_erp_master_mask_update()
197 mlxsw_sp_acl_erp_master_mask_set(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_master_mask_set() argument
208 &erp_table->master_mask); in mlxsw_sp_acl_erp_master_mask_set()
210 err = mlxsw_sp_acl_erp_master_mask_update(erp_table); in mlxsw_sp_acl_erp_master_mask_set()
219 &erp_table->master_mask); in mlxsw_sp_acl_erp_master_mask_set()
224 mlxsw_sp_acl_erp_master_mask_clear(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_master_mask_clear() argument
235 &erp_table->master_mask); in mlxsw_sp_acl_erp_master_mask_clear()
237 err = mlxsw_sp_acl_erp_master_mask_update(erp_table); in mlxsw_sp_acl_erp_master_mask_clear()
246 &erp_table->master_mask); in mlxsw_sp_acl_erp_master_mask_clear()
251 mlxsw_sp_acl_erp_generic_create(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_generic_create() argument
261 err = mlxsw_sp_acl_erp_id_get(erp_table, &erp->id); in mlxsw_sp_acl_erp_generic_create()
266 list_add(&erp->list, &erp_table->atcam_erps_list); in mlxsw_sp_acl_erp_generic_create()
267 erp_table->num_atcam_erps++; in mlxsw_sp_acl_erp_generic_create()
268 erp->erp_table = erp_table; in mlxsw_sp_acl_erp_generic_create()
270 err = mlxsw_sp_acl_erp_master_mask_set(erp_table, &erp->key); in mlxsw_sp_acl_erp_generic_create()
277 erp_table->num_atcam_erps--; in mlxsw_sp_acl_erp_generic_create()
279 mlxsw_sp_acl_erp_id_put(erp_table, erp->id); in mlxsw_sp_acl_erp_generic_create()
288 struct mlxsw_sp_acl_erp_table *erp_table = erp->erp_table; in mlxsw_sp_acl_erp_generic_destroy() local
290 mlxsw_sp_acl_erp_master_mask_clear(erp_table, &erp->key); in mlxsw_sp_acl_erp_generic_destroy()
291 erp_table->num_atcam_erps--; in mlxsw_sp_acl_erp_generic_destroy()
293 mlxsw_sp_acl_erp_id_put(erp_table, erp->id); in mlxsw_sp_acl_erp_generic_destroy()
337 mlxsw_sp_acl_erp_table_master_rp(struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_table_master_rp() argument
339 if (!list_is_singular(&erp_table->atcam_erps_list)) in mlxsw_sp_acl_erp_table_master_rp()
342 return list_first_entry(&erp_table->atcam_erps_list, in mlxsw_sp_acl_erp_table_master_rp()
346 static int mlxsw_sp_acl_erp_index_get(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_index_get() argument
351 index = find_first_zero_bit(erp_table->erp_index_bitmap, in mlxsw_sp_acl_erp_index_get()
352 erp_table->num_max_atcam_erps); in mlxsw_sp_acl_erp_index_get()
353 if (index < erp_table->num_max_atcam_erps) { in mlxsw_sp_acl_erp_index_get()
354 __set_bit(index, erp_table->erp_index_bitmap); in mlxsw_sp_acl_erp_index_get()
362 static void mlxsw_sp_acl_erp_index_put(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_index_put() argument
365 __clear_bit(index, erp_table->erp_index_bitmap); in mlxsw_sp_acl_erp_index_put()
369 mlxsw_sp_acl_erp_table_locate(const struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_table_locate() argument
373 unsigned int entry_size = mlxsw_sp_acl_erp_table_entry_size(erp_table); in mlxsw_sp_acl_erp_table_locate()
374 struct mlxsw_sp_acl_erp_core *erp_core = erp_table->erp_core; in mlxsw_sp_acl_erp_table_locate()
379 *p_erpt_index = erp_table->base_index + row * entry_size; in mlxsw_sp_acl_erp_table_locate()
383 mlxsw_sp_acl_erp_table_erp_add(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_table_erp_add() argument
386 struct mlxsw_sp *mlxsw_sp = erp_table->erp_core->mlxsw_sp; in mlxsw_sp_acl_erp_table_erp_add()
391 mlxsw_sp_acl_erp_table_locate(erp_table, erp, &erpt_bank, &erpt_index); in mlxsw_sp_acl_erp_table_erp_add()
392 key_size = (enum mlxsw_reg_perpt_key_size) erp_table->aregion->type; in mlxsw_sp_acl_erp_table_erp_add()
394 0, erp_table->base_index, erp->index, in mlxsw_sp_acl_erp_table_erp_add()
396 mlxsw_reg_perpt_erp_vector_pack(perpt_pl, erp_table->erp_index_bitmap, in mlxsw_sp_acl_erp_table_erp_add()
405 struct mlxsw_sp_acl_erp_table *erp_table = erp->erp_table; in mlxsw_sp_acl_erp_table_erp_del() local
406 struct mlxsw_sp *mlxsw_sp = erp_table->erp_core->mlxsw_sp; in mlxsw_sp_acl_erp_table_erp_del()
411 mlxsw_sp_acl_erp_table_locate(erp_table, erp, &erpt_bank, &erpt_index); in mlxsw_sp_acl_erp_table_erp_del()
412 key_size = (enum mlxsw_reg_perpt_key_size) erp_table->aregion->type; in mlxsw_sp_acl_erp_table_erp_del()
414 0, erp_table->base_index, erp->index, empty_mask); in mlxsw_sp_acl_erp_table_erp_del()
415 mlxsw_reg_perpt_erp_vector_pack(perpt_pl, erp_table->erp_index_bitmap, in mlxsw_sp_acl_erp_table_erp_del()
422 mlxsw_sp_acl_erp_table_enable(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_table_enable() argument
425 struct mlxsw_sp_acl_tcam_region *region = erp_table->aregion->region; in mlxsw_sp_acl_erp_table_enable()
426 struct mlxsw_sp *mlxsw_sp = erp_table->erp_core->mlxsw_sp; in mlxsw_sp_acl_erp_table_enable()
430 erp_table->base_index, 0); in mlxsw_sp_acl_erp_table_enable()
431 mlxsw_reg_pererp_erp_vector_pack(pererp_pl, erp_table->erp_index_bitmap, in mlxsw_sp_acl_erp_table_enable()
438 mlxsw_sp_acl_erp_table_disable(struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_table_disable() argument
440 struct mlxsw_sp_acl_tcam_region *region = erp_table->aregion->region; in mlxsw_sp_acl_erp_table_disable()
441 struct mlxsw_sp *mlxsw_sp = erp_table->erp_core->mlxsw_sp; in mlxsw_sp_acl_erp_table_disable()
445 master_rp = mlxsw_sp_acl_erp_table_master_rp(erp_table); in mlxsw_sp_acl_erp_table_disable()
456 mlxsw_sp_acl_erp_table_relocate(struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_table_relocate() argument
461 list_for_each_entry(erp, &erp_table->atcam_erps_list, list) { in mlxsw_sp_acl_erp_table_relocate()
462 err = mlxsw_sp_acl_erp_table_erp_add(erp_table, erp); in mlxsw_sp_acl_erp_table_relocate()
470 list_for_each_entry_continue_reverse(erp, &erp_table->atcam_erps_list, in mlxsw_sp_acl_erp_table_relocate()
477 mlxsw_sp_acl_erp_table_expand(struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_table_expand() argument
479 unsigned int num_erps, old_num_erps = erp_table->num_max_atcam_erps; in mlxsw_sp_acl_erp_table_expand()
480 struct mlxsw_sp_acl_erp_core *erp_core = erp_table->erp_core; in mlxsw_sp_acl_erp_table_expand()
481 unsigned long old_base_index = erp_table->base_index; in mlxsw_sp_acl_erp_table_expand()
482 bool ctcam_le = erp_table->num_ctcam_erps > 0; in mlxsw_sp_acl_erp_table_expand()
485 if (erp_table->num_atcam_erps < erp_table->num_max_atcam_erps) in mlxsw_sp_acl_erp_table_expand()
488 if (erp_table->num_max_atcam_erps == MLXSW_SP_ACL_ERP_MAX_PER_REGION) in mlxsw_sp_acl_erp_table_expand()
493 erp_table->aregion->type, in mlxsw_sp_acl_erp_table_expand()
494 &erp_table->base_index); in mlxsw_sp_acl_erp_table_expand()
497 erp_table->num_max_atcam_erps = num_erps; in mlxsw_sp_acl_erp_table_expand()
499 err = mlxsw_sp_acl_erp_table_relocate(erp_table); in mlxsw_sp_acl_erp_table_expand()
503 err = mlxsw_sp_acl_erp_table_enable(erp_table, ctcam_le); in mlxsw_sp_acl_erp_table_expand()
508 erp_table->aregion->type, old_base_index); in mlxsw_sp_acl_erp_table_expand()
514 erp_table->num_max_atcam_erps = old_num_erps; in mlxsw_sp_acl_erp_table_expand()
516 erp_table->aregion->type, in mlxsw_sp_acl_erp_table_expand()
517 erp_table->base_index); in mlxsw_sp_acl_erp_table_expand()
518 erp_table->base_index = old_base_index; in mlxsw_sp_acl_erp_table_expand()
523 mlxsw_acl_erp_table_bf_add(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_acl_erp_table_bf_add() argument
526 struct mlxsw_sp_acl_atcam_region *aregion = erp_table->aregion; in mlxsw_acl_erp_table_bf_add()
533 erp_table->erp_core->bf, in mlxsw_acl_erp_table_bf_add()
545 erp_table->erp_core->bf, in mlxsw_acl_erp_table_bf_add()
551 mlxsw_acl_erp_table_bf_del(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_acl_erp_table_bf_del() argument
554 struct mlxsw_sp_acl_atcam_region *aregion = erp_table->aregion; in mlxsw_acl_erp_table_bf_del()
560 erp_table->erp_core->bf, in mlxsw_acl_erp_table_bf_del()
565 mlxsw_sp_acl_erp_region_table_trans(struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_region_table_trans() argument
567 struct mlxsw_sp_acl_erp_core *erp_core = erp_table->erp_core; in mlxsw_sp_acl_erp_region_table_trans()
573 erp_table->aregion->type, in mlxsw_sp_acl_erp_region_table_trans()
574 &erp_table->base_index); in mlxsw_sp_acl_erp_region_table_trans()
577 erp_table->num_max_atcam_erps = erp_core->num_erp_banks; in mlxsw_sp_acl_erp_region_table_trans()
582 master_rp = mlxsw_sp_acl_erp_table_master_rp(erp_table); in mlxsw_sp_acl_erp_region_table_trans()
592 __set_bit(master_rp->index, erp_table->erp_index_bitmap); in mlxsw_sp_acl_erp_region_table_trans()
594 err = mlxsw_sp_acl_erp_table_erp_add(erp_table, master_rp); in mlxsw_sp_acl_erp_region_table_trans()
602 err = mlxsw_acl_erp_table_bf_add(erp_table, master_rp); in mlxsw_sp_acl_erp_region_table_trans()
606 err = mlxsw_sp_acl_erp_table_enable(erp_table, false); in mlxsw_sp_acl_erp_region_table_trans()
613 mlxsw_acl_erp_table_bf_del(erp_table, master_rp); in mlxsw_sp_acl_erp_region_table_trans()
617 __clear_bit(master_rp->index, erp_table->erp_index_bitmap); in mlxsw_sp_acl_erp_region_table_trans()
619 mlxsw_sp_acl_erp_table_free(erp_core, erp_table->num_max_atcam_erps, in mlxsw_sp_acl_erp_region_table_trans()
620 erp_table->aregion->type, in mlxsw_sp_acl_erp_region_table_trans()
621 erp_table->base_index); in mlxsw_sp_acl_erp_region_table_trans()
626 mlxsw_sp_acl_erp_region_master_mask_trans(struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_region_master_mask_trans() argument
628 struct mlxsw_sp_acl_erp_core *erp_core = erp_table->erp_core; in mlxsw_sp_acl_erp_region_master_mask_trans()
631 mlxsw_sp_acl_erp_table_disable(erp_table); in mlxsw_sp_acl_erp_region_master_mask_trans()
632 master_rp = mlxsw_sp_acl_erp_table_master_rp(erp_table); in mlxsw_sp_acl_erp_region_master_mask_trans()
635 mlxsw_acl_erp_table_bf_del(erp_table, master_rp); in mlxsw_sp_acl_erp_region_master_mask_trans()
637 __clear_bit(master_rp->index, erp_table->erp_index_bitmap); in mlxsw_sp_acl_erp_region_master_mask_trans()
638 mlxsw_sp_acl_erp_table_free(erp_core, erp_table->num_max_atcam_erps, in mlxsw_sp_acl_erp_region_master_mask_trans()
639 erp_table->aregion->type, in mlxsw_sp_acl_erp_region_master_mask_trans()
640 erp_table->base_index); in mlxsw_sp_acl_erp_region_master_mask_trans()
644 mlxsw_sp_acl_erp_region_erp_add(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_region_erp_add() argument
647 struct mlxsw_sp_acl_tcam_region *region = erp_table->aregion->region; in mlxsw_sp_acl_erp_region_erp_add()
648 struct mlxsw_sp *mlxsw_sp = erp_table->erp_core->mlxsw_sp; in mlxsw_sp_acl_erp_region_erp_add()
649 bool ctcam_le = erp_table->num_ctcam_erps > 0; in mlxsw_sp_acl_erp_region_erp_add()
653 erp_table->base_index, 0); in mlxsw_sp_acl_erp_region_erp_add()
654 mlxsw_reg_pererp_erp_vector_pack(pererp_pl, erp_table->erp_index_bitmap, in mlxsw_sp_acl_erp_region_erp_add()
663 struct mlxsw_sp_acl_erp_table *erp_table = erp->erp_table; in mlxsw_sp_acl_erp_region_erp_del() local
664 struct mlxsw_sp_acl_tcam_region *region = erp_table->aregion->region; in mlxsw_sp_acl_erp_region_erp_del()
665 struct mlxsw_sp *mlxsw_sp = erp_table->erp_core->mlxsw_sp; in mlxsw_sp_acl_erp_region_erp_del()
666 bool ctcam_le = erp_table->num_ctcam_erps > 0; in mlxsw_sp_acl_erp_region_erp_del()
670 erp_table->base_index, 0); in mlxsw_sp_acl_erp_region_erp_del()
671 mlxsw_reg_pererp_erp_vector_pack(pererp_pl, erp_table->erp_index_bitmap, in mlxsw_sp_acl_erp_region_erp_del()
679 mlxsw_sp_acl_erp_region_ctcam_enable(struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_region_ctcam_enable() argument
682 if (erp_table->num_ctcam_erps > 1) in mlxsw_sp_acl_erp_region_ctcam_enable()
685 return mlxsw_sp_acl_erp_table_enable(erp_table, true); in mlxsw_sp_acl_erp_region_ctcam_enable()
689 mlxsw_sp_acl_erp_region_ctcam_disable(struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_region_ctcam_disable() argument
692 if (erp_table->num_ctcam_erps > 1) in mlxsw_sp_acl_erp_region_ctcam_disable()
695 mlxsw_sp_acl_erp_table_enable(erp_table, false); in mlxsw_sp_acl_erp_region_ctcam_disable()
699 __mlxsw_sp_acl_erp_table_other_inc(struct mlxsw_sp_acl_erp_table *erp_table, in __mlxsw_sp_acl_erp_table_other_inc() argument
707 if (!mlxsw_sp_acl_erp_table_is_used(erp_table)) { in __mlxsw_sp_acl_erp_table_other_inc()
708 err = mlxsw_sp_acl_erp_region_table_trans(erp_table); in __mlxsw_sp_acl_erp_table_other_inc()
714 if (erp_table->ops != &erp_multiple_masks_ops) in __mlxsw_sp_acl_erp_table_other_inc()
715 erp_table->ops = &erp_multiple_masks_ops; in __mlxsw_sp_acl_erp_table_other_inc()
722 static int mlxsw_sp_acl_erp_ctcam_inc(struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_ctcam_inc() argument
724 return __mlxsw_sp_acl_erp_table_other_inc(erp_table, in mlxsw_sp_acl_erp_ctcam_inc()
725 &erp_table->num_ctcam_erps); in mlxsw_sp_acl_erp_ctcam_inc()
728 static int mlxsw_sp_acl_erp_delta_inc(struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_delta_inc() argument
730 return __mlxsw_sp_acl_erp_table_other_inc(erp_table, in mlxsw_sp_acl_erp_delta_inc()
731 &erp_table->num_deltas); in mlxsw_sp_acl_erp_delta_inc()
735 __mlxsw_sp_acl_erp_table_other_dec(struct mlxsw_sp_acl_erp_table *erp_table, in __mlxsw_sp_acl_erp_table_other_dec() argument
744 if (erp_table->num_ctcam_erps > 0 || erp_table->num_deltas > 0) in __mlxsw_sp_acl_erp_table_other_dec()
747 switch (erp_table->num_atcam_erps) { in __mlxsw_sp_acl_erp_table_other_dec()
753 erp_table->ops = &erp_two_masks_ops; in __mlxsw_sp_acl_erp_table_other_dec()
761 mlxsw_sp_acl_erp_region_master_mask_trans(erp_table); in __mlxsw_sp_acl_erp_table_other_dec()
762 erp_table->ops = &erp_single_mask_ops; in __mlxsw_sp_acl_erp_table_other_dec()
768 mlxsw_sp_acl_erp_table_disable(erp_table); in __mlxsw_sp_acl_erp_table_other_dec()
769 mlxsw_sp_acl_erp_table_free(erp_table->erp_core, in __mlxsw_sp_acl_erp_table_other_dec()
770 erp_table->num_max_atcam_erps, in __mlxsw_sp_acl_erp_table_other_dec()
771 erp_table->aregion->type, in __mlxsw_sp_acl_erp_table_other_dec()
772 erp_table->base_index); in __mlxsw_sp_acl_erp_table_other_dec()
773 erp_table->ops = &erp_no_mask_ops; in __mlxsw_sp_acl_erp_table_other_dec()
780 static void mlxsw_sp_acl_erp_ctcam_dec(struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_ctcam_dec() argument
782 __mlxsw_sp_acl_erp_table_other_dec(erp_table, in mlxsw_sp_acl_erp_ctcam_dec()
783 &erp_table->num_ctcam_erps); in mlxsw_sp_acl_erp_ctcam_dec()
786 static void mlxsw_sp_acl_erp_delta_dec(struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_delta_dec() argument
788 __mlxsw_sp_acl_erp_table_other_dec(erp_table, in mlxsw_sp_acl_erp_delta_dec()
789 &erp_table->num_deltas); in mlxsw_sp_acl_erp_delta_dec()
793 mlxsw_sp_acl_erp_ctcam_mask_create(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_ctcam_mask_create() argument
807 err = mlxsw_sp_acl_erp_ctcam_inc(erp_table); in mlxsw_sp_acl_erp_ctcam_mask_create()
811 erp->erp_table = erp_table; in mlxsw_sp_acl_erp_ctcam_mask_create()
813 err = mlxsw_sp_acl_erp_master_mask_set(erp_table, &erp->key); in mlxsw_sp_acl_erp_ctcam_mask_create()
817 err = mlxsw_sp_acl_erp_region_ctcam_enable(erp_table); in mlxsw_sp_acl_erp_ctcam_mask_create()
824 mlxsw_sp_acl_erp_master_mask_clear(erp_table, &erp->key); in mlxsw_sp_acl_erp_ctcam_mask_create()
826 mlxsw_sp_acl_erp_ctcam_dec(erp_table); in mlxsw_sp_acl_erp_ctcam_mask_create()
835 struct mlxsw_sp_acl_erp_table *erp_table = erp->erp_table; in mlxsw_sp_acl_erp_ctcam_mask_destroy() local
837 mlxsw_sp_acl_erp_region_ctcam_disable(erp_table); in mlxsw_sp_acl_erp_ctcam_mask_destroy()
838 mlxsw_sp_acl_erp_master_mask_clear(erp_table, &erp->key); in mlxsw_sp_acl_erp_ctcam_mask_destroy()
839 mlxsw_sp_acl_erp_ctcam_dec(erp_table); in mlxsw_sp_acl_erp_ctcam_mask_destroy()
844 mlxsw_sp_acl_erp_mask_create(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_mask_create() argument
851 return mlxsw_sp_acl_erp_ctcam_mask_create(erp_table, key); in mlxsw_sp_acl_erp_mask_create()
854 err = mlxsw_sp_acl_erp_table_expand(erp_table); in mlxsw_sp_acl_erp_mask_create()
858 erp = mlxsw_sp_acl_erp_generic_create(erp_table, key); in mlxsw_sp_acl_erp_mask_create()
862 err = mlxsw_sp_acl_erp_index_get(erp_table, &erp->index); in mlxsw_sp_acl_erp_mask_create()
866 err = mlxsw_sp_acl_erp_table_erp_add(erp_table, erp); in mlxsw_sp_acl_erp_mask_create()
870 err = mlxsw_sp_acl_erp_region_erp_add(erp_table, erp); in mlxsw_sp_acl_erp_mask_create()
874 erp_table->ops = &erp_multiple_masks_ops; in mlxsw_sp_acl_erp_mask_create()
881 mlxsw_sp_acl_erp_index_put(erp_table, erp->index); in mlxsw_sp_acl_erp_mask_create()
888 mlxsw_sp_acl_erp_mask_destroy(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_mask_destroy() argument
896 mlxsw_sp_acl_erp_index_put(erp_table, erp->index); in mlxsw_sp_acl_erp_mask_destroy()
899 if (erp_table->num_atcam_erps == 2 && erp_table->num_ctcam_erps == 0 && in mlxsw_sp_acl_erp_mask_destroy()
900 erp_table->num_deltas == 0) in mlxsw_sp_acl_erp_mask_destroy()
901 erp_table->ops = &erp_two_masks_ops; in mlxsw_sp_acl_erp_mask_destroy()
905 mlxsw_sp_acl_erp_second_mask_create(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_second_mask_create() argument
912 return mlxsw_sp_acl_erp_ctcam_mask_create(erp_table, key); in mlxsw_sp_acl_erp_second_mask_create()
915 err = mlxsw_sp_acl_erp_region_table_trans(erp_table); in mlxsw_sp_acl_erp_second_mask_create()
919 erp = mlxsw_sp_acl_erp_generic_create(erp_table, key); in mlxsw_sp_acl_erp_second_mask_create()
925 err = mlxsw_sp_acl_erp_index_get(erp_table, &erp->index); in mlxsw_sp_acl_erp_second_mask_create()
929 err = mlxsw_sp_acl_erp_table_erp_add(erp_table, erp); in mlxsw_sp_acl_erp_second_mask_create()
933 err = mlxsw_sp_acl_erp_region_erp_add(erp_table, erp); in mlxsw_sp_acl_erp_second_mask_create()
937 erp_table->ops = &erp_two_masks_ops; in mlxsw_sp_acl_erp_second_mask_create()
944 mlxsw_sp_acl_erp_index_put(erp_table, erp->index); in mlxsw_sp_acl_erp_second_mask_create()
948 mlxsw_sp_acl_erp_region_master_mask_trans(erp_table); in mlxsw_sp_acl_erp_second_mask_create()
953 mlxsw_sp_acl_erp_second_mask_destroy(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_second_mask_destroy() argument
961 mlxsw_sp_acl_erp_index_put(erp_table, erp->index); in mlxsw_sp_acl_erp_second_mask_destroy()
964 mlxsw_sp_acl_erp_region_master_mask_trans(erp_table); in mlxsw_sp_acl_erp_second_mask_destroy()
966 erp_table->ops = &erp_single_mask_ops; in mlxsw_sp_acl_erp_second_mask_destroy()
970 mlxsw_sp_acl_erp_first_mask_create(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_first_mask_create() argument
978 erp = mlxsw_sp_acl_erp_generic_create(erp_table, key); in mlxsw_sp_acl_erp_first_mask_create()
982 erp_table->ops = &erp_single_mask_ops; in mlxsw_sp_acl_erp_first_mask_create()
988 mlxsw_sp_acl_erp_first_mask_destroy(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_first_mask_destroy() argument
992 erp_table->ops = &erp_no_mask_ops; in mlxsw_sp_acl_erp_first_mask_destroy()
996 mlxsw_sp_acl_erp_no_mask_destroy(struct mlxsw_sp_acl_erp_table *erp_table, in mlxsw_sp_acl_erp_no_mask_destroy() argument
1006 struct mlxsw_sp_acl_erp_table *erp_table = aregion->erp_table; in mlxsw_sp_acl_erp_mask_get() local
1012 mutex_lock(&erp_table->objagg_lock); in mlxsw_sp_acl_erp_mask_get()
1013 objagg_obj = objagg_obj_get(erp_table->objagg, &key); in mlxsw_sp_acl_erp_mask_get()
1014 mutex_unlock(&erp_table->objagg_lock); in mlxsw_sp_acl_erp_mask_get()
1024 struct mlxsw_sp_acl_erp_table *erp_table = aregion->erp_table; in mlxsw_sp_acl_erp_mask_put() local
1026 mutex_lock(&erp_table->objagg_lock); in mlxsw_sp_acl_erp_mask_put()
1027 objagg_obj_put(erp_table->objagg, objagg_obj); in mlxsw_sp_acl_erp_mask_put()
1028 mutex_unlock(&erp_table->objagg_lock); in mlxsw_sp_acl_erp_mask_put()
1040 if (!mlxsw_sp_acl_erp_table_is_used(erp->erp_table)) in mlxsw_sp_acl_erp_bf_insert()
1045 erp->erp_table->erp_core->bf, in mlxsw_sp_acl_erp_bf_insert()
1058 if (!mlxsw_sp_acl_erp_table_is_used(erp->erp_table)) in mlxsw_sp_acl_erp_bf_remove()
1063 erp->erp_table->erp_core->bf, in mlxsw_sp_acl_erp_bf_remove()
1235 struct mlxsw_sp_acl_erp_table *erp_table = aregion->erp_table; in mlxsw_sp_acl_erp_delta_create() local
1255 err = mlxsw_sp_acl_erp_delta_inc(erp_table); in mlxsw_sp_acl_erp_delta_create()
1260 err = mlxsw_sp_acl_erp_master_mask_set(erp_table, &delta->key); in mlxsw_sp_acl_erp_delta_create()
1267 mlxsw_sp_acl_erp_delta_dec(erp_table); in mlxsw_sp_acl_erp_delta_create()
1277 struct mlxsw_sp_acl_erp_table *erp_table = aregion->erp_table; in mlxsw_sp_acl_erp_delta_destroy() local
1279 mlxsw_sp_acl_erp_master_mask_clear(erp_table, &delta->key); in mlxsw_sp_acl_erp_delta_destroy()
1280 mlxsw_sp_acl_erp_delta_dec(erp_table); in mlxsw_sp_acl_erp_delta_destroy()
1288 struct mlxsw_sp_acl_erp_table *erp_table = aregion->erp_table; in mlxsw_sp_acl_erp_root_create() local
1295 return erp_table->ops->erp_create(erp_table, key); in mlxsw_sp_acl_erp_root_create()
1301 struct mlxsw_sp_acl_erp_table *erp_table = aregion->erp_table; in mlxsw_sp_acl_erp_root_destroy() local
1303 erp_table->ops->erp_destroy(erp_table, root_priv); in mlxsw_sp_acl_erp_root_destroy()
1320 struct mlxsw_sp_acl_erp_table *erp_table; in mlxsw_sp_acl_erp_table_create() local
1323 erp_table = kzalloc(sizeof(*erp_table), GFP_KERNEL); in mlxsw_sp_acl_erp_table_create()
1324 if (!erp_table) in mlxsw_sp_acl_erp_table_create()
1327 erp_table->objagg = objagg_create(&mlxsw_sp_acl_erp_objagg_ops, in mlxsw_sp_acl_erp_table_create()
1329 if (IS_ERR(erp_table->objagg)) { in mlxsw_sp_acl_erp_table_create()
1330 err = PTR_ERR(erp_table->objagg); in mlxsw_sp_acl_erp_table_create()
1334 erp_table->erp_core = aregion->atcam->erp_core; in mlxsw_sp_acl_erp_table_create()
1335 erp_table->ops = &erp_no_mask_ops; in mlxsw_sp_acl_erp_table_create()
1336 INIT_LIST_HEAD(&erp_table->atcam_erps_list); in mlxsw_sp_acl_erp_table_create()
1337 erp_table->aregion = aregion; in mlxsw_sp_acl_erp_table_create()
1338 mutex_init(&erp_table->objagg_lock); in mlxsw_sp_acl_erp_table_create()
1340 return erp_table; in mlxsw_sp_acl_erp_table_create()
1343 kfree(erp_table); in mlxsw_sp_acl_erp_table_create()
1348 mlxsw_sp_acl_erp_table_destroy(struct mlxsw_sp_acl_erp_table *erp_table) in mlxsw_sp_acl_erp_table_destroy() argument
1350 WARN_ON(!list_empty(&erp_table->atcam_erps_list)); in mlxsw_sp_acl_erp_table_destroy()
1351 mutex_destroy(&erp_table->objagg_lock); in mlxsw_sp_acl_erp_table_destroy()
1352 objagg_destroy(erp_table->objagg); in mlxsw_sp_acl_erp_table_destroy()
1353 kfree(erp_table); in mlxsw_sp_acl_erp_table_destroy()
1382 struct mlxsw_sp_acl_erp_table *erp_table = aregion->erp_table; in mlxsw_sp_acl_erp_hints_check() local
1389 mutex_lock(&erp_table->objagg_lock); in mlxsw_sp_acl_erp_hints_check()
1390 ostats = objagg_stats_get(erp_table->objagg); in mlxsw_sp_acl_erp_hints_check()
1391 mutex_unlock(&erp_table->objagg_lock); in mlxsw_sp_acl_erp_hints_check()
1419 struct mlxsw_sp_acl_erp_table *erp_table = aregion->erp_table; in mlxsw_sp_acl_erp_rehash_hints_get() local
1425 mutex_lock(&erp_table->objagg_lock); in mlxsw_sp_acl_erp_rehash_hints_get()
1426 hints = objagg_hints_get(erp_table->objagg, in mlxsw_sp_acl_erp_rehash_hints_get()
1428 mutex_unlock(&erp_table->objagg_lock); in mlxsw_sp_acl_erp_rehash_hints_get()
1459 struct mlxsw_sp_acl_erp_table *erp_table; in mlxsw_sp_acl_erp_region_init() local
1463 erp_table = mlxsw_sp_acl_erp_table_create(aregion, hints); in mlxsw_sp_acl_erp_region_init()
1464 if (IS_ERR(erp_table)) in mlxsw_sp_acl_erp_region_init()
1465 return PTR_ERR(erp_table); in mlxsw_sp_acl_erp_region_init()
1466 aregion->erp_table = erp_table; in mlxsw_sp_acl_erp_region_init()
1482 mlxsw_sp_acl_erp_table_destroy(erp_table); in mlxsw_sp_acl_erp_region_init()
1488 mlxsw_sp_acl_erp_table_destroy(aregion->erp_table); in mlxsw_sp_acl_erp_region_fini()