summaryrefslogtreecommitdiffstats
path: root/drivers/staging/most
diff options
context:
space:
mode:
authorAndrey Shvetsov2017-06-20 17:11:49 +0200
committerGreg Kroah-Hartman2017-06-23 18:32:46 +0200
commit606c21759774a6694d4219d5bb96704ab13e20a0 (patch)
treed7e93c137ac9e49c56f552d1ea29f06d3729f57b /drivers/staging/most
parentstaging: most: net: remove redundant traces (diff)
downloadkernel-qcow2-linux-606c21759774a6694d4219d5bb96704ab13e20a0.tar.gz
kernel-qcow2-linux-606c21759774a6694d4219d5bb96704ab13e20a0.tar.xz
kernel-qcow2-linux-606c21759774a6694d4219d5bb96704ab13e20a0.zip
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>
Diffstat (limited to 'drivers/staging/most')
-rw-r--r--drivers/staging/most/aim-network/networking.c47
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);
}