SATA_SIL: Add a work-around for IXP4xx CPU.

From: Krzysztof Halasa
Date: Tue Nov 10 2009 - 19:04:23 EST


IXP4xx CPUs can't read from 8 and 16-bit PCI MMIO registers, we have to read
from normal IO regions instead.

Tested on SIL3512, and specifically not tested on 4-port SIL3114.

Signed-off-by: Krzysztof HaÅasa <khc@xxxxxxxxx>

--- a/drivers/ata/sata_sil.c
+++ b/drivers/ata/sata_sil.c
@@ -757,7 +757,22 @@ static int sil_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (rc)
return rc;

+#ifdef CONFIG_ARCH_IXP4XX
+ /* IXP4xx CPUs can't perform 8 and 16-bit MMIO reads,
+ use normal IO from/to regions 0-5 instead.
+ region 0: channel 0 (and 2) task file regs
+ region 1: channel 0 (and 2) auxiliary status
+ region 2: channel 1 (and 3) task file regs
+ region 3: channel 1 (and 3) auxiliary status
+ region 4: bus master DMA command and status for all channels
+ region 5: the normal MMIO
+
+ Channels 2 and 3 are present only on SIL3114, device selection
+ is done with ATA_DEV1 bit in ATA_REG_DEVICE. FIXME - untested */
+ rc = pcim_iomap_regions(pdev, 0x3F, DRV_NAME);
+#else
rc = pcim_iomap_regions(pdev, 1 << SIL_MMIO_BAR, DRV_NAME);
+#endif
if (rc == -EBUSY)
pcim_pin_device(pdev);
if (rc)
@@ -777,10 +792,16 @@ static int sil_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
struct ata_port *ap = host->ports[i];
struct ata_ioports *ioaddr = &ap->ioaddr;

+#ifdef CONFIG_ARCH_IXP4XX
+ ioaddr->cmd_addr = host->iomap[(i % 2) * 2];
+ ioaddr->altstatus_addr = host->iomap[1 + (i % 2) * 2] + 2;
+ ioaddr->bmdma_addr = host->iomap[4] + sil_port[i % 2].bmdma;
+#else
ioaddr->cmd_addr = mmio_base + sil_port[i].tf;
- ioaddr->altstatus_addr =
- ioaddr->ctl_addr = mmio_base + sil_port[i].ctl;
+ ioaddr->altstatus_addr = mmio_base + sil_port[i].ctl;
ioaddr->bmdma_addr = mmio_base + sil_port[i].bmdma;
+#endif
+ ioaddr->ctl_addr = mmio_base + sil_port[i].ctl;
ioaddr->scr_addr = mmio_base + sil_port[i].scr;
ata_sff_std_ports(ioaddr);


--
Krzysztof Halasa
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/