diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ide/pci/pdc202xx_new.c | 60 |
1 files changed, 34 insertions, 26 deletions
diff --git a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c index 7b0e479c355c..7c5544d10b9a 100644 --- a/drivers/ide/pci/pdc202xx_new.c +++ b/drivers/ide/pci/pdc202xx_new.c | |||
@@ -524,44 +524,52 @@ static int __devinit init_setup_pdcnew(struct pci_dev *dev, ide_pci_device_t *d) | |||
524 | return ide_setup_pci_device(dev, d); | 524 | return ide_setup_pci_device(dev, d); |
525 | } | 525 | } |
526 | 526 | ||
527 | static int __devinit init_setup_pdc20270(struct pci_dev *dev, | 527 | static int __devinit init_setup_pdc20270(struct pci_dev *dev, ide_pci_device_t *d) |
528 | ide_pci_device_t *d) | ||
529 | { | 528 | { |
530 | struct pci_dev *findev = NULL; | 529 | struct pci_dev *bridge = dev->bus->self; |
531 | int ret; | 530 | |
531 | if (bridge != NULL && | ||
532 | bridge->vendor == PCI_VENDOR_ID_DEC && | ||
533 | bridge->device == PCI_DEVICE_ID_DEC_21150) { | ||
534 | struct pci_dev *dev2; | ||
532 | 535 | ||
533 | if ((dev->bus->self && | ||
534 | dev->bus->self->vendor == PCI_VENDOR_ID_DEC) && | ||
535 | (dev->bus->self->device == PCI_DEVICE_ID_DEC_21150)) { | ||
536 | if (PCI_SLOT(dev->devfn) & 2) | 536 | if (PCI_SLOT(dev->devfn) & 2) |
537 | return -ENODEV; | 537 | return -ENODEV; |
538 | 538 | ||
539 | while ((findev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, findev)) != NULL) { | 539 | dev2 = pci_get_slot(dev->bus, PCI_DEVFN(PCI_SLOT(dev->devfn) + 2, |
540 | if ((findev->vendor == dev->vendor) && | 540 | PCI_FUNC(dev->devfn))); |
541 | (findev->device == dev->device) && | 541 | if (dev2 != NULL && |
542 | (PCI_SLOT(findev->devfn) & 2)) { | 542 | dev2->vendor == dev->vendor && |
543 | if (findev->irq != dev->irq) { | 543 | dev2->device == dev->device) { |
544 | findev->irq = dev->irq; | 544 | int ret; |
545 | } | 545 | |
546 | ret = ide_setup_pci_devices(dev, findev, d); | 546 | if (dev2->irq != dev->irq) { |
547 | if (ret < 0) | 547 | dev2->irq = dev->irq; |
548 | pci_dev_put(findev); | 548 | |
549 | return ret; | 549 | printk(KERN_WARNING "%s: PCI config space " |
550 | "interrupt fixed.\n", d->name); | ||
550 | } | 551 | } |
552 | |||
553 | ret = ide_setup_pci_devices(dev, dev2, d); | ||
554 | if (ret < 0) | ||
555 | pci_dev_put(dev2); | ||
556 | return ret; | ||
551 | } | 557 | } |
552 | } | 558 | } |
553 | return ide_setup_pci_device(dev, d); | 559 | return ide_setup_pci_device(dev, d); |
554 | } | 560 | } |
555 | 561 | ||
556 | static int __devinit init_setup_pdc20276(struct pci_dev *dev, | 562 | static int __devinit init_setup_pdc20276(struct pci_dev *dev, ide_pci_device_t *d) |
557 | ide_pci_device_t *d) | ||
558 | { | 563 | { |
559 | if ((dev->bus->self) && | 564 | struct pci_dev *bridge = dev->bus->self; |
560 | (dev->bus->self->vendor == PCI_VENDOR_ID_INTEL) && | 565 | |
561 | ((dev->bus->self->device == PCI_DEVICE_ID_INTEL_I960) || | 566 | if (bridge != NULL && |
562 | (dev->bus->self->device == PCI_DEVICE_ID_INTEL_I960RM))) { | 567 | bridge->vendor == PCI_VENDOR_ID_INTEL && |
563 | printk(KERN_INFO "ide: Skipping Promise PDC20276 " | 568 | (bridge->device == PCI_DEVICE_ID_INTEL_I960 || |
564 | "attached to I2O RAID controller.\n"); | 569 | bridge->device == PCI_DEVICE_ID_INTEL_I960RM)) { |
570 | |||
571 | printk(KERN_INFO "%s: attached to I2O RAID controller, " | ||
572 | "skipping.\n", d->name); | ||
565 | return -ENODEV; | 573 | return -ENODEV; |
566 | } | 574 | } |
567 | return ide_setup_pci_device(dev, d); | 575 | return ide_setup_pci_device(dev, d); |