wcn36xx: release resources in case of error
Subsystems (3)
PATCH v2 1/1 wcn36xx: release resources in case of error
wcn36xx_dxe_init() doesn't check for the return value of wcn36xx_dxe_init_descs().
This patch releases the resources in case an error ocurred.
--- drivers/net/wireless/ath/wcn36xx/dxe.c | 48 +++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 6 deletions(-)
drivers/net/wireless/ath/wcn36xx/dxe.c +42 -6
@@ -236,6 +236,16 @@ static int wcn36xx_dxe_init_descs(struct device *dev, struct wcn36xx_dxe_ch *wcnreturn 0 ; } +static void wcn36xx_dxe_deinit_descs (struct device *dev,struct wcn36xx_dxe_ch *wcn_ch) +{ +size_t size; + + size = wcn_ch->desc_num *sizeof (struct wcn36xx_dxe_desc ); +dma_free_coherent (dev, size, + wcn_ch->cpu_addr, + wcn_ch->dma_addr); +} +static void wcn36xx_dxe_init_tx_bd (struct wcn36xx_dxe_ch *ch,struct wcn36xx_dxe_mem_pool *pool) {
@@ -722,7 +732,11 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn)/***************************************/ /* Init descriptors for TX LOW channel */ /***************************************/ -wcn36xx_dxe_init_descs (wcn->dev, &wcn->dxe_tx_l_ch); + ret =wcn36xx_dxe_init_descs (wcn->dev, &wcn->dxe_tx_l_ch); +if (ret) { +dev_err (wcn->dev,"Error allocating descriptor\n" ); +return ret; + }wcn36xx_dxe_init_tx_bd (&wcn->dxe_tx_l_ch, &wcn->data_mem_pool);/* Write channel head to a NEXT register */
@@ -740,7 +754,12 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn)/***************************************/ /* Init descriptors for TX HIGH channel */ /***************************************/ -wcn36xx_dxe_init_descs (wcn->dev, &wcn->dxe_tx_h_ch); + ret =wcn36xx_dxe_init_descs (wcn->dev, &wcn->dxe_tx_h_ch); +if (ret) { +dev_err (wcn->dev,"Error allocating descriptor\n" ); + goto out_err_txh_ch; + } +wcn36xx_dxe_init_tx_bd (&wcn->dxe_tx_h_ch, &wcn->mgmt_mem_pool);/* Write channel head to a NEXT register */
@@ -760,7 +779,12 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn)/***************************************/ /* Init descriptors for RX LOW channel */ /***************************************/ -wcn36xx_dxe_init_descs (wcn->dev, &wcn->dxe_rx_l_ch); + ret =wcn36xx_dxe_init_descs (wcn->dev, &wcn->dxe_rx_l_ch); +if (ret) { +dev_err (wcn->dev,"Error allocating descriptor\n" ); + goto out_err_rxl_ch; + } +/* For RX we need to preallocated buffers */ wcn36xx_dxe_ch_alloc_skb (wcn, &wcn->dxe_rx_l_ch);
@@ -790,7 +814,11 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn)/***************************************/ /* Init descriptors for RX HIGH channel */ /***************************************/ -wcn36xx_dxe_init_descs (wcn->dev, &wcn->dxe_rx_h_ch); + ret =wcn36xx_dxe_init_descs (wcn->dev, &wcn->dxe_rx_h_ch); +if (ret) { +dev_err (wcn->dev,"Error allocating descriptor\n" ); + goto out_err_rxh_ch; + }/* For RX we need to prealocat buffers */ wcn36xx_dxe_ch_alloc_skb (wcn, &wcn->dxe_rx_h_ch);
@@ -819,11 +847,19 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn) ret =wcn36xx_dxe_request_irqs (wcn);if (ret <0 ) - goto out_err; + goto out_err_irq;return 0 ; -out_err: +out_err_irq: +wcn36xx_dxe_deinit_descs (wcn->dev, &wcn->dxe_rx_h_ch); +out_err_rxh_ch: +wcn36xx_dxe_deinit_descs (wcn->dev, &wcn->dxe_rx_l_ch); +out_err_rxl_ch: +wcn36xx_dxe_deinit_descs (wcn->dev, &wcn->dxe_tx_h_ch); +out_err_txh_ch: +wcn36xx_dxe_deinit_descs (wcn->dev, &wcn->dxe_tx_l_ch); +return ret; }
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Quoted 6 lines · Ramon Fried
wcn36xx_dxe_init()doesn't check for the return value ofwcn36xx_dxe_init_descs().
This patch releases the resources in case an error ocurred.Change-Id I924bd7489b60243c0a0cbaa716caf924f11d7587Signed-off-by Ramon Fried <[email protected]>
This compiled now, thanks. But I did some minor changes in the commit log and in indentation on the pending branch:
drivers/net/wireless/ath/wcn36xx/dxe.c int wcn36xx_dxe_init(struct wcn36xx *wcn) · line 850
Quoted 6 lines
drivers/net/wireless/ath/wcn36xx/dxe.c +1
-1@@ -819,11 +847,19 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn) ret =wcn36xx_dxe_request_irqs (wcn);if (ret <0 ) - goto out_err; + goto out_err_irq;
The recommended style is to label the err_ based what the target does, not from where they are called from. It's easier to manage the labels that way. But as this is a style issue I didn't change it.
Signature · 1 line
Kalle Valo
Quoted 5 lines · Ramon Fried
wcn36xx_dxe_init()doesn't check for the return value ofwcn36xx_dxe_init_descs(), release the resources in case an error ocurred.Signed-off-by Ramon Fried <[email protected]>Signed-off-by Kalle Valo <[email protected]>
Patch applied to ath-next branch of ath.git, thanks.
d0bb950b9f5f wcn36xx: release DMA memory in case of error
Signature · 3 lines
https://patchwork.kernel.org/patch/10180503/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches