lkml.org 
[lkml]   [2009]   [Nov]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
SubjectSATA_SIL: Add a work-around for IXP4xx CPU.
Date
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@pm.waw.pl>

--- 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@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2009-11-11 01:07    [W:0.063 / U:0.056 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site