linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mark Lord <liml@rtr.ca>
To: Jeff Garzik <jgarzik@pobox.com>,
	IDE/ATA development list <linux-ide@vger.kernel.org>
Cc: Saeed Bishara <saeed@marvell.com>
Subject: [PATCH 07/07] sata_mv: workaround errata SATA#13
Date: Mon, 06 Apr 2009 15:26:24 -0400	[thread overview]
Message-ID: <49DA5760.1040104@rtr.ca> (raw)
In-Reply-To: <49DA5733.3050206@rtr.ca>

Add remainder of workaround for errata SATA#13.

This prevents writes of certain adjacent 32-bit registers
from being combined into single 64-bit writes, which might
fail for the affected registers.

Most of sata_mv is already safe from this issue,
but adding this code to mv_write_cached_reg() will
catch the remaining cases and hopefully prevent future ones.

Signed-off-by: Mark Lord <mlord@pobox.com>

--- old/drivers/ata/sata_mv.c	2009-04-06 15:00:16.000000000 -0400
+++ new/drivers/ata/sata_mv.c	2009-04-06 15:04:05.000000000 -0400
@@ -919,8 +919,26 @@
 static inline void mv_write_cached_reg(void __iomem *addr, u32 *old, u32 new)
 {
 	if (new != *old) {
+		unsigned long laddr;
 		*old = new;
-		writel(new, addr);
+		/*
+		 * Workaround for 88SX60x1-B2 FEr SATA#13:
+		 * Read-after-write is needed to prevent generating 64-bit
+		 * write cycles on the PCI bus for SATA interface registers
+		 * at offsets ending in 0x4 or 0xc.
+		 *
+		 * Looks like a lot of fuss, but it avoids an unnecessary
+		 * +1 usec read-after-write delay for unaffected registers.
+		 */
+		laddr = (long)addr & 0xffff;
+		if (laddr >= 0x300 && laddr <= 0x33c) {
+			laddr &= 0x000f;
+			if (laddr == 0x4 || laddr == 0xc) {
+				writelfl(new, addr); /* read after write */
+				return;
+			}
+		}
+		writel(new, addr); /* unaffected by the errata */
 	}
 }
 

  reply	other threads:[~2009-04-06 19:26 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-06 16:29 [PATCH 01/03] sata_mv: revert SoC irq breakage Mark Lord
2009-04-06 16:30 ` [PATCH 02/03] sata_mv: fix irq mask races Mark Lord
2009-04-06 16:31   ` [PATCH 03/03] sata_mv: replace 0x1f with ATA_PIO4 Mark Lord
2009-04-06 19:22     ` [PATCH 03/03] sata_mv: replace 0x1f with ATA_PIO4 (v2) Mark Lord
2009-04-06 19:24       ` [PATCH 04/07] sata_mv: workaround errata PCI#7 Mark Lord
2009-04-06 19:24         ` [PATCH 05/07] sata_mv: workaround errata SATA#26 Mark Lord
2009-04-06 19:25           ` [PATCH 06/07] sata_mv: cosmetic renames Mark Lord
2009-04-06 19:26             ` Mark Lord [this message]
2009-04-06 20:43               ` [PATCH 08/08] sata_mv: shorten register names Mark Lord
2009-04-06 19:51             ` [PATCH 06/07] sata_mv: cosmetic renames Jeff Garzik
2009-04-06 20:12               ` Mark Lord
2009-04-07  0:16 ` [PATCH 01/03] sata_mv: revert SoC irq breakage Jeff Garzik

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=49DA5760.1040104@rtr.ca \
    --to=liml@rtr.ca \
    --cc=jgarzik@pobox.com \
    --cc=linux-ide@vger.kernel.org \
    --cc=saeed@marvell.com \
    /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;
as well as URLs for NNTP newsgroup(s).