From: Tokunori Ikegami <ikegami.t@gmail.com> To: miquel.raynal@bootlin.com Cc: linux-mtd@lists.infradead.org, Tokunori Ikegami <ikegami.t@gmail.com>, Ahmad Fatoum <a.fatoum@pengutronix.de>, stable@vger.kernel.org Subject: [PATCH v4 2/3] mtd: cfi_cmdset_0002: Use chip_ready() for write on S29GL064N Date: Thu, 17 Mar 2022 00:54:54 +0900 [thread overview] Message-ID: <20220316155455.162362-3-ikegami.t@gmail.com> (raw) In-Reply-To: <20220316155455.162362-1-ikegami.t@gmail.com> As pointed out by this bug report [1], buffered writes are now broken on S29GL064N. This issue comes from a rework which switched from using chip_good() to chip_ready(), because DQ true data 0xFF is read on S29GL064N and an error returned by chip_good(). One way to solve the issue is to revert the change partially to use chip_ready for S29GL064N. [1] https://lore.kernel.org/r/b687c259-6413-26c9-d4c9-b3afa69ea124@pengutronix.de/ Fixes: dfeae1073583("mtd: cfi_cmdset_0002: Change write buffer to check correct value") Signed-off-by: Tokunori Ikegami <ikegami.t@gmail.com> Tested-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Cc: stable@vger.kernel.org --- drivers/mtd/chips/cfi_cmdset_0002.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c index e68ddf0f7fc0..6c57f85e1b8e 100644 --- a/drivers/mtd/chips/cfi_cmdset_0002.c +++ b/drivers/mtd/chips/cfi_cmdset_0002.c @@ -866,6 +866,23 @@ static int __xipram chip_check(struct map_info *map, struct flchip *chip, chip_check(map, chip, addr, &datum); \ }) +static bool __xipram cfi_use_chip_ready_for_write(struct map_info *map) +{ + struct cfi_private *cfi = map->fldrv_priv; + + return cfi->mfr == CFI_MFR_AMD && cfi->id == 0x0c01; +} + +static int __xipram chip_good_for_write(struct map_info *map, + struct flchip *chip, unsigned long addr, + map_word expected) +{ + if (cfi_use_chip_ready_for_write(map)) + return chip_ready(map, chip, addr); + + return chip_good(map, chip, addr, expected); +} + static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr, int mode) { DECLARE_WAITQUEUE(wait, current); @@ -1686,7 +1703,7 @@ static int __xipram do_write_oneword_once(struct map_info *map, * "chip_good" to avoid the failure due to scheduling. */ if (time_after(jiffies, timeo) && - !chip_good(map, chip, adr, datum)) { + !chip_good_for_write(map, chip, adr, datum)) { xip_enable(map, chip, adr); printk(KERN_WARNING "MTD %s(): software timeout\n", __func__); xip_disable(map, chip, adr); @@ -1694,7 +1711,7 @@ static int __xipram do_write_oneword_once(struct map_info *map, break; } - if (chip_good(map, chip, adr, datum)) { + if (chip_good_for_write(map, chip, adr, datum)) { if (cfi_check_err_status(map, chip, adr)) ret = -EIO; break; @@ -1966,14 +1983,14 @@ static int __xipram do_write_buffer_wait(struct map_info *map, * "chip_good" to avoid the failure due to scheduling. */ if (time_after(jiffies, timeo) && - !chip_good(map, chip, adr, datum)) { + !chip_good_for_write(map, chip, adr, datum)) { pr_err("MTD %s(): software timeout, address:0x%.8lx.\n", __func__, adr); ret = -EIO; break; } - if (chip_good(map, chip, adr, datum)) { + if (chip_good_for_write(map, chip, adr, datum)) { if (cfi_check_err_status(map, chip, adr)) ret = -EIO; break; -- 2.32.0
WARNING: multiple messages have this Message-ID (diff)
From: Tokunori Ikegami <ikegami.t@gmail.com> To: miquel.raynal@bootlin.com Cc: linux-mtd@lists.infradead.org, Tokunori Ikegami <ikegami.t@gmail.com>, Ahmad Fatoum <a.fatoum@pengutronix.de>, stable@vger.kernel.org Subject: [PATCH v4 2/3] mtd: cfi_cmdset_0002: Use chip_ready() for write on S29GL064N Date: Thu, 17 Mar 2022 00:54:54 +0900 [thread overview] Message-ID: <20220316155455.162362-3-ikegami.t@gmail.com> (raw) In-Reply-To: <20220316155455.162362-1-ikegami.t@gmail.com> As pointed out by this bug report [1], buffered writes are now broken on S29GL064N. This issue comes from a rework which switched from using chip_good() to chip_ready(), because DQ true data 0xFF is read on S29GL064N and an error returned by chip_good(). One way to solve the issue is to revert the change partially to use chip_ready for S29GL064N. [1] https://lore.kernel.org/r/b687c259-6413-26c9-d4c9-b3afa69ea124@pengutronix.de/ Fixes: dfeae1073583("mtd: cfi_cmdset_0002: Change write buffer to check correct value") Signed-off-by: Tokunori Ikegami <ikegami.t@gmail.com> Tested-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Cc: stable@vger.kernel.org --- drivers/mtd/chips/cfi_cmdset_0002.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c index e68ddf0f7fc0..6c57f85e1b8e 100644 --- a/drivers/mtd/chips/cfi_cmdset_0002.c +++ b/drivers/mtd/chips/cfi_cmdset_0002.c @@ -866,6 +866,23 @@ static int __xipram chip_check(struct map_info *map, struct flchip *chip, chip_check(map, chip, addr, &datum); \ }) +static bool __xipram cfi_use_chip_ready_for_write(struct map_info *map) +{ + struct cfi_private *cfi = map->fldrv_priv; + + return cfi->mfr == CFI_MFR_AMD && cfi->id == 0x0c01; +} + +static int __xipram chip_good_for_write(struct map_info *map, + struct flchip *chip, unsigned long addr, + map_word expected) +{ + if (cfi_use_chip_ready_for_write(map)) + return chip_ready(map, chip, addr); + + return chip_good(map, chip, addr, expected); +} + static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr, int mode) { DECLARE_WAITQUEUE(wait, current); @@ -1686,7 +1703,7 @@ static int __xipram do_write_oneword_once(struct map_info *map, * "chip_good" to avoid the failure due to scheduling. */ if (time_after(jiffies, timeo) && - !chip_good(map, chip, adr, datum)) { + !chip_good_for_write(map, chip, adr, datum)) { xip_enable(map, chip, adr); printk(KERN_WARNING "MTD %s(): software timeout\n", __func__); xip_disable(map, chip, adr); @@ -1694,7 +1711,7 @@ static int __xipram do_write_oneword_once(struct map_info *map, break; } - if (chip_good(map, chip, adr, datum)) { + if (chip_good_for_write(map, chip, adr, datum)) { if (cfi_check_err_status(map, chip, adr)) ret = -EIO; break; @@ -1966,14 +1983,14 @@ static int __xipram do_write_buffer_wait(struct map_info *map, * "chip_good" to avoid the failure due to scheduling. */ if (time_after(jiffies, timeo) && - !chip_good(map, chip, adr, datum)) { + !chip_good_for_write(map, chip, adr, datum)) { pr_err("MTD %s(): software timeout, address:0x%.8lx.\n", __func__, adr); ret = -EIO; break; } - if (chip_good(map, chip, adr, datum)) { + if (chip_good_for_write(map, chip, adr, datum)) { if (cfi_check_err_status(map, chip, adr)) ret = -EIO; break; -- 2.32.0 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/
next prev parent reply other threads:[~2022-03-16 15:55 UTC|newest] Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-03-16 15:54 [PATCH v4 0/3] mtd: cfi_cmdset_0002: Use chip_ready() for write on S29GL064N Tokunori Ikegami 2022-03-16 15:54 ` Tokunori Ikegami 2022-03-16 15:54 ` [PATCH v4 1/3] mtd: cfi_cmdset_0002: Move and rename chip_check/chip_ready/chip_good_for_write Tokunori Ikegami 2022-03-16 15:54 ` Tokunori Ikegami 2022-03-16 17:15 ` Miquel Raynal 2022-03-16 17:15 ` Miquel Raynal 2022-03-22 2:35 ` Tokunori Ikegami 2022-03-22 2:35 ` Tokunori Ikegami 2022-03-16 15:54 ` Tokunori Ikegami [this message] 2022-03-16 15:54 ` [PATCH v4 2/3] mtd: cfi_cmdset_0002: Use chip_ready() for write on S29GL064N Tokunori Ikegami 2022-03-16 17:21 ` Miquel Raynal 2022-03-16 17:21 ` Miquel Raynal 2022-03-17 10:01 ` Vignesh Raghavendra 2022-03-17 10:01 ` Vignesh Raghavendra 2022-03-17 14:16 ` Ahmad Fatoum 2022-03-17 14:16 ` Ahmad Fatoum 2022-03-22 2:49 ` Tokunori Ikegami 2022-03-22 2:49 ` Tokunori Ikegami 2022-03-28 10:49 ` Ahmad Fatoum 2022-03-28 10:49 ` Ahmad Fatoum 2022-03-28 15:27 ` Tokunori Ikegami 2022-03-28 15:27 ` Tokunori Ikegami 2022-03-22 2:42 ` Tokunori Ikegami 2022-03-22 2:42 ` Tokunori Ikegami 2022-03-22 2:39 ` Tokunori Ikegami 2022-03-22 2:39 ` Tokunori Ikegami 2022-03-21 11:48 ` Thorsten Leemhuis 2022-03-21 11:48 ` Thorsten Leemhuis 2022-03-21 12:35 ` Miquel Raynal 2022-03-21 12:35 ` Miquel Raynal 2022-03-21 12:51 ` Thorsten Leemhuis 2022-03-21 12:51 ` Thorsten Leemhuis 2022-03-21 13:41 ` Miquel Raynal 2022-03-21 13:41 ` Miquel Raynal 2022-03-21 14:17 ` Thorsten Leemhuis 2022-03-21 14:17 ` Thorsten Leemhuis 2022-03-21 14:56 ` Miquel Raynal 2022-03-21 14:56 ` Miquel Raynal 2022-03-21 15:16 ` Thorsten Leemhuis 2022-03-21 15:16 ` Thorsten Leemhuis 2022-03-22 2:51 ` Tokunori Ikegami 2022-03-22 2:51 ` Tokunori Ikegami 2022-03-16 15:54 ` [PATCH v4 3/3] mtd: cfi_cmdset_0002: Add S29GL064N ID definition Tokunori Ikegami 2022-03-16 17:27 ` [PATCH v4 0/3] mtd: cfi_cmdset_0002: Use chip_ready() for write on S29GL064N Miquel Raynal 2022-03-16 17:27 ` Miquel Raynal
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=20220316155455.162362-3-ikegami.t@gmail.com \ --to=ikegami.t@gmail.com \ --cc=a.fatoum@pengutronix.de \ --cc=linux-mtd@lists.infradead.org \ --cc=miquel.raynal@bootlin.com \ --cc=stable@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: linkBe 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.