]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
amd-xgbe: add ethtool split header selftest
authorRaju Rangoju <Raju.Rangoju@amd.com>
Fri, 31 Oct 2025 11:15:57 +0000 (16:45 +0530)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 6 Nov 2025 12:38:11 +0000 (13:38 +0100)
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: Raju Rangoju <Raju.Rangoju@amd.com>
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Link: https://patch.msgid.link/20251031111555.774425-4-Raju.Rangoju@amd.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/amd/xgbe/xgbe-dev.c
drivers/net/ethernet/amd/xgbe/xgbe-selftest.c
drivers/net/ethernet/amd/xgbe/xgbe.h

index ffc7d83522c7ee22686be57b41fd03c79743c4d1..b646ae575e6a18c17342801adaa0d65d2a27e685 100644 (file)
@@ -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,
index 23b9d568a861e361b6a01e9d0c2c0306d1ebd581..15c51e96bcdf7fc6109b2603738f3233a4799a83 100644 (file)
@@ -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,
        },
 };
 
index dc03082c59aa6150bb9e0305963eb01a6d9532ce..03ef0f5484830a15a4be4ce6c78cc06260718283 100644 (file)
@@ -1246,6 +1246,7 @@ struct xgbe_prv_data {
        int rx_adapt_retries;
        bool rx_adapt_done;
        bool mode_set;
+       bool sph;
 };
 
 /* Function prototypes*/