id_priv->id.ps = ps;
        id_priv->id.qp_type = qp_type;
        id_priv->tos_set = false;
+       id_priv->timeout_set = false;
        id_priv->gid_type = IB_GID_TYPE_IB;
        spin_lock_init(&id_priv->lock);
        mutex_init(&id_priv->qp_mutex);
        } else
                ret = -ENOSYS;
 
+       if ((*qp_attr_mask & IB_QP_TIMEOUT) && id_priv->timeout_set)
+               qp_attr->timeout = id_priv->timeout;
+
        return ret;
 }
 EXPORT_SYMBOL(rdma_init_qp_attr);
 }
 EXPORT_SYMBOL(rdma_set_service_type);
 
+/**
+ * rdma_set_ack_timeout() - Set the ack timeout of QP associated
+ *                          with a connection identifier.
+ * @id: Communication identifier to associated with service type.
+ * @timeout: Ack timeout to set a QP, expressed as 4.096 * 2^(timeout) usec.
+ *
+ * This function should be called before rdma_connect() on active side,
+ * and on passive side before rdma_accept(). It is applicable to primary
+ * path only. The timeout will affect the local side of the QP, it is not
+ * negotiated with remote side and zero disables the timer.
+ *
+ * Return: 0 for success
+ */
+int rdma_set_ack_timeout(struct rdma_cm_id *id, u8 timeout)
+{
+       struct rdma_id_private *id_priv;
+
+       if (id->qp_type != IB_QPT_RC)
+               return -EINVAL;
+
+       id_priv = container_of(id, struct rdma_id_private, id);
+       id_priv->timeout = timeout;
+       id_priv->timeout_set = true;
+
+       return 0;
+}
+EXPORT_SYMBOL(rdma_set_ack_timeout);
+
 static void cma_query_handler(int status, struct sa_path_rec *path_rec,
                              void *context)
 {