aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/i40iw/i40iw_cm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/hw/i40iw/i40iw_cm.c')
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_cm.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/drivers/infiniband/hw/i40iw/i40iw_cm.c b/drivers/infiniband/hw/i40iw/i40iw_cm.c
index 493d6ef3d2d5..77870f9e1736 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_cm.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_cm.c
@@ -1043,7 +1043,7 @@ negotiate_done:
1043 * i40iw_schedule_cm_timer 1043 * i40iw_schedule_cm_timer
1044 * @@cm_node: connection's node 1044 * @@cm_node: connection's node
1045 * @sqbuf: buffer to send 1045 * @sqbuf: buffer to send
1046 * @type: if it es send ot close 1046 * @type: if it is send or close
1047 * @send_retrans: if rexmits to be done 1047 * @send_retrans: if rexmits to be done
1048 * @close_when_complete: is cm_node to be removed 1048 * @close_when_complete: is cm_node to be removed
1049 * 1049 *
@@ -1067,7 +1067,8 @@ int i40iw_schedule_cm_timer(struct i40iw_cm_node *cm_node,
1067 1067
1068 new_send = kzalloc(sizeof(*new_send), GFP_ATOMIC); 1068 new_send = kzalloc(sizeof(*new_send), GFP_ATOMIC);
1069 if (!new_send) { 1069 if (!new_send) {
1070 i40iw_free_sqbuf(vsi, (void *)sqbuf); 1070 if (type != I40IW_TIMER_TYPE_CLOSE)
1071 i40iw_free_sqbuf(vsi, (void *)sqbuf);
1071 return -ENOMEM; 1072 return -ENOMEM;
1072 } 1073 }
1073 new_send->retrycount = I40IW_DEFAULT_RETRYS; 1074 new_send->retrycount = I40IW_DEFAULT_RETRYS;
@@ -1082,7 +1083,6 @@ int i40iw_schedule_cm_timer(struct i40iw_cm_node *cm_node,
1082 new_send->timetosend += (HZ / 10); 1083 new_send->timetosend += (HZ / 10);
1083 if (cm_node->close_entry) { 1084 if (cm_node->close_entry) {
1084 kfree(new_send); 1085 kfree(new_send);
1085 i40iw_free_sqbuf(vsi, (void *)sqbuf);
1086 i40iw_pr_err("already close entry\n"); 1086 i40iw_pr_err("already close entry\n");
1087 return -EINVAL; 1087 return -EINVAL;
1088 } 1088 }
@@ -2947,8 +2947,6 @@ static struct i40iw_cm_node *i40iw_create_cm_node(
2947 loopback_remotenode->tcp_cntxt.snd_wnd = cm_node->tcp_cntxt.rcv_wnd; 2947 loopback_remotenode->tcp_cntxt.snd_wnd = cm_node->tcp_cntxt.rcv_wnd;
2948 cm_node->tcp_cntxt.snd_wscale = loopback_remotenode->tcp_cntxt.rcv_wscale; 2948 cm_node->tcp_cntxt.snd_wscale = loopback_remotenode->tcp_cntxt.rcv_wscale;
2949 loopback_remotenode->tcp_cntxt.snd_wscale = cm_node->tcp_cntxt.rcv_wscale; 2949 loopback_remotenode->tcp_cntxt.snd_wscale = cm_node->tcp_cntxt.rcv_wscale;
2950 loopback_remotenode->state = I40IW_CM_STATE_MPAREQ_RCVD;
2951 i40iw_create_event(loopback_remotenode, I40IW_CM_EVENT_MPA_REQ);
2952 } 2950 }
2953 return cm_node; 2951 return cm_node;
2954 } 2952 }
@@ -3689,11 +3687,16 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
3689 cm_id->add_ref(cm_id); 3687 cm_id->add_ref(cm_id);
3690 i40iw_add_ref(&iwqp->ibqp); 3688 i40iw_add_ref(&iwqp->ibqp);
3691 3689
3692 i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_ESTABLISHED, 0);
3693
3694 attr.qp_state = IB_QPS_RTS; 3690 attr.qp_state = IB_QPS_RTS;
3695 cm_node->qhash_set = false; 3691 cm_node->qhash_set = false;
3696 i40iw_modify_qp(&iwqp->ibqp, &attr, IB_QP_STATE, NULL); 3692 i40iw_modify_qp(&iwqp->ibqp, &attr, IB_QP_STATE, NULL);
3693
3694 cm_node->accelerated = 1;
3695 status =
3696 i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_ESTABLISHED, 0);
3697 if (status)
3698 i40iw_debug(dev, I40IW_DEBUG_CM, "error sending cm event - ESTABLISHED\n");
3699
3697 if (cm_node->loopbackpartner) { 3700 if (cm_node->loopbackpartner) {
3698 cm_node->loopbackpartner->pdata.size = conn_param->private_data_len; 3701 cm_node->loopbackpartner->pdata.size = conn_param->private_data_len;
3699 3702
@@ -3704,7 +3707,6 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
3704 i40iw_create_event(cm_node->loopbackpartner, I40IW_CM_EVENT_CONNECTED); 3707 i40iw_create_event(cm_node->loopbackpartner, I40IW_CM_EVENT_CONNECTED);
3705 } 3708 }
3706 3709
3707 cm_node->accelerated = 1;
3708 if (cm_node->accept_pend) { 3710 if (cm_node->accept_pend) {
3709 atomic_dec(&cm_node->listener->pend_accepts_cnt); 3711 atomic_dec(&cm_node->listener->pend_accepts_cnt);
3710 cm_node->accept_pend = 0; 3712 cm_node->accept_pend = 0;
@@ -3864,6 +3866,12 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
3864 goto err; 3866 goto err;
3865 } 3867 }
3866 3868
3869 if (cm_node->loopbackpartner) {
3870 cm_node->loopbackpartner->state = I40IW_CM_STATE_MPAREQ_RCVD;
3871 i40iw_create_event(cm_node->loopbackpartner,
3872 I40IW_CM_EVENT_MPA_REQ);
3873 }
3874
3867 i40iw_debug(cm_node->dev, 3875 i40iw_debug(cm_node->dev,
3868 I40IW_DEBUG_CM, 3876 I40IW_DEBUG_CM,
3869 "Api - connect(): port=0x%04x, cm_node=%p, cm_id = %p.\n", 3877 "Api - connect(): port=0x%04x, cm_node=%p, cm_id = %p.\n",
@@ -4044,9 +4052,6 @@ static void i40iw_cm_event_connected(struct i40iw_cm_event *event)
4044 dev->iw_priv_qp_ops->qp_send_rtt(&iwqp->sc_qp, read0); 4052 dev->iw_priv_qp_ops->qp_send_rtt(&iwqp->sc_qp, read0);
4045 if (iwqp->page) 4053 if (iwqp->page)
4046 kunmap(iwqp->page); 4054 kunmap(iwqp->page);
4047 status = i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_CONNECT_REPLY, 0);
4048 if (status)
4049 i40iw_pr_err("send cm event\n");
4050 4055
4051 memset(&attr, 0, sizeof(attr)); 4056 memset(&attr, 0, sizeof(attr));
4052 attr.qp_state = IB_QPS_RTS; 4057 attr.qp_state = IB_QPS_RTS;
@@ -4054,6 +4059,10 @@ static void i40iw_cm_event_connected(struct i40iw_cm_event *event)
4054 i40iw_modify_qp(&iwqp->ibqp, &attr, IB_QP_STATE, NULL); 4059 i40iw_modify_qp(&iwqp->ibqp, &attr, IB_QP_STATE, NULL);
4055 4060
4056 cm_node->accelerated = 1; 4061 cm_node->accelerated = 1;
4062 status = i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_CONNECT_REPLY,
4063 0);
4064 if (status)
4065 i40iw_debug(dev, I40IW_DEBUG_CM, "error sending cm event - CONNECT_REPLY\n");
4057 4066
4058 return; 4067 return;
4059 4068