tty: The big operations rework
- Operations are now a shared const function block as with most other Linux objects - Introduce wrappers for some optional functions to get consistent behaviour - Wrap put_char which used to be patched by the tty layer - Document which functions are needed/optional - Make put_char report success/fail - Cache the driver->ops pointer in the tty as tty->ops - Remove various surplus lock calls we no longer need - Remove proc_write method as noted by Alexey Dobriyan - Introduce some missing sanity checks where certain driver/ldisc combinations would oops as they didn't check needed methods were present [akpm@linux-foundation.org: fix fs/compat_ioctl.c build] [akpm@linux-foundation.org: fix isicom] [akpm@linux-foundation.org: fix arch/ia64/hp/sim/simserial.c build] [akpm@linux-foundation.org: fix kgdb] Signed-off-by: Alan Cox <alan@redhat.com> Acked-by: Greg Kroah-Hartman <gregkh@suse.de> Cc: Jason Wessel <jason.wessel@windriver.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
@ -148,13 +148,13 @@ static void sp_xmit_on_air(unsigned long channel)
|
||||
|
||||
if (((sp->status1 & SIXP_DCD_MASK) == 0) && (random < sp->persistence)) {
|
||||
sp->led_state = 0x70;
|
||||
sp->tty->driver->write(sp->tty, &sp->led_state, 1);
|
||||
sp->tty->ops->write(sp->tty, &sp->led_state, 1);
|
||||
sp->tx_enable = 1;
|
||||
actual = sp->tty->driver->write(sp->tty, sp->xbuff, sp->status2);
|
||||
actual = sp->tty->ops->write(sp->tty, sp->xbuff, sp->status2);
|
||||
sp->xleft -= actual;
|
||||
sp->xhead += actual;
|
||||
sp->led_state = 0x60;
|
||||
sp->tty->driver->write(sp->tty, &sp->led_state, 1);
|
||||
sp->tty->ops->write(sp->tty, &sp->led_state, 1);
|
||||
sp->status2 = 0;
|
||||
} else
|
||||
mod_timer(&sp->tx_t, jiffies + ((when + 1) * HZ) / 100);
|
||||
@ -220,13 +220,13 @@ static void sp_encaps(struct sixpack *sp, unsigned char *icp, int len)
|
||||
*/
|
||||
if (sp->duplex == 1) {
|
||||
sp->led_state = 0x70;
|
||||
sp->tty->driver->write(sp->tty, &sp->led_state, 1);
|
||||
sp->tty->ops->write(sp->tty, &sp->led_state, 1);
|
||||
sp->tx_enable = 1;
|
||||
actual = sp->tty->driver->write(sp->tty, sp->xbuff, count);
|
||||
actual = sp->tty->ops->write(sp->tty, sp->xbuff, count);
|
||||
sp->xleft = count - actual;
|
||||
sp->xhead = sp->xbuff + actual;
|
||||
sp->led_state = 0x60;
|
||||
sp->tty->driver->write(sp->tty, &sp->led_state, 1);
|
||||
sp->tty->ops->write(sp->tty, &sp->led_state, 1);
|
||||
} else {
|
||||
sp->xleft = count;
|
||||
sp->xhead = sp->xbuff;
|
||||
@ -444,7 +444,7 @@ static void sixpack_write_wakeup(struct tty_struct *tty)
|
||||
}
|
||||
|
||||
if (sp->tx_enable) {
|
||||
actual = tty->driver->write(tty, sp->xhead, sp->xleft);
|
||||
actual = tty->ops->write(tty, sp->xhead, sp->xleft);
|
||||
sp->xleft -= actual;
|
||||
sp->xhead += actual;
|
||||
}
|
||||
@ -492,8 +492,8 @@ static void sixpack_receive_buf(struct tty_struct *tty,
|
||||
|
||||
sp_put(sp);
|
||||
if (test_and_clear_bit(TTY_THROTTLED, &tty->flags)
|
||||
&& tty->driver->unthrottle)
|
||||
tty->driver->unthrottle(tty);
|
||||
&& tty->ops->unthrottle)
|
||||
tty->ops->unthrottle(tty);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -554,8 +554,8 @@ static void resync_tnc(unsigned long channel)
|
||||
/* resync the TNC */
|
||||
|
||||
sp->led_state = 0x60;
|
||||
sp->tty->driver->write(sp->tty, &sp->led_state, 1);
|
||||
sp->tty->driver->write(sp->tty, &resync_cmd, 1);
|
||||
sp->tty->ops->write(sp->tty, &sp->led_state, 1);
|
||||
sp->tty->ops->write(sp->tty, &resync_cmd, 1);
|
||||
|
||||
|
||||
/* Start resync timer again -- the TNC might be still absent */
|
||||
@ -573,7 +573,7 @@ static inline int tnc_init(struct sixpack *sp)
|
||||
|
||||
tnc_set_sync_state(sp, TNC_UNSYNC_STARTUP);
|
||||
|
||||
sp->tty->driver->write(sp->tty, &inbyte, 1);
|
||||
sp->tty->ops->write(sp->tty, &inbyte, 1);
|
||||
|
||||
del_timer(&sp->resync_t);
|
||||
sp->resync_t.data = (unsigned long) sp;
|
||||
@ -601,6 +601,8 @@ static int sixpack_open(struct tty_struct *tty)
|
||||
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
if (tty->ops->write == NULL)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
dev = alloc_netdev(sizeof(struct sixpack), "sp%d", sp_setup);
|
||||
if (!dev) {
|
||||
@ -914,9 +916,9 @@ static void decode_prio_command(struct sixpack *sp, unsigned char cmd)
|
||||
} else { /* output watchdog char if idle */
|
||||
if ((sp->status2 != 0) && (sp->duplex == 1)) {
|
||||
sp->led_state = 0x70;
|
||||
sp->tty->driver->write(sp->tty, &sp->led_state, 1);
|
||||
sp->tty->ops->write(sp->tty, &sp->led_state, 1);
|
||||
sp->tx_enable = 1;
|
||||
actual = sp->tty->driver->write(sp->tty, sp->xbuff, sp->status2);
|
||||
actual = sp->tty->ops->write(sp->tty, sp->xbuff, sp->status2);
|
||||
sp->xleft -= actual;
|
||||
sp->xhead += actual;
|
||||
sp->led_state = 0x60;
|
||||
@ -926,7 +928,7 @@ static void decode_prio_command(struct sixpack *sp, unsigned char cmd)
|
||||
}
|
||||
|
||||
/* needed to trigger the TNC watchdog */
|
||||
sp->tty->driver->write(sp->tty, &sp->led_state, 1);
|
||||
sp->tty->ops->write(sp->tty, &sp->led_state, 1);
|
||||
|
||||
/* if the state byte has been received, the TNC is present,
|
||||
so the resync timer can be reset. */
|
||||
@ -956,12 +958,12 @@ static void decode_std_command(struct sixpack *sp, unsigned char cmd)
|
||||
if ((sp->status & SIXP_RX_DCD_MASK) ==
|
||||
SIXP_RX_DCD_MASK) {
|
||||
sp->led_state = 0x68;
|
||||
sp->tty->driver->write(sp->tty, &sp->led_state, 1);
|
||||
sp->tty->ops->write(sp->tty, &sp->led_state, 1);
|
||||
}
|
||||
} else {
|
||||
sp->led_state = 0x60;
|
||||
/* fill trailing bytes with zeroes */
|
||||
sp->tty->driver->write(sp->tty, &sp->led_state, 1);
|
||||
sp->tty->ops->write(sp->tty, &sp->led_state, 1);
|
||||
rest = sp->rx_count;
|
||||
if (rest != 0)
|
||||
for (i = rest; i <= 3; i++)
|
||||
|
Reference in New Issue
Block a user