IB/hns: Fix the bug of rdma cm connecting on user mode
Fix bug of modify qp from init to init on user mode. Otherwise, it will oops when rmda cm established. Signed-off-by: Lijun Ou <oulijun@huawei.com> Reviewed-by: Wei Hu <xavier.huwei@huawei.com> Signed-off-by: Salil Mehta <salil.mehta@huawei.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
b280db52cc
commit
509bf0c2da
|
@ -76,6 +76,7 @@
|
|||
#define PKEY_ID 0xffff
|
||||
#define GUID_LEN 8
|
||||
#define NODE_DESC_SIZE 64
|
||||
#define DB_REG_OFFSET 0x1000
|
||||
|
||||
#define SERV_TYPE_RC 0
|
||||
#define SERV_TYPE_RD 1
|
||||
|
|
|
@ -1834,12 +1834,10 @@ static int hns_roce_v1_m_qp(struct ib_qp *ibqp, const struct ib_qp_attr *attr,
|
|||
struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
|
||||
struct device *dev = &hr_dev->pdev->dev;
|
||||
struct hns_roce_qp_context *context;
|
||||
struct hns_roce_rq_db rq_db;
|
||||
dma_addr_t dma_handle_2 = 0;
|
||||
dma_addr_t dma_handle = 0;
|
||||
uint32_t doorbell[2] = {0};
|
||||
int rq_pa_start = 0;
|
||||
u32 reg_val = 0;
|
||||
u64 *mtts_2 = NULL;
|
||||
int ret = -EINVAL;
|
||||
u64 *mtts = NULL;
|
||||
|
@ -2395,36 +2393,23 @@ static int hns_roce_v1_m_qp(struct ib_qp *ibqp, const struct ib_qp_attr *attr,
|
|||
if (cur_state == IB_QPS_INIT && new_state == IB_QPS_INIT) {
|
||||
/* Memory barrier */
|
||||
wmb();
|
||||
if (hr_qp->ibqp.qp_type == IB_QPT_GSI) {
|
||||
/* SW update GSI rq header */
|
||||
reg_val = roce_read(hr_dev, ROCEE_QP1C_CFG3_0_REG +
|
||||
QP1C_CFGN_OFFSET * hr_qp->phy_port);
|
||||
roce_set_field(reg_val,
|
||||
ROCEE_QP1C_CFG3_0_ROCEE_QP1C_RQ_HEAD_M,
|
||||
ROCEE_QP1C_CFG3_0_ROCEE_QP1C_RQ_HEAD_S,
|
||||
hr_qp->rq.head);
|
||||
roce_write(hr_dev, ROCEE_QP1C_CFG3_0_REG +
|
||||
QP1C_CFGN_OFFSET * hr_qp->phy_port, reg_val);
|
||||
} else {
|
||||
rq_db.u32_4 = 0;
|
||||
rq_db.u32_8 = 0;
|
||||
|
||||
roce_set_field(rq_db.u32_4, RQ_DOORBELL_U32_4_RQ_HEAD_M,
|
||||
RQ_DOORBELL_U32_4_RQ_HEAD_S,
|
||||
hr_qp->rq.head);
|
||||
roce_set_field(rq_db.u32_8, RQ_DOORBELL_U32_8_QPN_M,
|
||||
roce_set_field(doorbell[0], RQ_DOORBELL_U32_4_RQ_HEAD_M,
|
||||
RQ_DOORBELL_U32_4_RQ_HEAD_S, hr_qp->rq.head);
|
||||
roce_set_field(doorbell[1], RQ_DOORBELL_U32_8_QPN_M,
|
||||
RQ_DOORBELL_U32_8_QPN_S, hr_qp->qpn);
|
||||
roce_set_field(rq_db.u32_8, RQ_DOORBELL_U32_8_CMD_M,
|
||||
roce_set_field(doorbell[1], RQ_DOORBELL_U32_8_CMD_M,
|
||||
RQ_DOORBELL_U32_8_CMD_S, 1);
|
||||
roce_set_bit(rq_db.u32_8, RQ_DOORBELL_U32_8_HW_SYNC_S,
|
||||
1);
|
||||
roce_set_bit(doorbell[1], RQ_DOORBELL_U32_8_HW_SYNC_S, 1);
|
||||
|
||||
doorbell[0] = rq_db.u32_4;
|
||||
doorbell[1] = rq_db.u32_8;
|
||||
if (ibqp->uobject) {
|
||||
hr_qp->rq.db_reg_l = hr_dev->reg_base +
|
||||
ROCEE_DB_OTHERS_L_0_REG +
|
||||
DB_REG_OFFSET * hr_dev->priv_uar.index;
|
||||
}
|
||||
|
||||
hns_roce_write64_k(doorbell, hr_qp->rq.db_reg_l);
|
||||
}
|
||||
}
|
||||
|
||||
hr_qp->state = new_state;
|
||||
|
||||
|
|
|
@ -38,7 +38,6 @@
|
|||
#include "hns_roce_hem.h"
|
||||
#include "hns_roce_user.h"
|
||||
|
||||
#define DB_REG_OFFSET 0x1000
|
||||
#define SQP_NUM 12
|
||||
|
||||
void hns_roce_qp_event(struct hns_roce_dev *hr_dev, u32 qpn, int event_type)
|
||||
|
|
Loading…
Reference in New Issue