net: hns3: add hclge_cmd_check_retval() to parse comman's return value
For simplifying the code, this patch adds hclge_cmd_check_retval() to check the return value of the command. Also, according the IMP's description, when there are several descriptors in a command, then the IMP will save the return value on the last description, so hclge_cmd_check_retval() just check the last one for this case. Signed-off-by: Weihang Li <liweihang@hisilicon.com> Signed-off-by: Peng Li <lipeng321@huawei.com> Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8ca754b13f
commit
b671b723e0
|
@ -186,6 +186,38 @@ static bool hclge_is_special_opcode(u16 opcode)
|
|||
return false;
|
||||
}
|
||||
|
||||
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++) {
|
||||
desc[handle] = hw->cmq.csq.desc[ntc];
|
||||
ntc++;
|
||||
if (ntc == hw->cmq.csq.desc_num)
|
||||
ntc = 0;
|
||||
}
|
||||
if (likely(!hclge_is_special_opcode(opcode)))
|
||||
desc_ret = le16_to_cpu(desc[num - 1].retval);
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* hclge_cmd_send - send command to command queue
|
||||
* @hw: pointer to the hw struct
|
||||
|
@ -203,7 +235,6 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
|
|||
u32 timeout = 0;
|
||||
int handle = 0;
|
||||
int retval = 0;
|
||||
u16 opcode, desc_ret;
|
||||
int ntc;
|
||||
|
||||
spin_lock_bh(&hw->cmq.csq.lock);
|
||||
|
@ -219,7 +250,6 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
|
|||
* which will be use for hardware to write back
|
||||
*/
|
||||
ntc = hw->cmq.csq.next_to_use;
|
||||
opcode = le16_to_cpu(desc[0].opcode);
|
||||
while (handle < num) {
|
||||
desc_to_use = &hw->cmq.csq.desc[hw->cmq.csq.next_to_use];
|
||||
*desc_to_use = desc[handle];
|
||||
|
@ -250,31 +280,7 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
|
|||
if (!complete) {
|
||||
retval = -EAGAIN;
|
||||
} else {
|
||||
handle = 0;
|
||||
while (handle < num) {
|
||||
/* Get the result of hardware write back */
|
||||
desc_to_use = &hw->cmq.csq.desc[ntc];
|
||||
desc[handle] = *desc_to_use;
|
||||
|
||||
if (likely(!hclge_is_special_opcode(opcode)))
|
||||
desc_ret = le16_to_cpu(desc[handle].retval);
|
||||
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;
|
||||
ntc++;
|
||||
handle++;
|
||||
if (ntc == hw->cmq.csq.desc_num)
|
||||
ntc = 0;
|
||||
}
|
||||
retval = hclge_cmd_check_retval(hw, desc, num, ntc);
|
||||
}
|
||||
|
||||
/* Clean the command send queue */
|
||||
|
|
Loading…
Reference in New Issue