From patchwork Wed Dec 2 01:43:42 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tejun Heo X-Patchwork-Id: 39952 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id 4459A1007D2 for ; Wed, 2 Dec 2009 12:44:58 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752404AbZLBBot (ORCPT ); Tue, 1 Dec 2009 20:44:49 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752311AbZLBBot (ORCPT ); Tue, 1 Dec 2009 20:44:49 -0500 Received: from hera.kernel.org ([140.211.167.34]:50245 "EHLO hera.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751793AbZLBBos (ORCPT ); Tue, 1 Dec 2009 20:44:48 -0500 Received: from htj.dyndns.org (localhost [127.0.0.1]) by hera.kernel.org (8.14.3/8.14.3) with ESMTP id nB21hM4r009159 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Wed, 2 Dec 2009 01:43:24 GMT Received: from [127.0.0.2] (htj.dyndns.org [127.0.0.2]) by htj.dyndns.org (Postfix) with ESMTPSA id DAF3F100C9201; Wed, 2 Dec 2009 10:43:42 +0900 (KST) Message-ID: <4B15C64E.7090106@kernel.org> Date: Wed, 02 Dec 2009 10:43:42 +0900 From: Tejun Heo User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.4pre) Gecko/20090915 SUSE/3.0b4-3.6 Thunderbird/3.0b4 MIME-Version: 1.0 To: Alex Vandiver CC: linux-ide Subject: Re: Intermittent SATA failures ("link offline, clearing class 1 to NONE") References: <1258054583-sup-4108@utwig> <4B14B207.9010208@kernel.org> <1259652273-sup-686@utwig> <4B14D003.30407@kernel.org> <4B14D454.7010300@kernel.org> <1259704924-sup-4007@utwig> In-Reply-To: <1259704924-sup-4007@utwig> X-Enigmail-Version: 0.97a X-Spam-Status: No, score=-1.3 required=5.0 tests=AWL,BAYES_00, DATE_IN_FUTURE_96_XX,UNPARSEABLE_RELAY autolearn=no version=3.2.5 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on hera.kernel.org Sender: linux-ide-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ide@vger.kernel.org Hello, Can you please try this one? Thanks. diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 9ac4e37..f50bba6 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c @@ -173,6 +173,8 @@ static int piix_sidpr_scr_read(struct ata_link *link, unsigned int reg, u32 *val); static int piix_sidpr_scr_write(struct ata_link *link, unsigned int reg, u32 val); +static int piix_sidpr_hardreset(struct ata_link *link, unsigned int *class, + unsigned long deadline); #ifdef CONFIG_PM static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); static int piix_pci_device_resume(struct pci_dev *pdev); @@ -334,9 +336,9 @@ static struct ata_port_operations piix_sata_ops = { static struct ata_port_operations piix_sidpr_sata_ops = { .inherits = &piix_sata_ops, - .hardreset = sata_std_hardreset, .scr_read = piix_sidpr_scr_read, .scr_write = piix_sidpr_scr_write, + .hardreset = piix_sidpr_hardreset, }; static const struct piix_map_db ich5_map_db = { @@ -962,6 +964,18 @@ static int piix_sidpr_scr_write(struct ata_link *link, return 0; } +static int piix_sidpr_hardreset(struct ata_link *link, unsigned int *class, + unsigned long deadline) +{ + const unsigned long *timing = sata_deb_timing_hotplug; + bool online; + int rc; + + /* do hardreset */ + rc = sata_link_hardreset(link, timing, deadline, &online, NULL); + return online ? -EAGAIN : rc; +} + #ifdef CONFIG_PM static int piix_broken_suspend(void) { diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index dc72690..c501e1e 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -3731,7 +3731,7 @@ int sata_link_debounce(struct ata_link *link, const unsigned long *params, unsigned long interval = params[0]; unsigned long duration = params[1]; unsigned long last_jiffies, t; - u32 last, cur; + u32 last, cur, xxx; int rc; t = ata_deadline(jiffies, params[2]); @@ -3740,7 +3740,9 @@ int sata_link_debounce(struct ata_link *link, const unsigned long *params, if ((rc = sata_scr_read(link, SCR_STATUS, &cur))) return rc; + xxx = cur; cur &= 0xf; + ata_link_printk(link, KERN_INFO, "XXX debounce start, SStatus=%x\n", xxx); last = cur; last_jiffies = jiffies; @@ -3749,6 +3751,7 @@ int sata_link_debounce(struct ata_link *link, const unsigned long *params, msleep(interval); if ((rc = sata_scr_read(link, SCR_STATUS, &cur))) return rc; + xxx = cur; cur &= 0xf; /* DET stable? */ @@ -3756,8 +3759,12 @@ int sata_link_debounce(struct ata_link *link, const unsigned long *params, if (cur == 1 && time_before(jiffies, deadline)) continue; if (time_after(jiffies, - ata_deadline(last_jiffies, duration))) + ata_deadline(last_jiffies, duration))) { + ata_link_printk(link, KERN_INFO, + "XXX debounce done, SStatus=%x, DET stable for %u msecs\n", + xxx, jiffies_to_msecs(jiffies - last_jiffies)); return 0; + } continue; }