From: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk>
To: Andrew Lunn <andrew@lunn.ch>
Cc: Alexandre Torgue <alexandre.torgue@foss.st.com>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>,
linux-arm-kernel@lists.infradead.org,
linux-stm32@st-md-mailman.stormreply.com, netdev@vger.kernel.org,
Ong Boon Leong <boon.leong.ong@intel.com>,
Paolo Abeni <pabeni@redhat.com>
Subject: [PATCH net-next 01/10] net: stmmac: fix TSO support when some channels have TBS available
Date: Sat, 28 Mar 2026 21:36:41 +0000 [thread overview]
Message-ID: <E1w6bKj-0000000ELtf-3md9@rmk-PC.armlinux.org.uk> (raw)
In-Reply-To: <achJ1dfeT6Q8rBuX@shell.armlinux.org.uk>
According to the STM32MP25xx manual, which is dwmac v5.3, TBS (time
based scheduling) is not permitted for channels which have hardware
TSO enabled. Intel's commit 5e6038b88a57 ("net: stmmac: fix TSO and
TBS feature enabling during driver open") concurs with this, but it
is incomplete.
This commit avoids enabling TSO support on the channels which have
TBS available, which, as far as the hardware is concerned, means we
do not set the TSE bit in the DMA channel's transmit control register.
However, the net device's features apply to all queues(channels), which
means these channels may still be handed TSO skbs to transmit, and the
driver will pass them to stmmac_tso_xmit(). This will generate the
descriptors for TSO, even though the channel has the TSE bit clear.
Fix this by checking whether the queue(channel) has TBS available,
and if it does, fall back to software GSO support.
Fixes: 5e6038b88a57 ("net: stmmac: fix TSO and TBS feature enabling during driver open")
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
.../net/ethernet/stmicro/stmmac/stmmac_main.c | 35 ++++++++++++++++---
1 file changed, 31 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index ce51b9c22129..2957ee4a43db 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -3619,6 +3619,13 @@ static void stmmac_safety_feat_configuration(struct stmmac_priv *priv)
}
}
+static bool stmmac_channel_tso_permitted(struct stmmac_priv *priv,
+ unsigned int chan)
+{
+ /* TSO and TBS cannot co-exist */
+ return !(priv->dma_conf.tx_queue[chan].tbs & STMMAC_TBS_AVAIL);
+}
+
/**
* stmmac_hw_setup - setup mac in a usable state.
* @dev : pointer to the device structure.
@@ -3707,10 +3714,7 @@ static int stmmac_hw_setup(struct net_device *dev)
/* Enable TSO */
if (priv->tso) {
for (chan = 0; chan < tx_cnt; chan++) {
- struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[chan];
-
- /* TSO and TBS cannot co-exist */
- if (tx_q->tbs & STMMAC_TBS_AVAIL)
+ if (!stmmac_channel_tso_permitted(priv, chan))
continue;
stmmac_enable_tso(priv, priv->ioaddr, 1, chan);
@@ -4919,6 +4923,28 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
return NETDEV_TX_OK;
}
+static netdev_features_t stmmac_features_check(struct sk_buff *skb,
+ struct net_device *dev,
+ netdev_features_t features)
+{
+ u16 queue;
+
+ features = vlan_features_check(skb, features);
+
+ if (skb_is_gso(skb)) {
+ /* STM32MP25xx (dwmac v5.3) states "Do not enable time-based
+ * scheduling for channels on which the TSO feature is
+ * enabled." If we have a skb for a channel which has TBS
+ * enabled, fall back to software GSO.
+ */
+ queue = skb_get_queue_mapping(skb);
+ if (!stmmac_channel_tso_permitted(netdev_priv(dev), queue))
+ features &= ~NETIF_F_GSO_MASK;
+ }
+
+ return features;
+}
+
static void stmmac_rx_vlan(struct net_device *dev, struct sk_buff *skb)
{
struct vlan_ethhdr *veth = skb_vlan_eth_hdr(skb);
@@ -7220,6 +7246,7 @@ static void stmmac_get_stats64(struct net_device *dev, struct rtnl_link_stats64
static const struct net_device_ops stmmac_netdev_ops = {
.ndo_open = stmmac_open,
.ndo_start_xmit = stmmac_xmit,
+ .ndo_features_check = stmmac_features_check,
.ndo_stop = stmmac_release,
.ndo_change_mtu = stmmac_change_mtu,
.ndo_fix_features = stmmac_fix_features,
--
2.47.3
next prev parent reply other threads:[~2026-03-28 21:36 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-28 21:36 [PATCH net-next 00/10] net: stmmac: TSO fixes/cleanups Russell King (Oracle)
2026-03-28 21:36 ` Russell King (Oracle) [this message]
2026-03-29 9:40 ` [PATCH net-next 01/10] net: stmmac: fix TSO support when some channels have TBS available Russell King (Oracle)
2026-03-29 14:03 ` Andrew Lunn
2026-03-29 17:42 ` Jakub Kicinski
2026-03-29 18:23 ` Russell King (Oracle)
2026-03-28 21:36 ` [PATCH net-next 02/10] net: stmmac: add TSO check for header length Russell King (Oracle)
2026-03-28 21:36 ` [PATCH net-next 03/10] net: stmmac: move TSO VLAN tag insertion to core code Russell King (Oracle)
2026-03-29 9:09 ` Russell King (Oracle)
2026-03-28 21:36 ` [PATCH net-next 04/10] net: stmmac: always enable channel TSO when supported Russell King (Oracle)
2026-03-28 21:37 ` [PATCH net-next 05/10] net: stmmac: fix .ndo_fix_features() Russell King (Oracle)
2026-03-28 21:37 ` [PATCH net-next 06/10] net: stmmac: simplify GSO/TSO test in stmmac_xmit() Russell King (Oracle)
2026-03-29 9:17 ` Russell King (Oracle)
2026-03-28 21:37 ` [PATCH net-next 07/10] net: stmmac: split out gso features setup Russell King (Oracle)
2026-03-28 21:37 ` [PATCH net-next 08/10] net: stmmac: make stmmac_set_gso_features() more readable Russell King (Oracle)
2026-03-28 21:37 ` [PATCH net-next 09/10] net: stmmac: add warning when TSO is requested but unsupported Russell King (Oracle)
2026-03-28 21:37 ` [PATCH net-next 10/10] net: stmmac: move "TSO supported" message to stmmac_set_gso_features() Russell King (Oracle)
2026-03-29 0:10 ` [PATCH net-next 00/10] net: stmmac: TSO fixes/cleanups Russell King (Oracle)
2026-03-29 18:11 ` Jakub Kicinski
2026-03-29 18:51 ` Russell King (Oracle)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=E1w6bKj-0000000ELtf-3md9@rmk-PC.armlinux.org.uk \
--to=rmk+kernel@armlinux.org.uk \
--cc=alexandre.torgue@foss.st.com \
--cc=andrew+netdev@lunn.ch \
--cc=andrew@lunn.ch \
--cc=boon.leong.ong@intel.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-stm32@st-md-mailman.stormreply.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox