| From 82c7ad892af65bde4c21db2016ed4452a7d1aa34 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 21 Apr 2021 17:11:49 +0800 |
| Subject: net: stmmac: fix TSO and TBS feature enabling during driver open |
| |
| From: Ong Boon Leong <boon.leong.ong@intel.com> |
| |
| [ Upstream commit 5e6038b88a5718910dd74b949946d9d9cee9a041 ] |
| |
| TSO and TBS cannot co-exist and current implementation requires two |
| fixes: |
| |
| 1) stmmac_open() does not need to call stmmac_enable_tbs() because |
| the MAC is reset in stmmac_init_dma_engine() anyway. |
| 2) Inside stmmac_hw_setup(), we should call stmmac_enable_tso() for |
| TX Q that is _not_ configured for TBS. |
| |
| Fixes: 579a25a854d4 ("net: stmmac: Initial support for TBS") |
| Signed-off-by: Ong Boon Leong <boon.leong.ong@intel.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 12 +++++++++--- |
| 1 file changed, 9 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
| index 4749bd0af160..c6f24abf6432 100644 |
| --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
| +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
| @@ -2757,8 +2757,15 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) |
| |
| /* Enable TSO */ |
| if (priv->tso) { |
| - for (chan = 0; chan < tx_cnt; chan++) |
| + for (chan = 0; chan < tx_cnt; chan++) { |
| + struct stmmac_tx_queue *tx_q = &priv->tx_queue[chan]; |
| + |
| + /* TSO and TBS cannot co-exist */ |
| + if (tx_q->tbs & STMMAC_TBS_AVAIL) |
| + continue; |
| + |
| stmmac_enable_tso(priv, priv->ioaddr, 1, chan); |
| + } |
| } |
| |
| /* Enable Split Header */ |
| @@ -2850,9 +2857,8 @@ static int stmmac_open(struct net_device *dev) |
| struct stmmac_tx_queue *tx_q = &priv->tx_queue[chan]; |
| int tbs_en = priv->plat->tx_queues_cfg[chan].tbs_en; |
| |
| + /* Setup per-TXQ tbs flag before TX descriptor alloc */ |
| tx_q->tbs |= tbs_en ? STMMAC_TBS_AVAIL : 0; |
| - if (stmmac_enable_tbs(priv, priv->ioaddr, tbs_en, chan)) |
| - tx_q->tbs &= ~STMMAC_TBS_AVAIL; |
| } |
| |
| ret = alloc_dma_desc_resources(priv); |
| -- |
| 2.30.2 |
| |