drivers/net/ethernet/mellanox/mlxsw/spectrum_mr_tcam.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/mellanox/mlxsw/spectrum_mr_tcam.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/mellanox/mlxsw/spectrum_mr_tcam.c- Extension
.c- Size
- 17160 bytes
- Lines
- 616
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kernel.hlinux/list.hlinux/netdevice.hspectrum_mr_tcam.hreg.hspectrum.hcore_acl_flex_actions.hspectrum_mr.h
Detected Declarations
struct mlxsw_sp_mr_tcamstruct mlxsw_sp_mr_erif_subliststruct mlxsw_sp_mr_tcam_erif_liststruct mlxsw_sp_mr_tcam_routefunction mlxsw_sp_mr_erif_sublist_fullfunction mlxsw_sp_mr_erif_list_initfunction mlxsw_sp_mr_erif_sublist_createfunction mlxsw_sp_mr_erif_sublist_destroyfunction mlxsw_sp_mr_erif_list_addfunction mlxsw_sp_mr_erif_list_flushfunction mlxsw_sp_mr_erif_list_commitfunction list_for_each_entryfunction mlxsw_sp_mr_erif_list_movefunction mlxsw_sp_mr_tcam_afa_block_createfunction mlxsw_sp_mr_tcam_afa_block_destroyfunction mlxsw_sp_mr_tcam_erif_populatefunction mlxsw_sp_mr_tcam_route_createfunction mlxsw_sp_mr_tcam_route_destroyfunction mlxsw_sp_mr_tcam_route_statsfunction mlxsw_sp_mr_tcam_route_action_updatefunction mlxsw_sp_mr_tcam_route_min_mtu_updatefunction mlxsw_sp_mr_tcam_route_irif_updatefunction mlxsw_sp_mr_tcam_route_erif_addfunction mlxsw_sp_mr_tcam_route_erif_delfunction mlxsw_sp_mr_tcam_route_updatefunction mlxsw_sp_mr_tcam_initfunction mlxsw_sp_mr_tcam_fini
Annotated Snippet
struct mlxsw_sp_mr_tcam {
void *priv;
};
/* This struct maps to one RIGR2 register entry */
struct mlxsw_sp_mr_erif_sublist {
struct list_head list;
u32 rigr2_kvdl_index;
int num_erifs;
u16 erif_indices[MLXSW_REG_RIGR2_MAX_ERIFS];
bool synced;
};
struct mlxsw_sp_mr_tcam_erif_list {
struct list_head erif_sublists;
u32 kvdl_index;
};
static bool
mlxsw_sp_mr_erif_sublist_full(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_mr_erif_sublist *erif_sublist)
{
int erif_list_entries = MLXSW_CORE_RES_GET(mlxsw_sp->core,
MC_ERIF_LIST_ENTRIES);
return erif_sublist->num_erifs == erif_list_entries;
}
static void
mlxsw_sp_mr_erif_list_init(struct mlxsw_sp_mr_tcam_erif_list *erif_list)
{
INIT_LIST_HEAD(&erif_list->erif_sublists);
}
static struct mlxsw_sp_mr_erif_sublist *
mlxsw_sp_mr_erif_sublist_create(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_mr_tcam_erif_list *erif_list)
{
struct mlxsw_sp_mr_erif_sublist *erif_sublist;
int err;
erif_sublist = kzalloc_obj(*erif_sublist);
if (!erif_sublist)
return ERR_PTR(-ENOMEM);
err = mlxsw_sp_kvdl_alloc(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR,
1, &erif_sublist->rigr2_kvdl_index);
if (err) {
kfree(erif_sublist);
return ERR_PTR(err);
}
list_add_tail(&erif_sublist->list, &erif_list->erif_sublists);
return erif_sublist;
}
static void
mlxsw_sp_mr_erif_sublist_destroy(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_mr_erif_sublist *erif_sublist)
{
list_del(&erif_sublist->list);
mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR,
1, erif_sublist->rigr2_kvdl_index);
kfree(erif_sublist);
}
static int
mlxsw_sp_mr_erif_list_add(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_mr_tcam_erif_list *erif_list,
u16 erif_index)
{
struct mlxsw_sp_mr_erif_sublist *sublist;
/* If either there is no erif_entry or the last one is full, allocate a
* new one.
*/
if (list_empty(&erif_list->erif_sublists)) {
sublist = mlxsw_sp_mr_erif_sublist_create(mlxsw_sp, erif_list);
if (IS_ERR(sublist))
return PTR_ERR(sublist);
erif_list->kvdl_index = sublist->rigr2_kvdl_index;
} else {
sublist = list_last_entry(&erif_list->erif_sublists,
struct mlxsw_sp_mr_erif_sublist,
list);
sublist->synced = false;
if (mlxsw_sp_mr_erif_sublist_full(mlxsw_sp, sublist)) {
sublist = mlxsw_sp_mr_erif_sublist_create(mlxsw_sp,
erif_list);
if (IS_ERR(sublist))
return PTR_ERR(sublist);
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/list.h`, `linux/netdevice.h`, `spectrum_mr_tcam.h`, `reg.h`, `spectrum.h`, `core_acl_flex_actions.h`, `spectrum_mr.h`.
- Detected declarations: `struct mlxsw_sp_mr_tcam`, `struct mlxsw_sp_mr_erif_sublist`, `struct mlxsw_sp_mr_tcam_erif_list`, `struct mlxsw_sp_mr_tcam_route`, `function mlxsw_sp_mr_erif_sublist_full`, `function mlxsw_sp_mr_erif_list_init`, `function mlxsw_sp_mr_erif_sublist_create`, `function mlxsw_sp_mr_erif_sublist_destroy`, `function mlxsw_sp_mr_erif_list_add`, `function mlxsw_sp_mr_erif_list_flush`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.