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,
153 struct mlxsw_sp_fid *fid; in mlxsw_sp_fid_lookup_by_index() local
155 fid = rhashtable_lookup_fast(&mlxsw_sp->fid_core->fid_ht, &fid_index, in mlxsw_sp_fid_lookup_by_index()
157 if (fid) in mlxsw_sp_fid_lookup_by_index()
158 refcount_inc(&fid->ref_count); in mlxsw_sp_fid_lookup_by_index()
160 return fid; in mlxsw_sp_fid_lookup_by_index()
163 int mlxsw_sp_fid_nve_ifindex(const struct mlxsw_sp_fid *fid, int *nve_ifindex) in mlxsw_sp_fid_nve_ifindex() argument
165 if (!fid->vni_valid) in mlxsw_sp_fid_nve_ifindex()
168 *nve_ifindex = fid->nve_ifindex; in mlxsw_sp_fid_nve_ifindex()
173 int mlxsw_sp_fid_nve_type(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_nve_type() argument
176 if (!fid->vni_valid) in mlxsw_sp_fid_nve_type()
179 *p_type = fid->nve_type; in mlxsw_sp_fid_nve_type()
187 struct mlxsw_sp_fid *fid; in mlxsw_sp_fid_lookup_by_vni() local
189 fid = rhashtable_lookup_fast(&mlxsw_sp->fid_core->vni_ht, &vni, in mlxsw_sp_fid_lookup_by_vni()
191 if (fid) in mlxsw_sp_fid_lookup_by_vni()
192 refcount_inc(&fid->ref_count); in mlxsw_sp_fid_lookup_by_vni()
194 return fid; in mlxsw_sp_fid_lookup_by_vni()
197 int mlxsw_sp_fid_vni(const struct mlxsw_sp_fid *fid, __be32 *vni) in mlxsw_sp_fid_vni() argument
199 if (!fid->vni_valid) in mlxsw_sp_fid_vni()
202 *vni = fid->vni; in mlxsw_sp_fid_vni()
207 int mlxsw_sp_fid_nve_flood_index_set(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_nve_flood_index_set() argument
210 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_nve_flood_index_set()
214 if (WARN_ON(fid->nve_flood_index_valid)) in mlxsw_sp_fid_nve_flood_index_set()
217 fid->nve_flood_index = nve_flood_index; in mlxsw_sp_fid_nve_flood_index_set()
218 fid->nve_flood_index_valid = true; in mlxsw_sp_fid_nve_flood_index_set()
219 err = ops->nve_flood_index_set(fid); in mlxsw_sp_fid_nve_flood_index_set()
226 fid->nve_flood_index_valid = false; in mlxsw_sp_fid_nve_flood_index_set()
230 void mlxsw_sp_fid_nve_flood_index_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_nve_flood_index_clear() argument
232 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_nve_flood_index_clear()
235 if (WARN_ON(!fid->nve_flood_index_valid)) in mlxsw_sp_fid_nve_flood_index_clear()
238 fid->nve_flood_index_valid = false; in mlxsw_sp_fid_nve_flood_index_clear()
239 ops->nve_flood_index_clear(fid); in mlxsw_sp_fid_nve_flood_index_clear()
242 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
244 return fid->nve_flood_index_valid; in mlxsw_sp_fid_nve_flood_index_is_set()
247 int mlxsw_sp_fid_vni_set(struct mlxsw_sp_fid *fid, enum mlxsw_sp_nve_type type, in mlxsw_sp_fid_vni_set() argument
250 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_vni_set()
255 if (WARN_ON(fid->vni_valid)) in mlxsw_sp_fid_vni_set()
258 fid->nve_type = type; in mlxsw_sp_fid_vni_set()
259 fid->nve_ifindex = nve_ifindex; in mlxsw_sp_fid_vni_set()
260 fid->vni = vni; in mlxsw_sp_fid_vni_set()
262 &fid->vni_ht_node, in mlxsw_sp_fid_vni_set()
267 fid->vni_valid = true; in mlxsw_sp_fid_vni_set()
268 err = ops->vni_set(fid); in mlxsw_sp_fid_vni_set()
275 fid->vni_valid = false; in mlxsw_sp_fid_vni_set()
276 rhashtable_remove_fast(&mlxsw_sp->fid_core->vni_ht, &fid->vni_ht_node, in mlxsw_sp_fid_vni_set()
281 void mlxsw_sp_fid_vni_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_vni_clear() argument
283 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_vni_clear()
287 if (WARN_ON(!fid->vni_valid)) in mlxsw_sp_fid_vni_clear()
290 fid->vni_valid = false; in mlxsw_sp_fid_vni_clear()
291 ops->vni_clear(fid); in mlxsw_sp_fid_vni_clear()
292 rhashtable_remove_fast(&mlxsw_sp->fid_core->vni_ht, &fid->vni_ht_node, in mlxsw_sp_fid_vni_clear()
296 bool mlxsw_sp_fid_vni_is_set(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_vni_is_set() argument
298 return fid->vni_valid; in mlxsw_sp_fid_vni_is_set()
301 void mlxsw_sp_fid_fdb_clear_offload(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_fdb_clear_offload() argument
304 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_fdb_clear_offload()
308 ops->fdb_clear_offload(fid, nve_dev); in mlxsw_sp_fid_fdb_clear_offload()
312 mlxsw_sp_fid_flood_table_lookup(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_flood_table_lookup() argument
315 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_flood_table_lookup()
345 int mlxsw_sp_fid_flood_set(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_flood_set() argument
349 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_flood_set()
356 flood_table = mlxsw_sp_fid_flood_table_lookup(fid, packet_type); in mlxsw_sp_fid_flood_set()
361 fid->fid_offset); in mlxsw_sp_fid_flood_set()
363 fid->fid_index, local_port, member); in mlxsw_sp_fid_flood_set()
366 int mlxsw_sp_fid_port_vid_map(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_port_vid_map() argument
369 if (WARN_ON(!fid->fid_family->ops->port_vid_map)) in mlxsw_sp_fid_port_vid_map()
371 return fid->fid_family->ops->port_vid_map(fid, mlxsw_sp_port, vid); in mlxsw_sp_fid_port_vid_map()
374 void mlxsw_sp_fid_port_vid_unmap(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_port_vid_unmap() argument
377 fid->fid_family->ops->port_vid_unmap(fid, mlxsw_sp_port, vid); in mlxsw_sp_fid_port_vid_unmap()
380 u16 mlxsw_sp_fid_index(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_index() argument
382 return fid->fid_index; in mlxsw_sp_fid_index()
385 enum mlxsw_sp_fid_type mlxsw_sp_fid_type(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_type() argument
387 return fid->fid_family->type; in mlxsw_sp_fid_type()
390 struct mlxsw_sp_rif *mlxsw_sp_fid_rif(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rif() argument
392 return fid->rif; in mlxsw_sp_fid_rif()
405 mlxsw_sp_fid_8021q_fid(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021q_fid() argument
407 return container_of(fid, struct mlxsw_sp_fid_8021q, common); in mlxsw_sp_fid_8021q_fid()
410 u16 mlxsw_sp_fid_8021q_vid(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021q_vid() argument
412 return mlxsw_sp_fid_8021q_fid(fid)->vid; in mlxsw_sp_fid_8021q_vid()
415 static void mlxsw_sp_fid_8021q_setup(struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_8021q_setup() argument
419 mlxsw_sp_fid_8021q_fid(fid)->vid = vid; in mlxsw_sp_fid_8021q_setup()
420 fid->fid_offset = fid->fid_index - fid->fid_family->start_index; in mlxsw_sp_fid_8021q_setup()
429 static int mlxsw_sp_fid_op(const struct mlxsw_sp_fid *fid, bool valid) in mlxsw_sp_fid_op() argument
431 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_op()
435 smpe = fid->fid_family->smpe_index_valid ? fid->fid_index : 0; in mlxsw_sp_fid_op()
437 mlxsw_reg_sfmr_pack(sfmr_pl, mlxsw_sp_sfmr_op(valid), fid->fid_index, in mlxsw_sp_fid_op()
438 fid->fid_offset, fid->fid_family->flood_rsp, in mlxsw_sp_fid_op()
439 fid->fid_family->bridge_type, in mlxsw_sp_fid_op()
440 fid->fid_family->smpe_index_valid, smpe); in mlxsw_sp_fid_op()
444 static int mlxsw_sp_fid_edit_op(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_edit_op() argument
447 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_edit_op()
451 smpe = fid->fid_family->smpe_index_valid ? fid->fid_index : 0; in mlxsw_sp_fid_edit_op()
454 fid->fid_index, fid->fid_offset, in mlxsw_sp_fid_edit_op()
455 fid->fid_family->flood_rsp, in mlxsw_sp_fid_edit_op()
456 fid->fid_family->bridge_type, in mlxsw_sp_fid_edit_op()
457 fid->fid_family->smpe_index_valid, smpe); in mlxsw_sp_fid_edit_op()
458 mlxsw_reg_sfmr_vv_set(sfmr_pl, fid->vni_valid); in mlxsw_sp_fid_edit_op()
459 mlxsw_reg_sfmr_vni_set(sfmr_pl, be32_to_cpu(fid->vni)); in mlxsw_sp_fid_edit_op()
460 mlxsw_reg_sfmr_vtfp_set(sfmr_pl, fid->nve_flood_index_valid); in mlxsw_sp_fid_edit_op()
461 mlxsw_reg_sfmr_nve_tunnel_flood_ptr_set(sfmr_pl, fid->nve_flood_index); in mlxsw_sp_fid_edit_op()
471 static int mlxsw_sp_fid_vni_to_fid_map(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_vni_to_fid_map() argument
475 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_vni_to_fid_map()
483 mlxsw_reg_svfa_vni_pack(svfa_pl, valid, fid->fid_index, in mlxsw_sp_fid_vni_to_fid_map()
484 be32_to_cpu(fid->vni), irif_valid, irif_index); in mlxsw_sp_fid_vni_to_fid_map()
488 static int mlxsw_sp_fid_to_fid_rif_update(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_to_fid_rif_update() argument
491 return mlxsw_sp_fid_edit_op(fid, rif); in mlxsw_sp_fid_to_fid_rif_update()
494 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
497 if (!fid->vni_valid) in mlxsw_sp_fid_vni_to_fid_rif_update()
500 return mlxsw_sp_fid_vni_to_fid_map(fid, rif, fid->vni_valid); in mlxsw_sp_fid_vni_to_fid_rif_update()
504 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
507 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_vid_to_fid_map()
515 mlxsw_reg_svfa_vid_pack(svfa_pl, valid, fid->fid_index, vid, irif_valid, in mlxsw_sp_fid_vid_to_fid_map()
521 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
524 struct mlxsw_sp_fid_8021q *fid_8021q = mlxsw_sp_fid_8021q_fid(fid); in mlxsw_sp_fid_8021q_vid_to_fid_rif_update()
529 return mlxsw_sp_fid_vid_to_fid_map(fid, fid_8021q->vid, true, rif); in mlxsw_sp_fid_8021q_vid_to_fid_rif_update()
533 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
537 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_port_vid_to_fid_rif_update_one()
541 fid->fid_index, pv->vid, irif_valid, in mlxsw_sp_fid_port_vid_to_fid_rif_update_one()
547 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
550 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_vid_to_fid_rif_set()
555 err = fid->fid_family->ops->vid_to_fid_rif_update(fid, rif); in mlxsw_sp_fid_vid_to_fid_rif_set()
561 list_for_each_entry(pv, &fid->port_vid_list, list) { in mlxsw_sp_fid_vid_to_fid_rif_set()
569 err = mlxsw_sp_fid_port_vid_to_fid_rif_update_one(fid, pv, in mlxsw_sp_fid_vid_to_fid_rif_set()
579 list_for_each_entry_continue_reverse(pv, &fid->port_vid_list, list) { in mlxsw_sp_fid_vid_to_fid_rif_set()
583 mlxsw_sp_fid_port_vid_to_fid_rif_update_one(fid, pv, false, 0); in mlxsw_sp_fid_vid_to_fid_rif_set()
586 fid->fid_family->ops->vid_to_fid_rif_update(fid, NULL); in mlxsw_sp_fid_vid_to_fid_rif_set()
590 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
592 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_vid_to_fid_rif_unset()
595 list_for_each_entry(pv, &fid->port_vid_list, list) { in mlxsw_sp_fid_vid_to_fid_rif_unset()
602 mlxsw_sp_fid_port_vid_to_fid_rif_update_one(fid, pv, false, 0); in mlxsw_sp_fid_vid_to_fid_rif_unset()
605 fid->fid_family->ops->vid_to_fid_rif_update(fid, NULL); in mlxsw_sp_fid_vid_to_fid_rif_unset()
608 static int mlxsw_sp_fid_reiv_handle(struct mlxsw_sp_fid *fid, u16 rif_index, in mlxsw_sp_fid_reiv_handle() argument
613 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_reiv_handle()
625 list_for_each_entry(port_vid, &fid->port_vid_list, list) { in mlxsw_sp_fid_reiv_handle()
657 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
660 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_erif_eport_to_vid_map()
668 err = mlxsw_sp_fid_reiv_handle(fid, rif_index, valid, i); in mlxsw_sp_fid_erif_eport_to_vid_map()
677 mlxsw_sp_fid_reiv_handle(fid, rif_index, !valid, i); in mlxsw_sp_fid_erif_eport_to_vid_map()
681 int mlxsw_sp_fid_rif_set(struct mlxsw_sp_fid *fid, struct mlxsw_sp_rif *rif) in mlxsw_sp_fid_rif_set() argument
686 err = mlxsw_sp_fid_to_fid_rif_update(fid, rif); in mlxsw_sp_fid_rif_set()
690 err = mlxsw_sp_fid_vni_to_fid_rif_update(fid, rif); in mlxsw_sp_fid_rif_set()
694 err = mlxsw_sp_fid_vid_to_fid_rif_set(fid, rif); in mlxsw_sp_fid_rif_set()
698 err = mlxsw_sp_fid_erif_eport_to_vid_map(fid, rif_index, true); in mlxsw_sp_fid_rif_set()
702 fid->rif = rif; in mlxsw_sp_fid_rif_set()
706 mlxsw_sp_fid_vid_to_fid_rif_unset(fid); in mlxsw_sp_fid_rif_set()
708 mlxsw_sp_fid_vni_to_fid_rif_update(fid, NULL); in mlxsw_sp_fid_rif_set()
710 mlxsw_sp_fid_to_fid_rif_update(fid, NULL); in mlxsw_sp_fid_rif_set()
714 void mlxsw_sp_fid_rif_unset(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rif_unset() argument
718 if (!fid->rif) in mlxsw_sp_fid_rif_unset()
721 rif_index = mlxsw_sp_rif_index(fid->rif); in mlxsw_sp_fid_rif_unset()
722 fid->rif = NULL; in mlxsw_sp_fid_rif_unset()
724 mlxsw_sp_fid_erif_eport_to_vid_map(fid, rif_index, false); in mlxsw_sp_fid_rif_unset()
725 mlxsw_sp_fid_vid_to_fid_rif_unset(fid); in mlxsw_sp_fid_rif_unset()
726 mlxsw_sp_fid_vni_to_fid_rif_update(fid, NULL); in mlxsw_sp_fid_rif_unset()
727 mlxsw_sp_fid_to_fid_rif_update(fid, NULL); in mlxsw_sp_fid_rif_unset()
730 static int mlxsw_sp_fid_vni_op(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_vni_op() argument
734 err = mlxsw_sp_fid_vni_to_fid_map(fid, fid->rif, fid->vni_valid); in mlxsw_sp_fid_vni_op()
738 err = mlxsw_sp_fid_edit_op(fid, fid->rif); in mlxsw_sp_fid_vni_op()
745 mlxsw_sp_fid_vni_to_fid_map(fid, fid->rif, !fid->vni_valid); in mlxsw_sp_fid_vni_op()
749 static int __mlxsw_sp_fid_port_vid_map(const struct mlxsw_sp_fid *fid, in __mlxsw_sp_fid_port_vid_map() argument
752 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in __mlxsw_sp_fid_port_vid_map()
757 if (fid->rif) { in __mlxsw_sp_fid_port_vid_map()
759 irif_index = mlxsw_sp_rif_index(fid->rif); in __mlxsw_sp_fid_port_vid_map()
762 mlxsw_reg_svfa_port_vid_pack(svfa_pl, local_port, valid, fid->fid_index, in __mlxsw_sp_fid_port_vid_map()
768 mlxsw_sp_fid_8021d_fid(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_fid() argument
770 return container_of(fid, struct mlxsw_sp_fid_8021d, common); in mlxsw_sp_fid_8021d_fid()
773 static void mlxsw_sp_fid_8021d_setup(struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_8021d_setup() argument
777 mlxsw_sp_fid_8021d_fid(fid)->br_ifindex = br_ifindex; in mlxsw_sp_fid_8021d_setup()
778 fid->fid_offset = fid->fid_index - fid->fid_family->start_index; in mlxsw_sp_fid_8021d_setup()
781 static int mlxsw_sp_fid_8021d_configure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_configure() argument
783 return mlxsw_sp_fid_op(fid, true); in mlxsw_sp_fid_8021d_configure()
786 static void mlxsw_sp_fid_8021d_deconfigure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_deconfigure() argument
788 if (fid->vni_valid) in mlxsw_sp_fid_8021d_deconfigure()
789 mlxsw_sp_nve_fid_disable(fid->fid_family->mlxsw_sp, fid); in mlxsw_sp_fid_8021d_deconfigure()
790 mlxsw_sp_fid_op(fid, false); in mlxsw_sp_fid_8021d_deconfigure()
793 static int mlxsw_sp_fid_8021d_index_alloc(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021d_index_alloc() argument
796 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_8021d_index_alloc()
809 mlxsw_sp_fid_8021d_compare(const struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_8021d_compare() argument
813 return mlxsw_sp_fid_8021d_fid(fid)->br_ifindex == br_ifindex; in mlxsw_sp_fid_8021d_compare()
823 struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid; in mlxsw_sp_port_vp_mode_trans() local
826 if (!fid) in mlxsw_sp_port_vp_mode_trans()
829 err = __mlxsw_sp_fid_port_vid_map(fid, in mlxsw_sp_port_vp_mode_trans()
846 struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid; in mlxsw_sp_port_vp_mode_trans() local
849 if (!fid) in mlxsw_sp_port_vp_mode_trans()
852 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, in mlxsw_sp_port_vp_mode_trans()
866 struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid; in mlxsw_sp_port_vlan_mode_trans() local
869 if (!fid) in mlxsw_sp_port_vlan_mode_trans()
872 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, in mlxsw_sp_port_vlan_mode_trans()
878 mlxsw_sp_fid_port_vid_list_add(struct mlxsw_sp_fid *fid, u16 local_port, in mlxsw_sp_fid_port_vid_list_add() argument
890 list_for_each_entry(tmp_port_vid, &fid->port_vid_list, list) { in mlxsw_sp_fid_port_vid_list_add()
900 mlxsw_sp_fid_port_vid_list_del(struct mlxsw_sp_fid *fid, u16 local_port, in mlxsw_sp_fid_port_vid_list_del() argument
905 list_for_each_entry_safe(port_vid, tmp, &fid->port_vid_list, list) { in mlxsw_sp_fid_port_vid_list_del()
916 mlxsw_sp_fid_mpe_table_map(const struct mlxsw_sp_fid *fid, u16 local_port, in mlxsw_sp_fid_mpe_table_map() argument
919 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_mpe_table_map()
922 mlxsw_reg_smpe_pack(smpe_pl, local_port, fid->fid_index, in mlxsw_sp_fid_mpe_table_map()
928 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
933 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_erif_eport_to_vid_map_one()
934 u16 rif_index = mlxsw_sp_rif_index(fid->rif); in mlxsw_sp_fid_erif_eport_to_vid_map_one()
950 static int mlxsw_sp_fid_evid_map(const struct mlxsw_sp_fid *fid, u16 local_port, in mlxsw_sp_fid_evid_map() argument
955 err = mlxsw_sp_fid_mpe_table_map(fid, local_port, vid, valid); in mlxsw_sp_fid_evid_map()
959 if (!fid->rif) in mlxsw_sp_fid_evid_map()
962 err = mlxsw_sp_fid_erif_eport_to_vid_map_one(fid, local_port, vid, in mlxsw_sp_fid_evid_map()
970 mlxsw_sp_fid_mpe_table_map(fid, local_port, vid, !valid); in mlxsw_sp_fid_evid_map()
974 static int mlxsw_sp_fid_8021d_port_vid_map(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021d_port_vid_map() argument
982 err = __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, in mlxsw_sp_fid_8021d_port_vid_map()
987 err = mlxsw_sp_fid_evid_map(fid, local_port, vid, true); in mlxsw_sp_fid_8021d_port_vid_map()
991 err = mlxsw_sp_fid_port_vid_list_add(fid, mlxsw_sp_port->local_port, in mlxsw_sp_fid_8021d_port_vid_map()
1006 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid); in mlxsw_sp_fid_8021d_port_vid_map()
1008 mlxsw_sp_fid_evid_map(fid, local_port, vid, false); in mlxsw_sp_fid_8021d_port_vid_map()
1010 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, false); in mlxsw_sp_fid_8021d_port_vid_map()
1015 mlxsw_sp_fid_8021d_port_vid_unmap(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021d_port_vid_unmap() argument
1024 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid); in mlxsw_sp_fid_8021d_port_vid_unmap()
1025 mlxsw_sp_fid_evid_map(fid, local_port, vid, false); in mlxsw_sp_fid_8021d_port_vid_unmap()
1026 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, false); in mlxsw_sp_fid_8021d_port_vid_unmap()
1029 static int mlxsw_sp_fid_8021d_vni_set(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_vni_set() argument
1031 return mlxsw_sp_fid_vni_op(fid); in mlxsw_sp_fid_8021d_vni_set()
1034 static void mlxsw_sp_fid_8021d_vni_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_vni_clear() argument
1036 mlxsw_sp_fid_vni_op(fid); in mlxsw_sp_fid_8021d_vni_clear()
1039 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
1041 return mlxsw_sp_fid_edit_op(fid, fid->rif); in mlxsw_sp_fid_8021d_nve_flood_index_set()
1044 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
1046 mlxsw_sp_fid_edit_op(fid, fid->rif); in mlxsw_sp_fid_8021d_nve_flood_index_clear()
1050 mlxsw_sp_fid_8021d_fdb_clear_offload(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021d_fdb_clear_offload() argument
1057 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
1103 mlxsw_sp_fid_8021q_compare(const struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_8021q_compare() argument
1107 return mlxsw_sp_fid_8021q_fid(fid)->vid == vid; in mlxsw_sp_fid_8021q_compare()
1111 mlxsw_sp_fid_8021q_fdb_clear_offload(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021q_fdb_clear_offload() argument
1114 br_fdb_clear_offload(nve_dev, mlxsw_sp_fid_8021q_vid(fid)); in mlxsw_sp_fid_8021q_fdb_clear_offload()
1117 static void mlxsw_sp_fid_rfid_setup(struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_rfid_setup() argument
1119 fid->fid_offset = 0; in mlxsw_sp_fid_rfid_setup()
1122 static int mlxsw_sp_fid_rfid_configure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rfid_configure() argument
1124 return mlxsw_sp_fid_op(fid, true); in mlxsw_sp_fid_rfid_configure()
1127 static void mlxsw_sp_fid_rfid_deconfigure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rfid_deconfigure() argument
1129 mlxsw_sp_fid_op(fid, false); in mlxsw_sp_fid_rfid_deconfigure()
1132 static int mlxsw_sp_fid_rfid_index_alloc(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_rfid_index_alloc() argument
1137 *p_fid_index = fid->fid_family->start_index + rif_index; in mlxsw_sp_fid_rfid_index_alloc()
1142 static bool mlxsw_sp_fid_rfid_compare(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_rfid_compare() argument
1147 return fid->fid_index == rif_index + fid->fid_family->start_index; in mlxsw_sp_fid_rfid_compare()
1150 static int mlxsw_sp_fid_rfid_port_vid_map(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_rfid_port_vid_map() argument
1158 err = mlxsw_sp_fid_port_vid_list_add(fid, mlxsw_sp_port->local_port, in mlxsw_sp_fid_rfid_port_vid_map()
1168 err = __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, in mlxsw_sp_fid_rfid_port_vid_map()
1173 if (fid->rif) { in mlxsw_sp_fid_rfid_port_vid_map()
1174 err = mlxsw_sp_fid_erif_eport_to_vid_map_one(fid, local_port, in mlxsw_sp_fid_rfid_port_vid_map()
1190 if (fid->rif) in mlxsw_sp_fid_rfid_port_vid_map()
1191 mlxsw_sp_fid_erif_eport_to_vid_map_one(fid, local_port, vid, in mlxsw_sp_fid_rfid_port_vid_map()
1194 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, false); in mlxsw_sp_fid_rfid_port_vid_map()
1196 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid); in mlxsw_sp_fid_rfid_port_vid_map()
1201 mlxsw_sp_fid_rfid_port_vid_unmap(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_rfid_port_vid_unmap() argument
1211 if (fid->rif) in mlxsw_sp_fid_rfid_port_vid_unmap()
1212 mlxsw_sp_fid_erif_eport_to_vid_map_one(fid, local_port, vid, in mlxsw_sp_fid_rfid_port_vid_unmap()
1214 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, false); in mlxsw_sp_fid_rfid_port_vid_unmap()
1215 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid); in mlxsw_sp_fid_rfid_port_vid_unmap()
1218 static int mlxsw_sp_fid_rfid_vni_set(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rfid_vni_set() argument
1223 static void mlxsw_sp_fid_rfid_vni_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rfid_vni_clear() argument
1228 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
1233 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
1239 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
1260 static void mlxsw_sp_fid_dummy_setup(struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_dummy_setup() argument
1262 fid->fid_offset = 0; in mlxsw_sp_fid_dummy_setup()
1265 static int mlxsw_sp_fid_dummy_configure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_dummy_configure() argument
1267 return mlxsw_sp_fid_op(fid, true); in mlxsw_sp_fid_dummy_configure()
1270 static void mlxsw_sp_fid_dummy_deconfigure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_dummy_deconfigure() argument
1272 mlxsw_sp_fid_op(fid, false); in mlxsw_sp_fid_dummy_deconfigure()
1275 static int mlxsw_sp_fid_dummy_index_alloc(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_dummy_index_alloc() argument
1278 *p_fid_index = fid->fid_family->start_index; in mlxsw_sp_fid_dummy_index_alloc()
1283 static bool mlxsw_sp_fid_dummy_compare(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_dummy_compare() argument
1289 static int mlxsw_sp_fid_dummy_vni_set(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_dummy_vni_set() argument
1294 static void mlxsw_sp_fid_dummy_vni_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_dummy_vni_clear() argument
1299 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
1304 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
1321 static int mlxsw_sp_fid_8021q_configure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021q_configure() argument
1323 struct mlxsw_sp_fid_8021q *fid_8021q = mlxsw_sp_fid_8021q_fid(fid); in mlxsw_sp_fid_8021q_configure()
1326 err = mlxsw_sp_fid_op(fid, true); in mlxsw_sp_fid_8021q_configure()
1330 err = mlxsw_sp_fid_vid_to_fid_map(fid, fid_8021q->vid, true, fid->rif); in mlxsw_sp_fid_8021q_configure()
1337 mlxsw_sp_fid_op(fid, false); in mlxsw_sp_fid_8021q_configure()
1341 static void mlxsw_sp_fid_8021q_deconfigure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021q_deconfigure() argument
1343 struct mlxsw_sp_fid_8021q *fid_8021q = mlxsw_sp_fid_8021q_fid(fid); in mlxsw_sp_fid_8021q_deconfigure()
1345 if (fid->vni_valid) in mlxsw_sp_fid_8021q_deconfigure()
1346 mlxsw_sp_nve_fid_disable(fid->fid_family->mlxsw_sp, fid); in mlxsw_sp_fid_8021q_deconfigure()
1348 mlxsw_sp_fid_vid_to_fid_map(fid, fid_8021q->vid, false, NULL); in mlxsw_sp_fid_8021q_deconfigure()
1349 mlxsw_sp_fid_op(fid, false); in mlxsw_sp_fid_8021q_deconfigure()
1352 static int mlxsw_sp_fid_8021q_port_vid_map(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021q_port_vid_map() argument
1365 err = __mlxsw_sp_fid_port_vid_map(fid, local_port, vid, true); in mlxsw_sp_fid_8021q_port_vid_map()
1370 err = mlxsw_sp_fid_evid_map(fid, local_port, vid, true); in mlxsw_sp_fid_8021q_port_vid_map()
1374 err = mlxsw_sp_fid_port_vid_list_add(fid, mlxsw_sp_port->local_port, in mlxsw_sp_fid_8021q_port_vid_map()
1382 mlxsw_sp_fid_evid_map(fid, local_port, vid, false); in mlxsw_sp_fid_8021q_port_vid_map()
1385 __mlxsw_sp_fid_port_vid_map(fid, local_port, vid, false); in mlxsw_sp_fid_8021q_port_vid_map()
1390 mlxsw_sp_fid_8021q_port_vid_unmap(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021q_port_vid_unmap() argument
1396 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid); in mlxsw_sp_fid_8021q_port_vid_unmap()
1397 mlxsw_sp_fid_evid_map(fid, local_port, vid, false); in mlxsw_sp_fid_8021q_port_vid_unmap()
1399 __mlxsw_sp_fid_port_vid_map(fid, local_port, vid, false); in mlxsw_sp_fid_8021q_port_vid_unmap()
1542 struct mlxsw_sp_fid *fid; in mlxsw_sp_fid_lookup() local
1545 list_for_each_entry(fid, &fid_family->fids_list, list) { in mlxsw_sp_fid_lookup()
1546 if (!fid->fid_family->ops->compare(fid, arg)) in mlxsw_sp_fid_lookup()
1548 refcount_inc(&fid->ref_count); in mlxsw_sp_fid_lookup()
1549 return fid; in mlxsw_sp_fid_lookup()
1560 struct mlxsw_sp_fid *fid; in mlxsw_sp_fid_get() local
1564 fid = mlxsw_sp_fid_lookup(mlxsw_sp, type, arg); in mlxsw_sp_fid_get()
1565 if (fid) in mlxsw_sp_fid_get()
1566 return fid; in mlxsw_sp_fid_get()
1569 fid = kzalloc(fid_family->fid_size, GFP_KERNEL); in mlxsw_sp_fid_get()
1570 if (!fid) in mlxsw_sp_fid_get()
1573 INIT_LIST_HEAD(&fid->port_vid_list); in mlxsw_sp_fid_get()
1574 fid->fid_family = fid_family; in mlxsw_sp_fid_get()
1576 err = fid->fid_family->ops->index_alloc(fid, arg, &fid_index); in mlxsw_sp_fid_get()
1579 fid->fid_index = fid_index; in mlxsw_sp_fid_get()
1582 fid->fid_family->ops->setup(fid, arg); in mlxsw_sp_fid_get()
1584 err = fid->fid_family->ops->configure(fid); in mlxsw_sp_fid_get()
1588 err = rhashtable_insert_fast(&mlxsw_sp->fid_core->fid_ht, &fid->ht_node, in mlxsw_sp_fid_get()
1593 list_add(&fid->list, &fid_family->fids_list); in mlxsw_sp_fid_get()
1594 refcount_set(&fid->ref_count, 1); in mlxsw_sp_fid_get()
1595 return fid; in mlxsw_sp_fid_get()
1598 fid->fid_family->ops->deconfigure(fid); in mlxsw_sp_fid_get()
1603 kfree(fid); in mlxsw_sp_fid_get()
1607 void mlxsw_sp_fid_put(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_put() argument
1609 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_put()
1612 if (!refcount_dec_and_test(&fid->ref_count)) in mlxsw_sp_fid_put()
1615 list_del(&fid->list); in mlxsw_sp_fid_put()
1617 &fid->ht_node, mlxsw_sp_fid_ht_params); in mlxsw_sp_fid_put()
1618 fid->fid_family->ops->deconfigure(fid); in mlxsw_sp_fid_put()
1619 __clear_bit(fid->fid_index - fid_family->start_index, in mlxsw_sp_fid_put()
1621 WARN_ON_ONCE(!list_empty(&fid->port_vid_list)); in mlxsw_sp_fid_put()
1622 kfree(fid); in mlxsw_sp_fid_put()