[v15,4/7] drivers/net: update Rx RSS hash offload capabilities

Message ID 20191029153722.4547-5-pbhagavatula@marvell.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers
Series ethdev: add new Rx offload flags |

Checks

Context Check Description
ci/Intel-compilation fail Compilation issues
ci/checkpatch warning coding style issues

Commit Message

Pavan Nikhilesh Bhagavatula Oct. 29, 2019, 3:37 p.m. UTC
  From: Pavan Nikhilesh <pbhagavatula@marvell.com>

Add DEV_RX_OFFLOAD_RSS_HASH flag for all PMDs that support RSS hash
delivery.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Hemant Agrawal <hemant.agrawal@nxp.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
---
 drivers/net/bnxt/bnxt_ethdev.c       |  8 +++++++-
 drivers/net/cxgbe/cxgbe.h            |  3 ++-
 drivers/net/cxgbe/cxgbe_ethdev.c     |  5 +++++
 drivers/net/dpaa/dpaa_ethdev.c       |  3 ++-
 drivers/net/dpaa2/dpaa2_ethdev.c     |  1 +
 drivers/net/e1000/igb_ethdev.c       |  6 ++++++
 drivers/net/e1000/igb_rxtx.c         |  3 ++-
 drivers/net/enic/enic_ethdev.c       |  5 +++++
 drivers/net/enic/enic_res.c          |  3 ++-
 drivers/net/fm10k/fm10k_ethdev.c     |  6 +++++-
 drivers/net/hinic/hinic_pmd_ethdev.c |  6 +++++-
 drivers/net/i40e/i40e_ethdev.c       |  6 +++++-
 drivers/net/iavf/iavf_ethdev.c       |  6 +++++-
 drivers/net/ice/ice_ethdev.c         |  6 +++++-
 drivers/net/ixgbe/ixgbe_ethdev.c     |  7 +++++++
 drivers/net/ixgbe/ixgbe_rxtx.c       |  3 ++-
 drivers/net/liquidio/lio_ethdev.c    |  7 ++++++-
 drivers/net/mlx4/mlx4.c              |  3 +++
 drivers/net/mlx4/mlx4_rxq.c          |  3 ++-
 drivers/net/mlx5/mlx5_ethdev.c       |  4 ++++
 drivers/net/mlx5/mlx5_rxq.c          |  3 ++-
 drivers/net/netvsc/hn_ethdev.c       |  3 +++
 drivers/net/netvsc/hn_rndis.c        |  3 ++-
 drivers/net/nfp/nfp_net.c            |  6 +++++-
 drivers/net/octeontx2/otx2_ethdev.c  |  3 ++-
 drivers/net/octeontx2/otx2_ethdev.h  | 15 ++++++++-------
 drivers/net/qede/qede_ethdev.c       |  6 +++++-
 drivers/net/sfc/sfc_ef10_essb_rx.c   |  3 ++-
 drivers/net/sfc/sfc_ef10_rx.c        |  3 ++-
 drivers/net/sfc/sfc_rx.c             |  7 ++++++-
 drivers/net/thunderx/nicvf_ethdev.c  |  3 +++
 drivers/net/thunderx/nicvf_ethdev.h  |  3 ++-
 drivers/net/vmxnet3/vmxnet3_ethdev.c |  6 +++++-
 33 files changed, 128 insertions(+), 30 deletions(-)
  

Comments

Thomas Monjalon Oct. 31, 2019, 2:03 p.m. UTC | #1
29/10/2019 16:37, pbhagavatula@marvell.com:
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> 
> Add DEV_RX_OFFLOAD_RSS_HASH flag for all PMDs that support RSS hash
> delivery.
> 
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> Reviewed-by: Hemant Agrawal <hemant.agrawal@nxp.com>
> Acked-by: Jerin Jacob <jerinj@marvell.com>
> Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
> ---
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;

Excuse me, I miss why you need a check before setting the bit.
  
Pavan Nikhilesh Bhagavatula Oct. 31, 2019, 4:51 p.m. UTC | #2
>-----Original Message-----
>From: dev <dev-bounces@dpdk.org> On Behalf Of Thomas Monjalon
>Sent: Thursday, October 31, 2019 7:33 PM
>To: Pavan Nikhilesh Bhagavatula <pbhagavatula@marvell.com>
>Cc: dev@dpdk.org; ferruh.yigit@intel.com;
>arybchenko@solarflare.com; Jerin Jacob Kollanukkaran
><jerinj@marvell.com>; Ajit Khaparde <ajit.khaparde@broadcom.com>;
>Somnath Kotur <somnath.kotur@broadcom.com>; Rahul Lakkireddy
><rahul.lakkireddy@chelsio.com>; Hemant Agrawal
><hemant.agrawal@nxp.com>; Sachin Saxena
><sachin.saxena@nxp.com>; Wenzhuo Lu <wenzhuo.lu@intel.com>;
>John Daley <johndale@cisco.com>; Hyong Youb Kim
><hyonkim@cisco.com>; Qi Zhang <qi.z.zhang@intel.com>; Xiao Wang
><xiao.w.wang@intel.com>; Ziyang Xuan <xuanziyang2@huawei.com>;
>Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>; Guoyang Zhou
><zhouguoyang@huawei.com>; Beilei Xing <beilei.xing@intel.com>;
>Jingjing Wu <jingjing.wu@intel.com>; Qiming Yang
><qiming.yang@intel.com>; Konstantin Ananyev
><konstantin.ananyev@intel.com>; Shijith Thotton
><sthotton@marvell.com>; Srisivasubramanian Srinivasan
><srinivasan@marvell.com>; Matan Azrad <matan@mellanox.com>;
>Shahaf Shuler <shahafs@mellanox.com>; Viacheslav Ovsiienko
><viacheslavo@mellanox.com>; Stephen Hemminger
><sthemmin@microsoft.com>; K. Y. Srinivasan <kys@microsoft.com>;
>Haiyang Zhang <haiyangz@microsoft.com>; Alejandro Lucero
><alejandro.lucero@netronome.com>; Nithin Kumar Dabilpuram
><ndabilpuram@marvell.com>; Kiran Kumar Kokkilagadda
><kirankumark@marvell.com>; Rasesh Mody <rmody@marvell.com>;
>Shahed Shaikh <shshaikh@marvell.com>; Maciej Czekaj
><mczekaj@marvell.com>; Yong Wang <yongwang@vmware.com>
>Subject: Re: [dpdk-dev] [PATCH v15 4/7] drivers/net: update Rx RSS
>hash offload capabilities
>
>29/10/2019 16:37, pbhagavatula@marvell.com:
>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>
>> Add DEV_RX_OFFLOAD_RSS_HASH flag for all PMDs that support RSS
>hash
>> delivery.
>>
>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
>> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
>> Reviewed-by: Hemant Agrawal <hemant.agrawal@nxp.com>
>> Acked-by: Jerin Jacob <jerinj@marvell.com>
>> Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
>> ---
>> +	if (!(dev->data->dev_conf.rxmode.offloads &
>DEV_RX_OFFLOAD_RSS_HASH))
>> +		dev->data->dev_conf.rxmode.offloads |=
>DEV_RX_OFFLOAD_RSS_HASH;
>
>Excuse me, I miss why you need a check before setting the bit.

Currently, none of the PMDs support disabling RSS_HASH (except octeontx2) since it involves 
adding an if check in Rx routine that might lead to perf impact.
So, we are implicitly enabling the offload for all the PMDs if an application decides to disable
RSS_HASH. In future if PMD maintainer decides to add this feature she/he can remove the check.

>
  
Andrew Rybchenko Nov. 1, 2019, 11:11 a.m. UTC | #3
On 10/31/19 7:51 PM, Pavan Nikhilesh Bhagavatula wrote:
> 
>> 29/10/2019 16:37, pbhagavatula@marvell.com:
>>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>>
>>> Add DEV_RX_OFFLOAD_RSS_HASH flag for all PMDs that support RSS hash delivery.
>>>
>>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
>>> Reviewed-by: Hemant Agrawal <hemant.agrawal@nxp.com>
>>> Acked-by: Jerin Jacob <jerinj@marvell.com>
>>> Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
>>> ---
>>> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
>>> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
>>
>> Excuse me, I miss why you need a check before setting the bit.
> 
> Currently, none of the PMDs support disabling RSS_HASH (except octeontx2) since it involves 
> adding an if check in Rx routine that might lead to perf impact.
> So, we are implicitly enabling the offload for all the PMDs if an application decides to disable
> RSS_HASH. In future if PMD maintainer decides to add this feature she/he can remove the check.

As I understand Thomas says that it is just sufficient to do:
    dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
without any if before.

Yes, it is true since right now it looks a bit strange.
I guess it is the result of code evolution. Initially
it was logging inside if, but logging is moved to ethdev.

(Of course, it is true for such trivial checks only)
  
Liron Himi Nov. 1, 2019, 5:49 p.m. UTC | #4
Hi,

mvpp2 and mvneta PMDs are also support RSS hash.
Please add them to the patch.

Regards,
Liron

-----Original Message-----
From: dev <dev-bounces@dpdk.org> On Behalf Of pbhagavatula@marvell.com
Sent: Tuesday, 29 October 2019 17:37
To: ferruh.yigit@intel.com; arybchenko@solarflare.com; Jerin Jacob Kollanukkaran <jerinj@marvell.com>; Ajit Khaparde <ajit.khaparde@broadcom.com>; Somnath Kotur <somnath.kotur@broadcom.com>; Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>; Hemant Agrawal <hemant.agrawal@nxp.com>; Sachin Saxena <sachin.saxena@nxp.com>; Wenzhuo Lu <wenzhuo.lu@intel.com>; John Daley <johndale@cisco.com>; Hyong Youb Kim <hyonkim@cisco.com>; Qi Zhang <qi.z.zhang@intel.com>; Xiao Wang <xiao.w.wang@intel.com>; Ziyang Xuan <xuanziyang2@huawei.com>; Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>; Guoyang Zhou <zhouguoyang@huawei.com>; Beilei Xing <beilei.xing@intel.com>; Jingjing Wu <jingjing.wu@intel.com>; Qiming Yang <qiming.yang@intel.com>; Konstantin Ananyev <konstantin.ananyev@intel.com>; Shijith Thotton <sthotton@marvell.com>; Srisivasubramanian Srinivasan <srinivasan@marvell.com>; Matan Azrad <matan@mellanox.com>; Shahaf Shuler <shahafs@mellanox.com>; Viacheslav Ovsiienko <viacheslavo@mellanox.com>; Stephen Hemminger <sthemmin@microsoft.com>; K. Y. Srinivasan <kys@microsoft.com>; Haiyang Zhang <haiyangz@microsoft.com>; Alejandro Lucero <alejandro.lucero@netronome.com>; Nithin Kumar Dabilpuram <ndabilpuram@marvell.com>; Kiran Kumar Kokkilagadda <kirankumark@marvell.com>; Rasesh Mody <rmody@marvell.com>; Shahed Shaikh <shshaikh@marvell.com>; Maciej Czekaj <mczekaj@marvell.com>; Yong Wang <yongwang@vmware.com>
Cc: dev@dpdk.org; Pavan Nikhilesh Bhagavatula <pbhagavatula@marvell.com>
Subject: [dpdk-dev] [PATCH v15 4/7] drivers/net: update Rx RSS hash offload capabilities

From: Pavan Nikhilesh <pbhagavatula@marvell.com>

Add DEV_RX_OFFLOAD_RSS_HASH flag for all PMDs that support RSS hash delivery.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Hemant Agrawal <hemant.agrawal@nxp.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
---
 drivers/net/bnxt/bnxt_ethdev.c       |  8 +++++++-
 drivers/net/cxgbe/cxgbe.h            |  3 ++-
 drivers/net/cxgbe/cxgbe_ethdev.c     |  5 +++++
 drivers/net/dpaa/dpaa_ethdev.c       |  3 ++-
 drivers/net/dpaa2/dpaa2_ethdev.c     |  1 +
 drivers/net/e1000/igb_ethdev.c       |  6 ++++++
 drivers/net/e1000/igb_rxtx.c         |  3 ++-
 drivers/net/enic/enic_ethdev.c       |  5 +++++
 drivers/net/enic/enic_res.c          |  3 ++-
 drivers/net/fm10k/fm10k_ethdev.c     |  6 +++++-
 drivers/net/hinic/hinic_pmd_ethdev.c |  6 +++++-
 drivers/net/i40e/i40e_ethdev.c       |  6 +++++-
 drivers/net/iavf/iavf_ethdev.c       |  6 +++++-
 drivers/net/ice/ice_ethdev.c         |  6 +++++-
 drivers/net/ixgbe/ixgbe_ethdev.c     |  7 +++++++
 drivers/net/ixgbe/ixgbe_rxtx.c       |  3 ++-
 drivers/net/liquidio/lio_ethdev.c    |  7 ++++++-
 drivers/net/mlx4/mlx4.c              |  3 +++
 drivers/net/mlx4/mlx4_rxq.c          |  3 ++-
 drivers/net/mlx5/mlx5_ethdev.c       |  4 ++++
 drivers/net/mlx5/mlx5_rxq.c          |  3 ++-
 drivers/net/netvsc/hn_ethdev.c       |  3 +++
 drivers/net/netvsc/hn_rndis.c        |  3 ++-
 drivers/net/nfp/nfp_net.c            |  6 +++++-
 drivers/net/octeontx2/otx2_ethdev.c  |  3 ++-  drivers/net/octeontx2/otx2_ethdev.h  | 15 ++++++++-------
 drivers/net/qede/qede_ethdev.c       |  6 +++++-
 drivers/net/sfc/sfc_ef10_essb_rx.c   |  3 ++-
 drivers/net/sfc/sfc_ef10_rx.c        |  3 ++-
 drivers/net/sfc/sfc_rx.c             |  7 ++++++-
 drivers/net/thunderx/nicvf_ethdev.c  |  3 +++  drivers/net/thunderx/nicvf_ethdev.h  |  3 ++-  drivers/net/vmxnet3/vmxnet3_ethdev.c |  6 +++++-
 33 files changed, 128 insertions(+), 30 deletions(-)

diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 7d9459f0a..01d48f47c 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -123,7 +123,8 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
 				     DEV_RX_OFFLOAD_KEEP_CRC | \
 				     DEV_RX_OFFLOAD_VLAN_EXTEND | \
 				     DEV_RX_OFFLOAD_TCP_LRO | \
-				     DEV_RX_OFFLOAD_SCATTER)
+				     DEV_RX_OFFLOAD_SCATTER | \
+				     DEV_RX_OFFLOAD_RSS_HASH)
 
 static int bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask);  static void bnxt_print_link_info(struct rte_eth_dev *eth_dev); @@ -689,6 +690,11 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
 	bp->rx_cp_nr_rings = bp->rx_nr_rings;
 	bp->tx_cp_nr_rings = bp->tx_nr_rings;
 
+	if (!(rx_offloads & DEV_RX_OFFLOAD_RSS_HASH)) {
+		rx_offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+		eth_dev->data->dev_conf.rxmode.offloads = rx_offloads;
+	}
+
 	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
 		eth_dev->data->mtu =
 			eth_dev->data->dev_conf.rxmode.max_rx_pkt_len - diff --git a/drivers/net/cxgbe/cxgbe.h b/drivers/net/cxgbe/cxgbe.h index ed1be3559..6c1f73ac4 100644
--- a/drivers/net/cxgbe/cxgbe.h
+++ b/drivers/net/cxgbe/cxgbe.h
@@ -47,7 +47,8 @@
 			   DEV_RX_OFFLOAD_UDP_CKSUM | \
 			   DEV_RX_OFFLOAD_TCP_CKSUM | \
 			   DEV_RX_OFFLOAD_JUMBO_FRAME | \
-			   DEV_RX_OFFLOAD_SCATTER)
+			   DEV_RX_OFFLOAD_SCATTER | \
+			   DEV_RX_OFFLOAD_RSS_HASH)
 
 
 /* Common PF and VF devargs */
diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c
index 615dda607..6df127087 100644
--- a/drivers/net/cxgbe/cxgbe_ethdev.c
+++ b/drivers/net/cxgbe/cxgbe_ethdev.c
@@ -426,6 +426,11 @@ int cxgbe_dev_configure(struct rte_eth_dev *eth_dev)
 
 	CXGBE_FUNC_TRACE();
 
