Lines Matching refs:fid

80 	int (*setup)(struct mlxsw_sp_fid *fid, const void *arg);
81 int (*configure)(struct mlxsw_sp_fid *fid);
82 void (*deconfigure)(struct mlxsw_sp_fid *fid);
83 int (*index_alloc)(struct mlxsw_sp_fid *fid, const void *arg,
85 bool (*compare)(const struct mlxsw_sp_fid *fid,
87 int (*port_vid_map)(struct mlxsw_sp_fid *fid,
89 void (*port_vid_unmap)(struct mlxsw_sp_fid *fid,
91 int (*vni_set)(struct mlxsw_sp_fid *fid);
92 void (*vni_clear)(struct mlxsw_sp_fid *fid);
93 int (*nve_flood_index_set)(struct mlxsw_sp_fid *fid);
94 void (*nve_flood_index_clear)(struct mlxsw_sp_fid *fid);
95 void (*fdb_clear_offload)(const struct mlxsw_sp_fid *fid,
97 int (*vid_to_fid_rif_update)(const struct mlxsw_sp_fid *fid,
103 u16 (*fid_mid)(const struct mlxsw_sp_fid *fid,
105 void (*fid_pack)(char *sfmr_pl, const struct mlxsw_sp_fid *fid,
192 struct mlxsw_sp_fid *fid;
194 fid = rhashtable_lookup_fast(&mlxsw_sp->fid_core->fid_ht, &fid_index,
196 if (fid)
197 refcount_inc(&fid->ref_count);
199 return fid;
202 int mlxsw_sp_fid_nve_ifindex(const struct mlxsw_sp_fid *fid, int *nve_ifindex)
204 if (!fid->vni_valid)
207 *nve_ifindex = fid->nve_ifindex;
212 int mlxsw_sp_fid_nve_type(const struct mlxsw_sp_fid *fid,
215 if (!fid->vni_valid)
218 *p_type = fid->nve_type;
226 struct mlxsw_sp_fid *fid;
228 fid = rhashtable_lookup_fast(&mlxsw_sp->fid_core->vni_ht, &vni,
230 if (fid)
231 refcount_inc(&fid->ref_count);
233 return fid;
236 int mlxsw_sp_fid_vni(const struct mlxsw_sp_fid *fid, __be32 *vni)
238 if (!fid->vni_valid)
241 *vni = fid->vni;
246 int mlxsw_sp_fid_nve_flood_index_set(struct mlxsw_sp_fid *fid,
249 struct mlxsw_sp_fid_family *fid_family = fid->fid_family;
253 if (WARN_ON(fid->nve_flood_index_valid))
256 fid->nve_flood_index = nve_flood_index;
257 fid->nve_flood_index_valid = true;
258 err = ops->nve_flood_index_set(fid);
265 fid->nve_flood_index_valid = false;
269 void mlxsw_sp_fid_nve_flood_index_clear(struct mlxsw_sp_fid *fid)
271 struct mlxsw_sp_fid_family *fid_family = fid->fid_family;
274 if (WARN_ON(!fid->nve_flood_index_valid))
277 fid->nve_flood_index_valid = false;
278 ops->nve_flood_index_clear(fid);
281 bool mlxsw_sp_fid_nve_flood_index_is_set(const struct mlxsw_sp_fid *fid)
283 return fid->nve_flood_index_valid;
286 int mlxsw_sp_fid_vni_set(struct mlxsw_sp_fid *fid, enum mlxsw_sp_nve_type type,
289 struct mlxsw_sp_fid_family *fid_family = fid->fid_family;
294 if (WARN_ON(fid->vni_valid))
297 fid->nve_type = type;
298 fid->nve_ifindex = nve_ifindex;
299 fid->vni = vni;
301 &fid->vni_ht_node,
306 fid->vni_valid = true;
307 err = ops->vni_set(fid);
314 fid->vni_valid = false;
315 rhashtable_remove_fast(&mlxsw_sp->fid_core->vni_ht, &fid->vni_ht_node,
320 void mlxsw_sp_fid_vni_clear(struct mlxsw_sp_fid *fid)
322 struct mlxsw_sp_fid_family *fid_family = fid->fid_family;
326 if (WARN_ON(!fid->vni_valid))
329 fid->vni_valid = false;
330 ops->vni_clear(fid);
331 rhashtable_remove_fast(&mlxsw_sp->fid_core->vni_ht, &fid->vni_ht_node,
335 bool mlxsw_sp_fid_vni_is_set(const struct mlxsw_sp_fid *fid)
337 return fid->vni_valid;
340 void mlxsw_sp_fid_fdb_clear_offload(const struct mlxsw_sp_fid *fid,
343 struct mlxsw_sp_fid_family *fid_family = fid->fid_family;
347 ops->fdb_clear_offload(fid, nve_dev);
351 mlxsw_sp_fid_flood_table_lookup(const struct mlxsw_sp_fid *fid,
354 struct mlxsw_sp_fid_family *fid_family = fid->fid_family;
426 mlxsw_sp_fid_fid_mid_ctl(const struct mlxsw_sp_fid *fid,
429 return mlxsw_sp_fid_pgt_base_ctl(fid->fid_family, flood_table) +
430 fid->fid_offset;
433 int mlxsw_sp_fid_flood_set(struct mlxsw_sp_fid *fid,
437 struct mlxsw_sp_fid_family *fid_family = fid->fid_family;
444 flood_table = mlxsw_sp_fid_flood_table_lookup(fid, packet_type);
448 mid_index = fid_family->ops->fid_mid(fid, flood_table);
450 fid->fid_index, local_port, member);
453 int mlxsw_sp_fid_port_vid_map(struct mlxsw_sp_fid *fid,
456 if (WARN_ON(!fid->fid_family->ops->port_vid_map))
458 return fid->fid_family->ops->port_vid_map(fid, mlxsw_sp_port, vid);
461 void mlxsw_sp_fid_port_vid_unmap(struct mlxsw_sp_fid *fid,
464 fid->fid_family->ops->port_vid_unmap(fid, mlxsw_sp_port, vid);
467 u16 mlxsw_sp_fid_index(const struct mlxsw_sp_fid *fid)
469 return fid->fid_index;
472 enum mlxsw_sp_fid_type mlxsw_sp_fid_type(const struct mlxsw_sp_fid *fid)
474 return fid->fid_family->type;
477 struct mlxsw_sp_rif *mlxsw_sp_fid_rif(const struct mlxsw_sp_fid *fid)
479 return fid->rif;
492 mlxsw_sp_fid_8021q_fid(const struct mlxsw_sp_fid *fid)
494 return container_of(fid, struct mlxsw_sp_fid_8021q, common);
497 u16 mlxsw_sp_fid_8021q_vid(const struct mlxsw_sp_fid *fid)
499 return mlxsw_sp_fid_8021q_fid(fid)->vid;
502 static int mlxsw_sp_fid_8021q_setup(struct mlxsw_sp_fid *fid, const void *arg)
506 mlxsw_sp_fid_8021q_fid(fid)->vid = vid;
507 fid->fid_offset = fid->fid_index - fid->fid_family->start_index;
518 const struct mlxsw_sp_fid *fid,
523 smpe = fid->fid_family->smpe_index_valid ? fid->fid_index : 0;
525 mlxsw_reg_sfmr_pack(sfmr_pl, op, fid->fid_index,
526 fid->fid_family->smpe_index_valid, smpe);
530 const struct mlxsw_sp_fid *fid,
533 mlxsw_sp_fid_pack(sfmr_pl, fid, op);
534 mlxsw_reg_sfmr_fid_offset_set(sfmr_pl, fid->fid_offset);
535 mlxsw_reg_sfmr_flood_rsp_set(sfmr_pl, fid->fid_family->flood_rsp);
537 fid->fid_family->bridge_type);
548 static u16 mlxsw_sp_fid_pgt_base_cff(const struct mlxsw_sp_fid *fid)
550 return mlxsw_sp_fid_off_pgt_base_cff(fid->fid_family, fid->fid_offset);
554 const struct mlxsw_sp_fid *fid,
557 struct mlxsw_sp_fid_family *fid_family = fid->fid_family;
558 u16 pgt_base = mlxsw_sp_fid_pgt_base_cff(fid);
560 mlxsw_sp_fid_pack(sfmr_pl, fid, op);
580 static int mlxsw_sp_fid_op(const struct mlxsw_sp_fid *fid, bool valid)
582 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp;
585 fid->fid_family->ops->fid_pack(sfmr_pl, fid,
590 static int mlxsw_sp_fid_edit_op(const struct mlxsw_sp_fid *fid,
593 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp;
596 fid->fid_family->ops->fid_pack(sfmr_pl, fid,
599 mlxsw_reg_sfmr_vv_set(sfmr_pl, fid->vni_valid);
600 mlxsw_reg_sfmr_vni_set(sfmr_pl, be32_to_cpu(fid->vni));
601 mlxsw_reg_sfmr_vtfp_set(sfmr_pl, fid->nve_flood_index_valid);
602 mlxsw_reg_sfmr_nve_tunnel_flood_ptr_set(sfmr_pl, fid->nve_flood_index);
612 static int mlxsw_sp_fid_vni_to_fid_map(const struct mlxsw_sp_fid *fid,
616 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp;
624 mlxsw_reg_svfa_vni_pack(svfa_pl, valid, fid->fid_index,
625 be32_to_cpu(fid->vni), irif_valid, irif_index);
629 static int mlxsw_sp_fid_to_fid_rif_update(const struct mlxsw_sp_fid *fid,
632 return mlxsw_sp_fid_edit_op(fid, rif);
635 static int mlxsw_sp_fid_vni_to_fid_rif_update(const struct mlxsw_sp_fid *fid,
638 if (!fid->vni_valid)
641 return mlxsw_sp_fid_vni_to_fid_map(fid, rif, fid->vni_valid);
645 mlxsw_sp_fid_vid_to_fid_map(const struct mlxsw_sp_fid *fid, u16 vid, bool valid,
648 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp;
656 mlxsw_reg_svfa_vid_pack(svfa_pl, valid, fid->fid_index, vid, irif_valid,
662 mlxsw_sp_fid_8021q_vid_to_fid_rif_update(const struct mlxsw_sp_fid *fid,
665 struct mlxsw_sp_fid_8021q *fid_8021q = mlxsw_sp_fid_8021q_fid(fid);
670 return mlxsw_sp_fid_vid_to_fid_map(fid, fid_8021q->vid, true, rif);
674 mlxsw_sp_fid_port_vid_to_fid_rif_update_one(const struct mlxsw_sp_fid *fid,
678 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp;
682 fid->fid_index, pv->vid, irif_valid,
688 static int mlxsw_sp_fid_vid_to_fid_rif_set(const struct mlxsw_sp_fid *fid,
691 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp;
696 err = fid->fid_family->ops->vid_to_fid_rif_update(fid, rif);
702 list_for_each_entry(pv, &fid->port_vid_list, list) {
710 err = mlxsw_sp_fid_port_vid_to_fid_rif_update_one(fid, pv,
720 list_for_each_entry_continue_reverse(pv, &fid->port_vid_list, list) {
724 mlxsw_sp_fid_port_vid_to_fid_rif_update_one(fid, pv, false, 0);
727 fid->fid_family->ops->vid_to_fid_rif_update(fid, NULL);
731 static void mlxsw_sp_fid_vid_to_fid_rif_unset(const struct mlxsw_sp_fid *fid)
733 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp;
736 list_for_each_entry(pv, &fid->port_vid_list, list) {
743 mlxsw_sp_fid_port_vid_to_fid_rif_update_one(fid, pv, false, 0);
746 fid->fid_family->ops->vid_to_fid_rif_update(fid, NULL);
749 static int mlxsw_sp_fid_reiv_handle(struct mlxsw_sp_fid *fid, u16 rif_index,
754 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp;
766 list_for_each_entry(port_vid, &fid->port_vid_list, list) {
798 static int mlxsw_sp_fid_erif_eport_to_vid_map(struct mlxsw_sp_fid *fid,
801 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp;
809 err = mlxsw_sp_fid_reiv_handle(fid, rif_index, valid, i);
818 mlxsw_sp_fid_reiv_handle(fid, rif_index, !valid, i);
822 int mlxsw_sp_fid_rif_set(struct mlxsw_sp_fid *fid, struct mlxsw_sp_rif *rif)
827 err = mlxsw_sp_fid_to_fid_rif_update(fid, rif);
831 err = mlxsw_sp_fid_vni_to_fid_rif_update(fid, rif);
835 err = mlxsw_sp_fid_vid_to_fid_rif_set(fid, rif);
839 err = mlxsw_sp_fid_erif_eport_to_vid_map(fid, rif_index, true);
843 fid->rif = rif;
847 mlxsw_sp_fid_vid_to_fid_rif_unset(fid);
849 mlxsw_sp_fid_vni_to_fid_rif_update(fid, NULL);
851 mlxsw_sp_fid_to_fid_rif_update(fid, NULL);
855 void mlxsw_sp_fid_rif_unset(struct mlxsw_sp_fid *fid)
859 if (!fid->rif)
862 rif_index = mlxsw_sp_rif_index(fid->rif);
863 fid->rif = NULL;
865 mlxsw_sp_fid_erif_eport_to_vid_map(fid, rif_index, false);
866 mlxsw_sp_fid_vid_to_fid_rif_unset(fid);
867 mlxsw_sp_fid_vni_to_fid_rif_update(fid, NULL);
868 mlxsw_sp_fid_to_fid_rif_update(fid, NULL);
871 static int mlxsw_sp_fid_vni_op(const struct mlxsw_sp_fid *fid)
875 err = mlxsw_sp_fid_vni_to_fid_map(fid, fid->rif, fid->vni_valid);
879 err = mlxsw_sp_fid_edit_op(fid, fid->rif);
886 mlxsw_sp_fid_vni_to_fid_map(fid, fid->rif, !fid->vni_valid);
890 static int __mlxsw_sp_fid_port_vid_map(const struct mlxsw_sp_fid *fid,
893 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp;
898 if (fid->rif) {
900 irif_index = mlxsw_sp_rif_index(fid->rif);
903 mlxsw_reg_svfa_port_vid_pack(svfa_pl, local_port, valid, fid->fid_index,
909 mlxsw_sp_fid_8021d_fid(const struct mlxsw_sp_fid *fid)
911 return container_of(fid, struct mlxsw_sp_fid_8021d, common);
914 static int mlxsw_sp_fid_8021d_setup(struct mlxsw_sp_fid *fid, const void *arg)
918 mlxsw_sp_fid_8021d_fid(fid)->br_ifindex = br_ifindex;
919 fid->fid_offset = fid->fid_index - fid->fid_family->start_index;
923 static int mlxsw_sp_fid_8021d_configure(struct mlxsw_sp_fid *fid)
925 return mlxsw_sp_fid_op(fid, true);
928 static void mlxsw_sp_fid_8021d_deconfigure(struct mlxsw_sp_fid *fid)
930 if (fid->vni_valid)
931 mlxsw_sp_nve_fid_disable(fid->fid_family->mlxsw_sp, fid);
932 mlxsw_sp_fid_op(fid, false);
935 static int mlxsw_sp_fid_8021d_index_alloc(struct mlxsw_sp_fid *fid,
938 struct mlxsw_sp_fid_family *fid_family = fid->fid_family;
951 mlxsw_sp_fid_8021d_compare(const struct mlxsw_sp_fid *fid, const void *arg)
955 return mlxsw_sp_fid_8021d_fid(fid)->br_ifindex == br_ifindex;
965 struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
968 if (!fid)
971 err = __mlxsw_sp_fid_port_vid_map(fid,
988 struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
991 if (!fid)
994 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid,
1008 struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
1011 if (!fid)
1014 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid,
1020 mlxsw_sp_fid_port_vid_list_add(struct mlxsw_sp_fid *fid, u16 local_port,
1032 list_for_each_entry(tmp_port_vid, &fid->port_vid_list, list) {
1042 mlxsw_sp_fid_port_vid_list_del(struct mlxsw_sp_fid *fid, u16 local_port,
1047 list_for_each_entry_safe(port_vid, tmp, &fid->port_vid_list, list) {
1058 mlxsw_sp_fid_mpe_table_map(const struct mlxsw_sp_fid *fid, u16 local_port,
1061 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp;
1064 mlxsw_reg_smpe_pack(smpe_pl, local_port, fid->fid_index,
1070 mlxsw_sp_fid_erif_eport_to_vid_map_one(const struct mlxsw_sp_fid *fid,
1075 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp;
1076 u16 rif_index = mlxsw_sp_rif_index(fid->rif);
1092 static int mlxsw_sp_fid_evid_map(const struct mlxsw_sp_fid *fid, u16 local_port,
1097 err = mlxsw_sp_fid_mpe_table_map(fid, local_port, vid, valid);
1101 if (!fid->rif)
1104 err = mlxsw_sp_fid_erif_eport_to_vid_map_one(fid, local_port, vid,
1112 mlxsw_sp_fid_mpe_table_map(fid, local_port, vid, !valid);
1116 static int mlxsw_sp_fid_8021d_port_vid_map(struct mlxsw_sp_fid *fid,
1124 err = __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid,
1129 err = mlxsw_sp_fid_evid_map(fid, local_port, vid, true);
1133 err = mlxsw_sp_fid_port_vid_list_add(fid, mlxsw_sp_port->local_port,
1148 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid);
1150 mlxsw_sp_fid_evid_map(fid, local_port, vid, false);
1152 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, false);
1157 mlxsw_sp_fid_8021d_port_vid_unmap(struct mlxsw_sp_fid *fid,
1166 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid);
1167 mlxsw_sp_fid_evid_map(fid, local_port, vid, false);
1168 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, false);
1171 static int mlxsw_sp_fid_8021d_vni_set(struct mlxsw_sp_fid *fid)
1173 return mlxsw_sp_fid_vni_op(fid);
1176 static void mlxsw_sp_fid_8021d_vni_clear(struct mlxsw_sp_fid *fid)
1178 mlxsw_sp_fid_vni_op(fid);
1181 static int mlxsw_sp_fid_8021d_nve_flood_index_set(struct mlxsw_sp_fid *fid)
1183 return mlxsw_sp_fid_edit_op(fid, fid->rif);
1186 static void mlxsw_sp_fid_8021d_nve_flood_index_clear(struct mlxsw_sp_fid *fid)
1188 mlxsw_sp_fid_edit_op(fid, fid->rif);
1192 mlxsw_sp_fid_8021d_fdb_clear_offload(const struct mlxsw_sp_fid *fid,
1199 mlxsw_sp_fid_8021d_vid_to_fid_rif_update(const struct mlxsw_sp_fid *fid,
1256 mlxsw_sp_fid_fid_mid_cff(const struct mlxsw_sp_fid *fid,
1259 return mlxsw_sp_fid_pgt_base_cff(fid) + flood_table->table_index;
1342 mlxsw_sp_fid_8021q_compare(const struct mlxsw_sp_fid *fid, const void *arg)
1346 return mlxsw_sp_fid_8021q_fid(fid)->vid == vid;
1350 mlxsw_sp_fid_8021q_fdb_clear_offload(const struct mlxsw_sp_fid *fid,
1353 br_fdb_clear_offload(nve_dev, mlxsw_sp_fid_8021q_vid(fid));
1356 static int mlxsw_sp_fid_rfid_setup_ctl(struct mlxsw_sp_fid *fid,
1360 fid->fid_offset = 0;
1364 static int mlxsw_sp_fid_rfid_setup_cff(struct mlxsw_sp_fid *fid,
1367 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp;
1382 fid->fid_offset = mlxsw_sp_fid_rfid_fid_offset_cff(mlxsw_sp, port,
1387 static int mlxsw_sp_fid_rfid_configure(struct mlxsw_sp_fid *fid)
1389 return mlxsw_sp_fid_op(fid, true);
1392 static void mlxsw_sp_fid_rfid_deconfigure(struct mlxsw_sp_fid *fid)
1394 mlxsw_sp_fid_op(fid, false);
1397 static int mlxsw_sp_fid_rfid_index_alloc(struct mlxsw_sp_fid *fid,
1402 *p_fid_index = fid->fid_family->start_index + rif_index;
1407 static bool mlxsw_sp_fid_rfid_compare(const struct mlxsw_sp_fid *fid,
1412 return fid->fid_index == rif_index + fid->fid_family->start_index;
1415 static int mlxsw_sp_fid_rfid_port_vid_map(struct mlxsw_sp_fid *fid,
1423 err = mlxsw_sp_fid_port_vid_list_add(fid, mlxsw_sp_port->local_port,
1433 err = __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid,
1438 if (fid->rif) {
1439 err = mlxsw_sp_fid_erif_eport_to_vid_map_one(fid, local_port,
1455 if (fid->rif)
1456 mlxsw_sp_fid_erif_eport_to_vid_map_one(fid, local_port, vid,
1459 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, false);
1461 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid);
1466 mlxsw_sp_fid_rfid_port_vid_unmap(struct mlxsw_sp_fid *fid,
1476 if (fid->rif)
1477 mlxsw_sp_fid_erif_eport_to_vid_map_one(fid, local_port, vid,
1479 __mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port->local_port, vid, false);
1480 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid);
1483 static int mlxsw_sp_fid_rfid_vni_set(struct mlxsw_sp_fid *fid)
1488 static void mlxsw_sp_fid_rfid_vni_clear(struct mlxsw_sp_fid *fid)
1493 static int mlxsw_sp_fid_rfid_nve_flood_index_set(struct mlxsw_sp_fid *fid)
1498 static void mlxsw_sp_fid_rfid_nve_flood_index_clear(struct mlxsw_sp_fid *fid)
1504 mlxsw_sp_fid_rfid_vid_to_fid_rif_update(const struct mlxsw_sp_fid *fid,
1659 static int mlxsw_sp_fid_dummy_setup(struct mlxsw_sp_fid *fid, const void *arg)
1661 fid->fid_offset = 0;
1665 static int mlxsw_sp_fid_dummy_configure(struct mlxsw_sp_fid *fid)
1667 return mlxsw_sp_fid_op(fid, true);
1670 static void mlxsw_sp_fid_dummy_deconfigure(struct mlxsw_sp_fid *fid)
1672 mlxsw_sp_fid_op(fid, false);
1675 static int mlxsw_sp_fid_dummy_index_alloc(struct mlxsw_sp_fid *fid,
1678 *p_fid_index = fid->fid_family->start_index;
1683 static bool mlxsw_sp_fid_dummy_compare(const struct mlxsw_sp_fid *fid,
1689 static int mlxsw_sp_fid_dummy_vni_set(struct mlxsw_sp_fid *fid)
1694 static void mlxsw_sp_fid_dummy_vni_clear(struct mlxsw_sp_fid *fid)
1699 static int mlxsw_sp_fid_dummy_nve_flood_index_set(struct mlxsw_sp_fid *fid)
1704 static void mlxsw_sp_fid_dummy_nve_flood_index_clear(struct mlxsw_sp_fid *fid)
1722 static int mlxsw_sp_fid_8021q_configure(struct mlxsw_sp_fid *fid)
1724 struct mlxsw_sp_fid_8021q *fid_8021q = mlxsw_sp_fid_8021q_fid(fid);
1727 err = mlxsw_sp_fid_op(fid, true);
1731 err = mlxsw_sp_fid_vid_to_fid_map(fid, fid_8021q->vid, true, fid->rif);
1738 mlxsw_sp_fid_op(fid, false);
1742 static void mlxsw_sp_fid_8021q_deconfigure(struct mlxsw_sp_fid *fid)
1744 struct mlxsw_sp_fid_8021q *fid_8021q = mlxsw_sp_fid_8021q_fid(fid);
1746 if (fid->vni_valid)
1747 mlxsw_sp_nve_fid_disable(fid->fid_family->mlxsw_sp, fid);
1749 mlxsw_sp_fid_vid_to_fid_map(fid, fid_8021q->vid, false, NULL);
1750 mlxsw_sp_fid_op(fid, false);
1753 static int mlxsw_sp_fid_8021q_port_vid_map(struct mlxsw_sp_fid *fid,
1766 err = __mlxsw_sp_fid_port_vid_map(fid, local_port, vid, true);
1771 err = mlxsw_sp_fid_evid_map(fid, local_port, vid, true);
1775 err = mlxsw_sp_fid_port_vid_list_add(fid, mlxsw_sp_port->local_port,
1783 mlxsw_sp_fid_evid_map(fid, local_port, vid, false);
1786 __mlxsw_sp_fid_port_vid_map(fid, local_port, vid, false);
1791 mlxsw_sp_fid_8021q_port_vid_unmap(struct mlxsw_sp_fid *fid,
1797 mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid);
1798 mlxsw_sp_fid_evid_map(fid, local_port, vid, false);
1800 __mlxsw_sp_fid_port_vid_map(fid, local_port, vid, false);
1998 struct mlxsw_sp_fid *fid;
2001 list_for_each_entry(fid, &fid_family->fids_list, list) {
2002 if (!fid->fid_family->ops->compare(fid, arg))
2004 refcount_inc(&fid->ref_count);
2005 return fid;
2016 struct mlxsw_sp_fid *fid;
2020 fid = mlxsw_sp_fid_lookup(mlxsw_sp, type, arg);
2021 if (fid)
2022 return fid;
2025 fid = kzalloc(fid_family->fid_size, GFP_KERNEL);
2026 if (!fid)
2029 INIT_LIST_HEAD(&fid->port_vid_list);
2030 fid->fid_family = fid_family;
2032 err = fid->fid_family->ops->index_alloc(fid, arg, &fid_index);
2035 fid->fid_index = fid_index;
2038 err = fid->fid_family->ops->setup(fid, arg);
2042 err = fid->fid_family->ops->configure(fid);
2046 err = rhashtable_insert_fast(&mlxsw_sp->fid_core->fid_ht, &fid->ht_node,
2051 list_add(&fid->list, &fid_family->fids_list);
2052 refcount_set(&fid->ref_count, 1);
2053 return fid;
2056 fid->fid_family->ops->deconfigure(fid);
2062 kfree(fid);
2066 void mlxsw_sp_fid_put(struct mlxsw_sp_fid *fid)
2068 struct mlxsw_sp_fid_family *fid_family = fid->fid_family;
2071 if (!refcount_dec_and_test(&fid->ref_count))
2074 list_del(&fid->list);
2076 &fid->ht_node, mlxsw_sp_fid_ht_params);
2077 fid->fid_family->ops->deconfigure(fid);
2078 __clear_bit(fid->fid_index - fid_family->start_index,
2080 WARN_ON_ONCE(!list_empty(&fid->port_vid_list));
2081 kfree(fid);