Commit 6c461811 authored by Jie Lei's avatar Jie Lei Committed by JangShui Yang
Browse files

hns3 udma: modify the process of create qp

driver inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I8V1IQ


CVE: NA

--------------------------------------------------------

This patch is used to fix the QP creation process.
Add qp init when create jfs to avoid random value.

Fixes: 4888db6e ("hns3 udma: support create and destroy JETTY")
Signed-off-by: default avatarWenkai Zhang <zhangwenkai11@hisilicon.com>
Signed-off-by: default avatarJie Lei <leijie31@huawei.com>
parent 513c7dd8
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -23,9 +23,9 @@
#define MAP_INDEX_SHIFT			8
#define UDMA_DWQE_PAGE_SIZE		65536
#define UDMA_JETTY_X_PREFIX_BIT_NUM	2
#define UDMA_JFS_QPN_PREFIX		0x0
#define UDMA_JFS_QPN_PREFIX		0x2
#define UDMA_JFR_QPN_PREFIX		0x1
#define UDMA_JETTY_QPN_PREFIX		0x2
#define UDMA_JETTY_QPN_PREFIX		0x3
#define UDMA_ADDR_4K_MASK		0xfffUL
#define URMA_SEG_ACCESS_GUARD		(1UL << 5)
#define UDMA_DCA_ATTACH_FLAGS_NEW_BUFFER BIT(0)
@@ -72,8 +72,8 @@ struct udma_create_jfr_resp {
struct udma_jfc_attr_ex {
	uint64_t	jfc_ex_mask; /* Use enum udma_jfc_init_attr_mask */
	uint64_t	create_flags; /* Use enum udma_jfc_create_flags */
	uint8_t		poe_channel; /* poe channel to use */
	uint64_t	notify_addr;
	uint8_t		poe_channel; /* poe channel to use */
	uint8_t		notify_mode; /* Use enum udma_jfc_notify_mode */
};

@@ -123,8 +123,8 @@ enum udma_qp_cap_flags {
};

struct udp_srcport {
	bool		um_spray_en;
	uint16_t	um_data_udp_start;
	bool		um_spray_en;
	uint8_t		um_udp_range;
};

+2 −1
Original line number Diff line number Diff line
@@ -118,10 +118,11 @@ static int del_eid_entry(struct udma_dev *udma_dev, uint32_t eid_index)
static int udma_check_ueid_cfg(struct udma_dev *dev, uint16_t fe_idx,
			       uint32_t eid_index)
{
	if (fe_idx != UDMA_NON_VIRTUALIZATION_FE_ID) {
	if (fe_idx != dev->func_id) {
		dev_err(dev->dev, "Check FE ID failed.\n");
		return -EINVAL;
	}

	if (eid_index >= dev->caps.max_eid_cnt) {
		dev_err(dev->dev, "Invalid EID index(%u), max value is %u.\n",
			eid_index, dev->caps.max_eid_cnt);
+16 −7
Original line number Diff line number Diff line
@@ -124,6 +124,12 @@ static int alloc_jetty_um_qp(struct udma_dev *dev, struct udma_jetty *jetty,
		return ret;
	}

	ret = udma_init_qpc(dev, &jetty->qp);
	if (ret) {
		udma_destroy_qp_common(dev, &jetty->qp);
		return ret;
	}

	jetty->qp.state = QPS_RESET;
	ret = udma_modify_qp_jetty(dev, jetty, QPS_RTS);
	if (ret)
@@ -163,10 +169,10 @@ static int set_jetty_buf_attr(struct udma_dev *udma_dev,
			      struct udma_jetty *jetty,
			      struct udma_buf_attr *buf_attr)
{
	int totle_buff_size = 0;
	uint32_t total_buff_size = 0;
	uint32_t cfg_depth;
	int buf_size;
	int idx = 0;
	uint32_t buf_size;
	uint32_t idx = 0;

	/* SQ WQE */
	jetty->rc_node.sge_offset = 0;
@@ -182,10 +188,10 @@ static int set_jetty_buf_attr(struct udma_dev *udma_dev,
		buf_attr->region[idx].size = buf_size;
		buf_attr->region[idx].hopnum = udma_dev->caps.wqe_sq_hop_num;
		idx++;
		totle_buff_size += buf_size;
		total_buff_size += buf_size;
	}
	/* extend SGE WQE in SQ */
	jetty->rc_node.sge_offset = totle_buff_size;
	jetty->rc_node.sge_offset = total_buff_size;

	buf_size = to_udma_hem_entries_size(jetty->rc_node.sge_cnt,
					    jetty->rc_node.sge_shift);
@@ -193,11 +199,14 @@ static int set_jetty_buf_attr(struct udma_dev *udma_dev,
		buf_attr->region[idx].size = buf_size;
		buf_attr->region[idx].hopnum = udma_dev->caps.wqe_sge_hop_num;
		idx++;
		totle_buff_size += buf_size;
		total_buff_size += buf_size;
	}

	if (totle_buff_size < 1)
	if (total_buff_size < 1) {
		dev_err(udma_dev->dev, "jetty buf size is invalid, size = %u.\n",
			total_buff_size);
		return -EINVAL;
	}

	buf_attr->region_count = idx;
	buf_attr->mtt_only = false;
+5 −0
Original line number Diff line number Diff line
@@ -510,6 +510,11 @@ static int alloc_jfr_um_qp(struct udma_dev *dev, struct udma_jfr *jfr)
		dev_err(dev->dev, "failed to create qpc.\n");
		goto failed_create_qpc;
	}

	ret = udma_init_qpc(dev, qp);
	if (ret)
		goto failed_modify_qpc;

	jfr->um_qp = qp;

	qp->state = QPS_RESET;
+7 −1
Original line number Diff line number Diff line
@@ -103,8 +103,14 @@ static int create_jfs_um_qp(struct udma_dev *dev, struct udma_jfs *jfs,
	udma_fill_jfs_um_qp_attr(dev, jfs, &jfs->um_qp.qp_attr, udata->uctx, cfg);
	jfs->um_qp.qp_attr.qpn_map = &jfs->qpn_map;
	ret = udma_create_qp_common(dev, &jfs->um_qp, udata);
	if (ret)
	if (ret) {
		dev_err(dev->dev, "failed to create qp for um jfs.\n");
		return ret;
	}

	ret = udma_init_qpc(dev, &jfs->um_qp);
	if (ret)
		udma_destroy_qp_common(dev, &jfs->um_qp);

	return ret;
}
Loading