]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
net: hns3: Add mac loopback selftest support in hns3 driver
[mirror_ubuntu-bionic-kernel.git] / drivers / net / ethernet / hisilicon / hns3 / hns3pf / hclge_main.c
index c1cdbfd83bdba9bcef1ab3f46729f9a8bffb09c8..8508521c26e8ff7790d2881ef8d47d01c85b5c39 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/platform_device.h>
 
 #include "hclge_cmd.h"
+#include "hclge_dcb.h"
 #include "hclge_main.h"
 #include "hclge_mdio.h"
 #include "hclge_tm.h"
@@ -30,7 +31,6 @@
 #define HCLGE_64BIT_STATS_FIELD_OFF(f) (offsetof(struct hclge_64_bit_stats, f))
 #define HCLGE_32BIT_STATS_FIELD_OFF(f) (offsetof(struct hclge_32_bit_stats, f))
 
-static int hclge_rss_init_hw(struct hclge_dev *hdev);
 static int hclge_set_mta_filter_mode(struct hclge_dev *hdev,
                                     enum hclge_mta_dmac_sel_type mta_mac_sel,
                                     bool enable);
@@ -362,7 +362,7 @@ static int hclge_64_bit_update_stats(struct hclge_dev *hdev)
 #define HCLGE_64_BIT_RTN_DATANUM 4
        u64 *data = (u64 *)(&hdev->hw_stats.all_64_bit_stats);
        struct hclge_desc desc[HCLGE_64_BIT_CMD_NUM];
-       u64 *desc_data;
+       __le64 *desc_data;
        int i, k, n;
        int ret;
 
@@ -376,14 +376,14 @@ static int hclge_64_bit_update_stats(struct hclge_dev *hdev)
 
        for (i = 0; i < HCLGE_64_BIT_CMD_NUM; i++) {
                if (unlikely(i == 0)) {
-                       desc_data = (u64 *)(&desc[i].data[0]);
+                       desc_data = (__le64 *)(&desc[i].data[0]);
                        n = HCLGE_64_BIT_RTN_DATANUM - 1;
                } else {
-                       desc_data = (u64 *)(&desc[i]);
+                       desc_data = (__le64 *)(&desc[i]);
                        n = HCLGE_64_BIT_RTN_DATANUM;
                }
                for (k = 0; k < n; k++) {
-                       *data++ += cpu_to_le64(*desc_data);
+                       *data++ += le64_to_cpu(*desc_data);
                        desc_data++;
                }
        }
@@ -411,7 +411,7 @@ static int hclge_32_bit_update_stats(struct hclge_dev *hdev)
 
        struct hclge_desc desc[HCLGE_32_BIT_CMD_NUM];
        struct hclge_32_bit_stats *all_32_bit_stats;
-       u32 *desc_data;
+       __le32 *desc_data;
        int i, k, n;
        u64 *data;
        int ret;
@@ -431,21 +431,27 @@ static int hclge_32_bit_update_stats(struct hclge_dev *hdev)
        hclge_reset_partial_32bit_counter(all_32_bit_stats);
        for (i = 0; i < HCLGE_32_BIT_CMD_NUM; i++) {
                if (unlikely(i == 0)) {
+                       __le16 *desc_data_16bit;
+
                        all_32_bit_stats->igu_rx_err_pkt +=
-                               cpu_to_le32(desc[i].data[0]);
+                               le32_to_cpu(desc[i].data[0]);
+
+                       desc_data_16bit = (__le16 *)&desc[i].data[1];
                        all_32_bit_stats->igu_rx_no_eof_pkt +=
-                               cpu_to_le32(desc[i].data[1] & 0xffff);
+                               le16_to_cpu(*desc_data_16bit);
+
+                       desc_data_16bit++;
                        all_32_bit_stats->igu_rx_no_sof_pkt +=
-                               cpu_to_le32((desc[i].data[1] >> 16) & 0xffff);
+                               le16_to_cpu(*desc_data_16bit);
 
-                       desc_data = (u32 *)(&desc[i].data[2]);
+                       desc_data = &desc[i].data[2];
                        n = HCLGE_32_BIT_RTN_DATANUM - 4;
                } else {
-                       desc_data = (u32 *)(&desc[i]);
+                       desc_data = (__le32 *)&desc[i];
                        n = HCLGE_32_BIT_RTN_DATANUM;
                }
                for (k = 0; k < n; k++) {
-                       *data++ += cpu_to_le32(*desc_data);
+                       *data++ += le32_to_cpu(*desc_data);
                        desc_data++;
                }
        }
@@ -460,7 +466,7 @@ static int hclge_mac_update_stats(struct hclge_dev *hdev)
 
        u64 *data = (u64 *)(&hdev->hw_stats.mac_stats);
        struct hclge_desc desc[HCLGE_MAC_CMD_NUM];
-       u64 *desc_data;
+       __le64 *desc_data;
        int i, k, n;
        int ret;
 
@@ -475,14 +481,14 @@ static int hclge_mac_update_stats(struct hclge_dev *hdev)
 
        for (i = 0; i < HCLGE_MAC_CMD_NUM; i++) {
                if (unlikely(i == 0)) {
-                       desc_data = (u64 *)(&desc[i].data[0]);
+                       desc_data = (__le64 *)(&desc[i].data[0]);
                        n = HCLGE_RTN_DATA_NUM - 2;
                } else {
-                       desc_data = (u64 *)(&desc[i]);
+                       desc_data = (__le64 *)(&desc[i]);
                        n = HCLGE_RTN_DATA_NUM;
                }
                for (k = 0; k < n; k++) {
-                       *data++ += cpu_to_le64(*desc_data);
+                       *data++ += le64_to_cpu(*desc_data);
                        desc_data++;
                }
        }
@@ -508,7 +514,7 @@ static int hclge_tqps_update_stats(struct hnae3_handle *handle)
                                           HCLGE_OPC_QUERY_RX_STATUS,
                                           true);
 
-               desc[0].data[0] = (tqp->index & 0x1ff);
+               desc[0].data[0] = cpu_to_le32((tqp->index & 0x1ff));
                ret = hclge_cmd_send(&hdev->hw, desc, 1);
                if (ret) {
                        dev_err(&hdev->pdev->dev,
@@ -517,7 +523,7 @@ static int hclge_tqps_update_stats(struct hnae3_handle *handle)
                        return ret;
                }
                tqp->tqp_stats.rcb_rx_ring_pktnum_rcd +=
-                       cpu_to_le32(desc[0].data[4]);
+                       le32_to_cpu(desc[0].data[4]);
        }
 
        for (i = 0; i < kinfo->num_tqps; i++) {
@@ -528,7 +534,7 @@ static int hclge_tqps_update_stats(struct hnae3_handle *handle)
                                           HCLGE_OPC_QUERY_TX_STATUS,
                                           true);
 
-               desc[0].data[0] = (tqp->index & 0x1ff);
+               desc[0].data[0] = cpu_to_le32((tqp->index & 0x1ff));
                ret = hclge_cmd_send(&hdev->hw, desc, 1);
                if (ret) {
                        dev_err(&hdev->pdev->dev,
@@ -537,7 +543,7 @@ static int hclge_tqps_update_stats(struct hnae3_handle *handle)
                        return ret;
                }
                tqp->tqp_stats.rcb_tx_ring_pktnum_rcd +=
-                       cpu_to_le32(desc[0].data[4]);
+                       le32_to_cpu(desc[0].data[4]);
        }
 
        return 0;
@@ -552,12 +558,12 @@ static u64 *hclge_tqps_get_stats(struct hnae3_handle *handle, u64 *data)
 
        for (i = 0; i < kinfo->num_tqps; i++) {
                tqp = container_of(kinfo->tqp[i], struct hclge_tqp, q);
-               *buff++ = cpu_to_le64(tqp->tqp_stats.rcb_tx_ring_pktnum_rcd);
+               *buff++ = tqp->tqp_stats.rcb_tx_ring_pktnum_rcd;
        }
 
        for (i = 0; i < kinfo->num_tqps; i++) {
                tqp = container_of(kinfo->tqp[i], struct hclge_tqp, q);
-               *buff++ = cpu_to_le64(tqp->tqp_stats.rcb_rx_ring_pktnum_rcd);
+               *buff++ = tqp->tqp_stats.rcb_rx_ring_pktnum_rcd;
        }
 
        return buff;
