From: Krzysztof Halasa <khc@pm.waw.pl>
To: Jeff Garzik <jgarzik@pobox.com>
Cc: linux-ide@vger.kernel.org, lkml <linux-kernel@vger.kernel.org>
Subject: SATA_SIL: Add a work-around for IXP4xx CPU.
Date: Wed, 11 Nov 2009 01:04:14 +0100 [thread overview]
Message-ID: <m3fx8m0vwh.fsf@intrepid.localdomain> (raw)
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
next reply other threads:[~2009-11-11 0:04 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-11 0:04 Krzysztof Halasa [this message]
2009-12-15 8:19 ` Tejun Heo
2009-12-15 23:03 ` Krzysztof Halasa
2009-12-15 23:09 ` Jeff Garzik
2009-12-16 0:39 ` Tejun Heo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m3fx8m0vwh.fsf@intrepid.localdomain \
--to=khc@pm.waw.pl \
--cc=jgarzik@pobox.com \
--cc=linux-ide@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®