SPH functionality splits header and payload according to split mode and
offsef fields (SPLM and SPLOFST). It is beneficials for Linux network
stack RX processing however it adds a lot of complexity in XDP
processing.

So, this patch makes the split-header (SPH) capability of the controller
is stored in "priv->sph_cap" and the enabling/disabling of SPH is decided
by "priv->sph".

This is to prepare initial XDP enabling for stmmac to disable the use of
SPH whenever XDP is enabled.

Signed-off-by: Ong Boon Leong <boon.leong....@intel.com>
---
 drivers/net/ethernet/stmicro/stmmac/stmmac.h      |  1 +
 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 12 +++++++-----
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h 
b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
index 9966f6f10905..e293423f98c3 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
@@ -160,6 +160,7 @@ struct stmmac_priv {
        bool tx_path_in_lpi_mode;
        bool tso;
        int sph;
+       int sph_cap;
        u32 sarc_type;
 
        unsigned int dma_buf_sz;
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c 
b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index d34388b1ffcc..ace3c3835a9f 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -2858,6 +2858,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool 
init_ptp)
        struct stmmac_priv *priv = netdev_priv(dev);
        u32 rx_cnt = priv->plat->rx_queues_to_use;
        u32 tx_cnt = priv->plat->tx_queues_to_use;
+       bool sph_en;
        u32 chan;
        int ret;
 
@@ -2952,10 +2953,10 @@ static int stmmac_hw_setup(struct net_device *dev, bool 
init_ptp)
        }
 
        /* Enable Split Header */
-       if (priv->sph && priv->hw->rx_csum) {
-               for (chan = 0; chan < rx_cnt; chan++)
-                       stmmac_enable_sph(priv, priv->ioaddr, 1, chan);
-       }
+       sph_en = (priv->hw->rx_csum > 0) && priv->sph;
+       for (chan = 0; chan < rx_cnt; chan++)
+               stmmac_enable_sph(priv, priv->ioaddr, sph_en, chan);
+
 
        /* VLAN Tag Insertion */
        if (priv->dma_cap.vlins)
@@ -5697,7 +5698,8 @@ int stmmac_dvr_probe(struct device *device,
 
        if (priv->dma_cap.sphen) {
                ndev->hw_features |= NETIF_F_GRO;
-               priv->sph = true;
+               priv->sph_cap = true;
+               priv->sph = priv->sph_cap;
                dev_info(priv->device, "SPH feature enabled\n");
        }
 
-- 
2.25.1

Reply via email to