diff options
Diffstat (limited to 'drivers/infiniband/hw/i40iw/i40iw_cm.c')
| -rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_cm.c | 31 |
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 | ||