+	if (!(eth_dev->data->dev_conf.rxmode.offloads &
+				DEV_RX_OFFLOAD_RSS_HASH))
+		eth_dev->data->dev_conf.rxmode.offloads |=
+							DEV_RX_OFFLOAD_RSS_HASH;
+
 	if (!(adapter->flags & FW_QUEUE_BOUND)) {
 		err = cxgbe_setup_sge_fwevtq(adapter);
 		if (err)
diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c index caf255d67..096da752d 100644
--- a/drivers/net/dpaa/dpaa_ethdev.c
+++ b/drivers/net/dpaa/dpaa_ethdev.c
@@ -56,7 +56,8 @@ static uint64_t dev_rx_offloads_nodis =
 		DEV_RX_OFFLOAD_IPV4_CKSUM |
 		DEV_RX_OFFLOAD_UDP_CKSUM |
 		DEV_RX_OFFLOAD_TCP_CKSUM |
-		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
+		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
+		DEV_RX_OFFLOAD_RSS_HASH;
 
 /* Supported Tx offloads */
 static uint64_t dev_tx_offloads_sup =
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index 03131b903..eea31f254 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -45,6 +45,7 @@ static uint64_t dev_rx_offloads_sup =
 
 /* Rx offloads which cannot be disabled */  static uint64_t dev_rx_offloads_nodis =
+		DEV_RX_OFFLOAD_RSS_HASH |
 		DEV_RX_OFFLOAD_SCATTER;
 
 /* Supported Tx offloads */
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c index ce7c9e664..22665b51c 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -1182,6 +1182,9 @@ eth_igb_configure(struct rte_eth_dev *dev)
 
 	PMD_INIT_FUNC_TRACE();
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* multipe queue mode checking */
 	ret  = igb_check_mq_mode(dev);
 	if (ret != 0) {
@@ -3255,6 +3258,9 @@ igbvf_dev_configure(struct rte_eth_dev *dev)
 	PMD_INIT_LOG(DEBUG, "Configured Virtual Function port id: %d",
 		     dev->data->port_id);
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/*
 	 * VF has no ability to enable/disable HW CRC
 	 * Keep the persistent behavior the same as Host PF diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c index c5606de5d..684fa4ad8 100644
--- a/drivers/net/e1000/igb_rxtx.c
+++ b/drivers/net/e1000/igb_rxtx.c
@@ -1646,7 +1646,8 @@ igb_get_rx_port_offloads_capa(struct rte_eth_dev *dev)
 			  DEV_RX_OFFLOAD_TCP_CKSUM   |
 			  DEV_RX_OFFLOAD_JUMBO_FRAME |
 			  DEV_RX_OFFLOAD_KEEP_CRC    |
-			  DEV_RX_OFFLOAD_SCATTER;
+			  DEV_RX_OFFLOAD_SCATTER     |
+			  DEV_RX_OFFLOAD_RSS_HASH;
 
 	return rx_offload_capa;
 }
diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c index 12c59a3c5..d2d1488d9 100644
--- a/drivers/net/enic/enic_ethdev.c
+++ b/drivers/net/enic/enic_ethdev.c
@@ -405,6 +405,11 @@ static int enicpmd_dev_configure(struct rte_eth_dev *eth_dev)
 		return ret;
 	}
 
+	if (!(eth_dev->data->dev_conf.rxmode.offloads &
+						DEV_RX_OFFLOAD_RSS_HASH))
+		eth_dev->data->dev_conf.rxmode.offloads |=
+						DEV_RX_OFFLOAD_RSS_HASH;
+
 	enic->mc_count = 0;
 	enic->hw_ip_checksum = !!(eth_dev->data->dev_conf.rxmode.offloads &
 				  DEV_RX_OFFLOAD_CHECKSUM);
diff --git a/drivers/net/enic/enic_res.c b/drivers/net/enic/enic_res.c index f403a0b66..7c3c270a2 100644
--- a/drivers/net/enic/enic_res.c
+++ b/drivers/net/enic/enic_res.c
@@ -205,7 +205,8 @@ int enic_get_vnic_config(struct enic *enic)
 		DEV_RX_OFFLOAD_VLAN_STRIP |
 		DEV_RX_OFFLOAD_IPV4_CKSUM |
 		DEV_RX_OFFLOAD_UDP_CKSUM |
-		DEV_RX_OFFLOAD_TCP_CKSUM;
+		DEV_RX_OFFLOAD_TCP_CKSUM |
+		DEV_RX_OFFLOAD_RSS_HASH;
 	enic->tx_offload_mask =
 		PKT_TX_IPV6 |
 		PKT_TX_IPV4 |
diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
index 99c4366e4..2e834130d 100644
--- a/drivers/net/fm10k/fm10k_ethdev.c
+++ b/drivers/net/fm10k/fm10k_ethdev.c
@@ -461,6 +461,9 @@ fm10k_dev_configure(struct rte_eth_dev *dev)
 
 	PMD_INIT_FUNC_TRACE();
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* multipe queue mode checking */
 	ret  = fm10k_check_mq_mode(dev);
 	if (ret != 0) {
@@ -1805,7 +1808,8 @@ static uint64_t fm10k_get_rx_port_offloads_capa(struct rte_eth_dev *dev)
 			   DEV_RX_OFFLOAD_UDP_CKSUM   |
 			   DEV_RX_OFFLOAD_TCP_CKSUM   |
 			   DEV_RX_OFFLOAD_JUMBO_FRAME |
-			   DEV_RX_OFFLOAD_HEADER_SPLIT);
+			   DEV_RX_OFFLOAD_HEADER_SPLIT |
+			   DEV_RX_OFFLOAD_RSS_HASH);
 }
 
 static int
diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c
index 9f37a404b..6673777e9 100644
--- a/drivers/net/hinic/hinic_pmd_ethdev.c
+++ b/drivers/net/hinic/hinic_pmd_ethdev.c
@@ -318,6 +318,9 @@ static int hinic_dev_configure(struct rte_eth_dev *dev)
 		return -EINVAL;
 	}
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* mtu size is 256~9600 */
 	if (dev->data->dev_conf.rxmode.max_rx_pkt_len < HINIC_MIN_FRAME_SIZE ||
 	    dev->data->dev_conf.rxmode.max_rx_pkt_len > @@ -740,7 +743,8 @@ hinic_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
 				DEV_RX_OFFLOAD_VLAN_FILTER |
 				DEV_RX_OFFLOAD_SCATTER |
 				DEV_RX_OFFLOAD_JUMBO_FRAME |
-				DEV_RX_OFFLOAD_TCP_LRO;
+				DEV_RX_OFFLOAD_TCP_LRO |
+				DEV_RX_OFFLOAD_RSS_HASH;
 
 	info->tx_queue_offload_capa = 0;
 	info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT | diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 77a46832c..78fea04f8 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -1812,6 +1812,9 @@ i40e_dev_configure(struct rte_eth_dev *dev)
 	ad->tx_simple_allowed = true;
 	ad->tx_vec_allowed = true;
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* Only legacy filter API needs the following fdir config. So when the
 	 * legacy filter API is deprecated, the following codes should also be
 	 * removed.
@@ -3613,7 +3616,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 		DEV_RX_OFFLOAD_SCATTER |
 		DEV_RX_OFFLOAD_VLAN_EXTEND |
 		DEV_RX_OFFLOAD_VLAN_FILTER |
-		DEV_RX_OFFLOAD_JUMBO_FRAME;
+		DEV_RX_OFFLOAD_JUMBO_FRAME |
+		DEV_RX_OFFLOAD_RSS_HASH;
 
 	dev_info->tx_queue_offload_capa = DEV_TX_OFFLOAD_MBUF_FAST_FREE;
 	dev_info->tx_offload_capa =
diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index eebc49ade..172c3f6ac 100644
--- a/drivers/net/iavf/iavf_ethdev.c
+++ b/drivers/net/iavf/iavf_ethdev.c
@@ -147,6 +147,9 @@ iavf_dev_configure(struct rte_eth_dev *dev)
 	ad->rx_vec_allowed = true;
 	ad->tx_vec_allowed = true;
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* Vlan stripping setting */
 	if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN) {
 		if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_VLAN_STRIP) @@ -522,7 +525,8 @@ iavf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
 		DEV_RX_OFFLOAD_SCATTER |
 		DEV_RX_OFFLOAD_JUMBO_FRAME |
-		DEV_RX_OFFLOAD_VLAN_FILTER;
+		DEV_RX_OFFLOAD_VLAN_FILTER |
+		DEV_RX_OFFLOAD_RSS_HASH;
 	dev_info->tx_offload_capa =
 		DEV_TX_OFFLOAD_VLAN_INSERT |
 		DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c index d74675842..8ff96a96e 100644
--- a/drivers/net/ice/ice_ethdev.c
+++ b/drivers/net/ice/ice_ethdev.c
@@ -2357,6 +2357,9 @@ ice_dev_configure(struct rte_eth_dev *dev)
 	ad->rx_bulk_alloc_allowed = true;
 	ad->tx_simple_allowed = true;
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	return 0;
 }
 
@@ -2800,7 +2803,8 @@ ice_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 			DEV_RX_OFFLOAD_TCP_CKSUM |
 			DEV_RX_OFFLOAD_QINQ_STRIP |
 			DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
-			DEV_RX_OFFLOAD_VLAN_EXTEND;
+			DEV_RX_OFFLOAD_VLAN_EXTEND |
+			DEV_RX_OFFLOAD_RSS_HASH;
 		dev_info->tx_offload_capa |=
 			DEV_TX_OFFLOAD_QINQ_INSERT |
 			DEV_TX_OFFLOAD_IPV4_CKSUM |
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index dbce7a80e..a299c1c74 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -2402,6 +2402,10 @@ ixgbe_dev_configure(struct rte_eth_dev *dev)
 	int ret;
 
 	PMD_INIT_FUNC_TRACE();
+
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* multipe queue mode checking */
 	ret  = ixgbe_check_mq_mode(dev);
 	if (ret != 0) {
@@ -5140,6 +5144,9 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev)
 	PMD_INIT_LOG(DEBUG, "Configured Virtual Function port id: %d",
 		     dev->data->port_id);
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/*
 	 * VF has no ability to enable/disable HW CRC
 	 * Keep the persistent behavior the same as Host PF diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c index edcfa60ce..fa572d184 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx.c
@@ -2872,7 +2872,8 @@ ixgbe_get_rx_port_offloads(struct rte_eth_dev *dev)
 		   DEV_RX_OFFLOAD_KEEP_CRC    |
 		   DEV_RX_OFFLOAD_JUMBO_FRAME |
 		   DEV_RX_OFFLOAD_VLAN_FILTER |
-		   DEV_RX_OFFLOAD_SCATTER;
+		   DEV_RX_OFFLOAD_SCATTER |
+		   DEV_RX_OFFLOAD_RSS_HASH;
 
 	if (hw->mac.type == ixgbe_mac_82598EB)
 		offloads |= DEV_RX_OFFLOAD_VLAN_STRIP; diff --git a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c
index ec01343f1..d873b6ff4 100644
--- a/drivers/net/liquidio/lio_ethdev.c
+++ b/drivers/net/liquidio/lio_ethdev.c
@@ -412,7 +412,8 @@ lio_dev_info_get(struct rte_eth_dev *eth_dev,
 	devinfo->rx_offload_capa = (DEV_RX_OFFLOAD_IPV4_CKSUM		|
 				    DEV_RX_OFFLOAD_UDP_CKSUM		|
 				    DEV_RX_OFFLOAD_TCP_CKSUM		|
-				    DEV_RX_OFFLOAD_VLAN_STRIP);
+				    DEV_RX_OFFLOAD_VLAN_STRIP		|
+				    DEV_RX_OFFLOAD_RSS_HASH);
 	devinfo->tx_offload_capa = (DEV_TX_OFFLOAD_IPV4_CKSUM		|
 				    DEV_TX_OFFLOAD_UDP_CKSUM		|
 				    DEV_TX_OFFLOAD_TCP_CKSUM		|
@@ -1735,6 +1736,10 @@ lio_dev_configure(struct rte_eth_dev *eth_dev)
 
 	PMD_INIT_FUNC_TRACE();
 
+	if (!(eth_dev->data->dev_conf.rxmode.offloads &
+						DEV_RX_OFFLOAD_RSS_HASH))
+		eth_dev->data->dev_conf.rxmode.offloads |=
+						DEV_RX_OFFLOAD_RSS_HASH;
 	/* Inform firmware about change in number of queues to use.
 	 * Disable IO queues and reset registers for re-configuration.
 	 */
diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index 931e4f4fe..6df2f6f90 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -248,6 +248,9 @@ mlx4_dev_configure(struct rte_eth_dev *dev)
 	struct rte_flow_error error;
 	int ret;
 
+	if (!(dev->data->dev_conf.rxmode.offload & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offload |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* Prepare internal flow rules. */
 	ret = mlx4_flow_sync(priv, &error);
 	if (ret) {
diff --git a/drivers/net/mlx4/mlx4_rxq.c b/drivers/net/mlx4/mlx4_rxq.c index f45c1ff85..4a6fbd922 100644
--- a/drivers/net/mlx4/mlx4_rxq.c
+++ b/drivers/net/mlx4/mlx4_rxq.c
@@ -685,7 +685,8 @@ mlx4_get_rx_queue_offloads(struct mlx4_priv *priv)  {
 	uint64_t offloads = DEV_RX_OFFLOAD_SCATTER |
 			    DEV_RX_OFFLOAD_KEEP_CRC |
-			    DEV_RX_OFFLOAD_JUMBO_FRAME;
+			    DEV_RX_OFFLOAD_JUMBO_FRAME |
+			    DEV_RX_OFFLOAD_RSS_HASH;
 
 	if (priv->hw_csum)
 		offloads |= DEV_RX_OFFLOAD_CHECKSUM;
diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index 2278b24c0..e87d52ea1 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -407,6 +407,10 @@ mlx5_dev_configure(struct rte_eth_dev *dev)
 		rte_errno = ENOMEM;
 		return -rte_errno;
 	}
+
+	if (!(dev->data->dev_conf.rxmode.offload & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offload |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	memcpy(priv->rss_conf.rss_key,
 	       use_app_rss_key ?
 	       dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key :
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c index f0ab8438d..c8e1fc4b6 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -368,7 +368,8 @@ mlx5_get_rx_queue_offloads(struct rte_eth_dev *dev)
 	struct mlx5_dev_config *config = &priv->config;
 	uint64_t offloads = (DEV_RX_OFFLOAD_SCATTER |
 			     DEV_RX_OFFLOAD_TIMESTAMP |
-			     DEV_RX_OFFLOAD_JUMBO_FRAME);
+			     DEV_RX_OFFLOAD_JUMBO_FRAME |
+			     DEV_RX_OFFLOAD_RSS_HASH);
 
 	if (config->hw_fcs_strip)
 		offloads |= DEV_RX_OFFLOAD_KEEP_CRC;
diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c index eed8dece9..5c027e1a4 100644
--- a/drivers/net/netvsc/hn_ethdev.c
+++ b/drivers/net/netvsc/hn_ethdev.c
@@ -532,6 +532,9 @@ static int hn_dev_configure(struct rte_eth_dev *dev)
 
 	PMD_INIT_FUNC_TRACE();
 
+	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev_conf->rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	unsupported = txmode->offloads & ~HN_TX_OFFLOAD_CAPS;
 	if (unsupported) {
 		PMD_DRV_LOG(NOTICE,
diff --git a/drivers/net/netvsc/hn_rndis.c b/drivers/net/netvsc/hn_rndis.c index a67bc7a79..2b4714042 100644
--- a/drivers/net/netvsc/hn_rndis.c
+++ b/drivers/net/netvsc/hn_rndis.c
@@ -897,7 +897,8 @@ int hn_rndis_get_offload(struct hn_data *hv,
 	    == HN_NDIS_LSOV2_CAP_IP6)
 		dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO;
 
-	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP;
+	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP |
+				    DEV_RX_OFFLOAD_RSS_HASH;
 
 	if (hwcaps.ndis_csum.ndis_ip4_rxcsum & NDIS_RXCSUM_CAP_IP4)
 		dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_IPV4_CKSUM; diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c index 22a8b2d19..e288a7f7e 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -407,6 +407,9 @@ nfp_net_configure(struct rte_eth_dev *dev)
 	rxmode = &dev_conf->rxmode;
 	txmode = &dev_conf->txmode;
 
+	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* Checking TX mode */
 	if (txmode->mq_mode) {
 		PMD_INIT_LOG(INFO, "TX mq_mode DCB and VMDq not supported"); @@ -1236,7 +1239,8 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 					     DEV_RX_OFFLOAD_UDP_CKSUM |
 					     DEV_RX_OFFLOAD_TCP_CKSUM;
 
-	dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME;
+	dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME |
+				     DEV_RX_OFFLOAD_RSS_HASH;
 
 	if (hw->cap & NFP_NET_CFG_CTRL_TXVLAN)
 		dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT; diff --git a/drivers/net/octeontx2/otx2_ethdev.c b/drivers/net/octeontx2/otx2_ethdev.c
index 62291c698..d6e8ae745 100644
--- a/drivers/net/octeontx2/otx2_ethdev.c
+++ b/drivers/net/octeontx2/otx2_ethdev.c
@@ -575,7 +575,8 @@ nix_rx_offload_flags(struct rte_eth_dev *eth_dev)
 	struct rte_eth_rxmode *rxmode = &conf->rxmode;
 	uint16_t flags = 0;
 
-	if (rxmode->mq_mode == ETH_MQ_RX_RSS)
+	if (rxmode->mq_mode == ETH_MQ_RX_RSS &&
+			(dev->rx_offloads & DEV_RX_OFFLOAD_RSS_HASH))
 		flags |= NIX_RX_OFFLOAD_RSS_F;
 
 	if (dev->rx_offloads & (DEV_RX_OFFLOAD_TCP_CKSUM | diff --git a/drivers/net/octeontx2/otx2_ethdev.h b/drivers/net/octeontx2/otx2_ethdev.h
index 4d9ed4870..d581240fe 100644
--- a/drivers/net/octeontx2/otx2_ethdev.h
+++ b/drivers/net/octeontx2/otx2_ethdev.h
@@ -122,8 +122,8 @@
 	DEV_TX_OFFLOAD_MT_LOCKFREE	| \
 	DEV_TX_OFFLOAD_VLAN_INSERT	| \
 	DEV_TX_OFFLOAD_QINQ_INSERT	| \
-	DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM | \
-	DEV_TX_OFFLOAD_OUTER_UDP_CKSUM  | \
+	DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM	| \
+	DEV_TX_OFFLOAD_OUTER_UDP_CKSUM	| \
 	DEV_TX_OFFLOAD_TCP_CKSUM	| \
 	DEV_TX_OFFLOAD_UDP_CKSUM	| \
 	DEV_TX_OFFLOAD_SCTP_CKSUM	| \
@@ -140,11 +140,12 @@
 	DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM | \
 	DEV_RX_OFFLOAD_SCATTER		| \
 	DEV_RX_OFFLOAD_JUMBO_FRAME	| \
-	DEV_RX_OFFLOAD_OUTER_UDP_CKSUM | \
-	DEV_RX_OFFLOAD_VLAN_STRIP | \
-	DEV_RX_OFFLOAD_VLAN_FILTER | \
-	DEV_RX_OFFLOAD_QINQ_STRIP | \
-	DEV_RX_OFFLOAD_TIMESTAMP)
+	DEV_RX_OFFLOAD_OUTER_UDP_CKSUM	| \
+	DEV_RX_OFFLOAD_VLAN_STRIP	| \
+	DEV_RX_OFFLOAD_VLAN_FILTER	| \
+	DEV_RX_OFFLOAD_QINQ_STRIP	| \
+	DEV_RX_OFFLOAD_TIMESTAMP	| \
+	DEV_RX_OFFLOAD_RSS_HASH)
 
 #define NIX_DEFAULT_RSS_CTX_GROUP  0
 #define NIX_DEFAULT_RSS_MCAM_IDX  -1
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c index 53fdfde9a..8cdf04eaf 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -1182,6 +1182,9 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
 
 	PMD_INIT_FUNC_TRACE(edev);
 
+	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* We need to have min 1 RX queue.There is no min check in
 	 * rte_eth_dev_configure(), so we are checking it here.
 	 */
@@ -1302,7 +1305,8 @@ qede_dev_info_get(struct rte_eth_dev *eth_dev,
 				     DEV_RX_OFFLOAD_SCATTER	|
 				     DEV_RX_OFFLOAD_JUMBO_FRAME |
 				     DEV_RX_OFFLOAD_VLAN_FILTER |
-				     DEV_RX_OFFLOAD_VLAN_STRIP);
+				     DEV_RX_OFFLOAD_VLAN_STRIP  |
+				     DEV_RX_OFFLOAD_RSS_HASH);
 	dev_info->rx_queue_offload_capa = 0;
 
 	/* TX offloads are on a per-packet basis, so it is applicable diff --git a/drivers/net/sfc/sfc_ef10_essb_rx.c b/drivers/net/sfc/sfc_ef10_essb_rx.c
index 63da807ea..d9d2ce6bd 100644
--- a/drivers/net/sfc/sfc_ef10_essb_rx.c
+++ b/drivers/net/sfc/sfc_ef10_essb_rx.c
@@ -715,7 +715,8 @@ struct sfc_dp_rx sfc_ef10_essb_rx = {
 	},
 	.features		= SFC_DP_RX_FEAT_FLOW_FLAG |
 				  SFC_DP_RX_FEAT_FLOW_MARK,
-	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM,
+	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM |
+				  DEV_RX_OFFLOAD_RSS_HASH,
 	.queue_offload_capa	= 0,
 	.get_dev_info		= sfc_ef10_essb_rx_get_dev_info,
 	.pool_ops_supported	= sfc_ef10_essb_rx_pool_ops_supported,
diff --git a/drivers/net/sfc/sfc_ef10_rx.c b/drivers/net/sfc/sfc_ef10_rx.c index f2fc6e70a..9e527b7fb 100644
--- a/drivers/net/sfc/sfc_ef10_rx.c
+++ b/drivers/net/sfc/sfc_ef10_rx.c
@@ -796,7 +796,8 @@ struct sfc_dp_rx sfc_ef10_rx = {
 	.features		= SFC_DP_RX_FEAT_MULTI_PROCESS |
 				  SFC_DP_RX_FEAT_INTR,
 	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM |
-				  DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM,
+				  DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
+				  DEV_RX_OFFLOAD_RSS_HASH,
 	.queue_offload_capa	= DEV_RX_OFFLOAD_SCATTER,
 	.get_dev_info		= sfc_ef10_rx_get_dev_info,
 	.qsize_up_rings		= sfc_ef10_rx_qsize_up_rings,
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c index e6809bb64..10fa1e5ff 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -617,7 +617,8 @@ struct sfc_dp_rx sfc_efx_rx = {
 		.hw_fw_caps	= 0,
 	},
 	.features		= SFC_DP_RX_FEAT_INTR,
-	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM,
+	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM |
+				  DEV_RX_OFFLOAD_RSS_HASH,
 	.queue_offload_capa	= DEV_RX_OFFLOAD_SCATTER,
 	.qsize_up_rings		= sfc_efx_rx_qsize_up_rings,
 	.qcreate		= sfc_efx_rx_qcreate,
@@ -1556,6 +1557,10 @@ sfc_rx_check_mode(struct sfc_adapter *sa, struct rte_eth_rxmode *rxmode)
 		rxmode->offloads |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
 	}
 
+	if ((offloads_supported & DEV_RX_OFFLOAD_RSS_HASH) &&
+	    (~rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	return rc;
 }
 
diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c
index b93d45712..28ee3e46d 100644
--- a/drivers/net/thunderx/nicvf_ethdev.c
+++ b/drivers/net/thunderx/nicvf_ethdev.c
@@ -1920,6 +1920,9 @@ nicvf_dev_configure(struct rte_eth_dev *dev)
 
 	PMD_INIT_FUNC_TRACE();
 
+	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	if (!rte_eal_has_hugepages()) {
 		PMD_INIT_LOG(INFO, "Huge page is not configured");
 		return -EINVAL;
diff --git a/drivers/net/thunderx/nicvf_ethdev.h b/drivers/net/thunderx/nicvf_ethdev.h
index c0bfbf848..391411799 100644
--- a/drivers/net/thunderx/nicvf_ethdev.h
+++ b/drivers/net/thunderx/nicvf_ethdev.h
@@ -41,7 +41,8 @@
 	DEV_RX_OFFLOAD_CHECKSUM    | \
 	DEV_RX_OFFLOAD_VLAN_STRIP  | \
 	DEV_RX_OFFLOAD_JUMBO_FRAME | \
-	DEV_RX_OFFLOAD_SCATTER)
+	DEV_RX_OFFLOAD_SCATTER     | \
+	DEV_RX_OFFLOAD_RSS_HASH)
 
 #define NICVF_DEFAULT_RX_FREE_THRESH    224
 #define NICVF_DEFAULT_TX_FREE_THRESH    224
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index d1faeaa81..5ef6ad43c 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -56,7 +56,8 @@
 	 DEV_RX_OFFLOAD_UDP_CKSUM |	\
 	 DEV_RX_OFFLOAD_TCP_CKSUM |	\
 	 DEV_RX_OFFLOAD_TCP_LRO |	\
-	 DEV_RX_OFFLOAD_JUMBO_FRAME)
+	 DEV_RX_OFFLOAD_JUMBO_FRAME |   \
+	 DEV_RX_OFFLOAD_RSS_HASH)
 
 static int eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev);  static int eth_vmxnet3_dev_uninit(struct rte_eth_dev *eth_dev); @@ -407,6 +408,9 @@ vmxnet3_dev_configure(struct rte_eth_dev *dev)
 
 	PMD_INIT_FUNC_TRACE();
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	if (dev->data->nb_tx_queues > VMXNET3_MAX_TX_QUEUES ||
 	    dev->data->nb_rx_queues > VMXNET3_MAX_RX_QUEUES) {
 		PMD_INIT_LOG(ERR, "ERROR: Number of queues not supported");
--
2.17.1
  
Thomas Monjalon Nov. 1, 2019, 10:22 p.m. UTC | #5
01/11/2019 12:11, Andrew Rybchenko:
> On 10/31/19 7:51 PM, Pavan Nikhilesh Bhagavatula wrote:
> > 
> >> 29/10/2019 16:37, pbhagavatula@marvell.com:
> >>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> >>>
> >>> Add DEV_RX_OFFLOAD_RSS_HASH flag for all PMDs that support RSS hash delivery.
> >>>
> >>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> >>> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> >>> Reviewed-by: Hemant Agrawal <hemant.agrawal@nxp.com>
> >>> Acked-by: Jerin Jacob <jerinj@marvell.com>
> >>> Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
> >>> ---
> >>> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> >>> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> >>
> >> Excuse me, I miss why you need a check before setting the bit.
> > 
> > Currently, none of the PMDs support disabling RSS_HASH (except octeontx2) since it involves 
> > adding an if check in Rx routine that might lead to perf impact.
> > So, we are implicitly enabling the offload for all the PMDs if an application decides to disable
> > RSS_HASH. In future if PMD maintainer decides to add this feature she/he can remove the check.
> 
> As I understand Thomas says that it is just sufficient to do:
>     dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> without any if before.
> 
> Yes, it is true since right now it looks a bit strange.
> I guess it is the result of code evolution. Initially
> it was logging inside if, but logging is moved to ethdev.
> 
> (Of course, it is true for such trivial checks only)

Yes exactly, this "if" can be removed in several places.
  
Andrew Rybchenko Nov. 3, 2019, 12:06 p.m. UTC | #6
On 11/1/19 8:49 PM, Liron Himi wrote:
> Hi,
>
> mvpp2 and mvneta PMDs are also support RSS hash.
> Please add them to the patch.

I've failed to find where mvpp2 and mvneta set PKT_RX_RSS_HASH.


> Regards,
> Liron
>
> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of pbhagavatula@marvell.com
> Sent: Tuesday, 29 October 2019 17:37
> To: ferruh.yigit@intel.com; arybchenko@solarflare.com; Jerin Jacob Kollanukkaran <jerinj@marvell.com>; Ajit Khaparde <ajit.khaparde@broadcom.com>; Somnath Kotur <somnath.kotur@broadcom.com>; Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>; Hemant Agrawal <hemant.agrawal@nxp.com>; Sachin Saxena <sachin.saxena@nxp.com>; Wenzhuo Lu <wenzhuo.lu@intel.com>; John Daley <johndale@cisco.com>; Hyong Youb Kim <hyonkim@cisco.com>; Qi Zhang <qi.z.zhang@intel.com>; Xiao Wang <xiao.w.wang@intel.com>; Ziyang Xuan <xuanziyang2@huawei.com>; Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>; Guoyang Zhou <zhouguoyang@huawei.com>; Beilei Xing <beilei.xing@intel.com>; Jingjing Wu <jingjing.wu@intel.com>; Qiming Yang <qiming.yang@intel.com>; Konstantin Ananyev <konstantin.ananyev@intel.com>; Shijith Thotton <sthotton@marvell.com>; Srisivasubramanian Srinivasan <srinivasan@marvell.com>; Matan Azrad <matan@mellanox.com>; Shahaf Shuler <shahafs@mellanox.com>; Viacheslav Ovsiienko <viacheslavo@mellanox.com>; Stephen Hemminger <sthemmin@microsoft.com>; K. Y. Srinivasan <kys@microsoft.com>; Haiyang Zhang <haiyangz@microsoft.com>; Alejandro Lucero <alejandro.lucero@netronome.com>; Nithin Kumar Dabilpuram <ndabilpuram@marvell.com>; Kiran Kumar Kokkilagadda <kirankumark@marvell.com>; Rasesh Mody <rmody@marvell.com>; Shahed Shaikh <shshaikh@marvell.com>; Maciej Czekaj <mczekaj@marvell.com>; Yong Wang <yongwang@vmware.com>
> Cc: dev@dpdk.org; Pavan Nikhilesh Bhagavatula <pbhagavatula@marvell.com>
> Subject: [dpdk-dev] [PATCH v15 4/7] drivers/net: update Rx RSS hash offload capabilities
>
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> Add DEV_RX_OFFLOAD_RSS_HASH flag for all PMDs that support RSS hash delivery.
>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> Reviewed-by: Hemant Agrawal <hemant.agrawal@nxp.com>
> Acked-by: Jerin Jacob <jerinj@marvell.com>
> Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
> ---
>   drivers/net/bnxt/bnxt_ethdev.c       |  8 +++++++-
>   drivers/net/cxgbe/cxgbe.h            |  3 ++-
>   drivers/net/cxgbe/cxgbe_ethdev.c     |  5 +++++
>   drivers/net/dpaa/dpaa_ethdev.c       |  3 ++-
>   drivers/net/dpaa2/dpaa2_ethdev.c     |  1 +
>   drivers/net/e1000/igb_ethdev.c       |  6 ++++++
>   drivers/net/e1000/igb_rxtx.c         |  3 ++-
>   drivers/net/enic/enic_ethdev.c       |  5 +++++
>   drivers/net/enic/enic_res.c          |  3 ++-
>   drivers/net/fm10k/fm10k_ethdev.c     |  6 +++++-
>   drivers/net/hinic/hinic_pmd_ethdev.c |  6 +++++-
>   drivers/net/i40e/i40e_ethdev.c       |  6 +++++-
>   drivers/net/iavf/iavf_ethdev.c       |  6 +++++-
>   drivers/net/ice/ice_ethdev.c         |  6 +++++-
>   drivers/net/ixgbe/ixgbe_ethdev.c     |  7 +++++++
>   drivers/net/ixgbe/ixgbe_rxtx.c       |  3 ++-
>   drivers/net/liquidio/lio_ethdev.c    |  7 ++++++-
>   drivers/net/mlx4/mlx4.c              |  3 +++
>   drivers/net/mlx4/mlx4_rxq.c          |  3 ++-
>   drivers/net/mlx5/mlx5_ethdev.c       |  4 ++++
>   drivers/net/mlx5/mlx5_rxq.c          |  3 ++-
>   drivers/net/netvsc/hn_ethdev.c       |  3 +++
>   drivers/net/netvsc/hn_rndis.c        |  3 ++-
>   drivers/net/nfp/nfp_net.c            |  6 +++++-
>   drivers/net/octeontx2/otx2_ethdev.c  |  3 ++-  drivers/net/octeontx2/otx2_ethdev.h  | 15 ++++++++-------
>   drivers/net/qede/qede_ethdev.c       |  6 +++++-
>   drivers/net/sfc/sfc_ef10_essb_rx.c   |  3 ++-
>   drivers/net/sfc/sfc_ef10_rx.c        |  3 ++-
>   drivers/net/sfc/sfc_rx.c             |  7 ++++++-
>   drivers/net/thunderx/nicvf_ethdev.c  |  3 +++  drivers/net/thunderx/nicvf_ethdev.h  |  3 ++-  drivers/net/vmxnet3/vmxnet3_ethdev.c |  6 +++++-
>   33 files changed, 128 insertions(+), 30 deletions(-)
>
> diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 7d9459f0a..01d48f47c 100644
> --- a/drivers/net/bnxt/bnxt_ethdev.c
> +++ b/drivers/net/bnxt/bnxt_ethdev.c
> @@ -123,7 +123,8 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
>   				     DEV_RX_OFFLOAD_KEEP_CRC | \
>   				     DEV_RX_OFFLOAD_VLAN_EXTEND | \
>   				     DEV_RX_OFFLOAD_TCP_LRO | \
> -				     DEV_RX_OFFLOAD_SCATTER)
> +				     DEV_RX_OFFLOAD_SCATTER | \
> +				     DEV_RX_OFFLOAD_RSS_HASH)
>   
>   static int bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask);  static void bnxt_print_link_info(struct rte_eth_dev *eth_dev); @@ -689,6 +690,11 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
>   	bp->rx_cp_nr_rings = bp->rx_nr_rings;
>   	bp->tx_cp_nr_rings = bp->tx_nr_rings;
>   
> +	if (!(rx_offloads & DEV_RX_OFFLOAD_RSS_HASH)) {
> +		rx_offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +		eth_dev->data->dev_conf.rxmode.offloads = rx_offloads;
> +	}
> +
>   	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
>   		eth_dev->data->mtu =
>   			eth_dev->data->dev_conf.rxmode.max_rx_pkt_len - diff --git a/drivers/net/cxgbe/cxgbe.h b/drivers/net/cxgbe/cxgbe.h index ed1be3559..6c1f73ac4 100644
> --- a/drivers/net/cxgbe/cxgbe.h
> +++ b/drivers/net/cxgbe/cxgbe.h
> @@ -47,7 +47,8 @@
>   			   DEV_RX_OFFLOAD_UDP_CKSUM | \
>   			   DEV_RX_OFFLOAD_TCP_CKSUM | \
>   			   DEV_RX_OFFLOAD_JUMBO_FRAME | \
> -			   DEV_RX_OFFLOAD_SCATTER)
> +			   DEV_RX_OFFLOAD_SCATTER | \
> +			   DEV_RX_OFFLOAD_RSS_HASH)
>   
>   
>   /* Common PF and VF devargs */
> diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c
> index 615dda607..6df127087 100644
> --- a/drivers/net/cxgbe/cxgbe_ethdev.c
> +++ b/drivers/net/cxgbe/cxgbe_ethdev.c
> @@ -426,6 +426,11 @@ int cxgbe_dev_configure(struct rte_eth_dev *eth_dev)
>   
>   	CXGBE_FUNC_TRACE();
>   
> +	if (!(eth_dev->data->dev_conf.rxmode.offloads &
> +				DEV_RX_OFFLOAD_RSS_HASH))
> +		eth_dev->data->dev_conf.rxmode.offloads |=
> +							DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	if (!(adapter->flags & FW_QUEUE_BOUND)) {
>   		err = cxgbe_setup_sge_fwevtq(adapter);
>   		if (err)
> diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c index caf255d67..096da752d 100644
> --- a/drivers/net/dpaa/dpaa_ethdev.c
> +++ b/drivers/net/dpaa/dpaa_ethdev.c
> @@ -56,7 +56,8 @@ static uint64_t dev_rx_offloads_nodis =
>   		DEV_RX_OFFLOAD_IPV4_CKSUM |
>   		DEV_RX_OFFLOAD_UDP_CKSUM |
>   		DEV_RX_OFFLOAD_TCP_CKSUM |
> -		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
> +		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
> +		DEV_RX_OFFLOAD_RSS_HASH;
>   
>   /* Supported Tx offloads */
>   static uint64_t dev_tx_offloads_sup =
> diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
> index 03131b903..eea31f254 100644
> --- a/drivers/net/dpaa2/dpaa2_ethdev.c
> +++ b/drivers/net/dpaa2/dpaa2_ethdev.c
> @@ -45,6 +45,7 @@ static uint64_t dev_rx_offloads_sup =
>   
>   /* Rx offloads which cannot be disabled */  static uint64_t dev_rx_offloads_nodis =
> +		DEV_RX_OFFLOAD_RSS_HASH |
>   		DEV_RX_OFFLOAD_SCATTER;
>   
>   /* Supported Tx offloads */
> diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c index ce7c9e664..22665b51c 100644
> --- a/drivers/net/e1000/igb_ethdev.c
> +++ b/drivers/net/e1000/igb_ethdev.c
> @@ -1182,6 +1182,9 @@ eth_igb_configure(struct rte_eth_dev *dev)
>   
>   	PMD_INIT_FUNC_TRACE();
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* multipe queue mode checking */
>   	ret  = igb_check_mq_mode(dev);
>   	if (ret != 0) {
> @@ -3255,6 +3258,9 @@ igbvf_dev_configure(struct rte_eth_dev *dev)
>   	PMD_INIT_LOG(DEBUG, "Configured Virtual Function port id: %d",
>   		     dev->data->port_id);
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/*
>   	 * VF has no ability to enable/disable HW CRC
>   	 * Keep the persistent behavior the same as Host PF diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c index c5606de5d..684fa4ad8 100644
> --- a/drivers/net/e1000/igb_rxtx.c
> +++ b/drivers/net/e1000/igb_rxtx.c
> @@ -1646,7 +1646,8 @@ igb_get_rx_port_offloads_capa(struct rte_eth_dev *dev)
>   			  DEV_RX_OFFLOAD_TCP_CKSUM   |
>   			  DEV_RX_OFFLOAD_JUMBO_FRAME |
>   			  DEV_RX_OFFLOAD_KEEP_CRC    |
> -			  DEV_RX_OFFLOAD_SCATTER;
> +			  DEV_RX_OFFLOAD_SCATTER     |
> +			  DEV_RX_OFFLOAD_RSS_HASH;
>   
>   	return rx_offload_capa;
>   }
> diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c index 12c59a3c5..d2d1488d9 100644
> --- a/drivers/net/enic/enic_ethdev.c
> +++ b/drivers/net/enic/enic_ethdev.c
> @@ -405,6 +405,11 @@ static int enicpmd_dev_configure(struct rte_eth_dev *eth_dev)
>   		return ret;
>   	}
>   
> +	if (!(eth_dev->data->dev_conf.rxmode.offloads &
> +						DEV_RX_OFFLOAD_RSS_HASH))
> +		eth_dev->data->dev_conf.rxmode.offloads |=
> +						DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	enic->mc_count = 0;
>   	enic->hw_ip_checksum = !!(eth_dev->data->dev_conf.rxmode.offloads &
>   				  DEV_RX_OFFLOAD_CHECKSUM);
> diff --git a/drivers/net/enic/enic_res.c b/drivers/net/enic/enic_res.c index f403a0b66..7c3c270a2 100644
> --- a/drivers/net/enic/enic_res.c
> +++ b/drivers/net/enic/enic_res.c
> @@ -205,7 +205,8 @@ int enic_get_vnic_config(struct enic *enic)
>   		DEV_RX_OFFLOAD_VLAN_STRIP |
>   		DEV_RX_OFFLOAD_IPV4_CKSUM |
>   		DEV_RX_OFFLOAD_UDP_CKSUM |
> -		DEV_RX_OFFLOAD_TCP_CKSUM;
> +		DEV_RX_OFFLOAD_TCP_CKSUM |
> +		DEV_RX_OFFLOAD_RSS_HASH;
>   	enic->tx_offload_mask =
>   		PKT_TX_IPV6 |
>   		PKT_TX_IPV4 |
> diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
> index 99c4366e4..2e834130d 100644
> --- a/drivers/net/fm10k/fm10k_ethdev.c
> +++ b/drivers/net/fm10k/fm10k_ethdev.c
> @@ -461,6 +461,9 @@ fm10k_dev_configure(struct rte_eth_dev *dev)
>   
>   	PMD_INIT_FUNC_TRACE();
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* multipe queue mode checking */
>   	ret  = fm10k_check_mq_mode(dev);
>   	if (ret != 0) {
> @@ -1805,7 +1808,8 @@ static uint64_t fm10k_get_rx_port_offloads_capa(struct rte_eth_dev *dev)
>   			   DEV_RX_OFFLOAD_UDP_CKSUM   |
>   			   DEV_RX_OFFLOAD_TCP_CKSUM   |
>   			   DEV_RX_OFFLOAD_JUMBO_FRAME |
> -			   DEV_RX_OFFLOAD_HEADER_SPLIT);
> +			   DEV_RX_OFFLOAD_HEADER_SPLIT |
> +			   DEV_RX_OFFLOAD_RSS_HASH);
>   }
>   
>   static int
> diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c
> index 9f37a404b..6673777e9 100644
> --- a/drivers/net/hinic/hinic_pmd_ethdev.c
> +++ b/drivers/net/hinic/hinic_pmd_ethdev.c
> @@ -318,6 +318,9 @@ static int hinic_dev_configure(struct rte_eth_dev *dev)
>   		return -EINVAL;
>   	}
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* mtu size is 256~9600 */
>   	if (dev->data->dev_conf.rxmode.max_rx_pkt_len < HINIC_MIN_FRAME_SIZE ||
>   	    dev->data->dev_conf.rxmode.max_rx_pkt_len > @@ -740,7 +743,8 @@ hinic_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
>   				DEV_RX_OFFLOAD_VLAN_FILTER |
>   				DEV_RX_OFFLOAD_SCATTER |
>   				DEV_RX_OFFLOAD_JUMBO_FRAME |
> -				DEV_RX_OFFLOAD_TCP_LRO;
> +				DEV_RX_OFFLOAD_TCP_LRO |
> +				DEV_RX_OFFLOAD_RSS_HASH;
>   
>   	info->tx_queue_offload_capa = 0;
>   	info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT | diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 77a46832c..78fea04f8 100644
> --- a/drivers/net/i40e/i40e_ethdev.c
> +++ b/drivers/net/i40e/i40e_ethdev.c
> @@ -1812,6 +1812,9 @@ i40e_dev_configure(struct rte_eth_dev *dev)
>   	ad->tx_simple_allowed = true;
>   	ad->tx_vec_allowed = true;
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* Only legacy filter API needs the following fdir config. So when the
>   	 * legacy filter API is deprecated, the following codes should also be
>   	 * removed.
> @@ -3613,7 +3616,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>   		DEV_RX_OFFLOAD_SCATTER |
>   		DEV_RX_OFFLOAD_VLAN_EXTEND |
>   		DEV_RX_OFFLOAD_VLAN_FILTER |
> -		DEV_RX_OFFLOAD_JUMBO_FRAME;
> +		DEV_RX_OFFLOAD_JUMBO_FRAME |
> +		DEV_RX_OFFLOAD_RSS_HASH;
>   
>   	dev_info->tx_queue_offload_capa = DEV_TX_OFFLOAD_MBUF_FAST_FREE;
>   	dev_info->tx_offload_capa =
> diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index eebc49ade..172c3f6ac 100644
> --- a/drivers/net/iavf/iavf_ethdev.c
> +++ b/drivers/net/iavf/iavf_ethdev.c
> @@ -147,6 +147,9 @@ iavf_dev_configure(struct rte_eth_dev *dev)
>   	ad->rx_vec_allowed = true;
>   	ad->tx_vec_allowed = true;
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* Vlan stripping setting */
>   	if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN) {
>   		if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_VLAN_STRIP) @@ -522,7 +525,8 @@ iavf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>   		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
>   		DEV_RX_OFFLOAD_SCATTER |
>   		DEV_RX_OFFLOAD_JUMBO_FRAME |
> -		DEV_RX_OFFLOAD_VLAN_FILTER;
> +		DEV_RX_OFFLOAD_VLAN_FILTER |
> +		DEV_RX_OFFLOAD_RSS_HASH;
>   	dev_info->tx_offload_capa =
>   		DEV_TX_OFFLOAD_VLAN_INSERT |
>   		DEV_TX_OFFLOAD_QINQ_INSERT |
> diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c index d74675842..8ff96a96e 100644
> --- a/drivers/net/ice/ice_ethdev.c
> +++ b/drivers/net/ice/ice_ethdev.c
> @@ -2357,6 +2357,9 @@ ice_dev_configure(struct rte_eth_dev *dev)
>   	ad->rx_bulk_alloc_allowed = true;
>   	ad->tx_simple_allowed = true;
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	return 0;
>   }
>   
> @@ -2800,7 +2803,8 @@ ice_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>   			DEV_RX_OFFLOAD_TCP_CKSUM |
>   			DEV_RX_OFFLOAD_QINQ_STRIP |
>   			DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
> -			DEV_RX_OFFLOAD_VLAN_EXTEND;
> +			DEV_RX_OFFLOAD_VLAN_EXTEND |
> +			DEV_RX_OFFLOAD_RSS_HASH;
>   		dev_info->tx_offload_capa |=
>   			DEV_TX_OFFLOAD_QINQ_INSERT |
>   			DEV_TX_OFFLOAD_IPV4_CKSUM |
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
> index dbce7a80e..a299c1c74 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -2402,6 +2402,10 @@ ixgbe_dev_configure(struct rte_eth_dev *dev)
>   	int ret;
>   
>   	PMD_INIT_FUNC_TRACE();
> +
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* multipe queue mode checking */
>   	ret  = ixgbe_check_mq_mode(dev);
>   	if (ret != 0) {
> @@ -5140,6 +5144,9 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev)
>   	PMD_INIT_LOG(DEBUG, "Configured Virtual Function port id: %d",
>   		     dev->data->port_id);
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/*
>   	 * VF has no ability to enable/disable HW CRC
>   	 * Keep the persistent behavior the same as Host PF diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c index edcfa60ce..fa572d184 100644
> --- a/drivers/net/ixgbe/ixgbe_rxtx.c
> +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
> @@ -2872,7 +2872,8 @@ ixgbe_get_rx_port_offloads(struct rte_eth_dev *dev)
>   		   DEV_RX_OFFLOAD_KEEP_CRC    |
>   		   DEV_RX_OFFLOAD_JUMBO_FRAME |
>   		   DEV_RX_OFFLOAD_VLAN_FILTER |
> -		   DEV_RX_OFFLOAD_SCATTER;
> +		   DEV_RX_OFFLOAD_SCATTER |
> +		   DEV_RX_OFFLOAD_RSS_HASH;
>   
>   	if (hw->mac.type == ixgbe_mac_82598EB)
>   		offloads |= DEV_RX_OFFLOAD_VLAN_STRIP; diff --git a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c
> index ec01343f1..d873b6ff4 100644
> --- a/drivers/net/liquidio/lio_ethdev.c
> +++ b/drivers/net/liquidio/lio_ethdev.c
> @@ -412,7 +412,8 @@ lio_dev_info_get(struct rte_eth_dev *eth_dev,
>   	devinfo->rx_offload_capa = (DEV_RX_OFFLOAD_IPV4_CKSUM		|
>   				    DEV_RX_OFFLOAD_UDP_CKSUM		|
>   				    DEV_RX_OFFLOAD_TCP_CKSUM		|
> -				    DEV_RX_OFFLOAD_VLAN_STRIP);
> +				    DEV_RX_OFFLOAD_VLAN_STRIP		|
> +				    DEV_RX_OFFLOAD_RSS_HASH);
>   	devinfo->tx_offload_capa = (DEV_TX_OFFLOAD_IPV4_CKSUM		|
>   				    DEV_TX_OFFLOAD_UDP_CKSUM		|
>   				    DEV_TX_OFFLOAD_TCP_CKSUM		|
> @@ -1735,6 +1736,10 @@ lio_dev_configure(struct rte_eth_dev *eth_dev)
>   
>   	PMD_INIT_FUNC_TRACE();
>   
> +	if (!(eth_dev->data->dev_conf.rxmode.offloads &
> +						DEV_RX_OFFLOAD_RSS_HASH))
> +		eth_dev->data->dev_conf.rxmode.offloads |=
> +						DEV_RX_OFFLOAD_RSS_HASH;
>   	/* Inform firmware about change in number of queues to use.
>   	 * Disable IO queues and reset registers for re-configuration.
>   	 */
> diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index 931e4f4fe..6df2f6f90 100644
> --- a/drivers/net/mlx4/mlx4.c
> +++ b/drivers/net/mlx4/mlx4.c
> @@ -248,6 +248,9 @@ mlx4_dev_configure(struct rte_eth_dev *dev)
>   	struct rte_flow_error error;
>   	int ret;
>   
> +	if (!(dev->data->dev_conf.rxmode.offload & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offload |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* Prepare internal flow rules. */
>   	ret = mlx4_flow_sync(priv, &error);
>   	if (ret) {
> diff --git a/drivers/net/mlx4/mlx4_rxq.c b/drivers/net/mlx4/mlx4_rxq.c index f45c1ff85..4a6fbd922 100644
> --- a/drivers/net/mlx4/mlx4_rxq.c
> +++ b/drivers/net/mlx4/mlx4_rxq.c
> @@ -685,7 +685,8 @@ mlx4_get_rx_queue_offloads(struct mlx4_priv *priv)  {
>   	uint64_t offloads = DEV_RX_OFFLOAD_SCATTER |
>   			    DEV_RX_OFFLOAD_KEEP_CRC |
> -			    DEV_RX_OFFLOAD_JUMBO_FRAME;
> +			    DEV_RX_OFFLOAD_JUMBO_FRAME |
> +			    DEV_RX_OFFLOAD_RSS_HASH;
>   
>   	if (priv->hw_csum)
>   		offloads |= DEV_RX_OFFLOAD_CHECKSUM;
> diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index 2278b24c0..e87d52ea1 100644
> --- a/drivers/net/mlx5/mlx5_ethdev.c
> +++ b/drivers/net/mlx5/mlx5_ethdev.c
> @@ -407,6 +407,10 @@ mlx5_dev_configure(struct rte_eth_dev *dev)
>   		rte_errno = ENOMEM;
>   		return -rte_errno;
>   	}
> +
> +	if (!(dev->data->dev_conf.rxmode.offload & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offload |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	memcpy(priv->rss_conf.rss_key,
>   	       use_app_rss_key ?
>   	       dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key :
> diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c index f0ab8438d..c8e1fc4b6 100644
> --- a/drivers/net/mlx5/mlx5_rxq.c
> +++ b/drivers/net/mlx5/mlx5_rxq.c
> @@ -368,7 +368,8 @@ mlx5_get_rx_queue_offloads(struct rte_eth_dev *dev)
>   	struct mlx5_dev_config *config = &priv->config;
>   	uint64_t offloads = (DEV_RX_OFFLOAD_SCATTER |
>   			     DEV_RX_OFFLOAD_TIMESTAMP |
> -			     DEV_RX_OFFLOAD_JUMBO_FRAME);
> +			     DEV_RX_OFFLOAD_JUMBO_FRAME |
> +			     DEV_RX_OFFLOAD_RSS_HASH);
>   
>   	if (config->hw_fcs_strip)
>   		offloads |= DEV_RX_OFFLOAD_KEEP_CRC;
> diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c index eed8dece9..5c027e1a4 100644
> --- a/drivers/net/netvsc/hn_ethdev.c
> +++ b/drivers/net/netvsc/hn_ethdev.c
> @@ -532,6 +532,9 @@ static int hn_dev_configure(struct rte_eth_dev *dev)
>   
>   	PMD_INIT_FUNC_TRACE();
>   
> +	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev_conf->rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	unsupported = txmode->offloads & ~HN_TX_OFFLOAD_CAPS;
>   	if (unsupported) {
>   		PMD_DRV_LOG(NOTICE,
> diff --git a/drivers/net/netvsc/hn_rndis.c b/drivers/net/netvsc/hn_rndis.c index a67bc7a79..2b4714042 100644
> --- a/drivers/net/netvsc/hn_rndis.c
> +++ b/drivers/net/netvsc/hn_rndis.c
> @@ -897,7 +897,8 @@ int hn_rndis_get_offload(struct hn_data *hv,
>   	    == HN_NDIS_LSOV2_CAP_IP6)
>   		dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO;
>   
> -	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP;
> +	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP |
> +				    DEV_RX_OFFLOAD_RSS_HASH;
>   
>   	if (hwcaps.ndis_csum.ndis_ip4_rxcsum & NDIS_RXCSUM_CAP_IP4)
>   		dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_IPV4_CKSUM; diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c index 22a8b2d19..e288a7f7e 100644
> --- a/drivers/net/nfp/nfp_net.c
> +++ b/drivers/net/nfp/nfp_net.c
> @@ -407,6 +407,9 @@ nfp_net_configure(struct rte_eth_dev *dev)
>   	rxmode = &dev_conf->rxmode;
>   	txmode = &dev_conf->txmode;
>   
> +	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* Checking TX mode */
>   	if (txmode->mq_mode) {
>   		PMD_INIT_LOG(INFO, "TX mq_mode DCB and VMDq not supported"); @@ -1236,7 +1239,8 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>   					     DEV_RX_OFFLOAD_UDP_CKSUM |
>   					     DEV_RX_OFFLOAD_TCP_CKSUM;
>   
> -	dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME |
> +				     DEV_RX_OFFLOAD_RSS_HASH;
>   
>   	if (hw->cap & NFP_NET_CFG_CTRL_TXVLAN)
>   		dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT; diff --git a/drivers/net/octeontx2/otx2_ethdev.c b/drivers/net/octeontx2/otx2_ethdev.c
> index 62291c698..d6e8ae745 100644
> --- a/drivers/net/octeontx2/otx2_ethdev.c
> +++ b/drivers/net/octeontx2/otx2_ethdev.c
> @@ -575,7 +575,8 @@ nix_rx_offload_flags(struct rte_eth_dev *eth_dev)
>   	struct rte_eth_rxmode *rxmode = &conf->rxmode;
>   	uint16_t flags = 0;
>   
> -	if (rxmode->mq_mode == ETH_MQ_RX_RSS)
> +	if (rxmode->mq_mode == ETH_MQ_RX_RSS &&
> +			(dev->rx_offloads & DEV_RX_OFFLOAD_RSS_HASH))
>   		flags |= NIX_RX_OFFLOAD_RSS_F;
>   
>   	if (dev->rx_offloads & (DEV_RX_OFFLOAD_TCP_CKSUM | diff --git a/drivers/net/octeontx2/otx2_ethdev.h b/drivers/net/octeontx2/otx2_ethdev.h
> index 4d9ed4870..d581240fe 100644
> --- a/drivers/net/octeontx2/otx2_ethdev.h
> +++ b/drivers/net/octeontx2/otx2_ethdev.h
> @@ -122,8 +122,8 @@
>   	DEV_TX_OFFLOAD_MT_LOCKFREE	| \
>   	DEV_TX_OFFLOAD_VLAN_INSERT	| \
>   	DEV_TX_OFFLOAD_QINQ_INSERT	| \
> -	DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM | \
> -	DEV_TX_OFFLOAD_OUTER_UDP_CKSUM  | \
> +	DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM	| \
> +	DEV_TX_OFFLOAD_OUTER_UDP_CKSUM	| \
>   	DEV_TX_OFFLOAD_TCP_CKSUM	| \
>   	DEV_TX_OFFLOAD_UDP_CKSUM	| \
>   	DEV_TX_OFFLOAD_SCTP_CKSUM	| \
> @@ -140,11 +140,12 @@
>   	DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM | \
>   	DEV_RX_OFFLOAD_SCATTER		| \
>   	DEV_RX_OFFLOAD_JUMBO_FRAME	PKT_RX_RSS_HASH| \
> -	DEV_RX_OFFLOAD_OUTER_UDP_CKSUM | \
> -	DEV_RX_OFFLOAD_VLAN_STRIP | \
> -	DEV_RX_OFFLOAD_VLAN_FILTER | \
> -	DEV_RX_OFFLOAD_QINQ_STRIP | \
> -	DEV_RX_OFFLOAD_TIMESTAMP)
> +	DEV_RX_OFFLOAD_OUTER_UDP_CKSUM	| \
> +	DEV_RX_OFFLOAD_VLAN_STRIP	| \
> +	DEV_RX_OFFLOAD_VLAN_FILTER	| \
> +	DEV_RX_OFFLOAD_QINQ_STRIP	| \
> +	DEV_RX_OFFLOAD_TIMESTAMP	| \
> +	DEV_RX_OFFLOAD_RSS_HASH)
>   
>   #define NIX_DEFAULT_RSS_CTX_GROUP  0
>   #define NIX_DEFAULT_RSS_MCAM_IDX  -1
> diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c index 53fdfde9a..8cdf04eaf 100644
> --- a/drivers/net/qede/qede_ethdev.c
> +++ b/drivers/net/qede/qede_ethdev.c
> @@ -1182,6 +1182,9 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
>   
>   	PMD_INIT_FUNC_TRACE(edev);
>   
> +	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* We need to have min 1 RX queue.There is no min check in
>   	 * rte_eth_dev_configure(), so we are checking it here.
>   	 */
> @@ -1302,7 +1305,8 @@ qede_dev_info_getPKT_RX_RSS_HASH(struct rte_eth_dev *eth_dev,
>   				     DEV_RX_OFFLOAD_SCATTER	|
>   				     DEV_RX_OFFLOAD_JUMBO_FRAME |
>   				     DEV_RX_OFFLOAD_VLAN_FILTER |
> -				     DEV_RX_OFFLOAD_VLAN_STRIP);
> +				     DEV_RX_OFFLOAD_VLAN_STRIP  |
> +				     DEV_RX_OFFLOAD_RSS_HASH);
>   	dev_info->rx_queue_offload_capa = 0;
>   
>   	/* TX offloads are on a per-packet basis, so it is applicable diff --git a/drivers/net/sfc/sfc_ef10_essb_rx.c b/drivers/net/sfc/sfc_ef10_essb_rx.c
> index 63da807ea..d9d2ce6bd 100644
> --- a/drivers/net/sfc/sfc_ef10_essb_rx.c
> +++ b/drivers/net/sfc/sfc_ef10_essb_rx.c
> @@ -715,7 +715,8 @@ struct sfc_dp_rx sfc_ef10_essb_rx = {
>   	},
>   	.features		= SFC_DP_RX_FEAT_FLOW_FLAG |
>   				  SFC_DP_RX_FEAT_FLOW_MARK,
> -	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM,
> +	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM |
> +				  DEV_RX_OFFLOAD_RSS_HASH,
>   	.queue_offload_capa	= 0,
>   	.get_dev_info		= sfc_ef10_essb_rx_get_dev_info,
>   	.pool_ops_supported	= sfc_ef10_essb_rx_pool_ops_supported,
> diff --git a/drivers/net/sfc/sfc_ef10_rx.c b/drivers/net/sfc/sfc_ef10_rx.c index f2fc6e70a..9e527b7fb 100644
> --- a/drivers/net/sfc/sfc_ef10_rx.c
> +++ b/drivers/net/sfc/sfc_ef10_rx.c
> @@ -796,7 +796,8 @@ struct sfc_dp_rx sfc_ef10_rx = {
>   	.features		= SFC_DP_RX_FEAT_MULTI_PROCESS |
>   				  SFC_DP_RX_FEAT_INTR,
>   	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM |
> -				  DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM,
> +				  DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
> +				  DEV_RX_OFFLOAD_RSS_HASH,
>   	.queue_offload_capa	= DEV_RX_OFFLOAD_SCATTER,
>   	.get_dev_info		= sfc_ef10_rx_get_dev_info,
>   	.qsize_up_rings		= sfc_ef10_rx_qsize_up_rings,
> diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c index e6809bb64..10fa1e5ff 100644
> --- a/drivers/net/sfc/sfc_rx.c
> +++ b/drivers/net/sfc/sfc_rx.c
> @@ -617,7 +617,8 @@ struct sfc_dp_rx sfc_efx_rx = {
>   		.hw_fw_caps	= 0,
>   	},
>   	.features		= SFC_DP_RX_FEAT_INTR,
> -	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM,
> +	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM |
> +				  DEV_RX_OFFLOAD_RSS_HASH,
>   	.queue_offload_capa	= DEV_RX_OFFLOAD_SCATTER,
>   	.qsize_up_rings		= sfc_efx_rx_qsize_up_rings,
>   	.qcreate		= sfc_efx_rx_qcreate,
> @@ -1556,6 +1557,10 @@ sfc_rx_check_mode(struct sfc_adapter *sa, struct rte_eth_rxmode *rxmode)
>   		rxmode->offloads |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
>   	}
>   
> +	if ((offloads_supported & DEV_RX_OFFLOAD_RSS_HASH) &&
> +	    (~rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	return rc;
>   }
>   
> diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c
> index b93d45712..28ee3e46d 100644
> --- a/drivers/net/thunderx/nicvf_ethdev.c
> +++ b/drivers/net/thunderx/nicvf_ethdev.c
> @@ -1920,6 +1920,9 @@ nicvf_dev_configure(struct rte_eth_dev *dev)
>   
>   	PMD_INIT_FUNC_TRACE();
>   
> +	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	if (!rte_eal_has_hugepages()) {
>   		PMD_INIT_LOG(INFO, "Huge page is not configured");
>   		return -EINVAL;
> diff --git a/drivers/net/thunderx/nicvf_ethdev.h b/drivers/net/thunderx/nicvf_ethdev.h
> index c0bfbf848..391411799 100644
> --- a/drivers/net/thunderx/nicvf_ethdev.h
> +++ b/drivers/net/thunderx/nicvf_ethdev.h
> @@ -41,7 +41,8 @@
>   	DEV_RX_OFFLOAD_CHECKSUM    | \
>   	DEV_RX_OFFLOAD_VLAN_STRIP  | \
>   	DEV_RX_OFFLOAD_JUMBO_FRAME | \
> -	DEV_RX_OFFLOAD_SCATTER)
> +	DEV_RX_OFFLOAD_SCATTER     | \
> +	DEV_RX_OFFLOAD_RSS_HASH)
>   
>   #define NICVF_DEFAULT_RX_FREE_THRESH    224
>   #define NICVF_DEFAULT_TX_FREE_THRESH    224
> diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
> index d1faeaa81..5ef6ad43c 100644
> --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
> +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
> @@ -56,7 +56,8 @@
>   	 DEV_RX_OFFLOAD_UDP_CKSUM |	\
>   	 DEV_RX_OFFLOAD_TCP_CKSUM |	\
>   	 DEV_RX_OFFLOAD_TCP_LRO |	\
> -	 DEV_RX_OFFLOAD_JUMBO_FRAME)
> +	 DEV_RX_OFFLOAD_JUMBO_FRAME |   \
> +	 DEV_RX_OFFLOAD_RSS_HASH)
>   
>   static int eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev);  static int eth_vmxnet3_dev_uninit(struct rte_eth_dev *eth_dev); @@ -407,6 +408,9 @@ vmxnet3_dev_configure(struct rte_eth_dev *dev)
>   
>   	PMD_INIT_FUNC_TRACE();
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	if (dev->data->nb_tx_queues > VMXNET3_MAX_TX_QUEUES ||
>   	    dev->data->nb_rx_queues > VMXNET3_MAX_RX_QUEUES) {
>   		PMD_INIT_LOG(ERR, "ERROR: Number of queues not supported");
> --
> 2.17.1
>
  
Liron Himi Nov. 3, 2019, 2:06 p.m. UTC | #7
Hi,

Correct, I didn't notice that the patch related to the 'rss' field in mbuf.

So ignore my request.

Regards,
Liron

-----Original Message-----
From: Andrew Rybchenko <arybchenko@solarflare.com> 
Sent: Sunday, 3 November 2019 14:07
To: Liron Himi <lironh@marvell.com>; Pavan Nikhilesh Bhagavatula <pbhagavatula@marvell.com>; ferruh.yigit@intel.com; Jerin Jacob Kollanukkaran <jerinj@marvell.com>; Ajit Khaparde <ajit.khaparde@broadcom.com>; Somnath Kotur <somnath.kotur@broadcom.com>; Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>; Hemant Agrawal <hemant.agrawal@nxp.com>; Sachin Saxena <sachin.saxena@nxp.com>; Wenzhuo Lu <wenzhuo.lu@intel.com>; John Daley <johndale@cisco.com>; Hyong Youb Kim <hyonkim@cisco.com>; Qi Zhang <qi.z.zhang@intel.com>; Xiao Wang <xiao.w.wang@intel.com>; Ziyang Xuan <xuanziyang2@huawei.com>; Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>; Guoyang Zhou <zhouguoyang@huawei.com>; Beilei Xing <beilei.xing@intel.com>; Jingjing Wu <jingjing.wu@intel.com>; Qiming Yang <qiming.yang@intel.com>; Konstantin Ananyev <konstantin.ananyev@intel.com>; Shijith Thotton <sthotton@marvell.com>; Srisivasubramanian Srinivasan <srinivasan@marvell.com>; Matan Azrad <matan@mellanox.com>; Shahaf Shuler <shahafs@mellanox.com>; Viacheslav Ovsiienko <viacheslavo@mellanox.com>; Stephen Hemminger <sthemmin@microsoft.com>; K. Y. Srinivasan <kys@microsoft.com>; Haiyang Zhang <haiyangz@microsoft.com>; Alejandro Lucero <alejandro.lucero@netronome.com>; Nithin Kumar Dabilpuram <ndabilpuram@marvell.com>; Kiran Kumar Kokkilagadda <kirankumark@marvell.com>; Rasesh Mody <rmody@marvell.com>; Shahed Shaikh <shshaikh@marvell.com>; Maciej Czekaj <mczekaj@marvell.com>; Yong Wang <yongwang@vmware.com>
Cc: dev@dpdk.org
Subject: [EXT] Re: [dpdk-dev] [PATCH v15 4/7] drivers/net: update Rx RSS hash offload capabilities

External Email

----------------------------------------------------------------------
On 11/1/19 8:49 PM, Liron Himi wrote:
> Hi,
>
> mvpp2 and mvneta PMDs are also support RSS hash.
> Please add them to the patch.

I've failed to find where mvpp2 and mvneta set PKT_RX_RSS_HASH.


> Regards,
> Liron
>
> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of pbhagavatula@marvell.com
> Sent: Tuesday, 29 October 2019 17:37
> To: ferruh.yigit@intel.com; arybchenko@solarflare.com; Jerin Jacob 
> Kollanukkaran <jerinj@marvell.com>; Ajit Khaparde 
> <ajit.khaparde@broadcom.com>; Somnath Kotur 
> <somnath.kotur@broadcom.com>; Rahul Lakkireddy 
> <rahul.lakkireddy@chelsio.com>; Hemant Agrawal 
> <hemant.agrawal@nxp.com>; Sachin Saxena <sachin.saxena@nxp.com>; 
> Wenzhuo Lu <wenzhuo.lu@intel.com>; John Daley <johndale@cisco.com>; 
> Hyong Youb Kim <hyonkim@cisco.com>; Qi Zhang <qi.z.zhang@intel.com>; 
> Xiao Wang <xiao.w.wang@intel.com>; Ziyang Xuan 
> <xuanziyang2@huawei.com>; Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>; 
> Guoyang Zhou <zhouguoyang@huawei.com>; Beilei Xing 
> <beilei.xing@intel.com>; Jingjing Wu <jingjing.wu@intel.com>; Qiming 
> Yang <qiming.yang@intel.com>; Konstantin Ananyev 
> <konstantin.ananyev@intel.com>; Shijith Thotton 
> <sthotton@marvell.com>; Srisivasubramanian Srinivasan 
> <srinivasan@marvell.com>; Matan Azrad <matan@mellanox.com>; Shahaf 
> Shuler <shahafs@mellanox.com>; Viacheslav Ovsiienko 
> <viacheslavo@mellanox.com>; Stephen Hemminger 
> <sthemmin@microsoft.com>; K. Y. Srinivasan <kys@microsoft.com>; 
> Haiyang Zhang <haiyangz@microsoft.com>; Alejandro Lucero 
> <alejandro.lucero@netronome.com>; Nithin Kumar Dabilpuram 
> <ndabilpuram@marvell.com>; Kiran Kumar Kokkilagadda 
> <kirankumark@marvell.com>; Rasesh Mody <rmody@marvell.com>; Shahed 
> Shaikh <shshaikh@marvell.com>; Maciej Czekaj <mczekaj@marvell.com>; 
> Yong Wang <yongwang@vmware.com>
> Cc: dev@dpdk.org; Pavan Nikhilesh Bhagavatula 
> <pbhagavatula@marvell.com>
> Subject: [dpdk-dev] [PATCH v15 4/7] drivers/net: update Rx RSS hash 
> offload capabilities
>
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> Add DEV_RX_OFFLOAD_RSS_HASH flag for all PMDs that support RSS hash delivery.
>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> Reviewed-by: Hemant Agrawal <hemant.agrawal@nxp.com>
> Acked-by: Jerin Jacob <jerinj@marvell.com>
> Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
> ---
>   drivers/net/bnxt/bnxt_ethdev.c       |  8 +++++++-
>   drivers/net/cxgbe/cxgbe.h            |  3 ++-
>   drivers/net/cxgbe/cxgbe_ethdev.c     |  5 +++++
>   drivers/net/dpaa/dpaa_ethdev.c       |  3 ++-
>   drivers/net/dpaa2/dpaa2_ethdev.c     |  1 +
>   drivers/net/e1000/igb_ethdev.c       |  6 ++++++
>   drivers/net/e1000/igb_rxtx.c         |  3 ++-
>   drivers/net/enic/enic_ethdev.c       |  5 +++++
>   drivers/net/enic/enic_res.c          |  3 ++-
>   drivers/net/fm10k/fm10k_ethdev.c     |  6 +++++-
>   drivers/net/hinic/hinic_pmd_ethdev.c |  6 +++++-
>   drivers/net/i40e/i40e_ethdev.c       |  6 +++++-
>   drivers/net/iavf/iavf_ethdev.c       |  6 +++++-
>   drivers/net/ice/ice_ethdev.c         |  6 +++++-
>   drivers/net/ixgbe/ixgbe_ethdev.c     |  7 +++++++
>   drivers/net/ixgbe/ixgbe_rxtx.c       |  3 ++-
>   drivers/net/liquidio/lio_ethdev.c    |  7 ++++++-
>   drivers/net/mlx4/mlx4.c              |  3 +++
>   drivers/net/mlx4/mlx4_rxq.c          |  3 ++-
>   drivers/net/mlx5/mlx5_ethdev.c       |  4 ++++
>   drivers/net/mlx5/mlx5_rxq.c          |  3 ++-
>   drivers/net/netvsc/hn_ethdev.c       |  3 +++
>   drivers/net/netvsc/hn_rndis.c        |  3 ++-
>   drivers/net/nfp/nfp_net.c            |  6 +++++-
>   drivers/net/octeontx2/otx2_ethdev.c  |  3 ++-  drivers/net/octeontx2/otx2_ethdev.h  | 15 ++++++++-------
>   drivers/net/qede/qede_ethdev.c       |  6 +++++-
>   drivers/net/sfc/sfc_ef10_essb_rx.c   |  3 ++-
>   drivers/net/sfc/sfc_ef10_rx.c        |  3 ++-
>   drivers/net/sfc/sfc_rx.c             |  7 ++++++-
>   drivers/net/thunderx/nicvf_ethdev.c  |  3 +++  drivers/net/thunderx/nicvf_ethdev.h  |  3 ++-  drivers/net/vmxnet3/vmxnet3_ethdev.c |  6 +++++-
>   33 files changed, 128 insertions(+), 30 deletions(-)
>
> diff --git a/drivers/net/bnxt/bnxt_ethdev.c 
> b/drivers/net/bnxt/bnxt_ethdev.c index 7d9459f0a..01d48f47c 100644
> --- a/drivers/net/bnxt/bnxt_ethdev.c
> +++ b/drivers/net/bnxt/bnxt_ethdev.c
> @@ -123,7 +123,8 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
>   				     DEV_RX_OFFLOAD_KEEP_CRC | \
>   				     DEV_RX_OFFLOAD_VLAN_EXTEND | \
>   				     DEV_RX_OFFLOAD_TCP_LRO | \
> -				     DEV_RX_OFFLOAD_SCATTER)
> +				     DEV_RX_OFFLOAD_SCATTER | \
> +				     DEV_RX_OFFLOAD_RSS_HASH)
>   
>   static int bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask);  static void bnxt_print_link_info(struct rte_eth_dev *eth_dev); @@ -689,6 +690,11 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
>   	bp->rx_cp_nr_rings = bp->rx_nr_rings;
>   	bp->tx_cp_nr_rings = bp->tx_nr_rings;
>   
> +	if (!(rx_offloads & DEV_RX_OFFLOAD_RSS_HASH)) {
> +		rx_offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +		eth_dev->data->dev_conf.rxmode.offloads = rx_offloads;
> +	}
> +
>   	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
>   		eth_dev->data->mtu =
>   			eth_dev->data->dev_conf.rxmode.max_rx_pkt_len - diff --git 
> a/drivers/net/cxgbe/cxgbe.h b/drivers/net/cxgbe/cxgbe.h index 
> ed1be3559..6c1f73ac4 100644
> --- a/drivers/net/cxgbe/cxgbe.h
> +++ b/drivers/net/cxgbe/cxgbe.h
> @@ -47,7 +47,8 @@
>   			   DEV_RX_OFFLOAD_UDP_CKSUM | \
>   			   DEV_RX_OFFLOAD_TCP_CKSUM | \
>   			   DEV_RX_OFFLOAD_JUMBO_FRAME | \
> -			   DEV_RX_OFFLOAD_SCATTER)
> +			   DEV_RX_OFFLOAD_SCATTER | \
> +			   DEV_RX_OFFLOAD_RSS_HASH)
>   
>   
>   /* Common PF and VF devargs */
> diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c 
> b/drivers/net/cxgbe/cxgbe_ethdev.c
> index 615dda607..6df127087 100644
> --- a/drivers/net/cxgbe/cxgbe_ethdev.c
> +++ b/drivers/net/cxgbe/cxgbe_ethdev.c
> @@ -426,6 +426,11 @@ int cxgbe_dev_configure(struct rte_eth_dev 
> *eth_dev)
>   
>   	CXGBE_FUNC_TRACE();
>   
> +	if (!(eth_dev->data->dev_conf.rxmode.offloads &
> +				DEV_RX_OFFLOAD_RSS_HASH))
> +		eth_dev->data->dev_conf.rxmode.offloads |=
> +							DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	if (!(adapter->flags & FW_QUEUE_BOUND)) {
>   		err = cxgbe_setup_sge_fwevtq(adapter);
>   		if (err)
> diff --git a/drivers/net/dpaa/dpaa_ethdev.c 
> b/drivers/net/dpaa/dpaa_ethdev.c index caf255d67..096da752d 100644
> --- a/drivers/net/dpaa/dpaa_ethdev.c
> +++ b/drivers/net/dpaa/dpaa_ethdev.c
> @@ -56,7 +56,8 @@ static uint64_t dev_rx_offloads_nodis =
>   		DEV_RX_OFFLOAD_IPV4_CKSUM |
>   		DEV_RX_OFFLOAD_UDP_CKSUM |
>   		DEV_RX_OFFLOAD_TCP_CKSUM |
> -		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
> +		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
> +		DEV_RX_OFFLOAD_RSS_HASH;
>   
>   /* Supported Tx offloads */
>   static uint64_t dev_tx_offloads_sup = diff --git 
> a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
> index 03131b903..eea31f254 100644
> --- a/drivers/net/dpaa2/dpaa2_ethdev.c
> +++ b/drivers/net/dpaa2/dpaa2_ethdev.c
> @@ -45,6 +45,7 @@ static uint64_t dev_rx_offloads_sup =
>   
>   /* Rx offloads which cannot be disabled */  static uint64_t 
> dev_rx_offloads_nodis =
> +		DEV_RX_OFFLOAD_RSS_HASH |
>   		DEV_RX_OFFLOAD_SCATTER;
>   
>   /* Supported Tx offloads */
> diff --git a/drivers/net/e1000/igb_ethdev.c 
> b/drivers/net/e1000/igb_ethdev.c index ce7c9e664..22665b51c 100644
> --- a/drivers/net/e1000/igb_ethdev.c
> +++ b/drivers/net/e1000/igb_ethdev.c
> @@ -1182,6 +1182,9 @@ eth_igb_configure(struct rte_eth_dev *dev)
>   
>   	PMD_INIT_FUNC_TRACE();
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* multipe queue mode checking */
>   	ret  = igb_check_mq_mode(dev);
>   	if (ret != 0) {
> @@ -3255,6 +3258,9 @@ igbvf_dev_configure(struct rte_eth_dev *dev)
>   	PMD_INIT_LOG(DEBUG, "Configured Virtual Function port id: %d",
>   		     dev->data->port_id);
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/*
>   	 * VF has no ability to enable/disable HW CRC
>   	 * Keep the persistent behavior the same as Host PF diff --git 
> a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c index 
> c5606de5d..684fa4ad8 100644
> --- a/drivers/net/e1000/igb_rxtx.c
> +++ b/drivers/net/e1000/igb_rxtx.c
> @@ -1646,7 +1646,8 @@ igb_get_rx_port_offloads_capa(struct rte_eth_dev *dev)
>   			  DEV_RX_OFFLOAD_TCP_CKSUM   |
>   			  DEV_RX_OFFLOAD_JUMBO_FRAME |
>   			  DEV_RX_OFFLOAD_KEEP_CRC    |
> -			  DEV_RX_OFFLOAD_SCATTER;
> +			  DEV_RX_OFFLOAD_SCATTER     |
> +			  DEV_RX_OFFLOAD_RSS_HASH;
>   
>   	return rx_offload_capa;
>   }
> diff --git a/drivers/net/enic/enic_ethdev.c 
> b/drivers/net/enic/enic_ethdev.c index 12c59a3c5..d2d1488d9 100644
> --- a/drivers/net/enic/enic_ethdev.c
> +++ b/drivers/net/enic/enic_ethdev.c
> @@ -405,6 +405,11 @@ static int enicpmd_dev_configure(struct rte_eth_dev *eth_dev)
>   		return ret;
>   	}
>   
> +	if (!(eth_dev->data->dev_conf.rxmode.offloads &
> +						DEV_RX_OFFLOAD_RSS_HASH))
> +		eth_dev->data->dev_conf.rxmode.offloads |=
> +						DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	enic->mc_count = 0;
>   	enic->hw_ip_checksum = !!(eth_dev->data->dev_conf.rxmode.offloads &
>   				  DEV_RX_OFFLOAD_CHECKSUM);
> diff --git a/drivers/net/enic/enic_res.c b/drivers/net/enic/enic_res.c 
> index f403a0b66..7c3c270a2 100644
> --- a/drivers/net/enic/enic_res.c
> +++ b/drivers/net/enic/enic_res.c
> @@ -205,7 +205,8 @@ int enic_get_vnic_config(struct enic *enic)
>   		DEV_RX_OFFLOAD_VLAN_STRIP |
>   		DEV_RX_OFFLOAD_IPV4_CKSUM |
>   		DEV_RX_OFFLOAD_UDP_CKSUM |
> -		DEV_RX_OFFLOAD_TCP_CKSUM;
> +		DEV_RX_OFFLOAD_TCP_CKSUM |
> +		DEV_RX_OFFLOAD_RSS_HASH;
>   	enic->tx_offload_mask =
>   		PKT_TX_IPV6 |
>   		PKT_TX_IPV4 |
> diff --git a/drivers/net/fm10k/fm10k_ethdev.c 
> b/drivers/net/fm10k/fm10k_ethdev.c
> index 99c4366e4..2e834130d 100644
> --- a/drivers/net/fm10k/fm10k_ethdev.c
> +++ b/drivers/net/fm10k/fm10k_ethdev.c
> @@ -461,6 +461,9 @@ fm10k_dev_configure(struct rte_eth_dev *dev)
>   
>   	PMD_INIT_FUNC_TRACE();
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* multipe queue mode checking */
>   	ret  = fm10k_check_mq_mode(dev);
>   	if (ret != 0) {
> @@ -1805,7 +1808,8 @@ static uint64_t fm10k_get_rx_port_offloads_capa(struct rte_eth_dev *dev)
>   			   DEV_RX_OFFLOAD_UDP_CKSUM   |
>   			   DEV_RX_OFFLOAD_TCP_CKSUM   |
>   			   DEV_RX_OFFLOAD_JUMBO_FRAME |
> -			   DEV_RX_OFFLOAD_HEADER_SPLIT);
> +			   DEV_RX_OFFLOAD_HEADER_SPLIT |
> +			   DEV_RX_OFFLOAD_RSS_HASH);
>   }
>   
>   static int
> diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c 
> b/drivers/net/hinic/hinic_pmd_ethdev.c
> index 9f37a404b..6673777e9 100644
> --- a/drivers/net/hinic/hinic_pmd_ethdev.c
> +++ b/drivers/net/hinic/hinic_pmd_ethdev.c
> @@ -318,6 +318,9 @@ static int hinic_dev_configure(struct rte_eth_dev *dev)
>   		return -EINVAL;
>   	}
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* mtu size is 256~9600 */
>   	if (dev->data->dev_conf.rxmode.max_rx_pkt_len < HINIC_MIN_FRAME_SIZE ||
>   	    dev->data->dev_conf.rxmode.max_rx_pkt_len > @@ -740,7 +743,8 @@ hinic_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
>   				DEV_RX_OFFLOAD_VLAN_FILTER |
>   				DEV_RX_OFFLOAD_SCATTER |
>   				DEV_RX_OFFLOAD_JUMBO_FRAME |
> -				DEV_RX_OFFLOAD_TCP_LRO;
> +				DEV_RX_OFFLOAD_TCP_LRO |
> +				DEV_RX_OFFLOAD_RSS_HASH;
>   
>   	info->tx_queue_offload_capa = 0;
>   	info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT | diff --git 
> a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c 
> index 77a46832c..78fea04f8 100644
> --- a/drivers/net/i40e/i40e_ethdev.c
> +++ b/drivers/net/i40e/i40e_ethdev.c
> @@ -1812,6 +1812,9 @@ i40e_dev_configure(struct rte_eth_dev *dev)
>   	ad->tx_simple_allowed = true;
>   	ad->tx_vec_allowed = true;
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* Only legacy filter API needs the following fdir config. So when the
>   	 * legacy filter API is deprecated, the following codes should also be
>   	 * removed.
> @@ -3613,7 +3616,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>   		DEV_RX_OFFLOAD_SCATTER |
>   		DEV_RX_OFFLOAD_VLAN_EXTEND |
>   		DEV_RX_OFFLOAD_VLAN_FILTER |
> -		DEV_RX_OFFLOAD_JUMBO_FRAME;
> +		DEV_RX_OFFLOAD_JUMBO_FRAME |
> +		DEV_RX_OFFLOAD_RSS_HASH;
>   
>   	dev_info->tx_queue_offload_capa = DEV_TX_OFFLOAD_MBUF_FAST_FREE;
>   	dev_info->tx_offload_capa =
> diff --git a/drivers/net/iavf/iavf_ethdev.c 
> b/drivers/net/iavf/iavf_ethdev.c index eebc49ade..172c3f6ac 100644
> --- a/drivers/net/iavf/iavf_ethdev.c
> +++ b/drivers/net/iavf/iavf_ethdev.c
> @@ -147,6 +147,9 @@ iavf_dev_configure(struct rte_eth_dev *dev)
>   	ad->rx_vec_allowed = true;
>   	ad->tx_vec_allowed = true;
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* Vlan stripping setting */
>   	if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN) {
>   		if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_VLAN_STRIP) @@ -522,7 +525,8 @@ iavf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>   		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
>   		DEV_RX_OFFLOAD_SCATTER |
>   		DEV_RX_OFFLOAD_JUMBO_FRAME |
> -		DEV_RX_OFFLOAD_VLAN_FILTER;
> +		DEV_RX_OFFLOAD_VLAN_FILTER |
> +		DEV_RX_OFFLOAD_RSS_HASH;
>   	dev_info->tx_offload_capa =
>   		DEV_TX_OFFLOAD_VLAN_INSERT |
>   		DEV_TX_OFFLOAD_QINQ_INSERT |
> diff --git a/drivers/net/ice/ice_ethdev.c 
> b/drivers/net/ice/ice_ethdev.c index d74675842..8ff96a96e 100644
> --- a/drivers/net/ice/ice_ethdev.c
> +++ b/drivers/net/ice/ice_ethdev.c
> @@ -2357,6 +2357,9 @@ ice_dev_configure(struct rte_eth_dev *dev)
>   	ad->rx_bulk_alloc_allowed = true;
>   	ad->tx_simple_allowed = true;
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	return 0;
>   }
>   
> @@ -2800,7 +2803,8 @@ ice_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>   			DEV_RX_OFFLOAD_TCP_CKSUM |
>   			DEV_RX_OFFLOAD_QINQ_STRIP |
>   			DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
> -			DEV_RX_OFFLOAD_VLAN_EXTEND;
> +			DEV_RX_OFFLOAD_VLAN_EXTEND |
> +			DEV_RX_OFFLOAD_RSS_HASH;
>   		dev_info->tx_offload_capa |=
>   			DEV_TX_OFFLOAD_QINQ_INSERT |
>   			DEV_TX_OFFLOAD_IPV4_CKSUM |
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c 
> b/drivers/net/ixgbe/ixgbe_ethdev.c
> index dbce7a80e..a299c1c74 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -2402,6 +2402,10 @@ ixgbe_dev_configure(struct rte_eth_dev *dev)
>   	int ret;
>   
>   	PMD_INIT_FUNC_TRACE();
> +
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* multipe queue mode checking */
>   	ret  = ixgbe_check_mq_mode(dev);
>   	if (ret != 0) {
> @@ -5140,6 +5144,9 @@ ixgbevf_dev_configure(struct rte_eth_dev *dev)
>   	PMD_INIT_LOG(DEBUG, "Configured Virtual Function port id: %d",
>   		     dev->data->port_id);
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/*
>   	 * VF has no ability to enable/disable HW CRC
>   	 * Keep the persistent behavior the same as Host PF diff --git 
> a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c 
> index edcfa60ce..fa572d184 100644
> --- a/drivers/net/ixgbe/ixgbe_rxtx.c
> +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
> @@ -2872,7 +2872,8 @@ ixgbe_get_rx_port_offloads(struct rte_eth_dev *dev)
>   		   DEV_RX_OFFLOAD_KEEP_CRC    |
>   		   DEV_RX_OFFLOAD_JUMBO_FRAME |
>   		   DEV_RX_OFFLOAD_VLAN_FILTER |
> -		   DEV_RX_OFFLOAD_SCATTER;
> +		   DEV_RX_OFFLOAD_SCATTER |
> +		   DEV_RX_OFFLOAD_RSS_HASH;
>   
>   	if (hw->mac.type == ixgbe_mac_82598EB)
>   		offloads |= DEV_RX_OFFLOAD_VLAN_STRIP; diff --git 
> a/drivers/net/liquidio/lio_ethdev.c 
> b/drivers/net/liquidio/lio_ethdev.c
> index ec01343f1..d873b6ff4 100644
> --- a/drivers/net/liquidio/lio_ethdev.c
> +++ b/drivers/net/liquidio/lio_ethdev.c
> @@ -412,7 +412,8 @@ lio_dev_info_get(struct rte_eth_dev *eth_dev,
>   	devinfo->rx_offload_capa = (DEV_RX_OFFLOAD_IPV4_CKSUM		|
>   				    DEV_RX_OFFLOAD_UDP_CKSUM		|
>   				    DEV_RX_OFFLOAD_TCP_CKSUM		|
> -				    DEV_RX_OFFLOAD_VLAN_STRIP);
> +				    DEV_RX_OFFLOAD_VLAN_STRIP		|
> +				    DEV_RX_OFFLOAD_RSS_HASH);
>   	devinfo->tx_offload_capa = (DEV_TX_OFFLOAD_IPV4_CKSUM		|
>   				    DEV_TX_OFFLOAD_UDP_CKSUM		|
>   				    DEV_TX_OFFLOAD_TCP_CKSUM		|
> @@ -1735,6 +1736,10 @@ lio_dev_configure(struct rte_eth_dev *eth_dev)
>   
>   	PMD_INIT_FUNC_TRACE();
>   
> +	if (!(eth_dev->data->dev_conf.rxmode.offloads &
> +						DEV_RX_OFFLOAD_RSS_HASH))
> +		eth_dev->data->dev_conf.rxmode.offloads |=
> +						DEV_RX_OFFLOAD_RSS_HASH;
>   	/* Inform firmware about change in number of queues to use.
>   	 * Disable IO queues and reset registers for re-configuration.
>   	 */
> diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index 
> 931e4f4fe..6df2f6f90 100644
> --- a/drivers/net/mlx4/mlx4.c
> +++ b/drivers/net/mlx4/mlx4.c
> @@ -248,6 +248,9 @@ mlx4_dev_configure(struct rte_eth_dev *dev)
>   	struct rte_flow_error error;
>   	int ret;
>   
> +	if (!(dev->data->dev_conf.rxmode.offload & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offload |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* Prepare internal flow rules. */
>   	ret = mlx4_flow_sync(priv, &error);
>   	if (ret) {
> diff --git a/drivers/net/mlx4/mlx4_rxq.c b/drivers/net/mlx4/mlx4_rxq.c 
> index f45c1ff85..4a6fbd922 100644
> --- a/drivers/net/mlx4/mlx4_rxq.c
> +++ b/drivers/net/mlx4/mlx4_rxq.c
> @@ -685,7 +685,8 @@ mlx4_get_rx_queue_offloads(struct mlx4_priv *priv)  {
>   	uint64_t offloads = DEV_RX_OFFLOAD_SCATTER |
>   			    DEV_RX_OFFLOAD_KEEP_CRC |
> -			    DEV_RX_OFFLOAD_JUMBO_FRAME;
> +			    DEV_RX_OFFLOAD_JUMBO_FRAME |
> +			    DEV_RX_OFFLOAD_RSS_HASH;
>   
>   	if (priv->hw_csum)
>   		offloads |= DEV_RX_OFFLOAD_CHECKSUM; diff --git 
> a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c 
> index 2278b24c0..e87d52ea1 100644
> --- a/drivers/net/mlx5/mlx5_ethdev.c
> +++ b/drivers/net/mlx5/mlx5_ethdev.c
> @@ -407,6 +407,10 @@ mlx5_dev_configure(struct rte_eth_dev *dev)
>   		rte_errno = ENOMEM;
>   		return -rte_errno;
>   	}
> +
> +	if (!(dev->data->dev_conf.rxmode.offload & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offload |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	memcpy(priv->rss_conf.rss_key,
>   	       use_app_rss_key ?
>   	       dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key :
> diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c 
> index f0ab8438d..c8e1fc4b6 100644
> --- a/drivers/net/mlx5/mlx5_rxq.c
> +++ b/drivers/net/mlx5/mlx5_rxq.c
> @@ -368,7 +368,8 @@ mlx5_get_rx_queue_offloads(struct rte_eth_dev *dev)
>   	struct mlx5_dev_config *config = &priv->config;
>   	uint64_t offloads = (DEV_RX_OFFLOAD_SCATTER |
>   			     DEV_RX_OFFLOAD_TIMESTAMP |
> -			     DEV_RX_OFFLOAD_JUMBO_FRAME);
> +			     DEV_RX_OFFLOAD_JUMBO_FRAME |
> +			     DEV_RX_OFFLOAD_RSS_HASH);
>   
>   	if (config->hw_fcs_strip)
>   		offloads |= DEV_RX_OFFLOAD_KEEP_CRC; diff --git 
> a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c 
> index eed8dece9..5c027e1a4 100644
> --- a/drivers/net/netvsc/hn_ethdev.c
> +++ b/drivers/net/netvsc/hn_ethdev.c
> @@ -532,6 +532,9 @@ static int hn_dev_configure(struct rte_eth_dev 
> *dev)
>   
>   	PMD_INIT_FUNC_TRACE();
>   
> +	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev_conf->rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	unsupported = txmode->offloads & ~HN_TX_OFFLOAD_CAPS;
>   	if (unsupported) {
>   		PMD_DRV_LOG(NOTICE,
> diff --git a/drivers/net/netvsc/hn_rndis.c 
> b/drivers/net/netvsc/hn_rndis.c index a67bc7a79..2b4714042 100644
> --- a/drivers/net/netvsc/hn_rndis.c
> +++ b/drivers/net/netvsc/hn_rndis.c
> @@ -897,7 +897,8 @@ int hn_rndis_get_offload(struct hn_data *hv,
>   	    == HN_NDIS_LSOV2_CAP_IP6)
>   		dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO;
>   
> -	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP;
> +	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP |
> +				    DEV_RX_OFFLOAD_RSS_HASH;
>   
>   	if (hwcaps.ndis_csum.ndis_ip4_rxcsum & NDIS_RXCSUM_CAP_IP4)
>   		dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_IPV4_CKSUM; diff --git 
> a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c index 
> 22a8b2d19..e288a7f7e 100644
> --- a/drivers/net/nfp/nfp_net.c
> +++ b/drivers/net/nfp/nfp_net.c
> @@ -407,6 +407,9 @@ nfp_net_configure(struct rte_eth_dev *dev)
>   	rxmode = &dev_conf->rxmode;
>   	txmode = &dev_conf->txmode;
>   
> +	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* Checking TX mode */
>   	if (txmode->mq_mode) {
>   		PMD_INIT_LOG(INFO, "TX mq_mode DCB and VMDq not supported"); @@ -1236,7 +1239,8 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>   					     DEV_RX_OFFLOAD_UDP_CKSUM |
>   					     DEV_RX_OFFLOAD_TCP_CKSUM;
>   
> -	dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME;
> +	dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME |
> +				     DEV_RX_OFFLOAD_RSS_HASH;
>   
>   	if (hw->cap & NFP_NET_CFG_CTRL_TXVLAN)
>   		dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT; diff --git 
> a/drivers/net/octeontx2/otx2_ethdev.c 
> b/drivers/net/octeontx2/otx2_ethdev.c
> index 62291c698..d6e8ae745 100644
> --- a/drivers/net/octeontx2/otx2_ethdev.c
> +++ b/drivers/net/octeontx2/otx2_ethdev.c
> @@ -575,7 +575,8 @@ nix_rx_offload_flags(struct rte_eth_dev *eth_dev)
>   	struct rte_eth_rxmode *rxmode = &conf->rxmode;
>   	uint16_t flags = 0;
>   
> -	if (rxmode->mq_mode == ETH_MQ_RX_RSS)
> +	if (rxmode->mq_mode == ETH_MQ_RX_RSS &&
> +			(dev->rx_offloads & DEV_RX_OFFLOAD_RSS_HASH))
>   		flags |= NIX_RX_OFFLOAD_RSS_F;
>   
>   	if (dev->rx_offloads & (DEV_RX_OFFLOAD_TCP_CKSUM | diff --git 
> a/drivers/net/octeontx2/otx2_ethdev.h 
> b/drivers/net/octeontx2/otx2_ethdev.h
> index 4d9ed4870..d581240fe 100644
> --- a/drivers/net/octeontx2/otx2_ethdev.h
> +++ b/drivers/net/octeontx2/otx2_ethdev.h
> @@ -122,8 +122,8 @@
>   	DEV_TX_OFFLOAD_MT_LOCKFREE	| \
>   	DEV_TX_OFFLOAD_VLAN_INSERT	| \
>   	DEV_TX_OFFLOAD_QINQ_INSERT	| \
> -	DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM | \
> -	DEV_TX_OFFLOAD_OUTER_UDP_CKSUM  | \
> +	DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM	| \
> +	DEV_TX_OFFLOAD_OUTER_UDP_CKSUM	| \
>   	DEV_TX_OFFLOAD_TCP_CKSUM	| \
>   	DEV_TX_OFFLOAD_UDP_CKSUM	| \
>   	DEV_TX_OFFLOAD_SCTP_CKSUM	| \
> @@ -140,11 +140,12 @@
>   	DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM | \
>   	DEV_RX_OFFLOAD_SCATTER		| \
>   	DEV_RX_OFFLOAD_JUMBO_FRAME	PKT_RX_RSS_HASH| \
> -	DEV_RX_OFFLOAD_OUTER_UDP_CKSUM | \
> -	DEV_RX_OFFLOAD_VLAN_STRIP | \
> -	DEV_RX_OFFLOAD_VLAN_FILTER | \
> -	DEV_RX_OFFLOAD_QINQ_STRIP | \
> -	DEV_RX_OFFLOAD_TIMESTAMP)
> +	DEV_RX_OFFLOAD_OUTER_UDP_CKSUM	| \
> +	DEV_RX_OFFLOAD_VLAN_STRIP	| \
> +	DEV_RX_OFFLOAD_VLAN_FILTER	| \
> +	DEV_RX_OFFLOAD_QINQ_STRIP	| \
> +	DEV_RX_OFFLOAD_TIMESTAMP	| \
> +	DEV_RX_OFFLOAD_RSS_HASH)
>   
>   #define NIX_DEFAULT_RSS_CTX_GROUP  0
>   #define NIX_DEFAULT_RSS_MCAM_IDX  -1 diff --git 
> a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c 
> index 53fdfde9a..8cdf04eaf 100644
> --- a/drivers/net/qede/qede_ethdev.c
> +++ b/drivers/net/qede/qede_ethdev.c
> @@ -1182,6 +1182,9 @@ static int qede_dev_configure(struct rte_eth_dev 
> *eth_dev)
>   
>   	PMD_INIT_FUNC_TRACE(edev);
>   
> +	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	/* We need to have min 1 RX queue.There is no min check in
>   	 * rte_eth_dev_configure(), so we are checking it here.
>   	 */
> @@ -1302,7 +1305,8 @@ qede_dev_info_getPKT_RX_RSS_HASH(struct rte_eth_dev *eth_dev,
>   				     DEV_RX_OFFLOAD_SCATTER	|
>   				     DEV_RX_OFFLOAD_JUMBO_FRAME |
>   				     DEV_RX_OFFLOAD_VLAN_FILTER |
> -				     DEV_RX_OFFLOAD_VLAN_STRIP);
> +				     DEV_RX_OFFLOAD_VLAN_STRIP  |
> +				     DEV_RX_OFFLOAD_RSS_HASH);
>   	dev_info->rx_queue_offload_capa = 0;
>   
>   	/* TX offloads are on a per-packet basis, so it is applicable diff 
> --git a/drivers/net/sfc/sfc_ef10_essb_rx.c 
> b/drivers/net/sfc/sfc_ef10_essb_rx.c
> index 63da807ea..d9d2ce6bd 100644
> --- a/drivers/net/sfc/sfc_ef10_essb_rx.c
> +++ b/drivers/net/sfc/sfc_ef10_essb_rx.c
> @@ -715,7 +715,8 @@ struct sfc_dp_rx sfc_ef10_essb_rx = {
>   	},
>   	.features		= SFC_DP_RX_FEAT_FLOW_FLAG |
>   				  SFC_DP_RX_FEAT_FLOW_MARK,
> -	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM,
> +	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM |
> +				  DEV_RX_OFFLOAD_RSS_HASH,
>   	.queue_offload_capa	= 0,
>   	.get_dev_info		= sfc_ef10_essb_rx_get_dev_info,
>   	.pool_ops_supported	= sfc_ef10_essb_rx_pool_ops_supported,
> diff --git a/drivers/net/sfc/sfc_ef10_rx.c 
> b/drivers/net/sfc/sfc_ef10_rx.c index f2fc6e70a..9e527b7fb 100644
> --- a/drivers/net/sfc/sfc_ef10_rx.c
> +++ b/drivers/net/sfc/sfc_ef10_rx.c
> @@ -796,7 +796,8 @@ struct sfc_dp_rx sfc_ef10_rx = {
>   	.features		= SFC_DP_RX_FEAT_MULTI_PROCESS |
>   				  SFC_DP_RX_FEAT_INTR,
>   	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM |
> -				  DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM,
> +				  DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
> +				  DEV_RX_OFFLOAD_RSS_HASH,
>   	.queue_offload_capa	= DEV_RX_OFFLOAD_SCATTER,
>   	.get_dev_info		= sfc_ef10_rx_get_dev_info,
>   	.qsize_up_rings		= sfc_ef10_rx_qsize_up_rings,
> diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c index 
> e6809bb64..10fa1e5ff 100644
> --- a/drivers/net/sfc/sfc_rx.c
> +++ b/drivers/net/sfc/sfc_rx.c
> @@ -617,7 +617,8 @@ struct sfc_dp_rx sfc_efx_rx = {
>   		.hw_fw_caps	= 0,
>   	},
>   	.features		= SFC_DP_RX_FEAT_INTR,
> -	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM,
> +	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM |
> +				  DEV_RX_OFFLOAD_RSS_HASH,
>   	.queue_offload_capa	= DEV_RX_OFFLOAD_SCATTER,
>   	.qsize_up_rings		= sfc_efx_rx_qsize_up_rings,
>   	.qcreate		= sfc_efx_rx_qcreate,
> @@ -1556,6 +1557,10 @@ sfc_rx_check_mode(struct sfc_adapter *sa, struct rte_eth_rxmode *rxmode)
>   		rxmode->offloads |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
>   	}
>   
> +	if ((offloads_supported & DEV_RX_OFFLOAD_RSS_HASH) &&
> +	    (~rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	return rc;
>   }
>   
> diff --git a/drivers/net/thunderx/nicvf_ethdev.c 
> b/drivers/net/thunderx/nicvf_ethdev.c
> index b93d45712..28ee3e46d 100644
> --- a/drivers/net/thunderx/nicvf_ethdev.c
> +++ b/drivers/net/thunderx/nicvf_ethdev.c
> @@ -1920,6 +1920,9 @@ nicvf_dev_configure(struct rte_eth_dev *dev)
>   
>   	PMD_INIT_FUNC_TRACE();
>   
> +	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	if (!rte_eal_has_hugepages()) {
>   		PMD_INIT_LOG(INFO, "Huge page is not configured");
>   		return -EINVAL;
> diff --git a/drivers/net/thunderx/nicvf_ethdev.h 
> b/drivers/net/thunderx/nicvf_ethdev.h
> index c0bfbf848..391411799 100644
> --- a/drivers/net/thunderx/nicvf_ethdev.h
> +++ b/drivers/net/thunderx/nicvf_ethdev.h
> @@ -41,7 +41,8 @@
>   	DEV_RX_OFFLOAD_CHECKSUM    | \
>   	DEV_RX_OFFLOAD_VLAN_STRIP  | \
>   	DEV_RX_OFFLOAD_JUMBO_FRAME | \
> -	DEV_RX_OFFLOAD_SCATTER)
> +	DEV_RX_OFFLOAD_SCATTER     | \
> +	DEV_RX_OFFLOAD_RSS_HASH)
>   
>   #define NICVF_DEFAULT_RX_FREE_THRESH    224
>   #define NICVF_DEFAULT_TX_FREE_THRESH    224
> diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c 
> b/drivers/net/vmxnet3/vmxnet3_ethdev.c
> index d1faeaa81..5ef6ad43c 100644
> --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
> +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
> @@ -56,7 +56,8 @@
>   	 DEV_RX_OFFLOAD_UDP_CKSUM |	\
>   	 DEV_RX_OFFLOAD_TCP_CKSUM |	\
>   	 DEV_RX_OFFLOAD_TCP_LRO |	\
> -	 DEV_RX_OFFLOAD_JUMBO_FRAME)
> +	 DEV_RX_OFFLOAD_JUMBO_FRAME |   \
> +	 DEV_RX_OFFLOAD_RSS_HASH)
>   
>   static int eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev);  
> static int eth_vmxnet3_dev_uninit(struct rte_eth_dev *eth_dev); @@ 
> -407,6 +408,9 @@ vmxnet3_dev_configure(struct rte_eth_dev *dev)
>   
>   	PMD_INIT_FUNC_TRACE();
>   
> +	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
> +		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> +
>   	if (dev->data->nb_tx_queues > VMXNET3_MAX_TX_QUEUES ||
>   	    dev->data->nb_rx_queues > VMXNET3_MAX_RX_QUEUES) {
>   		PMD_INIT_LOG(ERR, "ERROR: Number of queues not supported");
> --
> 2.17.1
>
  

Patch

diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 7d9459f0a..01d48f47c 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -123,7 +123,8 @@  static const struct rte_pci_id bnxt_pci_id_map[] = {
 				     DEV_RX_OFFLOAD_KEEP_CRC | \
 				     DEV_RX_OFFLOAD_VLAN_EXTEND | \
 				     DEV_RX_OFFLOAD_TCP_LRO | \
-				     DEV_RX_OFFLOAD_SCATTER)
+				     DEV_RX_OFFLOAD_SCATTER | \
+				     DEV_RX_OFFLOAD_RSS_HASH)
 
 static int bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask);
 static void bnxt_print_link_info(struct rte_eth_dev *eth_dev);
@@ -689,6 +690,11 @@  static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
 	bp->rx_cp_nr_rings = bp->rx_nr_rings;
 	bp->tx_cp_nr_rings = bp->tx_nr_rings;
 
+	if (!(rx_offloads & DEV_RX_OFFLOAD_RSS_HASH)) {
+		rx_offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+		eth_dev->data->dev_conf.rxmode.offloads = rx_offloads;
+	}
+
 	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
 		eth_dev->data->mtu =
 			eth_dev->data->dev_conf.rxmode.max_rx_pkt_len -
diff --git a/drivers/net/cxgbe/cxgbe.h b/drivers/net/cxgbe/cxgbe.h
index ed1be3559..6c1f73ac4 100644
--- a/drivers/net/cxgbe/cxgbe.h
+++ b/drivers/net/cxgbe/cxgbe.h
@@ -47,7 +47,8 @@ 
 			   DEV_RX_OFFLOAD_UDP_CKSUM | \
 			   DEV_RX_OFFLOAD_TCP_CKSUM | \
 			   DEV_RX_OFFLOAD_JUMBO_FRAME | \
-			   DEV_RX_OFFLOAD_SCATTER)
+			   DEV_RX_OFFLOAD_SCATTER | \
+			   DEV_RX_OFFLOAD_RSS_HASH)
 
 
 /* Common PF and VF devargs */
diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c
index 615dda607..6df127087 100644
--- a/drivers/net/cxgbe/cxgbe_ethdev.c
+++ b/drivers/net/cxgbe/cxgbe_ethdev.c
@@ -426,6 +426,11 @@  int cxgbe_dev_configure(struct rte_eth_dev *eth_dev)
 
 	CXGBE_FUNC_TRACE();
 
+	if (!(eth_dev->data->dev_conf.rxmode.offloads &
+				DEV_RX_OFFLOAD_RSS_HASH))
+		eth_dev->data->dev_conf.rxmode.offloads |=
+							DEV_RX_OFFLOAD_RSS_HASH;
+
 	if (!(adapter->flags & FW_QUEUE_BOUND)) {
 		err = cxgbe_setup_sge_fwevtq(adapter);
 		if (err)
diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c
index caf255d67..096da752d 100644
--- a/drivers/net/dpaa/dpaa_ethdev.c
+++ b/drivers/net/dpaa/dpaa_ethdev.c
@@ -56,7 +56,8 @@  static uint64_t dev_rx_offloads_nodis =
 		DEV_RX_OFFLOAD_IPV4_CKSUM |
 		DEV_RX_OFFLOAD_UDP_CKSUM |
 		DEV_RX_OFFLOAD_TCP_CKSUM |
-		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
+		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
+		DEV_RX_OFFLOAD_RSS_HASH;
 
 /* Supported Tx offloads */
 static uint64_t dev_tx_offloads_sup =
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index 03131b903..eea31f254 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -45,6 +45,7 @@  static uint64_t dev_rx_offloads_sup =
 
 /* Rx offloads which cannot be disabled */
 static uint64_t dev_rx_offloads_nodis =
+		DEV_RX_OFFLOAD_RSS_HASH |
 		DEV_RX_OFFLOAD_SCATTER;
 
 /* Supported Tx offloads */
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index ce7c9e664..22665b51c 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -1182,6 +1182,9 @@  eth_igb_configure(struct rte_eth_dev *dev)
 
 	PMD_INIT_FUNC_TRACE();
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* multipe queue mode checking */
 	ret  = igb_check_mq_mode(dev);
 	if (ret != 0) {
@@ -3255,6 +3258,9 @@  igbvf_dev_configure(struct rte_eth_dev *dev)
 	PMD_INIT_LOG(DEBUG, "Configured Virtual Function port id: %d",
 		     dev->data->port_id);
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/*
 	 * VF has no ability to enable/disable HW CRC
 	 * Keep the persistent behavior the same as Host PF
diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c
index c5606de5d..684fa4ad8 100644
--- a/drivers/net/e1000/igb_rxtx.c
+++ b/drivers/net/e1000/igb_rxtx.c
@@ -1646,7 +1646,8 @@  igb_get_rx_port_offloads_capa(struct rte_eth_dev *dev)
 			  DEV_RX_OFFLOAD_TCP_CKSUM   |
 			  DEV_RX_OFFLOAD_JUMBO_FRAME |
 			  DEV_RX_OFFLOAD_KEEP_CRC    |
-			  DEV_RX_OFFLOAD_SCATTER;
+			  DEV_RX_OFFLOAD_SCATTER     |
+			  DEV_RX_OFFLOAD_RSS_HASH;
 
 	return rx_offload_capa;
 }
diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c
index 12c59a3c5..d2d1488d9 100644
--- a/drivers/net/enic/enic_ethdev.c
+++ b/drivers/net/enic/enic_ethdev.c
@@ -405,6 +405,11 @@  static int enicpmd_dev_configure(struct rte_eth_dev *eth_dev)
 		return ret;
 	}
 
+	if (!(eth_dev->data->dev_conf.rxmode.offloads &
+						DEV_RX_OFFLOAD_RSS_HASH))
+		eth_dev->data->dev_conf.rxmode.offloads |=
+						DEV_RX_OFFLOAD_RSS_HASH;
+
 	enic->mc_count = 0;
 	enic->hw_ip_checksum = !!(eth_dev->data->dev_conf.rxmode.offloads &
 				  DEV_RX_OFFLOAD_CHECKSUM);
diff --git a/drivers/net/enic/enic_res.c b/drivers/net/enic/enic_res.c
index f403a0b66..7c3c270a2 100644
--- a/drivers/net/enic/enic_res.c
+++ b/drivers/net/enic/enic_res.c
@@ -205,7 +205,8 @@  int enic_get_vnic_config(struct enic *enic)
 		DEV_RX_OFFLOAD_VLAN_STRIP |
 		DEV_RX_OFFLOAD_IPV4_CKSUM |
 		DEV_RX_OFFLOAD_UDP_CKSUM |
-		DEV_RX_OFFLOAD_TCP_CKSUM;
+		DEV_RX_OFFLOAD_TCP_CKSUM |
+		DEV_RX_OFFLOAD_RSS_HASH;
 	enic->tx_offload_mask =
 		PKT_TX_IPV6 |
 		PKT_TX_IPV4 |
diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
index 99c4366e4..2e834130d 100644
--- a/drivers/net/fm10k/fm10k_ethdev.c
+++ b/drivers/net/fm10k/fm10k_ethdev.c
@@ -461,6 +461,9 @@  fm10k_dev_configure(struct rte_eth_dev *dev)
 
 	PMD_INIT_FUNC_TRACE();
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* multipe queue mode checking */
 	ret  = fm10k_check_mq_mode(dev);
 	if (ret != 0) {
@@ -1805,7 +1808,8 @@  static uint64_t fm10k_get_rx_port_offloads_capa(struct rte_eth_dev *dev)
 			   DEV_RX_OFFLOAD_UDP_CKSUM   |
 			   DEV_RX_OFFLOAD_TCP_CKSUM   |
 			   DEV_RX_OFFLOAD_JUMBO_FRAME |
-			   DEV_RX_OFFLOAD_HEADER_SPLIT);
+			   DEV_RX_OFFLOAD_HEADER_SPLIT |
+			   DEV_RX_OFFLOAD_RSS_HASH);
 }
 
 static int
diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c
index 9f37a404b..6673777e9 100644
--- a/drivers/net/hinic/hinic_pmd_ethdev.c
+++ b/drivers/net/hinic/hinic_pmd_ethdev.c
@@ -318,6 +318,9 @@  static int hinic_dev_configure(struct rte_eth_dev *dev)
 		return -EINVAL;
 	}
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* mtu size is 256~9600 */
 	if (dev->data->dev_conf.rxmode.max_rx_pkt_len < HINIC_MIN_FRAME_SIZE ||
 	    dev->data->dev_conf.rxmode.max_rx_pkt_len >
@@ -740,7 +743,8 @@  hinic_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
 				DEV_RX_OFFLOAD_VLAN_FILTER |
 				DEV_RX_OFFLOAD_SCATTER |
 				DEV_RX_OFFLOAD_JUMBO_FRAME |
-				DEV_RX_OFFLOAD_TCP_LRO;
+				DEV_RX_OFFLOAD_TCP_LRO |
+				DEV_RX_OFFLOAD_RSS_HASH;
 
 	info->tx_queue_offload_capa = 0;
 	info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT |
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 77a46832c..78fea04f8 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -1812,6 +1812,9 @@  i40e_dev_configure(struct rte_eth_dev *dev)
 	ad->tx_simple_allowed = true;
 	ad->tx_vec_allowed = true;
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* Only legacy filter API needs the following fdir config. So when the
 	 * legacy filter API is deprecated, the following codes should also be
 	 * removed.
@@ -3613,7 +3616,8 @@  i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 		DEV_RX_OFFLOAD_SCATTER |
 		DEV_RX_OFFLOAD_VLAN_EXTEND |
 		DEV_RX_OFFLOAD_VLAN_FILTER |
-		DEV_RX_OFFLOAD_JUMBO_FRAME;
+		DEV_RX_OFFLOAD_JUMBO_FRAME |
+		DEV_RX_OFFLOAD_RSS_HASH;
 
 	dev_info->tx_queue_offload_capa = DEV_TX_OFFLOAD_MBUF_FAST_FREE;
 	dev_info->tx_offload_capa =
diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
index eebc49ade..172c3f6ac 100644
--- a/drivers/net/iavf/iavf_ethdev.c
+++ b/drivers/net/iavf/iavf_ethdev.c
@@ -147,6 +147,9 @@  iavf_dev_configure(struct rte_eth_dev *dev)
 	ad->rx_vec_allowed = true;
 	ad->tx_vec_allowed = true;
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* Vlan stripping setting */
 	if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN) {
 		if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
@@ -522,7 +525,8 @@  iavf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
 		DEV_RX_OFFLOAD_SCATTER |
 		DEV_RX_OFFLOAD_JUMBO_FRAME |
-		DEV_RX_OFFLOAD_VLAN_FILTER;
+		DEV_RX_OFFLOAD_VLAN_FILTER |
+		DEV_RX_OFFLOAD_RSS_HASH;
 	dev_info->tx_offload_capa =
 		DEV_TX_OFFLOAD_VLAN_INSERT |
 		DEV_TX_OFFLOAD_QINQ_INSERT |
diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c
index d74675842..8ff96a96e 100644
--- a/drivers/net/ice/ice_ethdev.c
+++ b/drivers/net/ice/ice_ethdev.c
@@ -2357,6 +2357,9 @@  ice_dev_configure(struct rte_eth_dev *dev)
 	ad->rx_bulk_alloc_allowed = true;
 	ad->tx_simple_allowed = true;
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	return 0;
 }
 
@@ -2800,7 +2803,8 @@  ice_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 			DEV_RX_OFFLOAD_TCP_CKSUM |
 			DEV_RX_OFFLOAD_QINQ_STRIP |
 			DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
-			DEV_RX_OFFLOAD_VLAN_EXTEND;
+			DEV_RX_OFFLOAD_VLAN_EXTEND |
+			DEV_RX_OFFLOAD_RSS_HASH;
 		dev_info->tx_offload_capa |=
 			DEV_TX_OFFLOAD_QINQ_INSERT |
 			DEV_TX_OFFLOAD_IPV4_CKSUM |
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index dbce7a80e..a299c1c74 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -2402,6 +2402,10 @@  ixgbe_dev_configure(struct rte_eth_dev *dev)
 	int ret;
 
 	PMD_INIT_FUNC_TRACE();
+
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* multipe queue mode checking */
 	ret  = ixgbe_check_mq_mode(dev);
 	if (ret != 0) {
@@ -5140,6 +5144,9 @@  ixgbevf_dev_configure(struct rte_eth_dev *dev)
 	PMD_INIT_LOG(DEBUG, "Configured Virtual Function port id: %d",
 		     dev->data->port_id);
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/*
 	 * VF has no ability to enable/disable HW CRC
 	 * Keep the persistent behavior the same as Host PF
diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
index edcfa60ce..fa572d184 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx.c
@@ -2872,7 +2872,8 @@  ixgbe_get_rx_port_offloads(struct rte_eth_dev *dev)
 		   DEV_RX_OFFLOAD_KEEP_CRC    |
 		   DEV_RX_OFFLOAD_JUMBO_FRAME |
 		   DEV_RX_OFFLOAD_VLAN_FILTER |
-		   DEV_RX_OFFLOAD_SCATTER;
+		   DEV_RX_OFFLOAD_SCATTER |
+		   DEV_RX_OFFLOAD_RSS_HASH;
 
 	if (hw->mac.type == ixgbe_mac_82598EB)
 		offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
diff --git a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c
index ec01343f1..d873b6ff4 100644
--- a/drivers/net/liquidio/lio_ethdev.c
+++ b/drivers/net/liquidio/lio_ethdev.c
@@ -412,7 +412,8 @@  lio_dev_info_get(struct rte_eth_dev *eth_dev,
 	devinfo->rx_offload_capa = (DEV_RX_OFFLOAD_IPV4_CKSUM		|
 				    DEV_RX_OFFLOAD_UDP_CKSUM		|
 				    DEV_RX_OFFLOAD_TCP_CKSUM		|
-				    DEV_RX_OFFLOAD_VLAN_STRIP);
+				    DEV_RX_OFFLOAD_VLAN_STRIP		|
+				    DEV_RX_OFFLOAD_RSS_HASH);
 	devinfo->tx_offload_capa = (DEV_TX_OFFLOAD_IPV4_CKSUM		|
 				    DEV_TX_OFFLOAD_UDP_CKSUM		|
 				    DEV_TX_OFFLOAD_TCP_CKSUM		|
@@ -1735,6 +1736,10 @@  lio_dev_configure(struct rte_eth_dev *eth_dev)
 
 	PMD_INIT_FUNC_TRACE();
 
+	if (!(eth_dev->data->dev_conf.rxmode.offloads &
+						DEV_RX_OFFLOAD_RSS_HASH))
+		eth_dev->data->dev_conf.rxmode.offloads |=
+						DEV_RX_OFFLOAD_RSS_HASH;
 	/* Inform firmware about change in number of queues to use.
 	 * Disable IO queues and reset registers for re-configuration.
 	 */
diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
index 931e4f4fe..6df2f6f90 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -248,6 +248,9 @@  mlx4_dev_configure(struct rte_eth_dev *dev)
 	struct rte_flow_error error;
 	int ret;
 
+	if (!(dev->data->dev_conf.rxmode.offload & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offload |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* Prepare internal flow rules. */
 	ret = mlx4_flow_sync(priv, &error);
 	if (ret) {
diff --git a/drivers/net/mlx4/mlx4_rxq.c b/drivers/net/mlx4/mlx4_rxq.c
index f45c1ff85..4a6fbd922 100644
--- a/drivers/net/mlx4/mlx4_rxq.c
+++ b/drivers/net/mlx4/mlx4_rxq.c
@@ -685,7 +685,8 @@  mlx4_get_rx_queue_offloads(struct mlx4_priv *priv)
 {
 	uint64_t offloads = DEV_RX_OFFLOAD_SCATTER |
 			    DEV_RX_OFFLOAD_KEEP_CRC |
-			    DEV_RX_OFFLOAD_JUMBO_FRAME;
+			    DEV_RX_OFFLOAD_JUMBO_FRAME |
+			    DEV_RX_OFFLOAD_RSS_HASH;
 
 	if (priv->hw_csum)
 		offloads |= DEV_RX_OFFLOAD_CHECKSUM;
diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index 2278b24c0..e87d52ea1 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -407,6 +407,10 @@  mlx5_dev_configure(struct rte_eth_dev *dev)
 		rte_errno = ENOMEM;
 		return -rte_errno;
 	}
+
+	if (!(dev->data->dev_conf.rxmode.offload & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offload |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	memcpy(priv->rss_conf.rss_key,
 	       use_app_rss_key ?
 	       dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key :
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index f0ab8438d..c8e1fc4b6 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -368,7 +368,8 @@  mlx5_get_rx_queue_offloads(struct rte_eth_dev *dev)
 	struct mlx5_dev_config *config = &priv->config;
 	uint64_t offloads = (DEV_RX_OFFLOAD_SCATTER |
 			     DEV_RX_OFFLOAD_TIMESTAMP |
-			     DEV_RX_OFFLOAD_JUMBO_FRAME);
+			     DEV_RX_OFFLOAD_JUMBO_FRAME |
+			     DEV_RX_OFFLOAD_RSS_HASH);
 
 	if (config->hw_fcs_strip)
 		offloads |= DEV_RX_OFFLOAD_KEEP_CRC;
diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c
index eed8dece9..5c027e1a4 100644
--- a/drivers/net/netvsc/hn_ethdev.c
+++ b/drivers/net/netvsc/hn_ethdev.c
@@ -532,6 +532,9 @@  static int hn_dev_configure(struct rte_eth_dev *dev)
 
 	PMD_INIT_FUNC_TRACE();
 
+	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev_conf->rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	unsupported = txmode->offloads & ~HN_TX_OFFLOAD_CAPS;
 	if (unsupported) {
 		PMD_DRV_LOG(NOTICE,
diff --git a/drivers/net/netvsc/hn_rndis.c b/drivers/net/netvsc/hn_rndis.c
index a67bc7a79..2b4714042 100644
--- a/drivers/net/netvsc/hn_rndis.c
+++ b/drivers/net/netvsc/hn_rndis.c
@@ -897,7 +897,8 @@  int hn_rndis_get_offload(struct hn_data *hv,
 	    == HN_NDIS_LSOV2_CAP_IP6)
 		dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO;
 
-	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP;
+	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP |
+				    DEV_RX_OFFLOAD_RSS_HASH;
 
 	if (hwcaps.ndis_csum.ndis_ip4_rxcsum & NDIS_RXCSUM_CAP_IP4)
 		dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_IPV4_CKSUM;
diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
index 22a8b2d19..e288a7f7e 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -407,6 +407,9 @@  nfp_net_configure(struct rte_eth_dev *dev)
 	rxmode = &dev_conf->rxmode;
 	txmode = &dev_conf->txmode;
 
+	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* Checking TX mode */
 	if (txmode->mq_mode) {
 		PMD_INIT_LOG(INFO, "TX mq_mode DCB and VMDq not supported");
@@ -1236,7 +1239,8 @@  nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 					     DEV_RX_OFFLOAD_UDP_CKSUM |
 					     DEV_RX_OFFLOAD_TCP_CKSUM;
 
-	dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME;
+	dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME |
+				     DEV_RX_OFFLOAD_RSS_HASH;
 
 	if (hw->cap & NFP_NET_CFG_CTRL_TXVLAN)
 		dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT;
diff --git a/drivers/net/octeontx2/otx2_ethdev.c b/drivers/net/octeontx2/otx2_ethdev.c
index 62291c698..d6e8ae745 100644
--- a/drivers/net/octeontx2/otx2_ethdev.c
+++ b/drivers/net/octeontx2/otx2_ethdev.c
@@ -575,7 +575,8 @@  nix_rx_offload_flags(struct rte_eth_dev *eth_dev)
 	struct rte_eth_rxmode *rxmode = &conf->rxmode;
 	uint16_t flags = 0;
 
-	if (rxmode->mq_mode == ETH_MQ_RX_RSS)
+	if (rxmode->mq_mode == ETH_MQ_RX_RSS &&
+			(dev->rx_offloads & DEV_RX_OFFLOAD_RSS_HASH))
 		flags |= NIX_RX_OFFLOAD_RSS_F;
 
 	if (dev->rx_offloads & (DEV_RX_OFFLOAD_TCP_CKSUM |
diff --git a/drivers/net/octeontx2/otx2_ethdev.h b/drivers/net/octeontx2/otx2_ethdev.h
index 4d9ed4870..d581240fe 100644
--- a/drivers/net/octeontx2/otx2_ethdev.h
+++ b/drivers/net/octeontx2/otx2_ethdev.h
@@ -122,8 +122,8 @@ 
 	DEV_TX_OFFLOAD_MT_LOCKFREE	| \
 	DEV_TX_OFFLOAD_VLAN_INSERT	| \
 	DEV_TX_OFFLOAD_QINQ_INSERT	| \
-	DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM | \
-	DEV_TX_OFFLOAD_OUTER_UDP_CKSUM  | \
+	DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM	| \
+	DEV_TX_OFFLOAD_OUTER_UDP_CKSUM	| \
 	DEV_TX_OFFLOAD_TCP_CKSUM	| \
 	DEV_TX_OFFLOAD_UDP_CKSUM	| \
 	DEV_TX_OFFLOAD_SCTP_CKSUM	| \
@@ -140,11 +140,12 @@ 
 	DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM | \
 	DEV_RX_OFFLOAD_SCATTER		| \
 	DEV_RX_OFFLOAD_JUMBO_FRAME	| \
-	DEV_RX_OFFLOAD_OUTER_UDP_CKSUM | \
-	DEV_RX_OFFLOAD_VLAN_STRIP | \
-	DEV_RX_OFFLOAD_VLAN_FILTER | \
-	DEV_RX_OFFLOAD_QINQ_STRIP | \
-	DEV_RX_OFFLOAD_TIMESTAMP)
+	DEV_RX_OFFLOAD_OUTER_UDP_CKSUM	| \
+	DEV_RX_OFFLOAD_VLAN_STRIP	| \
+	DEV_RX_OFFLOAD_VLAN_FILTER	| \
+	DEV_RX_OFFLOAD_QINQ_STRIP	| \
+	DEV_RX_OFFLOAD_TIMESTAMP	| \
+	DEV_RX_OFFLOAD_RSS_HASH)
 
 #define NIX_DEFAULT_RSS_CTX_GROUP  0
 #define NIX_DEFAULT_RSS_MCAM_IDX  -1
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index 53fdfde9a..8cdf04eaf 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -1182,6 +1182,9 @@  static int qede_dev_configure(struct rte_eth_dev *eth_dev)
 
 	PMD_INIT_FUNC_TRACE(edev);
 
+	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	/* We need to have min 1 RX queue.There is no min check in
 	 * rte_eth_dev_configure(), so we are checking it here.
 	 */
@@ -1302,7 +1305,8 @@  qede_dev_info_get(struct rte_eth_dev *eth_dev,
 				     DEV_RX_OFFLOAD_SCATTER	|
 				     DEV_RX_OFFLOAD_JUMBO_FRAME |
 				     DEV_RX_OFFLOAD_VLAN_FILTER |
-				     DEV_RX_OFFLOAD_VLAN_STRIP);
+				     DEV_RX_OFFLOAD_VLAN_STRIP  |
+				     DEV_RX_OFFLOAD_RSS_HASH);
 	dev_info->rx_queue_offload_capa = 0;
 
 	/* TX offloads are on a per-packet basis, so it is applicable
diff --git a/drivers/net/sfc/sfc_ef10_essb_rx.c b/drivers/net/sfc/sfc_ef10_essb_rx.c
index 63da807ea..d9d2ce6bd 100644
--- a/drivers/net/sfc/sfc_ef10_essb_rx.c
+++ b/drivers/net/sfc/sfc_ef10_essb_rx.c
@@ -715,7 +715,8 @@  struct sfc_dp_rx sfc_ef10_essb_rx = {
 	},
 	.features		= SFC_DP_RX_FEAT_FLOW_FLAG |
 				  SFC_DP_RX_FEAT_FLOW_MARK,
-	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM,
+	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM |
+				  DEV_RX_OFFLOAD_RSS_HASH,
 	.queue_offload_capa	= 0,
 	.get_dev_info		= sfc_ef10_essb_rx_get_dev_info,
 	.pool_ops_supported	= sfc_ef10_essb_rx_pool_ops_supported,
diff --git a/drivers/net/sfc/sfc_ef10_rx.c b/drivers/net/sfc/sfc_ef10_rx.c
index f2fc6e70a..9e527b7fb 100644
--- a/drivers/net/sfc/sfc_ef10_rx.c
+++ b/drivers/net/sfc/sfc_ef10_rx.c
@@ -796,7 +796,8 @@  struct sfc_dp_rx sfc_ef10_rx = {
 	.features		= SFC_DP_RX_FEAT_MULTI_PROCESS |
 				  SFC_DP_RX_FEAT_INTR,
 	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM |
-				  DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM,
+				  DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
+				  DEV_RX_OFFLOAD_RSS_HASH,
 	.queue_offload_capa	= DEV_RX_OFFLOAD_SCATTER,
 	.get_dev_info		= sfc_ef10_rx_get_dev_info,
 	.qsize_up_rings		= sfc_ef10_rx_qsize_up_rings,
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index e6809bb64..10fa1e5ff 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -617,7 +617,8 @@  struct sfc_dp_rx sfc_efx_rx = {
 		.hw_fw_caps	= 0,
 	},
 	.features		= SFC_DP_RX_FEAT_INTR,
-	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM,
+	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM |
+				  DEV_RX_OFFLOAD_RSS_HASH,
 	.queue_offload_capa	= DEV_RX_OFFLOAD_SCATTER,
 	.qsize_up_rings		= sfc_efx_rx_qsize_up_rings,
 	.qcreate		= sfc_efx_rx_qcreate,
@@ -1556,6 +1557,10 @@  sfc_rx_check_mode(struct sfc_adapter *sa, struct rte_eth_rxmode *rxmode)
 		rxmode->offloads |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
 	}
 
+	if ((offloads_supported & DEV_RX_OFFLOAD_RSS_HASH) &&
+	    (~rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	return rc;
 }
 
diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c
index b93d45712..28ee3e46d 100644
--- a/drivers/net/thunderx/nicvf_ethdev.c
+++ b/drivers/net/thunderx/nicvf_ethdev.c
@@ -1920,6 +1920,9 @@  nicvf_dev_configure(struct rte_eth_dev *dev)
 
 	PMD_INIT_FUNC_TRACE();
 
+	if (!(rxmode->offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	if (!rte_eal_has_hugepages()) {
 		PMD_INIT_LOG(INFO, "Huge page is not configured");
 		return -EINVAL;
diff --git a/drivers/net/thunderx/nicvf_ethdev.h b/drivers/net/thunderx/nicvf_ethdev.h
index c0bfbf848..391411799 100644
--- a/drivers/net/thunderx/nicvf_ethdev.h
+++ b/drivers/net/thunderx/nicvf_ethdev.h
@@ -41,7 +41,8 @@ 
 	DEV_RX_OFFLOAD_CHECKSUM    | \
 	DEV_RX_OFFLOAD_VLAN_STRIP  | \
 	DEV_RX_OFFLOAD_JUMBO_FRAME | \
-	DEV_RX_OFFLOAD_SCATTER)
+	DEV_RX_OFFLOAD_SCATTER     | \
+	DEV_RX_OFFLOAD_RSS_HASH)
 
 #define NICVF_DEFAULT_RX_FREE_THRESH    224
 #define NICVF_DEFAULT_TX_FREE_THRESH    224
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index d1faeaa81..5ef6ad43c 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -56,7 +56,8 @@ 
 	 DEV_RX_OFFLOAD_UDP_CKSUM |	\
 	 DEV_RX_OFFLOAD_TCP_CKSUM |	\
 	 DEV_RX_OFFLOAD_TCP_LRO |	\
-	 DEV_RX_OFFLOAD_JUMBO_FRAME)
+	 DEV_RX_OFFLOAD_JUMBO_FRAME |   \
+	 DEV_RX_OFFLOAD_RSS_HASH)
 
 static int eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev);
 static int eth_vmxnet3_dev_uninit(struct rte_eth_dev *eth_dev);
@@ -407,6 +408,9 @@  vmxnet3_dev_configure(struct rte_eth_dev *dev)
 
 	PMD_INIT_FUNC_TRACE();
 
+	if (!(dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_RSS_HASH))
+		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
 	if (dev->data->nb_tx_queues > VMXNET3_MAX_TX_QUEUES ||
 	    dev->data->nb_rx_queues > VMXNET3_MAX_RX_QUEUES) {
 		PMD_INIT_LOG(ERR, "ERROR: Number of queues not supported");