Commit d7735c6b authored by Raju Rangoju's avatar Raju Rangoju Committed by Paolo Abeni
Browse files

amd-xgbe: add ethtool split header selftest



Adds support for ethtool split header selftest. Performs
UDP and TCP check to ensure split header selft test works
for both packet types.

Signed-off-by: default avatarRaju Rangoju <Raju.Rangoju@amd.com>
Reviewed-by: default avatarMaxime Chevallier <maxime.chevallier@bootlin.com>
Link: https://patch.msgid.link/20251031111555.774425-4-Raju.Rangoju@amd.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 42b06fcc
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -211,6 +211,7 @@ static void xgbe_config_sph_mode(struct xgbe_prv_data *pdata)
	}

	XGMAC_IOWRITE_BITS(pdata, MAC_RCR, HDSMS, XGBE_SPH_HDSMS_SIZE);
	pdata->sph = true;
}

static void xgbe_disable_sph_mode(struct xgbe_prv_data *pdata)
@@ -223,6 +224,7 @@ static void xgbe_disable_sph_mode(struct xgbe_prv_data *pdata)

		XGMAC_DMA_IOWRITE_BITS(pdata->channel[i], DMA_CH_CR, SPH, 0);
	}
	pdata->sph = false;
}

static int xgbe_write_rss_reg(struct xgbe_prv_data *pdata, unsigned int type,
+46 −0
Original line number Diff line number Diff line
@@ -173,6 +173,48 @@ static int xgbe_test_phy_loopback(struct xgbe_prv_data *pdata)
	return ret;
}

static int xgbe_test_sph(struct xgbe_prv_data *pdata)
{
	struct net_packet_attrs attr = {};
	unsigned long cnt_end, cnt_start;
	int ret;

	cnt_start = pdata->ext_stats.rx_split_header_packets;

	if (!pdata->sph) {
		netdev_err(pdata->netdev, "Split Header not enabled\n");
		return -EOPNOTSUPP;
	}

	/* UDP test */
	attr.dst = pdata->netdev->dev_addr;
	attr.tcp = false;

	ret = __xgbe_test_loopback(pdata, &attr);
	if (ret)
		return ret;

	cnt_end = pdata->ext_stats.rx_split_header_packets;
	if (cnt_end <= cnt_start)
		return -EINVAL;

	/* TCP test */
	cnt_start = cnt_end;

	attr.dst = pdata->netdev->dev_addr;
	attr.tcp = true;

	ret = __xgbe_test_loopback(pdata, &attr);
	if (ret)
		return ret;

	cnt_end = pdata->ext_stats.rx_split_header_packets;
	if (cnt_end <= cnt_start)
		return -EINVAL;

	return 0;
}

static const struct xgbe_test xgbe_selftests[] = {
	{
		.name = "MAC Loopback   ",
@@ -182,6 +224,10 @@ static const struct xgbe_test xgbe_selftests[] = {
		.name = "PHY Loopback   ",
		.lb = XGBE_LOOPBACK_NONE,
		.fn = xgbe_test_phy_loopback,
	}, {
		.name = "Split Header   ",
		.lb = XGBE_LOOPBACK_PHY,
		.fn = xgbe_test_sph,
	},
};

+1 −0
Original line number Diff line number Diff line
@@ -1246,6 +1246,7 @@ struct xgbe_prv_data {
	int rx_adapt_retries;
	bool rx_adapt_done;
	bool mode_set;
	bool sph;
};

/* Function prototypes*/