]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net: hns3: add all IMP return code
authorPeng Li <lipeng321@huawei.com>
Thu, 4 Jul 2019 14:04:23 +0000 (22:04 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 5 Jul 2019 22:39:38 +0000 (15:39 -0700)
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: Peng Li <lipeng321@huawei.com>
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h

index 667c3be3bacc87916c58ebf7b90bf1fc1963e150..22f6acd45d9ae4b3124c969e784587b86ad66e3e 100644 (file)
@@ -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);
 }
 
 /**
index d23ab2b819d950d64eb69cbc82ca1adf82181747..96840d8f3e2423cf45f3cfe632e8b674556a8523 100644 (file)
@@ -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 {
index 31db6d6a6d841ddaecc19c6ef9bc50bcb4d8b991..652b796044e3d2ccc3cb1b4e934bee4e9ce64782 100644 (file)
@@ -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++;
index 47030b42341fbb61e5ea36dc80076760d3b00b31..127a434a56f34be25aa117e207ef6e9806769396 100644 (file)
@@ -46,9 +46,17 @@ 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_QUEUE_FULL  = 3,
+       HCLGEVF_CMD_NO_AUTH             = 1,
+       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 {