Commit cae6edc3 authored by Mark Lord's avatar Mark Lord Committed by Jeff Garzik

sata_mv: don't read hc_irq_cause

Remove silly read-modify-write sequences when clearing interrupts
in hc_irq_cause.  This gets rid of unneeded MMIO reads, resulting in
a slight performance boost when switching between EDMA and non-EDMA
modes (eg. for cache flushes).
Signed-off-by: default avatarMark Lord <mlord@pobox.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent b0bccb18
...@@ -35,8 +35,6 @@ ...@@ -35,8 +35,6 @@
* *
* --> Investigate problems with PCI Message Signalled Interrupts (MSI). * --> Investigate problems with PCI Message Signalled Interrupts (MSI).
* *
* --> Cache frequently-accessed registers in mv_port_priv to reduce overhead.
*
* --> Develop a low-power-consumption strategy, and implement it. * --> Develop a low-power-consumption strategy, and implement it.
* *
* --> [Experiment, low priority] Investigate interrupt coalescing. * --> [Experiment, low priority] Investigate interrupt coalescing.
...@@ -884,18 +882,14 @@ static void mv_start_dma(struct ata_port *ap, void __iomem *port_mmio, ...@@ -884,18 +882,14 @@ static void mv_start_dma(struct ata_port *ap, void __iomem *port_mmio,
int hardport = mv_hardport_from_port(ap->port_no); int hardport = mv_hardport_from_port(ap->port_no);
void __iomem *hc_mmio = mv_hc_base_from_port( void __iomem *hc_mmio = mv_hc_base_from_port(
mv_host_base(ap->host), ap->port_no); mv_host_base(ap->host), ap->port_no);
u32 hc_irq_cause, ipending; u32 hc_irq_cause;
/* clear EDMA event indicators, if any */ /* clear EDMA event indicators, if any */
writelfl(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS); writelfl(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
/* clear EDMA interrupt indicator, if any */ /* clear pending irq events */
hc_irq_cause = readl(hc_mmio + HC_IRQ_CAUSE_OFS); hc_irq_cause = ~((DEV_IRQ | DMA_IRQ) << hardport);
ipending = (DEV_IRQ | DMA_IRQ) << hardport; writelfl(hc_irq_cause, hc_mmio + HC_IRQ_CAUSE_OFS);
if (hc_irq_cause & ipending) {
writelfl(hc_irq_cause & ~ipending,
hc_mmio + HC_IRQ_CAUSE_OFS);
}
mv_edma_cfg(ap, want_ncq); mv_edma_cfg(ap, want_ncq);
...@@ -2821,8 +2815,7 @@ static void mv_eh_thaw(struct ata_port *ap) ...@@ -2821,8 +2815,7 @@ static void mv_eh_thaw(struct ata_port *ap)
writel(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS); writel(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
/* clear pending irq events */ /* clear pending irq events */
hc_irq_cause = readl(hc_mmio + HC_IRQ_CAUSE_OFS); hc_irq_cause = ~((DEV_IRQ | DMA_IRQ) << hardport);
hc_irq_cause &= ~((DEV_IRQ | DMA_IRQ) << hardport);
writelfl(hc_irq_cause, hc_mmio + HC_IRQ_CAUSE_OFS); writelfl(hc_irq_cause, hc_mmio + HC_IRQ_CAUSE_OFS);
mv_enable_port_irqs(ap, ERR_IRQ); mv_enable_port_irqs(ap, ERR_IRQ);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment