All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tejun Heo <htejun@gmail.com>
To: jgarzik@pobox.com, linux-ide@vger.kernel.org,
	Carlos.Pardo@siliconimage.com
Cc: Tejun Heo <htejun@gmail.com>
Subject: [PATCH 10/13] sata_sil24: reimplement hardreset
Date: Fri, 7 Apr 2006 17:16:54 +0900	[thread overview]
Message-ID: <11443978142543-git-send-email-htejun@gmail.com> (raw)
In-Reply-To: <114439781363-git-send-email-htejun@gmail.com>

Reimplement hardreset according to the datasheet.  The old hardreset
didn't reset controller status and the controller might not be ready
after reset.  Also, as SStatus is a bit flakey after hardreset,
sata_std_hardrset() didn't use to wait long enough before proceeding.

Note that as we're not depending on SStatus, DET==1 condition cannot
be used to wait for link, so use shorter timeout for no device case.

Signed-off-by: Tejun Heo <htejun@gmail.com>

---

 drivers/scsi/sata_sil24.c |   43 ++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 40 insertions(+), 3 deletions(-)

241bde5ce7088b4beea4ebf8020a90247a3f4f9f
diff --git a/drivers/scsi/sata_sil24.c b/drivers/scsi/sata_sil24.c
index 55f51e1..fb260e7 100644
--- a/drivers/scsi/sata_sil24.c
+++ b/drivers/scsi/sata_sil24.c
@@ -522,10 +522,47 @@ static int sil24_softreset(struct ata_po
 
 static int sil24_hardreset(struct ata_port *ap, unsigned int *class)
 {
-	unsigned int dummy_class;
+	void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
+	const char *reason;
+	int tout_msec;
+	u32 tmp;
+
+	/* sil24 does the right thing(tm) without any protection */
+	ata_set_sata_spd(ap);
+
+	tout_msec = 100;
+	if (sata_dev_present(ap))
+		tout_msec = 5000;
+
+	writel(PORT_CS_DEV_RST, port + PORT_CTRL_STAT);
+	tmp = ata_wait_register(port + PORT_CTRL_STAT,
+				PORT_CS_DEV_RST, PORT_CS_DEV_RST, 10, tout_msec);
+
+	/* SStatus oscillates between zero and valid status for short
+	 * duration after DEV_RST, give it time to settle.
+	 */
+	msleep(100);
+
+	if (tmp & PORT_CS_DEV_RST) {
+		if (!sata_dev_present(ap))
+			return 0;
+		reason = "link not ready";
+		goto err;
+	}
+
+	if (ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT)) {
+		reason = "device not ready";
+		goto err;
+	}
+
+	/* sil24 doesn't report device class code after hardreset,
+	 * leave *class alone.
+	 */
+	return 0;
 
-	/* sil24 doesn't report device signature after hard reset */
-	return sata_std_hardreset(ap, &dummy_class);
+ err:
+	printk(KERN_ERR "ata%u: hardreset failed (%s)\n", ap->id, reason);
+	return -EIO;
 }
 
 static int sil24_probe_reset(struct ata_port *ap, unsigned int *classes)
-- 
1.2.4



  parent reply	other threads:[~2006-04-07  8:17 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-04-07  8:16 [PATCHSET] sata_sil24: fixes, errata workaround and reset updates, take 2 Tejun Heo
2006-04-07  8:16 ` [PATCH 04/13] sata_sil24: add more constants Tejun Heo
2006-04-07  8:16 ` [PATCH 02/13] sata_sil24: typo fix Tejun Heo
2006-04-07  8:16 ` [PATCH 08/13] sata_sil24: put port into known state before softresetting Tejun Heo
2006-04-07  8:16 ` [PATCH 03/13] sata_sil24: rename PORT_IRQ_SDB_FIS to PORT_IRQ_SDB_NOTIFY Tejun Heo
2006-04-07  8:16 ` [PATCH 07/13] sata_sil24: implement sil24_init_port() Tejun Heo
2006-04-07  8:16 ` [PATCH 05/13] sata_sil24: consolidate host flags into SIL24_COMMON_FLAGS Tejun Heo
2006-04-07  8:16 ` [PATCH 06/13] sata_sil24: implement loss of completion interrupt on PCI-X errta fix Tejun Heo
2006-04-11  8:34   ` [PATCH 06/13 (updated)] " Tejun Heo
2006-04-11  9:11     ` Tejun Heo
2006-04-07  8:16 ` [PATCH 01/13] libata: export ata_set_sata_spd() Tejun Heo
2006-04-07  8:16 ` [PATCH 09/13] sata_sil24: kill 10ms sleep in softreset Tejun Heo
2006-04-07  8:16 ` [PATCH 12/13] sata_sil24: fix on-memory structure byteorder Tejun Heo
2006-04-07  8:16 ` [PATCH 13/13] sata_sil24: enable 64bit Tejun Heo
2006-04-07  8:16 ` [PATCH 11/13] sata_sil24: don't do hardreset during driver initialization Tejun Heo
2006-04-07  8:16 ` Tejun Heo [this message]
  -- strict thread matches above, loose matches on Subject: below --
2006-04-11 13:32 [PATCHSET 4/9] sata_sil24 fixes, errata workaround and reset updates, take 3 Tejun Heo
2006-04-11 13:32 ` [PATCH 10/13] sata_sil24: reimplement hardreset 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=11443978142543-git-send-email-htejun@gmail.com \
    --to=htejun@gmail.com \
    --cc=Carlos.Pardo@siliconimage.com \
    --cc=jgarzik@pobox.com \
    --cc=linux-ide@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.