Patchwork [#upstream-fixes] sata_sil24: fix kernel panic on ARM caused by unaligned access in sata_sil24

login
register
mail settings
Submitter Tejun Heo
Date June 4, 2010, 2:19 p.m.
Message ID <4C090B87.1070109@kernel.org>
Download mbox | patch
Permalink /patch/54589/
State Not Applicable
Delegated to: David Miller
Headers show

Comments

Tejun Heo - June 4, 2010, 2:19 p.m.
From: Colin Tuckley <colin.tuckley@arm.com>

The sata_sil24 driver has six 16-bit registers that are initialised with
32-bit writes. This cause a kernel panic on ARM due to the unaligned
accesses which result.

This patch changes the accesses to the correct 16-bit ones.

Signed-off-by: Colin Tuckley <colin.tuckley@arm.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
---
 drivers/ata/sata_sil24.c |   12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

--
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
Jeff Garzik - June 7, 2010, 8:08 p.m.
On 06/04/2010 10:19 AM, Tejun Heo wrote:
> From: Colin Tuckley<colin.tuckley@arm.com>
>
> The sata_sil24 driver has six 16-bit registers that are initialised with
> 32-bit writes. This cause a kernel panic on ARM due to the unaligned
> accesses which result.
>
> This patch changes the accesses to the correct 16-bit ones.
>
> Signed-off-by: Colin Tuckley<colin.tuckley@arm.com>
> Signed-off-by: Tejun Heo<tj@kernel.org>
> ---
>   drivers/ata/sata_sil24.c |   12 ++++++------
>   1 file changed, 6 insertions(+), 6 deletions(-)

applied


--
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

Patch

diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
index 433b6b8..62ee924 100644
--- a/drivers/ata/sata_sil24.c
+++ b/drivers/ata/sata_sil24.c
@@ -539,12 +539,12 @@  static void sil24_config_port(struct ata_port *ap)
 		writel(PORT_CS_IRQ_WOC, port + PORT_CTRL_CLR);

 	/* zero error counters. */
-	writel(0x8000, port + PORT_DECODE_ERR_THRESH);
-	writel(0x8000, port + PORT_CRC_ERR_THRESH);
-	writel(0x8000, port + PORT_HSHK_ERR_THRESH);
-	writel(0x0000, port + PORT_DECODE_ERR_CNT);
-	writel(0x0000, port + PORT_CRC_ERR_CNT);
-	writel(0x0000, port + PORT_HSHK_ERR_CNT);
+	writew(0x8000, port + PORT_DECODE_ERR_THRESH);
+	writew(0x8000, port + PORT_CRC_ERR_THRESH);
+	writew(0x8000, port + PORT_HSHK_ERR_THRESH);
+	writew(0x0000, port + PORT_DECODE_ERR_CNT);
+	writew(0x0000, port + PORT_CRC_ERR_CNT);
+	writew(0x0000, port + PORT_HSHK_ERR_CNT);

 	/* always use 64bit activation */
 	writel(PORT_CS_32BIT_ACTV, port + PORT_CTRL_CLR);