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: Dave Goodell <dgoodell@cisco.com>
Reviewed-by: Reese Faucette <rfaucett@cisco.com>
Reviewed-by: Xuyang Wang <xuywang@cisco.com>
Signed-off-by: Nelson Escobar <neescoba@cisco.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
Nelson Escobar 2015-12-09 10:42:17 -08:00 committed by Doug Ledford
parent 2547a3663c
commit 89e5323c64
1 changed files with 9 additions and 9 deletions

View File

@ -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;
}