From: Sergio Paracuellos Date: Mon, 23 Apr 2018 13:44:45 +0000 (+0200) Subject: staging: ks7010: fix error paths in ks7010_sdio_remove function X-Git-Tag: v5.15~8661^2~535 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0cc053ddd47c217abb500bb65ffdadd12d878700;p=platform%2Fkernel%2Flinux-starfive.git staging: ks7010: fix error paths in ks7010_sdio_remove function This commit reviews and fixes error paths in ks7010_sdio_remove driver function. It change logic to handle error directly after priv dereference to avoid one level indentation. It also removes a temporal netdev variable which wasn't being used in all of the function calls. Also if send_stop_request call fails it was making a direct 'return' instead of doing a properly cleaning. Because of this a new 'err_free_card' label has been added. Signed-off-by: Sergio Paracuellos Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/ks7010/ks7010_sdio.c b/drivers/staging/ks7010/ks7010_sdio.c index 1d569ef..5293b48 100644 --- a/drivers/staging/ks7010/ks7010_sdio.c +++ b/drivers/staging/ks7010/ks7010_sdio.c @@ -1112,39 +1112,39 @@ static void ks7010_sdio_remove(struct sdio_func *func) return; priv = card->priv; - if (priv) { - struct net_device *netdev = priv->net_dev; + if (!priv) + goto err_free_card; - ks_wlan_net_stop(netdev); + ks_wlan_net_stop(priv->net_dev); - /* interrupt disable */ - sdio_claim_host(func); - sdio_writeb(func, 0, INT_ENABLE_REG, &ret); - sdio_writeb(func, 0xff, INT_PENDING_REG, &ret); - sdio_release_host(func); + /* interrupt disable */ + sdio_claim_host(func); + sdio_writeb(func, 0, INT_ENABLE_REG, &ret); + sdio_writeb(func, 0xff, INT_PENDING_REG, &ret); + sdio_release_host(func); - ret = send_stop_request(func); - if (ret) /* memory allocation failure */ - return; + ret = send_stop_request(func); + if (ret) /* memory allocation failure */ + goto err_free_card; - if (priv->wq) { - flush_workqueue(priv->wq); - destroy_workqueue(priv->wq); - } + if (priv->wq) { + flush_workqueue(priv->wq); + destroy_workqueue(priv->wq); + } - hostif_exit(priv); + hostif_exit(priv); - unregister_netdev(netdev); + unregister_netdev(priv->net_dev); - trx_device_exit(priv); - free_netdev(priv->net_dev); - card->priv = NULL; - } + trx_device_exit(priv); + free_netdev(priv->net_dev); + card->priv = NULL; sdio_claim_host(func); sdio_release_irq(func); sdio_disable_func(func); sdio_release_host(func); +err_free_card: sdio_set_drvdata(func, NULL); kfree(card); }