|
@@ -2853,6 +2853,45 @@ static int ixgbe_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static u32 ixgbe_get_rxfh_key_size(struct net_device *netdev)
|
|
|
+{
|
|
|
+ struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
|
+
|
|
|
+ return sizeof(adapter->rss_key);
|
|
|
+}
|
|
|
+
|
|
|
+static u32 ixgbe_rss_indir_size(struct net_device *netdev)
|
|
|
+{
|
|
|
+ struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
|
+
|
|
|
+ return ixgbe_rss_indir_tbl_entries(adapter);
|
|
|
+}
|
|
|
+
|
|
|
+static void ixgbe_get_reta(struct ixgbe_adapter *adapter, u32 *indir)
|
|
|
+{
|
|
|
+ int i, reta_size = ixgbe_rss_indir_tbl_entries(adapter);
|
|
|
+
|
|
|
+ for (i = 0; i < reta_size; i++)
|
|
|
+ indir[i] = adapter->rss_indir_tbl[i];
|
|
|
+}
|
|
|
+
|
|
|
+static int ixgbe_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
|
|
|
+ u8 *hfunc)
|
|
|
+{
|
|
|
+ struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
|
+
|
|
|
+ if (hfunc)
|
|
|
+ *hfunc = ETH_RSS_HASH_TOP;
|
|
|
+
|
|
|
+ if (indir)
|
|
|
+ ixgbe_get_reta(adapter, indir);
|
|
|
+
|
|
|
+ if (key)
|
|
|
+ memcpy(key, adapter->rss_key, ixgbe_get_rxfh_key_size(netdev));
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int ixgbe_get_ts_info(struct net_device *dev,
|
|
|
struct ethtool_ts_info *info)
|
|
|
{
|
|
@@ -3110,6 +3149,9 @@ static const struct ethtool_ops ixgbe_ethtool_ops = {
|
|
|
.set_coalesce = ixgbe_set_coalesce,
|
|
|
.get_rxnfc = ixgbe_get_rxnfc,
|
|
|
.set_rxnfc = ixgbe_set_rxnfc,
|
|
|
+ .get_rxfh_indir_size = ixgbe_rss_indir_size,
|
|
|
+ .get_rxfh_key_size = ixgbe_get_rxfh_key_size,
|
|
|
+ .get_rxfh = ixgbe_get_rxfh,
|
|
|
.get_channels = ixgbe_get_channels,
|
|
|
.set_channels = ixgbe_set_channels,
|
|
|
.get_ts_info = ixgbe_get_ts_info,
|