pata_atiixp: add proper ->prereset method
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Tue, 11 Oct 2011 17:55:09 +0000 (19:55 +0200)
committerJeff Garzik <jgarzik@redhat.com>
Fri, 14 Oct 2011 17:16:49 +0000 (13:16 -0400)
Fixes PCI access before PCI resources are allocated.

Acked-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/ata/pata_atiixp.c

index 4375561..be1aa14 100644 (file)
@@ -49,6 +49,31 @@ static int atiixp_cable_detect(struct ata_port *ap)
 static DEFINE_SPINLOCK(atiixp_lock);
 
 /**
+ *     atiixp_prereset -       perform reset handling
+ *     @link: ATA link
+ *     @deadline: deadline jiffies for the operation
+ *
+ *     Reset sequence checking enable bits to see which ports are
+ *     active.
+ */
+
+static int atiixp_prereset(struct ata_link *link, unsigned long deadline)
+{
+       static const struct pci_bits atiixp_enable_bits[] = {
+               { 0x48, 1, 0x01, 0x00 },
+               { 0x48, 1, 0x08, 0x00 }
+       };
+
+       struct ata_port *ap = link->ap;
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
+
+       if (!pci_test_config_bits(pdev, &atiixp_enable_bits[ap->port_no]))
+               return -ENOENT;
+
+       return ata_sff_prereset(link, deadline);
+}
+
+/**
  *     atiixp_set_pio_timing   -       set initial PIO mode data
  *     @ap: ATA interface
  *     @adev: ATA device
@@ -221,6 +246,7 @@ static struct ata_port_operations atiixp_port_ops = {
        .bmdma_start    = atiixp_bmdma_start,
        .bmdma_stop     = atiixp_bmdma_stop,
 
+       .prereset       = atiixp_prereset,
        .cable_detect   = atiixp_cable_detect,
        .set_piomode    = atiixp_set_piomode,
        .set_dmamode    = atiixp_set_dmamode,
@@ -235,16 +261,7 @@ static int atiixp_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
                .udma_mask = ATA_UDMA5,
                .port_ops = &atiixp_port_ops
        };
-       static const struct pci_bits atiixp_enable_bits[] = {
-               { 0x48, 1, 0x01, 0x00 },
-               { 0x48, 1, 0x08, 0x00 }
-       };
        const struct ata_port_info *ppi[] = { &info, &info };
-       int i;
-
-       for (i = 0; i < 2; i++)
-               if (!pci_test_config_bits(pdev, &atiixp_enable_bits[i]))
-                       ppi[i] = &ata_dummy_port_info;
 
        return ata_pci_bmdma_init_one(pdev, ppi, &atiixp_sht, NULL,
                                      ATA_HOST_PARALLEL_SCAN);