Implement igc_ethtool_get_rxfh_key_size() and extend
igc_ethtool_get_rxfh() to return the RSS key to userspace.

This can be tested using `ethtool -x <dev>`.

Signed-off-by: Kohei Enju <[email protected]>
---
 drivers/net/ethernet/intel/igc/igc_ethtool.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/intel/igc/igc_ethtool.c 
b/drivers/net/ethernet/intel/igc/igc_ethtool.c
index f89c2cbaace0..0482e590bc5a 100644
--- a/drivers/net/ethernet/intel/igc/igc_ethtool.c
+++ b/drivers/net/ethernet/intel/igc/igc_ethtool.c
@@ -1490,6 +1490,11 @@ void igc_write_rss_indir_tbl(struct igc_adapter *adapter)
        }
 }
 
+static u32 igc_ethtool_get_rxfh_key_size(struct net_device *netdev)
+{
+       return IGC_RSS_KEY_SIZE;
+}
+
 static u32 igc_ethtool_get_rxfh_indir_size(struct net_device *netdev)
 {
        return IGC_RETA_SIZE;
@@ -1502,10 +1507,13 @@ static int igc_ethtool_get_rxfh(struct net_device 
*netdev,
        int i;
 
        rxfh->hfunc = ETH_RSS_HASH_TOP;
-       if (!rxfh->indir)
-               return 0;
-       for (i = 0; i < IGC_RETA_SIZE; i++)
-               rxfh->indir[i] = adapter->rss_indir_tbl[i];
+
+       if (rxfh->indir)
+               for (i = 0; i < IGC_RETA_SIZE; i++)
+                       rxfh->indir[i] = adapter->rss_indir_tbl[i];
+
+       if (rxfh->key)
+               memcpy(rxfh->key, adapter->rss_key, sizeof(adapter->rss_key));
 
        return 0;
 }
@@ -2182,6 +2190,7 @@ static const struct ethtool_ops igc_ethtool_ops = {
        .set_coalesce           = igc_ethtool_set_coalesce,
        .get_rxnfc              = igc_ethtool_get_rxnfc,
        .set_rxnfc              = igc_ethtool_set_rxnfc,
+       .get_rxfh_key_size      = igc_ethtool_get_rxfh_key_size,
        .get_rxfh_indir_size    = igc_ethtool_get_rxfh_indir_size,
        .get_rxfh               = igc_ethtool_get_rxfh,
        .set_rxfh               = igc_ethtool_set_rxfh,
-- 
2.51.0

Reply via email to