static int x25_asy_open_tty(struct tty_struct *tty) { struct x25_asy *sl; int err; if (tty->ops->write == NULL) return -EOPNOTSUPP; /* OK. Find a free X.25 channel to use. */ sl = x25_asy_alloc(); if (sl == NULL) return -ENFILE; sl->tty = tty; tty->disc_data = sl; tty->receive_room = 65536; tty_driver_flush_buffer(tty); tty_ldisc_flush(tty); /* Restore default settings */ sl->dev->type = ARPHRD_X25; /* Perform the low-level X.25 async init */ err = x25_asy_open(sl->dev); if (err) { x25_asy_free(sl); return err; } /* Done. We have linked the TTY line to a channel. */ return 0; }
/* * Close down an X.25 channel. * This means flushing out any pending queues, and then restoring the * TTY line discipline to what it was before it got hooked to X.25 * (which usually is TTY again). */ static void x25_asy_close_tty(struct tty_struct *tty) { struct x25_asy *sl = tty->disc_data; /* First make sure we're connected. */ if (!sl || sl->magic != X25_ASY_MAGIC) return; rtnl_lock(); if (sl->dev->flags & IFF_UP) dev_close(sl->dev); rtnl_unlock(); tty->disc_data = NULL; sl->tty = NULL; x25_asy_free(sl); }
/* * Close down an X.25 channel. * This means flushing out any pending queues, and then restoring the * TTY line discipline to what it was before it got hooked to X.25 * (which usually is TTY again). */ static void x25_asy_close_tty(struct tty_struct *tty) { struct x25_asy *sl = (struct x25_asy *) tty->disc_data; /* First make sure we're connected. */ if (!sl || sl->magic != X25_ASY_MAGIC) return; if (sl->dev->flags & IFF_UP) { (void) dev_close(sl->dev); } tty->disc_data = 0; sl->tty = NULL; x25_asy_free(sl); unregister_netdev(sl->dev); MOD_DEC_USE_COUNT; }
/* * Close down an X.25 channel. * This means flushing out any pending queues, and then restoring the * TTY line discipline to what it was before it got hooked to X.25 * (which usually is TTY again). */ static void x25_asy_close_tty(struct tty_struct *tty) { struct x25_asy *sl = tty->disc_data; int err; /* First make sure we're connected. */ if (!sl || sl->magic != X25_ASY_MAGIC) return; rtnl_lock(); if (sl->dev->flags & IFF_UP) dev_close(sl->dev); rtnl_unlock(); err = lapb_unregister(sl->dev); if (err != LAPB_OK) pr_err("x25_asy_close: lapb_unregister error: %d\n", err); tty->disc_data = NULL; sl->tty = NULL; x25_asy_free(sl); }