drivers/net/ethernet/mellanox/mlx5/core/en_common.c

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

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/mellanox/mlx5/core/en_common.c
Extension
.c
Size
8244 bytes
Lines
290
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

if (err) {
			mlx5_core_warn(mdev,
				       "could only allocate %d/%d doorbells, err %d.\n",
				       i, num_doorbells, err);
			break;
		}
	}
	res->num_bfregs = i;

	if (create_tises) {
		err = mlx5e_create_tises(mdev, res->tisn);
		if (err) {
			mlx5_core_err(mdev, "alloc tises failed, %d\n", err);
			goto err_destroy_bfregs;
		}
		res->tisn_valid = true;
	}

	INIT_LIST_HEAD(&res->td.tirs_list);
	mutex_init(&res->td.list_lock);

	mdev->mlx5e_res.dek_priv = mlx5_crypto_dek_init(mdev);
	if (IS_ERR(mdev->mlx5e_res.dek_priv)) {
		mlx5_core_err(mdev, "crypto dek init failed, %pe\n",
			      mdev->mlx5e_res.dek_priv);
		mdev->mlx5e_res.dek_priv = NULL;
	}

	return 0;

err_destroy_bfregs:
	for (i = 0; i < res->num_bfregs; i++)
		mlx5_free_bfreg(mdev, res->bfregs + i);
	kfree(res->bfregs);
err_destroy_mkey:
	mlx5_core_destroy_mkey(mdev, res->mkey);
err_dealloc_transport_domain:
	mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
err_dealloc_pd:
	mlx5_core_dealloc_pd(mdev, res->pdn);
	return err;
}

void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev)
{
	struct mlx5e_hw_objs *res = &mdev->mlx5e_res.hw_objs;

	mlx5_crypto_dek_cleanup(mdev->mlx5e_res.dek_priv);
	mdev->mlx5e_res.dek_priv = NULL;
	if (res->tisn_valid)
		mlx5e_destroy_tises(mdev, res->tisn);
	for (unsigned int i = 0; i < res->num_bfregs; i++)
		mlx5_free_bfreg(mdev, res->bfregs + i);
	kfree(res->bfregs);
	mlx5_core_destroy_mkey(mdev, res->mkey);
	mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
	mlx5_core_dealloc_pd(mdev, res->pdn);
	memset(res, 0, sizeof(*res));
}

int mlx5e_modify_tirs_lb(struct mlx5_core_dev *mdev, bool enable_uc_lb,
			 bool enable_mc_lb)
{
	struct mlx5e_tir_builder *builder;
	struct mlx5e_tir *tir;
	int err = 0;

	builder = mlx5e_tir_builder_alloc(true);
	if (!builder)
		return -ENOMEM;

	mlx5e_tir_builder_build_self_lb_block(builder, enable_uc_lb,
					      enable_mc_lb);

	mutex_lock(&mdev->mlx5e_res.hw_objs.td.list_lock);
	list_for_each_entry(tir, &mdev->mlx5e_res.hw_objs.td.tirs_list, list) {
		err = mlx5e_tir_modify(tir, builder);
		if (err) {
			mlx5_core_err(mdev,
				      "modify tir(0x%x) enable_lb uc(%d) mc(%d) failed, %d\n",
				      mlx5e_tir_get_tirn(tir),
				      enable_uc_lb, enable_mc_lb, err);
			break;
		}
	}
	mutex_unlock(&mdev->mlx5e_res.hw_objs.td.list_lock);

	mlx5e_tir_builder_free(builder);

	return err;

Annotation

Implementation Notes