• Home
  • Raw
  • Download

Lines Matching refs:fid

72 	void (*setup)(struct mlxsw_sp_fid *fid, const void *arg);
73 int (*configure)(struct mlxsw_sp_fid *fid);
74 void (*deconfigure)(struct mlxsw_sp_fid *fid);
75 int (*index_alloc)(struct mlxsw_sp_fid *fid, const void *arg,
77 bool (*compare)(const struct mlxsw_sp_fid *fid,
79 u16 (*flood_index)(const struct mlxsw_sp_fid *fid);
80 int (*port_vid_map)(struct mlxsw_sp_fid *fid,
82 void (*port_vid_unmap)(struct mlxsw_sp_fid *fid,
84 int (*vni_set)(struct mlxsw_sp_fid *fid, __be32 vni);
85 void (*vni_clear)(struct mlxsw_sp_fid *fid);
86 int (*nve_flood_index_set)(struct mlxsw_sp_fid *fid,
88 void (*nve_flood_index_clear)(struct mlxsw_sp_fid *fid);
89 void (*fdb_clear_offload)(const struct mlxsw_sp_fid *fid,
140 bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_lag_vid_valid() argument
142 return fid->fid_family->lag_vid_valid; in mlxsw_sp_fid_lag_vid_valid()
148 struct mlxsw_sp_fid *fid; in mlxsw_sp_fid_lookup_by_index() local
150 fid = rhashtable_lookup_fast(&mlxsw_sp->fid_core->fid_ht, &fid_index, in mlxsw_sp_fid_lookup_by_index()
152 if (fid) in mlxsw_sp_fid_lookup_by_index()
153 refcount_inc(&fid->ref_count); in mlxsw_sp_fid_lookup_by_index()
155 return fid; in mlxsw_sp_fid_lookup_by_index()
158 int mlxsw_sp_fid_nve_ifindex(const struct mlxsw_sp_fid *fid, int *nve_ifindex) in mlxsw_sp_fid_nve_ifindex() argument
160 if (!fid->vni_valid) in mlxsw_sp_fid_nve_ifindex()
163 *nve_ifindex = fid->nve_ifindex; in mlxsw_sp_fid_nve_ifindex()
168 int mlxsw_sp_fid_nve_type(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_nve_type() argument
171 if (!fid->vni_valid) in mlxsw_sp_fid_nve_type()
174 *p_type = fid->nve_type; in mlxsw_sp_fid_nve_type()
182 struct mlxsw_sp_fid *fid; in mlxsw_sp_fid_lookup_by_vni() local
184 fid = rhashtable_lookup_fast(&mlxsw_sp->fid_core->vni_ht, &vni, in mlxsw_sp_fid_lookup_by_vni()
186 if (fid) in mlxsw_sp_fid_lookup_by_vni()
187 refcount_inc(&fid->ref_count); in mlxsw_sp_fid_lookup_by_vni()
189 return fid; in mlxsw_sp_fid_lookup_by_vni()
192 int mlxsw_sp_fid_vni(const struct mlxsw_sp_fid *fid, __be32 *vni) in mlxsw_sp_fid_vni() argument
194 if (!fid->vni_valid) in mlxsw_sp_fid_vni()
197 *vni = fid->vni; in mlxsw_sp_fid_vni()
202 int mlxsw_sp_fid_nve_flood_index_set(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_nve_flood_index_set() argument
205 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_nve_flood_index_set()
209 if (WARN_ON(!ops->nve_flood_index_set || fid->nve_flood_index_valid)) in mlxsw_sp_fid_nve_flood_index_set()
212 err = ops->nve_flood_index_set(fid, nve_flood_index); in mlxsw_sp_fid_nve_flood_index_set()
216 fid->nve_flood_index = nve_flood_index; in mlxsw_sp_fid_nve_flood_index_set()
217 fid->nve_flood_index_valid = true; in mlxsw_sp_fid_nve_flood_index_set()
222 void mlxsw_sp_fid_nve_flood_index_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_nve_flood_index_clear() argument
224 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_nve_flood_index_clear()
227 if (WARN_ON(!ops->nve_flood_index_clear || !fid->nve_flood_index_valid)) in mlxsw_sp_fid_nve_flood_index_clear()
230 fid->nve_flood_index_valid = false; in mlxsw_sp_fid_nve_flood_index_clear()
231 ops->nve_flood_index_clear(fid); in mlxsw_sp_fid_nve_flood_index_clear()
234 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
236 return fid->nve_flood_index_valid; in mlxsw_sp_fid_nve_flood_index_is_set()
239 int mlxsw_sp_fid_vni_set(struct mlxsw_sp_fid *fid, enum mlxsw_sp_nve_type type, in mlxsw_sp_fid_vni_set() argument
242 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_vni_set()
247 if (WARN_ON(!ops->vni_set || fid->vni_valid)) in mlxsw_sp_fid_vni_set()
250 fid->nve_type = type; in mlxsw_sp_fid_vni_set()
251 fid->nve_ifindex = nve_ifindex; in mlxsw_sp_fid_vni_set()
252 fid->vni = vni; in mlxsw_sp_fid_vni_set()
254 &fid->vni_ht_node, in mlxsw_sp_fid_vni_set()
259 err = ops->vni_set(fid, vni); in mlxsw_sp_fid_vni_set()
263 fid->vni_valid = true; in mlxsw_sp_fid_vni_set()
268 rhashtable_remove_fast(&mlxsw_sp->fid_core->vni_ht, &fid->vni_ht_node, in mlxsw_sp_fid_vni_set()
273 void mlxsw_sp_fid_vni_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_vni_clear() argument
275 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_vni_clear()
279 if (WARN_ON(!ops->vni_clear || !fid->vni_valid)) in mlxsw_sp_fid_vni_clear()
282 fid->vni_valid = false; in mlxsw_sp_fid_vni_clear()
283 ops->vni_clear(fid); in mlxsw_sp_fid_vni_clear()
284 rhashtable_remove_fast(&mlxsw_sp->fid_core->vni_ht, &fid->vni_ht_node, in mlxsw_sp_fid_vni_clear()
288 bool mlxsw_sp_fid_vni_is_set(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_vni_is_set() argument
290 return fid->vni_valid; in mlxsw_sp_fid_vni_is_set()
293 void mlxsw_sp_fid_fdb_clear_offload(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_fdb_clear_offload() argument
296 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_fdb_clear_offload()
300 ops->fdb_clear_offload(fid, nve_dev); in mlxsw_sp_fid_fdb_clear_offload()
304 mlxsw_sp_fid_flood_table_lookup(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_flood_table_lookup() argument
307 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_flood_table_lookup()
319 int mlxsw_sp_fid_flood_set(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_flood_set() argument
323 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_flood_set()
332 flood_table = mlxsw_sp_fid_flood_table_lookup(fid, packet_type); in mlxsw_sp_fid_flood_set()
341 ops->flood_index(fid), flood_table->table_type, 1, in mlxsw_sp_fid_flood_set()
349 int mlxsw_sp_fid_port_vid_map(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_port_vid_map() argument
352 if (WARN_ON(!fid->fid_family->ops->port_vid_map)) in mlxsw_sp_fid_port_vid_map()
354 return fid->fid_family->ops->port_vid_map(fid, mlxsw_sp_port, vid); in mlxsw_sp_fid_port_vid_map()
357 void mlxsw_sp_fid_port_vid_unmap(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_port_vid_unmap() argument
360 fid->fid_family->ops->port_vid_unmap(fid, mlxsw_sp_port, vid); in mlxsw_sp_fid_port_vid_unmap()
363 u16 mlxsw_sp_fid_index(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_index() argument
365 return fid->fid_index; in mlxsw_sp_fid_index()
368 enum mlxsw_sp_fid_type mlxsw_sp_fid_type(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_type() argument
370 return fid->fid_family->type; in mlxsw_sp_fid_type()
373 void mlxsw_sp_fid_rif_set(struct mlxsw_sp_fid *fid, struct mlxsw_sp_rif *rif) in mlxsw_sp_fid_rif_set() argument
375 fid->rif = rif; in mlxsw_sp_fid_rif_set()
378 struct mlxsw_sp_rif *mlxsw_sp_fid_rif(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rif() argument
380 return fid->rif; in mlxsw_sp_fid_rif()
393 mlxsw_sp_fid_8021q_fid(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021q_fid() argument
395 return container_of(fid, struct mlxsw_sp_fid_8021q, common); in mlxsw_sp_fid_8021q_fid()
398 u16 mlxsw_sp_fid_8021q_vid(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021q_vid() argument
400 return mlxsw_sp_fid_8021q_fid(fid)->vid; in mlxsw_sp_fid_8021q_vid()
403 static void mlxsw_sp_fid_8021q_setup(struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_8021q_setup() argument
407 mlxsw_sp_fid_8021q_fid(fid)->vid = vid; in mlxsw_sp_fid_8021q_setup()
452 mlxsw_sp_fid_8021d_fid(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_fid() argument
454 return container_of(fid, struct mlxsw_sp_fid_8021d, common); in mlxsw_sp_fid_8021d_fid()
457 static void mlxsw_sp_fid_8021d_setup(struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_8021d_setup() argument
461 mlxsw_sp_fid_8021d_fid(fid)->br_ifindex = br_ifindex; in mlxsw_sp_fid_8021d_setup()
464 static int mlxsw_sp_fid_8021d_configure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_configure() argument
466 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_8021d_configure()
468 return mlxsw_sp_fid_op(fid_family->mlxsw_sp, fid->fid_index, 0, true); in mlxsw_sp_fid_8021d_configure()
471 static void mlxsw_sp_fid_8021d_deconfigure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_deconfigure() argument
473 if (fid->vni_valid) in mlxsw_sp_fid_8021d_deconfigure()
474 mlxsw_sp_nve_fid_disable(fid->fid_family->mlxsw_sp, fid); in mlxsw_sp_fid_8021d_deconfigure()
475 mlxsw_sp_fid_op(fid->fid_family->mlxsw_sp, fid->fid_index, 0, false); in mlxsw_sp_fid_8021d_deconfigure()
478 static int mlxsw_sp_fid_8021d_index_alloc(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021d_index_alloc() argument
481 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_8021d_index_alloc()
494 mlxsw_sp_fid_8021d_compare(const struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_8021d_compare() argument
498 return mlxsw_sp_fid_8021d_fid(fid)->br_ifindex == br_ifindex; in mlxsw_sp_fid_8021d_compare()
501 static u16 mlxsw_sp_fid_8021d_flood_index(const struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_flood_index() argument
503 return fid->fid_index - VLAN_N_VID; in mlxsw_sp_fid_8021d_flood_index()
514 struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid; in mlxsw_sp_port_vp_mode_trans() local
517 if (!fid) in mlxsw_sp_port_vp_mode_trans()
520 err = __mlxsw_sp_fid_port_vid_map(mlxsw_sp, fid->fid_index, in mlxsw_sp_port_vp_mode_trans()
537 struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid; in mlxsw_sp_port_vp_mode_trans() local
540 if (!fid) in mlxsw_sp_port_vp_mode_trans()
543 __mlxsw_sp_fid_port_vid_map(mlxsw_sp, fid->fid_index, in mlxsw_sp_port_vp_mode_trans()
559 struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid; in mlxsw_sp_port_vlan_mode_trans() local
562 if (!fid) in mlxsw_sp_port_vlan_mode_trans()
565 __mlxsw_sp_fid_port_vid_map(mlxsw_sp, fid->fid_index, in mlxsw_sp_port_vlan_mode_trans()
571 static int mlxsw_sp_fid_8021d_port_vid_map(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021d_port_vid_map() argument
579 err = __mlxsw_sp_fid_port_vid_map(mlxsw_sp, fid->fid_index, in mlxsw_sp_fid_8021d_port_vid_map()
594 __mlxsw_sp_fid_port_vid_map(mlxsw_sp, fid->fid_index, in mlxsw_sp_fid_8021d_port_vid_map()
600 mlxsw_sp_fid_8021d_port_vid_unmap(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021d_port_vid_unmap() argument
609 __mlxsw_sp_fid_port_vid_map(mlxsw_sp, fid->fid_index, in mlxsw_sp_fid_8021d_port_vid_unmap()
613 static int mlxsw_sp_fid_8021d_vni_set(struct mlxsw_sp_fid *fid, __be32 vni) in mlxsw_sp_fid_8021d_vni_set() argument
615 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_8021d_vni_set()
617 return mlxsw_sp_fid_vni_op(fid_family->mlxsw_sp, fid->fid_index, vni, in mlxsw_sp_fid_8021d_vni_set()
618 true, fid->nve_flood_index, in mlxsw_sp_fid_8021d_vni_set()
619 fid->nve_flood_index_valid); in mlxsw_sp_fid_8021d_vni_set()
622 static void mlxsw_sp_fid_8021d_vni_clear(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_8021d_vni_clear() argument
624 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_8021d_vni_clear()
626 mlxsw_sp_fid_vni_op(fid_family->mlxsw_sp, fid->fid_index, 0, false, in mlxsw_sp_fid_8021d_vni_clear()
627 fid->nve_flood_index, fid->nve_flood_index_valid); in mlxsw_sp_fid_8021d_vni_clear()
630 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
633 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_8021d_nve_flood_index_set()
635 return mlxsw_sp_fid_vni_op(fid_family->mlxsw_sp, fid->fid_index, in mlxsw_sp_fid_8021d_nve_flood_index_set()
636 fid->vni, fid->vni_valid, nve_flood_index, in mlxsw_sp_fid_8021d_nve_flood_index_set()
640 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
642 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_8021d_nve_flood_index_clear()
644 mlxsw_sp_fid_vni_op(fid_family->mlxsw_sp, fid->fid_index, fid->vni, in mlxsw_sp_fid_8021d_nve_flood_index_clear()
645 fid->vni_valid, 0, false); in mlxsw_sp_fid_8021d_nve_flood_index_clear()
649 mlxsw_sp_fid_8021d_fdb_clear_offload(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021d_fdb_clear_offload() argument
706 mlxsw_sp_fid_8021q_compare(const struct mlxsw_sp_fid *fid, const void *arg) in mlxsw_sp_fid_8021q_compare() argument
710 return mlxsw_sp_fid_8021q_fid(fid)->vid == vid; in mlxsw_sp_fid_8021q_compare()
714 mlxsw_sp_fid_8021q_fdb_clear_offload(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_8021q_fdb_clear_offload() argument
717 br_fdb_clear_offload(nve_dev, mlxsw_sp_fid_8021q_vid(fid)); in mlxsw_sp_fid_8021q_fdb_clear_offload()
754 static int mlxsw_sp_fid_rfid_configure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rfid_configure() argument
760 static void mlxsw_sp_fid_rfid_deconfigure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_rfid_deconfigure() argument
764 static int mlxsw_sp_fid_rfid_index_alloc(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_rfid_index_alloc() argument
769 *p_fid_index = fid->fid_family->start_index + rif_index; in mlxsw_sp_fid_rfid_index_alloc()
774 static bool mlxsw_sp_fid_rfid_compare(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_rfid_compare() argument
779 return fid->fid_index == rif_index + fid->fid_family->start_index; in mlxsw_sp_fid_rfid_compare()
782 static int mlxsw_sp_fid_rfid_port_vid_map(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_rfid_port_vid_map() argument
807 mlxsw_sp_fid_rfid_port_vid_unmap(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_rfid_port_vid_unmap() argument
839 static int mlxsw_sp_fid_dummy_configure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_dummy_configure() argument
841 struct mlxsw_sp *mlxsw_sp = fid->fid_family->mlxsw_sp; in mlxsw_sp_fid_dummy_configure()
843 return mlxsw_sp_fid_op(mlxsw_sp, fid->fid_index, 0, true); in mlxsw_sp_fid_dummy_configure()
846 static void mlxsw_sp_fid_dummy_deconfigure(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_dummy_deconfigure() argument
848 mlxsw_sp_fid_op(fid->fid_family->mlxsw_sp, fid->fid_index, 0, false); in mlxsw_sp_fid_dummy_deconfigure()
851 static int mlxsw_sp_fid_dummy_index_alloc(struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_dummy_index_alloc() argument
854 *p_fid_index = fid->fid_family->start_index; in mlxsw_sp_fid_dummy_index_alloc()
859 static bool mlxsw_sp_fid_dummy_compare(const struct mlxsw_sp_fid *fid, in mlxsw_sp_fid_dummy_compare() argument
892 struct mlxsw_sp_fid *fid; in mlxsw_sp_fid_lookup() local
895 list_for_each_entry(fid, &fid_family->fids_list, list) { in mlxsw_sp_fid_lookup()
896 if (!fid->fid_family->ops->compare(fid, arg)) in mlxsw_sp_fid_lookup()
898 refcount_inc(&fid->ref_count); in mlxsw_sp_fid_lookup()
899 return fid; in mlxsw_sp_fid_lookup()
910 struct mlxsw_sp_fid *fid; in mlxsw_sp_fid_get() local
914 fid = mlxsw_sp_fid_lookup(mlxsw_sp, type, arg); in mlxsw_sp_fid_get()
915 if (fid) in mlxsw_sp_fid_get()
916 return fid; in mlxsw_sp_fid_get()
919 fid = kzalloc(fid_family->fid_size, GFP_KERNEL); in mlxsw_sp_fid_get()
920 if (!fid) in mlxsw_sp_fid_get()
922 fid->fid_family = fid_family; in mlxsw_sp_fid_get()
924 err = fid->fid_family->ops->index_alloc(fid, arg, &fid_index); in mlxsw_sp_fid_get()
927 fid->fid_index = fid_index; in mlxsw_sp_fid_get()
930 if (fid->fid_family->ops->setup) in mlxsw_sp_fid_get()
931 fid->fid_family->ops->setup(fid, arg); in mlxsw_sp_fid_get()
933 err = fid->fid_family->ops->configure(fid); in mlxsw_sp_fid_get()
937 err = rhashtable_insert_fast(&mlxsw_sp->fid_core->fid_ht, &fid->ht_node, in mlxsw_sp_fid_get()
942 list_add(&fid->list, &fid_family->fids_list); in mlxsw_sp_fid_get()
943 refcount_set(&fid->ref_count, 1); in mlxsw_sp_fid_get()
944 return fid; in mlxsw_sp_fid_get()
947 fid->fid_family->ops->deconfigure(fid); in mlxsw_sp_fid_get()
952 kfree(fid); in mlxsw_sp_fid_get()
956 void mlxsw_sp_fid_put(struct mlxsw_sp_fid *fid) in mlxsw_sp_fid_put() argument
958 struct mlxsw_sp_fid_family *fid_family = fid->fid_family; in mlxsw_sp_fid_put()
961 if (!refcount_dec_and_test(&fid->ref_count)) in mlxsw_sp_fid_put()
964 list_del(&fid->list); in mlxsw_sp_fid_put()
966 &fid->ht_node, mlxsw_sp_fid_ht_params); in mlxsw_sp_fid_put()
967 fid->fid_family->ops->deconfigure(fid); in mlxsw_sp_fid_put()
968 __clear_bit(fid->fid_index - fid_family->start_index, in mlxsw_sp_fid_put()
970 kfree(fid); in mlxsw_sp_fid_put()