Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89e5323c authored by Nelson Escobar's avatar Nelson Escobar Committed by Doug Ledford
Browse files

IB/usnic: Support more QP state transitions



They were already implemented at a lower layer, but the upper level
routine placed arbitrary restrictions on which transitions were
permitted.  Simplify the state machine logic to live wholly in
usnic_ib_qp_grp_modify.

Signed-off-by: default avatarDave Goodell <dgoodell@cisco.com>
Reviewed-by: default avatarReese Faucette <rfaucett@cisco.com>
Reviewed-by: default avatarXuyang Wang <xuywang@cisco.com>
Signed-off-by: default avatarNelson Escobar <neescoba@cisco.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 2547a366
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -571,20 +571,20 @@ int usnic_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,

	qp_grp = to_uqp_grp(ibqp);

	/* TODO: Future Support All States */
	mutex_lock(&qp_grp->vf->pf->usdev_lock);
	if ((attr_mask & IB_QP_STATE) && attr->qp_state == IB_QPS_INIT) {
		status = usnic_ib_qp_grp_modify(qp_grp, IB_QPS_INIT, NULL);
	} else if ((attr_mask & IB_QP_STATE) && attr->qp_state == IB_QPS_RTR) {
		status = usnic_ib_qp_grp_modify(qp_grp, IB_QPS_RTR, NULL);
	} else if ((attr_mask & IB_QP_STATE) && attr->qp_state == IB_QPS_RTS) {
		status = usnic_ib_qp_grp_modify(qp_grp, IB_QPS_RTS, NULL);
	if ((attr_mask & IB_QP_PORT) && attr->port_num != 1) {
		/* usnic devices only have one port */
		status = -EINVAL;
		goto out_unlock;
	}
	if (attr_mask & IB_QP_STATE) {
		status = usnic_ib_qp_grp_modify(qp_grp, attr->qp_state, NULL);
	} else {
		usnic_err("Unexpected combination mask: %u state: %u\n",
				attr_mask & IB_QP_STATE, attr->qp_state);
		usnic_err("Unhandled request, attr_mask=0x%x\n", attr_mask);
		status = -EINVAL;
	}

out_unlock:
	mutex_unlock(&qp_grp->vf->pf->usdev_lock);
	return status;
}