drivers/infiniband/hw/mthca/mthca_provider.c

Source file repositories/reference/linux-study-clean/drivers/infiniband/hw/mthca/mthca_provider.c

File Facts

System
Linux kernel
Corpus path
drivers/infiniband/hw/mthca/mthca_provider.c
Extension
.c
Size
30627 bytes
Lines
1208
Domain
Driver Families
Bucket
drivers/infiniband
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) {
			mthca_pd_free(to_mdev(ibdev), pd);
			return err;
		}
	}

	return 0;
}

static int mthca_dealloc_pd(struct ib_pd *pd, struct ib_udata *udata)
{
	mthca_pd_free(to_mdev(pd->device), to_mpd(pd));
	return 0;
}

static int mthca_ah_create(struct ib_ah *ibah,
			   struct rdma_ah_init_attr *init_attr,
			   struct ib_udata *udata)

{
	struct mthca_ah *ah = to_mah(ibah);

	return mthca_create_ah(to_mdev(ibah->device), to_mpd(ibah->pd),
			       init_attr->ah_attr, ah);
}

static int mthca_ah_destroy(struct ib_ah *ah, u32 flags)
{
	mthca_destroy_ah(to_mdev(ah->device), to_mah(ah));
	return 0;
}

static int mthca_create_srq(struct ib_srq *ibsrq,
			    struct ib_srq_init_attr *init_attr,
			    struct ib_udata *udata)
{
	struct mthca_create_srq ucmd;
	struct mthca_ucontext *context = rdma_udata_to_drv_context(
		udata, struct mthca_ucontext, ibucontext);
	struct mthca_srq *srq = to_msrq(ibsrq);
	int err;

	if (init_attr->srq_type != IB_SRQT_BASIC)
		return -EOPNOTSUPP;

	if (udata) {
		err = ib_copy_validate_udata_in(udata, ucmd, db_page);
		if (err)
			return err;

		err = mthca_map_user_db(to_mdev(ibsrq->device), &context->uar,
					context->db_tab, ucmd.db_index,
					ucmd.db_page);

		if (err)
			return err;

		srq->mr.ibmr.lkey = ucmd.lkey;
		srq->db_index     = ucmd.db_index;
	}

	err = mthca_alloc_srq(to_mdev(ibsrq->device), to_mpd(ibsrq->pd),
			      &init_attr->attr, srq, udata);

	if (err && udata)
		mthca_unmap_user_db(to_mdev(ibsrq->device), &context->uar,
				    context->db_tab, ucmd.db_index);

	if (err)
		return err;

	if (context) {
		struct mthca_create_srq_resp uresp = { .srqn = srq->srqn };

		err = ib_respond_udata(udata, uresp);
		if (err) {
			mthca_free_srq(to_mdev(ibsrq->device), srq);
			mthca_unmap_user_db(to_mdev(ibsrq->device),
					    &context->uar, context->db_tab,
					    ucmd.db_index);
			return err;
		}
	}

	return 0;
}

static int mthca_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
{
	mthca_free_srq(to_mdev(srq->device), to_msrq(srq));

Annotation

Implementation Notes