From patchwork Wed Mar 23 08:17:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Damien Le Moal X-Patchwork-Id: 1608491 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=wdc.com header.i=@wdc.com header.a=rsa-sha256 header.s=dkim.wdc.com header.b=XplhtUc2; dkim=pass (2048-bit key; unprotected) header.d=opensource.wdc.com header.i=@opensource.wdc.com header.a=rsa-sha256 header.s=dkim header.b=f+d3njDu; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=2620:137:e000::1:20; helo=out1.vger.email; envelope-from=linux-ide-owner@vger.kernel.org; receiver=) Received: from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20]) by bilbo.ozlabs.org (Postfix) with ESMTP id 4KNh8w4Tssz9sCD for ; Wed, 23 Mar 2022 19:19:28 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242575AbiCWIUy (ORCPT ); Wed, 23 Mar 2022 04:20:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43902 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237876AbiCWIUy (ORCPT ); Wed, 23 Mar 2022 04:20:54 -0400 Received: from esa5.hgst.iphmx.com (esa5.hgst.iphmx.com [216.71.153.144]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A6C145EDC1 for ; Wed, 23 Mar 2022 01:19:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1648023563; x=1679559563; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=NkAwXimJP512DU9dLD5JNat71WrXp4shbL048LlbGe4=; b=XplhtUc22xWMXHD94xdt2F8ZPuyer1/dy4W0rg9Om90g/B4eoLn/3Jmx FsWdZ82whYEhmf+FkTiigQAr8KNL7NEuc+OShHMg1reTZ8EEZdX5qSXak wYUmckNmlawYNe1FQuNKbAoCK0nX90QhQZoJ6tkS1hKyViA2vIoy5j6MI DK17ISfIaLnhID4CoxgYcG4+xh0YQfzpRq+6RnfrYhrWL1MSoMs0dyP14 pgguUHcVbgcjerdwzzi8xqyOecZTfBU0/ODfYVJsyP/0ut6DmAeLIoQvu Q3QdogoJ7JdV8S/BZQQ0mWGoc66IfJnyju2TngfMvLhMx8/6tGFOptQuc A==; X-IronPort-AV: E=Sophos;i="5.90,203,1643644800"; d="scan'208";a="196047605" Received: from uls-op-cesaip01.wdc.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 23 Mar 2022 16:19:22 +0800 IronPort-SDR: YZqR+17F1bck9DvijtZBTsrbdzWLyz7aZ5A9NuR7t5wujcL5N/RDrngdT2uhQrcg/hnv4HUQQ8 DlDhB+inrs7XaKtTUlsVpDxMxwqqQVGmu83gurO1K+75FRMMwXNy47Moson98OOwYCeN38arg1 +wGWWMZPr63vZg0BrPnmsxx/vY2MUBoc7L89UADzdR2mSGV/svXZJ6qIlFeROZrf+NRWAQgM4g lVkN5CPH+QD8KlgTwyJwyN4L2B14FOqraSHbQNC8FN0nheCz6WdNn++MLJ8Mb/CyIci1TH1W8L g3dvC1yoUYKyxeCPcJN4YD7U Received: from uls-op-cesaip02.wdc.com ([10.248.3.37]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Mar 2022 00:51:17 -0700 IronPort-SDR: XCRiQoN6EROT+Q9zanR8f0ddv4XfPHTSpqer1+vNxD+cgHhVm8tgBfxQ/91xkSmp0LQvnS6icR 0MZZNl4ezdKqlL+aXgs6NjBtUjdVHlEQjaan32EUv9oLerwkd/tVrgbuMF4H2XQ3+COKBiJjQp 1AjYx855DPzahV/pYSvmHjaSuLLQGEAbzdGoiVfu/5EoiGkaauYMB3hJyLqQhiGYlDP3Yejhx0 V7y+p5qQbfkmrMm8WU/EnhMcIP/NxSRjh564GqLJXOvUZyqoz3YOngzQgKR56M8CoQq9XTcBU7 LW8= WDCIronportException: Internal Received: from usg-ed-osssrv.wdc.com ([10.3.10.180]) by uls-op-cesaip02.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Mar 2022 01:19:23 -0700 Received: from usg-ed-osssrv.wdc.com (usg-ed-osssrv.wdc.com [127.0.0.1]) by usg-ed-osssrv.wdc.com (Postfix) with ESMTP id 4KNh8q2P1Tz1SVnx for ; Wed, 23 Mar 2022 01:19:23 -0700 (PDT) Authentication-Results: usg-ed-osssrv.wdc.com (amavisd-new); dkim=pass reason="pass (just generated, assumed good)" header.d=opensource.wdc.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d= opensource.wdc.com; h=content-transfer-encoding:mime-version :references:in-reply-to:x-mailer:message-id:date:subject:to :from; s=dkim; t=1648023562; x=1650615563; bh=NkAwXimJP512DU9dLD 5JNat71WrXp4shbL048LlbGe4=; b=f+d3njDu5eCZsbml9C6eRBePVThuFU/wbv IVPulRxuKRgII9lX6uPQwRhGwrt1yAfXGtz/eZR1Hn+MN1OYcuwU8sMhK7BxBqYK 2kzpNUYfJM/pKFvMxJIAi8SucCXZkY9km6gE6GjD5iVQlG7fmPy09qlvimlvCKDA URyQ0bySEDPHUqhp5CugnQn3HvjG+MyKlSS2vYN4jglOVUdlelxl87o8z3EVnKb/ HMD69S9w2/Ud+bgfVHg0WFbXcWCWytkZQIYAoly1BAfKmjB6cCvNtDqSkTEd8CrL GRApTrn+4HXM+9v3/Q0b+9diXpfl2/UMS1c6WYGLVe7DKhHYCiug== X-Virus-Scanned: amavisd-new at usg-ed-osssrv.wdc.com Received: from usg-ed-osssrv.wdc.com ([127.0.0.1]) by usg-ed-osssrv.wdc.com (usg-ed-osssrv.wdc.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id lBUqwaZs0eDT for ; Wed, 23 Mar 2022 01:19:22 -0700 (PDT) Received: from washi.fujisawa.hgst.com (washi.fujisawa.hgst.com [10.149.53.254]) by usg-ed-osssrv.wdc.com (Postfix) with ESMTPSA id 4KNh8p3QGpz1Rwrw; Wed, 23 Mar 2022 01:19:22 -0700 (PDT) From: Damien Le Moal To: linux-ide@vger.kernel.org Cc: Paul Menzel Subject: [PATCH 1/4] ata: libata-sata: Simplify sata_link_resume() interface Date: Wed, 23 Mar 2022 17:17:37 +0900 Message-Id: <20220323081740.540006-2-damien.lemoal@opensource.wdc.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220323081740.540006-1-damien.lemoal@opensource.wdc.com> References: <20220323081740.540006-1-damien.lemoal@opensource.wdc.com> MIME-Version: 1.0 X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_PASS, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-ide@vger.kernel.org When called directly outside of sata_link_hardreset(), the debounce timing array passed to sata_link_resume() is always the array returned by sata_ehc_deb_timing() for the target link. Based on this, the interface of sata_link_resume() can be simplified by removing the params argument. The timing array is infered locally using sata_ehc_deb_timing(). To allow sata_link_hardreset() to specify a timing array, the helper function __sata_link_resume() is introduced and sata_link_resume() implemented using this helper. Signed-off-by: Damien Le Moal --- drivers/ata/libata-core.c | 3 +-- drivers/ata/libata-sata.c | 42 +++++++++++++++++++++---------------- drivers/ata/sata_inic162x.c | 3 +-- drivers/ata/sata_nv.c | 3 +-- include/linux/libata.h | 4 +--- 5 files changed, 28 insertions(+), 27 deletions(-) diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index cceedde51126..1bdb6e78f0ed 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -3575,7 +3575,6 @@ int ata_std_prereset(struct ata_link *link, unsigned long deadline) { struct ata_port *ap = link->ap; struct ata_eh_context *ehc = &link->eh_context; - const unsigned long *timing = sata_ehc_deb_timing(ehc); int rc; /* if we're about to do hardreset, nothing more to do */ @@ -3584,7 +3583,7 @@ int ata_std_prereset(struct ata_link *link, unsigned long deadline) /* if SATA, resume link */ if (ap->flags & ATA_FLAG_SATA) { - rc = sata_link_resume(link, timing, deadline); + rc = sata_link_resume(link, deadline); /* whine about phy resume failure but proceed */ if (rc && rc != -EOPNOTSUPP) ata_link_warn(link, diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c index 044a16daa2d4..86f1475e5bca 100644 --- a/drivers/ata/libata-sata.c +++ b/drivers/ata/libata-sata.c @@ -279,22 +279,9 @@ int sata_link_debounce(struct ata_link *link, const unsigned long *params, } EXPORT_SYMBOL_GPL(sata_link_debounce); -/** - * sata_link_resume - resume SATA link - * @link: ATA link to resume SATA - * @params: timing parameters { interval, duration, timeout } in msec - * @deadline: deadline jiffies for the operation - * - * Resume SATA phy @link and debounce it. - * - * LOCKING: - * Kernel thread context (may sleep) - * - * RETURNS: - * 0 on success, -errno on failure. - */ -int sata_link_resume(struct ata_link *link, const unsigned long *params, - unsigned long deadline) +static int __sata_link_resume(struct ata_link *link, + const unsigned long *timing, + unsigned long deadline) { int tries = ATA_LINK_RESUME_TRIES; u32 scontrol, serror; @@ -335,7 +322,7 @@ int sata_link_resume(struct ata_link *link, const unsigned long *params, ata_link_warn(link, "link resume succeeded after %d retries\n", ATA_LINK_RESUME_TRIES - tries); - if ((rc = sata_link_debounce(link, params, deadline))) + if ((rc = sata_link_debounce(link, timing, deadline))) return rc; /* clear SError, some PHYs require this even for SRST to work */ @@ -344,6 +331,25 @@ int sata_link_resume(struct ata_link *link, const unsigned long *params, return rc != -EINVAL ? rc : 0; } + +/** + * sata_link_resume - resume SATA link + * @link: ATA link to resume SATA + * @deadline: deadline jiffies for the operation + * + * Resume SATA phy @link and debounce it. + * + * LOCKING: + * Kernel thread context (may sleep) + * + * RETURNS: + * 0 on success, -errno on failure. + */ +int sata_link_resume(struct ata_link *link, unsigned long deadline) +{ + return __sata_link_resume(link, + sata_ehc_deb_timing(&link->eh_context), deadline); +} EXPORT_SYMBOL_GPL(sata_link_resume); /** @@ -568,7 +574,7 @@ int sata_link_hardreset(struct ata_link *link, const unsigned long *timing, ata_msleep(link->ap, 1); /* bring link back */ - rc = sata_link_resume(link, timing, deadline); + rc = __sata_link_resume(link, timing, deadline); if (rc) goto out; /* if link is offline nothing more to do */ diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c index 11e518f0111c..8d4d041cc724 100644 --- a/drivers/ata/sata_inic162x.c +++ b/drivers/ata/sata_inic162x.c @@ -621,7 +621,6 @@ static int inic_hardreset(struct ata_link *link, unsigned int *class, struct ata_port *ap = link->ap; void __iomem *port_base = inic_port_base(ap); void __iomem *idma_ctl = port_base + PORT_IDMA_CTL; - const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context); int rc; /* hammer it into sane state */ @@ -632,7 +631,7 @@ static int inic_hardreset(struct ata_link *link, unsigned int *class, ata_msleep(ap, 1); writew(0, idma_ctl); - rc = sata_link_resume(link, timing, deadline); + rc = sata_link_resume(link, deadline); if (rc) { ata_link_warn(link, "failed to resume link after reset (errno=%d)\n", diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index 7f14d0d31057..b5f27eac86b1 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c @@ -1529,7 +1529,6 @@ static int nv_hardreset(struct ata_link *link, unsigned int *class, sata_link_hardreset(link, sata_deb_timing_hotplug, deadline, NULL, NULL); else { - const unsigned long *timing = sata_ehc_deb_timing(ehc); int rc; if (!(ehc->i.flags & ATA_EHI_QUIET)) @@ -1537,7 +1536,7 @@ static int nv_hardreset(struct ata_link *link, unsigned int *class, "nv: skipping hardreset on occupied port\n"); /* make sure the link is online */ - rc = sata_link_resume(link, timing, deadline); + rc = sata_link_resume(link, deadline); /* whine about phy resume failure but proceed */ if (rc && rc != -EOPNOTSUPP) ata_link_warn(link, "failed to resume link (errno=%d)\n", diff --git a/include/linux/libata.h b/include/linux/libata.h index 9b1d3d8b1252..e89d612326f6 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -1171,8 +1171,7 @@ extern int sata_set_spd(struct ata_link *link); extern int sata_link_hardreset(struct ata_link *link, const unsigned long *timing, unsigned long deadline, bool *online, int (*check_ready)(struct ata_link *)); -extern int sata_link_resume(struct ata_link *link, const unsigned long *params, - unsigned long deadline); +extern int sata_link_resume(struct ata_link *link, unsigned long deadline); extern void ata_eh_analyze_ncq_error(struct ata_link *link); #else static inline const unsigned long * @@ -1205,7 +1204,6 @@ static inline int sata_link_hardreset(struct ata_link *link, return -EOPNOTSUPP; } static inline int sata_link_resume(struct ata_link *link, - const unsigned long *params, unsigned long deadline) { return -EOPNOTSUPP; From patchwork Wed Mar 23 08:17:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Damien Le Moal X-Patchwork-Id: 1608493 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=wdc.com header.i=@wdc.com header.a=rsa-sha256 header.s=dkim.wdc.com header.b=hkxHlf9o; dkim=pass (2048-bit key; unprotected) header.d=opensource.wdc.com header.i=@opensource.wdc.com header.a=rsa-sha256 header.s=dkim header.b=Rj+GM+I7; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=2620:137:e000::1:20; helo=out1.vger.email; envelope-from=linux-ide-owner@vger.kernel.org; receiver=) Received: from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20]) by bilbo.ozlabs.org (Postfix) with ESMTP id 4KNh980Mv8z9s0r for ; Wed, 23 Mar 2022 19:19:40 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242584AbiCWIVF (ORCPT ); Wed, 23 Mar 2022 04:21:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43990 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242576AbiCWIUz (ORCPT ); Wed, 23 Mar 2022 04:20:55 -0400 Received: from esa5.hgst.iphmx.com (esa5.hgst.iphmx.com [216.71.153.144]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0123E5EDD2 for ; Wed, 23 Mar 2022 01:19:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1648023563; x=1679559563; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=B8TYeHAp0j3AZlA/STOL4yQI1w21+ola/hye7BV8YCk=; b=hkxHlf9oRRRhlfmHjnPgHU4KgKBfufpKU86UkTlQSRLQ/L9Bvi8t0pUp B9AJZDKckFLOJj/8OvQ/p36YYsjzC06zPheLIgiBkb16SXLuW0wNh9Is/ mzvDshfZ3hErC+DgHVHCf50UhGNkjOwltpRbPRnLm/R7ABnwxLTkDfwMT 1nVbfPNC/ronFGfLgLHhtZjAGOzdyo76mVniPovnvA98vYofvZBYxgnGt 2MtyeyIJE1MUQI/HBBwxG2x+T5VJ+MpzScmx1yTSfuMvYhNOA3VB3w90T NqwPlqzB0mt06b27I0JQ3ptABtPigqFKjGQdPnqghcOdPE3SVomLqpWI5 g==; X-IronPort-AV: E=Sophos;i="5.90,203,1643644800"; d="scan'208";a="196047607" Received: from uls-op-cesaip01.wdc.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 23 Mar 2022 16:19:22 +0800 IronPort-SDR: nuOpeuBp7x3vX3fwavdfYLRGTXfswwJGtoUif+wbJLvTehZQ484yi+ynWvLcXnwLk0QtUVU+cQ 6SzzD0Y8f/keUi7NLMO7t5XeImfkSMUAos3/EjL4okeGvTPle0NVLIHw99hzzjRbP5Q9I+A0Mq u18wqVTIWaEjb5I5P04n1dZpj3Kakuu0V4dOVY5TJCUhKivym70qqoIMCMbNhhlzSEZ8lFNjH0 3/P7TqmdZg+aYIUDe7iO6k2fit3B9p7+ozhjXGchidIXyZTwSAMII+znaq+e+TJktmvTWccxCq kNAUa8Q4SyoCggWyOull/sE0 Received: from uls-op-cesaip02.wdc.com ([10.248.3.37]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Mar 2022 00:51:18 -0700 IronPort-SDR: e8RSxH/QBAhZI/MgPLzramlEsmGqqI9uvZdsv8IjVqnhpS2V73+9icV0wVMmdIu1yKiUdtpWua yFlL6VnUKtAyhwttz2fnkIFJ7yFo8B6ePQnjB9IEgKF2s3ZH1A6lgM6YUPU5UZVfY+yu15dkxe 0cT8zN8uw0aYESougX9sCmweqbceyD2hLYZQgHdHRQzbtMhqr1OUh+bFHPGFPU+9UyKm5lT9Ll Z6SZBfls2qHcQ0u7vc/5idSRlRf/mlHBB7x+jzoHVXXMyuxsU1zopcWDlXVPrtg0TXXHrXffhp XIQ= WDCIronportException: Internal Received: from usg-ed-osssrv.wdc.com ([10.3.10.180]) by uls-op-cesaip02.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Mar 2022 01:19:24 -0700 Received: from usg-ed-osssrv.wdc.com (usg-ed-osssrv.wdc.com [127.0.0.1]) by usg-ed-osssrv.wdc.com (Postfix) with ESMTP id 4KNh8r1Znqz1SVnx for ; Wed, 23 Mar 2022 01:19:24 -0700 (PDT) Authentication-Results: usg-ed-osssrv.wdc.com (amavisd-new); dkim=pass reason="pass (just generated, assumed good)" header.d=opensource.wdc.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d= opensource.wdc.com; h=content-transfer-encoding:mime-version :references:in-reply-to:x-mailer:message-id:date:subject:to :from; s=dkim; t=1648023563; x=1650615564; bh=B8TYeHAp0j3AZlA/ST OL4yQI1w21+ola/hye7BV8YCk=; b=Rj+GM+I7iyYmY9a4OdnLUz/LxqoJW4rRu0 zdrQPFz1/y2T03Vwu9Sn8P07Aw/MpiC08cX09cT3b8Z0Oq0ncNDm/8oVl87/FpfF uLJ20LxyGJFgtU/DuAHQlUL9cNGDmr32uAgPne8t+wJQC+8ph8lzkSP3zIljq994 026eZk2disFQaW8ZnLHE3GAJUJmuxitfsF8154HsV4Dloh2nE5xJxSmjMTsVwcLp g8rGRgKckKqVGgjB09zDil5nuQvxEcEr9h3mcJQxbL9wa+oUXtB3IjEDleIKx+EQ +/WZN2agcvUTO2+HNShL8OIvYkhh2EDi2MNIdylWGDBuM6H/c1wg== X-Virus-Scanned: amavisd-new at usg-ed-osssrv.wdc.com Received: from usg-ed-osssrv.wdc.com ([127.0.0.1]) by usg-ed-osssrv.wdc.com (usg-ed-osssrv.wdc.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id C_ZEiB6jpYlF for ; Wed, 23 Mar 2022 01:19:23 -0700 (PDT) Received: from washi.fujisawa.hgst.com (washi.fujisawa.hgst.com [10.149.53.254]) by usg-ed-osssrv.wdc.com (Postfix) with ESMTPSA id 4KNh8q1KnCz1Rvlx; Wed, 23 Mar 2022 01:19:23 -0700 (PDT) From: Damien Le Moal To: linux-ide@vger.kernel.org Cc: Paul Menzel Subject: [PATCH 2/4] ata: libata-sata: Introduce struct sata_deb_timing Date: Wed, 23 Mar 2022 17:17:38 +0900 Message-Id: <20220323081740.540006-3-damien.lemoal@opensource.wdc.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220323081740.540006-1-damien.lemoal@opensource.wdc.com> References: <20220323081740.540006-1-damien.lemoal@opensource.wdc.com> MIME-Version: 1.0 X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_PASS, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-ide@vger.kernel.org The SATA interval, duration and timeout debounce timing parameters (sata_deb_timing_normal, sata_deb_timing_hotplug and sata_deb_timing_long) are defined as an array of 3 unsigned long integers. The entries are referenced directly without any index macro indicating the name of the field being accessed. Introduce struct sata_deb_timing to more clearly define the values and their use. The interface of the sata_ehc_deb_timing(), sata_link_hardreset() and sata_link_debounce() functions is modified to take this new structure as argument. Signed-off-by: Damien Le Moal --- drivers/ata/ahci.c | 7 +++--- drivers/ata/ahci_qoriq.c | 5 ++-- drivers/ata/ahci_xgene.c | 3 ++- drivers/ata/libahci.c | 5 ++-- drivers/ata/libata-core.c | 5 ++-- drivers/ata/libata-pmp.c | 2 +- drivers/ata/libata-sata.c | 47 ++++++++++++++++++++++++++----------- drivers/ata/libata-sff.c | 6 ++--- drivers/ata/sata_highbank.c | 4 ++-- drivers/ata/sata_mv.c | 8 +++---- drivers/ata/sata_nv.c | 2 +- drivers/ata/sata_sil24.c | 2 +- include/linux/libata.h | 38 +++++++++++++++++++----------- 13 files changed, 80 insertions(+), 54 deletions(-) diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 84456c05e845..ccf94e8a3056 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -787,7 +787,6 @@ static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class, static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class, unsigned long deadline) { - const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context); struct ata_port *ap = link->ap; struct ahci_port_priv *pp = ap->private_data; struct ahci_host_priv *hpriv = ap->host->private_data; @@ -811,8 +810,10 @@ static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class, tf.status = ATA_BUSY; ata_tf_to_fis(&tf, 0, 0, d2h_fis); - rc = sata_link_hardreset(link, timing, deadline, &online, - ahci_check_ready); + rc = sata_link_hardreset(link, + sata_ehc_deb_timing(&link->eh_context), + deadline, &online, + ahci_check_ready); if (sata_scr_read(link, SCR_STATUS, &sstatus) != 0 || (sstatus & 0xf) != 1) diff --git a/drivers/ata/ahci_qoriq.c b/drivers/ata/ahci_qoriq.c index 6cd61842ad48..a5eeedadf0c9 100644 --- a/drivers/ata/ahci_qoriq.c +++ b/drivers/ata/ahci_qoriq.c @@ -90,7 +90,6 @@ MODULE_DEVICE_TABLE(acpi, ahci_qoriq_acpi_match); static int ahci_qoriq_hardreset(struct ata_link *link, unsigned int *class, unsigned long deadline) { - const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context); void __iomem *port_mmio = ahci_port_base(link->ap); u32 px_cmd, px_is, px_val; struct ata_port *ap = link->ap; @@ -126,8 +125,8 @@ static int ahci_qoriq_hardreset(struct ata_link *link, unsigned int *class, tf.status = ATA_BUSY; ata_tf_to_fis(&tf, 0, 0, d2h_fis); - rc = sata_link_hardreset(link, timing, deadline, &online, - ahci_check_ready); + rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context), + deadline, &online, ahci_check_ready); /* restore the PxCMD and PxIS on ls1021 */ if (ls1021a_workaround) { diff --git a/drivers/ata/ahci_xgene.c b/drivers/ata/ahci_xgene.c index 7bb5db17f864..8d1598232e92 100644 --- a/drivers/ata/ahci_xgene.c +++ b/drivers/ata/ahci_xgene.c @@ -350,7 +350,8 @@ static void xgene_ahci_set_phy_cfg(struct xgene_ahci_context *ctx, int channel) static int xgene_ahci_do_hardreset(struct ata_link *link, unsigned long deadline, bool *online) { - const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context); + const struct sata_deb_timing *timing = + sata_ehc_deb_timing(&link->eh_context); struct ata_port *ap = link->ap; struct ahci_host_priv *hpriv = ap->host->private_data; struct xgene_ahci_context *ctx = hpriv->plat_data; diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index cf8c7fd59ada..0ac3b382fa52 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c @@ -1549,7 +1549,6 @@ static int ahci_pmp_retry_softreset(struct ata_link *link, unsigned int *class, int ahci_do_hardreset(struct ata_link *link, unsigned int *class, unsigned long deadline, bool *online) { - const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context); struct ata_port *ap = link->ap; struct ahci_port_priv *pp = ap->private_data; struct ahci_host_priv *hpriv = ap->host->private_data; @@ -1564,8 +1563,8 @@ int ahci_do_hardreset(struct ata_link *link, unsigned int *class, tf.status = ATA_BUSY; ata_tf_to_fis(&tf, 0, 0, d2h_fis); - rc = sata_link_hardreset(link, timing, deadline, online, - ahci_check_ready); + rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context), + deadline, online, ahci_check_ready); hpriv->start_engine(ap); diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 1bdb6e78f0ed..ffad7c1afb64 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -3616,12 +3616,13 @@ EXPORT_SYMBOL_GPL(ata_std_prereset); int sata_std_hardreset(struct ata_link *link, unsigned int *class, unsigned long deadline) { - const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context); bool online; int rc; /* do hardreset */ - rc = sata_link_hardreset(link, timing, deadline, &online, NULL); + rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context), + deadline, &online, NULL); + return online ? -EAGAIN : rc; } EXPORT_SYMBOL_GPL(sata_std_hardreset); diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c index e2e9cbd405fa..1ea472ddbe3f 100644 --- a/drivers/ata/libata-pmp.c +++ b/drivers/ata/libata-pmp.c @@ -851,7 +851,7 @@ static int sata_pmp_eh_handle_disabled_links(struct ata_port *ap) /* Some PMPs require hardreset sequence to get * SError.N working. */ - sata_link_hardreset(link, sata_deb_timing_normal, + sata_link_hardreset(link, &sata_deb_timing_normal, ata_deadline(jiffies, ATA_TMOUT_INTERNAL_QUICK), NULL, NULL); diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c index 86f1475e5bca..be46833d77a6 100644 --- a/drivers/ata/libata-sata.c +++ b/drivers/ata/libata-sata.c @@ -16,12 +16,31 @@ #include "libata.h" #include "libata-transport.h" -/* debounce timing parameters in msecs { interval, duration, timeout } */ -const unsigned long sata_deb_timing_normal[] = { 5, 100, 2000 }; +/* + * Debounce timing parameters in msecs. + */ +const struct sata_deb_timing sata_deb_timing_normal = +{ + .interval = 5, + .duration = 100, + .timeout = 2000 +}; EXPORT_SYMBOL_GPL(sata_deb_timing_normal); -const unsigned long sata_deb_timing_hotplug[] = { 25, 500, 2000 }; + +const struct sata_deb_timing sata_deb_timing_hotplug = +{ + .interval = 25, + .duration = 500, + .timeout = 2000 +}; EXPORT_SYMBOL_GPL(sata_deb_timing_hotplug); -const unsigned long sata_deb_timing_long[] = { 100, 2000, 5000 }; + +const struct sata_deb_timing sata_deb_timing_long = +{ + .interval = 100, + .duration = 2000, + .timeout = 5000 +}; EXPORT_SYMBOL_GPL(sata_deb_timing_long); /** @@ -211,7 +230,7 @@ EXPORT_SYMBOL_GPL(ata_tf_from_fis); /** * sata_link_debounce - debounce SATA phy status * @link: ATA link to debounce SATA phy status for - * @params: timing parameters { interval, duration, timeout } in msec + * @timing: debounce timing * @deadline: deadline jiffies for the operation * * Make sure SStatus of @link reaches stable state, determined by @@ -230,16 +249,15 @@ EXPORT_SYMBOL_GPL(ata_tf_from_fis); * RETURNS: * 0 on success, -errno on failure. */ -int sata_link_debounce(struct ata_link *link, const unsigned long *params, +int sata_link_debounce(struct ata_link *link, + const struct sata_deb_timing *timing, unsigned long deadline) { - unsigned long interval = params[0]; - unsigned long duration = params[1]; unsigned long last_jiffies, t; u32 last, cur; int rc; - t = ata_deadline(jiffies, params[2]); + t = ata_deadline(jiffies, timing->timeout); if (time_before(t, deadline)) deadline = t; @@ -251,7 +269,7 @@ int sata_link_debounce(struct ata_link *link, const unsigned long *params, last_jiffies = jiffies; while (1) { - ata_msleep(link->ap, interval); + ata_msleep(link->ap, timing->interval); if ((rc = sata_scr_read(link, SCR_STATUS, &cur))) return rc; cur &= 0xf; @@ -261,7 +279,7 @@ 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, timing->duration))) return 0; continue; } @@ -280,7 +298,7 @@ int sata_link_debounce(struct ata_link *link, const unsigned long *params, EXPORT_SYMBOL_GPL(sata_link_debounce); static int __sata_link_resume(struct ata_link *link, - const unsigned long *timing, + const struct sata_deb_timing *timing, unsigned long deadline) { int tries = ATA_LINK_RESUME_TRIES; @@ -511,7 +529,7 @@ EXPORT_SYMBOL_GPL(sata_set_spd); /** * sata_link_hardreset - reset link via SATA phy reset * @link: link to reset - * @timing: timing parameters { interval, duration, timeout } in msec + * @timing: debounce timing parameters * @deadline: deadline jiffies for the operation * @online: optional out parameter indicating link onlineness * @check_ready: optional callback to check link readiness @@ -532,7 +550,8 @@ EXPORT_SYMBOL_GPL(sata_set_spd); * RETURNS: * 0 on success, -errno otherwise. */ -int sata_link_hardreset(struct ata_link *link, const unsigned long *timing, +int sata_link_hardreset(struct ata_link *link, + const struct sata_deb_timing *timing, unsigned long deadline, bool *online, int (*check_ready)(struct ata_link *)) { diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index b3be7a8f5bea..ffd085b09abc 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c @@ -2030,13 +2030,11 @@ EXPORT_SYMBOL_GPL(ata_sff_softreset); int sata_sff_hardreset(struct ata_link *link, unsigned int *class, unsigned long deadline) { - struct ata_eh_context *ehc = &link->eh_context; - const unsigned long *timing = sata_ehc_deb_timing(ehc); bool online; int rc; - rc = sata_link_hardreset(link, timing, deadline, &online, - ata_sff_check_ready); + rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context), + deadline, &online, ata_sff_check_ready); if (online) *class = ata_sff_dev_classify(link->device, 1, NULL); diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c index dfbf9493e451..16da571e8083 100644 --- a/drivers/ata/sata_highbank.c +++ b/drivers/ata/sata_highbank.c @@ -385,7 +385,7 @@ static int highbank_initialize_phys(struct device *dev, void __iomem *addr) static int ahci_highbank_hardreset(struct ata_link *link, unsigned int *class, unsigned long deadline) { - static const unsigned long timing[] = { 5, 100, 500}; + const struct sata_deb_timing timing = { 5, 100, 500}; struct ata_port *ap = link->ap; struct ahci_port_priv *pp = ap->private_data; struct ahci_host_priv *hpriv = ap->host->private_data; @@ -405,7 +405,7 @@ static int ahci_highbank_hardreset(struct ata_link *link, unsigned int *class, do { highbank_cphy_disable_overrides(link->ap->port_no); - rc = sata_link_hardreset(link, timing, deadline, &online, NULL); + rc = sata_link_hardreset(link, &timing, deadline, &online, NULL); highbank_cphy_override_lane(link->ap->port_no); /* If the status is 1, we are connected, but the link did not diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index de5bd02cad44..8ad0f3776c48 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c @@ -3633,11 +3633,9 @@ static int mv_hardreset(struct ata_link *link, unsigned int *class, /* Workaround for errata FEr SATA#10 (part 2) */ do { - const unsigned long *timing = - sata_ehc_deb_timing(&link->eh_context); - - rc = sata_link_hardreset(link, timing, deadline + extra, - &online, NULL); + rc = sata_link_hardreset(link, + sata_ehc_deb_timing(&link->eh_context), + deadline + extra, &online, NULL); rc = online ? -EAGAIN : rc; if (rc) return rc; diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index b5f27eac86b1..5c8db8f8c47f 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c @@ -1526,7 +1526,7 @@ static int nv_hardreset(struct ata_link *link, unsigned int *class, */ if (!(link->ap->pflags & ATA_PFLAG_LOADING) && !ata_dev_enabled(link->device)) - sata_link_hardreset(link, sata_deb_timing_hotplug, deadline, + sata_link_hardreset(link, &sata_deb_timing_hotplug, deadline, NULL, NULL); else { int rc; diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index 2fef6ce93f07..4c4ff67bf06a 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c @@ -735,7 +735,7 @@ static int sil24_hardreset(struct ata_link *link, unsigned int *class, /* SStatus oscillates between zero and valid status after * DEV_RST, debounce it. */ - rc = sata_link_debounce(link, sata_deb_timing_long, deadline); + rc = sata_link_debounce(link, &sata_deb_timing_long, deadline); if (rc) { reason = "PHY debouncing failed"; goto err; diff --git a/include/linux/libata.h b/include/linux/libata.h index e89d612326f6..166263d9bbc7 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -1150,17 +1150,26 @@ extern void ata_scsi_cmd_error_handler(struct Scsi_Host *host, struct ata_port * * SATA specific code - drivers/ata/libata-sata.c */ #ifdef CONFIG_SATA_HOST -extern const unsigned long sata_deb_timing_normal[]; -extern const unsigned long sata_deb_timing_hotplug[]; -extern const unsigned long sata_deb_timing_long[]; -static inline const unsigned long * +/* + * Debounce timing parameters in msecs. + */ +struct sata_deb_timing { + unsigned long interval; + unsigned long duration; + unsigned long timeout; +}; + +extern const struct sata_deb_timing sata_deb_timing_normal; +extern const struct sata_deb_timing sata_deb_timing_hotplug; +extern const struct sata_deb_timing sata_deb_timing_long; + +static inline const struct sata_deb_timing * sata_ehc_deb_timing(struct ata_eh_context *ehc) { if (ehc->i.flags & ATA_EHI_HOTPLUGGED) - return sata_deb_timing_hotplug; - else - return sata_deb_timing_normal; + return &sata_deb_timing_hotplug; + return &sata_deb_timing_normal; } extern int sata_scr_valid(struct ata_link *link); @@ -1169,12 +1178,13 @@ extern int sata_scr_write(struct ata_link *link, int reg, u32 val); extern int sata_scr_write_flush(struct ata_link *link, int reg, u32 val); extern int sata_set_spd(struct ata_link *link); extern int sata_link_hardreset(struct ata_link *link, - const unsigned long *timing, unsigned long deadline, - bool *online, int (*check_ready)(struct ata_link *)); + const struct sata_deb_timing *timing, + unsigned long deadline, bool *online, + int (*check_ready)(struct ata_link *)); extern int sata_link_resume(struct ata_link *link, unsigned long deadline); extern void ata_eh_analyze_ncq_error(struct ata_link *link); #else -static inline const unsigned long * +static inline const struct sata_deb_timing * sata_ehc_deb_timing(struct ata_eh_context *ehc) { return NULL; @@ -1194,9 +1204,8 @@ static inline int sata_scr_write_flush(struct ata_link *link, int reg, u32 val) } static inline int sata_set_spd(struct ata_link *link) { return -EOPNOTSUPP; } static inline int sata_link_hardreset(struct ata_link *link, - const unsigned long *timing, - unsigned long deadline, - bool *online, + const struct sata_deb_timing *timing, + unsigned long deadline, bool *online, int (*check_ready)(struct ata_link *)) { if (online) @@ -1211,7 +1220,8 @@ static inline int sata_link_resume(struct ata_link *link, static inline void ata_eh_analyze_ncq_error(struct ata_link *link) { } #endif extern int sata_link_debounce(struct ata_link *link, - const unsigned long *params, unsigned long deadline); + const struct sata_deb_timing *timing, + unsigned long deadline); extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy, bool spm_wakeup); extern int ata_slave_link_init(struct ata_port *ap); From patchwork Wed Mar 23 08:17:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Damien Le Moal X-Patchwork-Id: 1608494 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=wdc.com header.i=@wdc.com header.a=rsa-sha256 header.s=dkim.wdc.com header.b=Ec0Ycxe7; dkim=pass (2048-bit key; unprotected) header.d=opensource.wdc.com header.i=@opensource.wdc.com header.a=rsa-sha256 header.s=dkim header.b=GBTX9SwE; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=2620:137:e000::1:20; helo=out1.vger.email; envelope-from=linux-ide-owner@vger.kernel.org; receiver=) Received: from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20]) by bilbo.ozlabs.org (Postfix) with ESMTP id 4KNh9B5yhSz9s0r for ; Wed, 23 Mar 2022 19:19:42 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242576AbiCWIVI (ORCPT ); Wed, 23 Mar 2022 04:21:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44014 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237876AbiCWIUz (ORCPT ); Wed, 23 Mar 2022 04:20:55 -0400 Received: from esa5.hgst.iphmx.com (esa5.hgst.iphmx.com [216.71.153.144]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EC9695F258 for ; Wed, 23 Mar 2022 01:19:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1648023564; x=1679559564; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=FH3g2J369m+VFqjsSEy8Cr91eBjEqsszX9b0beiRxtg=; b=Ec0Ycxe7xjgy/OzTsjKCnYGAC6OSGlSr105gpufc8ZnU8NOyXDC2uE/3 U4vGavM80vEGlFHtv+fWN/7heRSuph8bHeoaXn6HKUO9nynx9xnRn4sRe 9P9bQf5irbSG+ov6x8mK/RSLu5CzwX227xUaLC+x2KLJ2RpNfijvRx1Pc rkEBpcOVT6AFFJo96LWP7eGPa7lrZ49YVybGXaBzEWVAc14/JASRVXXnO r9Rh3/zmbt4uyBc+M3RyO7dirKrHZpkf6BQbc8dfxZnvRG06/op3Lkml0 jdHblkLo08lmf4VmDHTtznghgMvTHLc38CFzB2vT/HLXQBjJQjkxqlnxS g==; X-IronPort-AV: E=Sophos;i="5.90,203,1643644800"; d="scan'208";a="196047609" Received: from uls-op-cesaip01.wdc.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 23 Mar 2022 16:19:23 +0800 IronPort-SDR: 58fBmP7FN9zSaLQBqlKJlwDnRunMUcXsvIZvyvp8/KHVZqN2BZBhIsd7PDfeWyt497np+5C7ve /KbU1Qo086+0YEue0xMjGaSCBAUnhu4zIZ4W7qIENBCUXSxvBC76kNQc84Jhha0U7hy2Fq1agd OqACqCIChUQNHz7lIJcqckoEHno12vlMNZW+fcMw9Yuy/blnVzFg9s819eSjMvhpFHMBxqnCiy lc8HsYTwVt6oozMxB21V42qYjbu3z9j8jaU5BRF941O48F7YQp429AqjoabKvS+2CN4uKcc0dA fWfEkJDMGARbnlmoxjHr6ini Received: from uls-op-cesaip02.wdc.com ([10.248.3.37]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Mar 2022 00:51:19 -0700 IronPort-SDR: kLOzs1+O/pgDSUokOWr0+6FVUoxhiQjONMzSRC6thu38nCHrE2dyRejebd45YKyZXLGFtvGL/8 uOikXPgg2j0ztn9BMKMr9+xtv50sgnZ7B78oVo56kySCNp5kV1YwLUIbqRvDOzgBRf3gQXNB15 6mNpzZBoZAS13GRAAjc94p+7OUCEOTjyjPc7oyWttDZGxg+SKk6q80T80Dhwr+kjmqRBGqphRv MhGB2QuGm1iCo+ycSL4BPtUq4RufPqkMCFsQFEAh2odYUJ0IjSYFFSQWE/DtRPuIJyKx+e8LYg /20= WDCIronportException: Internal Received: from usg-ed-osssrv.wdc.com ([10.3.10.180]) by uls-op-cesaip02.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Mar 2022 01:19:25 -0700 Received: from usg-ed-osssrv.wdc.com (usg-ed-osssrv.wdc.com [127.0.0.1]) by usg-ed-osssrv.wdc.com (Postfix) with ESMTP id 4KNh8r6dn5z1SHwl for ; Wed, 23 Mar 2022 01:19:24 -0700 (PDT) Authentication-Results: usg-ed-osssrv.wdc.com (amavisd-new); dkim=pass reason="pass (just generated, assumed good)" header.d=opensource.wdc.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d= opensource.wdc.com; h=content-transfer-encoding:mime-version :references:in-reply-to:x-mailer:message-id:date:subject:to :from; s=dkim; t=1648023564; x=1650615565; bh=FH3g2J369m+VFqjsSE y8Cr91eBjEqsszX9b0beiRxtg=; b=GBTX9SwEoFfTj7PJXsvF2Hch4tVGa9B4nd yrec1qCXMO0WUkJx9N7bI1BFtrvz/IrlnjwzDUrGTpnuq+udDQxhTV0CWfEI85ih d/pY/yrh0Jm2uJCTMqIN79gJbNRrW3Vhtcqs3QVCxmmzhYHHH74XX8vM0R9NKNMg sNE8xSCqUKpACQCJccI3zM2e4VjGz5BA/x48Kc86t1PTEP7daDp5PLu475aMCfTy wv6F9vI/l2b4hbeRS/aDEjbNtOzpdoCybMo/5JWwDt/j6XTzt8z64UpA0u9SR25o xQlGiHKw1IisQYDk14eWBLRFMW3/PoXhDGqQJ1O3rqyHZotbdXyg== X-Virus-Scanned: amavisd-new at usg-ed-osssrv.wdc.com Received: from usg-ed-osssrv.wdc.com ([127.0.0.1]) by usg-ed-osssrv.wdc.com (usg-ed-osssrv.wdc.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id lXK8OWDhn04E for ; Wed, 23 Mar 2022 01:19:24 -0700 (PDT) Received: from washi.fujisawa.hgst.com (washi.fujisawa.hgst.com [10.149.53.254]) by usg-ed-osssrv.wdc.com (Postfix) with ESMTPSA id 4KNh8r0B77z1Rwrw; Wed, 23 Mar 2022 01:19:23 -0700 (PDT) From: Damien Le Moal To: linux-ide@vger.kernel.org Cc: Paul Menzel Subject: [PATCH 3/4] ata: libata-sata: Remove debounce delay by default Date: Wed, 23 Mar 2022 17:17:39 +0900 Message-Id: <20220323081740.540006-4-damien.lemoal@opensource.wdc.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220323081740.540006-1-damien.lemoal@opensource.wdc.com> References: <20220323081740.540006-1-damien.lemoal@opensource.wdc.com> MIME-Version: 1.0 X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_PASS, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-ide@vger.kernel.org Many adapters and SATA controllers are fine with accesses to the SControl register right after resuming. For these adapters, the additional 200ms delay implemented in sata_link_resume() is redundant and unnecessarily increase boot time. Drivers can opt out from this additional delay using the ATA_LFLAG_NO_DEBOUNCE_DELAY link flag, but by default, this additional delay exists for all adapters. Reverse the situation and do not add by default this 200ms delay. For adapters that actually need this delay, rename the ATA_LFLAG_NO_DEBOUNCE_DELAY link flag to ATA_LFLAG_DEBOUNCE_DELAY and execute the 200ms delay in sata_link_resume() only if a driver request it using the new link flag. Otherwise, arbitrarily delay by 1ms only. Since ata_piix adapters are known to require the longer delay, specify the ATA_LFLAG_DEBOUNCE_DELAY for all adapters supported by the ata_piix driver. Signed-off-by: Damien Le Moal --- drivers/ata/ahci.c | 12 ++---------- drivers/ata/ahci_brcm.c | 1 - drivers/ata/ata_generic.c | 1 + drivers/ata/ata_piix.c | 17 +++++++++++++++++ drivers/ata/libata-sata.c | 18 +++++++++++------- include/linux/libata.h | 2 +- 6 files changed, 32 insertions(+), 19 deletions(-) diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index ccf94e8a3056..ac1e227a07cd 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -51,7 +51,6 @@ enum board_ids { board_ahci, board_ahci_ign_iferr, board_ahci_low_power, - board_ahci_no_debounce_delay, board_ahci_nomsi, board_ahci_noncq, board_ahci_nosntf, @@ -142,13 +141,6 @@ static const struct ata_port_info ahci_port_info[] = { .udma_mask = ATA_UDMA6, .port_ops = &ahci_ops, }, - [board_ahci_no_debounce_delay] = { - .flags = AHCI_FLAG_COMMON, - .link_flags = ATA_LFLAG_NO_DEBOUNCE_DELAY, - .pio_mask = ATA_PIO4, - .udma_mask = ATA_UDMA6, - .port_ops = &ahci_ops, - }, [board_ahci_nomsi] = { AHCI_HFLAGS (AHCI_HFLAG_NO_MSI), .flags = AHCI_FLAG_COMMON, @@ -445,7 +437,7 @@ static const struct pci_device_id ahci_pci_tbl[] = { board_ahci_al }, /* AMD */ { PCI_VDEVICE(AMD, 0x7800), board_ahci }, /* AMD Hudson-2 */ - { PCI_VDEVICE(AMD, 0x7801), board_ahci_no_debounce_delay }, /* AMD Hudson-2 (AHCI mode) */ + { PCI_VDEVICE(AMD, 0x7801), board_ahci }, /* AMD Hudson-2 (AHCI mode) */ { PCI_VDEVICE(AMD, 0x7900), board_ahci }, /* AMD CZ */ { PCI_VDEVICE(AMD, 0x7901), board_ahci_low_power }, /* AMD Green Sardine */ /* AMD is using RAID class only for ahci controllers */ @@ -583,7 +575,7 @@ static const struct pci_device_id ahci_pci_tbl[] = { { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9230), .driver_data = board_ahci_yes_fbs }, { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9235), - .driver_data = board_ahci_no_debounce_delay }, + .driver_data = board_ahci }, { PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0642), /* highpoint rocketraid 642L */ .driver_data = board_ahci_yes_fbs }, { PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0645), /* highpoint rocketraid 644L */ diff --git a/drivers/ata/ahci_brcm.c b/drivers/ata/ahci_brcm.c index ab8552b1ff2a..e4584aed0ded 100644 --- a/drivers/ata/ahci_brcm.c +++ b/drivers/ata/ahci_brcm.c @@ -333,7 +333,6 @@ static struct ata_port_operations ahci_brcm_platform_ops = { static const struct ata_port_info ahci_brcm_port_info = { .flags = AHCI_FLAG_COMMON | ATA_FLAG_NO_DIPM, - .link_flags = ATA_LFLAG_NO_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .udma_mask = ATA_UDMA6, .port_ops = &ahci_brcm_platform_ops, diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c index 20a32e4d501d..f02c824b26e6 100644 --- a/drivers/ata/ata_generic.c +++ b/drivers/ata/ata_generic.c @@ -165,6 +165,7 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id u16 command; static const struct ata_port_info info = { .flags = ATA_FLAG_SLAVE_POSS, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA5, diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index ade5e894563b..dcfcfb5d8a05 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c @@ -1112,6 +1112,7 @@ static struct ata_port_info piix_port_info[] = { [piix_pata_mwdma] = /* PIIX3 MWDMA only */ { .flags = PIIX_PATA_FLAGS, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA12_ONLY, /* mwdma1-2 ?? CHECK 0 should be ok but slow */ .port_ops = &piix_pata_ops, @@ -1120,6 +1121,7 @@ static struct ata_port_info piix_port_info[] = { [piix_pata_33] = /* PIIX4 at 33MHz */ { .flags = PIIX_PATA_FLAGS, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA12_ONLY, /* mwdma1-2 ?? CHECK 0 should be ok but slow */ .udma_mask = ATA_UDMA2, @@ -1129,6 +1131,7 @@ static struct ata_port_info piix_port_info[] = { [ich_pata_33] = /* ICH0 - ICH at 33Mhz*/ { .flags = PIIX_PATA_FLAGS, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA12_ONLY, /* Check: maybe MWDMA0 is ok */ .udma_mask = ATA_UDMA2, @@ -1138,6 +1141,7 @@ static struct ata_port_info piix_port_info[] = { [ich_pata_66] = /* ICH controllers up to 66MHz */ { .flags = PIIX_PATA_FLAGS, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA12_ONLY, /* MWDMA0 is broken on chip */ .udma_mask = ATA_UDMA4, @@ -1147,6 +1151,7 @@ static struct ata_port_info piix_port_info[] = { [ich_pata_100] = { .flags = PIIX_PATA_FLAGS | PIIX_FLAG_CHECKINTR, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA12_ONLY, .udma_mask = ATA_UDMA5, @@ -1156,6 +1161,7 @@ static struct ata_port_info piix_port_info[] = { [ich_pata_100_nomwdma1] = { .flags = PIIX_PATA_FLAGS | PIIX_FLAG_CHECKINTR, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2_ONLY, .udma_mask = ATA_UDMA5, @@ -1165,6 +1171,7 @@ static struct ata_port_info piix_port_info[] = { [ich5_sata] = { .flags = PIIX_SATA_FLAGS, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA6, @@ -1174,6 +1181,7 @@ static struct ata_port_info piix_port_info[] = { [ich6_sata] = { .flags = PIIX_SATA_FLAGS, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA6, @@ -1183,6 +1191,7 @@ static struct ata_port_info piix_port_info[] = { [ich6m_sata] = { .flags = PIIX_SATA_FLAGS, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA6, @@ -1192,6 +1201,7 @@ static struct ata_port_info piix_port_info[] = { [ich8_sata] = { .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA6, @@ -1201,6 +1211,7 @@ static struct ata_port_info piix_port_info[] = { [ich8_2port_sata] = { .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA6, @@ -1210,6 +1221,7 @@ static struct ata_port_info piix_port_info[] = { [tolapai_sata] = { .flags = PIIX_SATA_FLAGS, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA6, @@ -1219,6 +1231,7 @@ static struct ata_port_info piix_port_info[] = { [ich8m_apple_sata] = { .flags = PIIX_SATA_FLAGS, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA6, @@ -1228,6 +1241,7 @@ static struct ata_port_info piix_port_info[] = { [piix_pata_vmw] = { .flags = PIIX_PATA_FLAGS, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA12_ONLY, /* mwdma1-2 ?? CHECK 0 should be ok but slow */ .udma_mask = ATA_UDMA2, @@ -1241,6 +1255,7 @@ static struct ata_port_info piix_port_info[] = { [ich8_sata_snb] = { .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR | PIIX_FLAG_PIO16, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA6, @@ -1251,6 +1266,7 @@ static struct ata_port_info piix_port_info[] = { { .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR | PIIX_FLAG_PIO16, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA6, @@ -1260,6 +1276,7 @@ static struct ata_port_info piix_port_info[] = { [ich8_2port_sata_byt] = { .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR | PIIX_FLAG_PIO16, + .link_flags = ATA_LFLAG_DEBOUNCE_DELAY, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA6, diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c index be46833d77a6..87ad03c2e49f 100644 --- a/drivers/ata/libata-sata.c +++ b/drivers/ata/libata-sata.c @@ -302,9 +302,18 @@ static int __sata_link_resume(struct ata_link *link, unsigned long deadline) { int tries = ATA_LINK_RESUME_TRIES; + unsigned int db_delay = 1; u32 scontrol, serror; int rc; + /* + * Some PHYs react badly if SControl is pounded immediately after + * resuming. For drivers requesting it, delay 200ms before debouncing. + * Otherwise, only delay by 1ms (arbitrary delay). + */ + if (link->flags & ATA_LFLAG_DEBOUNCE_DELAY) + db_delay = 200; + if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol))) return rc; @@ -317,13 +326,8 @@ static int __sata_link_resume(struct ata_link *link, scontrol = (scontrol & 0x0f0) | 0x300; if ((rc = sata_scr_write(link, SCR_CONTROL, scontrol))) return rc; - /* - * Some PHYs react badly if SStatus is pounded - * immediately after resuming. Delay 200ms before - * debouncing. - */ - if (!(link->flags & ATA_LFLAG_NO_DEBOUNCE_DELAY)) - ata_msleep(link->ap, 200); + + ata_msleep(link->ap, db_delay); /* is SControl restored correctly? */ if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol))) diff --git a/include/linux/libata.h b/include/linux/libata.h index 166263d9bbc7..cc3a8e9c78b0 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -143,7 +143,7 @@ enum { ATA_LFLAG_NO_LPM = (1 << 8), /* disable LPM on this link */ ATA_LFLAG_RST_ONCE = (1 << 9), /* limit recovery to one reset */ ATA_LFLAG_CHANGED = (1 << 10), /* LPM state changed on this link */ - ATA_LFLAG_NO_DEBOUNCE_DELAY = (1 << 11), /* no debounce delay on link resume */ + ATA_LFLAG_DEBOUNCE_DELAY = (1 << 11), /* Debounce delay on link resume */ /* struct ata_port flags */ ATA_FLAG_SLAVE_POSS = (1 << 0), /* host supports slave dev */ From patchwork Wed Mar 23 08:17:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Damien Le Moal X-Patchwork-Id: 1608492 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=wdc.com header.i=@wdc.com header.a=rsa-sha256 header.s=dkim.wdc.com header.b=JqUnYcBV; dkim=pass (2048-bit key; unprotected) header.d=opensource.wdc.com header.i=@opensource.wdc.com header.a=rsa-sha256 header.s=dkim header.b=P3hkvll5; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=2620:137:e000::1:20; helo=out1.vger.email; envelope-from=linux-ide-owner@vger.kernel.org; receiver=) Received: from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20]) by bilbo.ozlabs.org (Postfix) with ESMTP id 4KNh961xjXz9s0r for ; Wed, 23 Mar 2022 19:19:38 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242579AbiCWIVD (ORCPT ); Wed, 23 Mar 2022 04:21:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43992 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242578AbiCWIUz (ORCPT ); Wed, 23 Mar 2022 04:20:55 -0400 Received: from esa5.hgst.iphmx.com (esa5.hgst.iphmx.com [216.71.153.144]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 066AF5F25A for ; Wed, 23 Mar 2022 01:19:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1648023564; x=1679559564; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=4AsyCi0QtNvalf56cLhMHGivuaVEVYo8oFkCqbF7aLE=; b=JqUnYcBVuhUWhVCh+ldDcA4Ejfzib3XAzFNH6/0Ch/WJlwXHt+Amkwyb bj3nOGHsIxdjI1W6zDuxOVk47nXHMRfnoTnDDwSRgaI3IvW65CbeZwjCP uZ9RktHVpp2hOCfzsrGzv6E5ZLPie1tcJzlScLNReme9LVzqkCbbOIueM k//9oBX7zZh/zVNKWxA+vYumCnxUfqcePAf7+IbIwRHSjcVKA3AT7I0BM S8HKlVAnIjulQ0TUAK7MG71aWTiwBgGBsn7a7eWkaPYAzbtlwWwZJol1B pDBzVkg5UpNppVndrozm1rZjMlpltrZLK0rP9OD2i1EBL7rl6ZvWBVuKW g==; X-IronPort-AV: E=Sophos;i="5.90,203,1643644800"; d="scan'208";a="196047610" Received: from uls-op-cesaip01.wdc.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 23 Mar 2022 16:19:24 +0800 IronPort-SDR: VlGZU+JJIajKMVIdV0HUO+gYRoq1rzPFKsgPSszjACrgsSzu5MfH3NJ/Xkm8hqPEdc+VSbcRoM kkmGAKGH9QK9q1HIe2O5d9YwJc4UO0hAoawywASIgbH4Ky6mQvSr5hn1s6PGv8qXaEaWkhHI7Z 2Njct5b5ooAty5hgpuIp6eSE8t0L7rQjenIlz6ESGzpv1ZVESjaMDS3gJ1ezzlMyhwwDhCbM5h e9aRyrWxm1SazVX7Dm0gONhtuD5uJosvB1jVFKjoyv8wfAqjrGE180JT8PmIECBCcHOwahMWo3 P64IVbPQSF3j5az4T1QeYmIO Received: from uls-op-cesaip02.wdc.com ([10.248.3.37]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Mar 2022 00:51:19 -0700 IronPort-SDR: +imk8w8xm9GplaCd1ZNkmmxmnja/r+ttfxDy42q5sqwaUAE33RTv1WskX6/UvomfMIUyeUKeYS 9pD5lwh4s+J3LgAVvm0hSZtXeLmdT7LUFv6Ux6KIvCvwA1sSjpU3cMJxTta8bbLQep6hjSHfuA AyeK0Aic2xGyxl/OpYqwES/gVuszqgIduq/JpBbpriftiqCffiaLZEqH29W+r/CK0YMiN1e4iN HAk83/4Scbo7kh7GwWiJDo/yLk6zYZE0OZq0mccioLAhGCER9txPYl7gbUvxRYAkRSelbyLBtr C6E= WDCIronportException: Internal Received: from usg-ed-osssrv.wdc.com ([10.3.10.180]) by uls-op-cesaip02.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Mar 2022 01:19:26 -0700 Received: from usg-ed-osssrv.wdc.com (usg-ed-osssrv.wdc.com [127.0.0.1]) by usg-ed-osssrv.wdc.com (Postfix) with ESMTP id 4KNh8s3zC8z1Rwrw for ; Wed, 23 Mar 2022 01:19:25 -0700 (PDT) Authentication-Results: usg-ed-osssrv.wdc.com (amavisd-new); dkim=pass reason="pass (just generated, assumed good)" header.d=opensource.wdc.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d= opensource.wdc.com; h=content-transfer-encoding:mime-version :references:in-reply-to:x-mailer:message-id:date:subject:to :from; s=dkim; t=1648023565; x=1650615566; bh=4AsyCi0QtNvalf56cL hMHGivuaVEVYo8oFkCqbF7aLE=; b=P3hkvll5iWj4MouDz+xbVrTm0V6JuiSDGt vt5AP53NyqxTva1O0IlwfzKWc481ndtg2FM0YlnAYQS+o4eOoQaENANROzN5uHFK sp3wqIrXN6wha7YeGf4EhjffRxhlckXXQervy7pGWDaOIAuC41udXJno+IJGZ2Mn akRf6umUc/2WdscMf/dNVgvxWtfpkWxcsIhqndSDtUMvVen/h2cHd1hDnoYF5gVw edKMNxl2NUD/tSzSHM6NFpMaJx+1BdT/nGP4oNLZgaOMlayBj5lWxIQzRDqjpi+Y 1LA04PpP9A3CYb7HHS3FmZ41vY7ESiDSIQGkTWeVjD8ujRW4vZYw== X-Virus-Scanned: amavisd-new at usg-ed-osssrv.wdc.com Received: from usg-ed-osssrv.wdc.com ([127.0.0.1]) by usg-ed-osssrv.wdc.com (usg-ed-osssrv.wdc.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id TpuiZiazvID1 for ; Wed, 23 Mar 2022 01:19:25 -0700 (PDT) Received: from washi.fujisawa.hgst.com (washi.fujisawa.hgst.com [10.149.53.254]) by usg-ed-osssrv.wdc.com (Postfix) with ESMTPSA id 4KNh8r5hCjz1Rvlx; Wed, 23 Mar 2022 01:19:24 -0700 (PDT) From: Damien Le Moal To: linux-ide@vger.kernel.org Cc: Paul Menzel Subject: [PATCH 4/4] ata: libata-sata: Improve sata_link_debounce() Date: Wed, 23 Mar 2022 17:17:40 +0900 Message-Id: <20220323081740.540006-5-damien.lemoal@opensource.wdc.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220323081740.540006-1-damien.lemoal@opensource.wdc.com> References: <20220323081740.540006-1-damien.lemoal@opensource.wdc.com> MIME-Version: 1.0 X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_PASS, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-ide@vger.kernel.org sata_link_debounce() polls the SStatus register DET field to ensure that a stable value is provided, to reliably detect device presence and PHY readiness. Polling is done for at least timing->duration if there is no device detected. For the device detected case, polling last up to deadline to ensure that the PHY becomes ready. However, the PHY ready state is actually never checked, leading to the poll loop duration always reaching the maximum duration. For adapters that do not require a debounce delay (link flag ATA_LFLAG_DEBOUNCE_DELAY no set), add a check to test if DET indicates device present *and* PHY ready and bail out of the polling loop if it does. While at it, add comments to clarify the various checks in sata_link_debounce() polling loop. Signed-off-by: Damien Le Moal --- drivers/ata/libata-sata.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c index 87ad03c2e49f..15423723c9dd 100644 --- a/drivers/ata/libata-sata.c +++ b/drivers/ata/libata-sata.c @@ -276,8 +276,27 @@ int sata_link_debounce(struct ata_link *link, /* DET stable? */ if (cur == last) { + /* + * If the device presence was detected but PHY + * communication is not yet established, wait until + * deadline. + */ if (cur == 1 && time_before(jiffies, deadline)) continue; + + /* + * If PHY is ready and the device is present, and the + * driver did not request debounce delay, bail out early + * assuming that the link is stable. + */ + if (cur == 3 && + !(link->flags & ATA_LFLAG_DEBOUNCE_DELAY)) + return 0; + + /* + * If DET value has remained stable for + * timing->duration, bail out. + */ if (time_after(jiffies, ata_deadline(last_jiffies, timing->duration))) return 0; @@ -288,8 +307,9 @@ int sata_link_debounce(struct ata_link *link, last = cur; last_jiffies = jiffies; - /* Check deadline. If debouncing failed, return - * -EPIPE to tell upper layer to lower link speed. + /* + * If debouncing has not succeeded before dealine, return + * -EPIPE to tell the upper layer to lower the link speed. */ if (time_after(jiffies, deadline)) return -EPIPE;