Skip to content

Commit

Permalink
[PATCH] libata-acpi: Try and stop all the non PCI devices crashing
Browse files Browse the repository at this point in the history
For 2.6.20 it mostly used to just not work, for 2.6.21-rc it crashes, this
seems to be down to luck (bad or good). The libata-acpi code needs to
avoid doing PCI work on non-PCI devices. This is one hack although it's
not pretty and perhaps there is a "right" way to check if a struct device
* is PCI ?

Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Alan Cox authored and Linus Torvalds committed Mar 8, 2007
1 parent 908e0a8 commit ca42663
Showing 1 changed file with 16 additions and 1 deletion.
17 changes: 16 additions & 1 deletion drivers/ata/libata-acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,13 @@ struct taskfile_array {
u8 tfa[REGS_PER_GTF]; /* regs. 0x1f1 - 0x1f7 */
};

/*
* Helper - belongs in the PCI layer somewhere eventually
*/
static int is_pci_dev(struct device *dev)
{
return (dev->bus == &pci_bus_type);
}

/**
* sata_get_dev_handle - finds acpi_handle and PCI device.function
Expand All @@ -53,6 +60,9 @@ static int sata_get_dev_handle(struct device *dev, acpi_handle *handle,
struct pci_dev *pci_dev;
acpi_integer addr;

if (!is_pci_dev(dev))
return -ENODEV;

pci_dev = to_pci_dev(dev); /* NOTE: PCI-specific */
/* Please refer to the ACPI spec for the syntax of _ADR. */
addr = (PCI_SLOT(pci_dev->devfn) << 16) | PCI_FUNC(pci_dev->devfn);
Expand Down Expand Up @@ -84,7 +94,12 @@ static int pata_get_dev_handle(struct device *dev, acpi_handle *handle,
acpi_status status;
struct acpi_device_info *dinfo = NULL;
int ret = -ENODEV;
struct pci_dev *pdev = to_pci_dev(dev);
struct pci_dev *pdev;

if (!is_pci_dev(dev))
return -ENODEV;

pdev = to_pci_dev(dev);

bus = pdev->bus->number;
devnum = PCI_SLOT(pdev->devfn);
Expand Down

0 comments on commit ca42663

Please sign in to comment.