* [PATCH 1/2] [v4] serial: 8250: remove obsolete PORT_RSA support
@ 2026-10-21 8:17 Arnd Bergmann
2026-10-21 8:17 ` [PATCH 2/2] [v4] serial: 8250: remove hub6 multiport support Arnd Bergmann
2026-10-21 9:27 ` [PATCH 1/2] [v4] serial: 8250: remove obsolete PORT_RSA support Andy Shevchenko
0 siblings, 2 replies; 3+ messages in thread
From: Arnd Bergmann @ 2026-10-21 8:17 UTC (permalink / raw)
To: linux-serial, Greg Kroah-Hartman
Cc: Jiri Slaby, Andy Shevchenko, Hugo Villeneuve,
Uwe Kleine-König, linux-kernel, Maciej W . Rozycki,
Kiyokazu SUTO, Arnd Bergmann
From: Arnd Bergmann <arnd@arndb.de>
For all I can tell, the RSA support in the 8250 driver is not functional
and has not been for a long time.
The RSA-DV II/S ISA card[1] was sold by IODATA in the 1990s as a faster
alternative to regular ISA serial ports, and it was discontinued in
2002. Linux support was added by Kiyokazu SUTO in 2000[2]. The company
also made PCI versions of this device, but Linux never supported those.
It seems that a patch to setserial would be required in order to set
PORT_RSA when not using autoconfiguration, and this was never merged.
Autotoconfiguration in turn requires passing probe_rsa=IOPORT arguments
at boot or module load time, which is not how any other uart drivers
work any more since linux-2.4.
This patch removes all code related to the RSA support, with the exception
of the user-visible PORT_RSA definition. I had originall sent this in
2011 [3], but did not follow up at the time.
Link: http://www.iodata.jp/products/network/rsadv2s.htm [1]
Link: https://pub.ks-and-ks.ne.jp/prog/linux/rsa.en.shtml [2]
Link: https://lore.kernel.org/all/1309211120-2803-6-git-send-email-arnd@arndb.de/ [3]
Cc: Kiyokazu SUTO <suto@ks-and-ks.ne.jp>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
v2: rebased my own patch after 15 years
v3: fix up Makefile and sunsu.c file
v4: improve changelog text, rebase ahead of hub6 driver
---
drivers/tty/serial/8250/8250.h | 17 --
drivers/tty/serial/8250/8250_core.c | 6 -
drivers/tty/serial/8250/8250_platform.c | 4 -
drivers/tty/serial/8250/8250_port.c | 8 -
drivers/tty/serial/8250/8250_rsa.c | 209 ------------------------
drivers/tty/serial/8250/Kconfig | 11 --
drivers/tty/serial/8250/Makefile | 1 -
drivers/tty/serial/sunsu.c | 92 -----------
include/uapi/linux/serial_reg.h | 51 ------
9 files changed, 399 deletions(-)
delete mode 100644 drivers/tty/serial/8250/8250_rsa.c
diff --git a/drivers/tty/serial/8250/8250.h b/drivers/tty/serial/8250/8250.h
index 21ed9c41b751..eee90c84a81d 100644
--- a/drivers/tty/serial/8250/8250.h
+++ b/drivers/tty/serial/8250/8250.h
@@ -126,9 +126,6 @@ void serial8250_isa_init_ports(void);
extern struct platform_device *serial8250_isa_devs;
-extern const struct uart_ops *univ8250_port_base_ops;
-extern struct uart_ops univ8250_port_ops;
-
static inline int serial_in(struct uart_8250_port *up, int offset)
{
return up->port.serial_in(&up->port, offset);
@@ -331,20 +328,6 @@ static inline int serial8250_hub6_init(void) { return 0; }
static inline void serial8250_hub6_exit(void) { }
#endif
-#ifdef CONFIG_SERIAL_8250_RSA
-void univ8250_rsa_support(struct uart_ops *ops, const struct uart_ops *core_ops);
-void rsa_enable(struct uart_8250_port *up);
-void rsa_disable(struct uart_8250_port *up);
-void rsa_autoconfig(struct uart_8250_port *up);
-void rsa_reset(struct uart_8250_port *up);
-#else
-static inline void univ8250_rsa_support(struct uart_ops *ops, const struct uart_ops *core_ops) { }
-static inline void rsa_enable(struct uart_8250_port *up) {}
-static inline void rsa_disable(struct uart_8250_port *up) {}
-static inline void rsa_autoconfig(struct uart_8250_port *up) {}
-static inline void rsa_reset(struct uart_8250_port *up) {}
-#endif
-
#ifdef CONFIG_SERIAL_8250_FINTEK
int fintek_8250_probe(struct uart_8250_port *uart);
#else
diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c
index 42319843cb5b..e7ffeac562d2 100644
--- a/drivers/tty/serial/8250/8250_core.c
+++ b/drivers/tty/serial/8250/8250_core.c
@@ -307,9 +307,6 @@ static void univ8250_release_irq(struct uart_8250_port *up)
serial_unlink_irq_chain(up);
}
-const struct uart_ops *univ8250_port_base_ops;
-struct uart_ops univ8250_port_ops;
-
static const struct uart_8250_ops univ8250_driver_ops = {
.setup_irq = univ8250_setup_irq,
.release_irq = univ8250_release_irq,
@@ -352,9 +349,6 @@ struct uart_8250_port *serial8250_setup_port(int index)
up->port.port_id = index;
serial8250_init_port(up);
- if (!univ8250_port_base_ops)
- univ8250_port_base_ops = up->port.ops;
- up->port.ops = &univ8250_port_ops;
timer_setup(&up->timer, serial8250_timeout, 0);
diff --git a/drivers/tty/serial/8250/8250_platform.c b/drivers/tty/serial/8250/8250_platform.c
index 7ce7ad295fae..3a9101cb1060 100644
--- a/drivers/tty/serial/8250/8250_platform.c
+++ b/drivers/tty/serial/8250/8250_platform.c
@@ -73,10 +73,6 @@ static void __init __serial8250_isa_init_ports(void)
for (i = 0; i < nr_uarts; i++)
serial8250_setup_port(i);
- /* chain base port ops to support Remote Supervisor Adapter */
- univ8250_port_ops = *univ8250_port_base_ops;
- univ8250_rsa_support(&univ8250_port_ops, univ8250_port_base_ops);
-
for (i = 0; i < ARRAY_SIZE(old_serial_port) && i < nr_uarts; i++) {
struct uart_8250_port *up = serial8250_get_port(i);
struct uart_port *port = &up->port;
diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
index 36b2b0a2c05c..8aaf1f852a9a 100644
--- a/drivers/tty/serial/8250/8250_port.c
+++ b/drivers/tty/serial/8250/8250_port.c
@@ -1209,8 +1209,6 @@ static void autoconfig(struct uart_8250_port *up)
break;
}
- rsa_autoconfig(up);
-
serial_out(up, UART_LCR, save_lcr);
port->fifosize = uart_config[up->port.type].fifo_size;
@@ -1222,7 +1220,6 @@ static void autoconfig(struct uart_8250_port *up)
/*
* Reset the UART.
*/
- rsa_reset(up);
serial8250_out_MCR(up, save_mcr);
serial8250_clear_fifos(up);
serial_in(up, UART_RX);
@@ -2179,9 +2176,6 @@ static void serial8250_startup_special(struct uart_port *port)
UART_DA830_PWREMU_MGMT_URRST |
UART_DA830_PWREMU_MGMT_FREE);
break;
- case PORT_RSA:
- rsa_enable(up);
- break;
}
}
@@ -2473,8 +2467,6 @@ void serial8250_do_shutdown(struct uart_port *port)
serial8250_clear_fifos(up);
- rsa_disable(up);
-
/*
* Read data port to reset things, and then unlink from
* the IRQ chain.
diff --git a/drivers/tty/serial/8250/8250_rsa.c b/drivers/tty/serial/8250/8250_rsa.c
deleted file mode 100644
index da971437e89c..000000000000
--- a/drivers/tty/serial/8250/8250_rsa.c
+++ /dev/null
@@ -1,209 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-
-#include <linux/serial.h>
-#include <linux/serial_8250.h>
-
-#include "8250.h"
-
-#define PORT_RSA_MAX 4
-static unsigned long probe_rsa[PORT_RSA_MAX];
-static unsigned int probe_rsa_count;
-
-static const struct uart_ops *core_port_base_ops;
-
-static int rsa8250_request_resource(struct uart_8250_port *up)
-{
- struct uart_port *port = &up->port;
- unsigned long start;
- unsigned int size;
-
- if (!uart_iotype_io(port->iotype))
- return -EINVAL;
-
- start = UART_RSA_BASE << port->regshift;
- start += port->iobase;
- size = 8 << port->regshift;
-
- if (!request_region(start, size, "serial-rsa"))
- return -EBUSY;
- return 0;
-}
-
-static void rsa8250_release_resource(struct uart_8250_port *up)
-{
- struct uart_port *port = &up->port;
- unsigned long offset;
- unsigned int size;
-
- if (!uart_iotype_io(port->iotype))
- return;
-
- offset = UART_RSA_BASE << port->regshift;
- size = 8 << port->regshift;
- release_region(port->iobase + offset, size);
-}
-
-static void univ8250_config_port(struct uart_port *port, int flags)
-{
- struct uart_8250_port *up = up_to_u8250p(port);
- unsigned int i;
-
- up->probe &= ~UART_PROBE_RSA;
- if (port->type == PORT_RSA) {
- if (rsa8250_request_resource(up) == 0)
- up->probe |= UART_PROBE_RSA;
- } else if (flags & UART_CONFIG_TYPE) {
- for (i = 0; i < probe_rsa_count; i++) {
- if (probe_rsa[i] == up->port.iobase) {
- if (rsa8250_request_resource(up) == 0)
- up->probe |= UART_PROBE_RSA;
- break;
- }
- }
- }
-
- core_port_base_ops->config_port(port, flags);
-
- if (port->type != PORT_RSA && up->probe & UART_PROBE_RSA)
- rsa8250_release_resource(up);
-}
-
-static int univ8250_request_port(struct uart_port *port)
-{
- struct uart_8250_port *up = up_to_u8250p(port);
- int ret;
-
- ret = core_port_base_ops->request_port(port);
- if (ret == 0 && port->type == PORT_RSA) {
- ret = rsa8250_request_resource(up);
- if (ret < 0)
- core_port_base_ops->release_port(port);
- }
-
- return ret;
-}
-
-static void univ8250_release_port(struct uart_port *port)
-{
- struct uart_8250_port *up = up_to_u8250p(port);
-
- if (port->type == PORT_RSA)
- rsa8250_release_resource(up);
- core_port_base_ops->release_port(port);
-}
-
-/*
- * It is not allowed to directly reference any symbols from 8250.ko here as
- * that would result in a dependency loop between the 8250.ko and
- * 8250_base.ko modules. This function is called from 8250.ko and is used to
- * break the symbolic dependency cycle. Anything that is needed from 8250.ko
- * has to be passed as pointers to this function which then can adjust those
- * variables on 8250.ko side or store them locally as needed.
- */
-void univ8250_rsa_support(struct uart_ops *ops, const struct uart_ops *core_ops)
-{
- core_port_base_ops = core_ops;
- ops->config_port = univ8250_config_port;
- ops->request_port = univ8250_request_port;
- ops->release_port = univ8250_release_port;
-}
-EXPORT_SYMBOL_FOR_MODULES(univ8250_rsa_support, "8250");
-
-module_param_hw_array(probe_rsa, ulong, ioport, &probe_rsa_count, 0444);
-MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
-
-/*
- * Attempts to turn on the RSA FIFO. Returns zero on failure.
- * We set the port uart clock rate if we succeed.
- */
-static int __rsa_enable(struct uart_8250_port *up)
-{
- unsigned char mode;
- int result;
-
- mode = serial_in(up, UART_RSA_MSR);
- result = mode & UART_RSA_MSR_FIFO;
-
- if (!result) {
- serial_out(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO);
- mode = serial_in(up, UART_RSA_MSR);
- result = mode & UART_RSA_MSR_FIFO;
- }
-
- if (result)
- up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16;
-
- return result;
-}
-
-/*
- * If this is an RSA port, see if we can kick it up to the higher speed clock.
- */
-void rsa_enable(struct uart_8250_port *up)
-{
- if (up->port.type != PORT_RSA)
- return;
-
- if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
- guard(uart_port_lock_irq)(&up->port);
- __rsa_enable(up);
- }
- if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
- serial_out(up, UART_RSA_FRR, 0);
-}
-
-/*
- * Attempts to turn off the RSA FIFO and resets the RSA board back to 115kbps compat mode. It is
- * unknown why interrupts were disabled in here. However, the caller is expected to preserve this
- * behaviour by grabbing the spinlock before calling this function.
- */
-void rsa_disable(struct uart_8250_port *up)
-{
- unsigned char mode;
- int result;
-
- if (up->port.type != PORT_RSA)
- return;
-
- if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16)
- return;
-
- guard(uart_port_lock_irq)(&up->port);
-
- mode = serial_in(up, UART_RSA_MSR);
- result = !(mode & UART_RSA_MSR_FIFO);
-
- if (!result) {
- serial_out(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO);
- mode = serial_in(up, UART_RSA_MSR);
- result = !(mode & UART_RSA_MSR_FIFO);
- }
-
- if (result)
- up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
-}
-
-void rsa_autoconfig(struct uart_8250_port *up)
-{
- /* Only probe for RSA ports if we got the region. */
- if (up->port.type != PORT_16550A)
- return;
- if (!(up->probe & UART_PROBE_RSA))
- return;
-
- if (__rsa_enable(up))
- up->port.type = PORT_RSA;
-}
-
-void rsa_reset(struct uart_8250_port *up)
-{
- if (up->port.type != PORT_RSA)
- return;
-
- serial_out(up, UART_RSA_FRR, 0);
-}
diff --git a/drivers/tty/serial/8250/Kconfig b/drivers/tty/serial/8250/Kconfig
index 82e761b8298a..7a5a9cbc7d02 100644
--- a/drivers/tty/serial/8250/Kconfig
+++ b/drivers/tty/serial/8250/Kconfig
@@ -236,17 +236,6 @@ config SERIAL_8250_DETECT_IRQ
If unsure, say N.
-config SERIAL_8250_RSA
- bool "Support RSA serial ports"
- depends on SERIAL_8250_EXTENDED
- help
- Say Y here if you have a IODATA RSA-DV II/S ISA card and
- would like to use its >115kbps speeds.
- You will need to provide module parameter "probe_rsa", or boot-time
- parameter 8250.probe_rsa with I/O addresses of this card then.
-
- If you don't have such card, or if unsure, say N.
-
config SERIAL_8250_MANY_PORTS
bool "Support more than 4 legacy serial ports"
depends on SERIAL_8250_EXTENDED
diff --git a/drivers/tty/serial/8250/Makefile b/drivers/tty/serial/8250/Makefile
index 5ff2ba414e13..3c8ae7e4231b 100644
--- a/drivers/tty/serial/8250/Makefile
+++ b/drivers/tty/serial/8250/Makefile
@@ -15,7 +15,6 @@ obj-$(CONFIG_SERIAL_8250) += 8250_base.o
8250_base-$(CONFIG_SERIAL_8250_DWLIB) += 8250_dwlib.o
8250_base-$(CONFIG_SERIAL_8250_FINTEK) += 8250_fintek.o
8250_base-$(CONFIG_SERIAL_8250_PCILIB) += 8250_pcilib.o
-8250_base-$(CONFIG_SERIAL_8250_RSA) += 8250_rsa.o
obj-$(CONFIG_SERIAL_8250_CONSOLE) += 8250_early.o
diff --git a/drivers/tty/serial/sunsu.c b/drivers/tty/serial/sunsu.c
index 4ff3e5c41dab..52437a133cdd 100644
--- a/drivers/tty/serial/sunsu.c
+++ b/drivers/tty/serial/sunsu.c
@@ -159,75 +159,6 @@ static void serial_icr_write(struct uart_sunsu_port *up, int offset, int value)
serial_out(up, UART_ICR, value);
}
-#ifdef CONFIG_SERIAL_8250_RSA
-/*
- * Attempts to turn on the RSA FIFO. Returns zero on failure.
- * We set the port uart clock rate if we succeed.
- */
-static int __enable_rsa(struct uart_sunsu_port *up)
-{
- unsigned char mode;
- int result;
-
- mode = serial_in(up, UART_RSA_MSR);
- result = mode & UART_RSA_MSR_FIFO;
-
- if (!result) {
- serial_out(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO);
- mode = serial_in(up, UART_RSA_MSR);
- result = mode & UART_RSA_MSR_FIFO;
- }
-
- if (result)
- up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16;
-
- return result;
-}
-
-static void enable_rsa(struct uart_sunsu_port *up)
-{
- if (up->port.type == PORT_RSA) {
- if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
- uart_port_lock_irq(&up->port);
- __enable_rsa(up);
- uart_port_unlock_irq(&up->port);
- }
- if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
- serial_out(up, UART_RSA_FRR, 0);
- }
-}
-
-/*
- * Attempts to turn off the RSA FIFO. Returns zero on failure.
- * It is unknown why interrupts were disabled in here. However,
- * the caller is expected to preserve this behaviour by grabbing
- * the spinlock before calling this function.
- */
-static void disable_rsa(struct uart_sunsu_port *up)
-{
- unsigned char mode;
- int result;
-
- if (up->port.type == PORT_RSA &&
- up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
- uart_port_lock_irq(&up->port);
-
- mode = serial_in(up, UART_RSA_MSR);
- result = !(mode & UART_RSA_MSR_FIFO);
-
- if (!result) {
- serial_out(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO);
- mode = serial_in(up, UART_RSA_MSR);
- result = !(mode & UART_RSA_MSR_FIFO);
- }
-
- if (result)
- up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
- uart_port_unlock_irq(&up->port);
- }
-}
-#endif /* CONFIG_SERIAL_8250_RSA */
-
static inline void __stop_tx(struct uart_sunsu_port *p)
{
if (p->ier & UART_IER_THRI) {
@@ -605,14 +536,6 @@ static int sunsu_startup(struct uart_port *port)
serial_out(up, UART_LCR, 0);
}
-#ifdef CONFIG_SERIAL_8250_RSA
- /*
- * If this is an RSA port, see if we can kick it up to the
- * higher speed clock.
- */
- enable_rsa(up);
-#endif
-
/*
* Clear the FIFO buffers and disable them.
* (they will be reenabled in set_termios())
@@ -728,13 +651,6 @@ static void sunsu_shutdown(struct uart_port *port)
UART_FCR_CLEAR_XMIT);
serial_out(up, UART_FCR, 0);
-#ifdef CONFIG_SERIAL_8250_RSA
- /*
- * Reset the RSA board back to 115kbps compat mode.
- */
- disable_rsa(up);
-#endif
-
/*
* Read data port to reset things.
*/
@@ -789,10 +705,6 @@ sunsu_change_speed(struct uart_port *port, unsigned int cflag,
if (uart_config[up->port.type].flags & UART_USE_FIFO) {
if ((up->port.uartclk / quot) < (2400 * 16))
fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;
-#ifdef CONFIG_SERIAL_8250_RSA
- else if (up->port.type == PORT_RSA)
- fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_14;
-#endif
else
fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_8;
}
@@ -1137,10 +1049,6 @@ static void sunsu_autoconfig(struct uart_sunsu_port *up)
/*
* Reset the UART.
*/
-#ifdef CONFIG_SERIAL_8250_RSA
- if (up->port.type == PORT_RSA)
- serial_out(up, UART_RSA_FRR, 0);
-#endif
serial_out(up, UART_MCR, save_mcr);
serial_out(up, UART_FCR, (UART_FCR_ENABLE_FIFO |
UART_FCR_CLEAR_RCVR |
diff --git a/include/uapi/linux/serial_reg.h b/include/uapi/linux/serial_reg.h
index 9c987b04e2d0..e4f288b557ca 100644
--- a/include/uapi/linux/serial_reg.h
+++ b/include/uapi/linux/serial_reg.h
@@ -285,57 +285,6 @@
#define UART_ACR_ICRRD 0x40 /* ICR Read enable */
#define UART_ACR_ASREN 0x80 /* Additional status enable */
-
-
-/*
- * These definitions are for the RSA-DV II/S card, from
- *
- * Kiyokazu SUTO <suto@ks-and-ks.ne.jp>
- */
-
-#define UART_RSA_BASE (-8)
-
-#define UART_RSA_MSR ((UART_RSA_BASE) + 0) /* I/O: Mode Select Register */
-
-#define UART_RSA_MSR_SWAP (1 << 0) /* Swap low/high 8 bytes in I/O port addr */
-#define UART_RSA_MSR_FIFO (1 << 2) /* Enable the external FIFO */
-#define UART_RSA_MSR_FLOW (1 << 3) /* Enable the auto RTS/CTS flow control */
-#define UART_RSA_MSR_ITYP (1 << 4) /* Level (1) / Edge triger (0) */
-
-#define UART_RSA_IER ((UART_RSA_BASE) + 1) /* I/O: Interrupt Enable Register */
-
-#define UART_RSA_IER_Rx_FIFO_H (1 << 0) /* Enable Rx FIFO half full int. */
-#define UART_RSA_IER_Tx_FIFO_H (1 << 1) /* Enable Tx FIFO half full int. */
-#define UART_RSA_IER_Tx_FIFO_E (1 << 2) /* Enable Tx FIFO empty int. */
-#define UART_RSA_IER_Rx_TOUT (1 << 3) /* Enable char receive timeout int */
-#define UART_RSA_IER_TIMER (1 << 4) /* Enable timer interrupt */
-
-#define UART_RSA_SRR ((UART_RSA_BASE) + 2) /* IN: Status Read Register */
-
-#define UART_RSA_SRR_Tx_FIFO_NEMP (1 << 0) /* Tx FIFO is not empty (1) */
-#define UART_RSA_SRR_Tx_FIFO_NHFL (1 << 1) /* Tx FIFO is not half full (1) */
-#define UART_RSA_SRR_Tx_FIFO_NFUL (1 << 2) /* Tx FIFO is not full (1) */
-#define UART_RSA_SRR_Rx_FIFO_NEMP (1 << 3) /* Rx FIFO is not empty (1) */
-#define UART_RSA_SRR_Rx_FIFO_NHFL (1 << 4) /* Rx FIFO is not half full (1) */
-#define UART_RSA_SRR_Rx_FIFO_NFUL (1 << 5) /* Rx FIFO is not full (1) */
-#define UART_RSA_SRR_Rx_TOUT (1 << 6) /* Character reception timeout occurred (1) */
-#define UART_RSA_SRR_TIMER (1 << 7) /* Timer interrupt occurred */
-
-#define UART_RSA_FRR ((UART_RSA_BASE) + 2) /* OUT: FIFO Reset Register */
-
-#define UART_RSA_TIVSR ((UART_RSA_BASE) + 3) /* I/O: Timer Interval Value Set Register */
-
-#define UART_RSA_TCR ((UART_RSA_BASE) + 4) /* OUT: Timer Control Register */
-
-#define UART_RSA_TCR_SWITCH (1 << 0) /* Timer on */
-
-/*
- * The RSA DSV/II board has two fixed clock frequencies. One is the
- * standard rate, and the other is 8 times faster.
- */
-#define SERIAL_RSA_BAUD_BASE (921600)
-#define SERIAL_RSA_BAUD_BASE_LO (SERIAL_RSA_BAUD_BASE / 8)
-
/* Extra registers for TI DA8xx/66AK2x */
#define UART_DA830_PWREMU_MGMT 12
--
2.53.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 2/2] [v4] serial: 8250: remove hub6 multiport support
2026-10-21 8:17 [PATCH 1/2] [v4] serial: 8250: remove obsolete PORT_RSA support Arnd Bergmann
@ 2026-10-21 8:17 ` Arnd Bergmann
2026-10-21 9:27 ` [PATCH 1/2] [v4] serial: 8250: remove obsolete PORT_RSA support Andy Shevchenko
1 sibling, 0 replies; 3+ messages in thread
From: Arnd Bergmann @ 2026-10-21 8:17 UTC (permalink / raw)
To: linux-serial, Greg Kroah-Hartman
Cc: Jiri Slaby, Andy Shevchenko, Hugo Villeneuve,
Uwe Kleine-König, linux-kernel, Maciej W . Rozycki,
Kiyokazu SUTO, Arnd Bergmann, Frank Li
From: Arnd Bergmann <arnd@arndb.de>
hub6 support was added in linux-0.99 and the hardware was already old at
the time, being discontinued in 1990. The code for it has always been a
mess since it adds another dimension to the I/O addressing in the driver
that has leaked into many individual files.
Hugo and Uwe have attempted several times this year alone to isolate
the hub6 handling into the 8250_hub6.c file, but I feel that none of
this has been a real improvement over the original standalone loadable
module support.
Any machine that would have used this ISA card in practice is likely
30 to 40 years old, and with i486 support now removed, it is clearly
safe to just kill this all off. The only bit that has to remain
is the ioctl interface, to ensure the serial_struct field is always
zero.
Link: https://mirrors.nycbug.org/pub/The_Unix_Archive/Unix_Usenet/comp.unix.sysv386/1990-December/007174.html
Fixes: a300273c458c ("serial: 8250: hub6: Add cleanup code")
Fixes: c526404a4a92 ("serial: 8250: Fix corner case for port matching")
Fixes: 7ab80d1e7243 ("serial: 8250: fix compile error with hub6_match_port() when compiled as a module")
Fixes: da7b5fd4e17f ("serial: 8250_hub6: add missing include for hub6_match_port()")
Fixes: 3d406299d882 ("serial: 8250_hub6: add hub6_match_port()")
Acked-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Acked-by: Frank Li <Frank.Li@nxp.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
v3: address coding style comments
move serial_struct sanity check up
move to v3 to align with the port_rsa patch version number
v4: rebase on top of RSA patch
---
drivers/tty/serial/8250/8250.h | 15 -------
drivers/tty/serial/8250/8250_core.c | 2 -
drivers/tty/serial/8250/8250_hub6.c | 60 -------------------------
drivers/tty/serial/8250/8250_platform.c | 11 +----
drivers/tty/serial/8250/8250_port.c | 23 ----------
drivers/tty/serial/8250/Kconfig | 15 ++-----
drivers/tty/serial/8250/Makefile | 1 -
drivers/tty/serial/atmel_serial.c | 2 -
drivers/tty/serial/fsl_lpuart.c | 2 -
drivers/tty/serial/imx.c | 2 -
drivers/tty/serial/mpc52xx_uart.c | 3 +-
drivers/tty/serial/sa1100.c | 2 -
drivers/tty/serial/serial_core.c | 24 +++++-----
drivers/tty/serial/sunsu.c | 9 ----
drivers/tty/serial/xilinx_uartps.c | 2 -
include/linux/serial_8250.h | 2 -
include/linux/serial_core.h | 2 -
17 files changed, 15 insertions(+), 162 deletions(-)
delete mode 100644 drivers/tty/serial/8250/8250_hub6.c
diff --git a/drivers/tty/serial/8250/8250.h b/drivers/tty/serial/8250/8250.h
index eee90c84a81d..6225027ed7b4 100644
--- a/drivers/tty/serial/8250/8250.h
+++ b/drivers/tty/serial/8250/8250.h
@@ -320,27 +320,12 @@ static inline int serial8250_pnp_init(void) { return 0; }
static inline void serial8250_pnp_exit(void) { }
#endif
-#ifdef CONFIG_SERIAL_8250_HUB6
-int serial8250_hub6_init(void);
-void serial8250_hub6_exit(void);
-#else
-static inline int serial8250_hub6_init(void) { return 0; }
-static inline void serial8250_hub6_exit(void) { }
-#endif
-
#ifdef CONFIG_SERIAL_8250_FINTEK
int fintek_8250_probe(struct uart_8250_port *uart);
#else
static inline int fintek_8250_probe(struct uart_8250_port *uart) { return 0; }
#endif
-#if IS_ENABLED(CONFIG_SERIAL_8250_HUB6)
-bool hub6_match_port(const struct uart_port *port1, const struct uart_port *port2);
-#else
-static inline bool hub6_match_port(const struct uart_port *port1, const struct uart_port *port2)
-{ return false; }
-#endif
-
#ifdef CONFIG_ARCH_OMAP1
#include <linux/soc/ti/omap1-soc.h>
static inline int is_omap1_8250(struct uart_8250_port *pt)
diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c
index e7ffeac562d2..b9ce22948389 100644
--- a/drivers/tty/serial/8250/8250_core.c
+++ b/drivers/tty/serial/8250/8250_core.c
@@ -680,8 +680,6 @@ static bool serial8250_match_port(const struct uart_port *port1,
return false;
else if (port1->iotype == UPIO_PORT)
return port1->iobase == port2->iobase;
- else if (port1->iotype == UPIO_HUB6)
- return hub6_match_port(port1, port2);
else if (uart_iotype_mmio(port1->iotype))
return port1->mapbase == port2->mapbase;
else
diff --git a/drivers/tty/serial/8250/8250_hub6.c b/drivers/tty/serial/8250/8250_hub6.c
deleted file mode 100644
index 848d9723ac56..000000000000
--- a/drivers/tty/serial/8250/8250_hub6.c
+++ /dev/null
@@ -1,60 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2005 Russell King.
- * Data taken from include/asm-i386/serial.h
- */
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/serial_8250.h>
-
-#include "8250.h"
-
-#define HUB6(card, port) \
- { \
- .iobase = 0x302, \
- .irq = 3, \
- .uartclk = 1843200, \
- .iotype = UPIO_HUB6, \
- .flags = UPF_BOOT_AUTOCONF, \
- .hub6 = (card) << 6 | (port) << 3 | 1, \
- }
-
-static struct plat_serial8250_port hub6_data[] = {
- HUB6(0, 0),
- HUB6(0, 1),
- HUB6(0, 2),
- HUB6(0, 3),
- HUB6(0, 4),
- HUB6(0, 5),
- HUB6(1, 0),
- HUB6(1, 1),
- HUB6(1, 2),
- HUB6(1, 3),
- HUB6(1, 4),
- HUB6(1, 5),
- { },
-};
-
-static struct platform_device hub6_device = {
- .name = "serial8250",
- .id = PLAT8250_DEV_HUB6,
- .dev = {
- .platform_data = hub6_data,
- },
-};
-
-bool hub6_match_port(const struct uart_port *port1, const struct uart_port *port2)
-{
- return port1->iobase == port2->iobase && port1->hub6 == port2->hub6;
-}
-EXPORT_SYMBOL_GPL(hub6_match_port);
-
-int __init serial8250_hub6_init(void)
-{
- return platform_device_register(&hub6_device);
-}
-
-void serial8250_hub6_exit(void)
-{
- platform_device_unregister(&hub6_device);
-}
diff --git a/drivers/tty/serial/8250/8250_platform.c b/drivers/tty/serial/8250/8250_platform.c
index 3a9101cb1060..1a41a4ac25f8 100644
--- a/drivers/tty/serial/8250/8250_platform.c
+++ b/drivers/tty/serial/8250/8250_platform.c
@@ -82,7 +82,6 @@ static void __init __serial8250_isa_init_ports(void)
port->irqflags = 0;
port->uartclk = old_serial_port[i].baud_base * 16;
port->flags = old_serial_port[i].flags;
- port->hub6 = 0;
port->membase = old_serial_port[i].iomem_base;
port->iotype = old_serial_port[i].io_type;
port->regshift = old_serial_port[i].iomem_reg_shift;
@@ -165,7 +164,6 @@ static int serial8250_probe_platform(struct platform_device *dev, struct plat_se
uart->port.flags = p->flags;
uart->port.mapbase = p->mapbase;
uart->port.mapsize = p->mapsize;
- uart->port.hub6 = p->hub6;
uart->port.has_sysrq = p->has_sysrq;
uart->port.private_data = p->private_data;
uart->port.type = p->type;
@@ -313,14 +311,10 @@ static int __init serial8250_init(void)
if (ret)
goto unreg_uart_drv;
- ret = serial8250_hub6_init();
- if (ret)
- goto unreg_pnp;
-
serial8250_isa_devs = platform_device_alloc("serial8250", PLAT8250_DEV_LEGACY);
if (!serial8250_isa_devs) {
ret = -ENOMEM;
- goto unreg_hub6;
+ goto unreg_pnp;
}
ret = platform_device_add(serial8250_isa_devs);
@@ -336,8 +330,6 @@ static int __init serial8250_init(void)
platform_device_del(serial8250_isa_devs);
put_dev:
platform_device_put(serial8250_isa_devs);
-unreg_hub6:
- serial8250_hub6_exit();
unreg_pnp:
serial8250_pnp_exit();
unreg_uart_drv:
@@ -365,7 +357,6 @@ static void __exit serial8250_exit(void)
platform_driver_unregister(&serial8250_isa_driver);
platform_device_unregister(isa_dev);
- serial8250_hub6_exit();
serial8250_pnp_exit();
#ifdef CONFIG_SPARC
diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
index 8aaf1f852a9a..462441237a90 100644
--- a/drivers/tty/serial/8250/8250_port.c
+++ b/drivers/tty/serial/8250/8250_port.c
@@ -354,22 +354,6 @@ static void default_serial_dl_write(struct uart_8250_port *up, u32 value)
serial_out(up, UART_DLM, value >> 8 & 0xff);
}
-#ifdef CONFIG_HAS_IOPORT
-static u32 hub6_serial_in(struct uart_port *p, unsigned int offset)
-{
- offset = offset << p->regshift;
- outb(p->hub6 - 1 + offset, p->iobase);
- return inb(p->iobase + 1);
-}
-
-static void hub6_serial_out(struct uart_port *p, unsigned int offset, u32 value)
-{
- offset = offset << p->regshift;
- outb(p->hub6 - 1 + offset, p->iobase);
- outb(value, p->iobase + 1);
-}
-#endif /* CONFIG_HAS_IOPORT */
-
static u32 mem_serial_in(struct uart_port *p, unsigned int offset)
{
offset = offset << p->regshift;
@@ -450,13 +434,6 @@ static void set_io_from_upio(struct uart_port *p)
up->dl_write = default_serial_dl_write;
switch (p->iotype) {
-#ifdef CONFIG_HAS_IOPORT
- case UPIO_HUB6:
- p->serial_in = hub6_serial_in;
- p->serial_out = hub6_serial_out;
- break;
-#endif
-
case UPIO_MEM:
p->serial_in = mem_serial_in;
p->serial_out = mem_serial_out;
diff --git a/drivers/tty/serial/8250/Kconfig b/drivers/tty/serial/8250/Kconfig
index 7a5a9cbc7d02..908fc86852b6 100644
--- a/drivers/tty/serial/8250/Kconfig
+++ b/drivers/tty/serial/8250/Kconfig
@@ -208,9 +208,9 @@ config SERIAL_8250_EXTENDED
depends on SERIAL_8250
help
If you wish to use any non-standard features of the standard "dumb"
- driver, say Y here. This includes HUB6 support, shared serial
- interrupts, special multiport support, support for more than the
- four COM 1/2/3/4 boards, etc.
+ driver, say Y here. This includes shared serial interrupts, special
+ multiport support, support for more than the four COM 1/2/3/4 boards,
+ etc.
Note that the answer to this question won't directly affect the
kernel: saying N will just cause the configurator to skip all
@@ -292,15 +292,6 @@ config SERIAL_8250_EXAR_ST16C554
To compile this driver as a module, choose M here: the module
will be called 8250_exar_st16c554.
-config SERIAL_8250_HUB6
- bool "Support Hub6 cards"
- depends on SERIAL_8250_MANY_PORTS && ISA
- help
- Say Y here if you have a HUB6 serial board.
-
- To compile this driver as a module, choose M here: the module
- will be called 8250_hub6.
-
config SERIAL_8250_PCI1XXXX
tristate "Microchip 8250 based serial port"
depends on SERIAL_8250 && PCI
diff --git a/drivers/tty/serial/8250/Makefile b/drivers/tty/serial/8250/Makefile
index 3c8ae7e4231b..a6ee25eee9fe 100644
--- a/drivers/tty/serial/8250/Makefile
+++ b/drivers/tty/serial/8250/Makefile
@@ -7,7 +7,6 @@ obj-$(CONFIG_SERIAL_8250) += 8250.o
8250-y := 8250_core.o
8250-y += 8250_platform.o
8250-$(CONFIG_SERIAL_8250_PNP) += 8250_pnp.o
-8250-$(CONFIG_SERIAL_8250_HUB6) += 8250_hub6.o
obj-$(CONFIG_SERIAL_8250) += 8250_base.o
8250_base-y := 8250_port.o
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
index c3880259e3bc..9c40ccee0c82 100644
--- a/drivers/tty/serial/atmel_serial.c
+++ b/drivers/tty/serial/atmel_serial.c
@@ -2448,8 +2448,6 @@ static int atmel_verify_port(struct uart_port *port, struct serial_struct *ser)
ret = -EINVAL;
if (port->iobase != ser->port)
ret = -EINVAL;
- if (ser->hub6 != 0)
- ret = -EINVAL;
return ret;
}
diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
index c8575c965203..6e1248840022 100644
--- a/drivers/tty/serial/fsl_lpuart.c
+++ b/drivers/tty/serial/fsl_lpuart.c
@@ -2432,8 +2432,6 @@ static int lpuart_verify_port(struct uart_port *port, struct serial_struct *ser)
ret = -EINVAL;
if (port->iobase != ser->port)
ret = -EINVAL;
- if (ser->hub6 != 0)
- ret = -EINVAL;
return ret;
}
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 986fefb45c63..d89be62e3852 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -1936,8 +1936,6 @@ imx_uart_verify_port(struct uart_port *port, struct serial_struct *ser)
ret = -EINVAL;
if (port->iobase != ser->port)
ret = -EINVAL;
- if (ser->hub6 != 0)
- ret = -EINVAL;
return ret;
}
diff --git a/drivers/tty/serial/mpc52xx_uart.c b/drivers/tty/serial/mpc52xx_uart.c
index 472ec39caf27..240009333fb5 100644
--- a/drivers/tty/serial/mpc52xx_uart.c
+++ b/drivers/tty/serial/mpc52xx_uart.c
@@ -1339,8 +1339,7 @@ mpc52xx_uart_verify_port(struct uart_port *port, struct serial_struct *ser)
if ((ser->irq != port->irq) ||
(ser->io_type != UPIO_MEM) ||
(ser->baud_base != port->uartclk) ||
- (ser->iomem_base != (void *)port->mapbase) ||
- (ser->hub6 != 0))
+ (ser->iomem_base != (void *)port->mapbase))
return -EINVAL;
return 0;
diff --git a/drivers/tty/serial/sa1100.c b/drivers/tty/serial/sa1100.c
index 72b1bb76415c..ee5f3960d1e4 100644
--- a/drivers/tty/serial/sa1100.c
+++ b/drivers/tty/serial/sa1100.c
@@ -556,8 +556,6 @@ sa1100_verify_port(struct uart_port *port, struct serial_struct *ser)
ret = -EINVAL;
if (sport->port.iobase != ser->port)
ret = -EINVAL;
- if (ser->hub6 != 0)
- ret = -EINVAL;
return ret;
}
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index c0deec0e6af4..c7fffcd739ca 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -813,7 +813,7 @@ static int uart_get_info(struct tty_port *port, struct serial_struct *retinfo)
ASYNC_CLOSING_WAIT_NONE :
jiffies_to_msecs(port->closing_wait) / 10;
retinfo->custom_divisor = uport->custom_divisor;
- retinfo->hub6 = uport->hub6;
+ retinfo->hub6 = 0; /* No longer supported */
retinfo->io_type = uport->iotype;
retinfo->iomem_reg_shift = uport->regshift;
retinfo->iomem_base = (void *)(unsigned long)uport->mapbase;
@@ -834,14 +834,13 @@ static int uart_change_port(struct uart_port *uport,
const struct serial_struct *new_info,
unsigned long new_port)
{
+ unsigned int old_type, old_iotype, old_shift;
unsigned long old_iobase, old_mapbase;
- unsigned int old_type, old_iotype, old_hub6, old_shift;
int retval;
old_iobase = uport->iobase;
old_mapbase = uport->mapbase;
old_type = uport->type;
- old_hub6 = uport->hub6;
old_iotype = uport->iotype;
old_shift = uport->regshift;
@@ -850,7 +849,6 @@ static int uart_change_port(struct uart_port *uport,
uport->iobase = new_port;
uport->type = new_info->type;
- uport->hub6 = new_info->hub6;
uport->iotype = new_info->io_type;
uport->regshift = new_info->iomem_reg_shift;
uport->mapbase = (unsigned long)new_info->iomem_base;
@@ -868,7 +866,6 @@ static int uart_change_port(struct uart_port *uport,
*/
uport->iobase = old_iobase;
uport->type = old_type;
- uport->hub6 = old_hub6;
uport->iotype = old_iotype;
uport->regshift = old_shift;
uport->mapbase = old_mapbase;
@@ -925,7 +922,6 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
change_port = !(uport->flags & UPF_FIXED_PORT)
&& (new_port != uport->iobase ||
(unsigned long)new_info->iomem_base != uport->mapbase ||
- new_info->hub6 != uport->hub6 ||
new_info->io_type != uport->iotype ||
new_info->iomem_reg_shift != uport->regshift ||
new_info->type != uport->type);
@@ -940,6 +936,11 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
if (uartclk == 0)
return -EINVAL;
}
+
+ /* hub6 is no longer supported */
+ if (new_info->hub6 != 0)
+ return -EINVAL;
+
if (!capable(CAP_SYS_ADMIN)) {
if (change_irq || change_port ||
(new_info->baud_base != uport->uartclk / 16) ||
@@ -2011,7 +2012,6 @@ bool uart_iotype_io(enum uart_iotype iotype)
{
switch (iotype) {
case UPIO_PORT:
- case UPIO_HUB6:
return true;
default:
return false;
@@ -2536,14 +2536,10 @@ void uart_get_ioinfos(struct uart_port *port, char *buf, size_t size)
{
buf[0] = '\0';
- if (uart_iotype_mmio(port->iotype)) {
+ if (uart_iotype_mmio(port->iotype))
scnprintf(buf, size, " MMIO%s:%pa", uart_get_mmio_width(port), &port->mapbase);
- } else if (uart_iotype_io(port->iotype)) {
- if (port->iotype == UPIO_PORT)
- scnprintf(buf, size, " I/O:0x%lx", port->iobase);
- else if (port->iotype == UPIO_HUB6)
- scnprintf(buf, size, " I/O:0x%lx, offset 0x%x", port->iobase, port->hub6);
- }
+ else if (uart_iotype_io(port->iotype))
+ scnprintf(buf, size, " I/O:0x%lx", port->iobase);
}
EXPORT_SYMBOL(uart_get_ioinfos);
diff --git a/drivers/tty/serial/sunsu.c b/drivers/tty/serial/sunsu.c
index 52437a133cdd..33e2b11f9d69 100644
--- a/drivers/tty/serial/sunsu.c
+++ b/drivers/tty/serial/sunsu.c
@@ -106,10 +106,6 @@ static unsigned int serial_in(struct uart_sunsu_port *up, int offset)
offset <<= up->port.regshift;
switch (up->port.iotype) {
- case UPIO_HUB6:
- outb(up->port.hub6 - 1 + offset, up->port.iobase);
- return inb(up->port.iobase + 1);
-
case UPIO_MEM:
return readb(up->port.membase + offset);
@@ -136,11 +132,6 @@ static void serial_out(struct uart_sunsu_port *up, int offset, int value)
offset <<= up->port.regshift;
switch (up->port.iotype) {
- case UPIO_HUB6:
- outb(up->port.hub6 - 1 + offset, up->port.iobase);
- outb(value, up->port.iobase + 1);
- break;
-
case UPIO_MEM:
writeb(value, up->port.membase + offset);
break;
diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index a072b75dbaf2..4066cc99fe1a 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -1079,8 +1079,6 @@ static int cdns_uart_verify_port(struct uart_port *port,
return -EINVAL;
if (port->iobase != ser->port)
return -EINVAL;
- if (ser->hub6 != 0)
- return -EINVAL;
return 0;
}
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h
index d91c0477be9d..d55bce4d4709 100644
--- a/include/linux/serial_8250.h
+++ b/include/linux/serial_8250.h
@@ -41,7 +41,6 @@ struct plat_serial8250_port {
void *private_data;
unsigned char regshift; /* register shift */
unsigned char iotype; /* UPIO_* */
- unsigned char hub6;
unsigned char has_sysrq; /* supports magic SysRq */
unsigned int type; /* If UPF_FIXED_TYPE */
upf_t flags; /* UPF_* flags */
@@ -75,7 +74,6 @@ enum {
PLAT8250_DEV_ACCENT,
PLAT8250_DEV_BOCA,
PLAT8250_DEV_EXAR_ST16C554,
- PLAT8250_DEV_HUB6,
PLAT8250_DEV_AU1X00,
PLAT8250_DEV_SM501,
};
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index 4eeb8253752a..ca8d009e5c36 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -430,7 +430,6 @@ typedef unsigned int __bitwise upstat_t;
enum uart_iotype {
UPIO_UNKNOWN = -1,
UPIO_PORT = SERIAL_IO_PORT, /* 8b I/O port access */
- UPIO_HUB6 = SERIAL_IO_HUB6, /* Hub6 ISA card */
UPIO_MEM = SERIAL_IO_MEM, /* driver-specific */
UPIO_MEM32 = SERIAL_IO_MEM32, /* 32b little endian */
UPIO_AU = SERIAL_IO_AU, /* Au1x00 and RT288x type IO */
@@ -590,7 +589,6 @@ struct uart_port {
unsigned char has_sysrq;
unsigned char sysrq_seq; /* index in sysrq_toggle_seq */
- unsigned char hub6; /* this should be in the 8250 driver */
unsigned char suspended;
unsigned char console_reinit;
const char *name; /* port name */
--
2.53.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 1/2] [v4] serial: 8250: remove obsolete PORT_RSA support
2026-10-21 8:17 [PATCH 1/2] [v4] serial: 8250: remove obsolete PORT_RSA support Arnd Bergmann
2026-10-21 8:17 ` [PATCH 2/2] [v4] serial: 8250: remove hub6 multiport support Arnd Bergmann
@ 2026-10-21 9:27 ` Andy Shevchenko
1 sibling, 0 replies; 3+ messages in thread
From: Andy Shevchenko @ 2026-10-21 9:27 UTC (permalink / raw)
To: Arnd Bergmann
Cc: linux-serial, Greg Kroah-Hartman, Jiri Slaby, Hugo Villeneuve,
Uwe Kleine-König, linux-kernel, Maciej W . Rozycki,
Kiyokazu SUTO, Arnd Bergmann
On Wed, Oct 21, 2026 at 10:17:45AM +0200, Arnd Bergmann wrote:
> For all I can tell, the RSA support in the 8250 driver is not functional
> and has not been for a long time.
>
> The RSA-DV II/S ISA card[1] was sold by IODATA in the 1990s as a faster
> alternative to regular ISA serial ports, and it was discontinued in
> 2002. Linux support was added by Kiyokazu SUTO in 2000[2]. The company
> also made PCI versions of this device, but Linux never supported those.
>
> It seems that a patch to setserial would be required in order to set
> PORT_RSA when not using autoconfiguration, and this was never merged.
> Autotoconfiguration in turn requires passing probe_rsa=IOPORT arguments
> at boot or module load time, which is not how any other uart drivers
> work any more since linux-2.4.
>
> This patch removes all code related to the RSA support, with the exception
> of the user-visible PORT_RSA definition. I had originall sent this in
> 2011 [3], but did not follow up at the time.
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-21 9:27 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-21 8:17 [PATCH 1/2] [v4] serial: 8250: remove obsolete PORT_RSA support Arnd Bergmann
2026-10-21 8:17 ` [PATCH 2/2] [v4] serial: 8250: remove hub6 multiport support Arnd Bergmann
2026-10-21 9:27 ` [PATCH 1/2] [v4] serial: 8250: remove obsolete PORT_RSA support Andy Shevchenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®