Commit be89d155 authored by Chengchang Tang's avatar Chengchang Tang Committed by ZhouJuan
Browse files

RDMA/hns: Fix error code of CMD

mainline inclusion
from mainline-v6.2-rc1
commit 667d6164
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I6RO6S
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=667d6164b84884c64de3fc18670cd5a98b0b10cf

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

The error code is fixed to EIO when CMD fails to excute. This patch
converts the error status reported by firmware to linux errno.

Fixes: a04ff739 ("RDMA/hns: Add command queue support for hip08 RoCE driver")
Link: https://lore.kernel.org/r/20221126102911.2921820-6-xuhaoyue1@hisilicon.com


Signed-off-by: default avatarChengchang Tang <tangchengchang@huawei.com>
Signed-off-by: default avatarHaoyue Xu <xuhaoyue1@hisilicon.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Signed-off-by: default avatarZhou Juan <nnuzj07170227@163.com>
parent 064d39fb
Loading
Loading
Loading
Loading
+25 −1
Original line number Original line Diff line number Diff line
@@ -1368,6 +1368,30 @@ static void update_cmdq_status(struct hns_roce_dev *hr_dev)
		hr_dev->cmd.state = HNS_ROCE_CMDQ_STATE_FATAL_ERR;
		hr_dev->cmd.state = HNS_ROCE_CMDQ_STATE_FATAL_ERR;
}
}


static int hns_roce_cmd_err_convert_errno(u16 desc_ret)
{
	struct hns_roce_cmd_errcode errcode_table[] = {
		{CMD_EXEC_SUCCESS, 0},
		{CMD_NO_AUTH, -EPERM},
		{CMD_NOT_EXIST, -EOPNOTSUPP},
		{CMD_CRQ_FULL, -EXFULL},
		{CMD_NEXT_ERR, -ENOSR},
		{CMD_NOT_EXEC, -ENOTBLK},
		{CMD_PARA_ERR, -EINVAL},
		{CMD_RESULT_ERR, -ERANGE},
		{CMD_TIMEOUT, -ETIME},
		{CMD_HILINK_ERR, -ENOLINK},
		{CMD_INFO_ILLEGAL, -ENXIO},
		{CMD_INVALID, -EBADR},
	};
	u16 i;

	for (i = 0; i < ARRAY_SIZE(errcode_table); i++)
		if (desc_ret == errcode_table[i].return_status)
			return errcode_table[i].errno;
	return -EIO;
}

static int __hns_roce_cmq_send(struct hns_roce_dev *hr_dev,
static int __hns_roce_cmq_send(struct hns_roce_dev *hr_dev,
			       struct hns_roce_cmq_desc *desc, int num)
			       struct hns_roce_cmq_desc *desc, int num)
{
{
@@ -1415,7 +1439,7 @@ static int __hns_roce_cmq_send(struct hns_roce_dev *hr_dev,
			dev_err_ratelimited(hr_dev->dev,
			dev_err_ratelimited(hr_dev->dev,
					    "Cmdq IO error, opcode = 0x%x, return = 0x%x.\n",
					    "Cmdq IO error, opcode = 0x%x, return = 0x%x.\n",
					    desc->opcode, desc_ret);
					    desc->opcode, desc_ret);
			ret = -EIO;
			ret = hns_roce_cmd_err_convert_errno(desc_ret);
		}
		}
	} else {
	} else {
		/* FW/HW reset or incorrect number of desc */
		/* FW/HW reset or incorrect number of desc */
+5 −0
Original line number Original line Diff line number Diff line
@@ -256,6 +256,11 @@ enum hns_roce_cmd_return_status {
	CMD_OTHER_ERR = 0xff
	CMD_OTHER_ERR = 0xff
};
};


struct hns_roce_cmd_errcode {
	enum hns_roce_cmd_return_status return_status;
	int errno;
};

enum hns_roce_sgid_type {
enum hns_roce_sgid_type {
	GID_TYPE_FLAG_ROCE_V1 = 0,
	GID_TYPE_FLAG_ROCE_V1 = 0,
	GID_TYPE_FLAG_ROCE_V2_IPV4,
	GID_TYPE_FLAG_ROCE_V2_IPV4,