Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'tty-5.0-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty

Pull tty/serial fixes from Greg KH:
"Here are 2 tty and serial fixes for 5.0-rc2 that resolve some reported
issues.

The first is a simple serial driver fix for a regression that showed
up in 5.0-rc1. The second one resolves a number of reported issues
with the recent tty locking fixes that went into 5.0-rc1. Lots of
people have tested the second one and say it resolves their issues.

Both have been in linux-next with no reported issues"

* tag 'tty-5.0-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
tty: Don't hold ldisc lock in tty_reopen() if ldisc present
serial: lantiq: Do not swap register read/writes

+32 -24
+19 -17
drivers/tty/serial/lantiq.c
··· 114 114 115 115 static inline void asc_update_bits(u32 clear, u32 set, void __iomem *reg) 116 116 { 117 - u32 tmp = readl(reg); 117 + u32 tmp = __raw_readl(reg); 118 118 119 - writel((tmp & ~clear) | set, reg); 119 + __raw_writel((tmp & ~clear) | set, reg); 120 120 } 121 121 122 122 static inline struct ··· 144 144 static void 145 145 lqasc_stop_rx(struct uart_port *port) 146 146 { 147 - writel(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE); 147 + __raw_writel(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE); 148 148 } 149 149 150 150 static int ··· 153 153 struct tty_port *tport = &port->state->port; 154 154 unsigned int ch = 0, rsr = 0, fifocnt; 155 155 156 - fifocnt = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK; 156 + fifocnt = __raw_readl(port->membase + LTQ_ASC_FSTAT) & 157 + ASCFSTAT_RXFFLMASK; 157 158 while (fifocnt--) { 158 159 u8 flag = TTY_NORMAL; 159 160 ch = readb(port->membase + LTQ_ASC_RBUF); 160 - rsr = (readl(port->membase + LTQ_ASC_STATE) 161 + rsr = (__raw_readl(port->membase + LTQ_ASC_STATE) 161 162 & ASCSTATE_ANY) | UART_DUMMY_UER_RX; 162 163 tty_flip_buffer_push(tport); 163 164 port->icount.rx++; ··· 218 217 return; 219 218 } 220 219 221 - while (((readl(port->membase + LTQ_ASC_FSTAT) & 220 + while (((__raw_readl(port->membase + LTQ_ASC_FSTAT) & 222 221 ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF) != 0) { 223 222 if (port->x_char) { 224 223 writeb(port->x_char, port->membase + LTQ_ASC_TBUF); ··· 246 245 unsigned long flags; 247 246 struct uart_port *port = (struct uart_port *)_port; 248 247 spin_lock_irqsave(&ltq_asc_lock, flags); 249 - writel(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR); 248 + __raw_writel(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR); 250 249 spin_unlock_irqrestore(&ltq_asc_lock, flags); 251 250 lqasc_start_tx(port); 252 251 return IRQ_HANDLED; ··· 271 270 unsigned long flags; 272 271 struct uart_port *port = (struct uart_port *)_port; 273 272 spin_lock_irqsave(&ltq_asc_lock, flags); 274 - writel(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR); 273 + __raw_writel(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR); 275 274 lqasc_rx_chars(port); 276 275 spin_unlock_irqrestore(&ltq_asc_lock, flags); 277 276 return IRQ_HANDLED; ··· 281 280 lqasc_tx_empty(struct uart_port *port) 282 281 { 283 282 int status; 284 - status = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK; 283 + status = __raw_readl(port->membase + LTQ_ASC_FSTAT) & 284 + ASCFSTAT_TXFFLMASK; 285 285 return status ? 0 : TIOCSER_TEMT; 286 286 } 287 287 ··· 315 313 asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET), 316 314 port->membase + LTQ_ASC_CLC); 317 315 318 - writel(0, port->membase + LTQ_ASC_PISEL); 319 - writel( 316 + __raw_writel(0, port->membase + LTQ_ASC_PISEL); 317 + __raw_writel( 320 318 ((TXFIFO_FL << ASCTXFCON_TXFITLOFF) & ASCTXFCON_TXFITLMASK) | 321 319 ASCTXFCON_TXFEN | ASCTXFCON_TXFFLU, 322 320 port->membase + LTQ_ASC_TXFCON); 323 - writel( 321 + __raw_writel( 324 322 ((RXFIFO_FL << ASCRXFCON_RXFITLOFF) & ASCRXFCON_RXFITLMASK) 325 323 | ASCRXFCON_RXFEN | ASCRXFCON_RXFFLU, 326 324 port->membase + LTQ_ASC_RXFCON); ··· 352 350 goto err2; 353 351 } 354 352 355 - writel(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX, 353 + __raw_writel(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX, 356 354 port->membase + LTQ_ASC_IRNREN); 357 355 return 0; 358 356 ··· 371 369 free_irq(ltq_port->rx_irq, port); 372 370 free_irq(ltq_port->err_irq, port); 373 371 374 - writel(0, port->membase + LTQ_ASC_CON); 372 + __raw_writel(0, port->membase + LTQ_ASC_CON); 375 373 asc_update_bits(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU, 376 374 port->membase + LTQ_ASC_RXFCON); 377 375 asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU, ··· 463 461 asc_update_bits(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON); 464 462 465 463 /* now we can write the new baudrate into the register */ 466 - writel(divisor, port->membase + LTQ_ASC_BG); 464 + __raw_writel(divisor, port->membase + LTQ_ASC_BG); 467 465 468 466 /* turn the baudrate generator back on */ 469 467 asc_update_bits(0, ASCCON_R, port->membase + LTQ_ASC_CON); 470 468 471 469 /* enable rx */ 472 - writel(ASCWHBSTATE_SETREN, port->membase + LTQ_ASC_WHBSTATE); 470 + __raw_writel(ASCWHBSTATE_SETREN, port->membase + LTQ_ASC_WHBSTATE); 473 471 474 472 spin_unlock_irqrestore(&ltq_asc_lock, flags); 475 473 ··· 580 578 return; 581 579 582 580 do { 583 - fifofree = (readl(port->membase + LTQ_ASC_FSTAT) 581 + fifofree = (__raw_readl(port->membase + LTQ_ASC_FSTAT) 584 582 & ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF; 585 583 } while (fifofree == 0); 586 584 writeb(ch, port->membase + LTQ_ASC_TBUF);
+13 -7
drivers/tty/tty_io.c
··· 1256 1256 static int tty_reopen(struct tty_struct *tty) 1257 1257 { 1258 1258 struct tty_driver *driver = tty->driver; 1259 - int retval; 1259 + struct tty_ldisc *ld; 1260 + int retval = 0; 1260 1261 1261 1262 if (driver->type == TTY_DRIVER_TYPE_PTY && 1262 1263 driver->subtype == PTY_TYPE_MASTER) ··· 1269 1268 if (test_bit(TTY_EXCLUSIVE, &tty->flags) && !capable(CAP_SYS_ADMIN)) 1270 1269 return -EBUSY; 1271 1270 1272 - retval = tty_ldisc_lock(tty, 5 * HZ); 1273 - if (retval) 1274 - return retval; 1271 + ld = tty_ldisc_ref_wait(tty); 1272 + if (ld) { 1273 + tty_ldisc_deref(ld); 1274 + } else { 1275 + retval = tty_ldisc_lock(tty, 5 * HZ); 1276 + if (retval) 1277 + return retval; 1275 1278 1276 - if (!tty->ldisc) 1277 - retval = tty_ldisc_reinit(tty, tty->termios.c_line); 1278 - tty_ldisc_unlock(tty); 1279 + if (!tty->ldisc) 1280 + retval = tty_ldisc_reinit(tty, tty->termios.c_line); 1281 + tty_ldisc_unlock(tty); 1282 + } 1279 1283 1280 1284 if (retval == 0) 1281 1285 tty->count++;