macb_runtime_resume() calls clk_prepare_enable() five times without checking the return value. If any clock fails to enable, the driver silently continues with potentially unclocked hardware, which can cause undefined behavior or system instability on resume from runtime suspend. The existing macb_clks_disable() already uses clk_bulk_disable_unprepare() for the symmetric disable path. Align the enable path by using clk_bulk_prepare_enable(), which atomically enables all clocks and automatically rolls back any successfully enabled clocks on failure. Signed-off-by: Gustavo Kenji Mendonça Kaneko --- drivers/net/ethernet/cadence/macb_main.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c index a12aa21244e8..85bd4ff0e4e6 100644 --- a/drivers/net/ethernet/cadence/macb_main.c +++ b/drivers/net/ethernet/cadence/macb_main.c @@ -6185,16 +6185,19 @@ static int __maybe_unused macb_runtime_resume(struct device *dev) { struct net_device *netdev = dev_get_drvdata(dev); struct macb *bp = netdev_priv(netdev); + struct clk_bulk_data clks[] = { + { .clk = bp->pclk }, + { .clk = bp->hclk }, + { .clk = bp->tx_clk }, + { .clk = bp->rx_clk }, + { .clk = bp->tsu_clk }, + }; - if (!(device_may_wakeup(dev))) { - clk_prepare_enable(bp->pclk); - clk_prepare_enable(bp->hclk); - clk_prepare_enable(bp->tx_clk); - clk_prepare_enable(bp->rx_clk); - clk_prepare_enable(bp->tsu_clk); - } else if (!(bp->caps & MACB_CAPS_NEED_TSUCLK)) { - clk_prepare_enable(bp->tsu_clk); - } + if (!(device_may_wakeup(dev))) + return clk_bulk_prepare_enable(ARRAY_SIZE(clks), clks); + + if (!(bp->caps & MACB_CAPS_NEED_TSUCLK)) + return clk_prepare_enable(bp->tsu_clk); return 0; } -- 2.54.0