net: stmmac: Tx coe sw fallback
authorRohan G Thomas <rohan.g.thomas@intel.com>
Sat, 16 Sep 2023 06:33:12 +0000 (14:33 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Feb 2024 00:18:47 +0000 (16:18 -0800)
[ Upstream commit 8452a05b2c633b708dbe3e742f71b24bf21fe42d ]

Add sw fallback of tx checksum calculation for those tx queues that
don't support tx checksum offloading. DW xGMAC IP can be synthesized
such that it can support tx checksum offloading only for a few
initial tx queues. Also as Serge pointed out, for the DW QoS IP, tx
coe can be individually configured for each tx queue.

So when tx coe is enabled, for any tx queue that doesn't support
tx coe with 'coe-unsupported' flag set will have a sw fallback
happen in the driver for tx checksum calculation when any packets to
be transmitted on these tx queues.

Signed-off-by: Rohan G Thomas <rohan.g.thomas@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Stable-dep-of: c2945c435c99 ("net: stmmac: Prevent DSA tags from breaking COE")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
include/linux/stmmac.h

index 1bfcf673b3ce7075baafb0dc84a499a3e6bd90ef..59e07efe08c9740f8d36607658500e12cd251369 100644 (file)
@@ -4417,6 +4417,16 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
        WARN_ON(tx_q->tx_skbuff[first_entry]);
 
        csum_insertion = (skb->ip_summed == CHECKSUM_PARTIAL);
+       /* DWMAC IPs can be synthesized to support tx coe only for a few tx
+        * queues. In that case, checksum offloading for those queues that don't
+        * support tx coe needs to fallback to software checksum calculation.
+        */
+       if (csum_insertion &&
+           priv->plat->tx_queues_cfg[queue].coe_unsupported) {
+               if (unlikely(skb_checksum_help(skb)))
+                       goto dma_map_err;
+               csum_insertion = !csum_insertion;
+       }
 
        if (likely(priv->extend_desc))
                desc = (struct dma_desc *)(tx_q->dma_etx + entry);
index 2f0678f15fb7e71f42a5727a4e36887592b3fbf2..30d5e635190e66f6756f0fcfb6580db130c95bb0 100644 (file)
@@ -276,6 +276,9 @@ static int stmmac_mtl_setup(struct platform_device *pdev,
                        plat->tx_queues_cfg[queue].use_prio = true;
                }
 
+               plat->tx_queues_cfg[queue].coe_unsupported =
+                       of_property_read_bool(q_node, "snps,coe-unsupported");
+
                queue++;
        }
        if (queue != plat->tx_queues_to_use) {
index e3f7ee169c0869c4f1d396e5c45583ce9f627849..5acb77968902dc3c8d20ef75945dee1025140b9a 100644 (file)
@@ -139,6 +139,7 @@ struct stmmac_rxq_cfg {
 
 struct stmmac_txq_cfg {
        u32 weight;
+       bool coe_unsupported;
        u8 mode_to_use;
        /* Credit Base Shaper parameters */
        u32 send_slope;