diff options
Diffstat (limited to 'queue-5.15/net-ethernet-ti-am65-cpsw-nuss-cleanup-dma-channels-.patch')
-rw-r--r-- | queue-5.15/net-ethernet-ti-am65-cpsw-nuss-cleanup-dma-channels-.patch | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/queue-5.15/net-ethernet-ti-am65-cpsw-nuss-cleanup-dma-channels-.patch b/queue-5.15/net-ethernet-ti-am65-cpsw-nuss-cleanup-dma-channels-.patch new file mode 100644 index 0000000000..76cd597043 --- /dev/null +++ b/queue-5.15/net-ethernet-ti-am65-cpsw-nuss-cleanup-dma-channels-.patch @@ -0,0 +1,66 @@ +From b0847d9ed05135c407d91e33504a8dc13450152f Mon Sep 17 00:00:00 2001 +From: Sasha Levin <sashal@kernel.org> +Date: Wed, 17 Apr 2024 15:24:25 +0530 +Subject: net: ethernet: ti: am65-cpsw-nuss: cleanup DMA Channels before using + them + +From: Siddharth Vadapalli <s-vadapalli@ti.com> + +[ Upstream commit c24cd679b075b0e953ea167b0aa2b2d59e4eba7f ] + +The TX and RX DMA Channels used by the driver to exchange data with CPSW +are not guaranteed to be in a clean state during driver initialization. +The Bootloader could have used the same DMA Channels without cleaning them +up in the event of failure. Thus, reset and disable the DMA Channels to +ensure that they are in a clean state before using them. + +Fixes: 93a76530316a ("net: ethernet: ti: introduce am65x/j721e gigabit eth subsystem driver") +Reported-by: Schuyler Patton <spatton@ti.com> +Signed-off-by: Siddharth Vadapalli <s-vadapalli@ti.com> +Reviewed-by: Roger Quadros <rogerq@kernel.org> +Link: https://lore.kernel.org/r/20240417095425.2253876-1-s-vadapalli@ti.com +Signed-off-by: Jakub Kicinski <kuba@kernel.org> +Signed-off-by: Sasha Levin <sashal@kernel.org> +--- + drivers/net/ethernet/ti/am65-cpsw-nuss.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c +index f94d6d322df42..4bd57b79a023b 100644 +--- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c ++++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c +@@ -2535,6 +2535,8 @@ static void am65_cpsw_unregister_devlink(struct am65_cpsw_common *common) + + static int am65_cpsw_nuss_register_ndevs(struct am65_cpsw_common *common) + { ++ struct am65_cpsw_rx_chn *rx_chan = &common->rx_chns; ++ struct am65_cpsw_tx_chn *tx_chan = common->tx_chns; + struct device *dev = common->dev; + struct devlink_port *dl_port; + struct am65_cpsw_port *port; +@@ -2553,6 +2555,22 @@ static int am65_cpsw_nuss_register_ndevs(struct am65_cpsw_common *common) + return ret; + } + ++ /* The DMA Channels are not guaranteed to be in a clean state. ++ * Reset and disable them to ensure that they are back to the ++ * clean state and ready to be used. ++ */ ++ for (i = 0; i < common->tx_ch_num; i++) { ++ k3_udma_glue_reset_tx_chn(tx_chan[i].tx_chn, &tx_chan[i], ++ am65_cpsw_nuss_tx_cleanup); ++ k3_udma_glue_disable_tx_chn(tx_chan[i].tx_chn); ++ } ++ ++ for (i = 0; i < AM65_CPSW_MAX_RX_FLOWS; i++) ++ k3_udma_glue_reset_rx_chn(rx_chan->rx_chn, i, rx_chan, ++ am65_cpsw_nuss_rx_cleanup, !!i); ++ ++ k3_udma_glue_disable_rx_chn(rx_chan->rx_chn); ++ + ret = am65_cpsw_nuss_register_devlink(common); + if (ret) + return ret; +-- +2.43.0 + |