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@xxxxxxxxx> > Cc: kernel-team@xxxxxxxxxxxxxxxx > --- > 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@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html