Lines Matching refs:fid

79 	void (*setup)(struct mlxsw_sp_fid *fid, const void *arg);
80 int (*configure)(struct mlxsw_sp_fid *fid);
81 void (*deconfigure)(struct mlxsw_sp_fid *fid);
82 int (*index_alloc)(struct mlxsw_sp_fid *fid, const void *arg,
84 bool (*compare)(const struct mlxsw_sp_fid *fid,
86 int (*port_vid_map)(struct mlxsw_sp_fid *fid,
88 void (*port_vid_unmap)(struct mlxsw_sp_fid *fid,
90 int (*vni_set)(struct mlxsw_sp_fid *fid);
91 void (*vni_clear)(struct mlxsw_sp_fid *fid);
92 int (*nve_flood_index_set)(struct mlxsw_sp_fid *fid);
93 void (*nve_flood_index_clear)(struct mlxsw_sp_fid *fid);
94 void (*fdb_clear_offload)(const struct mlxsw_sp_fid *fid,
96 int (*vid_to_fid_rif_update)(const struct mlxsw_sp_fid *fid,
143 struct mlxsw_sp_fid *fid; in mlxsw_sp_fid_lookup_by_index() local
145 fid = rhashtable_lookup_fast(&mlxsw_sp->fid_core->fid_ht, &fid_index, in mlxsw_sp_fid_lookup_by_index()
147 if (fid) in mlxsw_sp_fid_lookup_by_index()
148 refcount_inc(&fid->ref_count); in mlxsw_sp_fid_lookup_by_index()
150 return fid; in mlxsw_sp_fid_lookup_by_index()
153 int mlxsw_sp_fid_nve_ifindex(const struct mlxsw_sp_fid *fid, int *nve_ifindex) in mlxsw_sp_fid_nve_ifindex() argument
155 if (!fid->vni_valid) in mlxsw_sp_fid_nve_ifindex()
158 *nve_ifindex = fid->nve_ifindex; in mlxsw_sp_fid_nve_ifindex()
163 int mlxsw_sp_fid_nve_type(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_nve_type() argument
166 if (!fid->vni_valid) in mlxsw_sp_fid_nve_type()
169 *p_type = fid->nve_type; in mlxsw_sp_fid_nve_type()
177 struct mlxsw_sp_fid *fid; in mlxsw_sp_fid_lookup_by_vni() local
179 fid = rhashtable_lookup_fast(&mlxsw_sp->fid_core->vni_ht, &vni, in mlxsw_sp_fid_lookup_by_vni()
181 if (fid) in mlxsw_sp_fid_lookup_by_vni()
182 refcount_inc(&fid->ref_count); in mlxsw_sp_fid_lookup_by_vni()
184 return fid; in mlxsw_sp_fid_lookup_by_vni()
187 int mlxsw_sp_fid_vni(const struct mlxsw_sp_fid *fid, __be32 *vni) in mlxsw_sp_fid_vni() argument
189 if (!fid->vni_valid) in mlxsw_sp_fid_vni()
192 *vni = fid->vni; in mlxsw_sp_fid_vni()
197 int mlxsw_sp_fid_nve_flood_index_set(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_nve_flood_index_set() argument
200 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_nve_flood_index_set()
204 if (WARN_ON(fid->nve_flood_index_valid)) in mlxsw_sp_fid_nve_flood_index_set()
207 fid->nve_flood_index = nve_flood_index; in mlxsw_sp_fid_nve_flood_index_set()
208 fid->nve_flood_index_valid = true; in mlxsw_sp_fid_nve_flood_index_set()
209 err = ops->nve_flood_index_set(fid); in mlxsw_sp_fid_nve_flood_index_set()
216 fid->nve_flood_index_valid = false; in mlxsw_sp_fid_nve_flood_index_set()
220 void mlxsw_sp_fid_nve_flood_index_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_nve_flood_index_clear() argument
222 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_nve_flood_index_clear()
225 if (WARN_ON(!fid->nve_flood_index_valid)) in mlxsw_sp_fid_nve_flood_index_clear()
228 fid->nve_flood_index_valid = false; in mlxsw_sp_fid_nve_flood_index_clear()
229 ops->nve_flood_index_clear(fid); in mlxsw_sp_fid_nve_flood_index_clear()
232 bool mlxsw_sp_fid_nve_flood_index_is_set(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_nve_flood_index_is_set() argument
234 return fid->nve_flood_index_valid; in mlxsw_sp_fid_nve_flood_index_is_set()
237 int mlxsw_sp_fid_vni_set(struct mlxsw_sp_fid *fid, enum mlxsw_sp_nve_type type, in mlxsw_sp_fid_vni_set() argument
240 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_vni_set()
245 if (WARN_ON(fid->vni_valid)) in mlxsw_sp_fid_vni_set()
248 fid->nve_type = type; in mlxsw_sp_fid_vni_set()
249 fid->nve_ifindex = nve_ifindex; in mlxsw_sp_fid_vni_set()
250 fid->vni = vni; in mlxsw_sp_fid_vni_set()
252 &fid->vni_ht_node, in mlxsw_sp_fid_vni_set()
257 fid->vni_valid = true; in mlxsw_sp_fid_vni_set()
258 err = ops->vni_set(fid); in mlxsw_sp_fid_vni_set()
265 fid->vni_valid = false; in mlxsw_sp_fid_vni_set()
266 rhashtable_remove_fast(&mlxsw_sp->fid_core->vni_ht, &fid->vni_ht_node, in mlxsw_sp_fid_vni_set()
271 void mlxsw_sp_fid_vni_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_vni_clear() argument
273 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_vni_clear()
277 if (WARN_ON(!fid->vni_valid)) in mlxsw_sp_fid_vni_clear()
280 fid->vni_valid = false; in mlxsw_sp_fid_vni_clear()
281 ops->vni_clear(fid); in mlxsw_sp_fid_vni_clear()
282 rhashtable_remove_fast(&mlxsw_sp->fid_core->vni_ht, &fid->vni_ht_node, in mlxsw_sp_fid_vni_clear()
286 bool mlxsw_sp_fid_vni_is_set(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_vni_is_set() argument
288 return fid->vni_valid; in mlxsw_sp_fid_vni_is_set()
291 void mlxsw_sp_fid_fdb_clear_offload(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_fdb_clear_offload() argument
294 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_fdb_clear_offload()
298 ops->fdb_clear_offload(fid, nve_dev); in mlxsw_sp_fid_fdb_clear_offload()
302 mlxsw_sp_fid_flood_table_lookup(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_flood_table_lookup() argument
305 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_flood_table_lookup()
335 int mlxsw_sp_fid_flood_set(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_flood_set() argument
339 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_flood_set()
346 flood_table = mlxsw_sp_fid_flood_table_lookup(fid, packet_type); in mlxsw_sp_fid_flood_set()
351 fid->fid_offset); in mlxsw_sp_fid_flood_set()
353 fid->fid_index, local_port, member); in mlxsw_sp_fid_flood_set()
356 int mlxsw_sp_fid_port_vid_map(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_port_vid_map() argument
359 if (WARN_ON(!fid->fid_family->ops->port_vid_map)) in mlxsw_sp_fid_port_vid_map()
361 return fid->fid_family->ops->port_vid_map(fid, mlxsw_sp_port, vid); in mlxsw_sp_fid_port_vid_map()
364 void mlxsw_sp_fid_port_vid_unmap(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_port_vid_unmap() argument
367 fid->fid_family->ops->port_vid_unmap(fid, mlxsw_sp_port, vid); in mlxsw_sp_fid_port_vid_unmap()
370 u16 mlxsw_sp_fid_index(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_index() argument
372 return fid->fid_index; in mlxsw_sp_fid_index()
375 enum mlxsw_sp_fid_type mlxsw_sp_fid_type(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_type() argument
377 return fid->fid_family->type; in mlxsw_sp_fid_type()
380 struct mlxsw_sp_rif *mlxsw_sp_fid_rif(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rif() argument
382 return fid->rif; in mlxsw_sp_fid_rif()
395 mlxsw_sp_fid_8021q_fid(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021q_fid() argument
397 return container_of(fid, struct mlxsw_sp_fid_8021q, common); in mlxsw_sp_fid_8021q_fid()
400 u16 mlxsw_sp_fid_8021q_vid(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021q_vid() argument
402 return mlxsw_sp_fid_8021q_fid(fid)->vid; in mlxsw_sp_fid_8021q_vid()
405 static void mlxsw_sp_fid_8021q_setup(struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_8021q_setup() argument
409 mlxsw_sp_fid_8021q_fid(fid)->vid = vid; in mlxsw_sp_fid_8021q_setup()
410 fid->fid_offset = fid->fid_index - fid->fid_family->start_index; in mlxsw_sp_fid_8021q_setup()
419 static int mlxsw_sp_fid_op(const struct mlxsw_sp_fid *fid, bool valid) in mlxsw_sp_fid_op() argument
421 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_op()
425 smpe = fid->fid_family->smpe_index_valid ? fid->fid_index : 0; in mlxsw_sp_fid_op()
427 mlxsw_reg_sfmr_pack(sfmr_pl, mlxsw_sp_sfmr_op(valid), fid->fid_index, in mlxsw_sp_fid_op()
428 fid->fid_offset, fid->fid_family->flood_rsp, in mlxsw_sp_fid_op()
429 fid->fid_family->bridge_type, in mlxsw_sp_fid_op()
430 fid->fid_family->smpe_index_valid, smpe); in mlxsw_sp_fid_op()
434 static int mlxsw_sp_fid_edit_op(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_edit_op() argument
437 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_edit_op()
441 smpe = fid->fid_family->smpe_index_valid ? fid->fid_index : 0; in mlxsw_sp_fid_edit_op()
444 fid->fid_index, fid->fid_offset, in mlxsw_sp_fid_edit_op()
445 fid->fid_family->flood_rsp, in mlxsw_sp_fid_edit_op()
446 fid->fid_family->bridge_type, in mlxsw_sp_fid_edit_op()
447 fid->fid_family->smpe_index_valid, smpe); in mlxsw_sp_fid_edit_op()
448 mlxsw_reg_sfmr_vv_set(sfmr_pl, fid->vni_valid); in mlxsw_sp_fid_edit_op()
449 mlxsw_reg_sfmr_vni_set(sfmr_pl, be32_to_cpu(fid->vni)); in mlxsw_sp_fid_edit_op()
450 mlxsw_reg_sfmr_vtfp_set(sfmr_pl, fid->nve_flood_index_valid); in mlxsw_sp_fid_edit_op()
451 mlxsw_reg_sfmr_nve_tunnel_flood_ptr_set(sfmr_pl, fid->nve_flood_index); in mlxsw_sp_fid_edit_op()
461 static int mlxsw_sp_fid_vni_to_fid_map(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_vni_to_fid_map() argument
465 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_vni_to_fid_map()
473 mlxsw_reg_svfa_vni_pack(svfa_pl, valid, fid->fid_index, in mlxsw_sp_fid_vni_to_fid_map()
474 be32_to_cpu(fid->vni), irif_valid, irif_index); in mlxsw_sp_fid_vni_to_fid_map()
478 static int mlxsw_sp_fid_to_fid_rif_update(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_to_fid_rif_update() argument
481 return mlxsw_sp_fid_edit_op(fid, rif); in mlxsw_sp_fid_to_fid_rif_update()
484 static int mlxsw_sp_fid_vni_to_fid_rif_update(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_vni_to_fid_rif_update() argument
487 if (!fid->vni_valid) in mlxsw_sp_fid_vni_to_fid_rif_update()
490 return mlxsw_sp_fid_vni_to_fid_map(fid, rif, fid->vni_valid); in mlxsw_sp_fid_vni_to_fid_rif_update()
494 mlxsw_sp_fid_vid_to_fid_map(const struct mlxsw_sp_fid *fid, u16 vid, bool valid, in mlxsw_sp_fid_vid_to_fid_map() argument
497 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_vid_to_fid_map()
505 mlxsw_reg_svfa_vid_pack(svfa_pl, valid, fid->fid_index, vid, irif_valid, in mlxsw_sp_fid_vid_to_fid_map()
511 mlxsw_sp_fid_8021q_vid_to_fid_rif_update(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021q_vid_to_fid_rif_update() argument
514 struct mlxsw_sp_fid_8021q *fid_8021q = mlxsw_sp_fid_8021q_fid(fid); in mlxsw_sp_fid_8021q_vid_to_fid_rif_update()
519 return mlxsw_sp_fid_vid_to_fid_map(fid, fid_8021q->vid, true, rif); in mlxsw_sp_fid_8021q_vid_to_fid_rif_update()
523 mlxsw_sp_fid_port_vid_to_fid_rif_update_one(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_port_vid_to_fid_rif_update_one() argument
527 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_port_vid_to_fid_rif_update_one()
531 fid->fid_index, pv->vid, irif_valid, in mlxsw_sp_fid_port_vid_to_fid_rif_update_one()
537 static int mlxsw_sp_fid_vid_to_fid_rif_set(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_vid_to_fid_rif_set() argument
540 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_vid_to_fid_rif_set()
545 err = fid->fid_family->ops->vid_to_fid_rif_update(fid, rif); in mlxsw_sp_fid_vid_to_fid_rif_set()
551 list_for_each_entry(pv, &fid->port_vid_list, list) { in mlxsw_sp_fid_vid_to_fid_rif_set()
559 err = mlxsw_sp_fid_port_vid_to_fid_rif_update_one(fid, pv, in mlxsw_sp_fid_vid_to_fid_rif_set()
569 list_for_each_entry_continue_reverse(pv, &fid->port_vid_list, list) { in mlxsw_sp_fid_vid_to_fid_rif_set()
573 mlxsw_sp_fid_port_vid_to_fid_rif_update_one(fid, pv, false, 0); in mlxsw_sp_fid_vid_to_fid_rif_set()
576 fid->fid_family->ops->vid_to_fid_rif_update(fid, NULL); in mlxsw_sp_fid_vid_to_fid_rif_set()
580 static void mlxsw_sp_fid_vid_to_fid_rif_unset(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_vid_to_fid_rif_unset() argument
582 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_vid_to_fid_rif_unset()
585 list_for_each_entry(pv, &fid->port_vid_list, list) { in mlxsw_sp_fid_vid_to_fid_rif_unset()
592 mlxsw_sp_fid_port_vid_to_fid_rif_update_one(fid, pv, false, 0); in mlxsw_sp_fid_vid_to_fid_rif_unset()
595 fid->fid_family->ops->vid_to_fid_rif_update(fid, NULL); in mlxsw_sp_fid_vid_to_fid_rif_unset()
598 static int mlxsw_sp_fid_reiv_handle(struct mlxsw_sp_fid *fid, u16 rif_index, in mlxsw_sp_fid_reiv_handle() argument
603 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_reiv_handle()
615 list_for_each_entry(port_vid, &fid->port_vid_list, list) { in mlxsw_sp_fid_reiv_handle()
647 static int mlxsw_sp_fid_erif_eport_to_vid_map(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_erif_eport_to_vid_map() argument
650 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_erif_eport_to_vid_map()
658 err = mlxsw_sp_fid_reiv_handle(fid, rif_index, valid, i); in mlxsw_sp_fid_erif_eport_to_vid_map()
667 mlxsw_sp_fid_reiv_handle(fid, rif_index, !valid, i); in mlxsw_sp_fid_erif_eport_to_vid_map()
671 int mlxsw_sp_fid_rif_set(struct mlxsw_sp_fid *fid, struct mlxsw_sp_rif *rif) in mlxsw_sp_fid_rif_set() argument
676 err = mlxsw_sp_fid_to_fid_rif_update(fid, rif); in mlxsw_sp_fid_rif_set()
680 err = mlxsw_sp_fid_vni_to_fid_rif_update(fid, rif); in mlxsw_sp_fid_rif_set()
684 err = mlxsw_sp_fid_vid_to_fid_rif_set(fid, rif); in mlxsw_sp_fid_rif_set()
688 err = mlxsw_sp_fid_erif_eport_to_vid_map(fid, rif_index, true); in mlxsw_sp_fid_rif_set()
692 fid->rif = rif; in mlxsw_sp_fid_rif_set()
696 mlxsw_sp_fid_vid_to_fid_rif_unset(fid); in mlxsw_sp_fid_rif_set()
698 mlxsw_sp_fid_vni_to_fid_rif_update(fid, NULL); in mlxsw_sp_fid_rif_set()
700 mlxsw_sp_fid_to_fid_rif_update(fid, NULL); in mlxsw_sp_fid_rif_set()
704 void mlxsw_sp_fid_rif_unset(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rif_unset() argument
708 if (!fid->rif) in mlxsw_sp_fid_rif_unset()
711 rif_index = mlxsw_sp_rif_index(fid->rif); in mlxsw_sp_fid_rif_unset()
712 fid->rif = NULL; in mlxsw_sp_fid_rif_unset()
714 mlxsw_sp_fid_erif_eport_to_vid_map(fid, rif_index, false); in mlxsw_sp_fid_rif_unset()
715 mlxsw_sp_fid_vid_to_fid_rif_unset(fid); in mlxsw_sp_fid_rif_unset()
716 mlxsw_sp_fid_vni_to_fid_rif_update(fid, NULL); in mlxsw_sp_fid_rif_unset()
717 mlxsw_sp_fid_to_fid_rif_update(fid, NULL); in mlxsw_sp_fid_rif_unset()
720 static int mlxsw_sp_fid_vni_op(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_vni_op() argument
724 err = mlxsw_sp_fid_vni_to_fid_map(fid, fid->rif, fid->vni_valid); in mlxsw_sp_fid_vni_op()
728 err = mlxsw_sp_fid_edit_op(fid, fid->rif); in mlxsw_sp_fid_vni_op()
735 mlxsw_sp_fid_vni_to_fid_map(fid, fid->rif, !fid->vni_valid); in mlxsw_sp_fid_vni_op()
739 static int __mlxsw_sp_fid_port_vid_map(const struct mlxsw_sp_fid *fid, in __mlxsw_sp_fid_port_vid_map() argument
742 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in __mlxsw_sp_fid_port_vid_map()
747 if (fid->rif) { in __mlxsw_sp_fid_port_vid_map()
749 irif_index = mlxsw_sp_rif_index(fid->rif); in __mlxsw_sp_fid_port_vid_map()
752 mlxsw_reg_svfa_port_vid_pack(svfa_pl, local_port, valid, fid->fid_index, in __mlxsw_sp_fid_port_vid_map()
758 mlxsw_sp_fid_8021d_fid(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_fid() argument
760 return container_of(fid, struct mlxsw_sp_fid_8021d, common); in mlxsw_sp_fid_8021d_fid()
763 static void mlxsw_sp_fid_8021d_setup(struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_8021d_setup() argument
767 mlxsw_sp_fid_8021d_fid(fid)->br_ifindex = br_ifindex; in mlxsw_sp_fid_8021d_setup()
768 fid->fid_offset = fid->fid_index - fid->fid_family->start_index; in mlxsw_sp_fid_8021d_setup()
771 static int mlxsw_sp_fid_8021d_configure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_configure() argument
773 return mlxsw_sp_fid_op(fid, true); in mlxsw_sp_fid_8021d_configure()
776 static void mlxsw_sp_fid_8021d_deconfigure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_deconfigure() argument
778 if (fid->vni_valid) in mlxsw_sp_fid_8021d_deconfigure()
779 mlxsw_sp_nve_fid_disable(fid->fid_family->mlxsw_sp, fid); in mlxsw_sp_fid_8021d_deconfigure()
780 mlxsw_sp_fid_op(fid, false); in mlxsw_sp_fid_8021d_deconfigure()
783 static int mlxsw_sp_fid_8021d_index_alloc(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021d_index_alloc() argument
786 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_8021d_index_alloc()
799 mlxsw_sp_fid_8021d_compare(const struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_8021d_compare() argument
803 return mlxsw_sp_fid_8021d_fid(fid)->br_ifindex == br_ifindex; in mlxsw_sp_fid_8021d_compare()
813 struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid; in mlxsw_sp_port_vp_mode_trans() local
816 if (!fid) in mlxsw_sp_port_vp_mode_trans()
819 err = __mlxsw_sp_fid_port_vid_map(fid, in mlxsw_sp_port_vp_mode_trans()
836 struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid; in mlxsw_sp_port_vp_mode_trans() local
839 if (!fid) in mlxsw_sp_port_vp_mode_trans()
842 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, in mlxsw_sp_port_vp_mode_trans()
856 struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid; in mlxsw_sp_port_vlan_mode_trans() local
859 if (!fid) in mlxsw_sp_port_vlan_mode_trans()
862 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, in mlxsw_sp_port_vlan_mode_trans()
868 mlxsw_sp_fid_port_vid_list_add(struct mlxsw_sp_fid *fid, u16 local_port, in mlxsw_sp_fid_port_vid_list_add() argument
880 list_for_each_entry(tmp_port_vid, &fid->port_vid_list, list) { in mlxsw_sp_fid_port_vid_list_add()
890 mlxsw_sp_fid_port_vid_list_del(struct mlxsw_sp_fid *fid, u16 local_port, in mlxsw_sp_fid_port_vid_list_del() argument
895 list_for_each_entry_safe(port_vid, tmp, &fid->port_vid_list, list) { in mlxsw_sp_fid_port_vid_list_del()
906 mlxsw_sp_fid_mpe_table_map(const struct mlxsw_sp_fid *fid, u16 local_port, in mlxsw_sp_fid_mpe_table_map() argument
909 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_mpe_table_map()
912 mlxsw_reg_smpe_pack(smpe_pl, local_port, fid->fid_index, in mlxsw_sp_fid_mpe_table_map()
918 mlxsw_sp_fid_erif_eport_to_vid_map_one(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_erif_eport_to_vid_map_one() argument
923 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_erif_eport_to_vid_map_one()
924 u16 rif_index = mlxsw_sp_rif_index(fid->rif); in mlxsw_sp_fid_erif_eport_to_vid_map_one()
940 static int mlxsw_sp_fid_evid_map(const struct mlxsw_sp_fid *fid, u16 local_port, in mlxsw_sp_fid_evid_map() argument
945 err = mlxsw_sp_fid_mpe_table_map(fid, local_port, vid, valid); in mlxsw_sp_fid_evid_map()
949 if (!fid->rif) in mlxsw_sp_fid_evid_map()
952 err = mlxsw_sp_fid_erif_eport_to_vid_map_one(fid, local_port, vid, in mlxsw_sp_fid_evid_map()
960 mlxsw_sp_fid_mpe_table_map(fid, local_port, vid, !valid); in mlxsw_sp_fid_evid_map()
964 static int mlxsw_sp_fid_8021d_port_vid_map(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021d_port_vid_map() argument
972 err = __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, in mlxsw_sp_fid_8021d_port_vid_map()
977 err = mlxsw_sp_fid_evid_map(fid, local_port, vid, true); in mlxsw_sp_fid_8021d_port_vid_map()
981 err = mlxsw_sp_fid_port_vid_list_add(fid, mlxsw_sp_port->local_port, in mlxsw_sp_fid_8021d_port_vid_map()
996 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid); in mlxsw_sp_fid_8021d_port_vid_map()
998 mlxsw_sp_fid_evid_map(fid, local_port, vid, false); in mlxsw_sp_fid_8021d_port_vid_map()
1000 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, false); in mlxsw_sp_fid_8021d_port_vid_map()
1005 mlxsw_sp_fid_8021d_port_vid_unmap(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021d_port_vid_unmap() argument
1014 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid); in mlxsw_sp_fid_8021d_port_vid_unmap()
1015 mlxsw_sp_fid_evid_map(fid, local_port, vid, false); in mlxsw_sp_fid_8021d_port_vid_unmap()
1016 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, false); in mlxsw_sp_fid_8021d_port_vid_unmap()
1019 static int mlxsw_sp_fid_8021d_vni_set(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_vni_set() argument
1021 return mlxsw_sp_fid_vni_op(fid); in mlxsw_sp_fid_8021d_vni_set()
1024 static void mlxsw_sp_fid_8021d_vni_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_vni_clear() argument
1026 mlxsw_sp_fid_vni_op(fid); in mlxsw_sp_fid_8021d_vni_clear()
1029 static int mlxsw_sp_fid_8021d_nve_flood_index_set(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_nve_flood_index_set() argument
1031 return mlxsw_sp_fid_edit_op(fid, fid->rif); in mlxsw_sp_fid_8021d_nve_flood_index_set()
1034 static void mlxsw_sp_fid_8021d_nve_flood_index_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_nve_flood_index_clear() argument
1036 mlxsw_sp_fid_edit_op(fid, fid->rif); in mlxsw_sp_fid_8021d_nve_flood_index_clear()
1040 mlxsw_sp_fid_8021d_fdb_clear_offload(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021d_fdb_clear_offload() argument
1047 mlxsw_sp_fid_8021d_vid_to_fid_rif_update(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021d_vid_to_fid_rif_update() argument
1093 mlxsw_sp_fid_8021q_compare(const struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_8021q_compare() argument
1097 return mlxsw_sp_fid_8021q_fid(fid)->vid == vid; in mlxsw_sp_fid_8021q_compare()
1101 mlxsw_sp_fid_8021q_fdb_clear_offload(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021q_fdb_clear_offload() argument
1104 br_fdb_clear_offload(nve_dev, mlxsw_sp_fid_8021q_vid(fid)); in mlxsw_sp_fid_8021q_fdb_clear_offload()
1107 static void mlxsw_sp_fid_rfid_setup(struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_rfid_setup() argument
1109 fid->fid_offset = 0; in mlxsw_sp_fid_rfid_setup()
1112 static int mlxsw_sp_fid_rfid_configure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rfid_configure() argument
1114 return mlxsw_sp_fid_op(fid, true); in mlxsw_sp_fid_rfid_configure()
1117 static void mlxsw_sp_fid_rfid_deconfigure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rfid_deconfigure() argument
1119 mlxsw_sp_fid_op(fid, false); in mlxsw_sp_fid_rfid_deconfigure()
1122 static int mlxsw_sp_fid_rfid_index_alloc(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_rfid_index_alloc() argument
1127 *p_fid_index = fid->fid_family->start_index + rif_index; in mlxsw_sp_fid_rfid_index_alloc()
1132 static bool mlxsw_sp_fid_rfid_compare(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_rfid_compare() argument
1137 return fid->fid_index == rif_index + fid->fid_family->start_index; in mlxsw_sp_fid_rfid_compare()
1140 static int mlxsw_sp_fid_rfid_port_vid_map(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_rfid_port_vid_map() argument
1148 err = mlxsw_sp_fid_port_vid_list_add(fid, mlxsw_sp_port->local_port, in mlxsw_sp_fid_rfid_port_vid_map()
1158 err = __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, in mlxsw_sp_fid_rfid_port_vid_map()
1163 if (fid->rif) { in mlxsw_sp_fid_rfid_port_vid_map()
1164 err = mlxsw_sp_fid_erif_eport_to_vid_map_one(fid, local_port, in mlxsw_sp_fid_rfid_port_vid_map()
1180 if (fid->rif) in mlxsw_sp_fid_rfid_port_vid_map()
1181 mlxsw_sp_fid_erif_eport_to_vid_map_one(fid, local_port, vid, in mlxsw_sp_fid_rfid_port_vid_map()
1184 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, false); in mlxsw_sp_fid_rfid_port_vid_map()
1186 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid); in mlxsw_sp_fid_rfid_port_vid_map()
1191 mlxsw_sp_fid_rfid_port_vid_unmap(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_rfid_port_vid_unmap() argument
1201 if (fid->rif) in mlxsw_sp_fid_rfid_port_vid_unmap()
1202 mlxsw_sp_fid_erif_eport_to_vid_map_one(fid, local_port, vid, in mlxsw_sp_fid_rfid_port_vid_unmap()
1204 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, false); in mlxsw_sp_fid_rfid_port_vid_unmap()
1205 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid); in mlxsw_sp_fid_rfid_port_vid_unmap()
1208 static int mlxsw_sp_fid_rfid_vni_set(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rfid_vni_set() argument
1213 static void mlxsw_sp_fid_rfid_vni_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rfid_vni_clear() argument
1218 static int mlxsw_sp_fid_rfid_nve_flood_index_set(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rfid_nve_flood_index_set() argument
1223 static void mlxsw_sp_fid_rfid_nve_flood_index_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rfid_nve_flood_index_clear() argument
1229 mlxsw_sp_fid_rfid_vid_to_fid_rif_update(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_rfid_vid_to_fid_rif_update() argument
1250 static void mlxsw_sp_fid_dummy_setup(struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_dummy_setup() argument
1252 fid->fid_offset = 0; in mlxsw_sp_fid_dummy_setup()
1255 static int mlxsw_sp_fid_dummy_configure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_dummy_configure() argument
1257 return mlxsw_sp_fid_op(fid, true); in mlxsw_sp_fid_dummy_configure()
1260 static void mlxsw_sp_fid_dummy_deconfigure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_dummy_deconfigure() argument
1262 mlxsw_sp_fid_op(fid, false); in mlxsw_sp_fid_dummy_deconfigure()
1265 static int mlxsw_sp_fid_dummy_index_alloc(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_dummy_index_alloc() argument
1268 *p_fid_index = fid->fid_family->start_index; in mlxsw_sp_fid_dummy_index_alloc()
1273 static bool mlxsw_sp_fid_dummy_compare(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_dummy_compare() argument
1279 static int mlxsw_sp_fid_dummy_vni_set(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_dummy_vni_set() argument
1284 static void mlxsw_sp_fid_dummy_vni_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_dummy_vni_clear() argument
1289 static int mlxsw_sp_fid_dummy_nve_flood_index_set(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_dummy_nve_flood_index_set() argument
1294 static void mlxsw_sp_fid_dummy_nve_flood_index_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_dummy_nve_flood_index_clear() argument
1311 static int mlxsw_sp_fid_8021q_configure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021q_configure() argument
1313 struct mlxsw_sp_fid_8021q *fid_8021q = mlxsw_sp_fid_8021q_fid(fid); in mlxsw_sp_fid_8021q_configure()
1316 err = mlxsw_sp_fid_op(fid, true); in mlxsw_sp_fid_8021q_configure()
1320 err = mlxsw_sp_fid_vid_to_fid_map(fid, fid_8021q->vid, true, fid->rif); in mlxsw_sp_fid_8021q_configure()
1327 mlxsw_sp_fid_op(fid, false); in mlxsw_sp_fid_8021q_configure()
1331 static void mlxsw_sp_fid_8021q_deconfigure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021q_deconfigure() argument
1333 struct mlxsw_sp_fid_8021q *fid_8021q = mlxsw_sp_fid_8021q_fid(fid); in mlxsw_sp_fid_8021q_deconfigure()
1335 if (fid->vni_valid) in mlxsw_sp_fid_8021q_deconfigure()
1336 mlxsw_sp_nve_fid_disable(fid->fid_family->mlxsw_sp, fid); in mlxsw_sp_fid_8021q_deconfigure()
1338 mlxsw_sp_fid_vid_to_fid_map(fid, fid_8021q->vid, false, NULL); in mlxsw_sp_fid_8021q_deconfigure()
1339 mlxsw_sp_fid_op(fid, false); in mlxsw_sp_fid_8021q_deconfigure()
1342 static int mlxsw_sp_fid_8021q_port_vid_map(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021q_port_vid_map() argument
1355 err = __mlxsw_sp_fid_port_vid_map(fid, local_port, vid, true); in mlxsw_sp_fid_8021q_port_vid_map()
1360 err = mlxsw_sp_fid_evid_map(fid, local_port, vid, true); in mlxsw_sp_fid_8021q_port_vid_map()
1364 err = mlxsw_sp_fid_port_vid_list_add(fid, mlxsw_sp_port->local_port, in mlxsw_sp_fid_8021q_port_vid_map()
1372 mlxsw_sp_fid_evid_map(fid, local_port, vid, false); in mlxsw_sp_fid_8021q_port_vid_map()
1375 __mlxsw_sp_fid_port_vid_map(fid, local_port, vid, false); in mlxsw_sp_fid_8021q_port_vid_map()
1380 mlxsw_sp_fid_8021q_port_vid_unmap(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021q_port_vid_unmap() argument
1386 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid); in mlxsw_sp_fid_8021q_port_vid_unmap()
1387 mlxsw_sp_fid_evid_map(fid, local_port, vid, false); in mlxsw_sp_fid_8021q_port_vid_unmap()
1389 __mlxsw_sp_fid_port_vid_map(fid, local_port, vid, false); in mlxsw_sp_fid_8021q_port_vid_unmap()
1532 struct mlxsw_sp_fid *fid; in mlxsw_sp_fid_lookup() local
1535 list_for_each_entry(fid, &fid_family->fids_list, list) { in mlxsw_sp_fid_lookup()
1536 if (!fid->fid_family->ops->compare(fid, arg)) in mlxsw_sp_fid_lookup()
1538 refcount_inc(&fid->ref_count); in mlxsw_sp_fid_lookup()
1539 return fid; in mlxsw_sp_fid_lookup()
1550 struct mlxsw_sp_fid *fid; in mlxsw_sp_fid_get() local
1554 fid = mlxsw_sp_fid_lookup(mlxsw_sp, type, arg); in mlxsw_sp_fid_get()
1555 if (fid) in mlxsw_sp_fid_get()
1556 return fid; in mlxsw_sp_fid_get()
1559 fid = kzalloc(fid_family->fid_size, GFP_KERNEL); in mlxsw_sp_fid_get()
1560 if (!fid) in mlxsw_sp_fid_get()
1563 INIT_LIST_HEAD(&fid->port_vid_list); in mlxsw_sp_fid_get()
1564 fid->fid_family = fid_family; in mlxsw_sp_fid_get()
1566 err = fid->fid_family->ops->index_alloc(fid, arg, &fid_index); in mlxsw_sp_fid_get()
1569 fid->fid_index = fid_index; in mlxsw_sp_fid_get()
1572 fid->fid_family->ops->setup(fid, arg); in mlxsw_sp_fid_get()
1574 err = fid->fid_family->ops->configure(fid); in mlxsw_sp_fid_get()
1578 err = rhashtable_insert_fast(&mlxsw_sp->fid_core->fid_ht, &fid->ht_node, in mlxsw_sp_fid_get()
1583 list_add(&fid->list, &fid_family->fids_list); in mlxsw_sp_fid_get()
1584 refcount_set(&fid->ref_count, 1); in mlxsw_sp_fid_get()
1585 return fid; in mlxsw_sp_fid_get()
1588 fid->fid_family->ops->deconfigure(fid); in mlxsw_sp_fid_get()
1593 kfree(fid); in mlxsw_sp_fid_get()
1597 void mlxsw_sp_fid_put(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_put() argument
1599 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_put()
1602 if (!refcount_dec_and_test(&fid->ref_count)) in mlxsw_sp_fid_put()
1605 list_del(&fid->list); in mlxsw_sp_fid_put()
1607 &fid->ht_node, mlxsw_sp_fid_ht_params); in mlxsw_sp_fid_put()
1608 fid->fid_family->ops->deconfigure(fid); in mlxsw_sp_fid_put()
1609 __clear_bit(fid->fid_index - fid_family->start_index, in mlxsw_sp_fid_put()
1611 WARN_ON_ONCE(!list_empty(&fid->port_vid_list)); in mlxsw_sp_fid_put()
1612 kfree(fid); in mlxsw_sp_fid_put()