diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-12-19 20:44:19 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-12-19 20:44:19 -0500 |
commit | 69c37a92ddbf79d9672230f21a04580d7ac2f4c3 (patch) | |
tree | cc188e1db4843111cbf219b88136700b7f11e0a5 | |
parent | 24b0d5e7384393b780c4c982930990b94634cc61 (diff) | |
parent | 9ce119f318ba1a07c29149301f1544b6c4bea52a (diff) |
Merge tag 'tty-4.4-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
Pull tty/serial fixes from Greg KH:
"Here are some tty/serial driver fixes for 4.4-rc6 that resolve some
reported problems. All of these have been in linux-next. The details
are in the shortlog"
* tag 'tty-4.4-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
tty: Fix GPF in flush_to_ldisc()
serial: earlycon: Add missing spinlock initialization
serial: sh-sci: Fix length of scatterlist
n_tty: Fix poll() after buffer-limited eof push read
serial: 8250_uniphier: fix dl_read and dl_write functions
-rw-r--r-- | drivers/tty/n_tty.c | 22 | ||||
-rw-r--r-- | drivers/tty/serial/8250/8250_uniphier.c | 8 | ||||
-rw-r--r-- | drivers/tty/serial/earlycon.c | 2 | ||||
-rw-r--r-- | drivers/tty/serial/sh-sci.c | 2 | ||||
-rw-r--r-- | drivers/tty/tty_buffer.c | 2 |
5 files changed, 19 insertions, 17 deletions
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index ed776149261e..e49c2bce551d 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c | |||
@@ -2054,13 +2054,13 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, | |||
2054 | size_t eol; | 2054 | size_t eol; |
2055 | size_t tail; | 2055 | size_t tail; |
2056 | int ret, found = 0; | 2056 | int ret, found = 0; |
2057 | bool eof_push = 0; | ||
2058 | 2057 | ||
2059 | /* N.B. avoid overrun if nr == 0 */ | 2058 | /* N.B. avoid overrun if nr == 0 */ |
2060 | n = min(*nr, smp_load_acquire(&ldata->canon_head) - ldata->read_tail); | 2059 | if (!*nr) |
2061 | if (!n) | ||
2062 | return 0; | 2060 | return 0; |
2063 | 2061 | ||
2062 | n = min(*nr + 1, smp_load_acquire(&ldata->canon_head) - ldata->read_tail); | ||
2063 | |||
2064 | tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1); | 2064 | tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1); |
2065 | size = min_t(size_t, tail + n, N_TTY_BUF_SIZE); | 2065 | size = min_t(size_t, tail + n, N_TTY_BUF_SIZE); |
2066 | 2066 | ||
@@ -2081,12 +2081,11 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, | |||
2081 | n = eol - tail; | 2081 | n = eol - tail; |
2082 | if (n > N_TTY_BUF_SIZE) | 2082 | if (n > N_TTY_BUF_SIZE) |
2083 | n += N_TTY_BUF_SIZE; | 2083 | n += N_TTY_BUF_SIZE; |
2084 | n += found; | 2084 | c = n + found; |
2085 | c = n; | ||
2086 | 2085 | ||
2087 | if (found && !ldata->push && read_buf(ldata, eol) == __DISABLED_CHAR) { | 2086 | if (!found || read_buf(ldata, eol) != __DISABLED_CHAR) { |
2088 | n--; | 2087 | c = min(*nr, c); |
2089 | eof_push = !n && ldata->read_tail != ldata->line_start; | 2088 | n = c; |
2090 | } | 2089 | } |
2091 | 2090 | ||
2092 | n_tty_trace("%s: eol:%zu found:%d n:%zu c:%zu size:%zu more:%zu\n", | 2091 | n_tty_trace("%s: eol:%zu found:%d n:%zu c:%zu size:%zu more:%zu\n", |
@@ -2116,7 +2115,7 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, | |||
2116 | ldata->push = 0; | 2115 | ldata->push = 0; |
2117 | tty_audit_push(tty); | 2116 | tty_audit_push(tty); |
2118 | } | 2117 | } |
2119 | return eof_push ? -EAGAIN : 0; | 2118 | return 0; |
2120 | } | 2119 | } |
2121 | 2120 | ||
2122 | extern ssize_t redirected_tty_write(struct file *, const char __user *, | 2121 | extern ssize_t redirected_tty_write(struct file *, const char __user *, |
@@ -2273,10 +2272,7 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, | |||
2273 | 2272 | ||
2274 | if (ldata->icanon && !L_EXTPROC(tty)) { | 2273 | if (ldata->icanon && !L_EXTPROC(tty)) { |
2275 | retval = canon_copy_from_read_buf(tty, &b, &nr); | 2274 | retval = canon_copy_from_read_buf(tty, &b, &nr); |
2276 | if (retval == -EAGAIN) { | 2275 | if (retval) |
2277 | retval = 0; | ||
2278 | continue; | ||
2279 | } else if (retval) | ||
2280 | break; | 2276 | break; |
2281 | } else { | 2277 | } else { |
2282 | int uncopied; | 2278 | int uncopied; |
diff --git a/drivers/tty/serial/8250/8250_uniphier.c b/drivers/tty/serial/8250/8250_uniphier.c index d11621e2cf1d..245edbb68d4b 100644 --- a/drivers/tty/serial/8250/8250_uniphier.c +++ b/drivers/tty/serial/8250/8250_uniphier.c | |||
@@ -115,12 +115,16 @@ static void uniphier_serial_out(struct uart_port *p, int offset, int value) | |||
115 | */ | 115 | */ |
116 | static int uniphier_serial_dl_read(struct uart_8250_port *up) | 116 | static int uniphier_serial_dl_read(struct uart_8250_port *up) |
117 | { | 117 | { |
118 | return readl(up->port.membase + UNIPHIER_UART_DLR); | 118 | int offset = UNIPHIER_UART_DLR << up->port.regshift; |
119 | |||
120 | return readl(up->port.membase + offset); | ||
119 | } | 121 | } |
120 | 122 | ||
121 | static void uniphier_serial_dl_write(struct uart_8250_port *up, int value) | 123 | static void uniphier_serial_dl_write(struct uart_8250_port *up, int value) |
122 | { | 124 | { |
123 | writel(value, up->port.membase + UNIPHIER_UART_DLR); | 125 | int offset = UNIPHIER_UART_DLR << up->port.regshift; |
126 | |||
127 | writel(value, up->port.membase + offset); | ||
124 | } | 128 | } |
125 | 129 | ||
126 | static int uniphier_of_serial_setup(struct device *dev, struct uart_port *port, | 130 | static int uniphier_of_serial_setup(struct device *dev, struct uart_port *port, |
diff --git a/drivers/tty/serial/earlycon.c b/drivers/tty/serial/earlycon.c index f09636083426..b5b2f2be6be7 100644 --- a/drivers/tty/serial/earlycon.c +++ b/drivers/tty/serial/earlycon.c | |||
@@ -115,6 +115,7 @@ static int __init register_earlycon(char *buf, const struct earlycon_id *match) | |||
115 | if (buf && !parse_options(&early_console_dev, buf)) | 115 | if (buf && !parse_options(&early_console_dev, buf)) |
116 | buf = NULL; | 116 | buf = NULL; |
117 | 117 | ||
118 | spin_lock_init(&port->lock); | ||
118 | port->uartclk = BASE_BAUD * 16; | 119 | port->uartclk = BASE_BAUD * 16; |
119 | if (port->mapbase) | 120 | if (port->mapbase) |
120 | port->membase = earlycon_map(port->mapbase, 64); | 121 | port->membase = earlycon_map(port->mapbase, 64); |
@@ -202,6 +203,7 @@ int __init of_setup_earlycon(unsigned long addr, | |||
202 | int err; | 203 | int err; |
203 | struct uart_port *port = &early_console_dev.port; | 204 | struct uart_port *port = &early_console_dev.port; |
204 | 205 | ||
206 | spin_lock_init(&port->lock); | ||
205 | port->iotype = UPIO_MEM; | 207 | port->iotype = UPIO_MEM; |
206 | port->mapbase = addr; | 208 | port->mapbase = addr; |
207 | port->uartclk = BASE_BAUD * 16; | 209 | port->uartclk = BASE_BAUD * 16; |
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index 960e50a97558..51c7507b0444 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c | |||
@@ -1437,7 +1437,7 @@ static void sci_request_dma(struct uart_port *port) | |||
1437 | sg_init_table(sg, 1); | 1437 | sg_init_table(sg, 1); |
1438 | s->rx_buf[i] = buf; | 1438 | s->rx_buf[i] = buf; |
1439 | sg_dma_address(sg) = dma; | 1439 | sg_dma_address(sg) = dma; |
1440 | sg->length = s->buf_len_rx; | 1440 | sg_dma_len(sg) = s->buf_len_rx; |
1441 | 1441 | ||
1442 | buf += s->buf_len_rx; | 1442 | buf += s->buf_len_rx; |
1443 | dma += s->buf_len_rx; | 1443 | dma += s->buf_len_rx; |
diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c index 9a479e61791a..3cd31e0d4bd9 100644 --- a/drivers/tty/tty_buffer.c +++ b/drivers/tty/tty_buffer.c | |||
@@ -450,7 +450,7 @@ receive_buf(struct tty_struct *tty, struct tty_buffer *head, int count) | |||
450 | count = disc->ops->receive_buf2(tty, p, f, count); | 450 | count = disc->ops->receive_buf2(tty, p, f, count); |
451 | else { | 451 | else { |
452 | count = min_t(int, count, tty->receive_room); | 452 | count = min_t(int, count, tty->receive_room); |
453 | if (count) | 453 | if (count && disc->ops->receive_buf) |
454 | disc->ops->receive_buf(tty, p, f, count); | 454 | disc->ops->receive_buf(tty, p, f, count); |
455 | } | 455 | } |
456 | return count; | 456 | return count; |