[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3] ns16550: add support for polling mode when device tree is used
On Mon, 2023-07-24 at 16:43 +0200, Jan Beulich wrote: > On 24.07.2023 16:27, Oleksii Kurochko wrote: > > --- a/xen/drivers/char/console.c > > +++ b/xen/drivers/char/console.c > > @@ -993,6 +993,8 @@ void __init console_init_preirq(void) > > #endif > > else if ( !strncmp(p, "none", 4) ) > > continue; > > + else if ( !strncmp(p, "polling", 7 ) > > + continue; > > else if ( (sh = serial_parse_handle(p)) >= 0 ) > > { > > sercon_handle = sh; > > Looks like you mean the new option to go under "console=". Besides > this being guesswork because of you not updating the command line > doc, this also is wrong, as the property then applies to all > consoles. What you mean is a control for a specific instance of a > 16550 console, which can only possibly go under "com<N>=". I would > suggest to simply extend [<irq>|msi] there to [<irq>|msi|poll]. Thanks. It would be definitely better to go under "com<N>" > > > @@ -595,7 +601,9 @@ static void __init cf_check > > ns16550_endboot(struct serial_port *port) > > static int __init cf_check ns16550_irq(struct serial_port *port) > > { > > struct ns16550 *uart = port->uart; > > - return ((uart->irq > 0) ? uart->irq : -1); > > + > > + return ( uart->intr_works != polling ) ? > > + uart->irq : -1; > > } > > Please don't corrupt previously correct style. You can keep things > almost like they were (albeit there's no strict need for any of the > parentheses): > > return ((uart->intr_works != polling) ? uart->irq : -1); Thanks. > > > @@ -1330,9 +1341,12 @@ pci_uart_config(struct ns16550 *uart, bool_t > > skip_amt, unsigned int idx) > > * as special only for X86. > > */ > > if ( uart->irq == 0xff ) > > + { > > uart->irq = 0; > > + uart->intr_works = polling; > > + } > > #endif > > - if ( !uart->irq ) > > + if ( !uart->irq || (uart->intr_works == polling) ) > > printk(XENLOG_INFO > > "ns16550: %pp: no legacy IRQ, using > > poll mode\n", > > &PCI_SBDF(0, b, d, f)); > > Message and code (after your addition) continue to be out of sync. > As said before, any condition that leads to polling mode wants to > find itself expressed by uart->intr_works set to "polling". Well. It looks like it would be better to set 'uart->intr_works = polling' inside if ( !uart->irq ): if ( !uart->irq || (uart->intr_works == polling) ) { uart->intr_works = polling; printk(XENLOG_INFO "ns16550: %pp: using poll mode\n", &PCI_SBDF(0, b, d, f)); } Then "uart->intr_works = polling;" can be removed from "if ( uart->irq == 0xff )" as in that case 'uart->irq = 0' means polling mode for X86. > > > @@ -1552,6 +1566,7 @@ static bool __init parse_positional(struct > > ns16550 *uart, char **str) > > conf += 3; > > uart->msi = true; > > uart->irq = 0; > > + uart->intr_works = polling; > > How that? "msi" is specifically asking for interrupt driven mode, > just that the IRQ number isn't known yet. (Seeing this I notice that > parse_namevalue_pairs() offers no way of selecting MSI mode. But > that's not something you need to sort out.) I was confused by the code from ns16550_init_postirq(): if ( rc ) { uart->irq = 0; if ( msi_desc ) msi_free_irq(msi_desc); else destroy_irq(msi.irq); } where "uart->irq = 0;" means that polling mode should be used because of the following code in the same function: if ( uart->irq > 0 ) { uart->irqaction.handler = ns16550_interrupt; uart->irqaction.name = "ns16550"; uart->irqaction.dev_id = port; if ( (rc = setup_irq(uart->irq, 0, &uart->irqaction)) != 0 ) printk("ERROR: Failed to allocate ns16550 IRQ %d\n", uart- >irq); } ~ Oleksii
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |