wcn36xx: release resources in case of error
Subsystems (3)
PATCH 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.
Signed-off-by Ramon Fried <[email protected]>
--- 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_bum *sizeof (struct wcn36xx_dxe_desc ); +dma_free_coherent (wcn->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_error ("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_error ("Error allocating descriptor\n" ); + goto our_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_error ("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_error ("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
A message that is not in the archive (sent off-list or not yet received): 20180118143135.14131-1-rfried-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org
Quoted 5 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.Signed-off-by Ramon Fried <[email protected]>
This is a duplicate.
Patch set to Superseded.
Signature · 3 lines
https://patchwork.kernel.org/patch/10173329/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches