xen/uart: be more careful with changes to the PCI command register

Read the existing PCI command register and only add the required bits to
it, as to avoid clearing bits that might be possibly set by the firmware
already, which might put the device into a non-working state.

Xen being the owner of the PCI device it's legitimately allowed to change
command registers bits.  Be careful however in case buggy devices require
certain command register bits to be enabled, while not strictly required
from Xen's usage.

Fixes: f2ff5d6628 ("ns16550: enable PCI serial card usage")
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
master commit: ebf5439725
master date: 2026-03-30 16:43:14 +0200
This commit is contained in:
Roger Pau Monné authored and Jan Beulich committed 2026-04-20 12:34:52 +02:00
1 parent c2cb923ed7
commit 0359ff3565
1 file changed
+7 -2
+7 -2
View File
@@ -273,14 +273,19 @@ static int cf_check ns16550_getc(struct serial_port *port, char *pc)
static void pci_serial_early_init(struct ns16550 *uart)
{
#ifdef NS16550_PCI
uint16_t cmd;
if ( !uart->ps_bdf_enable )
return;
cmd = pci_conf_read16(PCI_SBDF(0, uart->ps_bdf[0], uart->ps_bdf[1],
uart->ps_bdf[2]), PCI_COMMAND);
if ( uart->io_base >= 0x10000 )
{
pci_conf_write16(PCI_SBDF(0, uart->ps_bdf[0], uart->ps_bdf[1],
uart->ps_bdf[2]),
PCI_COMMAND, PCI_COMMAND_MEMORY);
PCI_COMMAND, cmd | PCI_COMMAND_MEMORY);
return;
}
@@ -297,7 +302,7 @@ static void pci_serial_early_init(struct ns16550 *uart)
uart->io_base | PCI_BASE_ADDRESS_SPACE_IO);
pci_conf_write16(PCI_SBDF(0, uart->ps_bdf[0], uart->ps_bdf[1],
uart->ps_bdf[2]),
PCI_COMMAND, PCI_COMMAND_IO);
PCI_COMMAND, cmd | PCI_COMMAND_IO);
#endif
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.