[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 2/7] serial: Fix COM1 assumption if pci_uart_config did not find the PCI serial card.
The io_base by default is set to be 0x3f8 for COM1 and 0x2f8 for COM2 in __setup_xen. Then we call 'ns16550_init' which copies those in the appropiate uart, which then calls 'ns16550_parse_port_config' to deal with parameter parsing. If the 'pci' or 'amt' parameter has been specified we further call 'pci_uart_config code' which scans the PCI bus. If it does not find any relevant devices it will overwrite io_base with 0x3f8 regardless whether this is COM1 or COM2. The overwrite is a way to set it back to the failsafe defaults - except for COM2 of course. This in theory (as I don't have a machine with two COM ports readily available) means that if the user specified 'com2=9600,8n1,pci' and the device did not have an PCI serial card, instead of using 0x2f8 for the io_base it ends up using 0x3f8 - and we don't get the output on COM2. Fix it by saving the original io_base before starting the scan of the PCI bus. If we don't find an serial PCI device then assign the original io_base value back. Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> --- xen/drivers/char/ns16550.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/xen/drivers/char/ns16550.c b/xen/drivers/char/ns16550.c index 2fded08..c2a25da 100644 --- a/xen/drivers/char/ns16550.c +++ b/xen/drivers/char/ns16550.c @@ -612,10 +612,11 @@ static int __init pci_uart_config (struct ns16550 *uart, int skip_amt, int bar_idx) { uint32_t bar, bar_64 = 0, len, len_64; - u64 size, mask; + u64 size, mask, orig_base; unsigned int b, d, f, nextf, i; u16 vendor, device; + orig_base = uart->io_base; uart->io_base = 0; /* NB. Start at bus 1 to avoid AMT: a plug-in card cannot be on bus 0. */ for ( b = skip_amt ? 1 : 0; b < 0x100; b++ ) @@ -747,7 +748,8 @@ pci_uart_config (struct ns16550 *uart, int skip_amt, int bar_idx) if ( !skip_amt ) return -1; - uart->io_base = 0x3f8; + if ( !uart->io_base ) + uart->io_base = orig_base; uart->irq = 0; uart->clock_hz = UART_CLOCK_HZ; -- 1.7.7.6 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |