Besides single-port serial cards, also accept multi-port ones and such
providing mixed functionality (e.g. also having a parallel port).
Reading PCI_INTERRUPT_PIN before ACPI gets enabled generally produces
an incorrect IRQ (below 16, whereas after enabling ACPI it frequently
would end up at a higher one), so this is useful (almost) only when a
system already boots in ACPI mode.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/drivers/char/ns16550.c
+++ b/xen/drivers/char/ns16550.c
@@ -468,7 +468,6 @@ static int __init check_existence(struct
static int
pci_uart_config (struct ns16550 *uart, int skip_amt, int bar_idx)
{
- uint16_t class;
uint32_t bar, len;
int b, d, f;
@@ -479,9 +478,15 @@ pci_uart_config (struct ns16550 *uart, i
{
for ( f = 0; f < 0x8; f++ )
{
- class = pci_conf_read16(0, b, d, f, PCI_CLASS_DEVICE);
- if ( class != 0x700 )
+ switch ( pci_conf_read16(0, b, d, f, PCI_CLASS_DEVICE) )
+ {
+ case 0x0700: /* single port serial */
+ case 0x0702: /* multi port serial */
+ case 0x0780: /* other (e.g serial+parallel) */
+ break;
+ default:
continue;
+ }
bar = pci_conf_read32(0, b, d, f,
PCI_BASE_ADDRESS_0 + bar_idx*4);
@@ -504,7 +509,9 @@ pci_uart_config (struct ns16550 *uart, i
uart->bar = bar;
uart->bar_idx = bar_idx;
uart->io_base = bar & ~PCI_BASE_ADDRESS_SPACE_IO;
- uart->irq = 0;
+ uart->irq = pci_conf_read8(0, b, d, f, PCI_INTERRUPT_PIN) ?
+ pci_conf_read8(0, b, d, f, PCI_INTERRUPT_LINE) : 0;
+printk("COM%d: BAR=%04x IRQ=%d\n", bar_idx + 1, bar,
uart->irq);//temp
return 0;
}
Konrad Rzeszutek Wilk
2012-Sep-11 18:14 UTC
Re: [PATCH 6/8] ns16550: PCI initialization adjustments
On Tue, Sep 11, 2012 at 11:19:32AM +0100, Jan Beulich wrote:> Besides single-port serial cards, also accept multi-port ones and such > providing mixed functionality (e.g. also having a parallel port). > > Reading PCI_INTERRUPT_PIN before ACPI gets enabled generally produces > an incorrect IRQ (below 16, whereas after enabling ACPI it frequently > would end up at a higher one), so this is useful (almost) only when a > system already boots in ACPI mode. > > Signed-off-by: Jan Beulich <jbeulich@suse.com> > > --- a/xen/drivers/char/ns16550.c > +++ b/xen/drivers/char/ns16550.c > @@ -468,7 +468,6 @@ static int __init check_existence(struct > static int > pci_uart_config (struct ns16550 *uart, int skip_amt, int bar_idx) > { > - uint16_t class; > uint32_t bar, len; > int b, d, f; > > @@ -479,9 +478,15 @@ pci_uart_config (struct ns16550 *uart, i > { > for ( f = 0; f < 0x8; f++ ) > { > - class = pci_conf_read16(0, b, d, f, PCI_CLASS_DEVICE); > - if ( class != 0x700 ) > + switch ( pci_conf_read16(0, b, d, f, PCI_CLASS_DEVICE) ) > + { > + case 0x0700: /* single port serial */ > + case 0x0702: /* multi port serial */ > + case 0x0780: /* other (e.g serial+parallel) */ > + break; > + default: > continue; > + } > > bar = pci_conf_read32(0, b, d, f, > PCI_BASE_ADDRESS_0 + bar_idx*4); > @@ -504,7 +509,9 @@ pci_uart_config (struct ns16550 *uart, i > uart->bar = bar; > uart->bar_idx = bar_idx; > uart->io_base = bar & ~PCI_BASE_ADDRESS_SPACE_IO; > - uart->irq = 0; > + uart->irq = pci_conf_read8(0, b, d, f, PCI_INTERRUPT_PIN) ? > + pci_conf_read8(0, b, d, f, PCI_INTERRUPT_LINE) : 0; > +printk("COM%d: BAR=%04x IRQ=%d\n", bar_idx + 1, bar, uart->irq);//tempprintk ?> > return 0; > } > > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel >
>>> On 11.09.12 at 20:14, Konrad Rzeszutek Wilk <konrad@kernel.org> wrote: > On Tue, Sep 11, 2012 at 11:19:32AM +0100, Jan Beulich wrote: >> Besides single-port serial cards, also accept multi-port ones and such >> providing mixed functionality (e.g. also having a parallel port). >> >> Reading PCI_INTERRUPT_PIN before ACPI gets enabled generally produces >> an incorrect IRQ (below 16, whereas after enabling ACPI it frequently >> would end up at a higher one), so this is useful (almost) only when a >> system already boots in ACPI mode. >> >> Signed-off-by: Jan Beulich <jbeulich@suse.com> >> >> --- a/xen/drivers/char/ns16550.c >> +++ b/xen/drivers/char/ns16550.c >> @@ -468,7 +468,6 @@ static int __init check_existence(struct >> static int >> pci_uart_config (struct ns16550 *uart, int skip_amt, int bar_idx) >> { >> - uint16_t class; >> uint32_t bar, len; >> int b, d, f; >> >> @@ -479,9 +478,15 @@ pci_uart_config (struct ns16550 *uart, i >> { >> for ( f = 0; f < 0x8; f++ ) >> { >> - class = pci_conf_read16(0, b, d, f, PCI_CLASS_DEVICE); >> - if ( class != 0x700 ) >> + switch ( pci_conf_read16(0, b, d, f, PCI_CLASS_DEVICE) ) >> + { >> + case 0x0700: /* single port serial */ >> + case 0x0702: /* multi port serial */ >> + case 0x0780: /* other (e.g serial+parallel) */ >> + break; >> + default: >> continue; >> + } >> >> bar = pci_conf_read32(0, b, d, f, >> PCI_BASE_ADDRESS_0 + bar_idx*4); >> @@ -504,7 +509,9 @@ pci_uart_config (struct ns16550 *uart, i >> uart->bar = bar; >> uart->bar_idx = bar_idx; >> uart->io_base = bar & ~PCI_BASE_ADDRESS_SPACE_IO; >> - uart->irq = 0; >> + uart->irq = pci_conf_read8(0, b, d, f, PCI_INTERRUPT_PIN) ? >> + pci_conf_read8(0, b, d, f, PCI_INTERRUPT_LINE) : 0; >> +printk("COM%d: BAR=%04x IRQ=%d\n", bar_idx + 1, bar, uart->irq);//temp > > printk ?I had spotted this before committing, and removed it in time. Thanks for noticing anyway, Jan
Maybe Matching Threads
- [PATCH RFC 5/8] ns16550: MMIO adjustments
- [PATCH RFC 0/8] xen/arm: initial cubieboard2 support.
- [PATCH v3 0/7] support for cubieboard2 / sunxi processors
- [PATCH] xen: extract register definitions from ns16550 into a separated header
- [PATCH] ns16550: Use correct #define symbol for HAS_IOPORTS