diff options
| -rw-r--r-- | drivers/pci/quirks.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 3fb378aa7c53..45bd8704c99d 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -3563,6 +3563,44 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_JMICRON, | |||
| 3563 | quirk_dma_func1_alias); | 3563 | quirk_dma_func1_alias); |
| 3564 | 3564 | ||
| 3565 | /* | 3565 | /* |
| 3566 | * Some devices DMA with the wrong devfn, not just the wrong function. | ||
| 3567 | * quirk_fixed_dma_alias() uses this table to create fixed aliases, where | ||
| 3568 | * the alias is "fixed" and independent of the device devfn. | ||
| 3569 | * | ||
| 3570 | * For example, the Adaptec 3405 is a PCIe card with an Intel 80333 I/O | ||
| 3571 | * processor. To software, this appears as a PCIe-to-PCI/X bridge with a | ||
| 3572 | * single device on the secondary bus. In reality, the single exposed | ||
| 3573 | * device at 0e.0 is the Address Translation Unit (ATU) of the controller | ||
| 3574 | * that provides a bridge to the internal bus of the I/O processor. The | ||
| 3575 | * controller supports private devices, which can be hidden from PCI config | ||
| 3576 | * space. In the case of the Adaptec 3405, a private device at 01.0 | ||
| 3577 | * appears to be the DMA engine, which therefore needs to become a DMA | ||
| 3578 | * alias for the device. | ||
| 3579 | */ | ||
| 3580 | static const struct pci_device_id fixed_dma_alias_tbl[] = { | ||
| 3581 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x0285, | ||
| 3582 | PCI_VENDOR_ID_ADAPTEC2, 0x02bb), /* Adaptec 3405 */ | ||
| 3583 | .driver_data = PCI_DEVFN(1, 0) }, | ||
| 3584 | { 0 } | ||
| 3585 | }; | ||
| 3586 | |||
| 3587 | static void quirk_fixed_dma_alias(struct pci_dev *dev) | ||
| 3588 | { | ||
| 3589 | const struct pci_device_id *id; | ||
| 3590 | |||
| 3591 | id = pci_match_id(fixed_dma_alias_tbl, dev); | ||
| 3592 | if (id) { | ||
| 3593 | dev->dma_alias_devfn = id->driver_data; | ||
| 3594 | dev->dev_flags |= PCI_DEV_FLAGS_DMA_ALIAS_DEVFN; | ||
| 3595 | dev_info(&dev->dev, "Enabling fixed DMA alias to %02x.%d\n", | ||
| 3596 | PCI_SLOT(dev->dma_alias_devfn), | ||
| 3597 | PCI_FUNC(dev->dma_alias_devfn)); | ||
| 3598 | } | ||
| 3599 | } | ||
| 3600 | |||
| 3601 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ADAPTEC2, 0x0285, quirk_fixed_dma_alias); | ||
| 3602 | |||
| 3603 | /* | ||
| 3566 | * A few PCIe-to-PCI bridges fail to expose a PCIe capability, resulting in | 3604 | * A few PCIe-to-PCI bridges fail to expose a PCIe capability, resulting in |
| 3567 | * using the wrong DMA alias for the device. Some of these devices can be | 3605 | * using the wrong DMA alias for the device. Some of these devices can be |
| 3568 | * used as either forward or reverse bridges, so we need to test whether the | 3606 | * used as either forward or reverse bridges, so we need to test whether the |
