Commit 861b948a authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

eth: sfc: migrate to new RXFH callbacks



Migrate to new callbacks added by commit 9bb00786 ("net: ethtool:
add dedicated callbacks for getting and setting rxfh fields").

This driver's RXFH config is read only / fixed so the conversion
is purely factoring out the handling into a helper. One thing of
note that this is one of the two drivers which pays attention to
rss_context.

Reviewed-by: default avatarEdward Cree <ecree.xilinx@gmail.com>
Link: https://patch.msgid.link/20250618203823.1336156-4-kuba@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent c58b9d18
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -268,6 +268,7 @@ const struct ethtool_ops efx_ethtool_ops = {
	.rxfh_priv_size		= sizeof(struct efx_rss_context_priv),
	.get_rxfh		= efx_ethtool_get_rxfh,
	.set_rxfh		= efx_ethtool_set_rxfh,
	.get_rxfh_fields	= efx_ethtool_get_rxfh_fields,
	.create_rxfh_context	= efx_ethtool_create_rxfh_context,
	.modify_rxfh_context	= efx_ethtool_modify_rxfh_context,
	.remove_rxfh_context	= efx_ethtool_remove_rxfh_context,
+54 −48
Original line number Diff line number Diff line
@@ -800,24 +800,18 @@ static int efx_ethtool_get_class_rule(struct efx_nic *efx,
	return rc;
}

int efx_ethtool_get_rxnfc(struct net_device *net_dev,
			  struct ethtool_rxnfc *info, u32 *rule_locs)
int efx_ethtool_get_rxfh_fields(struct net_device *net_dev,
				struct ethtool_rxfh_fields *info)
{
	struct efx_nic *efx = efx_netdev_priv(net_dev);
	u32 rss_context = 0;
	s32 rc = 0;

	switch (info->cmd) {
	case ETHTOOL_GRXRINGS:
		info->data = efx->n_rx_channels;
		return 0;

	case ETHTOOL_GRXFH: {
		struct efx_rss_context_priv *ctx = &efx->rss_context.priv;
	struct efx_rss_context_priv *ctx;
	__u64 data;
	int rc = 0;

	ctx = &efx->rss_context.priv;

	mutex_lock(&net_dev->ethtool->rss_lock);
		if (info->flow_type & FLOW_RSS && info->rss_context) {
	if (info->rss_context) {
		ctx = efx_find_rss_context_entry(efx, info->rss_context);
		if (!ctx) {
			rc = -ENOENT;
@@ -829,7 +823,7 @@ int efx_ethtool_get_rxnfc(struct net_device *net_dev,
	if (!efx_rss_active(ctx)) /* No RSS */
		goto out_setdata_unlock;

		switch (info->flow_type & ~FLOW_RSS) {
	switch (info->flow_type) {
	case UDP_V4_FLOW:
	case UDP_V6_FLOW:
		if (ctx->rx_hash_udp_4tuple)
@@ -861,6 +855,18 @@ int efx_ethtool_get_rxnfc(struct net_device *net_dev,
	return rc;
}

int efx_ethtool_get_rxnfc(struct net_device *net_dev,
			  struct ethtool_rxnfc *info, u32 *rule_locs)
{
	struct efx_nic *efx = efx_netdev_priv(net_dev);
	u32 rss_context = 0;
	s32 rc = 0;

	switch (info->cmd) {
	case ETHTOOL_GRXRINGS:
		info->data = efx->n_rx_channels;
		return 0;

	case ETHTOOL_GRXCLSRLCNT:
		info->data = efx_filter_get_rx_id_limit(efx);
		if (info->data == 0)
+2 −0
Original line number Diff line number Diff line
@@ -49,6 +49,8 @@ int efx_ethtool_get_rxfh(struct net_device *net_dev,
int efx_ethtool_set_rxfh(struct net_device *net_dev,
			 struct ethtool_rxfh_param *rxfh,
			 struct netlink_ext_ack *extack);
int efx_ethtool_get_rxfh_fields(struct net_device *net_dev,
				struct ethtool_rxfh_fields *info);
int efx_ethtool_create_rxfh_context(struct net_device *net_dev,
				    struct ethtool_rxfh_context *ctx,
				    const struct ethtool_rxfh_param *rxfh,