From: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
To: Jens Axboe <axboe@kernel.dk>
Cc: Michael Schmitz <schmitzmic@gmail.com>,
Geert Uytterhoeven <geert@linux-m68k.org>,
Christoph Hellwig <hch@lst.de>,
linux-ide@vger.kernel.org, linux-m68k@lists.linux-m68k.org,
linux-kernel@vger.kernel.org, b.zolnierkie@samsung.com
Subject: [PATCH v3 19/27] ata: move sata_link_{debounce,resume}() to libata-sata.c
Date: Thu, 27 Feb 2020 19:22:18 +0100 [thread overview]
Message-ID: <20200227182226.19188-20-b.zolnierkie@samsung.com> (raw)
In-Reply-To: <20200227182226.19188-1-b.zolnierkie@samsung.com>
* move sata_link_{debounce,resume}() to libata-sata.c
* add static inline for CONFIG_SATA_HOST=n case (only one,
for sata_link_resume() is needed)
Code size savings on m68k arch using (modified) atari_defconfig:
text data bss dec hex filename
before:
32816 572 40 33428 8294 drivers/ata/libata-core.o
after:
32724 572 40 33336 8238 drivers/ata/libata-core.o
Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
---
drivers/ata/libata-core.c | 138 --------------------------------------
drivers/ata/libata-sata.c | 138 ++++++++++++++++++++++++++++++++++++++
include/linux/libata.h | 14 ++--
3 files changed, 148 insertions(+), 142 deletions(-)
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 13214ebd0e5c..4ca81ef7c8bd 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -3485,144 +3485,6 @@ int ata_wait_after_reset(struct ata_link *link, unsigned long deadline,
}
EXPORT_SYMBOL_GPL(ata_wait_after_reset);
-/**
- * sata_link_debounce - debounce SATA phy status
- * @link: ATA link to debounce SATA phy status for
- * @params: timing parameters { interval, duration, timeout } in msec
- * @deadline: deadline jiffies for the operation
- *
- * Make sure SStatus of @link reaches stable state, determined by
- * holding the same value where DET is not 1 for @duration polled
- * every @interval, before @timeout. Timeout constraints the
- * beginning of the stable state. Because DET gets stuck at 1 on
- * some controllers after hot unplugging, this functions waits
- * until timeout then returns 0 if DET is stable at 1.
- *
- * @timeout is further limited by @deadline. The sooner of the
- * two is used.
- *
- * LOCKING:
- * Kernel thread context (may sleep)
- *
- * RETURNS:
- * 0 on success, -errno on failure.
- */
-int sata_link_debounce(struct ata_link *link, const unsigned long *params,
- 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]);
- if (time_before(t, deadline))
- deadline = t;
-
- if ((rc = sata_scr_read(link, SCR_STATUS, &cur)))
- return rc;
- cur &= 0xf;
-
- last = cur;
- last_jiffies = jiffies;
-
- while (1) {
- ata_msleep(link->ap, interval);
- if ((rc = sata_scr_read(link, SCR_STATUS, &cur)))
- return rc;
- cur &= 0xf;
-
- /* DET stable? */
- if (cur == last) {
- if (cur == 1 && time_before(jiffies, deadline))
- continue;
- if (time_after(jiffies,
- ata_deadline(last_jiffies, duration)))
- return 0;
- continue;
- }
-
- /* unstable, start over */
- last = cur;
- last_jiffies = jiffies;
-
- /* Check deadline. If debouncing failed, return
- * -EPIPE to tell upper layer to lower link speed.
- */
- if (time_after(jiffies, deadline))
- return -EPIPE;
- }
-}
-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)
-{
- int tries = ATA_LINK_RESUME_TRIES;
- u32 scontrol, serror;
- int rc;
-
- if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol)))
- return rc;
-
- /*
- * Writes to SControl sometimes get ignored under certain
- * controllers (ata_piix SIDPR). Make sure DET actually is
- * cleared.
- */
- do {
- 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_DB_DELAY))
- ata_msleep(link->ap, 200);
-
- /* is SControl restored correctly? */
- if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol)))
- return rc;
- } while ((scontrol & 0xf0f) != 0x300 && --tries);
-
- if ((scontrol & 0xf0f) != 0x300) {
- ata_link_warn(link, "failed to resume link (SControl %X)\n",
- scontrol);
- return 0;
- }
-
- if (tries < ATA_LINK_RESUME_TRIES)
- ata_link_warn(link, "link resume succeeded after %d retries\n",
- ATA_LINK_RESUME_TRIES - tries);
-
- if ((rc = sata_link_debounce(link, params, deadline)))
- return rc;
-
- /* clear SError, some PHYs require this even for SRST to work */
- if (!(rc = sata_scr_read(link, SCR_ERROR, &serror)))
- rc = sata_scr_write(link, SCR_ERROR, serror);
-
- return rc != -EINVAL ? rc : 0;
-}
-EXPORT_SYMBOL_GPL(sata_link_resume);
-
/**
* ata_std_prereset - prepare for reset
* @link: ATA link to be reset
diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c
index d66afdc33d54..34852fced999 100644
--- a/drivers/ata/libata-sata.c
+++ b/drivers/ata/libata-sata.c
@@ -196,6 +196,144 @@ void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf)
}
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
+ * @deadline: deadline jiffies for the operation
+ *
+ * Make sure SStatus of @link reaches stable state, determined by
+ * holding the same value where DET is not 1 for @duration polled
+ * every @interval, before @timeout. Timeout constraints the
+ * beginning of the stable state. Because DET gets stuck at 1 on
+ * some controllers after hot unplugging, this functions waits
+ * until timeout then returns 0 if DET is stable at 1.
+ *
+ * @timeout is further limited by @deadline. The sooner of the
+ * two is used.
+ *
+ * LOCKING:
+ * Kernel thread context (may sleep)
+ *
+ * RETURNS:
+ * 0 on success, -errno on failure.
+ */
+int sata_link_debounce(struct ata_link *link, const unsigned long *params,
+ 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]);
+ if (time_before(t, deadline))
+ deadline = t;
+
+ if ((rc = sata_scr_read(link, SCR_STATUS, &cur)))
+ return rc;
+ cur &= 0xf;
+
+ last = cur;
+ last_jiffies = jiffies;
+
+ while (1) {
+ ata_msleep(link->ap, interval);
+ if ((rc = sata_scr_read(link, SCR_STATUS, &cur)))
+ return rc;
+ cur &= 0xf;
+
+ /* DET stable? */
+ if (cur == last) {
+ if (cur == 1 && time_before(jiffies, deadline))
+ continue;
+ if (time_after(jiffies,
+ ata_deadline(last_jiffies, duration)))
+ return 0;
+ continue;
+ }
+
+ /* unstable, start over */
+ last = cur;
+ last_jiffies = jiffies;
+
+ /* Check deadline. If debouncing failed, return
+ * -EPIPE to tell upper layer to lower link speed.
+ */
+ if (time_after(jiffies, deadline))
+ return -EPIPE;
+ }
+}
+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)
+{
+ int tries = ATA_LINK_RESUME_TRIES;
+ u32 scontrol, serror;
+ int rc;
+
+ if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol)))
+ return rc;
+
+ /*
+ * Writes to SControl sometimes get ignored under certain
+ * controllers (ata_piix SIDPR). Make sure DET actually is
+ * cleared.
+ */
+ do {
+ 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_DB_DELAY))
+ ata_msleep(link->ap, 200);
+
+ /* is SControl restored correctly? */
+ if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol)))
+ return rc;
+ } while ((scontrol & 0xf0f) != 0x300 && --tries);
+
+ if ((scontrol & 0xf0f) != 0x300) {
+ ata_link_warn(link, "failed to resume link (SControl %X)\n",
+ scontrol);
+ return 0;
+ }
+
+ if (tries < ATA_LINK_RESUME_TRIES)
+ ata_link_warn(link, "link resume succeeded after %d retries\n",
+ ATA_LINK_RESUME_TRIES - tries);
+
+ if ((rc = sata_link_debounce(link, params, deadline)))
+ return rc;
+
+ /* clear SError, some PHYs require this even for SRST to work */
+ if (!(rc = sata_scr_read(link, SCR_ERROR, &serror)))
+ rc = sata_scr_write(link, SCR_ERROR, serror);
+
+ return rc != -EINVAL ? rc : 0;
+}
+EXPORT_SYMBOL_GPL(sata_link_resume);
+
/**
* sata_link_scr_lpm - manipulate SControl IPM and SPM fields
* @link: ATA link to manipulate SControl for
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 3f0bdc2c30d3..3981e413f582 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -1079,10 +1079,6 @@ static inline int ata_port_is_dummy(struct ata_port *ap)
extern int ata_std_prereset(struct ata_link *link, unsigned long deadline);
extern int ata_wait_after_reset(struct ata_link *link, unsigned long deadline,
int (*check_ready)(struct ata_link *link));
-extern int sata_link_debounce(struct ata_link *link,
- const unsigned long *params, unsigned long deadline);
-extern int sata_link_resume(struct ata_link *link, const unsigned long *params,
- unsigned long deadline);
extern int sata_link_hardreset(struct ata_link *link,
const unsigned long *timing, unsigned long deadline,
bool *online, int (*check_ready)(struct ata_link *));
@@ -1196,6 +1192,8 @@ extern int sata_scr_read(struct ata_link *link, int reg, u32 *val);
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_resume(struct ata_link *link, const unsigned long *params,
+ unsigned long deadline);
#else
static inline int sata_scr_valid(struct ata_link *link) { return 0; }
static inline int sata_scr_read(struct ata_link *link, int reg, u32 *val)
@@ -1211,7 +1209,15 @@ static inline int sata_scr_write_flush(struct ata_link *link, int reg, u32 val)
return -EOPNOTSUPP;
}
static inline int sata_set_spd(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;
+}
#endif
+extern int sata_link_debounce(struct ata_link *link,
+ const unsigned long *params, 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);
--
2.24.1
next prev parent reply other threads:[~2020-02-27 18:22 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20200227182238eucas1p1a4a5546e46b2385057f41528bd759aea@eucas1p1.samsung.com>
2020-02-27 18:21 ` [PATCH v3 00/27] ata: optimize core code size on PATA only setups Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182239eucas1p1166cd4b92fc84479634d6bcf67a672cf@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 01/27] ata: remove stale maintainership information from core code Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182239eucas1p2fe76dcb686bea8f0a527461807b9292e@eucas1p2.samsung.com>
2020-02-27 18:22 ` [PATCH v3 02/27] ata: expose ncq_enable_prio sysfs attribute only on NCQ capable hosts Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182240eucas1p1035546a1fb97cfb9920542af289bf5ca@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 03/27] ata: make SATA_PMP option selectable only if any SATA host driver is enabled Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182240eucas1p272bac5df6668bbb7fee7638b4022a7b1@eucas1p2.samsung.com>
2020-02-27 18:22 ` [PATCH v3 04/27] sata_promise: use ata_cable_sata() Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182241eucas1p10cf24570346137befa34c6fd800db058@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 05/27] ata: simplify ata_scsiop_inq_89() Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182241eucas1p12ef86c45356afb2230871d84dab04431@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 06/27] ata: use COMMAND_LINE_SIZE for ata_force_param_buf[] size Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182242eucas1p16f2af7ee2771f11f21f35c7f80636723@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 07/27] ata: optimize struct ata_force_param size Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182242eucas1p1c1de818156ec670f4744725618375303@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 08/27] ata: optimize ata_scsi_rbuf[] size Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182243eucas1p138c6ac2b516bf318680498caf05ed8df@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 09/27] ata: move EXPORT_SYMBOL_GPL()s close to exported code Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182243eucas1p2d95b61a6a3941ffd3bbead3a6ff4a813@eucas1p2.samsung.com>
2020-02-27 18:22 ` [PATCH v3 10/27] ata: remove EXPORT_SYMBOL_GPL()s not used by modules Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182244eucas1p1e8e9e9567acda2a8cd02844685b6b12a@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 11/27] ata: fix CodingStyle issues in PATA timings code Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182244eucas1p200b1a33d037208b1998a2c9c659ae6f6@eucas1p2.samsung.com>
2020-02-27 18:22 ` [PATCH v3 12/27] ata: separate PATA timings code from libata-core.c Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182245eucas1p219dee00956358ee0018caf2a07a8d602@eucas1p2.samsung.com>
2020-02-27 18:22 ` [PATCH v3 13/27] ata: add CONFIG_SATA_HOST=n version of ata_ncq_enabled() Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182245eucas1p22d7a52d7786fc8cdfa4dc898662ef087@eucas1p2.samsung.com>
2020-02-27 18:22 ` [PATCH v3 14/27] ata: let compiler optimize out ata_dev_config_ncq() on non-SATA hosts Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182246eucas1p2b20cf3379bb774d236e53301e2180252@eucas1p2.samsung.com>
2020-02-27 18:22 ` [PATCH v3 15/27] ata: let compiler optimize out ata_eh_set_lpm() " Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182246eucas1p1d189bdc4d74efcd0c08193ce81b7acd7@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 16/27] ata: start separating SATA specific code from libata-core.c Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182247eucas1p2d83a212c200832402cc17817fab4f650@eucas1p2.samsung.com>
2020-02-27 18:22 ` [PATCH v3 17/27] ata: move sata_scr_*() to libata-sata.c Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182247eucas1p1e9042300d9ad7dd56a1319afb980bdfe@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 18/27] ata: move *sata_set_spd*() " Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182248eucas1p12ce0e7ce8d0653085591eea64604c656@eucas1p1.samsung.com>
2020-02-27 18:22 ` Bartlomiej Zolnierkiewicz [this message]
[not found] ` <CGME20200227182248eucas1p296773cdb2ab7ae9f4114f7052ff08414@eucas1p2.samsung.com>
2020-02-27 18:22 ` [PATCH v3 20/27] ata: move sata_link_hardreset() " Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182248eucas1p12149429eae76c2a869d7323ab9abff1e@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 21/27] ata: move ata_qc_complete_multiple() " Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182249eucas1p14e64b8693929cd84a289909bbdb4506e@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 22/27] ata: move sata_deb_timing_*() " Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182249eucas1p19b8af9cc8b7e8fac33cf400702322c7d@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 23/27] ata: start separating SATA specific code from libata-scsi.c Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182250eucas1p1885e8264beb19b9d6eba638748fd1ff0@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 24/27] ata: move ata_sas_*() to libata-sata.c Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182250eucas1p2140d4ae6f3f65f2b712027dab63de3bd@eucas1p2.samsung.com>
2020-02-27 18:22 ` [PATCH v3 25/27] ata: start separating SATA specific code from libata-eh.c Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182251eucas1p1857e44a8f0860829e821748464bb936d@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 26/27] ata: move ata_eh_analyze_ncq_error() & co. to libata-sata.c Bartlomiej Zolnierkiewicz
[not found] ` <CGME20200227182251eucas1p1f8f29d3df1a07a6997e3b7c3a3176cb3@eucas1p1.samsung.com>
2020-02-27 18:22 ` [PATCH v3 27/27] ata: make "libata.force" kernel parameter optional Bartlomiej Zolnierkiewicz
2020-03-12 14:09 ` [PATCH v3 00/27] ata: optimize core code size on PATA only setups Jens Axboe
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=20200227182226.19188-20-b.zolnierkie@samsung.com \
--to=b.zolnierkie@samsung.com \
--cc=axboe@kernel.dk \
--cc=geert@linux-m68k.org \
--cc=hch@lst.de \
--cc=linux-ide@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-m68k@lists.linux-m68k.org \
--cc=schmitzmic@gmail.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).