Commit 03fe5f3e authored by Jiri Slaby's avatar Jiri Slaby Committed by David S. Miller

NET: wan/x25_asy, move lapb_unregister to x25_asy_close_tty

We register lapb when tty is created, but unregister it only when the
device is UP. So move the lapb_unregister to x25_asy_close_tty after
the device is down.

The old behaviour causes ldisc switching to fail each second attempt,
because we noted for us that the device is unused, so we use it the
second time, but labp layer still have it registered, so it fails
obviously.
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
Reported-by: default avatarSergey Lapin <slapin@ossfans.org>
Cc: Andrew Hendry <andrew.hendry@gmail.com>
Tested-by: default avatarSergey Lapin <slapin@ossfans.org>
Tested-by: default avatarMikhail Ulyanov <ulyanov.mikhail@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 42eb59d3
...@@ -498,7 +498,6 @@ static int x25_asy_open(struct net_device *dev) ...@@ -498,7 +498,6 @@ static int x25_asy_open(struct net_device *dev)
static int x25_asy_close(struct net_device *dev) static int x25_asy_close(struct net_device *dev)
{ {
struct x25_asy *sl = netdev_priv(dev); struct x25_asy *sl = netdev_priv(dev);
int err;
spin_lock(&sl->lock); spin_lock(&sl->lock);
if (sl->tty) if (sl->tty)
...@@ -507,10 +506,6 @@ static int x25_asy_close(struct net_device *dev) ...@@ -507,10 +506,6 @@ static int x25_asy_close(struct net_device *dev)
netif_stop_queue(dev); netif_stop_queue(dev);
sl->rcount = 0; sl->rcount = 0;
sl->xleft = 0; sl->xleft = 0;
err = lapb_unregister(dev);
if (err != LAPB_OK)
printk(KERN_ERR "x25_asy_close: lapb_unregister error -%d\n",
err);
spin_unlock(&sl->lock); spin_unlock(&sl->lock);
return 0; return 0;
} }
...@@ -595,6 +590,7 @@ static int x25_asy_open_tty(struct tty_struct *tty) ...@@ -595,6 +590,7 @@ static int x25_asy_open_tty(struct tty_struct *tty)
static void x25_asy_close_tty(struct tty_struct *tty) static void x25_asy_close_tty(struct tty_struct *tty)
{ {
struct x25_asy *sl = tty->disc_data; struct x25_asy *sl = tty->disc_data;
int err;
/* First make sure we're connected. */ /* First make sure we're connected. */
if (!sl || sl->magic != X25_ASY_MAGIC) if (!sl || sl->magic != X25_ASY_MAGIC)
...@@ -605,6 +601,11 @@ static void x25_asy_close_tty(struct tty_struct *tty) ...@@ -605,6 +601,11 @@ static void x25_asy_close_tty(struct tty_struct *tty)
dev_close(sl->dev); dev_close(sl->dev);
rtnl_unlock(); rtnl_unlock();
err = lapb_unregister(sl->dev);
if (err != LAPB_OK)
printk(KERN_ERR "x25_asy_close: lapb_unregister error -%d\n",
err);
tty->disc_data = NULL; tty->disc_data = NULL;
sl->tty = NULL; sl->tty = NULL;
x25_asy_free(sl); x25_asy_free(sl);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment