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.
--- 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): 20180118142348.12759-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]>
Doesn't compile:
drivers/net/wireless/ath/wcn36xx/dxe.c: In function ‘wcn36xx_dxe_deinit_descs’:drivers/net/wireless/ath/wcn36xx/dxe.c:243:15: error: ‘struct wcn36xx_dxe_ch’ has no member named ‘desc_bum’
size = wcn_ch->desc_bum * sizeof(struct wcn36xx_dxe_desc);
^
drivers/net/wireless/ath/wcn36xx/dxe.c:244:20: error: ‘wcn’ undeclared (first use in this function)
dma_free_coherent(wcn->dev, size,
^drivers/net/wireless/ath/wcn36xx/dxe.c:244:20: note: each undeclared identifier is reported only once for each function it appears in drivers/net/wireless/ath/wcn36xx/dxe.c: In function ‘wcn36xx_dxe_init’:drivers/net/wireless/ath/wcn36xx/dxe.c:737:3: error: implicit declaration of function ‘dev_error’ [-Werror=implicit-function-declaration]
dev_error("Error allocating descriptor\n");
^drivers/net/wireless/ath/wcn36xx/dxe.c:818:2: error: expected ‘;’ before ‘if’
if (ret) {
^drivers/net/wireless/ath/wcn36xx/dxe.c:860:1: warning: label ‘out_err_txh_ch’ defined but not used [-Wunused-label]
out_err_txh_ch:
^drivers/net/wireless/ath/wcn36xx/dxe.c:856:1: warning: label ‘out_err_rxh_ch’ defined but not used [-Wunused-label]
out_err_rxh_ch:
^drivers/net/wireless/ath/wcn36xx/dxe.c:760:3: error: label ‘our_err_txh_ch’ used but not defined
goto our_err_txh_ch;
^
cc1: some warnings being treated as errors
make[5]: *** [drivers/net/wireless/ath/wcn36xx/dxe.o] Error 1
make[4]: *** [drivers/net/wireless/ath/wcn36xx] Error 2
make[3]: *** [drivers/net/wireless/ath] Error 2
make[2]: *** [drivers/net/wireless] Error 2
make[1]: *** [drivers/net] Error 2
make[1]: *** Waiting for unfinished jobs....
make: *** [drivers] Error 2
Patch set to Changes Requested.
Signature · 3 lines
https://patchwork.kernel.org/patch/10173325/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): 20180122061448.91CBD6081E-4h6buKAYkuurB/[email protected]
Quoted 8 lines · Kalle Valo
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]>Doesn't compile:
Sorry Kalle, I mistakenly sent the wrong version of the patch :( I will sent the correct one shortly.
Quoted 36 lines
drivers/net/wireless/ath/wcn36xx/dxe.c: In function ‘wcn36xx_dxe_deinit_descs’:drivers/net/wireless/ath/wcn36xx/dxe.c:243:15: error: ‘struct wcn36xx_dxe_ch’ has no member named ‘desc_bum’size = wcn_ch->desc_bum * sizeof(struct wcn36xx_dxe_desc); ^ drivers/net/wireless/ath/wcn36xx/dxe.c:244:20: error: ‘wcn’ undeclared (first use in this function) dma_free_coherent(wcn->dev, size, ^ drivers/net/wireless/ath/wcn36xx/dxe.c:244:20: note: each undeclared identifier is reported only once for each function it appears in drivers/net/wireless/ath/wcn36xx/dxe.c: In function ‘wcn36xx_dxe_init’: drivers/net/wireless/ath/wcn36xx/dxe.c:737:3: error: implicit declaration of function ‘dev_error’ [-Werror=implicit-function-declaration] dev_error("Error allocating descriptor\n"); ^
drivers/net/wireless/ath/wcn36xx/dxe.c:818:2: error: expected ‘;’ before ‘if’
if (ret) {
^drivers/net/wireless/ath/wcn36xx/dxe.c:860:1: warning: label ‘out_err_txh_ch’ defined but not used [-Wunused-label]
out_err_txh_ch:
^drivers/net/wireless/ath/wcn36xx/dxe.c:856:1: warning: label ‘out_err_rxh_ch’ defined but not used [-Wunused-label]
out_err_rxh_ch:
^drivers/net/wireless/ath/wcn36xx/dxe.c:760:3: error: label ‘our_err_txh_ch’ used but not definedgoto our_err_txh_ch; ^cc1: some warnings being treated as errors
make[5]: *** [drivers/net/wireless/ath/wcn36xx/dxe.o] Error 1 make[4]: *** [drivers/net/wireless/ath/wcn36xx] Error 2 make[3]: *** [drivers/net/wireless/ath] Error 2 make[2]: *** [drivers/net/wireless] Error 2 make[1]: *** [drivers/net] Error 2
make[1]: *** Waiting for unfinished jobs....
make: *** [drivers] Error 2Patch set to Changes Requested.