mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
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>
This commit is contained in:
parent
3c1746edd1
commit
606c217597
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user