net: stmmac: make SPH enable/disable to be configurable
authorOng Boon Leong <boon.leong.ong@intel.com>
Thu, 1 Apr 2021 02:11:13 +0000 (10:11 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 3 Apr 2021 21:13:38 +0000 (14:13 -0700)
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.ong@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/stmmac.h
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

index 9966f6f..e293423 100644 (file)
@@ -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;
index 9d63e8c..18e34a1 100644 (file)
@@ -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)
@@ -5708,7 +5709,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");
        }