|
@@ -831,10 +831,10 @@ static int i40iw_query_qp(struct ib_qp *ibqp,
|
|
void i40iw_hw_modify_qp(struct i40iw_device *iwdev, struct i40iw_qp *iwqp,
|
|
void i40iw_hw_modify_qp(struct i40iw_device *iwdev, struct i40iw_qp *iwqp,
|
|
struct i40iw_modify_qp_info *info, bool wait)
|
|
struct i40iw_modify_qp_info *info, bool wait)
|
|
{
|
|
{
|
|
- enum i40iw_status_code status;
|
|
|
|
struct i40iw_cqp_request *cqp_request;
|
|
struct i40iw_cqp_request *cqp_request;
|
|
struct cqp_commands_info *cqp_info;
|
|
struct cqp_commands_info *cqp_info;
|
|
struct i40iw_modify_qp_info *m_info;
|
|
struct i40iw_modify_qp_info *m_info;
|
|
|
|
+ struct i40iw_gen_ae_info ae_info;
|
|
|
|
|
|
cqp_request = i40iw_get_cqp_request(&iwdev->cqp, wait);
|
|
cqp_request = i40iw_get_cqp_request(&iwdev->cqp, wait);
|
|
if (!cqp_request)
|
|
if (!cqp_request)
|
|
@@ -847,9 +847,25 @@ void i40iw_hw_modify_qp(struct i40iw_device *iwdev, struct i40iw_qp *iwqp,
|
|
cqp_info->post_sq = 1;
|
|
cqp_info->post_sq = 1;
|
|
cqp_info->in.u.qp_modify.qp = &iwqp->sc_qp;
|
|
cqp_info->in.u.qp_modify.qp = &iwqp->sc_qp;
|
|
cqp_info->in.u.qp_modify.scratch = (uintptr_t)cqp_request;
|
|
cqp_info->in.u.qp_modify.scratch = (uintptr_t)cqp_request;
|
|
- status = i40iw_handle_cqp_op(iwdev, cqp_request);
|
|
|
|
- if (status)
|
|
|
|
- i40iw_pr_err("CQP-OP Modify QP fail");
|
|
|
|
|
|
+ if (!i40iw_handle_cqp_op(iwdev, cqp_request))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ switch (m_info->next_iwarp_state) {
|
|
|
|
+ case I40IW_QP_STATE_RTS:
|
|
|
|
+ if (iwqp->iwarp_state == I40IW_QP_STATE_IDLE)
|
|
|
|
+ i40iw_send_reset(iwqp->cm_node);
|
|
|
|
+ /* fall through */
|
|
|
|
+ case I40IW_QP_STATE_IDLE:
|
|
|
|
+ case I40IW_QP_STATE_TERMINATE:
|
|
|
|
+ case I40IW_QP_STATE_CLOSING:
|
|
|
|
+ ae_info.ae_code = I40IW_AE_BAD_CLOSE;
|
|
|
|
+ ae_info.ae_source = 0;
|
|
|
|
+ i40iw_gen_ae(iwdev, &iwqp->sc_qp, &ae_info, false);
|
|
|
|
+ break;
|
|
|
|
+ case I40IW_QP_STATE_ERROR:
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -962,10 +978,6 @@ int i40iw_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
|
|
|
|
|
iwqp->ibqp_state = attr->qp_state;
|
|
iwqp->ibqp_state = attr->qp_state;
|
|
|
|
|
|
- if (issue_modify_qp)
|
|
|
|
- iwqp->iwarp_state = info.next_iwarp_state;
|
|
|
|
- else
|
|
|
|
- info.next_iwarp_state = iwqp->iwarp_state;
|
|
|
|
}
|
|
}
|
|
if (attr_mask & IB_QP_ACCESS_FLAGS) {
|
|
if (attr_mask & IB_QP_ACCESS_FLAGS) {
|
|
ctx_info->iwarp_info_valid = true;
|
|
ctx_info->iwarp_info_valid = true;
|
|
@@ -1003,9 +1015,14 @@ int i40iw_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
|
|
|
|
|
spin_unlock_irqrestore(&iwqp->lock, flags);
|
|
spin_unlock_irqrestore(&iwqp->lock, flags);
|
|
|
|
|
|
- if (issue_modify_qp)
|
|
|
|
|
|
+ if (issue_modify_qp) {
|
|
i40iw_hw_modify_qp(iwdev, iwqp, &info, true);
|
|
i40iw_hw_modify_qp(iwdev, iwqp, &info, true);
|
|
|
|
|
|
|
|
+ spin_lock_irqsave(&iwqp->lock, flags);
|
|
|
|
+ iwqp->iwarp_state = info.next_iwarp_state;
|
|
|
|
+ spin_unlock_irqrestore(&iwqp->lock, flags);
|
|
|
|
+ }
|
|
|
|
+
|
|
if (issue_modify_qp && (iwqp->ibqp_state > IB_QPS_RTS)) {
|
|
if (issue_modify_qp && (iwqp->ibqp_state > IB_QPS_RTS)) {
|
|
if (dont_wait) {
|
|
if (dont_wait) {
|
|
if (iwqp->cm_id && iwqp->hw_tcp_state) {
|
|
if (iwqp->cm_id && iwqp->hw_tcp_state) {
|