Skip to content

Commit 15db8bb

Browse files
Christophe Roullierfourmone
authored andcommitted
net: stmmac: improve robustness suspend/resume ethernet
Fix issue when packet are received during suspend procedure, sometimes error occurs: WARNING: CPU: 1 PID: 0 at net/sched/sch_generic.c:442 dev_watchdog+0x2f4/0x2f8 [ 206.565127] NETDEV WATCHDOG: eth0 (stm32-dwmac): transmit queue 0 timed out Signed-off-by: Christophe Roullier <christophe.roullier@st.com> Change-Id: I650dfb79015f3fcfd8304ca3dcb12a414aca3c50 Reviewed-on: https://gerrit.st.com/c/mpu/oe/st/linux-stm32/+/196503 Reviewed-by: CITOOLS <MDG-smet-aci-reviews@list.st.com> Reviewed-by: Alexandre TORGUE <alexandre.torgue@foss.st.com> Tested-by: Alexandre TORGUE <alexandre.torgue@foss.st.com>
1 parent 70e5859 commit 15db8bb

File tree

1 file changed

+33
-9
lines changed

1 file changed

+33
-9
lines changed

drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1533,18 +1533,18 @@ static void dma_free_tx_skbufs(struct stmmac_priv *priv, u32 queue)
15331533
stmmac_free_tx_buffer(priv, queue, i);
15341534
}
15351535

1536-
/**
1536+
/*
15371537
* stmmac_free_tx_skbufs - free TX skb buffers
15381538
* @priv: private structure
15391539
*/
1540-
static void stmmac_free_tx_skbufs(struct stmmac_priv *priv)
1540+
/*static void stmmac_free_tx_skbufs(struct stmmac_priv *priv)
15411541
{
1542-
u32 tx_queue_cnt = priv->plat->tx_queues_to_use;
1543-
u32 queue;
1542+
u32 tx_queue_cnt = priv->plat->tx_queues_to_use;
1543+
u32 queue;
15441544
1545-
for (queue = 0; queue < tx_queue_cnt; queue++)
1546-
dma_free_tx_skbufs(priv, queue);
1547-
}
1545+
for (queue = 0; queue < tx_queue_cnt; queue++)
1546+
dma_free_tx_skbufs(priv, queue);
1547+
}*/
15481548

15491549
/**
15501550
* free_dma_rx_desc_resources - free RX dma desc resources
@@ -5289,8 +5289,25 @@ int stmmac_resume(struct device *dev)
52895289

52905290
stmmac_reset_queues_param(priv);
52915291

5292-
stmmac_free_tx_skbufs(priv);
5293-
stmmac_clear_descriptors(priv);
5292+
/* Stop TX/RX DMA and clear the descriptors */
5293+
stmmac_stop_all_dma(priv);
5294+
5295+
/* Release and free the Rx/Tx resources */
5296+
free_dma_desc_resources(priv);
5297+
5298+
ret = alloc_dma_desc_resources(priv);
5299+
if (ret < 0) {
5300+
netdev_err(priv->dev, "%s: DMA descriptors allocation failed\n",
5301+
__func__);
5302+
goto dma_desc_error;
5303+
}
5304+
5305+
ret = init_dma_desc_rings(ndev, GFP_KERNEL);
5306+
if (ret < 0) {
5307+
netdev_err(priv->dev, "%s: DMA descriptors initialization failed\n",
5308+
__func__);
5309+
goto init_error;
5310+
}
52945311

52955312
stmmac_hw_setup(ndev, false);
52965313
stmmac_init_coalesce(priv);
@@ -5308,6 +5325,13 @@ int stmmac_resume(struct device *dev)
53085325
netif_device_attach(ndev);
53095326

53105327
return 0;
5328+
init_error:
5329+
free_dma_desc_resources(priv);
5330+
dma_desc_error:
5331+
if (ndev->phydev)
5332+
phy_disconnect(ndev->phydev);
5333+
5334+
return -1;
53115335
}
53125336
EXPORT_SYMBOL_GPL(stmmac_resume);
53135337

0 commit comments

Comments
 (0)