@@ -820,7 +826,7 @@ static void hclge_get_stats(struct hnae3_handle *handle, u64 *data)
 }
 
 static int hclge_parse_func_status(struct hclge_dev *hdev,
-                                  struct hclge_func_status *status)
+                                  struct hclge_func_status_cmd *status)
 {
        if (!(status->pf_state & HCLGE_PF_STATE_DONE))
                return -EINVAL;
@@ -837,13 +843,13 @@ static int hclge_parse_func_status(struct hclge_dev *hdev,
 
 static int hclge_query_function_status(struct hclge_dev *hdev)
 {
-       struct hclge_func_status *req;
+       struct hclge_func_status_cmd *req;
        struct hclge_desc desc;
        int timeout = 0;
        int ret;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_FUNC_STATUS, true);
-       req = (struct hclge_func_status *)desc.data;
+       req = (struct hclge_func_status_cmd *)desc.data;
 
        do {
                ret = hclge_cmd_send(&hdev->hw, &desc, 1);
@@ -868,7 +874,7 @@ static int hclge_query_function_status(struct hclge_dev *hdev)
 
 static int hclge_query_pf_resource(struct hclge_dev *hdev)
 {
-       struct hclge_pf_res *req;
+       struct hclge_pf_res_cmd *req;
        struct hclge_desc desc;
        int ret;
 
@@ -880,7 +886,7 @@ static int hclge_query_pf_resource(struct hclge_dev *hdev)
                return ret;
        }
 
-       req = (struct hclge_pf_res *)desc.data;
+       req = (struct hclge_pf_res_cmd *)desc.data;
        hdev->num_tqps = __le16_to_cpu(req->tqp_num);
        hdev->pkt_buf_size = __le16_to_cpu(req->buf_size) << HCLGE_BUF_UNIT_S;
 
@@ -938,12 +944,12 @@ static int hclge_parse_speed(int speed_cmd, int *speed)
 
 static void hclge_parse_cfg(struct hclge_cfg *cfg, struct hclge_desc *desc)
 {
-       struct hclge_cfg_param *req;
+       struct hclge_cfg_param_cmd *req;
        u64 mac_addr_tmp_high;
        u64 mac_addr_tmp;
        int i;
 
-       req = (struct hclge_cfg_param *)desc[0].data;
+       req = (struct hclge_cfg_param_cmd *)desc[0].data;
 
        /* get the configuration */
        cfg->vmdq_vport_num = hnae_get_field(__le32_to_cpu(req->param[0]),
@@ -978,7 +984,7 @@ static void hclge_parse_cfg(struct hclge_cfg *cfg, struct hclge_desc *desc)
        for (i = 0; i < ETH_ALEN; i++)
                cfg->mac_addr[i] = (mac_addr_tmp >> (8 * i)) & 0xff;
 
-       req = (struct hclge_cfg_param *)desc[1].data;
+       req = (struct hclge_cfg_param_cmd *)desc[1].data;
        cfg->numa_node_map = __le32_to_cpu(req->param[0]);
 }
 
@@ -989,20 +995,21 @@ static void hclge_parse_cfg(struct hclge_cfg *cfg, struct hclge_desc *desc)
 static int hclge_get_cfg(struct hclge_dev *hdev, struct hclge_cfg *hcfg)
 {
        struct hclge_desc desc[HCLGE_PF_CFG_DESC_NUM];
-       struct hclge_cfg_param *req;
+       struct hclge_cfg_param_cmd *req;
        int i, ret;
 
        for (i = 0; i < HCLGE_PF_CFG_DESC_NUM; i++) {
-               req = (struct hclge_cfg_param *)desc[i].data;
+               u32 offset = 0;
+
+               req = (struct hclge_cfg_param_cmd *)desc[i].data;
                hclge_cmd_setup_basic_desc(&desc[i], HCLGE_OPC_GET_CFG_PARAM,
                                           true);
-               hnae_set_field(req->offset, HCLGE_CFG_OFFSET_M,
+               hnae_set_field(offset, HCLGE_CFG_OFFSET_M,
                               HCLGE_CFG_OFFSET_S, i * HCLGE_CFG_RD_LEN_BYTES);
                /* Len should be united by 4 bytes when send to hardware */
-               hnae_set_field(req->offset, HCLGE_CFG_RD_LEN_M,
-                              HCLGE_CFG_RD_LEN_S,
+               hnae_set_field(offset, HCLGE_CFG_RD_LEN_M, HCLGE_CFG_RD_LEN_S,
                               HCLGE_CFG_RD_LEN_BYTES / HCLGE_CFG_RD_LEN_UNIT);
-               req->offset = cpu_to_le32(req->offset);
+               req->offset = cpu_to_le32(offset);
        }
 
        ret = hclge_cmd_send(&hdev->hw, desc, HCLGE_PF_CFG_DESC_NUM);
@@ -1058,7 +1065,7 @@ static int hclge_configure(struct hclge_dev *hdev)
        hdev->hw.mac.phy_addr = cfg.phy_addr;
        hdev->num_desc = cfg.tqp_desc_num;
        hdev->tm_info.num_pg = 1;
-       hdev->tm_info.num_tc = cfg.tc_num;
+       hdev->tc_max = cfg.tc_num;
        hdev->tm_info.hw_pfc_map = 0;
 
        ret = hclge_parse_speed(cfg.default_speed, &hdev->hw.mac.speed);
@@ -1067,15 +1074,25 @@ static int hclge_configure(struct hclge_dev *hdev)
                return ret;
        }
 
-       if ((hdev->tm_info.num_tc > HNAE3_MAX_TC) ||
-           (hdev->tm_info.num_tc < 1)) {
+       if ((hdev->tc_max > HNAE3_MAX_TC) ||
+           (hdev->tc_max < 1)) {
                dev_warn(&hdev->pdev->dev, "TC num = %d.\n",
-                        hdev->tm_info.num_tc);
-               hdev->tm_info.num_tc = 1;
+                        hdev->tc_max);
+               hdev->tc_max = 1;
        }
 
+       /* Dev does not support DCB */
+       if (!hnae3_dev_dcb_supported(hdev)) {
+               hdev->tc_max = 1;
+               hdev->pfc_max = 0;
+       } else {
+               hdev->pfc_max = hdev->tc_max;
+       }
+
+       hdev->tm_info.num_tc = hdev->tc_max;
+
        /* Currently not support uncontiuous tc */
-       for (i = 0; i < cfg.tc_num; i++)
+       for (i = 0; i < hdev->tm_info.num_tc; i++)
                hnae_set_bit(hdev->hw_tc_map, i, 1);
 
        if (!hdev->num_vmdq_vport && !hdev->num_req_vfs)
@@ -1089,16 +1106,23 @@ static int hclge_configure(struct hclge_dev *hdev)
 static int hclge_config_tso(struct hclge_dev *hdev, int tso_mss_min,
                            int tso_mss_max)
 {
-       struct hclge_cfg_tso_status *req;
+       struct hclge_cfg_tso_status_cmd *req;
        struct hclge_desc desc;
+       u16 tso_mss;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_TSO_GENERIC_CONFIG, false);
 
-       req = (struct hclge_cfg_tso_status *)desc.data;
-       hnae_set_field(req->tso_mss_min, HCLGE_TSO_MSS_MIN_M,
+       req = (struct hclge_cfg_tso_status_cmd *)desc.data;
+
+       tso_mss = 0;
+       hnae_set_field(tso_mss, HCLGE_TSO_MSS_MIN_M,
                       HCLGE_TSO_MSS_MIN_S, tso_mss_min);
-       hnae_set_field(req->tso_mss_max, HCLGE_TSO_MSS_MIN_M,
+       req->tso_mss_min = cpu_to_le16(tso_mss);
+
+       tso_mss = 0;
+       hnae_set_field(tso_mss, HCLGE_TSO_MSS_MIN_M,
                       HCLGE_TSO_MSS_MIN_S, tso_mss_max);
+       req->tso_mss_max = cpu_to_le16(tso_mss);
 
        return hclge_cmd_send(&hdev->hw, &desc, 1);
 }
@@ -1134,15 +1158,15 @@ static int hclge_alloc_tqps(struct hclge_dev *hdev)
 static int hclge_map_tqps_to_func(struct hclge_dev *hdev, u16 func_id,
                                  u16 tqp_pid, u16 tqp_vid, bool is_pf)
 {
-       struct hclge_tqp_map *req;
+       struct hclge_tqp_map_cmd *req;
        struct hclge_desc desc;
        int ret;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_SET_TQP_MAP, false);
 
-       req = (struct hclge_tqp_map *)desc.data;
+       req = (struct hclge_tqp_map_cmd *)desc.data;
        req->tqp_id = cpu_to_le16(tqp_pid);
-       req->tqp_vf = cpu_to_le16(func_id);
+       req->tqp_vf = func_id;
        req->tqp_flag = !is_pf << HCLGE_TQP_MAP_TYPE_B |
                        1 << HCLGE_TQP_MAP_EN_B;
        req->tqp_vid = cpu_to_le16(tqp_vid);
@@ -1324,23 +1348,27 @@ static int hclge_alloc_vport(struct hclge_dev *hdev)
        return 0;
 }
 
-static int  hclge_cmd_alloc_tx_buff(struct hclge_dev *hdev, u16 buf_size)
+static int  hclge_cmd_alloc_tx_buff(struct hclge_dev *hdev,
+                                   struct hclge_pkt_buf_alloc *buf_alloc)
 {
 /* TX buffer size is unit by 128 byte */
 #define HCLGE_BUF_SIZE_UNIT_SHIFT      7
 #define HCLGE_BUF_SIZE_UPDATE_EN_MSK   BIT(15)
-       struct hclge_tx_buff_alloc *req;
+       struct hclge_tx_buff_alloc_cmd *req;
        struct hclge_desc desc;
        int ret;
        u8 i;
 
-       req = (struct hclge_tx_buff_alloc *)desc.data;
+       req = (struct hclge_tx_buff_alloc_cmd *)desc.data;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_TX_BUFF_ALLOC, 0);
-       for (i = 0; i < HCLGE_TC_NUM; i++)
+       for (i = 0; i < HCLGE_TC_NUM; i++) {
+               u32 buf_size = buf_alloc->priv_buf[i].tx_buf_size;
+
                req->tx_pkt_buff[i] =
                        cpu_to_le16((buf_size >> HCLGE_BUF_SIZE_UNIT_SHIFT) |
                                     HCLGE_BUF_SIZE_UPDATE_EN_MSK);
+       }
 
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
        if (ret) {
@@ -1352,9 +1380,10 @@ static int  hclge_cmd_alloc_tx_buff(struct hclge_dev *hdev, u16 buf_size)
        return 0;
 }
 
-static int hclge_tx_buffer_alloc(struct hclge_dev *hdev, u32 buf_size)
+static int hclge_tx_buffer_alloc(struct hclge_dev *hdev,
+                                struct hclge_pkt_buf_alloc *buf_alloc)
 {
-       int ret = hclge_cmd_alloc_tx_buff(hdev, buf_size);
+       int ret = hclge_cmd_alloc_tx_buff(hdev, buf_alloc);
 
        if (ret) {
                dev_err(&hdev->pdev->dev,
@@ -1387,13 +1416,14 @@ static int hclge_get_pfc_enalbe_num(struct hclge_dev *hdev)
 }
 
 /* Get the number of pfc enabled TCs, which have private buffer */
-static int hclge_get_pfc_priv_num(struct hclge_dev *hdev)
+static int hclge_get_pfc_priv_num(struct hclge_dev *hdev,
+                                 struct hclge_pkt_buf_alloc *buf_alloc)
 {
        struct hclge_priv_buf *priv;
        int i, cnt = 0;
 
        for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
-               priv = &hdev->priv_buf[i];
+               priv = &buf_alloc->priv_buf[i];
                if ((hdev->tm_info.hw_pfc_map & BIT(i)) &&
                    priv->enable)
                        cnt++;
@@ -1403,13 +1433,14 @@ static int hclge_get_pfc_priv_num(struct hclge_dev *hdev)
 }
 
 /* Get the number of pfc disabled TCs, which have private buffer */
-static int hclge_get_no_pfc_priv_num(struct hclge_dev *hdev)
+static int hclge_get_no_pfc_priv_num(struct hclge_dev *hdev,
+                                    struct hclge_pkt_buf_alloc *buf_alloc)
 {
        struct hclge_priv_buf *priv;
        int i, cnt = 0;
 
        for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
-               priv = &hdev->priv_buf[i];
+               priv = &buf_alloc->priv_buf[i];
                if (hdev->hw_tc_map & BIT(i) &&
                    !(hdev->tm_info.hw_pfc_map & BIT(i)) &&
                    priv->enable)
@@ -1419,21 +1450,33 @@ static int hclge_get_no_pfc_priv_num(struct hclge_dev *hdev)
        return cnt;
 }
 
-static u32 hclge_get_rx_priv_buff_alloced(struct hclge_dev *hdev)
+static u32 hclge_get_rx_priv_buff_alloced(struct hclge_pkt_buf_alloc *buf_alloc)
 {
        struct hclge_priv_buf *priv;
        u32 rx_priv = 0;
        int i;
 
        for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
-               priv = &hdev->priv_buf[i];
+               priv = &buf_alloc->priv_buf[i];
                if (priv->enable)
                        rx_priv += priv->buf_size;
        }
        return rx_priv;
 }
 
-static bool  hclge_is_rx_buf_ok(struct hclge_dev *hdev, u32 rx_all)
+static u32 hclge_get_tx_buff_alloced(struct hclge_pkt_buf_alloc *buf_alloc)
+{
+       u32 i, total_tx_size = 0;
+
+       for (i = 0; i < HCLGE_MAX_TC_NUM; i++)
+               total_tx_size += buf_alloc->priv_buf[i].tx_buf_size;
+
+       return total_tx_size;
+}
+
+static bool  hclge_is_rx_buf_ok(struct hclge_dev *hdev,
+                               struct hclge_pkt_buf_alloc *buf_alloc,
+                               u32 rx_all)
 {
        u32 shared_buf_min, shared_buf_tc, shared_std;
        int tc_num, pfc_enable_num;
@@ -1454,46 +1497,74 @@ static bool  hclge_is_rx_buf_ok(struct hclge_dev *hdev, u32 rx_all)
                        hdev->mps;
        shared_std = max_t(u32, shared_buf_min, shared_buf_tc);
 
-       rx_priv = hclge_get_rx_priv_buff_alloced(hdev);
+       rx_priv = hclge_get_rx_priv_buff_alloced(buf_alloc);
        if (rx_all <= rx_priv + shared_std)
                return false;
 
        shared_buf = rx_all - rx_priv;
-       hdev->s_buf.buf_size = shared_buf;
-       hdev->s_buf.self.high = shared_buf;
-       hdev->s_buf.self.low =  2 * hdev->mps;
+       buf_alloc->s_buf.buf_size = shared_buf;
+       buf_alloc->s_buf.self.high = shared_buf;
+       buf_alloc->s_buf.self.low =  2 * hdev->mps;
 
        for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
                if ((hdev->hw_tc_map & BIT(i)) &&
                    (hdev->tm_info.hw_pfc_map & BIT(i))) {
-                       hdev->s_buf.tc_thrd[i].low = hdev->mps;
-                       hdev->s_buf.tc_thrd[i].high = 2 * hdev->mps;
+                       buf_alloc->s_buf.tc_thrd[i].low = hdev->mps;
+                       buf_alloc->s_buf.tc_thrd[i].high = 2 * hdev->mps;
                } else {
-                       hdev->s_buf.tc_thrd[i].low = 0;
-                       hdev->s_buf.tc_thrd[i].high = hdev->mps;
+                       buf_alloc->s_buf.tc_thrd[i].low = 0;
+                       buf_alloc->s_buf.tc_thrd[i].high = hdev->mps;
                }
        }
 
        return true;
 }
 
+static int hclge_tx_buffer_calc(struct hclge_dev *hdev,
+                               struct hclge_pkt_buf_alloc *buf_alloc)
+{
+       u32 i, total_size;
+
+       total_size = hdev->pkt_buf_size;
+
+       /* alloc tx buffer for all enabled tc */
+       for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
+               struct hclge_priv_buf *priv = &buf_alloc->priv_buf[i];
+
+               if (total_size < HCLGE_DEFAULT_TX_BUF)
+                       return -ENOMEM;
+
+               if (hdev->hw_tc_map & BIT(i))
+                       priv->tx_buf_size = HCLGE_DEFAULT_TX_BUF;
+               else
+                       priv->tx_buf_size = 0;
+
+               total_size -= priv->tx_buf_size;
+       }
+
+       return 0;
+}
+
 /* hclge_rx_buffer_calc: calculate the rx private buffer size for all TCs
  * @hdev: pointer to struct hclge_dev
- * @tx_size: the allocated tx buffer for all TCs
+ * @buf_alloc: pointer to buffer calculation data
  * @return: 0: calculate sucessful, negative: fail
  */
-int hclge_rx_buffer_calc(struct hclge_dev *hdev, u32 tx_size)
+static int hclge_rx_buffer_calc(struct hclge_dev *hdev,
+                               struct hclge_pkt_buf_alloc *buf_alloc)
 {
-       u32 rx_all = hdev->pkt_buf_size - tx_size;
+       u32 rx_all = hdev->pkt_buf_size;
        int no_pfc_priv_num, pfc_priv_num;
        struct hclge_priv_buf *priv;
        int i;
 
+       rx_all -= hclge_get_tx_buff_alloced(buf_alloc);
+
        /* When DCB is not supported, rx private
         * buffer is not allocated.
         */
        if (!hnae3_dev_dcb_supported(hdev)) {
-               if (!hclge_is_rx_buf_ok(hdev, rx_all))
+               if (!hclge_is_rx_buf_ok(hdev, buf_alloc, rx_all))
                        return -ENOMEM;
 
                return 0;
@@ -1501,7 +1572,7 @@ int hclge_rx_buffer_calc(struct hclge_dev *hdev, u32 tx_size)
 
        /* step 1, try to alloc private buffer for all enabled tc */
        for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
-               priv = &hdev->priv_buf[i];
+               priv = &buf_alloc->priv_buf[i];
                if (hdev->hw_tc_map & BIT(i)) {
                        priv->enable = 1;
                        if (hdev->tm_info.hw_pfc_map & BIT(i)) {
@@ -1522,14 +1593,14 @@ int hclge_rx_buffer_calc(struct hclge_dev *hdev, u32 tx_size)
                }
        }
 
-       if (hclge_is_rx_buf_ok(hdev, rx_all))
+       if (hclge_is_rx_buf_ok(hdev, buf_alloc, rx_all))
                return 0;
 
        /* step 2, try to decrease the buffer size of
         * no pfc TC's private buffer
         */
        for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
-               priv = &hdev->priv_buf[i];
+               priv = &buf_alloc->priv_buf[i];
 
                priv->enable = 0;
                priv->wl.low = 0;
@@ -1552,18 +1623,18 @@ int hclge_rx_buffer_calc(struct hclge_dev *hdev, u32 tx_size)
                }
        }
 
-       if (hclge_is_rx_buf_ok(hdev, rx_all))
+       if (hclge_is_rx_buf_ok(hdev, buf_alloc, rx_all))
                return 0;
 
        /* step 3, try to reduce the number of pfc disabled TCs,
         * which have private buffer
         */
        /* get the total no pfc enable TC number, which have private buffer */
-       no_pfc_priv_num = hclge_get_no_pfc_priv_num(hdev);
+       no_pfc_priv_num = hclge_get_no_pfc_priv_num(hdev, buf_alloc);
 
        /* let the last to be cleared first */
        for (i = HCLGE_MAX_TC_NUM - 1; i >= 0; i--) {
-               priv = &hdev->priv_buf[i];
+               priv = &buf_alloc->priv_buf[i];
 
                if (hdev->hw_tc_map & BIT(i) &&
                    !(hdev->tm_info.hw_pfc_map & BIT(i))) {
@@ -1575,22 +1646,22 @@ int hclge_rx_buffer_calc(struct hclge_dev *hdev, u32 tx_size)
                        no_pfc_priv_num--;
                }
 
-               if (hclge_is_rx_buf_ok(hdev, rx_all) ||
+               if (hclge_is_rx_buf_ok(hdev, buf_alloc, rx_all) ||
                    no_pfc_priv_num == 0)
                        break;
        }
 
-       if (hclge_is_rx_buf_ok(hdev, rx_all))
+       if (hclge_is_rx_buf_ok(hdev, buf_alloc, rx_all))
                return 0;
 
        /* step 4, try to reduce the number of pfc enabled TCs
         * which have private buffer.
         */
-       pfc_priv_num = hclge_get_pfc_priv_num(hdev);
+       pfc_priv_num = hclge_get_pfc_priv_num(hdev, buf_alloc);
 
        /* let the last to be cleared first */
        for (i = HCLGE_MAX_TC_NUM - 1; i >= 0; i--) {
-               priv = &hdev->priv_buf[i];
+               priv = &buf_alloc->priv_buf[i];
 
                if (hdev->hw_tc_map & BIT(i) &&
                    hdev->tm_info.hw_pfc_map & BIT(i)) {
@@ -1602,38 +1673,39 @@ int hclge_rx_buffer_calc(struct hclge_dev *hdev, u32 tx_size)
                        pfc_priv_num--;
                }
 
-               if (hclge_is_rx_buf_ok(hdev, rx_all) ||
+               if (hclge_is_rx_buf_ok(hdev, buf_alloc, rx_all) ||
                    pfc_priv_num == 0)
                        break;
        }
-       if (hclge_is_rx_buf_ok(hdev, rx_all))
+       if (hclge_is_rx_buf_ok(hdev, buf_alloc, rx_all))
                return 0;
 
        return -ENOMEM;
 }
 
-static int hclge_rx_priv_buf_alloc(struct hclge_dev *hdev)
+static int hclge_rx_priv_buf_alloc(struct hclge_dev *hdev,
+                                  struct hclge_pkt_buf_alloc *buf_alloc)
 {
-       struct hclge_rx_priv_buff *req;
+       struct hclge_rx_priv_buff_cmd *req;
        struct hclge_desc desc;
        int ret;
        int i;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_RX_PRIV_BUFF_ALLOC, false);
-       req = (struct hclge_rx_priv_buff *)desc.data;
+       req = (struct hclge_rx_priv_buff_cmd *)desc.data;
 
        /* Alloc private buffer TCs */
        for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
-               struct hclge_priv_buf *priv = &hdev->priv_buf[i];
+               struct hclge_priv_buf *priv = &buf_alloc->priv_buf[i];
 
                req->buf_num[i] =
                        cpu_to_le16(priv->buf_size >> HCLGE_BUF_UNIT_S);
                req->buf_num[i] |=
-                       cpu_to_le16(true << HCLGE_TC0_PRI_BUF_EN_B);
+                       cpu_to_le16(1 << HCLGE_TC0_PRI_BUF_EN_B);
        }
 
        req->shared_buf =
-               cpu_to_le16((hdev->s_buf.buf_size >> HCLGE_BUF_UNIT_S) |
+               cpu_to_le16((buf_alloc->s_buf.buf_size >> HCLGE_BUF_UNIT_S) |
                            (1 << HCLGE_TC0_PRI_BUF_EN_B));
 
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
@@ -1648,7 +1720,8 @@ static int hclge_rx_priv_buf_alloc(struct hclge_dev *hdev)
 
 #define HCLGE_PRIV_ENABLE(a) ((a) > 0 ? 1 : 0)
 
-static int hclge_rx_priv_wl_config(struct hclge_dev *hdev)
+static int hclge_rx_priv_wl_config(struct hclge_dev *hdev,
+                                  struct hclge_pkt_buf_alloc *buf_alloc)
 {
        struct hclge_rx_priv_wl_buf *req;
        struct hclge_priv_buf *priv;
@@ -1668,7 +1741,9 @@ static int hclge_rx_priv_wl_config(struct hclge_dev *hdev)
                        desc[i].flag &= ~cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
 
                for (j = 0; j < HCLGE_TC_NUM_ONE_DESC; j++) {
-                       priv = &hdev->priv_buf[i * HCLGE_TC_NUM_ONE_DESC + j];
+                       u32 idx = i * HCLGE_TC_NUM_ONE_DESC + j;
+
+                       priv = &buf_alloc->priv_buf[idx];
                        req->tc_wl[j].high =
                                cpu_to_le16(priv->wl.high >> HCLGE_BUF_UNIT_S);
                        req->tc_wl[j].high |=
@@ -1693,9 +1768,10 @@ static int hclge_rx_priv_wl_config(struct hclge_dev *hdev)
        return 0;
 }
 
-static int hclge_common_thrd_config(struct hclge_dev *hdev)
+static int hclge_common_thrd_config(struct hclge_dev *hdev,
+                                   struct hclge_pkt_buf_alloc *buf_alloc)
 {
-       struct hclge_shared_buf *s_buf = &hdev->s_buf;
+       struct hclge_shared_buf *s_buf = &buf_alloc->s_buf;
        struct hclge_rx_com_thrd *req;
        struct hclge_desc desc[2];
        struct hclge_tc_thrd *tc;
@@ -1739,9 +1815,10 @@ static int hclge_common_thrd_config(struct hclge_dev *hdev)
        return 0;
 }
 
-static int hclge_common_wl_config(struct hclge_dev *hdev)
+static int hclge_common_wl_config(struct hclge_dev *hdev,
+                                 struct hclge_pkt_buf_alloc *buf_alloc)
 {
-       struct hclge_shared_buf *buf = &hdev->s_buf;
+       struct hclge_shared_buf *buf = &buf_alloc->s_buf;
        struct hclge_rx_com_wl *req;
        struct hclge_desc desc;
        int ret;
@@ -1771,63 +1848,68 @@ static int hclge_common_wl_config(struct hclge_dev *hdev)
 
 int hclge_buffer_alloc(struct hclge_dev *hdev)
 {
-       u32 tx_buf_size = HCLGE_DEFAULT_TX_BUF;
+       struct hclge_pkt_buf_alloc *pkt_buf;
        int ret;
 
-       hdev->priv_buf = devm_kmalloc_array(&hdev->pdev->dev, HCLGE_MAX_TC_NUM,
-                                           sizeof(struct hclge_priv_buf),
-                                           GFP_KERNEL | __GFP_ZERO);
-       if (!hdev->priv_buf)
+       pkt_buf = kzalloc(sizeof(*pkt_buf), GFP_KERNEL);
+       if (!pkt_buf)
                return -ENOMEM;
 
-       ret = hclge_tx_buffer_alloc(hdev, tx_buf_size);
+       ret = hclge_tx_buffer_calc(hdev, pkt_buf);
+       if (ret) {
+               dev_err(&hdev->pdev->dev,
+                       "could not calc tx buffer size for all TCs %d\n", ret);
+               goto out;
+       }
+
+       ret = hclge_tx_buffer_alloc(hdev, pkt_buf);
        if (ret) {
                dev_err(&hdev->pdev->dev,
                        "could not alloc tx buffers %d\n", ret);
-               return ret;
+               goto out;
        }
 
-       ret = hclge_rx_buffer_calc(hdev, tx_buf_size);
+       ret = hclge_rx_buffer_calc(hdev, pkt_buf);
        if (ret) {
                dev_err(&hdev->pdev->dev,
                        "could not calc rx priv buffer size for all TCs %d\n",
                        ret);
-               return ret;
+               goto out;
        }
 
-       ret = hclge_rx_priv_buf_alloc(hdev);
+       ret = hclge_rx_priv_buf_alloc(hdev, pkt_buf);
        if (ret) {
                dev_err(&hdev->pdev->dev, "could not alloc rx priv buffer %d\n",
                        ret);
-               return ret;
+               goto out;
        }
 
        if (hnae3_dev_dcb_supported(hdev)) {
-               ret = hclge_rx_priv_wl_config(hdev);
+               ret = hclge_rx_priv_wl_config(hdev, pkt_buf);
                if (ret) {
                        dev_err(&hdev->pdev->dev,
                                "could not configure rx private waterline %d\n",
                                ret);
-                       return ret;
+                       goto out;
                }
 
-               ret = hclge_common_thrd_config(hdev);
+               ret = hclge_common_thrd_config(hdev, pkt_buf);
                if (ret) {
                        dev_err(&hdev->pdev->dev,
                                "could not configure common threshold %d\n",
                                ret);
-                       return ret;
+                       goto out;
                }
        }
 
-       ret = hclge_common_wl_config(hdev);
-       if (ret) {
+       ret = hclge_common_wl_config(hdev, pkt_buf);
+       if (ret)
                dev_err(&hdev->pdev->dev,
                        "could not configure common waterline %d\n", ret);
-               return ret;
-       }
 
-       return 0;
+out:
+       kfree(pkt_buf);
+       return ret;
 }
 
 static int hclge_init_roce_base_info(struct hclge_vport *vport)
@@ -1932,11 +2014,11 @@ static void hclge_check_speed_dup(struct hclge_dev *hdev, int duplex, int speed)
 
 int hclge_cfg_mac_speed_dup(struct hclge_dev *hdev, int speed, u8 duplex)
 {
-       struct hclge_config_mac_speed_dup *req;
+       struct hclge_config_mac_speed_dup_cmd *req;
        struct hclge_desc desc;
        int ret;
 
-       req = (struct hclge_config_mac_speed_dup *)desc.data;
+       req = (struct hclge_config_mac_speed_dup_cmd *)desc.data;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_SPEED_DUP, false);
 
@@ -2007,12 +2089,12 @@ static int hclge_cfg_mac_speed_dup_h(struct hnae3_handle *handle, int speed,
 static int hclge_query_mac_an_speed_dup(struct hclge_dev *hdev, int *speed,
                                        u8 *duplex)
 {
-       struct hclge_query_an_speed_dup *req;
+       struct hclge_query_an_speed_dup_cmd *req;
        struct hclge_desc desc;
        int speed_tmp;
        int ret;
 
-       req = (struct hclge_query_an_speed_dup *)desc.data;
+       req = (struct hclge_query_an_speed_dup_cmd *)desc.data;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_AN_RESULT, true);
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
@@ -2040,11 +2122,11 @@ static int hclge_query_mac_an_speed_dup(struct hclge_dev *hdev, int *speed,
 static int hclge_query_autoneg_result(struct hclge_dev *hdev)
 {
        struct hclge_mac *mac = &hdev->hw.mac;
-       struct hclge_query_an_speed_dup *req;
+       struct hclge_query_an_speed_dup_cmd *req;
        struct hclge_desc desc;
        int ret;
 
-       req = (struct hclge_query_an_speed_dup *)desc.data;
+       req = (struct hclge_query_an_speed_dup_cmd *)desc.data;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_AN_RESULT, true);
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
@@ -2061,14 +2143,16 @@ static int hclge_query_autoneg_result(struct hclge_dev *hdev)
 
 static int hclge_set_autoneg_en(struct hclge_dev *hdev, bool enable)
 {
-       struct hclge_config_auto_neg *req;
+       struct hclge_config_auto_neg_cmd *req;
        struct hclge_desc desc;
+       u32 flag = 0;
        int ret;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_AN_MODE, false);
 
-       req = (struct hclge_config_auto_neg *)desc.data;
-       hnae_set_bit(req->cfg_an_cmd_flag, HCLGE_MAC_CFG_AN_EN_B, !!enable);
+       req = (struct hclge_config_auto_neg_cmd *)desc.data;
+       hnae_set_bit(flag, HCLGE_MAC_CFG_AN_EN_B, !!enable);
+       req->cfg_an_cmd_flag = cpu_to_le32(flag);
 
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
        if (ret) {
@@ -2146,7 +2230,7 @@ static void hclge_task_schedule(struct hclge_dev *hdev)
 
 static int hclge_get_mac_link_status(struct hclge_dev *hdev)
 {
-       struct hclge_link_status *req;
+       struct hclge_link_status_cmd *req;
        struct hclge_desc desc;
        int link_status;
        int ret;
@@ -2159,7 +2243,7 @@ static int hclge_get_mac_link_status(struct hclge_dev *hdev)
                return ret;
        }
 
-       req = (struct hclge_link_status *)desc.data;
+       req = (struct hclge_link_status_cmd *)desc.data;
        link_status = req->status & HCLGE_LINK_STATUS;
 
        return !!link_status;
@@ -2266,11 +2350,11 @@ static int hclge_get_status(struct hnae3_handle *handle)
        return hdev->hw.mac.link;
 }
 
-static void hclge_service_timer(unsigned long data)
+static void hclge_service_timer(struct timer_list *t)
 {
-       struct hclge_dev *hdev = (struct hclge_dev *)data;
-       (void)mod_timer(&hdev->service_timer, jiffies + HZ);
+       struct hclge_dev *hdev = from_timer(hdev, t, service_timer);
 
+       mod_timer(&hdev->service_timer, jiffies + HZ);
        hclge_task_schedule(hdev);
 }
 
@@ -2383,7 +2467,7 @@ static u32 hclge_get_rss_indir_size(struct hnae3_handle *handle)
 
 static int hclge_get_rss_algo(struct hclge_dev *hdev)
 {
-       struct hclge_rss_config *req;
+       struct hclge_rss_config_cmd *req;
        struct hclge_desc desc;
        int rss_hash_algo;
        int ret;
@@ -2397,7 +2481,7 @@ static int hclge_get_rss_algo(struct hclge_dev *hdev)
                return ret;
        }
 
-       req = (struct hclge_rss_config *)desc.data;
+       req = (struct hclge_rss_config_cmd *)desc.data;
        rss_hash_algo = (req->hash_config & HCLGE_RSS_HASH_ALGO_MASK);
 
        if (rss_hash_algo == HCLGE_RSS_HASH_ALGO_TOEPLITZ)
@@ -2409,13 +2493,13 @@ static int hclge_get_rss_algo(struct hclge_dev *hdev)
 static int hclge_set_rss_algo_key(struct hclge_dev *hdev,
                                  const u8 hfunc, const u8 *key)
 {
-       struct hclge_rss_config *req;
+       struct hclge_rss_config_cmd *req;
        struct hclge_desc desc;
        int key_offset;
        int key_size;
        int ret;
 
-       req = (struct hclge_rss_config *)desc.data;
+       req = (struct hclge_rss_config_cmd *)desc.data;
 
        for (key_offset = 0; key_offset < 3; key_offset++) {
                hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_RSS_GENERIC_CONFIG,
@@ -2446,19 +2530,20 @@ static int hclge_set_rss_algo_key(struct hclge_dev *hdev,
 
 static int hclge_set_rss_indir_table(struct hclge_dev *hdev, const u32 *indir)
 {
-       struct hclge_rss_indirection_table *req;
+       struct hclge_rss_indirection_table_cmd *req;
        struct hclge_desc desc;
        int i, j;
        int ret;
 
-       req = (struct hclge_rss_indirection_table *)desc.data;
+       req = (struct hclge_rss_indirection_table_cmd *)desc.data;
 
        for (i = 0; i < HCLGE_RSS_CFG_TBL_NUM; i++) {
                hclge_cmd_setup_basic_desc
                        (&desc, HCLGE_OPC_RSS_INDIR_TABLE, false);
 
-               req->start_table_index = i * HCLGE_RSS_CFG_TBL_SIZE;
-               req->rss_set_bitmap = HCLGE_RSS_SET_BITMAP_MSK;
+               req->start_table_index =
+                       cpu_to_le16(i * HCLGE_RSS_CFG_TBL_SIZE);
+               req->rss_set_bitmap = cpu_to_le16(HCLGE_RSS_SET_BITMAP_MSK);
 
                for (j = 0; j < HCLGE_RSS_CFG_TBL_SIZE; j++)
                        req->rss_result[j] =
@@ -2478,21 +2563,24 @@ static int hclge_set_rss_indir_table(struct hclge_dev *hdev, const u32 *indir)
 static int hclge_set_rss_tc_mode(struct hclge_dev *hdev, u16 *tc_valid,
                                 u16 *tc_size, u16 *tc_offset)
 {
-       struct hclge_rss_tc_mode *req;
+       struct hclge_rss_tc_mode_cmd *req;
        struct hclge_desc desc;
        int ret;
        int i;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_RSS_TC_MODE, false);
-       req = (struct hclge_rss_tc_mode *)desc.data;
+       req = (struct hclge_rss_tc_mode_cmd *)desc.data;
 
        for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
-               hnae_set_bit(req->rss_tc_mode[i], HCLGE_RSS_TC_VALID_B,
-                            (tc_valid[i] & 0x1));
-               hnae_set_field(req->rss_tc_mode[i], HCLGE_RSS_TC_SIZE_M,
+               u16 mode = 0;
+
+               hnae_set_bit(mode, HCLGE_RSS_TC_VALID_B, (tc_valid[i] & 0x1));
+               hnae_set_field(mode, HCLGE_RSS_TC_SIZE_M,
                               HCLGE_RSS_TC_SIZE_S, tc_size[i]);
-               hnae_set_field(req->rss_tc_mode[i], HCLGE_RSS_TC_OFFSET_M,
+               hnae_set_field(mode, HCLGE_RSS_TC_OFFSET_M,
                               HCLGE_RSS_TC_OFFSET_S, tc_offset[i]);
+
+               req->rss_tc_mode[i] = cpu_to_le16(mode);
        }
 
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
@@ -2507,15 +2595,13 @@ static int hclge_set_rss_tc_mode(struct hclge_dev *hdev, u16 *tc_valid,
 
 static int hclge_set_rss_input_tuple(struct hclge_dev *hdev)
 {
-#define HCLGE_RSS_INPUT_TUPLE_OTHER            0xf
-#define HCLGE_RSS_INPUT_TUPLE_SCTP             0x1f
-       struct hclge_rss_input_tuple *req;
+       struct hclge_rss_input_tuple_cmd *req;
        struct hclge_desc desc;
        int ret;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_RSS_INPUT_TUPLE, false);
 
-       req = (struct hclge_rss_input_tuple *)desc.data;
+       req = (struct hclge_rss_input_tuple_cmd *)desc.data;
        req->ipv4_tcp_en = HCLGE_RSS_INPUT_TUPLE_OTHER;
        req->ipv4_udp_en = HCLGE_RSS_INPUT_TUPLE_OTHER;
        req->ipv4_sctp_en = HCLGE_RSS_INPUT_TUPLE_SCTP;
@@ -2589,6 +2675,161 @@ static int hclge_set_rss(struct hnae3_handle *handle, const u32 *indir,
        return ret;
 }
 
+static u8 hclge_get_rss_hash_bits(struct ethtool_rxnfc *nfc)
+{
+       u8 hash_sets = nfc->data & RXH_L4_B_0_1 ? HCLGE_S_PORT_BIT : 0;
+
+       if (nfc->data & RXH_L4_B_2_3)
+               hash_sets |= HCLGE_D_PORT_BIT;
+       else
+               hash_sets &= ~HCLGE_D_PORT_BIT;
+
+       if (nfc->data & RXH_IP_SRC)
+               hash_sets |= HCLGE_S_IP_BIT;
+       else
+               hash_sets &= ~HCLGE_S_IP_BIT;
+
+       if (nfc->data & RXH_IP_DST)
+               hash_sets |= HCLGE_D_IP_BIT;
+       else
+               hash_sets &= ~HCLGE_D_IP_BIT;
+
+       if (nfc->flow_type == SCTP_V4_FLOW || nfc->flow_type == SCTP_V6_FLOW)
+               hash_sets |= HCLGE_V_TAG_BIT;
+
+       return hash_sets;
+}
+
+static int hclge_set_rss_tuple(struct hnae3_handle *handle,
+                              struct ethtool_rxnfc *nfc)
+{
+       struct hclge_vport *vport = hclge_get_vport(handle);
+       struct hclge_dev *hdev = vport->back;
+       struct hclge_rss_input_tuple_cmd *req;
+       struct hclge_desc desc;
+       u8 tuple_sets;
+       int ret;
+
+       if (nfc->data & ~(RXH_IP_SRC | RXH_IP_DST |
+                         RXH_L4_B_0_1 | RXH_L4_B_2_3))
+               return -EINVAL;
+
+       req = (struct hclge_rss_input_tuple_cmd *)desc.data;
+       hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_RSS_INPUT_TUPLE, true);
+       ret = hclge_cmd_send(&hdev->hw, &desc, 1);
+       if (ret) {
+               dev_err(&hdev->pdev->dev,
+                       "Read rss tuple fail, status = %d\n", ret);
+               return ret;
+       }
+
+       hclge_cmd_reuse_desc(&desc, false);
+
+       tuple_sets = hclge_get_rss_hash_bits(nfc);
+       switch (nfc->flow_type) {
+       case TCP_V4_FLOW:
+               req->ipv4_tcp_en = tuple_sets;
+               break;
+       case TCP_V6_FLOW:
+               req->ipv6_tcp_en = tuple_sets;
+               break;
+       case UDP_V4_FLOW:
+               req->ipv4_udp_en = tuple_sets;
+               break;
+       case UDP_V6_FLOW:
+               req->ipv6_udp_en = tuple_sets;
+               break;
+       case SCTP_V4_FLOW:
+               req->ipv4_sctp_en = tuple_sets;
+               break;
+       case SCTP_V6_FLOW:
+               if ((nfc->data & RXH_L4_B_0_1) ||
+                   (nfc->data & RXH_L4_B_2_3))
+                       return -EINVAL;
+
+               req->ipv6_sctp_en = tuple_sets;
+               break;
+       case IPV4_FLOW:
+               req->ipv4_fragment_en = HCLGE_RSS_INPUT_TUPLE_OTHER;
+               break;
+       case IPV6_FLOW:
+               req->ipv6_fragment_en = HCLGE_RSS_INPUT_TUPLE_OTHER;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       ret = hclge_cmd_send(&hdev->hw, &desc, 1);
+       if (ret)
+               dev_err(&hdev->pdev->dev,
+                       "Set rss tuple fail, status = %d\n", ret);
+
+       return ret;
+}
+
+static int hclge_get_rss_tuple(struct hnae3_handle *handle,
+                              struct ethtool_rxnfc *nfc)
+{
+       struct hclge_vport *vport = hclge_get_vport(handle);
+       struct hclge_dev *hdev = vport->back;
+       struct hclge_rss_input_tuple_cmd *req;
+       struct hclge_desc desc;
+       u8 tuple_sets;
+       int ret;
+
+       nfc->data = 0;
+
+       req = (struct hclge_rss_input_tuple_cmd *)desc.data;
+       hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_RSS_INPUT_TUPLE, true);
+       ret = hclge_cmd_send(&hdev->hw, &desc, 1);
+       if (ret) {
+               dev_err(&hdev->pdev->dev,
+                       "Read rss tuple fail, status = %d\n", ret);
+               return ret;
+       }
+
+       switch (nfc->flow_type) {
+       case TCP_V4_FLOW:
+               tuple_sets = req->ipv4_tcp_en;
+               break;
+       case UDP_V4_FLOW:
+               tuple_sets = req->ipv4_udp_en;
+               break;
+       case TCP_V6_FLOW:
+               tuple_sets = req->ipv6_tcp_en;
+               break;
+       case UDP_V6_FLOW:
+               tuple_sets = req->ipv6_udp_en;
+               break;
+       case SCTP_V4_FLOW:
+               tuple_sets = req->ipv4_sctp_en;
+               break;
+       case SCTP_V6_FLOW:
+               tuple_sets = req->ipv6_sctp_en;
+               break;
+       case IPV4_FLOW:
+       case IPV6_FLOW:
+               tuple_sets = HCLGE_S_IP_BIT | HCLGE_D_IP_BIT;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       if (!tuple_sets)
+               return 0;
+
+       if (tuple_sets & HCLGE_D_PORT_BIT)
+               nfc->data |= RXH_L4_B_2_3;
+       if (tuple_sets & HCLGE_S_PORT_BIT)
+               nfc->data |= RXH_L4_B_0_1;
+       if (tuple_sets & HCLGE_D_IP_BIT)
+               nfc->data |= RXH_IP_DST;
+       if (tuple_sets & HCLGE_S_IP_BIT)
+               nfc->data |= RXH_IP_SRC;
+
+       return 0;
+}
+
 static int hclge_get_tc_size(struct hnae3_handle *handle)
 {
        struct hclge_vport *vport = hclge_get_vport(handle);
@@ -2597,7 +2838,7 @@ static int hclge_get_tc_size(struct hnae3_handle *handle)
        return hdev->rss_size_max;
 }
 
-static int hclge_rss_init_hw(struct hclge_dev *hdev)
+int hclge_rss_init_hw(struct hclge_dev *hdev)
 {
        const  u8 hfunc = HCLGE_RSS_HASH_ALGO_TOEPLITZ;
        struct hclge_vport *vport = hdev->vport;
@@ -2682,7 +2923,7 @@ int hclge_map_vport_ring_to_vector(struct hclge_vport *vport, int vector_id,
                                   struct hnae3_ring_chain_node *ring_chain)
 {
        struct hclge_dev *hdev = vport->back;
-       struct hclge_ctrl_vector_chain *req;
+       struct hclge_ctrl_vector_chain_cmd *req;
        struct hnae3_ring_chain_node *node;
        struct hclge_desc desc;
        int ret;
@@ -2690,20 +2931,21 @@ int hclge_map_vport_ring_to_vector(struct hclge_vport *vport, int vector_id,
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_ADD_RING_TO_VECTOR, false);
 
-       req = (struct hclge_ctrl_vector_chain *)desc.data;
+       req = (struct hclge_ctrl_vector_chain_cmd *)desc.data;
        req->int_vector_id = vector_id;
 
        i = 0;
        for (node = ring_chain; node; node = node->next) {
-               hnae_set_field(req->tqp_type_and_id[i], HCLGE_INT_TYPE_M,
-                              HCLGE_INT_TYPE_S,
+               u16 type_and_id = 0;
+
+               hnae_set_field(type_and_id, HCLGE_INT_TYPE_M, HCLGE_INT_TYPE_S,
                               hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));
-               hnae_set_field(req->tqp_type_and_id[i], HCLGE_TQP_ID_M,
-                              HCLGE_TQP_ID_S,  node->tqp_index);
-               hnae_set_field(req->tqp_type_and_id[i], HCLGE_INT_GL_IDX_M,
+               hnae_set_field(type_and_id, HCLGE_TQP_ID_M, HCLGE_TQP_ID_S,
+                              node->tqp_index);
+               hnae_set_field(type_and_id, HCLGE_INT_GL_IDX_M,
                               HCLGE_INT_GL_IDX_S,
                               hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));
-               req->tqp_type_and_id[i] = cpu_to_le16(req->tqp_type_and_id[i]);
+               req->tqp_type_and_id[i] = cpu_to_le16(type_and_id);
                req->vfid = vport->vport_id;
 
                if (++i >= HCLGE_VECTOR_ELEMENTS_PER_CMD) {
@@ -2739,9 +2981,9 @@ int hclge_map_vport_ring_to_vector(struct hclge_vport *vport, int vector_id,
        return 0;
 }
 
-int hclge_map_handle_ring_to_vector(struct hnae3_handle *handle,
-                                   int vector,
-                                   struct hnae3_ring_chain_node *ring_chain)
+static int hclge_map_handle_ring_to_vector(
+               struct hnae3_handle *handle, int vector,
+               struct hnae3_ring_chain_node *ring_chain)
 {
        struct hclge_vport *vport = hclge_get_vport(handle);
        struct hclge_dev *hdev = vport->back;
@@ -2763,7 +3005,7 @@ static int hclge_unmap_ring_from_vector(
 {
        struct hclge_vport *vport = hclge_get_vport(handle);
        struct hclge_dev *hdev = vport->back;
-       struct hclge_ctrl_vector_chain *req;
+       struct hclge_ctrl_vector_chain_cmd *req;
        struct hnae3_ring_chain_node *node;
        struct hclge_desc desc;
        int i, vector_id;
@@ -2778,21 +3020,22 @@ static int hclge_unmap_ring_from_vector(
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_DEL_RING_TO_VECTOR, false);
 
-       req = (struct hclge_ctrl_vector_chain *)desc.data;
+       req = (struct hclge_ctrl_vector_chain_cmd *)desc.data;
        req->int_vector_id = vector_id;
 
        i = 0;
        for (node = ring_chain; node; node = node->next) {
-               hnae_set_field(req->tqp_type_and_id[i], HCLGE_INT_TYPE_M,
-                              HCLGE_INT_TYPE_S,
+               u16 type_and_id = 0;
+
+               hnae_set_field(type_and_id, HCLGE_INT_TYPE_M, HCLGE_INT_TYPE_S,
                               hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));
-               hnae_set_field(req->tqp_type_and_id[i], HCLGE_TQP_ID_M,
-                              HCLGE_TQP_ID_S,  node->tqp_index);
-               hnae_set_field(req->tqp_type_and_id[i], HCLGE_INT_GL_IDX_M,
+               hnae_set_field(type_and_id, HCLGE_TQP_ID_M, HCLGE_TQP_ID_S,
+                              node->tqp_index);
+               hnae_set_field(type_and_id, HCLGE_INT_GL_IDX_M,
                               HCLGE_INT_GL_IDX_S,
                               hnae_get_bit(node->flag, HNAE3_RING_TYPE_B));
 
-               req->tqp_type_and_id[i] = cpu_to_le16(req->tqp_type_and_id[i]);
+               req->tqp_type_and_id[i] = cpu_to_le16(type_and_id);
                req->vfid = vport->vport_id;
 
                if (++i >= HCLGE_VECTOR_ELEMENTS_PER_CMD) {
@@ -2830,13 +3073,13 @@ static int hclge_unmap_ring_from_vector(
 int hclge_cmd_set_promisc_mode(struct hclge_dev *hdev,
                               struct hclge_promisc_param *param)
 {
-       struct hclge_promisc_cfg *req;
+       struct hclge_promisc_cfg_cmd *req;
        struct hclge_desc desc;
        int ret;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CFG_PROMISC_MODE, false);
 
-       req = (struct hclge_promisc_cfg *)desc.data;
+       req = (struct hclge_promisc_cfg_cmd *)desc.data;
        req->vf_id = param->vf_id;
        req->flag = (param->enable << HCLGE_PROMISC_EN_B);
 
@@ -2878,29 +3121,27 @@ static void hclge_set_promisc_mode(struct hnae3_handle *handle, u32 en)
 static void hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable)
 {
        struct hclge_desc desc;
-       struct hclge_config_mac_mode *req =
-               (struct hclge_config_mac_mode *)desc.data;
+       struct hclge_config_mac_mode_cmd *req =
+               (struct hclge_config_mac_mode_cmd *)desc.data;
+       u32 loop_en = 0;
        int ret;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_MAC_MODE, false);
-       hnae_set_bit(req->txrx_pad_fcs_loop_en, HCLGE_MAC_TX_EN_B, enable);
-       hnae_set_bit(req->txrx_pad_fcs_loop_en, HCLGE_MAC_RX_EN_B, enable);
-       hnae_set_bit(req->txrx_pad_fcs_loop_en, HCLGE_MAC_PAD_TX_B, enable);
-       hnae_set_bit(req->txrx_pad_fcs_loop_en, HCLGE_MAC_PAD_RX_B, enable);
-       hnae_set_bit(req->txrx_pad_fcs_loop_en, HCLGE_MAC_1588_TX_B, 0);
-       hnae_set_bit(req->txrx_pad_fcs_loop_en, HCLGE_MAC_1588_RX_B, 0);
-       hnae_set_bit(req->txrx_pad_fcs_loop_en, HCLGE_MAC_APP_LP_B, 0);
-       hnae_set_bit(req->txrx_pad_fcs_loop_en, HCLGE_MAC_LINE_LP_B, 0);
-       hnae_set_bit(req->txrx_pad_fcs_loop_en, HCLGE_MAC_FCS_TX_B, enable);
-       hnae_set_bit(req->txrx_pad_fcs_loop_en, HCLGE_MAC_RX_FCS_B, enable);
-       hnae_set_bit(req->txrx_pad_fcs_loop_en,
-                    HCLGE_MAC_RX_FCS_STRIP_B, enable);
-       hnae_set_bit(req->txrx_pad_fcs_loop_en,
-                    HCLGE_MAC_TX_OVERSIZE_TRUNCATE_B, enable);
-       hnae_set_bit(req->txrx_pad_fcs_loop_en,
-                    HCLGE_MAC_RX_OVERSIZE_TRUNCATE_B, enable);
-       hnae_set_bit(req->txrx_pad_fcs_loop_en,
-                    HCLGE_MAC_TX_UNDER_MIN_ERR_B, enable);
+       hnae_set_bit(loop_en, HCLGE_MAC_TX_EN_B, enable);
+       hnae_set_bit(loop_en, HCLGE_MAC_RX_EN_B, enable);
+       hnae_set_bit(loop_en, HCLGE_MAC_PAD_TX_B, enable);
+       hnae_set_bit(loop_en, HCLGE_MAC_PAD_RX_B, enable);
+       hnae_set_bit(loop_en, HCLGE_MAC_1588_TX_B, 0);
+       hnae_set_bit(loop_en, HCLGE_MAC_1588_RX_B, 0);
+       hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, 0);
+       hnae_set_bit(loop_en, HCLGE_MAC_LINE_LP_B, 0);
+       hnae_set_bit(loop_en, HCLGE_MAC_FCS_TX_B, enable);
+       hnae_set_bit(loop_en, HCLGE_MAC_RX_FCS_B, enable);
+       hnae_set_bit(loop_en, HCLGE_MAC_RX_FCS_STRIP_B, enable);
+       hnae_set_bit(loop_en, HCLGE_MAC_TX_OVERSIZE_TRUNCATE_B, enable);
+       hnae_set_bit(loop_en, HCLGE_MAC_RX_OVERSIZE_TRUNCATE_B, enable);
+       hnae_set_bit(loop_en, HCLGE_MAC_TX_UNDER_MIN_ERR_B, enable);
+       req->txrx_pad_fcs_loop_en = cpu_to_le32(loop_en);
 
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
        if (ret)
@@ -2908,12 +3149,65 @@ static void hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable)
                        "mac enable fail, ret =%d.\n", ret);
 }
 
+static int hclge_set_loopback(struct hnae3_handle *handle,
+                             enum hnae3_loop loop_mode, bool en)
+{
+       struct hclge_vport *vport = hclge_get_vport(handle);
+       struct hclge_config_mac_mode_cmd *req;
+       struct hclge_dev *hdev = vport->back;
+       struct hclge_desc desc;
+       u32 loop_en;
+       int ret;
+
+       switch (loop_mode) {
+       case HNAE3_MAC_INTER_LOOP_MAC:
+               req = (struct hclge_config_mac_mode_cmd *)&desc.data[0];
+               /* 1 Read out the MAC mode config at first */
+               hclge_cmd_setup_basic_desc(&desc,
+                                          HCLGE_OPC_CONFIG_MAC_MODE,
+                                          true);
+               ret = hclge_cmd_send(&hdev->hw, &desc, 1);
+               if (ret) {
+                       dev_err(&hdev->pdev->dev,
+                               "mac loopback get fail, ret =%d.\n",
+                               ret);
+                       return ret;
+               }
+
+               /* 2 Then setup the loopback flag */
+               loop_en = le32_to_cpu(req->txrx_pad_fcs_loop_en);
+               if (en)
+                       hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, 1);
+               else
+                       hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, 0);
+
+               req->txrx_pad_fcs_loop_en = cpu_to_le32(loop_en);
+
+               /* 3 Config mac work mode with loopback flag
+                * and its original configure parameters
+                */
+               hclge_cmd_reuse_desc(&desc, false);
+               ret = hclge_cmd_send(&hdev->hw, &desc, 1);
+               if (ret)
+                       dev_err(&hdev->pdev->dev,
+                               "mac loopback set fail, ret =%d.\n", ret);
+               break;
+       default:
+               ret = -ENOTSUPP;
+               dev_err(&hdev->pdev->dev,
+                       "loop_mode %d is not supported\n", loop_mode);
+               break;
+       }
+
+       return ret;
+}
+
 static int hclge_tqp_enable(struct hclge_dev *hdev, int tqp_id,
                            int stream_id, bool enable)
 {
        struct hclge_desc desc;
-       struct hclge_cfg_com_tqp_queue *req =
-               (struct hclge_cfg_com_tqp_queue *)desc.data;
+       struct hclge_cfg_com_tqp_queue_cmd *req =
+               (struct hclge_cfg_com_tqp_queue_cmd *)desc.data;
        int ret;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CFG_COM_TQP_QUEUE, false);
@@ -2963,7 +3257,7 @@ static int hclge_ae_start(struct hnae3_handle *handle)
        /* mac enable */
        hclge_cfg_mac_mode(hdev, true);
        clear_bit(HCLGE_STATE_DOWN, &hdev->state);
-       (void)mod_timer(&hdev->service_timer, jiffies + HZ);
+       mod_timer(&hdev->service_timer, jiffies + HZ);
 
        ret = hclge_mac_start_phy(hdev);
        if (ret)
@@ -3077,16 +3371,16 @@ static int hclge_update_desc_vfid(struct hclge_desc *desc, int vfid, bool clr)
                word_num = vfid / 32;
                bit_num  = vfid % 32;
                if (clr)
-                       desc[1].data[word_num] &= ~(1 << bit_num);
+                       desc[1].data[word_num] &= cpu_to_le32(~(1 << bit_num));
                else
-                       desc[1].data[word_num] |= (1 << bit_num);
+                       desc[1].data[word_num] |= cpu_to_le32(1 << bit_num);
        } else {
                word_num = (vfid - 192) / 32;
                bit_num  = vfid % 32;
                if (clr)
-                       desc[2].data[word_num] &= ~(1 << bit_num);
+                       desc[2].data[word_num] &= cpu_to_le32(~(1 << bit_num));
                else
-                       desc[2].data[word_num] |= (1 << bit_num);
+                       desc[2].data[word_num] |= cpu_to_le32(1 << bit_num);
        }
 
        return 0;
@@ -3106,7 +3400,7 @@ static bool hclge_is_all_function_id_zero(struct hclge_desc *desc)
        return true;
 }
 
-static void hclge_prepare_mac_addr(struct hclge_mac_vlan_tbl_entry *new_req,
+static void hclge_prepare_mac_addr(struct hclge_mac_vlan_tbl_entry_cmd *new_req,
                                   const u8 *addr)
 {
        const unsigned char *mac_addr = addr;
@@ -3118,8 +3412,8 @@ static void hclge_prepare_mac_addr(struct hclge_mac_vlan_tbl_entry *new_req,
        new_req->mac_addr_lo16 = cpu_to_le16(low_val & 0xffff);
 }
 
-u16 hclge_get_mac_addr_to_mta_index(struct hclge_vport *vport,
-                                   const u8 *addr)
+static u16 hclge_get_mac_addr_to_mta_index(struct hclge_vport *vport,
+                                          const u8 *addr)
 {
        u16 high_val = addr[1] | (addr[0] << 8);
        struct hclge_dev *hdev = vport->back;
@@ -3133,11 +3427,11 @@ static int hclge_set_mta_filter_mode(struct hclge_dev *hdev,
                                     enum hclge_mta_dmac_sel_type mta_mac_sel,
                                     bool enable)
 {
-       struct hclge_mta_filter_mode *req;
+       struct hclge_mta_filter_mode_cmd *req;
        struct hclge_desc desc;
        int ret;
 
-       req = (struct hclge_mta_filter_mode *)desc.data;
+       req = (struct hclge_mta_filter_mode_cmd *)desc.data;
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_MTA_MAC_MODE_CFG, false);
 
        hnae_set_bit(req->dmac_sel_en, HCLGE_CFG_MTA_MAC_EN_B,
@@ -3160,11 +3454,11 @@ int hclge_cfg_func_mta_filter(struct hclge_dev *hdev,
                              u8 func_id,
                              bool enable)
 {
-       struct hclge_cfg_func_mta_filter *req;
+       struct hclge_cfg_func_mta_filter_cmd *req;
        struct hclge_desc desc;
        int ret;
 
-       req = (struct hclge_cfg_func_mta_filter *)desc.data;
+       req = (struct hclge_cfg_func_mta_filter_cmd *)desc.data;
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_MTA_MAC_FUNC_CFG, false);
 
        hnae_set_bit(req->accept, HCLGE_CFG_FUNC_MTA_ACCEPT_B,
@@ -3187,17 +3481,18 @@ static int hclge_set_mta_table_item(struct hclge_vport *vport,
                                    bool enable)
 {
        struct hclge_dev *hdev = vport->back;
-       struct hclge_cfg_func_mta_item *req;
+       struct hclge_cfg_func_mta_item_cmd *req;
        struct hclge_desc desc;
+       u16 item_idx = 0;
        int ret;
 
-       req = (struct hclge_cfg_func_mta_item *)desc.data;
+       req = (struct hclge_cfg_func_mta_item_cmd *)desc.data;
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_MTA_TBL_ITEM_CFG, false);
        hnae_set_bit(req->accept, HCLGE_CFG_MTA_ITEM_ACCEPT_B, enable);
 
-       hnae_set_field(req->item_idx, HCLGE_CFG_MTA_ITEM_IDX_M,
+       hnae_set_field(item_idx, HCLGE_CFG_MTA_ITEM_IDX_M,
                       HCLGE_CFG_MTA_ITEM_IDX_S, idx);
-       req->item_idx = cpu_to_le16(req->item_idx);
+       req->item_idx = cpu_to_le16(item_idx);
 
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
        if (ret) {
@@ -3211,16 +3506,17 @@ static int hclge_set_mta_table_item(struct hclge_vport *vport,
 }
 
 static int hclge_remove_mac_vlan_tbl(struct hclge_vport *vport,
-                                    struct hclge_mac_vlan_tbl_entry *req)
+                                    struct hclge_mac_vlan_tbl_entry_cmd *req)
 {
        struct hclge_dev *hdev = vport->back;
        struct hclge_desc desc;
        u8 resp_code;
+       u16 retval;
        int ret;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_MAC_VLAN_REMOVE, false);
 
-       memcpy(desc.data, req, sizeof(struct hclge_mac_vlan_tbl_entry));
+       memcpy(desc.data, req, sizeof(struct hclge_mac_vlan_tbl_entry_cmd));
 
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
        if (ret) {
@@ -3229,19 +3525,21 @@ static int hclge_remove_mac_vlan_tbl(struct hclge_vport *vport,
                        ret);
                return ret;
        }
-       resp_code = (desc.data[0] >> 8) & 0xff;
+       resp_code = (le32_to_cpu(desc.data[0]) >> 8) & 0xff;
+       retval = le16_to_cpu(desc.retval);
 
-       return hclge_get_mac_vlan_cmd_status(vport, desc.retval, resp_code,
+       return hclge_get_mac_vlan_cmd_status(vport, retval, resp_code,
                                             HCLGE_MAC_VLAN_REMOVE);
 }
 
 static int hclge_lookup_mac_vlan_tbl(struct hclge_vport *vport,
-                                    struct hclge_mac_vlan_tbl_entry *req,
+                                    struct hclge_mac_vlan_tbl_entry_cmd *req,
                                     struct hclge_desc *desc,
                                     bool is_mc)
 {
        struct hclge_dev *hdev = vport->back;
        u8 resp_code;
+       u16 retval;
        int ret;
 
        hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_MAC_VLAN_ADD, true);
@@ -3249,7 +3547,7 @@ static int hclge_lookup_mac_vlan_tbl(struct hclge_vport *vport,
                desc[0].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
                memcpy(desc[0].data,
                       req,
-                      sizeof(struct hclge_mac_vlan_tbl_entry));
+                      sizeof(struct hclge_mac_vlan_tbl_entry_cmd));
                hclge_cmd_setup_basic_desc(&desc[1],
                                           HCLGE_OPC_MAC_VLAN_ADD,
                                           true);
@@ -3261,7 +3559,7 @@ static int hclge_lookup_mac_vlan_tbl(struct hclge_vport *vport,
        } else {
                memcpy(desc[0].data,
                       req,
-                      sizeof(struct hclge_mac_vlan_tbl_entry));
+                      sizeof(struct hclge_mac_vlan_tbl_entry_cmd));
                ret = hclge_cmd_send(&hdev->hw, desc, 1);
        }
        if (ret) {
@@ -3270,19 +3568,21 @@ static int hclge_lookup_mac_vlan_tbl(struct hclge_vport *vport,
                        ret);
                return ret;
        }
-       resp_code = (desc[0].data[0] >> 8) & 0xff;
+       resp_code = (le32_to_cpu(desc[0].data[0]) >> 8) & 0xff;
+       retval = le16_to_cpu(desc[0].retval);
 
-       return hclge_get_mac_vlan_cmd_status(vport, desc[0].retval, resp_code,
+       return hclge_get_mac_vlan_cmd_status(vport, retval, resp_code,
                                             HCLGE_MAC_VLAN_LKUP);
 }
 
 static int hclge_add_mac_vlan_tbl(struct hclge_vport *vport,
-                                 struct hclge_mac_vlan_tbl_entry *req,
+                                 struct hclge_mac_vlan_tbl_entry_cmd *req,
                                  struct hclge_desc *mc_desc)
 {
        struct hclge_dev *hdev = vport->back;
        int cfg_status;
        u8 resp_code;
+       u16 retval;
        int ret;
 
        if (!mc_desc) {
@@ -3291,10 +3591,13 @@ static int hclge_add_mac_vlan_tbl(struct hclge_vport *vport,
                hclge_cmd_setup_basic_desc(&desc,
                                           HCLGE_OPC_MAC_VLAN_ADD,
                                           false);
-               memcpy(desc.data, req, sizeof(struct hclge_mac_vlan_tbl_entry));
+               memcpy(desc.data, req,
+                      sizeof(struct hclge_mac_vlan_tbl_entry_cmd));
                ret = hclge_cmd_send(&hdev->hw, &desc, 1);
-               resp_code = (desc.data[0] >> 8) & 0xff;
-               cfg_status = hclge_get_mac_vlan_cmd_status(vport, desc.retval,
+               resp_code = (le32_to_cpu(desc.data[0]) >> 8) & 0xff;
+               retval = le16_to_cpu(desc.retval);
+
+               cfg_status = hclge_get_mac_vlan_cmd_status(vport, retval,
                                                           resp_code,
                                                           HCLGE_MAC_VLAN_ADD);
        } else {
@@ -3305,11 +3608,12 @@ static int hclge_add_mac_vlan_tbl(struct hclge_vport *vport,
                mc_desc[2].flag &= cpu_to_le16(~HCLGE_CMD_FLAG_WR);
                mc_desc[2].flag &= cpu_to_le16(~HCLGE_CMD_FLAG_NEXT);
                memcpy(mc_desc[0].data, req,
-                      sizeof(struct hclge_mac_vlan_tbl_entry));
+                      sizeof(struct hclge_mac_vlan_tbl_entry_cmd));
                ret = hclge_cmd_send(&hdev->hw, mc_desc, 3);
-               resp_code = (mc_desc[0].data[0] >> 8) & 0xff;
-               cfg_status = hclge_get_mac_vlan_cmd_status(vport,
-                                                          mc_desc[0].retval,
+               resp_code = (le32_to_cpu(mc_desc[0].data[0]) >> 8) & 0xff;
+               retval = le16_to_cpu(mc_desc[0].retval);
+
+               cfg_status = hclge_get_mac_vlan_cmd_status(vport, retval,
                                                           resp_code,
                                                           HCLGE_MAC_VLAN_ADD);
        }
@@ -3336,8 +3640,9 @@ int hclge_add_uc_addr_common(struct hclge_vport *vport,
                             const unsigned char *addr)
 {
        struct hclge_dev *hdev = vport->back;
-       struct hclge_mac_vlan_tbl_entry req;
+       struct hclge_mac_vlan_tbl_entry_cmd req;
        enum hclge_cmd_status status;
+       u16 egress_port = 0;
 
        /* mac addr check */
        if (is_zero_ether_addr(addr) ||
@@ -3357,15 +3662,15 @@ int hclge_add_uc_addr_common(struct hclge_vport *vport,
        hnae_set_bit(req.entry_type, HCLGE_MAC_VLAN_BIT0_EN_B, 0);
        hnae_set_bit(req.entry_type, HCLGE_MAC_VLAN_BIT1_EN_B, 0);
        hnae_set_bit(req.mc_mac_en, HCLGE_MAC_VLAN_BIT0_EN_B, 0);
-       hnae_set_bit(req.egress_port,
-                    HCLGE_MAC_EPORT_SW_EN_B, 0);
-       hnae_set_bit(req.egress_port,
-                    HCLGE_MAC_EPORT_TYPE_B, 0);
-       hnae_set_field(req.egress_port, HCLGE_MAC_EPORT_VFID_M,
+
+       hnae_set_bit(egress_port, HCLGE_MAC_EPORT_SW_EN_B, 0);
+       hnae_set_bit(egress_port, HCLGE_MAC_EPORT_TYPE_B, 0);
+       hnae_set_field(egress_port, HCLGE_MAC_EPORT_VFID_M,
                       HCLGE_MAC_EPORT_VFID_S, vport->vport_id);
-       hnae_set_field(req.egress_port, HCLGE_MAC_EPORT_PFID_M,
+       hnae_set_field(egress_port, HCLGE_MAC_EPORT_PFID_M,
                       HCLGE_MAC_EPORT_PFID_S, 0);
-       req.egress_port = cpu_to_le16(req.egress_port);
+
+       req.egress_port = cpu_to_le16(egress_port);
 
        hclge_prepare_mac_addr(&req, addr);
 
@@ -3386,7 +3691,7 @@ int hclge_rm_uc_addr_common(struct hclge_vport *vport,
                            const unsigned char *addr)
 {
        struct hclge_dev *hdev = vport->back;
-       struct hclge_mac_vlan_tbl_entry req;
+       struct hclge_mac_vlan_tbl_entry_cmd req;
        enum hclge_cmd_status status;
 
        /* mac addr check */
@@ -3420,7 +3725,7 @@ int hclge_add_mc_addr_common(struct hclge_vport *vport,
                             const unsigned char *addr)
 {
        struct hclge_dev *hdev = vport->back;
-       struct hclge_mac_vlan_tbl_entry req;
+       struct hclge_mac_vlan_tbl_entry_cmd req;
        struct hclge_desc desc[3];
        u16 tbl_idx;
        int status;
@@ -3471,7 +3776,7 @@ int hclge_rm_mc_addr_common(struct hclge_vport *vport,
                            const unsigned char *addr)
 {
        struct hclge_dev *hdev = vport->back;
-       struct hclge_mac_vlan_tbl_entry req;
+       struct hclge_mac_vlan_tbl_entry_cmd req;
        enum hclge_cmd_status status;
        struct hclge_desc desc[3];
        u16 tbl_idx;
@@ -3554,13 +3859,13 @@ static int hclge_set_mac_addr(struct hnae3_handle *handle, void *p)
 static int hclge_set_vlan_filter_ctrl(struct hclge_dev *hdev, u8 vlan_type,
                                      bool filter_en)
 {
-       struct hclge_vlan_filter_ctrl *req;
+       struct hclge_vlan_filter_ctrl_cmd *req;
        struct hclge_desc desc;
        int ret;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_VLAN_FILTER_CTRL, false);
 
-       req = (struct hclge_vlan_filter_ctrl *)desc.data;
+       req = (struct hclge_vlan_filter_ctrl_cmd *)desc.data;
        req->vlan_type = vlan_type;
        req->vlan_fe = filter_en;
 
@@ -3578,8 +3883,8 @@ int hclge_set_vf_vlan_common(struct hclge_dev *hdev, int vfid,
                             bool is_kill, u16 vlan, u8 qos, __be16 proto)
 {
 #define HCLGE_MAX_VF_BYTES  16
-       struct hclge_vlan_filter_vf_cfg *req0;
-       struct hclge_vlan_filter_vf_cfg *req1;
+       struct hclge_vlan_filter_vf_cfg_cmd *req0;
+       struct hclge_vlan_filter_vf_cfg_cmd *req1;
        struct hclge_desc desc[2];
        u8 vf_byte_val;
        u8 vf_byte_off;
@@ -3595,10 +3900,10 @@ int hclge_set_vf_vlan_common(struct hclge_dev *hdev, int vfid,
        vf_byte_off = vfid / 8;
        vf_byte_val = 1 << (vfid % 8);
 
-       req0 = (struct hclge_vlan_filter_vf_cfg *)desc[0].data;
-       req1 = (struct hclge_vlan_filter_vf_cfg *)desc[1].data;
+       req0 = (struct hclge_vlan_filter_vf_cfg_cmd *)desc[0].data;
+       req1 = (struct hclge_vlan_filter_vf_cfg_cmd *)desc[1].data;
 
-       req0->vlan_id  = vlan;
+       req0->vlan_id  = cpu_to_le16(vlan);
        req0->vlan_cfg = is_kill;
 
        if (vf_byte_off < HCLGE_MAX_VF_BYTES)
@@ -3639,7 +3944,7 @@ static int hclge_set_port_vlan_filter(struct hnae3_handle *handle,
 {
        struct hclge_vport *vport = hclge_get_vport(handle);
        struct hclge_dev *hdev = vport->back;
-       struct hclge_vlan_filter_pf_cfg *req;
+       struct hclge_vlan_filter_pf_cfg_cmd *req;
        struct hclge_desc desc;
        u8 vlan_offset_byte_val;
        u8 vlan_offset_byte;
@@ -3652,7 +3957,7 @@ static int hclge_set_port_vlan_filter(struct hnae3_handle *handle,
        vlan_offset_byte = (vlan_id % 160) / 8;
        vlan_offset_byte_val = 1 << (vlan_id % 8);
 
-       req = (struct hclge_vlan_filter_pf_cfg *)desc.data;
+       req = (struct hclge_vlan_filter_pf_cfg_cmd *)desc.data;
        req->vlan_offset = vlan_offset_160;
        req->vlan_cfg = is_kill;
        req->vlan_offset_bitmap[vlan_offset_byte] = vlan_offset_byte_val;
@@ -3714,7 +4019,7 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev)
 static int hclge_set_mtu(struct hnae3_handle *handle, int new_mtu)
 {
        struct hclge_vport *vport = hclge_get_vport(handle);
-       struct hclge_config_max_frm_size *req;
+       struct hclge_config_max_frm_size_cmd *req;
        struct hclge_dev *hdev = vport->back;
        struct hclge_desc desc;
        int ret;
@@ -3725,7 +4030,7 @@ static int hclge_set_mtu(struct hnae3_handle *handle, int new_mtu)
        hdev->mps = new_mtu;
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_MAX_FRM_SIZE, false);
 
-       req = (struct hclge_config_max_frm_size *)desc.data;
+       req = (struct hclge_config_max_frm_size_cmd *)desc.data;
        req->max_frm_size = cpu_to_le16(new_mtu);
 
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
@@ -3740,13 +4045,13 @@ static int hclge_set_mtu(struct hnae3_handle *handle, int new_mtu)
 static int hclge_send_reset_tqp_cmd(struct hclge_dev *hdev, u16 queue_id,
                                    bool enable)
 {
-       struct hclge_reset_tqp_queue *req;
+       struct hclge_reset_tqp_queue_cmd *req;
        struct hclge_desc desc;
        int ret;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_RESET_TQP_QUEUE, false);
 
-       req = (struct hclge_reset_tqp_queue *)desc.data;
+       req = (struct hclge_reset_tqp_queue_cmd *)desc.data;
        req->tqp_id = cpu_to_le16(queue_id & HCLGE_RING_ID_MASK);
        hnae_set_bit(req->reset_req, HCLGE_TQP_RESET_B, enable);
 
@@ -3762,13 +4067,13 @@ static int hclge_send_reset_tqp_cmd(struct hclge_dev *hdev, u16 queue_id,
 
 static int hclge_get_reset_status(struct hclge_dev *hdev, u16 queue_id)
 {
-       struct hclge_reset_tqp_queue *req;
+       struct hclge_reset_tqp_queue_cmd *req;
        struct hclge_desc desc;
        int ret;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_RESET_TQP_QUEUE, true);
 
-       req = (struct hclge_reset_tqp_queue *)desc.data;
+       req = (struct hclge_reset_tqp_queue_cmd *)desc.data;
        req->tqp_id = cpu_to_le16(queue_id & HCLGE_RING_ID_MASK);
 
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
@@ -4182,8 +4487,9 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
                return ret;
        }
 
-       setup_timer(&hdev->service_timer, hclge_service_timer,
-                   (unsigned long)hdev);
+       hclge_dcb_ops_set(hdev);
+
+       timer_setup(&hdev->service_timer, hclge_service_timer, 0);
        INIT_WORK(&hdev->service_task, hclge_service_task);
 
        set_bit(HCLGE_STATE_SERVICE_INITED, &hdev->state);
@@ -4210,7 +4516,7 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
        if (IS_ENABLED(CONFIG_PCI_IOV))
                hclge_disable_sriov(hdev);
 
-       if (hdev->service_timer.data)
+       if (hdev->service_timer.function)
                del_timer_sync(&hdev->service_timer);
        if (hdev->service_task.func)
                cancel_work_sync(&hdev->service_task);
@@ -4232,6 +4538,7 @@ static const struct hnae3_ae_ops hclge_ops = {
        .unmap_ring_from_vector = hclge_unmap_ring_from_vector,
        .get_vector = hclge_get_vector,
        .set_promisc_mode = hclge_set_promisc_mode,
+       .set_loopback = hclge_set_loopback,
        .start = hclge_ae_start,
        .stop = hclge_ae_stop,
        .get_status = hclge_get_status,
@@ -4243,6 +4550,8 @@ static const struct hnae3_ae_ops hclge_ops = {
        .get_rss_indir_size = hclge_get_rss_indir_size,
        .get_rss = hclge_get_rss,
        .set_rss = hclge_set_rss,
+       .set_rss_tuple = hclge_set_rss_tuple,
+       .get_rss_tuple = hclge_get_rss_tuple,
        .get_tc_size = hclge_get_tc_size,
        .get_mac_addr = hclge_get_mac_addr,
        .set_mac_addr = hclge_set_mac_addr,