diff options
author | Sergio Paracuellos <sergio.paracuellos@gmail.com> | 2018-04-23 15:44:45 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-04-25 15:47:23 +0200 |
commit | 0cc053ddd47c217abb500bb65ffdadd12d878700 (patch) | |
tree | 2eaea1741e16a4d5d9b533aed4964a2443803f49 /drivers/staging/ks7010 | |
parent | 31d7b1b142a17764ab9f21e37c02163b518d571b (diff) | |
download | linux-0cc053ddd47c217abb500bb65ffdadd12d878700.tar.bz2 |
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 <sergio.paracuellos@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/ks7010')
-rw-r--r-- | drivers/staging/ks7010/ks7010_sdio.c | 42 |
1 files changed, 21 insertions, 21 deletions
diff --git a/drivers/staging/ks7010/ks7010_sdio.c b/drivers/staging/ks7010/ks7010_sdio.c index 1d569ef96f45..5293b48c3086 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); } |