Commit 308246b8 authored by Martin Schwidefsky's avatar Martin Schwidefsky Committed by Ben Hutchings

s390/3215: fix tty output containing tabs

commit e512d56c upstream.

git commit 37f81fa1
"n_tty: do O_ONLCR translation as a single write"
surfaced a bug in the 3215 device driver. In combination this
broke tab expansion for tty ouput.

The cause is an asymmetry in the behaviour of tty3215_ops->write
vs tty3215_ops->put_char. The put_char function scans for '\t'
but the write function does not.

As the driver has logic for the '\t' expansion remove XTABS
from c_oflag of the initial termios as well.
Reported-by: default avatarStephen Powell <zlinuxman@wowway.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
parent bb5850b1
...@@ -993,12 +993,26 @@ static int tty3215_write(struct tty_struct * tty, ...@@ -993,12 +993,26 @@ static int tty3215_write(struct tty_struct * tty,
const unsigned char *buf, int count) const unsigned char *buf, int count)
{ {
struct raw3215_info *raw; struct raw3215_info *raw;
int i, written;
if (!tty) if (!tty)
return 0; return 0;
raw = (struct raw3215_info *) tty->driver_data; raw = (struct raw3215_info *) tty->driver_data;
raw3215_write(raw, buf, count); written = count;
return count; while (count > 0) {
for (i = 0; i < count; i++)
if (buf[i] == '\t' || buf[i] == '\n')
break;
raw3215_write(raw, buf, i);
count -= i;
buf += i;
if (count > 0) {
raw3215_putchar(raw, *buf);
count--;
buf++;
}
}
return written;
} }
/* /*
...@@ -1146,7 +1160,7 @@ static int __init tty3215_init(void) ...@@ -1146,7 +1160,7 @@ static int __init tty3215_init(void)
driver->subtype = SYSTEM_TYPE_TTY; driver->subtype = SYSTEM_TYPE_TTY;
driver->init_termios = tty_std_termios; driver->init_termios = tty_std_termios;
driver->init_termios.c_iflag = IGNBRK | IGNPAR; driver->init_termios.c_iflag = IGNBRK | IGNPAR;
driver->init_termios.c_oflag = ONLCR | XTABS; driver->init_termios.c_oflag = ONLCR;
driver->init_termios.c_lflag = ISIG; driver->init_termios.c_lflag = ISIG;
driver->flags = TTY_DRIVER_REAL_RAW; driver->flags = TTY_DRIVER_REAL_RAW;
tty_set_operations(driver, &tty3215_ops); tty_set_operations(driver, &tty3215_ops);
......
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