drivers/net/ethernet/mellanox/mlx5/core/en/tir.c

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/mellanox/mlx5/core/en/tir.c

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/mellanox/mlx5/core/en/tir.c
Extension
.c
Size
6342 bytes
Lines
230
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.

Dependency Surface

Detected Declarations

Annotated Snippet

struct mlx5e_tir_builder {
	u32 in[MLX5E_TIR_CMD_IN_SZ_DW];
	bool modify;
};

struct mlx5e_tir_builder *mlx5e_tir_builder_alloc(bool modify)
{
	struct mlx5e_tir_builder *builder;

	builder = kvzalloc_obj(*builder);
	if (!builder)
		return NULL;

	builder->modify = modify;

	return builder;
}

void mlx5e_tir_builder_free(struct mlx5e_tir_builder *builder)
{
	kvfree(builder);
}

void mlx5e_tir_builder_clear(struct mlx5e_tir_builder *builder)
{
	memset(builder->in, 0, sizeof(builder->in));
}

static void *mlx5e_tir_builder_get_tirc(struct mlx5e_tir_builder *builder)
{
	if (builder->modify)
		return MLX5_ADDR_OF(modify_tir_in, builder->in, ctx);
	return MLX5_ADDR_OF(create_tir_in, builder->in, ctx);
}

void mlx5e_tir_builder_build_inline(struct mlx5e_tir_builder *builder, u32 tdn, u32 rqn)
{
	void *tirc = mlx5e_tir_builder_get_tirc(builder);

	WARN_ON(builder->modify);

	MLX5_SET(tirc, tirc, transport_domain, tdn);
	MLX5_SET(tirc, tirc, disp_type, MLX5_TIRC_DISP_TYPE_DIRECT);
	MLX5_SET(tirc, tirc, rx_hash_fn, MLX5_RX_HASH_FN_NONE);
	MLX5_SET(tirc, tirc, inline_rqn, rqn);
}

void mlx5e_tir_builder_build_rqt(struct mlx5e_tir_builder *builder, u32 tdn,
				 u32 rqtn, bool inner_ft_support)
{
	void *tirc = mlx5e_tir_builder_get_tirc(builder);

	WARN_ON(builder->modify);

	MLX5_SET(tirc, tirc, transport_domain, tdn);
	MLX5_SET(tirc, tirc, disp_type, MLX5_TIRC_DISP_TYPE_INDIRECT);
	MLX5_SET(tirc, tirc, indirect_table, rqtn);
	MLX5_SET(tirc, tirc, tunneled_offload_en, inner_ft_support);
}

void mlx5e_tir_builder_build_packet_merge(struct mlx5e_tir_builder *builder,
					  const struct mlx5e_packet_merge_param *pkt_merge_param)
{
	void *tirc = mlx5e_tir_builder_get_tirc(builder);
	const unsigned int rough_max_l2_l3_hdr_sz = 256;

	if (builder->modify)
		MLX5_SET(modify_tir_in, builder->in, bitmask.packet_merge, 1);

	switch (pkt_merge_param->type) {
	case MLX5E_PACKET_MERGE_LRO:
		MLX5_SET(tirc, tirc, packet_merge_mask,
			 MLX5_TIRC_PACKET_MERGE_MASK_IPV4_LRO |
			 MLX5_TIRC_PACKET_MERGE_MASK_IPV6_LRO);
		MLX5_SET(tirc, tirc, lro_max_ip_payload_size,
			 (MLX5E_PARAMS_DEFAULT_LRO_WQE_SZ - rough_max_l2_l3_hdr_sz) >> 8);
		MLX5_SET(tirc, tirc, lro_timeout_period_usecs, pkt_merge_param->timeout);
		break;
	default:
		break;
	}
}

static int mlx5e_hfunc_to_hw(u8 hfunc)
{
	switch (hfunc) {
	case ETH_RSS_HASH_TOP:
		return MLX5_RX_HASH_FN_TOEPLITZ;
	case ETH_RSS_HASH_XOR:
		return MLX5_RX_HASH_FN_INVERTED_XOR8;

Annotation

Implementation Notes