|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V2] ns16550: Add support for UART present in Broadcom TruManage capable NetXtreme chips
>>> On 14.11.13 at 18:40, Aravind Gopalakrishnan
>>> <Aravind.Gopalakrishnan@xxxxxxx> wrote:
> static struct ns16550 {
> - int baud, clock_hz, data_bits, parity, stop_bits, fifo_size, irq;
> + int baud, clock_hz, data_bits, parity, stop_bits, irq;
> u64 io_base; /* I/O port or memory-mapped I/O address. */
> + u32 fifo_size;
Is this in any way related to the main purpose of the patch here?
And if there is (i.e. in response to Andrew's comment on v1), then
I don't see why most/all of the other fields shouldn't follow suit.
> u32 io_size;
> - int reg_shift; /* Bits to shift register offset by */
> - int reg_width; /* Size of access to use, the registers
> + u32 reg_shift; /* Bits to shift register offset by */
> + u32 reg_width; /* Size of access to use, the registers
As much as for fifo_size above, there's nothing here requiring
them to be fixed-size 32 bits. Please use unsigned int instead.
> * themselves are still bytes */
> char __iomem *remapped_io_base; /* Remapped virtual address of MMIO. */
> /* UART with IRQ line: interrupt-driven I/O. */
> struct irqaction irqaction;
> + u32 lsr_mask;
And this one, if I'm not mistaken, would be u8 if meant to be fixed
size. Or else once again unsigned int.
> +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,
> + },
> +};
Looks like this is used by pci_uart_config() only. Hence it could
be __initdata (and pci_uart_config() would then for consistency
also need to be marked __init - I don't know why it isn't already).
> /* Not IO */
> if ( !(bar & PCI_BASE_ADDRESS_SPACE_IO) )
> - continue;
> + {
> + vendor = pci_conf_read16(0, b, d, f, PCI_VENDOR_ID);
> + device = pci_conf_read16(0, b, d, f, PCI_DEVICE_ID);
> +
> + /* Check for quirks in uart_config lookup table */
> + for ( i = 0; i < ARRAY_SIZE(uart_config); i++)
> + {
> + if ( uart_config[i].vendor_id != vendor )
> + continue;
> +
> + if ( uart_config[i].dev_id != device )
> + continue;
> +
> + if ( bar_idx >= uart_config[i].max_bars )
> + break;
Did you not mean "continue" here?
> +
> + uart->reg_shift = uart_config[i].reg_shift;
> + uart->reg_width = uart_config[i].reg_width;
> + uart->fifo_size = uart_config[i].fifo_size;
> + uart->lsr_mask = uart_config[i].lsr_mask;
> + uart->io_base = bar & PCI_BASE_ADDRESS_MEM_MASK;
> + break;
> + }
> +
> + /* If we have an io_base, then we succeeded in the
> lookup */
> + if ( !uart->io_base )
> + continue;
> + }
> + /* IO based */
> + else
> + {
> + pci_conf_write32(0, b, d, f, PCI_BASE_ADDRESS_0, ~0u);
> + len = pci_conf_read32(0, b, d, f, PCI_BASE_ADDRESS_0);
> + pci_conf_write32(0, b, d, f,
> + PCI_BASE_ADDRESS_0 + bar_idx*4, bar);
>
> - pci_conf_write32(0, b, d, f, PCI_BASE_ADDRESS_0, ~0u);
> - len = pci_conf_read32(0, b, d, f, PCI_BASE_ADDRESS_0);
> - pci_conf_write32(0, b, d, f, PCI_BASE_ADDRESS_0 + bar_idx*4,
> bar);
> + /* Not 8 bytes */
> + if ( (len & 0xffff) != 0xfff9 )
> + continue;
I think this size checking actually should also be done in the MMIO
case.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |