drivers/infiniband/hw/erdma/erdma_qp.c

Source file repositories/reference/linux-study-clean/drivers/infiniband/hw/erdma/erdma_qp.c

File Facts

System
Linux kernel
Corpus path
drivers/infiniband/hw/erdma/erdma_qp.c
Extension
.c
Size
20636 bytes
Lines
758
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 (params->state == ERDMA_QPS_IWARP_RTS) {
			ret = erdma_modify_qp_state_to_rts(qp, params, mask);
		} else if (params->state == ERDMA_QPS_IWARP_ERROR) {
			qp->attrs.iwarp.state = ERDMA_QPS_IWARP_ERROR;
			need_reflush = true;
			if (qp->cep) {
				erdma_cep_put(qp->cep);
				qp->cep = NULL;
			}
			ret = erdma_modify_qp_state_to_stop(qp, params, mask);
		}
		break;
	case ERDMA_QPS_IWARP_RTS:
		drop_conn = 0;

		if (params->state == ERDMA_QPS_IWARP_CLOSING ||
		    params->state == ERDMA_QPS_IWARP_TERMINATE ||
		    params->state == ERDMA_QPS_IWARP_ERROR) {
			ret = erdma_modify_qp_state_to_stop(qp, params, mask);
			drop_conn = 1;
			need_reflush = true;
		}

		if (drop_conn)
			erdma_qp_cm_drop(qp);

		break;
	case ERDMA_QPS_IWARP_TERMINATE:
		if (params->state == ERDMA_QPS_IWARP_ERROR)
			qp->attrs.iwarp.state = ERDMA_QPS_IWARP_ERROR;
		break;
	case ERDMA_QPS_IWARP_CLOSING:
		if (params->state == ERDMA_QPS_IWARP_IDLE) {
			qp->attrs.iwarp.state = ERDMA_QPS_IWARP_IDLE;
		} else if (params->state == ERDMA_QPS_IWARP_ERROR) {
			ret = erdma_modify_qp_state_to_stop(qp, params, mask);
			qp->attrs.iwarp.state = ERDMA_QPS_IWARP_ERROR;
		} else if (params->state != ERDMA_QPS_IWARP_CLOSING) {
			return -ECONNABORTED;
		}
		break;
	default:
		break;
	}

	if (need_reflush && !ret && rdma_is_kernel_res(&qp->ibqp.res)) {
		qp->flags |= ERDMA_QP_IN_FLUSHING;
		mod_delayed_work(qp->dev->reflush_wq, &qp->reflush_dwork,
				 usecs_to_jiffies(100));
	}

	return ret;
}

static int modify_qp_cmd_rocev2(struct erdma_qp *qp,
				struct erdma_mod_qp_params_rocev2 *params,
				enum erdma_qpa_mask_rocev2 attr_mask)
{
	struct erdma_cmdq_mod_qp_req_rocev2 req;

	memset(&req, 0, sizeof(req));

	erdma_cmdq_build_reqhdr(&req.hdr, CMDQ_SUBMOD_RDMA,
				CMDQ_OPCODE_MODIFY_QP);

	req.cfg0 = FIELD_PREP(ERDMA_CMD_MODIFY_QP_QPN_MASK, QP_ID(qp));

	if (attr_mask & ERDMA_QPA_ROCEV2_STATE)
		req.cfg0 |= FIELD_PREP(ERDMA_CMD_MODIFY_QP_STATE_MASK,
				       params->state);

	if (attr_mask & ERDMA_QPA_ROCEV2_DST_QPN)
		req.cfg1 = FIELD_PREP(ERDMA_CMD_MODIFY_QP_DQPN_MASK,
				      params->dst_qpn);

	if (attr_mask & ERDMA_QPA_ROCEV2_QKEY)
		req.qkey = params->qkey;

	if (attr_mask & ERDMA_QPA_ROCEV2_AV)
		erdma_set_av_cfg(&req.av_cfg, &params->av);

	if (attr_mask & ERDMA_QPA_ROCEV2_SQ_PSN)
		req.sq_psn = params->sq_psn;

	if (attr_mask & ERDMA_QPA_ROCEV2_RQ_PSN)
		req.rq_psn = params->rq_psn;

	req.attr_mask = attr_mask;

	return erdma_post_cmd_wait(&qp->dev->cmdq, &req, sizeof(req), NULL,

Annotation

Implementation Notes