}
 EXPORT_SYMBOL(rdma_destroy_qp);
 
-static int cma_modify_qp_rtr(struct rdma_id_private *id_priv)
+static int cma_modify_qp_rtr(struct rdma_id_private *id_priv,
+                            struct rdma_conn_param *conn_param)
 {
        struct ib_qp_attr qp_attr;
        int qp_attr_mask, ret;
        if (ret)
                goto out;
 
+       if (conn_param)
+               qp_attr.max_dest_rd_atomic = conn_param->responder_resources;
        ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask);
 out:
        mutex_unlock(&id_priv->qp_mutex);
        return ret;
 }
 
-static int cma_modify_qp_rts(struct rdma_id_private *id_priv)
+static int cma_modify_qp_rts(struct rdma_id_private *id_priv,
+                            struct rdma_conn_param *conn_param)
 {
        struct ib_qp_attr qp_attr;
        int qp_attr_mask, ret;
        if (ret)
                goto out;
 
+       if (conn_param)
+               qp_attr.max_rd_atomic = conn_param->initiator_depth;
        ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask);
 out:
        mutex_unlock(&id_priv->qp_mutex);
 {
        int ret;
 
-       ret = cma_modify_qp_rtr(id_priv);
+       ret = cma_modify_qp_rtr(id_priv, NULL);
        if (ret)
                goto reject;
 
-       ret = cma_modify_qp_rts(id_priv);
+       ret = cma_modify_qp_rts(id_priv, NULL);
        if (ret)
                goto reject;
 
        sin = (struct sockaddr_in*) &id_priv->id.route.addr.dst_addr;
        cm_id->remote_addr = *sin;
 
-       ret = cma_modify_qp_rtr(id_priv);
+       ret = cma_modify_qp_rtr(id_priv, conn_param);
        if (ret)
                goto out;
 
                         struct rdma_conn_param *conn_param)
 {
        struct ib_cm_rep_param rep;
-       struct ib_qp_attr qp_attr;
-       int qp_attr_mask, ret;
-
-       if (id_priv->id.qp) {
-               ret = cma_modify_qp_rtr(id_priv);
-               if (ret)
-                       goto out;
+       int ret;
 
-               qp_attr.qp_state = IB_QPS_RTS;
-               ret = ib_cm_init_qp_attr(id_priv->cm_id.ib, &qp_attr,
-                                        &qp_attr_mask);
-               if (ret)
-                       goto out;
+       ret = cma_modify_qp_rtr(id_priv, conn_param);
+       if (ret)
+               goto out;
 
-               qp_attr.max_rd_atomic = conn_param->initiator_depth;
-               ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask);
-               if (ret)
-                       goto out;
-       }
+       ret = cma_modify_qp_rts(id_priv, conn_param);
+       if (ret)
+               goto out;
 
        memset(&rep, 0, sizeof rep);
        rep.qp_num = id_priv->qp_num;
        struct iw_cm_conn_param iw_param;
        int ret;
 
-       ret = cma_modify_qp_rtr(id_priv);
+       ret = cma_modify_qp_rtr(id_priv, conn_param);
        if (ret)
                return ret;