[PATCH 3.8.y] staging: comedi: 8255_pci: fix for newer PCI-DIO48H
Kamal Mostafa
kamal at canonical.com
Mon Jan 27 20:39:35 UTC 2014
On Mon, 2014-01-20 at 15:48 +0000, Ian Abbott wrote:
> based on upstream commit 0283f7a100882684ad32b768f9f1ad81658a0b92
>
> At some point, Measurement Computing / ComputerBoards redesigned the
> PCI-DIO48H to use a PLX PCI interface chip instead of an AMCC chip.
> This meant they had to put their hardware registers in the PCI BAR 2
> region instead of PCI BAR 1. Unfortunately, they kept the same PCI
> device ID for the new design. This means the driver recognizes the
> newer cards, but doesn't work (and is likely to screw up the local
> configuration registers of the PLX chip) because it's using the wrong
> region.
>
> Since the PCI subvendor and subdevice IDs were both zero on the old
> design, but are the same as the vendor and device on the new design, we
> can tell the old design and new design apart easily enough. To avoid
> adding extra data to `pci_8255_boards[]`, treat the board as a special
> case in `pci_8255_auto_attach[]`. It's safer to use the fact that the
> PCI BAR 2 region will have non-zero length only on the newer design, so
> use that fact to distinguish them.
>
> Signed-off-by: Ian Abbott <abbotti at mev.co.uk>
> Cc: kernel-team at lists.ubuntu.com
Thanks very much for the backport Ian. It is queued up for
3.8.y-stable.
-Kamal
> ---
> drivers/staging/comedi/drivers/8255_pci.c | 20 +++++++++++++++++---
> 1 file changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/staging/comedi/drivers/8255_pci.c b/drivers/staging/comedi/drivers/8255_pci.c
> index e0a7952..92ee23e 100644
> --- a/drivers/staging/comedi/drivers/8255_pci.c
> +++ b/drivers/staging/comedi/drivers/8255_pci.c
> @@ -122,7 +122,7 @@ static const struct pci_8255_boardinfo pci_8255_boards[] = {
> .name = "cb_pci-dio48h",
> .vendor = PCI_VENDOR_ID_CB,
> .device = PCI_DEVICE_ID_CB_PCIDIO48H,
> - .dio_badr = 1,
> + .dio_badr = 1, /* only for older boards */
> .n_8255 = 2,
> }, {
> .name = "cb_pci-dio96h",
> @@ -224,6 +224,7 @@ static int pci_8255_auto_attach(struct comedi_device *dev,
> unsigned long len;
> int ret;
> int i;
> + int dio_badr;
>
> board = pci_8255_find_boardinfo(dev, pcidev);
> if (!board)
> @@ -239,8 +240,21 @@ static int pci_8255_auto_attach(struct comedi_device *dev,
> ret = comedi_pci_enable(pcidev, dev->board_name);
> if (ret)
> return ret;
> - iobase = pci_resource_start(pcidev, board->dio_badr);
> - len = pci_resource_len(pcidev, board->dio_badr);
> + dio_badr = board->dio_badr;
> + /*
> + * For Measurement Computing / ComputerBoards PCI-DIO48H, use the
> + * PCI BAR 2 region, if non-zero length, else use the PCI BAR 1 region
> + * from the board entry. This is because the board was redesigned to
> + * use a different PCI interface chip, with the user registers in a
> + * different PCI BAR region.
> + */
> + if (pcidev->vendor == PCI_VENDOR_ID_CB &&
> + pcidev->device == PCI_DEVICE_ID_CB_PCIDIO48H &&
> + pci_resource_len(pcidev, 2))
> + dio_badr = 2;
> +
> + iobase = pci_resource_start(pcidev, dio_badr);
> + len = pci_resource_len(pcidev, dio_badr);
>
> if (board->is_mmio) {
> devpriv->mmio_base = ioremap(iobase, len);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20140127/04058f50/attachment.sig>
More information about the kernel-team
mailing list