public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
From: Boris Brezillon <boris.brezillon@bootlin.com>
To: Tokunori Ikegami <ikegami@allied-telesis.co.jp>
Cc: boris.brezillon@free-electrons.com,
	Fabio Bettoni <fbettoni@gmail.com>,
	Chris Packham <chris.packham@alliedtelesis.co.nz>,
	Joakim Tjernlund <Joakim.Tjernlund@infinera.com>,
	linux-mtd@lists.infradead.org
Subject: Re: [PATCH v3 05/11] mtd: cfi_cmdset_0002: Split do_write_oneword() to reduce function size
Date: Mon, 5 Nov 2018 14:32:17 +0100	[thread overview]
Message-ID: <20181105143217.1a25846b@bbrezillon> (raw)
In-Reply-To: <20181025163219.25788-6-ikegami@allied-telesis.co.jp>

On Fri, 26 Oct 2018 01:32:13 +0900
Tokunori Ikegami <ikegami@allied-telesis.co.jp> wrote:

> Reduce the size of do_write_oneword() by extracting a helper function
> for the hardware access.
> 
> Signed-off-by: Tokunori Ikegami <ikegami@allied-telesis.co.jp>
> Reviewed-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
> Cc: Fabio Bettoni <fbettoni@gmail.com>
> Co: Hauke Mehrtens <hauke@hauke-m.de>
> Co: Koen Vandeputte <koen.vandeputte@ncentric.com>
> Cc: Chris Packham <chris.packham@alliedtelesis.co.nz>
> Cc: Joakim Tjernlund <Joakim.Tjernlund@infinera.com>
> Cc: Boris Brezillon <boris.brezillon@free-electrons.com>
> Cc: linux-mtd@lists.infradead.org
> ---
> Changes since v2:
> - Just update the commit message for the comment
> - Add Reviewed-by tag.
> 
> Changes since v1:
> - Add the patch.
> 
>  drivers/mtd/chips/cfi_cmdset_0002.c | 89 ++++++++++++++++-------------
>  1 file changed, 50 insertions(+), 39 deletions(-)
> 
> diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
> index a3fa2d7b1ba0..ae2d8bd7154e 100644
> --- a/drivers/mtd/chips/cfi_cmdset_0002.c
> +++ b/drivers/mtd/chips/cfi_cmdset_0002.c
> @@ -1547,11 +1547,10 @@ static int cfi_amdstd_lock_user_prot_reg(struct mtd_info *mtd, loff_t from,
>  				   do_otp_lock, 1);
>  }
>  
> -static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip,
> -				     unsigned long adr, map_word datum,
> -				     int mode)
> +static int __xipram do_write_oneword_once(struct map_info *map, struct flchip *chip,
> +					  unsigned long adr, map_word datum,
> +					  int mode, struct cfi_private *cfi)
>  {
> -	struct cfi_private *cfi = map->fldrv_priv;
>  	unsigned long timeo = jiffies + HZ;
>  	/*
>  	 * We use a 1ms + 1 jiffies generic timeout for writes (most devices
> @@ -1564,42 +1563,7 @@ static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip,
>  	 */
>  	unsigned long uWriteTimeout = (HZ / 1000) + 1;
>  	int ret = 0;
> -	map_word oldd;
> -	int retry_cnt = 0;
> -
> -	adr += chip->start;
> -
> -	mutex_lock(&chip->mutex);
> -	ret = get_chip(map, chip, adr, mode);
> -	if (ret) {
> -		mutex_unlock(&chip->mutex);
> -		return ret;
> -	}
>  
> -	pr_debug("MTD %s(): WRITE 0x%.8lx(0x%.8lx)\n",
> -		 __func__, adr, datum.x[0]);
> -
> -	if (mode == FL_OTP_WRITE)
> -		otp_enter(map, chip, adr, map_bankwidth(map));
> -
> -	/*
> -	 * Check for a NOP for the case when the datum to write is already
> -	 * present - it saves time and works around buggy chips that corrupt
> -	 * data at other locations when 0xff is written to a location that
> -	 * already contains 0xff.
> -	 */
> -	oldd = map_read(map, adr);
> -	if (map_word_equal(map, oldd, datum)) {
> -		pr_debug("MTD %s(): NOP\n",
> -		       __func__);
> -		goto op_done;
> -	}
> -
> -	XIP_INVAL_CACHED_RANGE(map, adr, map_bankwidth(map));
> -	ENABLE_VPP(map);
> -	xip_disable(map, chip, adr);
> -
> - retry:
>  	cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
>  	cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
>  	cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
> @@ -1642,6 +1606,53 @@ static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip,
>  		UDELAY(map, chip, adr, 1);
>  	}
>  
> +	return ret;
> +}
> +
> +static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip,
> +				     unsigned long adr, map_word datum,
> +				     int mode)
> +{
> +	struct cfi_private *cfi = map->fldrv_priv;
> +	int ret = 0;
> +	map_word oldd;
> +	int retry_cnt = 0;
> +
> +	adr += chip->start;
> +
> +	mutex_lock(&chip->mutex);
> +	ret = get_chip(map, chip, adr, mode);
> +	if (ret) {
> +		mutex_unlock(&chip->mutex);
> +		return ret;
> +	}
> +
> +	pr_debug("MTD %s(): WRITE 0x%.8lx(0x%.8lx)\n",
> +		 __func__, adr, datum.x[0]);
> +
> +	if (mode == FL_OTP_WRITE)
> +		otp_enter(map, chip, adr, map_bankwidth(map));
> +
> +	/*
> +	 * Check for a NOP for the case when the datum to write is already
> +	 * present - it saves time and works around buggy chips that corrupt
> +	 * data at other locations when 0xff is written to a location that
> +	 * already contains 0xff.
> +	 */
> +	oldd = map_read(map, adr);
> +	if (map_word_equal(map, oldd, datum)) {
> +		pr_debug("MTD %s(): NOP\n",
> +		       __func__);
> +		goto op_done;
> +	}
> +
> +	XIP_INVAL_CACHED_RANGE(map, adr, map_bankwidth(map));
> +	ENABLE_VPP(map);
> +	xip_disable(map, chip, adr);
> +
> + retry:
> +	ret = do_write_oneword_once(map, chip, adr, datum, mode, cfi);
> +
>  	/* Did we succeed? */

We usually place the ret code check just after the call to the function
returning this ret code:

	ret = do_write_oneword_once(map, chip, adr, datum, mode, cfi);
	if (ret) {
		...
	}

And I don't think we need the "Did we succeed?" comment, since it's
pretty obvious what this check does.

One extra thing you could do to make this piece of code more readable
is use a for loop for the retry logic:

	for (retry_count = 0; retry_count < MAX_RETRIES; retry_count++)	{
		ret = do_write_oneword_once(map, chip, adr, datum,
					    mode, cfi);
		if (!ret)
			break;

		/* reset on all failures. */
		map_write(map, CMD(0xF0), chip->start);
                /* FIXME - should have reset delay before continuing */
	}

>  	if (ret) {
>  		/* reset on all failures. */

  reply	other threads:[~2018-11-05 13:32 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-25 16:32 [PATCH v3 00/11] mtd: cfi_cmdset_0002: Fix flash write issue for OpenWrt Project Tokunori Ikegami
2018-10-25 16:32 ` [PATCH v3 01/11] mtd: cfi_cmdset_0002: Change do_write_oneword() to use chip_good() Tokunori Ikegami
2018-11-05 10:15   ` Boris Brezillon
2018-11-05 12:03     ` Joakim Tjernlund
2018-11-05 12:52       ` Boris Brezillon
2018-11-05 13:22         ` Joakim Tjernlund
2018-11-05 13:58           ` Boris Brezillon
2018-11-06  0:25     ` IKEGAMI Tokunori
2018-11-06  8:33       ` Boris Brezillon
2018-11-06  9:37         ` IKEGAMI Tokunori
2018-11-06  9:47         ` IKEGAMI Tokunori
2019-01-22 15:49           ` Tokunori Ikegami
2019-01-22 16:58             ` Joakim Tjernlund
2019-01-23 11:56               ` Tokunori Ikegami
2019-01-23 12:13                 ` Joakim Tjernlund
2019-01-23 12:34                   ` Tokunori Ikegami
2019-01-29 17:15                   ` Tokunori Ikegami
2018-10-25 16:32 ` [PATCH v3 02/11] mtd: cfi_cmdset_0002: Remove chip_ready() from do_write_buffer() Tokunori Ikegami
2018-11-05 13:03   ` Boris Brezillon
2018-11-06 10:12     ` IKEGAMI Tokunori
2018-10-25 16:32 ` [PATCH v3 03/11] mtd: cfi_cmdset_0002: Remove goto statement " Tokunori Ikegami
2018-11-05 13:14   ` Boris Brezillon
2018-11-06  0:32     ` IKEGAMI Tokunori
2018-10-25 16:32 ` [PATCH v3 04/11] mtd: cfi_cmdset_0002: Call xip_enable() once only in do_write_buffer() Tokunori Ikegami
2018-11-05 13:20   ` Boris Brezillon
2018-11-06  0:42     ` IKEGAMI Tokunori
2018-10-25 16:32 ` [PATCH v3 05/11] mtd: cfi_cmdset_0002: Split do_write_oneword() to reduce function size Tokunori Ikegami
2018-11-05 13:32   ` Boris Brezillon [this message]
2018-11-06  0:45     ` IKEGAMI Tokunori
2018-10-25 16:32 ` [PATCH v3 06/11] mtd: cfi_cmdset_0002: Split do_write_oneword() op_done goto statement Tokunori Ikegami
2018-10-25 16:32 ` [PATCH v3 07/11] mtd: cfi_cmdset_0002: Remove op_done goto statement from do_write_oneword() Tokunori Ikegami
2018-10-25 16:32 ` [PATCH v3 08/11] mtd: cfi_cmdset_0002: Remove retry " Tokunori Ikegami
2018-10-25 16:32 ` [PATCH v3 09/11] mtd: cfi_cmdset_0002: Split write-to-buffer-reset sequence Tokunori Ikegami
2018-10-25 16:32 ` [PATCH v3 10/11] mtd: cfi_cmdset_0002: Split to wait write buffer to check if completed Tokunori Ikegami
2018-10-25 16:32 ` [PATCH v3 11/11] mtd: cfi_cmdset_0002: Split do_write_oneword() to reduce exit paths Tokunori Ikegami

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=20181105143217.1a25846b@bbrezillon \
    --to=boris.brezillon@bootlin.com \
    --cc=Joakim.Tjernlund@infinera.com \
    --cc=boris.brezillon@free-electrons.com \
    --cc=chris.packham@alliedtelesis.co.nz \
    --cc=fbettoni@gmail.com \
    --cc=ikegami@allied-telesis.co.jp \
    --cc=linux-mtd@lists.infradead.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox