net/hns3: support VXLAN-GPE TSO and checksum
[dpdk.git] / drivers / net / ice / ice_ethdev.c
index 72375fe..1e15cd3 100644 (file)
@@ -33,7 +33,7 @@ static const char * const ice_valid_args[] = {
 };
 
 static const struct rte_mbuf_dynfield ice_proto_xtr_metadata_param = {
-       .name = "ice_dynfield_proto_xtr_metadata",
+       .name = "intel_pmd_dynfield_proto_xtr_metadata",
        .size = sizeof(uint32_t),
        .align = __alignof__(uint32_t),
        .flags = 0,
@@ -49,22 +49,22 @@ static bool ice_proto_xtr_hw_support[PROTO_XTR_MAX];
 
 static struct proto_xtr_ol_flag ice_proto_xtr_ol_flag_params[] = {
        [PROTO_XTR_VLAN] = {
-               .param = { .name = "ice_dynflag_proto_xtr_vlan" },
+               .param = { .name = "intel_pmd_dynflag_proto_xtr_vlan" },
                .ol_flag = &rte_net_ice_dynflag_proto_xtr_vlan_mask },
        [PROTO_XTR_IPV4] = {
-               .param = { .name = "ice_dynflag_proto_xtr_ipv4" },
+               .param = { .name = "intel_pmd_dynflag_proto_xtr_ipv4" },
                .ol_flag = &rte_net_ice_dynflag_proto_xtr_ipv4_mask },
        [PROTO_XTR_IPV6] = {
-               .param = { .name = "ice_dynflag_proto_xtr_ipv6" },
+               .param = { .name = "intel_pmd_dynflag_proto_xtr_ipv6" },
                .ol_flag = &rte_net_ice_dynflag_proto_xtr_ipv6_mask },
        [PROTO_XTR_IPV6_FLOW] = {
-               .param = { .name = "ice_dynflag_proto_xtr_ipv6_flow" },
+               .param = { .name = "intel_pmd_dynflag_proto_xtr_ipv6_flow" },
                .ol_flag = &rte_net_ice_dynflag_proto_xtr_ipv6_flow_mask },
        [PROTO_XTR_TCP] = {
-               .param = { .name = "ice_dynflag_proto_xtr_tcp" },
+               .param = { .name = "intel_pmd_dynflag_proto_xtr_tcp" },
                .ol_flag = &rte_net_ice_dynflag_proto_xtr_tcp_mask },
        [PROTO_XTR_IP_OFFSET] = {
-               .param = { .name = "ice_dynflag_proto_xtr_ip_offset" },
+               .param = { .name = "intel_pmd_dynflag_proto_xtr_ip_offset" },
                .ol_flag = &rte_net_ice_dynflag_proto_xtr_ip_offset_mask },
 };
 
@@ -76,7 +76,7 @@ static struct proto_xtr_ol_flag ice_proto_xtr_ol_flag_params[] = {
 
 static int ice_dev_configure(struct rte_eth_dev *dev);
 static int ice_dev_start(struct rte_eth_dev *dev);
-static void ice_dev_stop(struct rte_eth_dev *dev);
+static int ice_dev_stop(struct rte_eth_dev *dev);
 static int ice_dev_close(struct rte_eth_dev *dev);
 static int ice_dev_reset(struct rte_eth_dev *dev);
 static int ice_dev_info_get(struct rte_eth_dev *dev,
@@ -2087,14 +2087,7 @@ ice_reset_fxp_resource(struct ice_hw *hw)
 static void
 ice_rss_ctx_init(struct ice_pf *pf)
 {
-       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv4);
-       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv6);
-
-       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv4_udp);
-       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv6_udp);
-
-       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv4_tcp);
-       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv6_tcp);
+       memset(&pf->hash_ctx, 0, sizeof(pf->hash_ctx));
 }
 
 static uint64_t
@@ -2144,6 +2137,8 @@ ice_dev_init(struct rte_eth_dev *dev)
                return 0;
        }
 
+       dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
+
        ice_set_default_ptype_table(dev);
        pci_dev = RTE_DEV_TO_PCI(dev->device);
        intr_handle = &pci_dev->intr_handle;
@@ -2338,7 +2333,7 @@ ice_vsi_disable_queues_intr(struct ice_vsi *vsi)
                ICE_WRITE_REG(hw, GLINT_DYN_CTL(0), GLINT_DYN_CTL_WB_ON_ITR_M);
 }
 
-static void
+static int
 ice_dev_stop(struct rte_eth_dev *dev)
 {
        struct rte_eth_dev_data *data = dev->data;
@@ -2350,7 +2345,7 @@ ice_dev_stop(struct rte_eth_dev *dev)
 
        /* avoid stopping again */
        if (pf->adapter_stopped)
-               return;
+               return 0;
 
        /* stop and clear all Rx queues */
        for (i = 0; i < data->nb_rx_queues; i++)
@@ -2376,6 +2371,9 @@ ice_dev_stop(struct rte_eth_dev *dev)
        }
 
        pf->adapter_stopped = true;
+       dev->data->dev_started = 0;
+
+       return 0;
 }
 
 static int
@@ -2387,6 +2385,10 @@ ice_dev_close(struct rte_eth_dev *dev)
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        struct ice_adapter *ad =
                ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+       int ret;
+
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return 0;
 
        /* Since stop will make link down, then the link event will be
         * triggered, disable the irq firstly to avoid the port_infoe etc
@@ -2395,7 +2397,7 @@ ice_dev_close(struct rte_eth_dev *dev)
         */
        ice_pf_disable_irq0(hw);
 
-       ice_dev_stop(dev);
+       ret = ice_dev_stop(dev);
 
        if (!ad->is_safe_mode)
                ice_flow_uninit(ad);
@@ -2413,13 +2415,6 @@ ice_dev_close(struct rte_eth_dev *dev)
        rte_free(pf->proto_xtr);
        pf->proto_xtr = NULL;
 
-       dev->dev_ops = NULL;
-       dev->rx_pkt_burst = NULL;
-       dev->tx_pkt_burst = NULL;
-
-       rte_free(dev->data->mac_addrs);
-       dev->data->mac_addrs = NULL;
-
        /* disable uio intr before callback unregister */
        rte_intr_disable(intr_handle);
 
@@ -2427,7 +2422,7 @@ ice_dev_close(struct rte_eth_dev *dev)
        rte_intr_callback_unregister(intr_handle,
                                     ice_interrupt_handler, dev);
 
-       return 0;
+       return ret;
 }
 
 static int
@@ -2438,268 +2433,473 @@ ice_dev_uninit(struct rte_eth_dev *dev)
        return 0;
 }
 
+static bool
+is_hash_cfg_valid(struct ice_rss_hash_cfg *cfg)
+{
+       return (cfg->hash_flds != 0 && cfg->addl_hdrs != 0) ? true : false;
+}
+
+static void
+hash_cfg_reset(struct ice_rss_hash_cfg *cfg)
+{
+       cfg->hash_flds = 0;
+       cfg->addl_hdrs = 0;
+       cfg->symm = 0;
+       cfg->hdr_type = ICE_RSS_ANY_HEADERS;
+}
+
 static int
-ice_add_rss_cfg_post(struct ice_pf *pf, uint32_t hdr, uint64_t fld, bool symm)
+ice_hash_moveout(struct ice_pf *pf, struct ice_rss_hash_cfg *cfg)
 {
+       enum ice_status status = ICE_SUCCESS;
        struct ice_hw *hw = ICE_PF_TO_HW(pf);
        struct ice_vsi *vsi = pf->main_vsi;
 
-       if (hdr & ICE_FLOW_SEG_HDR_GTPU_EH) {
-               if ((hdr & ICE_FLOW_SEG_HDR_IPV4) &&
-                   (hdr & ICE_FLOW_SEG_HDR_UDP)) {
-                       pf->gtpu_hash_ctx.ipv4_udp.pkt_hdr = hdr;
-                       pf->gtpu_hash_ctx.ipv4_udp.hash_fld = fld;
-                       pf->gtpu_hash_ctx.ipv4_udp.symm = symm;
-               } else if ((hdr & ICE_FLOW_SEG_HDR_IPV6) &&
-                          (hdr & ICE_FLOW_SEG_HDR_UDP)) {
-                       pf->gtpu_hash_ctx.ipv6_udp.pkt_hdr = hdr;
-                       pf->gtpu_hash_ctx.ipv6_udp.hash_fld = fld;
-                       pf->gtpu_hash_ctx.ipv6_udp.symm = symm;
-               } else if ((hdr & ICE_FLOW_SEG_HDR_IPV4) &&
-                          (hdr & ICE_FLOW_SEG_HDR_TCP)) {
-                       pf->gtpu_hash_ctx.ipv4_tcp.pkt_hdr = hdr;
-                       pf->gtpu_hash_ctx.ipv4_tcp.hash_fld = fld;
-                       pf->gtpu_hash_ctx.ipv4_tcp.symm = symm;
-               } else if ((hdr & ICE_FLOW_SEG_HDR_IPV6) &&
-                          (hdr & ICE_FLOW_SEG_HDR_TCP)) {
-                       pf->gtpu_hash_ctx.ipv6_tcp.pkt_hdr = hdr;
-                       pf->gtpu_hash_ctx.ipv6_tcp.hash_fld = fld;
-                       pf->gtpu_hash_ctx.ipv6_tcp.symm = symm;
-               } else if (hdr & ICE_FLOW_SEG_HDR_IPV4) {
-                       pf->gtpu_hash_ctx.ipv4.pkt_hdr = hdr;
-                       pf->gtpu_hash_ctx.ipv4.hash_fld = fld;
-                       pf->gtpu_hash_ctx.ipv4.symm = symm;
-                       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv4_udp);
-                       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv4_tcp);
-               } else if (hdr & ICE_FLOW_SEG_HDR_IPV6) {
-                       pf->gtpu_hash_ctx.ipv6.pkt_hdr = hdr;
-                       pf->gtpu_hash_ctx.ipv6.hash_fld = fld;
-                       pf->gtpu_hash_ctx.ipv6.symm = symm;
-                       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv6_udp);
-                       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv6_tcp);
-               }
-       }
+       if (!is_hash_cfg_valid(cfg))
+               return -ENOENT;
 
-       if (hdr & (ICE_FLOW_SEG_HDR_GTPU_DWN |
-           ICE_FLOW_SEG_HDR_GTPU_UP)) {
-               if ((hdr & ICE_FLOW_SEG_HDR_IPV4) &&
-                   (hdr & ICE_FLOW_SEG_HDR_UDP)) {
-                       if (ICE_HASH_CFG_IS_ROTATING(&pf->gtpu_hash_ctx.ipv4)) {
-                               ice_add_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv4.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv4.pkt_hdr,
-                                       pf->gtpu_hash_ctx.ipv4.symm);
-                               ICE_HASH_CFG_ROTATE_STOP(&pf->gtpu_hash_ctx.ipv4);
-                       }
-               } else if ((hdr & ICE_FLOW_SEG_HDR_IPV6) &&
-                          (hdr & ICE_FLOW_SEG_HDR_UDP)) {
-                       if (ICE_HASH_CFG_IS_ROTATING(&pf->gtpu_hash_ctx.ipv6)) {
-                               ice_add_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv6.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv6.pkt_hdr,
-                                       pf->gtpu_hash_ctx.ipv6.symm);
-                               ICE_HASH_CFG_ROTATE_STOP(&pf->gtpu_hash_ctx.ipv6);
-                       }
-               } else if ((hdr & ICE_FLOW_SEG_HDR_IPV4) &&
-                          (hdr & ICE_FLOW_SEG_HDR_TCP)) {
-                       if (ICE_HASH_CFG_IS_ROTATING(&pf->gtpu_hash_ctx.ipv4)) {
-                               ice_add_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv4.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv4.pkt_hdr,
-                                       pf->gtpu_hash_ctx.ipv4.symm);
-                               ICE_HASH_CFG_ROTATE_STOP(&pf->gtpu_hash_ctx.ipv4);
-                       }
-               } else if ((hdr & ICE_FLOW_SEG_HDR_IPV6) &&
-                          (hdr & ICE_FLOW_SEG_HDR_TCP)) {
-                       if (ICE_HASH_CFG_IS_ROTATING(&pf->gtpu_hash_ctx.ipv6)) {
-                               ice_add_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv6.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv6.pkt_hdr,
-                                       pf->gtpu_hash_ctx.ipv6.symm);
-                               ICE_HASH_CFG_ROTATE_STOP(&pf->gtpu_hash_ctx.ipv6);
-                       }
-               }
+       status = ice_rem_rss_cfg(hw, vsi->idx, cfg);
+       if (status && status != ICE_ERR_DOES_NOT_EXIST) {
+               PMD_DRV_LOG(ERR,
+                           "ice_rem_rss_cfg failed for VSI:%d, error:%d\n",
+                           vsi->idx, status);
+               return -EBUSY;
        }
 
        return 0;
 }
 
 static int
