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

Re: [Xen-devel] [PATCH] ns16550: Add support for UART present in Broadcom TruManage capable NetXtreme chips



On 11/14/2013 10:42 AM, Andrew Cooper wrote:
On 14/11/13 16:29, Aravind Gopalakrishnan wrote:
+/* Defining uart config options for MMIO devices */
+struct ns16550_config_mmio {
+    u16 vendor_id;
+    u16 dev_id;
+    int reg_shift;
Shifts of signed quantities are a recipe for undefined behaviour.  I
dont see any reason for any of these values to be signed quantities.

You are right.. I will change this..
+    int reg_width;
+    int fifo_size;
+    u32 lsr_mask;
+    int max_bars;
+};
+
+/*
+ * Create lookup tables for specific MMIO devices..
+ * It is assumed that if the device found is MMIO,
+ * then you have indexed it here. Else, the driver
+ * does nothing.
+ */
+static struct ns16550_config_mmio uart_config[] =
+{
+    /* Broadcom TruManage device */
+    {
+        .vendor_id = 0x14e4,
+        .dev_id = 0x160a,
+        .reg_shift = 2,
+        .reg_width = 1,
+        .fifo_size = 64,
+        .lsr_mask = (UART_LSR_THRE | UART_LSR_TEMT),
+        .max_bars = 1,
+    },
+};
+
  static void ns16550_delayed_resume(void *data);
static char ns_read_reg(struct ns16550 *uart, int reg)
@@ -134,7 +166,7 @@ static void ns16550_interrupt(
      while ( !(ns_read_reg(uart, UART_IIR) & UART_IIR_NOINT) )
      {
          char lsr = ns_read_reg(uart, UART_LSR);
-        if ( lsr & UART_LSR_THRE )
+        if ( (lsr & uart->lsr_mask) == uart->lsr_mask )
              serial_tx_interrupt(port, regs);
          if ( lsr & UART_LSR_DR )
              serial_rx_interrupt(port, regs);
@@ -160,7 +192,7 @@ static void __ns16550_poll(struct cpu_user_regs *regs)
          serial_rx_interrupt(port, regs);
      }
- if ( ns_read_reg(uart, UART_LSR) & UART_LSR_THRE )
+    if ( ( ns_read_reg(uart, UART_LSR) & uart->lsr_mask ) == uart->lsr_mask )
          serial_tx_interrupt(port, regs);
out:
@@ -183,7 +215,9 @@ static int ns16550_tx_ready(struct serial_port *port)
if ( ns16550_ioport_invalid(uart) )
          return -EIO;
-    return ns_read_reg(uart, UART_LSR) & UART_LSR_THRE ? uart->fifo_size : 0;
+       
+    return ( (ns_read_reg(uart, UART_LSR) &
+              uart->lsr_mask ) == uart->lsr_mask ) ? uart->fifo_size : 0;
  }
static void ns16550_putc(struct serial_port *port, char c)
@@ -550,7 +584,8 @@ static int
  pci_uart_config (struct ns16550 *uart, int skip_amt, int bar_idx)
  {
      uint32_t bar, len;
-    int b, d, f, nextf;
+    int b, d, f, nextf, i;
+    u16 vendor, device;
/* 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++ )
@@ -579,27 +614,63 @@ pci_uart_config (struct ns16550 *uart, int skip_amt, int 
bar_idx)
                  bar = pci_conf_read32(0, b, d, f,
                                        PCI_BASE_ADDRESS_0 + bar_idx*4);
+ if ( !bar )
+                    continue;
+
What is this check supposed to be doing?  This could be a valid
non-prefechable 32bit memory bar.
Okay, will correct this.
uart->ps_bdf[0] = b;
                  uart->ps_bdf[1] = d;
                  uart->ps_bdf[2] = f;
                  uart->bar = bar;
                  uart->bar_idx = bar_idx;
-                uart->io_base = bar & ~PCI_BASE_ADDRESS_SPACE_IO;
                  uart->irq = pci_conf_read8(0, b, d, f, PCI_INTERRUPT_PIN) ?
                      pci_conf_read8(0, b, d, f, PCI_INTERRUPT_LINE) : 0;
+
Spurious whitespace change.  Please remove.

~Andrew
Noted.

Will send out changes in a V2.

Thanks,
-Aravind.



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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