62 lines
2.2 KiB
Diff
62 lines
2.2 KiB
Diff
From: Lennert Buytenhek <buytenh@wantstofly.org>
|
|
Subject: [PATCH,RFC] sata_mv: don't avoid clearing interrupt status on SoC host adapters
|
|
Date: Sun, 24 Aug 2008 05:04:29 +0200
|
|
To: Saeed Bishara <saeed@marvell.com>, linux-ide@vger.kernel.org
|
|
Cc: Mark Lord <liml@rtr.ca>, Jeff Garzik <jeff@garzik.org>
|
|
|
|
For some reason, sata_mv doesn't clear interrupt status during init
|
|
when it's running on an SoC host adapter. If the bootloader has
|
|
touched the SATA controller before starting Linux, Linux can end up
|
|
enabling the SATA interrupt with events pending, which will cause the
|
|
interrupt to be marked as spurious and then be disabled, which then
|
|
breaks all further accesses to the controller.
|
|
|
|
This patch makes the SoC path clear interrupt status on init like in
|
|
the non-SoC case.
|
|
|
|
Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
|
|
---
|
|
drivers/ata/sata_mv.c | 21 ++++++++++-----------
|
|
1 files changed, 10 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
|
|
index ad169ff..e829a3a 100644
|
|
--- a/drivers/ata/sata_mv.c
|
|
+++ b/drivers/ata/sata_mv.c
|
|
@@ -3131,19 +3131,18 @@ static int mv_init_host(struct ata_host *host, unsigned int board_idx)
|
|
writelfl(0, hc_mmio + HC_IRQ_CAUSE_OFS);
|
|
}
|
|
|
|
- if (!IS_SOC(hpriv)) {
|
|
- /* Clear any currently outstanding host interrupt conditions */
|
|
- writelfl(0, mmio + hpriv->irq_cause_ofs);
|
|
+ /* Clear any currently outstanding host interrupt conditions */
|
|
+ writelfl(0, mmio + hpriv->irq_cause_ofs);
|
|
|
|
- /* and unmask interrupt generation for host regs */
|
|
- writelfl(hpriv->unmask_all_irqs, mmio + hpriv->irq_mask_ofs);
|
|
+ /* and unmask interrupt generation for host regs */
|
|
+ writelfl(hpriv->unmask_all_irqs, mmio + hpriv->irq_mask_ofs);
|
|
+
|
|
+ /*
|
|
+ * enable only global host interrupts for now.
|
|
+ * The per-port interrupts get done later as ports are set up.
|
|
+ */
|
|
+ mv_set_main_irq_mask(host, 0, PCI_ERR);
|
|
|
|
- /*
|
|
- * enable only global host interrupts for now.
|
|
- * The per-port interrupts get done later as ports are set up.
|
|
- */
|
|
- mv_set_main_irq_mask(host, 0, PCI_ERR);
|
|
- }
|
|
done:
|
|
return rc;
|
|
}
|
|
--
|
|
1.5.6.4
|
|
--
|
|
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
|
|
the body of a message to majordomo@vger.kernel.org
|
|
More majordomo info at http://vger.kernel.org/majordomo-info.html
|