-ice_add_rss_cfg_pre(struct ice_pf *pf, uint32_t hdr)
+ice_hash_moveback(struct ice_pf *pf, struct ice_rss_hash_cfg *cfg)
 {
+       enum ice_status status = ICE_SUCCESS;
        struct ice_hw *hw = ICE_PF_TO_HW(pf);
        struct ice_vsi *vsi = pf->main_vsi;
 
-       if (hdr & (ICE_FLOW_SEG_HDR_GTPU_DWN |
-           ICE_FLOW_SEG_HDR_GTPU_UP)) {
-               if ((hdr & ICE_FLOW_SEG_HDR_IPV4) &&
-                   (hdr & ICE_FLOW_SEG_HDR_UDP)) {
-                       if (ICE_HASH_CFG_VALID(&pf->gtpu_hash_ctx.ipv4_udp)) {
-                               ice_rem_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv4_udp.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv4_udp.pkt_hdr);
-                               ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv4_udp);
-                       }
+       if (!is_hash_cfg_valid(cfg))
+               return -ENOENT;
 
-                       if (ICE_HASH_CFG_VALID(&pf->gtpu_hash_ctx.ipv4)) {
-                               ice_rem_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv4.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv4.pkt_hdr);
-                               ICE_HASH_CFG_ROTATE_START(&pf->gtpu_hash_ctx.ipv4);
-                       }
-               } else if ((hdr & ICE_FLOW_SEG_HDR_IPV6) &&
-                          (hdr & ICE_FLOW_SEG_HDR_UDP)) {
-                       if (ICE_HASH_CFG_VALID(&pf->gtpu_hash_ctx.ipv6_udp)) {
-                               ice_rem_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv6_udp.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv6_udp.pkt_hdr);
-                               ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv6_udp);
-                       }
+       status = ice_add_rss_cfg(hw, vsi->idx, cfg);
+       if (status) {
+               PMD_DRV_LOG(ERR,
+                           "ice_add_rss_cfg failed for VSI:%d, error:%d\n",
+                           vsi->idx, status);
+               return -EBUSY;
+       }
 
-                       if (ICE_HASH_CFG_VALID(&pf->gtpu_hash_ctx.ipv6)) {
-                               ice_rem_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv6.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv6.pkt_hdr);
-                               ICE_HASH_CFG_ROTATE_START(&pf->gtpu_hash_ctx.ipv6);
-                       }
-               } else if ((hdr & ICE_FLOW_SEG_HDR_IPV4) &&
-                          (hdr & ICE_FLOW_SEG_HDR_TCP)) {
-                       if (ICE_HASH_CFG_VALID(&pf->gtpu_hash_ctx.ipv4_tcp)) {
-                               ice_rem_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv4_tcp.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv4_tcp.pkt_hdr);
-                               ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv4_tcp);
-                       }
+       return 0;
+}
 
-                       if (ICE_HASH_CFG_VALID(&pf->gtpu_hash_ctx.ipv4)) {
-                               ice_rem_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv4.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv4.pkt_hdr);
-                               ICE_HASH_CFG_ROTATE_START(&pf->gtpu_hash_ctx.ipv4);
-                       }
-               } else if ((hdr & ICE_FLOW_SEG_HDR_IPV6) &&
-                          (hdr & ICE_FLOW_SEG_HDR_TCP)) {
-                       if (ICE_HASH_CFG_VALID(&pf->gtpu_hash_ctx.ipv6_tcp)) {
-                               ice_rem_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv6_tcp.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv6_tcp.pkt_hdr);
-                               ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv6_tcp);
-                       }
+static int
+ice_hash_remove(struct ice_pf *pf, struct ice_rss_hash_cfg *cfg)
+{
+       int ret;
 
-                       if (ICE_HASH_CFG_VALID(&pf->gtpu_hash_ctx.ipv6)) {
-                               ice_rem_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv6.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv6.pkt_hdr);
-                               ICE_HASH_CFG_ROTATE_START(&pf->gtpu_hash_ctx.ipv6);
-                       }
-               } else if (hdr & ICE_FLOW_SEG_HDR_IPV4) {
-                       if (ICE_HASH_CFG_VALID(&pf->gtpu_hash_ctx.ipv4)) {
-                               ice_rem_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv4.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv4.pkt_hdr);
-                               ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv4);
-                       }
+       ret = ice_hash_moveout(pf, cfg);
+       if (ret && (ret != -ENOENT))
+               return ret;
 
-                       if (ICE_HASH_CFG_VALID(&pf->gtpu_hash_ctx.ipv4_udp)) {
-                               ice_rem_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv4_udp.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv4_udp.pkt_hdr);
-                               ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv4_udp);
-                       }
+       hash_cfg_reset(cfg);
 
-                       if (ICE_HASH_CFG_VALID(&pf->gtpu_hash_ctx.ipv4_tcp)) {
-                               ice_rem_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv4_tcp.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv4_tcp.pkt_hdr);
-                               ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv4_tcp);
-                       }
-               } else if (hdr & ICE_FLOW_SEG_HDR_IPV6) {
-                       if (ICE_HASH_CFG_VALID(&pf->gtpu_hash_ctx.ipv6)) {
-                               ice_rem_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv6.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv6.pkt_hdr);
-                               ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv6);
-                       }
+       return 0;
+}
 
-                       if (ICE_HASH_CFG_VALID(&pf->gtpu_hash_ctx.ipv6_udp)) {
-                               ice_rem_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv6_udp.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv6_udp.pkt_hdr);
-                               ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv6_udp);
-                       }
+static int
+ice_add_rss_cfg_pre_gtpu(struct ice_pf *pf, struct ice_hash_gtpu_ctx *ctx,
+                        u8 ctx_idx)
+{
+       int ret;
 
-                       if (ICE_HASH_CFG_VALID(&pf->gtpu_hash_ctx.ipv6_tcp)) {
-                               ice_rem_rss_cfg(hw, vsi->idx,
-                                       pf->gtpu_hash_ctx.ipv6_tcp.hash_fld,
-                                       pf->gtpu_hash_ctx.ipv6_tcp.pkt_hdr);
-                               ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv6_tcp);
-                       }
-               }
+       switch (ctx_idx) {
+       case ICE_HASH_GTPU_CTX_EH_IP:
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               break;
+       case ICE_HASH_GTPU_CTX_EH_IP_UDP:
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               break;
+       case ICE_HASH_GTPU_CTX_EH_IP_TCP:
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               break;
+       case ICE_HASH_GTPU_CTX_UP_IP:
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               break;
+       case ICE_HASH_GTPU_CTX_UP_IP_UDP:
+       case ICE_HASH_GTPU_CTX_UP_IP_TCP:
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               break;
+       case ICE_HASH_GTPU_CTX_DW_IP:
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_remove(pf,
+                                     &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               break;
+       case ICE_HASH_GTPU_CTX_DW_IP_UDP:
+       case ICE_HASH_GTPU_CTX_DW_IP_TCP:
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveout(pf,
+                                      &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               break;
+       default:
+               break;
        }
 
        return 0;
 }
 
+static u8 calc_gtpu_ctx_idx(uint32_t hdr)
+{
+       u8 eh_idx, ip_idx;
+
+       if (hdr & ICE_FLOW_SEG_HDR_GTPU_EH)
+               eh_idx = 0;
+       else if (hdr & ICE_FLOW_SEG_HDR_GTPU_UP)
+               eh_idx = 1;
+       else if (hdr & ICE_FLOW_SEG_HDR_GTPU_DWN)
+               eh_idx = 2;
+       else
+               return ICE_HASH_GTPU_CTX_MAX;
+
+       ip_idx = 0;
+       if (hdr & ICE_FLOW_SEG_HDR_UDP)
+               ip_idx = 1;
+       else if (hdr & ICE_FLOW_SEG_HDR_TCP)
+               ip_idx = 2;
+
+       if (hdr & (ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV6))
+               return eh_idx * 3 + ip_idx;
+       else
+               return ICE_HASH_GTPU_CTX_MAX;
+}
+
 static int
-ice_rem_rss_cfg_post(struct ice_pf *pf, uint32_t hdr)
+ice_add_rss_cfg_pre(struct ice_pf *pf, uint32_t hdr)
 {
-       if (hdr & ICE_FLOW_SEG_HDR_GTPU_EH) {
-               if ((hdr & ICE_FLOW_SEG_HDR_IPV4) &&
-                   (hdr & ICE_FLOW_SEG_HDR_UDP)) {
-                       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv4_udp);
-               } else if ((hdr & ICE_FLOW_SEG_HDR_IPV6) &&
-                          (hdr & ICE_FLOW_SEG_HDR_UDP)) {
-                       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv6_udp);
-               } else if ((hdr & ICE_FLOW_SEG_HDR_IPV4) &&
-                          (hdr & ICE_FLOW_SEG_HDR_TCP)) {
-                       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv4_tcp);
-               } else if ((hdr & ICE_FLOW_SEG_HDR_IPV6) &&
-                          (hdr & ICE_FLOW_SEG_HDR_TCP)) {
-                       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv6_tcp);
-               } else if (hdr & ICE_FLOW_SEG_HDR_IPV4) {
-                       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv4);
-               } else if (hdr & ICE_FLOW_SEG_HDR_IPV6) {
-                       ICE_HASH_CFG_RESET(&pf->gtpu_hash_ctx.ipv6);
-               }
+       u8 gtpu_ctx_idx = calc_gtpu_ctx_idx(hdr);
+
+       if (hdr & ICE_FLOW_SEG_HDR_IPV4)
+               return ice_add_rss_cfg_pre_gtpu(pf, &pf->hash_ctx.gtpu4,
+                                               gtpu_ctx_idx);
+       else if (hdr & ICE_FLOW_SEG_HDR_IPV6)
+               return ice_add_rss_cfg_pre_gtpu(pf, &pf->hash_ctx.gtpu6,
+                                               gtpu_ctx_idx);
+
+       return 0;
+}
+
+static int
+ice_add_rss_cfg_post_gtpu(struct ice_pf *pf, struct ice_hash_gtpu_ctx *ctx,
+                         u8 ctx_idx, struct ice_rss_hash_cfg *cfg)
+{
+       int ret;
+
+       if (ctx_idx < ICE_HASH_GTPU_CTX_MAX)
+               ctx->ctx[ctx_idx] = *cfg;
+
+       switch (ctx_idx) {
+       case ICE_HASH_GTPU_CTX_EH_IP:
+               break;
+       case ICE_HASH_GTPU_CTX_EH_IP_UDP:
+               ret = ice_hash_moveback(pf,
+                                       &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveback(pf,
+                                       &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveback(pf,
+                                       &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveback(pf,
+                                       &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               break;
+       case ICE_HASH_GTPU_CTX_EH_IP_TCP:
+               ret = ice_hash_moveback(pf,
+                                       &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveback(pf,
+                                       &ctx->ctx[ICE_HASH_GTPU_CTX_UP_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveback(pf,
+                                       &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveback(pf,
+                                       &ctx->ctx[ICE_HASH_GTPU_CTX_DW_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               break;
+       case ICE_HASH_GTPU_CTX_UP_IP:
+       case ICE_HASH_GTPU_CTX_UP_IP_UDP:
+       case ICE_HASH_GTPU_CTX_UP_IP_TCP:
+       case ICE_HASH_GTPU_CTX_DW_IP:
+       case ICE_HASH_GTPU_CTX_DW_IP_UDP:
+       case ICE_HASH_GTPU_CTX_DW_IP_TCP:
+               ret = ice_hash_moveback(pf,
+                                       &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveback(pf,
+                                       &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP_UDP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               ret = ice_hash_moveback(pf,
+                                       &ctx->ctx[ICE_HASH_GTPU_CTX_EH_IP_TCP]);
+               if (ret && (ret != -ENOENT))
+                       return ret;
+
+               break;
+       default:
+               break;
        }
 
        return 0;
 }
 
+static int
+ice_add_rss_cfg_post(struct ice_pf *pf, struct ice_rss_hash_cfg *cfg)
+{
+       u8 gtpu_ctx_idx = calc_gtpu_ctx_idx(cfg->addl_hdrs);
+
+       if (cfg->addl_hdrs & ICE_FLOW_SEG_HDR_IPV4)
+               return ice_add_rss_cfg_post_gtpu(pf, &pf->hash_ctx.gtpu4,
+                                                gtpu_ctx_idx, cfg);
+       else if (cfg->addl_hdrs & ICE_FLOW_SEG_HDR_IPV6)
+               return ice_add_rss_cfg_post_gtpu(pf, &pf->hash_ctx.gtpu6,
+                                                gtpu_ctx_idx, cfg);
+
+       return 0;
+}
+
+static void
+ice_rem_rss_cfg_post(struct ice_pf *pf, uint32_t hdr)
+{
+       u8 gtpu_ctx_idx = calc_gtpu_ctx_idx(hdr);
+
+       if (gtpu_ctx_idx >= ICE_HASH_GTPU_CTX_MAX)
+               return;
+
+       if (hdr & ICE_FLOW_SEG_HDR_IPV4)
+               hash_cfg_reset(&pf->hash_ctx.gtpu4.ctx[gtpu_ctx_idx]);
+       else if (hdr & ICE_FLOW_SEG_HDR_IPV6)
+               hash_cfg_reset(&pf->hash_ctx.gtpu6.ctx[gtpu_ctx_idx]);
+}
+
 int
 ice_rem_rss_cfg_wrap(struct ice_pf *pf, uint16_t vsi_id,
-               uint64_t fld, uint32_t hdr)
+                    struct ice_rss_hash_cfg *cfg)
 {
        struct ice_hw *hw = ICE_PF_TO_HW(pf);
        int ret;
 
-       ret = ice_rem_rss_cfg(hw, vsi_id, fld, hdr);
+       ret = ice_rem_rss_cfg(hw, vsi_id, cfg);
        if (ret && ret != ICE_ERR_DOES_NOT_EXIST)
                PMD_DRV_LOG(ERR, "remove rss cfg failed\n");
 
-       ret = ice_rem_rss_cfg_post(pf, hdr);
-       if (ret)
-               PMD_DRV_LOG(ERR, "remove rss cfg post failed\n");
+       ice_rem_rss_cfg_post(pf, cfg->addl_hdrs);
 
        return 0;
 }
 
 int
 ice_add_rss_cfg_wrap(struct ice_pf *pf, uint16_t vsi_id,
-               uint64_t fld, uint32_t hdr, bool symm)
+                    struct ice_rss_hash_cfg *cfg)
 {
        struct ice_hw *hw = ICE_PF_TO_HW(pf);
        int ret;
 
-       ret = ice_add_rss_cfg_pre(pf, hdr);
+       ret = ice_add_rss_cfg_pre(pf, cfg->addl_hdrs);
        if (ret)
                PMD_DRV_LOG(ERR, "add rss cfg pre failed\n");
 
-       ret = ice_add_rss_cfg(hw, vsi_id, fld, hdr, symm);
+       ret = ice_add_rss_cfg(hw, vsi_id, cfg);
        if (ret)
                PMD_DRV_LOG(ERR, "add rss cfg failed\n");
 
-       ret = ice_add_rss_cfg_post(pf, hdr, fld, symm);
+       ret = ice_add_rss_cfg_post(pf, cfg);
        if (ret)
                PMD_DRV_LOG(ERR, "add rss cfg post failed\n");
 
@@ -2709,14 +2909,33 @@ ice_add_rss_cfg_wrap(struct ice_pf *pf, uint16_t vsi_id,
 static void
 ice_rss_hash_set(struct ice_pf *pf, uint64_t rss_hf)
 {
+       struct ice_hw *hw = ICE_PF_TO_HW(pf);
        struct ice_vsi *vsi = pf->main_vsi;
+       struct ice_rss_hash_cfg cfg;
        int ret;
 
+#define ICE_RSS_HF_ALL ( \
+       ETH_RSS_IPV4 | \
+       ETH_RSS_IPV6 | \
+       ETH_RSS_NONFRAG_IPV4_UDP | \
+       ETH_RSS_NONFRAG_IPV6_UDP | \
+       ETH_RSS_NONFRAG_IPV4_TCP | \
+       ETH_RSS_NONFRAG_IPV6_TCP | \
+       ETH_RSS_NONFRAG_IPV4_SCTP | \
+       ETH_RSS_NONFRAG_IPV6_SCTP)
+
+       ret = ice_rem_vsi_rss_cfg(hw, vsi->idx);
+       if (ret)
+               PMD_DRV_LOG(ERR, "%s Remove rss vsi fail %d",
+                           __func__, ret);
+
+       cfg.symm = 0;
+       cfg.hdr_type = ICE_RSS_ANY_HEADERS;
        /* Configure RSS for IPv4 with src/dst addr as input set */
        if (rss_hf & ETH_RSS_IPV4) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_FLOW_HASH_IPV4,
-                                     ICE_FLOW_SEG_HDR_IPV4 |
-                                     ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER;
+               cfg.hash_flds = ICE_FLOW_HASH_IPV4;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s IPV4 rss flow fail %d",
                                    __func__, ret);
@@ -2724,9 +2943,9 @@ ice_rss_hash_set(struct ice_pf *pf, uint64_t rss_hf)
 
        /* Configure RSS for IPv6 with src/dst addr as input set */
        if (rss_hf & ETH_RSS_IPV6) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_FLOW_HASH_IPV6,
-                                     ICE_FLOW_SEG_HDR_IPV6 |
-                                     ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER;
+               cfg.hash_flds = ICE_FLOW_HASH_IPV6;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s IPV6 rss flow fail %d",
                                    __func__, ret);
@@ -2734,10 +2953,10 @@ ice_rss_hash_set(struct ice_pf *pf, uint64_t rss_hf)
 
        /* Configure RSS for udp4 with src/dst addr and port as input set */
        if (rss_hf & ETH_RSS_NONFRAG_IPV4_UDP) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_UDP_IPV4,
-                                     ICE_FLOW_SEG_HDR_UDP |
-                                     ICE_FLOW_SEG_HDR_IPV4 |
-                                     ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_UDP | ICE_FLOW_SEG_HDR_IPV4 |
+                               ICE_FLOW_SEG_HDR_IPV_OTHER;
+               cfg.hash_flds = ICE_HASH_UDP_IPV4;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s UDP_IPV4 rss flow fail %d",
                                    __func__, ret);
@@ -2745,10 +2964,10 @@ ice_rss_hash_set(struct ice_pf *pf, uint64_t rss_hf)
 
        /* Configure RSS for udp6 with src/dst addr and port as input set */
        if (rss_hf & ETH_RSS_NONFRAG_IPV6_UDP) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_UDP_IPV6,
-                                     ICE_FLOW_SEG_HDR_UDP |
-                                     ICE_FLOW_SEG_HDR_IPV6 |
-                                     ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_UDP | ICE_FLOW_SEG_HDR_IPV6 |
+                               ICE_FLOW_SEG_HDR_IPV_OTHER;
+               cfg.hash_flds = ICE_HASH_UDP_IPV6;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s UDP_IPV6 rss flow fail %d",
                                    __func__, ret);
@@ -2756,10 +2975,10 @@ ice_rss_hash_set(struct ice_pf *pf, uint64_t rss_hf)
 
        /* Configure RSS for tcp4 with src/dst addr and port as input set */
        if (rss_hf & ETH_RSS_NONFRAG_IPV4_TCP) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_TCP_IPV4,
-                                     ICE_FLOW_SEG_HDR_TCP |
-                                     ICE_FLOW_SEG_HDR_IPV4 |
-                                     ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_IPV4 |
+                               ICE_FLOW_SEG_HDR_IPV_OTHER;
+               cfg.hash_flds = ICE_HASH_TCP_IPV4;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s TCP_IPV4 rss flow fail %d",
                                    __func__, ret);
@@ -2767,10 +2986,10 @@ ice_rss_hash_set(struct ice_pf *pf, uint64_t rss_hf)
 
        /* Configure RSS for tcp6 with src/dst addr and port as input set */
        if (rss_hf & ETH_RSS_NONFRAG_IPV6_TCP) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_TCP_IPV6,
-                                     ICE_FLOW_SEG_HDR_TCP |
-                                     ICE_FLOW_SEG_HDR_IPV6 |
-                                     ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_IPV6 |
+                               ICE_FLOW_SEG_HDR_IPV_OTHER;
+               cfg.hash_flds = ICE_HASH_TCP_IPV6;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s TCP_IPV6 rss flow fail %d",
                                    __func__, ret);
@@ -2778,10 +2997,10 @@ ice_rss_hash_set(struct ice_pf *pf, uint64_t rss_hf)
 
        /* Configure RSS for sctp4 with src/dst addr and port as input set */
        if (rss_hf & ETH_RSS_NONFRAG_IPV4_SCTP) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_FLOW_HASH_IPV4,
-                                     ICE_FLOW_SEG_HDR_SCTP |
-                                     ICE_FLOW_SEG_HDR_IPV4 |
-                                     ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_SCTP | ICE_FLOW_SEG_HDR_IPV4 |
+                               ICE_FLOW_SEG_HDR_IPV_OTHER;
+               cfg.hash_flds = ICE_HASH_SCTP_IPV4;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s SCTP_IPV4 rss flow fail %d",
                                    __func__, ret);
@@ -2789,222 +3008,160 @@ ice_rss_hash_set(struct ice_pf *pf, uint64_t rss_hf)
 
        /* Configure RSS for sctp6 with src/dst addr and port as input set */
        if (rss_hf & ETH_RSS_NONFRAG_IPV6_SCTP) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_FLOW_HASH_IPV6,
-                                     ICE_FLOW_SEG_HDR_SCTP |
-                                     ICE_FLOW_SEG_HDR_IPV6 |
-                                     ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_SCTP | ICE_FLOW_SEG_HDR_IPV6 |
+                               ICE_FLOW_SEG_HDR_IPV_OTHER;
+               cfg.hash_flds = ICE_HASH_SCTP_IPV6;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s SCTP_IPV6 rss flow fail %d",
                                    __func__, ret);
        }
 
        if (rss_hf & ETH_RSS_IPV4) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_FLOW_HASH_IPV4,
-                               ICE_FLOW_SEG_HDR_GTPU_IP |
-                               ICE_FLOW_SEG_HDR_IPV4 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4 |
+                               ICE_FLOW_SEG_HDR_IPV_OTHER;
+               cfg.hash_flds = ICE_FLOW_HASH_IPV4;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s GTPU_IPV4 rss flow fail %d",
                                    __func__, ret);
 
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_FLOW_HASH_IPV4,
-                               ICE_FLOW_SEG_HDR_GTPU_EH |
-                               ICE_FLOW_SEG_HDR_IPV4 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 |
+                               ICE_FLOW_SEG_HDR_IPV_OTHER;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s GTPU_EH_IPV4 rss flow fail %d",
                                    __func__, ret);
 
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_FLOW_HASH_IPV4,
-                               ICE_FLOW_SEG_HDR_PPPOE |
-                               ICE_FLOW_SEG_HDR_IPV4 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_IPV4 |
+                               ICE_FLOW_SEG_HDR_IPV_OTHER;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s PPPoE_IPV4 rss flow fail %d",
                                    __func__, ret);
        }
 
        if (rss_hf & ETH_RSS_IPV6) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_FLOW_HASH_IPV6,
-                               ICE_FLOW_SEG_HDR_GTPU_IP |
-                               ICE_FLOW_SEG_HDR_IPV6 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6 |
+                               ICE_FLOW_SEG_HDR_IPV_OTHER;
+               cfg.hash_flds = ICE_FLOW_HASH_IPV6;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s GTPU_IPV6 rss flow fail %d",
                                    __func__, ret);
 
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_FLOW_HASH_IPV6,
-                               ICE_FLOW_SEG_HDR_GTPU_EH |
-                               ICE_FLOW_SEG_HDR_IPV6 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6 |
+                               ICE_FLOW_SEG_HDR_IPV_OTHER;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s GTPU_EH_IPV6 rss flow fail %d",
                                    __func__, ret);
 
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_FLOW_HASH_IPV6,
-                               ICE_FLOW_SEG_HDR_PPPOE |
-                               ICE_FLOW_SEG_HDR_IPV6 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_IPV6 |
+                               ICE_FLOW_SEG_HDR_IPV_OTHER;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s PPPoE_IPV6 rss flow fail %d",
                                    __func__, ret);
        }
 
        if (rss_hf & ETH_RSS_NONFRAG_IPV4_UDP) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_UDP_IPV4,
-                               ICE_FLOW_SEG_HDR_GTPU_IP |
-                               ICE_FLOW_SEG_HDR_UDP |
-                               ICE_FLOW_SEG_HDR_IPV4 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_UDP |
+                               ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER;
+               cfg.hash_flds = ICE_FLOW_HASH_IPV4;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s GTPU_IPV4_UDP rss flow fail %d",
                                    __func__, ret);
 
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_UDP_IPV4,
-                               ICE_FLOW_SEG_HDR_GTPU_EH |
-                               ICE_FLOW_SEG_HDR_UDP |
-                               ICE_FLOW_SEG_HDR_IPV4 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_UDP |
+                               ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s GTPU_EH_IPV4_UDP rss flow fail %d",
                                    __func__, ret);
 
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_UDP_IPV4,
-                               ICE_FLOW_SEG_HDR_PPPOE |
-                               ICE_FLOW_SEG_HDR_UDP |
-                               ICE_FLOW_SEG_HDR_IPV4 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_UDP |
+                               ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s PPPoE_IPV4_UDP rss flow fail %d",
                                    __func__, ret);
        }
 
        if (rss_hf & ETH_RSS_NONFRAG_IPV6_UDP) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_UDP_IPV6,
-                               ICE_FLOW_SEG_HDR_GTPU_IP |
-                               ICE_FLOW_SEG_HDR_UDP |
-                               ICE_FLOW_SEG_HDR_IPV6 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_UDP |
+                               ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER;
+               cfg.hash_flds = ICE_FLOW_HASH_IPV6;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s GTPU_IPV6_UDP rss flow fail %d",
                                    __func__, ret);
 
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_UDP_IPV6,
-                               ICE_FLOW_SEG_HDR_GTPU_EH |
-                               ICE_FLOW_SEG_HDR_UDP |
-                               ICE_FLOW_SEG_HDR_IPV6 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_UDP |
+                               ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s GTPU_EH_IPV6_UDP rss flow fail %d",
                                    __func__, ret);
 
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_UDP_IPV6,
-                               ICE_FLOW_SEG_HDR_PPPOE |
-                               ICE_FLOW_SEG_HDR_UDP |
-                               ICE_FLOW_SEG_HDR_IPV6 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_UDP |
+                               ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s PPPoE_IPV6_UDP rss flow fail %d",
                                    __func__, ret);
        }
 
        if (rss_hf & ETH_RSS_NONFRAG_IPV4_TCP) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_TCP_IPV4,
-                               ICE_FLOW_SEG_HDR_GTPU_IP |
-                               ICE_FLOW_SEG_HDR_TCP |
-                               ICE_FLOW_SEG_HDR_IPV4 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_TCP |
+                               ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER;
+               cfg.hash_flds = ICE_FLOW_HASH_IPV4;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s GTPU_IPV4_TCP rss flow fail %d",
                                    __func__, ret);
 
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_TCP_IPV4,
-                               ICE_FLOW_SEG_HDR_GTPU_EH |
-                               ICE_FLOW_SEG_HDR_TCP |
-                               ICE_FLOW_SEG_HDR_IPV4 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_TCP |
+                               ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s GTPU_EH_IPV4_TCP rss flow fail %d",
                                    __func__, ret);
 
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_TCP_IPV4,
-                               ICE_FLOW_SEG_HDR_PPPOE |
-                               ICE_FLOW_SEG_HDR_TCP |
-                               ICE_FLOW_SEG_HDR_IPV4 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_TCP |
+                               ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s PPPoE_IPV4_TCP rss flow fail %d",
                                    __func__, ret);
        }
 
        if (rss_hf & ETH_RSS_NONFRAG_IPV6_TCP) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_TCP_IPV6,
-                               ICE_FLOW_SEG_HDR_GTPU_IP |
-                               ICE_FLOW_SEG_HDR_TCP |
-                               ICE_FLOW_SEG_HDR_IPV6 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_TCP |
+                               ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER;
+               cfg.hash_flds = ICE_FLOW_HASH_IPV6;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s GTPU_IPV6_TCP rss flow fail %d",
                                    __func__, ret);
 
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_TCP_IPV6,
-                               ICE_FLOW_SEG_HDR_GTPU_EH |
-                               ICE_FLOW_SEG_HDR_TCP |
-                               ICE_FLOW_SEG_HDR_IPV6 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_TCP |
+                               ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s GTPU_EH_IPV6_TCP rss flow fail %d",
                                    __func__, ret);
 
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_TCP_IPV6,
-                               ICE_FLOW_SEG_HDR_PPPOE |
-                               ICE_FLOW_SEG_HDR_TCP |
-                               ICE_FLOW_SEG_HDR_IPV6 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
+               cfg.addl_hdrs = ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_TCP |
+                               ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER;
+               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
                if (ret)
                        PMD_DRV_LOG(ERR, "%s PPPoE_IPV6_TCP rss flow fail %d",
                                    __func__, ret);
        }
 
-       if (rss_hf & ETH_RSS_NONFRAG_IPV4_SCTP) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_SCTP_IPV4,
-                               ICE_FLOW_SEG_HDR_GTPU_IP |
-                               ICE_FLOW_SEG_HDR_SCTP |
-                               ICE_FLOW_SEG_HDR_IPV4 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
-               if (ret)
-                       PMD_DRV_LOG(ERR, "%s GTPU_IPV4_SCTP rss flow fail %d",
-                                   __func__, ret);
-
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_SCTP_IPV4,
-                               ICE_FLOW_SEG_HDR_GTPU_EH |
-                               ICE_FLOW_SEG_HDR_SCTP |
-                               ICE_FLOW_SEG_HDR_IPV4 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
-               if (ret)
-                       PMD_DRV_LOG(ERR, "%s GTPU_EH_IPV4_SCTP rss flow fail %d",
-                                   __func__, ret);
-       }
-
-       if (rss_hf & ETH_RSS_NONFRAG_IPV6_SCTP) {
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_SCTP_IPV6,
-                               ICE_FLOW_SEG_HDR_GTPU_IP |
-                               ICE_FLOW_SEG_HDR_SCTP |
-                               ICE_FLOW_SEG_HDR_IPV6 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
-               if (ret)
-                       PMD_DRV_LOG(ERR, "%s GTPU_IPV6_SCTP rss flow fail %d",
-                                   __func__, ret);
-
-               ret = ice_add_rss_cfg_wrap(pf, vsi->idx, ICE_HASH_SCTP_IPV6,
-                               ICE_FLOW_SEG_HDR_GTPU_EH |
-                               ICE_FLOW_SEG_HDR_SCTP |
-                               ICE_FLOW_SEG_HDR_IPV6 |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER, 0);
-               if (ret)
-                       PMD_DRV_LOG(ERR, "%s GTPU_EH_IPV6_SCTP rss flow fail %d",
-                                   __func__, ret);
-       }
+       pf->rss_hf = rss_hf & ICE_RSS_HF_ALL;
 }
 
 static int ice_init_rss(struct ice_pf *pf)
@@ -3012,6 +3169,7 @@ static int ice_init_rss(struct ice_pf *pf)
        struct ice_hw *hw = ICE_PF_TO_HW(pf);
        struct ice_vsi *vsi = pf->main_vsi;
        struct rte_eth_dev *dev = pf->adapter->eth_dev;
+       struct ice_aq_get_set_rss_lut_params lut_params;
        struct rte_eth_rss_conf *rss_conf;
        struct ice_aqc_get_set_rss_keys key;
        uint16_t i, nb_q;
@@ -3066,9 +3224,12 @@ static int ice_init_rss(struct ice_pf *pf)
        for (i = 0; i < vsi->rss_lut_size; i++)
                vsi->rss_lut[i] = i % nb_q;
 
-       ret = ice_aq_set_rss_lut(hw, vsi->idx,
-                                ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_PF,
-                                vsi->rss_lut, vsi->rss_lut_size);
+       lut_params.vsi_handle = vsi->idx;
+       lut_params.lut_size = vsi->rss_lut_size;
+       lut_params.lut_type = ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_PF;
+       lut_params.lut = vsi->rss_lut;
+       lut_params.global_lut_id = 0;
+       ret = ice_aq_set_rss_lut(hw, &lut_params);
        if (ret)
                goto out;
 
@@ -3134,7 +3295,7 @@ __vsi_queues_bind_intr(struct ice_vsi *vsi, uint16_t msix_vect,
                PMD_DRV_LOG(INFO, "queue %d is binding to vect %d",
                            base_queue + i, msix_vect);
                /* set ITR0 value */
-               ICE_WRITE_REG(hw, GLINT_ITR(0, msix_vect), 0x10);
+               ICE_WRITE_REG(hw, GLINT_ITR(0, msix_vect), 0x2);
                ICE_WRITE_REG(hw, QINT_RQCTL(base_queue + i), val);
                ICE_WRITE_REG(hw, QINT_TQCTL(base_queue + i), val_tx);
        }
@@ -3993,6 +4154,7 @@ ice_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 static int
 ice_get_rss_lut(struct ice_vsi *vsi, uint8_t *lut, uint16_t lut_size)
 {
+       struct ice_aq_get_set_rss_lut_params lut_params;
        struct ice_pf *pf = ICE_VSI_TO_PF(vsi);
        struct ice_hw *hw = ICE_VSI_TO_HW(vsi);
        int ret;
@@ -4001,8 +4163,12 @@ ice_get_rss_lut(struct ice_vsi *vsi, uint8_t *lut, uint16_t lut_size)
                return -EINVAL;
 
        if (pf->flags & ICE_FLAG_RSS_AQ_CAPABLE) {
-               ret = ice_aq_get_rss_lut(hw, vsi->idx,
-                       ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_PF, lut, lut_size);
+               lut_params.vsi_handle = vsi->idx;
+               lut_params.lut_size = lut_size;
+               lut_params.lut_type = ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_PF;
+               lut_params.lut = lut;
+               lut_params.global_lut_id = 0;
+               ret = ice_aq_get_rss_lut(hw, &lut_params);
                if (ret) {
                        PMD_DRV_LOG(ERR, "Failed to get RSS lookup table");
                        return -EINVAL;
@@ -4021,6 +4187,7 @@ ice_get_rss_lut(struct ice_vsi *vsi, uint8_t *lut, uint16_t lut_size)
 static int
 ice_set_rss_lut(struct ice_vsi *vsi, uint8_t *lut, uint16_t lut_size)
 {
+       struct ice_aq_get_set_rss_lut_params lut_params;
        struct ice_pf *pf;
        struct ice_hw *hw;
        int ret;
@@ -4032,8 +4199,12 @@ ice_set_rss_lut(struct ice_vsi *vsi, uint8_t *lut, uint16_t lut_size)
        hw = ICE_VSI_TO_HW(vsi);
 
        if (pf->flags & ICE_FLAG_RSS_AQ_CAPABLE) {
-               ret = ice_aq_set_rss_lut(hw, vsi->idx,
-                       ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_PF, lut, lut_size);
+               lut_params.vsi_handle = vsi->idx;
+               lut_params.lut_size = lut_size;
+               lut_params.lut_type = ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_PF;
+               lut_params.lut = lut;
+               lut_params.global_lut_id = 0;
+               ret = ice_aq_set_rss_lut(hw, &lut_params);
                if (ret) {
                        PMD_DRV_LOG(ERR, "Failed to set RSS lookup table");
                        return -EINVAL;
@@ -4228,8 +4399,7 @@ ice_rss_hash_conf_get(struct rte_eth_dev *dev,
        ice_get_rss_key(vsi, rss_conf->rss_key,
                        &rss_conf->rss_key_len);
 
-       /* TODO: default set to 0 as hf config is not supported now */
-       rss_conf->rss_hf = 0;
+       rss_conf->rss_hf = pf->rss_hf;
        return 0;
 }