Commit f3533a9f authored by Jens Axboe's avatar Jens Axboe Committed by Linus Torvalds

[PATCH] IDE fixes

starting from 2.5.35 IDE stopped working on my alphas because of
following problems:

- ide_hwif_configure() ignores BARs for IDE base/control registers
  and assumes legacy 0x1f0/0x170 ports, unless controller reports
  native PCI mode (ProgIf bits 0 and 2).

  This is incorrect, as there are quite a few IDE chips operating
  in "semi-legacy" mode, i.e. legacy interrupts, but functional
  BAR0-3, like cy82c693 and ali5229. I guess Andre could give a lot
  more examples. :-)

  This happens to work on i386 simply because BIOS usually assigns
  legacy values to BAR0-3, but we can't rely on it.

  Just checking respective resource->start for zero should work in
  all cases.

- ide_pci_check_iomem(): resource->flags == 0 means "unconfigured" as well.
  Thus we avoid false positives.

- Apparently cut'n'paste typo in cy82c693.c - wrong PCI IDs.
parent d026dd46
...@@ -429,7 +429,7 @@ static int __devinit cy82c693_init_one(struct pci_dev *dev, const struct pci_dev ...@@ -429,7 +429,7 @@ static int __devinit cy82c693_init_one(struct pci_dev *dev, const struct pci_dev
} }
static struct pci_device_id cy82c693_pci_tbl[] __devinitdata = { static struct pci_device_id cy82c693_pci_tbl[] __devinitdata = {
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, { PCI_VENDOR_ID_CONTAQ, PCI_DEVICE_ID_CONTAQ_82C693, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
{ 0, }, { 0, },
}; };
......
...@@ -389,7 +389,7 @@ static int ide_pci_check_iomem(struct pci_dev *dev, ide_pci_device_t *d, int bar ...@@ -389,7 +389,7 @@ static int ide_pci_check_iomem(struct pci_dev *dev, ide_pci_device_t *d, int bar
ulong flags = pci_resource_flags(dev, bar); ulong flags = pci_resource_flags(dev, bar);
/* Unconfigured ? */ /* Unconfigured ? */
if(pci_resource_len(dev, bar) == 0) if (!flags || pci_resource_len(dev, bar) == 0)
return 0; return 0;
/* I/O space */ /* I/O space */
...@@ -422,10 +422,8 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev, ide_pci_device_t *d, ...@@ -422,10 +422,8 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev, ide_pci_device_t *d,
unsigned long ctl = 0, base = 0; unsigned long ctl = 0, base = 0;
ide_hwif_t *hwif; ide_hwif_t *hwif;
if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE || if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE)
((dev->class & ~(0xfa))) || {
(dev->class & (port ? 4 : 1)) != 0)
{
/* Possibly we should fail if these checks report true */ /* Possibly we should fail if these checks report true */
ide_pci_check_iomem(dev, d, 2*port); ide_pci_check_iomem(dev, d, 2*port);
ide_pci_check_iomem(dev, d, 2*port+1); ide_pci_check_iomem(dev, d, 2*port+1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment