From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.bootlin.com ([62.4.15.54]) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fVZeN-0003ep-3g for linux-mtd@lists.infradead.org; Wed, 20 Jun 2018 09:43:41 +0000 Date: Wed, 20 Jun 2018 11:43:27 +0200 From: Boris Brezillon To: Boris Brezillon , Richard Weinberger , Miquel Raynal , linux-mtd@lists.infradead.org Cc: David Woodhouse , Brian Norris , Marek Vasut , Julien Su , Mason Yang , Subject: Re: [PATCH] mtd: rawnand: All AC chips have a broken GET_FEATURES(TIMINGS). Message-ID: <20180620114327.10540ae7@bbrezillon> In-Reply-To: <20180620094228.10693-1-boris.brezillon@bootlin.com> References: <20180620094228.10693-1-boris.brezillon@bootlin.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , On Wed, 20 Jun 2018 11:42:28 +0200 Boris Brezillon wrote: > From: Mason Yang > > Make sure we flag all broken chips as not supporting this feature. > Also move this logic to a new function to keep things readable. > Crap! I forgot the Fixes and Cc-stable tags. I'll send a new version soon. > Signed-off-by: Mason Yang > Signed-off-by: Boris Brezillon > --- > drivers/mtd/nand/raw/nand_macronix.c | 48 +++++++++++++++++++++++++++--------- > 1 file changed, 36 insertions(+), 12 deletions(-) > > diff --git a/drivers/mtd/nand/raw/nand_macronix.c b/drivers/mtd/nand/raw/nand_macronix.c > index 7ed1f87e742a..49c546c97c6f 100644 > --- a/drivers/mtd/nand/raw/nand_macronix.c > +++ b/drivers/mtd/nand/raw/nand_macronix.c > @@ -17,23 +17,47 @@ > > #include > > +/* > + * Macronix AC series does not support using SET/GET_FEATURES to change > + * the timings unlike what is declared in the parameter page. Unflag > + * this feature to avoid unnecessary downturns. > + */ > +static void macronix_nand_fix_broken_get_timings(struct nand_chip *chip) > +{ > + unsigned int i; > + static const char * const broken_get_timings[] = { > + "MX30LF1G18AC", > + "MX30LF1G28AC", > + "MX30LF2G18AC", > + "MX30LF2G28AC", > + "MX30LF4G18AC", > + "MX30LF4G28AC", > + "MX60LF8G18AC", > + }; > + > + if (!chip->parameters.supports_set_get_features) > + return; > + > + for (i = 0; i < ARRAY_SIZE(broken_get_timings); i++) { > + if (!strcmp(broken_get_timings[i], chip->parameters.model)) > + break; > + } > + > + if (i == ARRAY_SIZE(broken_get_timings)) > + return; > + > + bitmap_clear(chip->parameters.get_feature_list, > + ONFI_FEATURE_ADDR_TIMING_MODE, 1); > + bitmap_clear(chip->parameters.set_feature_list, > + ONFI_FEATURE_ADDR_TIMING_MODE, 1); > +} > + > static int macronix_nand_init(struct nand_chip *chip) > { > if (nand_is_slc(chip)) > chip->bbt_options |= NAND_BBT_SCAN2NDPAGE; > > - /* > - * MX30LF2G18AC chip does not support using SET/GET_FEATURES to change > - * the timings unlike what is declared in the parameter page. Unflag > - * this feature to avoid unnecessary downturns. > - */ > - if (chip->parameters.supports_set_get_features && > - !strcmp("MX30LF2G18AC", chip->parameters.model)) { > - bitmap_clear(chip->parameters.get_feature_list, > - ONFI_FEATURE_ADDR_TIMING_MODE, 1); > - bitmap_clear(chip->parameters.set_feature_list, > - ONFI_FEATURE_ADDR_TIMING_MODE, 1); > - } > + macronix_nand_fix_broken_get_timings(chip); > > return 0; > }