diff options
author | Andrey Shvetsov <andrey.shvetsov@k2l.de> | 2017-06-20 18:11:49 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-06-23 19:32:46 +0300 |
commit | 606c21759774a6694d4219d5bb96704ab13e20a0 (patch) | |
tree | d7e93c137ac9e49c56f552d1ea29f06d3729f57b | |
parent | 3c1746edd12d4e3279b47a9fb8dc0eedc77d679d (diff) | |
download | linux-606c21759774a6694d4219d5bb96704ab13e20a0.tar.xz |
staging: most: net: make net device lifetime obvious
The function aim_probe_channel calls only one of the functions
alloc_netdev and register_netdev per run.
Correspondingly, the function aim_disconnect_channel calls only one of
the functions unregister_netdev and free_netdev per run.
This patch makes it obvious by using the 'else' part of the 'if'
statement.
Signed-off-by: Andrey Shvetsov <andrey.shvetsov@k2l.de>
Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/staging/most/aim-network/networking.c | 47 |
1 files changed, 25 insertions, 22 deletions
diff --git a/drivers/staging/most/aim-network/networking.c b/drivers/staging/most/aim-network/networking.c index 86353836470c..750652de90a8 100644 --- a/drivers/staging/most/aim-network/networking.c +++ b/drivers/staging/most/aim-network/networking.c @@ -287,6 +287,7 @@ static int aim_probe_channel(struct most_interface *iface, int channel_idx, { struct net_dev_context *nd; struct net_dev_channel *ch; + struct net_device *dev; unsigned long flags; if (!iface) @@ -298,8 +299,6 @@ static int aim_probe_channel(struct most_interface *iface, int channel_idx, nd = get_net_dev_context(iface); if (!nd) { - struct net_device *dev; - dev = alloc_netdev(sizeof(struct net_dev_context), "meth%d", NET_NAME_UNKNOWN, most_nd_setup); if (!dev) @@ -312,20 +311,24 @@ static int aim_probe_channel(struct most_interface *iface, int channel_idx, spin_lock_irqsave(&list_lock, flags); list_add(&nd->list, &net_devices); spin_unlock_irqrestore(&list_lock, flags); - } - ch = ccfg->direction == MOST_CH_TX ? &nd->tx : &nd->rx; - if (ch->linked) { - pr_err("only one channel per instance & direction allowed\n"); - return -EINVAL; - } + ch = ccfg->direction == MOST_CH_TX ? &nd->tx : &nd->rx; + ch->ch_id = channel_idx; + ch->linked = true; + } else { + ch = ccfg->direction == MOST_CH_TX ? &nd->tx : &nd->rx; + if (ch->linked) { + pr_err("direction is allocated\n"); + return -EINVAL; + } - ch->ch_id = channel_idx; - ch->linked = true; - if (nd->tx.linked && nd->rx.linked && register_netdev(nd->dev)) { - pr_err("register_netdev() failed\n"); - ch->linked = false; - return -EINVAL; + ch->ch_id = channel_idx; + ch->linked = true; + if (register_netdev(nd->dev)) { + pr_err("register_netdev() failed\n"); + ch->linked = false; + return -EINVAL; + } } return 0; @@ -349,18 +352,18 @@ static int aim_disconnect_channel(struct most_interface *iface, else return -EINVAL; - /* - * do not call most_stop_channel() here, because channels are - * going to be closed in ndo_stop() after unregister_netdev() - */ - if (nd->rx.linked && nd->tx.linked) + if (nd->rx.linked && nd->tx.linked) { + /* + * do not call most_stop_channel() here, because channels are + * going to be closed in ndo_stop() after unregister_netdev() + */ unregister_netdev(nd->dev); - - ch->linked = false; - if (!nd->rx.linked && !nd->tx.linked) { + ch->linked = false; + } else { spin_lock_irqsave(&list_lock, flags); list_del(&nd->list); spin_unlock_irqrestore(&list_lock, flags); + free_netdev(nd->dev); } |