Commit 9e1511fb authored by Peng Li's avatar Peng Li Committed by David S. Miller
Browse files

net: hns3: add all IMP return code



Currently, the HNS3 driver just defines part of IMP return code,
This patch supplements all the remaining IMP return code, and adds
a function to convert this code to the error number.

Signed-off-by: default avatarPeng Li <lipeng321@huawei.com>
Signed-off-by: default avatarHuazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 49b12556
Loading
Loading
Loading
Loading
+33 −10
Original line number Diff line number Diff line
@@ -188,12 +188,43 @@ static bool hclge_is_special_opcode(u16 opcode)
	return false;
}

static int hclge_cmd_convert_err_code(u16 desc_ret)
{
	switch (desc_ret) {
	case HCLGE_CMD_EXEC_SUCCESS:
		return 0;
	case HCLGE_CMD_NO_AUTH:
		return -EPERM;
	case HCLGE_CMD_NOT_SUPPORTED:
		return -EOPNOTSUPP;
	case HCLGE_CMD_QUEUE_FULL:
		return -EXFULL;
	case HCLGE_CMD_NEXT_ERR:
		return -ENOSR;
	case HCLGE_CMD_UNEXE_ERR:
		return -ENOTBLK;
	case HCLGE_CMD_PARA_ERR:
		return -EINVAL;
	case HCLGE_CMD_RESULT_ERR:
		return -ERANGE;
	case HCLGE_CMD_TIMEOUT:
		return -ETIME;
	case HCLGE_CMD_HILINK_ERR:
		return -ENOLINK;
	case HCLGE_CMD_QUEUE_ILLEGAL:
		return -ENXIO;
	case HCLGE_CMD_INVALID:
		return -EBADR;
	default:
		return -EIO;
	}
}

static int hclge_cmd_check_retval(struct hclge_hw *hw, struct hclge_desc *desc,
				  int num, int ntc)
{
	u16 opcode, desc_ret;
	int handle;
	int retval;

	opcode = le16_to_cpu(desc[0].opcode);
	for (handle = 0; handle < num; handle++) {
@@ -207,17 +238,9 @@ static int hclge_cmd_check_retval(struct hclge_hw *hw, struct hclge_desc *desc,
	else
		desc_ret = le16_to_cpu(desc[0].retval);

	if (desc_ret == HCLGE_CMD_EXEC_SUCCESS)
		retval = 0;
	else if (desc_ret == HCLGE_CMD_NO_AUTH)
		retval = -EPERM;
	else if (desc_ret == HCLGE_CMD_NOT_SUPPORTED)
		retval = -EOPNOTSUPP;
	else
		retval = -EIO;
	hw->cmq.last_status = desc_ret;

	return retval;
	return hclge_cmd_convert_err_code(desc_ret);
}

/**
+8 −0
Original line number Diff line number Diff line
@@ -41,6 +41,14 @@ enum hclge_cmd_return_status {
	HCLGE_CMD_NO_AUTH	= 1,
	HCLGE_CMD_NOT_SUPPORTED	= 2,
	HCLGE_CMD_QUEUE_FULL	= 3,
	HCLGE_CMD_NEXT_ERR	= 4,
	HCLGE_CMD_UNEXE_ERR	= 5,
	HCLGE_CMD_PARA_ERR	= 6,
	HCLGE_CMD_RESULT_ERR	= 7,
	HCLGE_CMD_TIMEOUT	= 8,
	HCLGE_CMD_HILINK_ERR	= 9,
	HCLGE_CMD_QUEUE_ILLEGAL	= 10,
	HCLGE_CMD_INVALID	= 11,
};

enum hclge_cmd_status {
+33 −5
Original line number Diff line number Diff line
@@ -177,6 +177,38 @@ void hclgevf_cmd_setup_basic_desc(struct hclgevf_desc *desc,
		desc->flag &= cpu_to_le16(~HCLGEVF_CMD_FLAG_WR);
}

static int hclgevf_cmd_convert_err_code(u16 desc_ret)
{
	switch (desc_ret) {
	case HCLGEVF_CMD_EXEC_SUCCESS:
		return 0;
	case HCLGEVF_CMD_NO_AUTH:
		return -EPERM;
	case HCLGEVF_CMD_NOT_SUPPORTED:
		return -EOPNOTSUPP;
	case HCLGEVF_CMD_QUEUE_FULL:
		return -EXFULL;
	case HCLGEVF_CMD_NEXT_ERR:
		return -ENOSR;
	case HCLGEVF_CMD_UNEXE_ERR:
		return -ENOTBLK;
	case HCLGEVF_CMD_PARA_ERR:
		return -EINVAL;
	case HCLGEVF_CMD_RESULT_ERR:
		return -ERANGE;
	case HCLGEVF_CMD_TIMEOUT:
		return -ETIME;
	case HCLGEVF_CMD_HILINK_ERR:
		return -ENOLINK;
	case HCLGEVF_CMD_QUEUE_ILLEGAL:
		return -ENXIO;
	case HCLGEVF_CMD_INVALID:
		return -EBADR;
	default:
		return -EIO;
	}
}

/* hclgevf_cmd_send - send command to command queue
 * @hw: pointer to the hw struct
 * @desc: prefilled descriptor for describing the command
@@ -259,11 +291,7 @@ int hclgevf_cmd_send(struct hclgevf_hw *hw, struct hclgevf_desc *desc, int num)
			else
				retval = le16_to_cpu(desc[0].retval);

			if ((enum hclgevf_cmd_return_status)retval ==
			    HCLGEVF_CMD_EXEC_SUCCESS)
				status = 0;
			else
				status = -EIO;
			status = hclgevf_cmd_convert_err_code(retval);
			hw->cmq.last_status = (enum hclgevf_cmd_status)retval;
			ntc++;
			handle++;
+11 −3
Original line number Diff line number Diff line
@@ -47,8 +47,16 @@ struct hclgevf_cmq_ring {
enum hclgevf_cmd_return_status {
	HCLGEVF_CMD_EXEC_SUCCESS	= 0,
	HCLGEVF_CMD_NO_AUTH		= 1,
	HCLGEVF_CMD_NOT_EXEC	= 2,
	HCLGEVF_CMD_NOT_SUPPORTED	= 2,
	HCLGEVF_CMD_QUEUE_FULL		= 3,
	HCLGEVF_CMD_NEXT_ERR		= 4,
	HCLGEVF_CMD_UNEXE_ERR		= 5,
	HCLGEVF_CMD_PARA_ERR		= 6,
	HCLGEVF_CMD_RESULT_ERR		= 7,
	HCLGEVF_CMD_TIMEOUT		= 8,
	HCLGEVF_CMD_HILINK_ERR		= 9,
	HCLGEVF_CMD_QUEUE_ILLEGAL	= 10,
	HCLGEVF_CMD_INVALID		= 11,
};

enum hclgevf_cmd_status {