Skip to content

Commit ecd6df3

Browse files
committed
Merge branch 'fix-possible-deadlock-during-wed-attach'
Lorenzo Bianconi says: ==================== fix possible deadlock during WED attach Fix a possible deadlock in mtk_wed_attach if mtk_wed_wo_init routine fails. Check wo pointer is properly allocated before running mtk_wed_wo_reset() and mtk_wed_wo_deinit(). ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 3df9677 + 587585e commit ecd6df3

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
lines changed

drivers/net/ethernet/mediatek/mtk_wed.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,10 @@ mtk_wed_wo_reset(struct mtk_wed_device *dev)
174174
mtk_wdma_tx_reset(dev);
175175
mtk_wed_reset(dev, MTK_WED_RESET_WED);
176176

177-
mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO,
178-
MTK_WED_WO_CMD_CHANGE_STATE, &state,
179-
sizeof(state), false);
177+
if (mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO,
178+
MTK_WED_WO_CMD_CHANGE_STATE, &state,
179+
sizeof(state), false))
180+
return;
180181

181182
if (readx_poll_timeout(mtk_wed_wo_read_status, dev, val,
182183
val == MTK_WED_WOIF_DISABLE_DONE,
@@ -576,12 +577,10 @@ mtk_wed_deinit(struct mtk_wed_device *dev)
576577
}
577578

578579
static void
579-
mtk_wed_detach(struct mtk_wed_device *dev)
580+
__mtk_wed_detach(struct mtk_wed_device *dev)
580581
{
581582
struct mtk_wed_hw *hw = dev->hw;
582583

583-
mutex_lock(&hw_lock);
584-
585584
mtk_wed_deinit(dev);
586585

587586
mtk_wdma_rx_reset(dev);
@@ -590,9 +589,11 @@ mtk_wed_detach(struct mtk_wed_device *dev)
590589
mtk_wed_free_tx_rings(dev);
591590

592591
if (mtk_wed_get_rx_capa(dev)) {
593-
mtk_wed_wo_reset(dev);
592+
if (hw->wed_wo)
593+
mtk_wed_wo_reset(dev);
594594
mtk_wed_free_rx_rings(dev);
595-
mtk_wed_wo_deinit(hw);
595+
if (hw->wed_wo)
596+
mtk_wed_wo_deinit(hw);
596597
}
597598

598599
if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
@@ -612,6 +613,13 @@ mtk_wed_detach(struct mtk_wed_device *dev)
612613
module_put(THIS_MODULE);
613614

614615
hw->wed_dev = NULL;
616+
}
617+
618+
static void
619+
mtk_wed_detach(struct mtk_wed_device *dev)
620+
{
621+
mutex_lock(&hw_lock);
622+
__mtk_wed_detach(dev);
615623
mutex_unlock(&hw_lock);
616624
}
617625

@@ -1494,8 +1502,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
14941502
ret = mtk_wed_wo_init(hw);
14951503
}
14961504
out:
1497-
if (ret)
1498-
mtk_wed_detach(dev);
1505+
if (ret) {
1506+
dev_err(dev->hw->dev, "failed to attach wed device\n");
1507+
__mtk_wed_detach(dev);
1508+
}
14991509
unlock:
15001510
mutex_unlock(&hw_lock);
15011511

drivers/net/ethernet/mediatek/mtk_wed_mcu.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,9 @@ int mtk_wed_mcu_msg_update(struct mtk_wed_device *dev, int id, void *data,
207207
if (dev->hw->version == 1)
208208
return 0;
209209

210+
if (WARN_ON(!wo))
211+
return -ENODEV;
212+
210213
return mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO, id, data, len,
211214
true);
212215
}

0 commit comments

Comments
 (0)