[PATCH-3.4.y-3.5.y] staging: comedi: cb_pcidio: fix for newer PCI-DIO48H
Luis Henriques
luis.henriques at canonical.com
Tue Jan 21 11:16:28 UTC 2014
On Mon, Jan 20, 2014 at 04:32:43PM +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 all the supported boards have the DIO registers in the PCI BAR 2
> region except for older PCI-DIO48H boards which have an empty PCI BAR 2
> region and the DIO registers in PCI BAR 1, determine which PCI BAR
> region to use based on whether the PCI BAR 2 region is empty or not.
>
> This change makes the `dioregs_badrindex` member of `struct
> pcidio_board` redundant. The `pcicontroler_badrindex` member is also
> unused, so remove both members.
>
> Signed-off-by: Ian Abbott <abbotti at mev.co.uk>
> Cc: kernel-team at lists.ubuntu.com
> ---
> Applies to 3.4.y and 3.5.y (Ubuntu Extended Stable).
>
> Note that other changes make this patch somewhat different to the
> upstream commit, but it fixes the same problem.
Thanks Ian, I'll queue this for the 3.5 kernel.
Cheers,
--
Luis
> ---
> drivers/staging/comedi/drivers/cb_pcidio.c | 21 ++++++++-------------
> 1 file changed, 8 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/staging/comedi/drivers/cb_pcidio.c b/drivers/staging/comedi/drivers/cb_pcidio.c
> index 8f32152..453ea2d 100644
> --- a/drivers/staging/comedi/drivers/cb_pcidio.c
> +++ b/drivers/staging/comedi/drivers/cb_pcidio.c
> @@ -56,10 +56,6 @@ struct pcidio_board {
> const char *name; /* name of the board */
> int dev_id;
> int n_8255; /* number of 8255 chips on board */
> -
> - /* indices of base address regions */
> - int pcicontroler_badrindex;
> - int dioregs_badrindex;
> };
>
> static const struct pcidio_board pcidio_boards[] = {
> @@ -67,22 +63,16 @@ static const struct pcidio_board pcidio_boards[] = {
> .name = "pci-dio24",
> .dev_id = 0x0028,
> .n_8255 = 1,
> - .pcicontroler_badrindex = 1,
> - .dioregs_badrindex = 2,
> },
> {
> .name = "pci-dio24h",
> .dev_id = 0x0014,
> .n_8255 = 1,
> - .pcicontroler_badrindex = 1,
> - .dioregs_badrindex = 2,
> },
> {
> .name = "pci-dio48h",
> .dev_id = 0x000b,
> .n_8255 = 2,
> - .pcicontroler_badrindex = 0,
> - .dioregs_badrindex = 1,
> },
> };
>
> @@ -239,10 +229,15 @@ found:
> if (comedi_pci_enable(pcidev, thisboard->name))
> return -EIO;
>
> - devpriv->dio_reg_base
> - =
> + /*
> + * Use PCI BAR 2 region if non-zero length, else use PCI BAR 1 region.
> + * PCI BAR 1 is only used for older PCI-DIO48H boards. At some point
> + * the PCI-DIO48H was redesigned to use the same PCI interface chip
> + * (and same PCI BAR region) as the other boards.
> + */
> + devpriv->dio_reg_base =
> pci_resource_start(devpriv->pci_dev,
> - pcidio_boards[index].dioregs_badrindex);
> + (pci_resource_len(pcidev, 2) ? 2 : 1));
>
> /*
> * Allocate the subdevice structures. alloc_subdevice() is a
> --
> 1.8.5.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe stable" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the kernel-team
mailing list