hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/tty/serial/8250/8250_port.c
....@@ -737,7 +737,7 @@
737737 serial_out(p, UART_EFR, UART_EFR_ECB);
738738 serial_out(p, UART_LCR, 0);
739739 }
740
- serial8250_set_IER(p, sleep ? UART_IERX_SLEEP : 0);
740
+ serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0);
741741 if (p->capabilities & UART_CAP_EFR) {
742742 serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
743743 serial_out(p, UART_EFR, efr);
....@@ -1411,7 +1411,7 @@
14111411
14121412 up->ier &= ~(UART_IER_RLSI | UART_IER_RDI);
14131413 up->port.read_status_mask &= ~UART_LSR_DR;
1414
- serial8250_set_IER(up, up->ier);
1414
+ serial_port_out(port, UART_IER, up->ier);
14151415
14161416 serial8250_rpm_put(up);
14171417 }
....@@ -1441,7 +1441,7 @@
14411441 serial8250_clear_and_reinit_fifos(p);
14421442
14431443 p->ier |= UART_IER_RLSI | UART_IER_RDI;
1444
- serial8250_set_IER(p, p->ier);
1444
+ serial_port_out(&p->port, UART_IER, p->ier);
14451445 }
14461446 }
14471447 EXPORT_SYMBOL_GPL(serial8250_em485_stop_tx);
....@@ -1688,7 +1688,7 @@
16881688 mctrl_gpio_disable_ms(up->gpios);
16891689
16901690 up->ier &= ~UART_IER_MSI;
1691
- serial8250_set_IER(up, up->ier);
1691
+ serial_port_out(port, UART_IER, up->ier);
16921692 }
16931693
16941694 static void serial8250_enable_ms(struct uart_port *port)
....@@ -1704,7 +1704,7 @@
17041704 up->ier |= UART_IER_MSI;
17051705
17061706 serial8250_rpm_get(up);
1707
- serial8250_set_IER(up, up->ier);
1707
+ serial_port_out(port, UART_IER, up->ier);
17081708 serial8250_rpm_put(up);
17091709 }
17101710
....@@ -2171,7 +2171,14 @@
21712171 struct uart_8250_port *up = up_to_u8250p(port);
21722172
21732173 serial8250_rpm_get(up);
2174
- ier = serial8250_clear_IER(up);
2174
+ /*
2175
+ * First save the IER then disable the interrupts
2176
+ */
2177
+ ier = serial_port_in(port, UART_IER);
2178
+ if (up->capabilities & UART_CAP_UUE)
2179
+ serial_port_out(port, UART_IER, UART_IER_UUE);
2180
+ else
2181
+ serial_port_out(port, UART_IER, 0);
21752182
21762183 wait_for_xmitr(up, BOTH_EMPTY);
21772184 /*
....@@ -2184,7 +2191,7 @@
21842191 * and restore the IER
21852192 */
21862193 wait_for_xmitr(up, BOTH_EMPTY);
2187
- serial8250_set_IER(up, ier);
2194
+ serial_port_out(port, UART_IER, ier);
21882195 serial8250_rpm_put(up);
21892196 }
21902197
....@@ -2491,7 +2498,7 @@
24912498 */
24922499 spin_lock_irqsave(&port->lock, flags);
24932500 up->ier = 0;
2494
- serial8250_set_IER(up, 0);
2501
+ serial_port_out(port, UART_IER, 0);
24952502 spin_unlock_irqrestore(&port->lock, flags);
24962503
24972504 synchronize_irq(port->irq);
....@@ -2863,7 +2870,7 @@
28632870 if (up->capabilities & UART_CAP_RTOIE)
28642871 up->ier |= UART_IER_RTOIE;
28652872
2866
- serial8250_set_IER(up, up->ier);
2873
+ serial_port_out(port, UART_IER, up->ier);
28672874 #endif
28682875
28692876 if (up->capabilities & UART_CAP_EFR) {
....@@ -2923,7 +2930,7 @@
29232930 if (up->capabilities & UART_CAP_RTOIE)
29242931 up->ier |= UART_IER_RTOIE;
29252932
2926
- serial8250_set_IER(up, up->ier);
2933
+ serial_port_out(port, UART_IER, up->ier);
29272934 #endif
29282935
29292936 spin_unlock_irqrestore(&port->lock, flags);
....@@ -3355,24 +3362,12 @@
33553362
33563363 #ifdef CONFIG_SERIAL_8250_CONSOLE
33573364
3358
-static void serial8250_console_putchar_locked(struct uart_port *port, int ch)
3365
+static void serial8250_console_putchar(struct uart_port *port, int ch)
33593366 {
33603367 struct uart_8250_port *up = up_to_u8250p(port);
33613368
33623369 wait_for_xmitr(up, UART_LSR_THRE);
33633370 serial_port_out(port, UART_TX, ch);
3364
-}
3365
-
3366
-static void serial8250_console_putchar(struct uart_port *port, int ch)
3367
-{
3368
- struct uart_8250_port *up = up_to_u8250p(port);
3369
- unsigned int flags;
3370
-
3371
- wait_for_xmitr(up, UART_LSR_THRE);
3372
-
3373
- console_atomic_lock(&flags);
3374
- serial8250_console_putchar_locked(port, ch);
3375
- console_atomic_unlock(flags);
33763371 }
33773372
33783373 /*
....@@ -3396,32 +3391,6 @@
33963391 serial8250_out_MCR(up, up->mcr | UART_MCR_DTR | UART_MCR_RTS);
33973392 }
33983393
3399
-void serial8250_console_write_atomic(struct uart_8250_port *up,
3400
- const char *s, unsigned int count)
3401
-{
3402
- struct uart_port *port = &up->port;
3403
- unsigned int flags;
3404
- unsigned int ier;
3405
-
3406
- console_atomic_lock(&flags);
3407
-
3408
- touch_nmi_watchdog();
3409
-
3410
- ier = serial8250_clear_IER(up);
3411
-
3412
- if (atomic_fetch_inc(&up->console_printing)) {
3413
- uart_console_write(port, "\n", 1,
3414
- serial8250_console_putchar_locked);
3415
- }
3416
- uart_console_write(port, s, count, serial8250_console_putchar_locked);
3417
- atomic_dec(&up->console_printing);
3418
-
3419
- wait_for_xmitr(up, BOTH_EMPTY);
3420
- serial8250_set_IER(up, ier);
3421
-
3422
- console_atomic_unlock(flags);
3423
-}
3424
-
34253394 /*
34263395 * Print a string to the serial port trying not to disturb
34273396 * any possible real use of the port...
....@@ -3438,12 +3407,24 @@
34383407 struct uart_port *port = &up->port;
34393408 unsigned long flags;
34403409 unsigned int ier;
3410
+ int locked = 1;
34413411
34423412 touch_nmi_watchdog();
34433413
3444
- spin_lock_irqsave(&port->lock, flags);
3414
+ if (oops_in_progress)
3415
+ locked = spin_trylock_irqsave(&port->lock, flags);
3416
+ else
3417
+ spin_lock_irqsave(&port->lock, flags);
34453418
3446
- ier = serial8250_clear_IER(up);
3419
+ /*
3420
+ * First save the IER then disable the interrupts
3421
+ */
3422
+ ier = serial_port_in(port, UART_IER);
3423
+
3424
+ if (up->capabilities & UART_CAP_UUE)
3425
+ serial_port_out(port, UART_IER, UART_IER_UUE);
3426
+ else
3427
+ serial_port_out(port, UART_IER, 0);
34473428
34483429 /* check scratch reg to see if port powered off during system sleep */
34493430 if (up->canary && (up->canary != serial_port_in(port, UART_SCR))) {
....@@ -3457,9 +3438,7 @@
34573438 mdelay(port->rs485.delay_rts_before_send);
34583439 }
34593440
3460
- atomic_inc(&up->console_printing);
34613441 uart_console_write(port, s, count, serial8250_console_putchar);
3462
- atomic_dec(&up->console_printing);
34633442
34643443 /*
34653444 * Finally, wait for transmitter to become empty
....@@ -3472,7 +3451,8 @@
34723451 if (em485->tx_stopped)
34733452 up->rs485_stop_tx(up);
34743453 }
3475
- serial8250_set_IER(up, ier);
3454
+
3455
+ serial_port_out(port, UART_IER, ier);
34763456
34773457 /*
34783458 * The receive handling will happen properly because the
....@@ -3484,7 +3464,8 @@
34843464 if (up->msr_saved_flags)
34853465 serial8250_modem_status(up);
34863466
3487
- spin_unlock_irqrestore(&port->lock, flags);
3467
+ if (locked)
3468
+ spin_unlock_irqrestore(&port->lock, flags);
34883469 }
34893470
34903471 static unsigned int probe_baud(struct uart_port *port)
....@@ -3504,7 +3485,6 @@
35043485
35053486 int serial8250_console_setup(struct uart_port *port, char *options, bool probe)
35063487 {
3507
- struct uart_8250_port *up = up_to_u8250p(port);
35083488 int baud = 9600;
35093489 int bits = 8;
35103490 int parity = 'n';
....@@ -3513,8 +3493,6 @@
35133493
35143494 if (!port->iobase && !port->membase)
35153495 return -ENODEV;
3516
-
3517
- atomic_set(&up->console_printing, 0);
35183496
35193497 if (options)
35203498 uart_parse_options(options, &baud, &parity, &bits, &flow);