Commit bbbce516bb497404315c1d0a1b13a04038347d3d
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
Merge tag 'tty-4.0-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
Pull tty/serial fixes from Greg KH: "Here are some tty and serial driver fixes for 4.0-rc3. Along with the atime fix that you know about, here are some other serial driver bugfixes as well. Most notable is a wait_until_sent bugfix that was traced back to being around since before 2.6.12 that Johan has fixed up. All have been in linux-next successfully" * tag 'tty-4.0-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: TTY: fix tty_wait_until_sent maximum timeout TTY: fix tty_wait_until_sent on 64-bit machines USB: serial: fix infinite wait_until_sent timeout TTY: bfin_jtag_comm: remove incorrect wait_until_sent operation net: irda: fix wait_until_sent poll timeout serial: uapi: Declare all userspace-visible io types serial: core: Fix iotype userspace breakage serial: sprd: Fix missing spin_unlock in sprd_handle_irq() console: Fix console name size mismatch tty: fix up atime/mtime mess, take four serial: 8250_dw: Fix get_mctrl behaviour serial:8250:8250_pci: delete unneeded quirk entries serial:8250:8250_pci: fix redundant entry report for WCH_CH352_2S Change email address for 8250_pci serial: 8250: Revert "tty: serial: 8250_core: read only RX if there is something in the FIFO" Revert "tty/serial: of_serial: add DT alias ID handling"
Showing 15 changed files Side-by-side Diff
- Documentation/devicetree/bindings/serial/snps-dw-apb-uart.txt
- drivers/tty/bfin_jtag_comm.c
- drivers/tty/serial/8250/8250_core.c
- drivers/tty/serial/8250/8250_dw.c
- drivers/tty/serial/8250/8250_pci.c
- drivers/tty/serial/of_serial.c
- drivers/tty/serial/sprd_serial.c
- drivers/tty/tty_io.c
- drivers/tty/tty_ioctl.c
- drivers/usb/serial/generic.c
- include/linux/serial_core.h
- include/uapi/linux/serial.h
- kernel/printk/console_cmdline.h
- kernel/printk/printk.c
- net/irda/ircomm/ircomm_tty.c
Documentation/devicetree/bindings/serial/snps-dw-apb-uart.txt
... | ... | @@ -21,6 +21,18 @@ |
21 | 21 | - reg-io-width : the size (in bytes) of the IO accesses that should be |
22 | 22 | performed on the device. If this property is not present then single byte |
23 | 23 | accesses are used. |
24 | +- dcd-override : Override the DCD modem status signal. This signal will always | |
25 | + be reported as active instead of being obtained from the modem status | |
26 | + register. Define this if your serial port does not use this pin. | |
27 | +- dsr-override : Override the DTS modem status signal. This signal will always | |
28 | + be reported as active instead of being obtained from the modem status | |
29 | + register. Define this if your serial port does not use this pin. | |
30 | +- cts-override : Override the CTS modem status signal. This signal will always | |
31 | + be reported as active instead of being obtained from the modem status | |
32 | + register. Define this if your serial port does not use this pin. | |
33 | +- ri-override : Override the RI modem status signal. This signal will always be | |
34 | + reported as inactive instead of being obtained from the modem status register. | |
35 | + Define this if your serial port does not use this pin. | |
24 | 36 | |
25 | 37 | Example: |
26 | 38 | |
... | ... | @@ -31,6 +43,10 @@ |
31 | 43 | interrupts = <10>; |
32 | 44 | reg-shift = <2>; |
33 | 45 | reg-io-width = <4>; |
46 | + dcd-override; | |
47 | + dsr-override; | |
48 | + cts-override; | |
49 | + ri-override; | |
34 | 50 | }; |
35 | 51 | |
36 | 52 | Example with one clock: |
drivers/tty/bfin_jtag_comm.c
... | ... | @@ -210,18 +210,6 @@ |
210 | 210 | return circ_cnt(&bfin_jc_write_buf); |
211 | 211 | } |
212 | 212 | |
213 | -static void | |
214 | -bfin_jc_wait_until_sent(struct tty_struct *tty, int timeout) | |
215 | -{ | |
216 | - unsigned long expire = jiffies + timeout; | |
217 | - while (!circ_empty(&bfin_jc_write_buf)) { | |
218 | - if (signal_pending(current)) | |
219 | - break; | |
220 | - if (time_after(jiffies, expire)) | |
221 | - break; | |
222 | - } | |
223 | -} | |
224 | - | |
225 | 213 | static const struct tty_operations bfin_jc_ops = { |
226 | 214 | .open = bfin_jc_open, |
227 | 215 | .close = bfin_jc_close, |
... | ... | @@ -230,7 +218,6 @@ |
230 | 218 | .flush_chars = bfin_jc_flush_chars, |
231 | 219 | .write_room = bfin_jc_write_room, |
232 | 220 | .chars_in_buffer = bfin_jc_chars_in_buffer, |
233 | - .wait_until_sent = bfin_jc_wait_until_sent, | |
234 | 221 | }; |
235 | 222 | |
236 | 223 | static int __init bfin_jc_init(void) |
drivers/tty/serial/8250/8250_core.c
... | ... | @@ -2138,8 +2138,8 @@ |
2138 | 2138 | /* |
2139 | 2139 | * Clear the interrupt registers. |
2140 | 2140 | */ |
2141 | - if (serial_port_in(port, UART_LSR) & UART_LSR_DR) | |
2142 | - serial_port_in(port, UART_RX); | |
2141 | + serial_port_in(port, UART_LSR); | |
2142 | + serial_port_in(port, UART_RX); | |
2143 | 2143 | serial_port_in(port, UART_IIR); |
2144 | 2144 | serial_port_in(port, UART_MSR); |
2145 | 2145 | |
... | ... | @@ -2300,8 +2300,8 @@ |
2300 | 2300 | * saved flags to avoid getting false values from polling |
2301 | 2301 | * routines or the previous session. |
2302 | 2302 | */ |
2303 | - if (serial_port_in(port, UART_LSR) & UART_LSR_DR) | |
2304 | - serial_port_in(port, UART_RX); | |
2303 | + serial_port_in(port, UART_LSR); | |
2304 | + serial_port_in(port, UART_RX); | |
2305 | 2305 | serial_port_in(port, UART_IIR); |
2306 | 2306 | serial_port_in(port, UART_MSR); |
2307 | 2307 | up->lsr_saved_flags = 0; |
... | ... | @@ -2394,8 +2394,7 @@ |
2394 | 2394 | * Read data port to reset things, and then unlink from |
2395 | 2395 | * the IRQ chain. |
2396 | 2396 | */ |
2397 | - if (serial_port_in(port, UART_LSR) & UART_LSR_DR) | |
2398 | - serial_port_in(port, UART_RX); | |
2397 | + serial_port_in(port, UART_RX); | |
2399 | 2398 | serial8250_rpm_put(up); |
2400 | 2399 | |
2401 | 2400 | del_timer_sync(&up->timer); |
drivers/tty/serial/8250/8250_dw.c
... | ... | @@ -59,6 +59,8 @@ |
59 | 59 | u8 usr_reg; |
60 | 60 | int last_mcr; |
61 | 61 | int line; |
62 | + int msr_mask_on; | |
63 | + int msr_mask_off; | |
62 | 64 | struct clk *clk; |
63 | 65 | struct clk *pclk; |
64 | 66 | struct reset_control *rst; |
... | ... | @@ -81,6 +83,12 @@ |
81 | 83 | value &= ~UART_MSR_DCTS; |
82 | 84 | } |
83 | 85 | |
86 | + /* Override any modem control signals if needed */ | |
87 | + if (offset == UART_MSR) { | |
88 | + value |= d->msr_mask_on; | |
89 | + value &= ~d->msr_mask_off; | |
90 | + } | |
91 | + | |
84 | 92 | return value; |
85 | 93 | } |
86 | 94 | |
... | ... | @@ -333,6 +341,30 @@ |
333 | 341 | id = of_alias_get_id(np, "serial"); |
334 | 342 | if (id >= 0) |
335 | 343 | p->line = id; |
344 | + | |
345 | + if (of_property_read_bool(np, "dcd-override")) { | |
346 | + /* Always report DCD as active */ | |
347 | + data->msr_mask_on |= UART_MSR_DCD; | |
348 | + data->msr_mask_off |= UART_MSR_DDCD; | |
349 | + } | |
350 | + | |
351 | + if (of_property_read_bool(np, "dsr-override")) { | |
352 | + /* Always report DSR as active */ | |
353 | + data->msr_mask_on |= UART_MSR_DSR; | |
354 | + data->msr_mask_off |= UART_MSR_DDSR; | |
355 | + } | |
356 | + | |
357 | + if (of_property_read_bool(np, "cts-override")) { | |
358 | + /* Always report DSR as active */ | |
359 | + data->msr_mask_on |= UART_MSR_DSR; | |
360 | + data->msr_mask_off |= UART_MSR_DDSR; | |
361 | + } | |
362 | + | |
363 | + if (of_property_read_bool(np, "ri-override")) { | |
364 | + /* Always report Ring indicator as inactive */ | |
365 | + data->msr_mask_off |= UART_MSR_RI; | |
366 | + data->msr_mask_off |= UART_MSR_TERI; | |
367 | + } | |
336 | 368 | |
337 | 369 | /* clock got configured through clk api, all done */ |
338 | 370 | if (p->uartclk) |
drivers/tty/serial/8250/8250_pci.c
... | ... | @@ -69,7 +69,7 @@ |
69 | 69 | "Please send the output of lspci -vv, this\n" |
70 | 70 | "message (0x%04x,0x%04x,0x%04x,0x%04x), the\n" |
71 | 71 | "manufacturer and name of serial board or\n" |
72 | - "modem board to rmk+serial@arm.linux.org.uk.\n", | |
72 | + "modem board to <linux-serial@vger.kernel.org>.\n", | |
73 | 73 | pci_name(dev), str, dev->vendor, dev->device, |
74 | 74 | dev->subsystem_vendor, dev->subsystem_device); |
75 | 75 | } |
... | ... | @@ -1989,13 +1989,6 @@ |
1989 | 1989 | }, |
1990 | 1990 | { |
1991 | 1991 | .vendor = PCI_VENDOR_ID_INTEL, |
1992 | - .device = PCI_DEVICE_ID_INTEL_QRK_UART, | |
1993 | - .subvendor = PCI_ANY_ID, | |
1994 | - .subdevice = PCI_ANY_ID, | |
1995 | - .setup = pci_default_setup, | |
1996 | - }, | |
1997 | - { | |
1998 | - .vendor = PCI_VENDOR_ID_INTEL, | |
1999 | 1992 | .device = PCI_DEVICE_ID_INTEL_BSW_UART1, |
2000 | 1993 | .subvendor = PCI_ANY_ID, |
2001 | 1994 | .subdevice = PCI_ANY_ID, |
... | ... | @@ -2201,13 +2194,6 @@ |
2201 | 2194 | */ |
2202 | 2195 | { |
2203 | 2196 | .vendor = PCI_VENDOR_ID_PLX, |
2204 | - .device = PCI_DEVICE_ID_PLX_9030, | |
2205 | - .subvendor = PCI_SUBVENDOR_ID_PERLE, | |
2206 | - .subdevice = PCI_ANY_ID, | |
2207 | - .setup = pci_default_setup, | |
2208 | - }, | |
2209 | - { | |
2210 | - .vendor = PCI_VENDOR_ID_PLX, | |
2211 | 2197 | .device = PCI_DEVICE_ID_PLX_9050, |
2212 | 2198 | .subvendor = PCI_SUBVENDOR_ID_EXSYS, |
2213 | 2199 | .subdevice = PCI_SUBDEVICE_ID_EXSYS_4055, |
... | ... | @@ -5412,10 +5398,6 @@ |
5412 | 5398 | 0, 0, pbn_b0_bt_4_115200 }, |
5413 | 5399 | |
5414 | 5400 | { PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_2S1PF, |
5415 | - PCI_ANY_ID, PCI_ANY_ID, | |
5416 | - 0, 0, pbn_b0_bt_2_115200 }, | |
5417 | - | |
5418 | - { PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH352_2S, | |
5419 | 5401 | PCI_ANY_ID, PCI_ANY_ID, |
5420 | 5402 | 0, 0, pbn_b0_bt_2_115200 }, |
5421 | 5403 |
drivers/tty/serial/of_serial.c
drivers/tty/serial/sprd_serial.c
drivers/tty/tty_io.c
... | ... | @@ -1028,8 +1028,8 @@ |
1028 | 1028 | /* We limit tty time update visibility to every 8 seconds or so. */ |
1029 | 1029 | static void tty_update_time(struct timespec *time) |
1030 | 1030 | { |
1031 | - unsigned long sec = get_seconds() & ~7; | |
1032 | - if ((long)(sec - time->tv_sec) > 0) | |
1031 | + unsigned long sec = get_seconds(); | |
1032 | + if (abs(sec - time->tv_sec) & ~7) | |
1033 | 1033 | time->tv_sec = sec; |
1034 | 1034 | } |
1035 | 1035 |
drivers/tty/tty_ioctl.c
... | ... | @@ -217,11 +217,17 @@ |
217 | 217 | #endif |
218 | 218 | if (!timeout) |
219 | 219 | timeout = MAX_SCHEDULE_TIMEOUT; |
220 | - if (wait_event_interruptible_timeout(tty->write_wait, | |
221 | - !tty_chars_in_buffer(tty), timeout) >= 0) { | |
222 | - if (tty->ops->wait_until_sent) | |
223 | - tty->ops->wait_until_sent(tty, timeout); | |
224 | - } | |
220 | + | |
221 | + timeout = wait_event_interruptible_timeout(tty->write_wait, | |
222 | + !tty_chars_in_buffer(tty), timeout); | |
223 | + if (timeout <= 0) | |
224 | + return; | |
225 | + | |
226 | + if (timeout == MAX_SCHEDULE_TIMEOUT) | |
227 | + timeout = 0; | |
228 | + | |
229 | + if (tty->ops->wait_until_sent) | |
230 | + tty->ops->wait_until_sent(tty, timeout); | |
225 | 231 | } |
226 | 232 | EXPORT_SYMBOL(tty_wait_until_sent); |
227 | 233 |
drivers/usb/serial/generic.c
... | ... | @@ -258,7 +258,8 @@ |
258 | 258 | * character or at least one jiffy. |
259 | 259 | */ |
260 | 260 | period = max_t(unsigned long, (10 * HZ / bps), 1); |
261 | - period = min_t(unsigned long, period, timeout); | |
261 | + if (timeout) | |
262 | + period = min_t(unsigned long, period, timeout); | |
262 | 263 | |
263 | 264 | dev_dbg(&port->dev, "%s - timeout = %u ms, period = %u ms\n", |
264 | 265 | __func__, jiffies_to_msecs(timeout), |
... | ... | @@ -268,7 +269,7 @@ |
268 | 269 | schedule_timeout_interruptible(period); |
269 | 270 | if (signal_pending(current)) |
270 | 271 | break; |
271 | - if (time_after(jiffies, expire)) | |
272 | + if (timeout && time_after(jiffies, expire)) | |
272 | 273 | break; |
273 | 274 | } |
274 | 275 | } |
include/linux/serial_core.h
... | ... | @@ -143,13 +143,13 @@ |
143 | 143 | unsigned char iotype; /* io access style */ |
144 | 144 | unsigned char unused1; |
145 | 145 | |
146 | -#define UPIO_PORT (0) /* 8b I/O port access */ | |
147 | -#define UPIO_HUB6 (1) /* Hub6 ISA card */ | |
148 | -#define UPIO_MEM (2) /* 8b MMIO access */ | |
149 | -#define UPIO_MEM32 (3) /* 32b little endian */ | |
150 | -#define UPIO_MEM32BE (4) /* 32b big endian */ | |
151 | -#define UPIO_AU (5) /* Au1x00 and RT288x type IO */ | |
152 | -#define UPIO_TSI (6) /* Tsi108/109 type IO */ | |
146 | +#define UPIO_PORT (SERIAL_IO_PORT) /* 8b I/O port access */ | |
147 | +#define UPIO_HUB6 (SERIAL_IO_HUB6) /* Hub6 ISA card */ | |
148 | +#define UPIO_MEM (SERIAL_IO_MEM) /* 8b MMIO access */ | |
149 | +#define UPIO_MEM32 (SERIAL_IO_MEM32) /* 32b little endian */ | |
150 | +#define UPIO_AU (SERIAL_IO_AU) /* Au1x00 and RT288x type IO */ | |
151 | +#define UPIO_TSI (SERIAL_IO_TSI) /* Tsi108/109 type IO */ | |
152 | +#define UPIO_MEM32BE (SERIAL_IO_MEM32BE) /* 32b big endian */ | |
153 | 153 | |
154 | 154 | unsigned int read_status_mask; /* driver specific */ |
155 | 155 | unsigned int ignore_status_mask; /* driver specific */ |
include/uapi/linux/serial.h
... | ... | @@ -65,6 +65,10 @@ |
65 | 65 | #define SERIAL_IO_PORT 0 |
66 | 66 | #define SERIAL_IO_HUB6 1 |
67 | 67 | #define SERIAL_IO_MEM 2 |
68 | +#define SERIAL_IO_MEM32 3 | |
69 | +#define SERIAL_IO_AU 4 | |
70 | +#define SERIAL_IO_TSI 5 | |
71 | +#define SERIAL_IO_MEM32BE 6 | |
68 | 72 | |
69 | 73 | #define UART_CLEAR_FIFO 0x01 |
70 | 74 | #define UART_USE_FIFO 0x02 |
kernel/printk/console_cmdline.h
kernel/printk/printk.c
... | ... | @@ -2464,6 +2464,7 @@ |
2464 | 2464 | for (i = 0, c = console_cmdline; |
2465 | 2465 | i < MAX_CMDLINECONSOLES && c->name[0]; |
2466 | 2466 | i++, c++) { |
2467 | + BUILD_BUG_ON(sizeof(c->name) != sizeof(newcon->name)); | |
2467 | 2468 | if (strcmp(c->name, newcon->name) != 0) |
2468 | 2469 | continue; |
2469 | 2470 | if (newcon->index >= 0 && |
net/irda/ircomm/ircomm_tty.c
... | ... | @@ -798,7 +798,9 @@ |
798 | 798 | orig_jiffies = jiffies; |
799 | 799 | |
800 | 800 | /* Set poll time to 200 ms */ |
801 | - poll_time = IRDA_MIN(timeout, msecs_to_jiffies(200)); | |
801 | + poll_time = msecs_to_jiffies(200); | |
802 | + if (timeout) | |
803 | + poll_time = min_t(unsigned long, timeout, poll_time); | |
802 | 804 | |
803 | 805 | spin_lock_irqsave(&self->spinlock, flags); |
804 | 806 | while (self->tx_skb && self->tx_skb->len) { |