mediatek: backport more WED upstream fixes
Fixes hang if the WO firmware can't be loaded Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
		| @@ -0,0 +1,61 @@ | |||||||
|  | From: Lorenzo Bianconi <lorenzo@kernel.org> | ||||||
|  | Date: Wed, 7 Dec 2022 15:04:54 +0100 | ||||||
|  | Subject: [PATCH] net: ethernet: mtk_wed: fix some possible NULL pointer | ||||||
|  |  dereferences | ||||||
|  |  | ||||||
|  | Fix possible NULL pointer dereference in mtk_wed_detach routine checking | ||||||
|  | wo pointer is properly allocated before running mtk_wed_wo_reset() and | ||||||
|  | mtk_wed_wo_deinit(). | ||||||
|  | Even if it is just a theoretical issue at the moment check wo pointer is | ||||||
|  | not NULL in mtk_wed_mcu_msg_update. | ||||||
|  | Moreover, honor mtk_wed_mcu_send_msg return value in mtk_wed_wo_reset() | ||||||
|  |  | ||||||
|  | Fixes: 799684448e3e ("net: ethernet: mtk_wed: introduce wed wo support") | ||||||
|  | Fixes: 4c5de09eb0d0 ("net: ethernet: mtk_wed: add configure wed wo support") | ||||||
|  | Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> | ||||||
|  | Reviewed-by: Leon Romanovsky <leonro@nvidia.com> | ||||||
|  | Signed-off-by: Jakub Kicinski <kuba@kernel.org> | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | --- a/drivers/net/ethernet/mediatek/mtk_wed.c | ||||||
|  | +++ b/drivers/net/ethernet/mediatek/mtk_wed.c | ||||||
|  | @@ -174,9 +174,10 @@ mtk_wed_wo_reset(struct mtk_wed_device * | ||||||
|  |  	mtk_wdma_tx_reset(dev); | ||||||
|  |  	mtk_wed_reset(dev, MTK_WED_RESET_WED); | ||||||
|  |   | ||||||
|  | -	mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO, | ||||||
|  | -			     MTK_WED_WO_CMD_CHANGE_STATE, &state, | ||||||
|  | -			     sizeof(state), false); | ||||||
|  | +	if (mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO, | ||||||
|  | +				 MTK_WED_WO_CMD_CHANGE_STATE, &state, | ||||||
|  | +				 sizeof(state), false)) | ||||||
|  | +		return; | ||||||
|  |   | ||||||
|  |  	if (readx_poll_timeout(mtk_wed_wo_read_status, dev, val, | ||||||
|  |  			       val == MTK_WED_WOIF_DISABLE_DONE, | ||||||
|  | @@ -632,9 +633,11 @@ mtk_wed_detach(struct mtk_wed_device *de | ||||||
|  |  	mtk_wed_free_tx_rings(dev); | ||||||
|  |   | ||||||
|  |  	if (mtk_wed_get_rx_capa(dev)) { | ||||||
|  | -		mtk_wed_wo_reset(dev); | ||||||
|  | +		if (hw->wed_wo) | ||||||
|  | +			mtk_wed_wo_reset(dev); | ||||||
|  |  		mtk_wed_free_rx_rings(dev); | ||||||
|  | -		mtk_wed_wo_deinit(hw); | ||||||
|  | +		if (hw->wed_wo) | ||||||
|  | +			mtk_wed_wo_deinit(hw); | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) { | ||||||
|  | --- a/drivers/net/ethernet/mediatek/mtk_wed_mcu.c | ||||||
|  | +++ b/drivers/net/ethernet/mediatek/mtk_wed_mcu.c | ||||||
|  | @@ -207,6 +207,9 @@ int mtk_wed_mcu_msg_update(struct mtk_we | ||||||
|  |  	if (dev->hw->version == 1) | ||||||
|  |  		return 0; | ||||||
|  |   | ||||||
|  | +	if (WARN_ON(!wo)) | ||||||
|  | +		return -ENODEV; | ||||||
|  | + | ||||||
|  |  	return mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO, id, data, len, | ||||||
|  |  				    true); | ||||||
|  |  } | ||||||
| @@ -0,0 +1,58 @@ | |||||||
|  | From: Lorenzo Bianconi <lorenzo@kernel.org> | ||||||
|  | Date: Wed, 7 Dec 2022 15:04:55 +0100 | ||||||
|  | Subject: [PATCH] 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: 4c5de09eb0d0 ("net: ethernet: mtk_wed: add configure wed wo support") | ||||||
|  | Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> | ||||||
|  | Reviewed-by: Leon Romanovsky <leonro@nvidia.com> | ||||||
|  | Signed-off-by: Jakub Kicinski <kuba@kernel.org> | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | --- a/drivers/net/ethernet/mediatek/mtk_wed.c | ||||||
|  | +++ b/drivers/net/ethernet/mediatek/mtk_wed.c | ||||||
|  | @@ -619,12 +619,10 @@ mtk_wed_deinit(struct mtk_wed_device *de | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  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); | ||||||
|  | @@ -657,6 +655,13 @@ mtk_wed_detach(struct mtk_wed_device *de | ||||||
|  |  	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); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -1545,8 +1550,10 @@ mtk_wed_attach(struct mtk_wed_device *de | ||||||
|  |  		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); | ||||||
|  |   | ||||||
		Reference in New Issue
	
	Block a user
	 Felix Fietkau
					Felix Fietkau