mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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>
This commit is contained in:
1 parent
4bf3336062
commit
ebf5439725
1 file changed
+7
-2
@@ -283,14 +283,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;
|
||||
}
|
||||
|
||||
@@ -307,7 +312,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
|
||||
}
|
||||
|
||||
|
||||