Commit 587585e1 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Jakub Kicinski
Browse files

net: ethernet: mtk_wed: fix possible deadlock if mtk_wed_wo_init fails



Introduce __mtk_wed_detach() in order to avoid a deadlock in
mtk_wed_attach routine if mtk_wed_wo_init fails since both
mtk_wed_attach and mtk_wed_detach run holding hw_lock mutex.

Fixes: 4c5de09e ("net: ethernet: mtk_wed: add configure wed wo support")
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Reviewed-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent c79e0af5
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -577,12 +577,10 @@ mtk_wed_deinit(struct mtk_wed_device *dev)
}

static void
mtk_wed_detach(struct mtk_wed_device *dev)
__mtk_wed_detach(struct mtk_wed_device *dev)
{
	struct mtk_wed_hw *hw = dev->hw;

	mutex_lock(&hw_lock);

	mtk_wed_deinit(dev);

	mtk_wdma_rx_reset(dev);
@@ -615,6 +613,13 @@ mtk_wed_detach(struct mtk_wed_device *dev)
	module_put(THIS_MODULE);

	hw->wed_dev = NULL;
}

static void
mtk_wed_detach(struct mtk_wed_device *dev)
{
	mutex_lock(&hw_lock);
	__mtk_wed_detach(dev);
	mutex_unlock(&hw_lock);
}

@@ -1497,8 +1502,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
		ret = mtk_wed_wo_init(hw);
	}
out:
	if (ret)
		mtk_wed_detach(dev);
	if (ret) {
		dev_err(dev->hw->dev, "failed to attach wed device\n");
		__mtk_wed_detach(dev);
	}
unlock:
	mutex_unlock(&hw_lock);