|
@@ -794,6 +794,71 @@ static int ixgbevf_set_coalesce(struct net_device *netdev,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int ixgbevf_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info,
|
|
|
+ u32 *rules __always_unused)
|
|
|
+{
|
|
|
+ struct ixgbevf_adapter *adapter = netdev_priv(dev);
|
|
|
+
|
|
|
+ switch (info->cmd) {
|
|
|
+ case ETHTOOL_GRXRINGS:
|
|
|
+ info->data = adapter->num_rx_queues;
|
|
|
+ return 0;
|
|
|
+ default:
|
|
|
+ hw_dbg(&adapter->hw, "Command parameters not supported\n");
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static u32 ixgbevf_get_rxfh_indir_size(struct net_device *netdev)
|
|
|
+{
|
|
|
+ struct ixgbevf_adapter *adapter = netdev_priv(netdev);
|
|
|
+
|
|
|
+ /* We support this operation only for 82599 and x540 at the moment */
|
|
|
+ if (adapter->hw.mac.type < ixgbe_mac_X550_vf)
|
|
|
+ return IXGBEVF_82599_RETA_SIZE;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static u32 ixgbevf_get_rxfh_key_size(struct net_device *netdev)
|
|
|
+{
|
|
|
+ struct ixgbevf_adapter *adapter = netdev_priv(netdev);
|
|
|
+
|
|
|
+ /* We support this operation only for 82599 and x540 at the moment */
|
|
|
+ if (adapter->hw.mac.type < ixgbe_mac_X550_vf)
|
|
|
+ return IXGBEVF_RSS_HASH_KEY_SIZE;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int ixgbevf_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
|
|
|
+ u8 *hfunc)
|
|
|
+{
|
|
|
+ struct ixgbevf_adapter *adapter = netdev_priv(netdev);
|
|
|
+ int err = 0;
|
|
|
+
|
|
|
+ if (hfunc)
|
|
|
+ *hfunc = ETH_RSS_HASH_TOP;
|
|
|
+
|
|
|
+ /* If neither indirection table nor hash key was requested - just
|
|
|
+ * return a success avoiding taking any locks.
|
|
|
+ */
|
|
|
+ if (!indir && !key)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ spin_lock_bh(&adapter->mbx_lock);
|
|
|
+ if (indir)
|
|
|
+ err = ixgbevf_get_reta_locked(&adapter->hw, indir,
|
|
|
+ adapter->num_rx_queues);
|
|
|
+
|
|
|
+ if (!err && key)
|
|
|
+ err = ixgbevf_get_rss_key_locked(&adapter->hw, key);
|
|
|
+
|
|
|
+ spin_unlock_bh(&adapter->mbx_lock);
|
|
|
+
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
static const struct ethtool_ops ixgbevf_ethtool_ops = {
|
|
|
.get_settings = ixgbevf_get_settings,
|
|
|
.get_drvinfo = ixgbevf_get_drvinfo,
|
|
@@ -811,6 +876,10 @@ static const struct ethtool_ops ixgbevf_ethtool_ops = {
|
|
|
.get_ethtool_stats = ixgbevf_get_ethtool_stats,
|
|
|
.get_coalesce = ixgbevf_get_coalesce,
|
|
|
.set_coalesce = ixgbevf_set_coalesce,
|
|
|
+ .get_rxnfc = ixgbevf_get_rxnfc,
|
|
|
+ .get_rxfh_indir_size = ixgbevf_get_rxfh_indir_size,
|
|
|
+ .get_rxfh_key_size = ixgbevf_get_rxfh_key_size,
|
|
|
+ .get_rxfh = ixgbevf_get_rxfh,
|
|
|
};
|
|
|
|
|
|
void ixgbevf_set_ethtool_ops(struct net_device *netdev)
|