[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] ns16550: PCI initialization adjustments


  • To: xen-changelog@xxxxxxxxxxxxxxxxxxx
  • From: Xen patchbot-unstable <patchbot@xxxxxxx>
  • Date: Fri, 14 Sep 2012 10:55:24 +0000
  • Delivery-date: Fri, 14 Sep 2012 10:55:30 +0000
  • List-id: "Change log for Mercurial \(receive only\)" <xen-changelog.lists.xen.org>

# HG changeset patch
# User Jan Beulich <jbeulich@xxxxxxxx>
# Date 1347371733 -7200
# Node ID ee12dc357fbecbb0517798f395d14bf1764c6766
# Parent  5fb5b3b70e34ef278d06aff27878b4b8e6d9145f
ns16550: PCI initialization adjustments

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@xxxxxxxx>
Acked-by: Keir Fraser <keir@xxxxxxx>
---


diff -r 5fb5b3b70e34 -r ee12dc357fbe xen/drivers/char/ns16550.c
--- a/xen/drivers/char/ns16550.c        Tue Sep 11 15:52:36 2012 +0200
+++ b/xen/drivers/char/ns16550.c        Tue Sep 11 15:55:33 2012 +0200
@@ -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,8 @@ 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;
 
                 return 0;
             }

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.