| From 18ebdf4af3a945217a0e5a84b07a1dadc378f4b5 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 19 Nov 2021 16:03:14 +0100 |
| Subject: mtd: rawnand: Fix nand_choose_best_timings() on unsupported interface |
| |
| From: Herve Codina <herve.codina@bootlin.com> |
| |
| [ Upstream commit 36a65982a98c4bc72fdcfef2c4aaf90193746631 ] |
| |
| When the NV-DDR interface is not supported by the NAND chip, |
| the value of onfi->nvddr_timing_modes is 0. In this case, |
| the best_mode variable value in nand_choose_best_nvddr_timings() |
| is -1. The last for-loop is skipped and the function returns an |
| uninitialized value. |
| If this returned value is 0, the nand_choose_best_sdr_timings() |
| is not executed and no 'best timing' are set. This leads the host |
| controller and the NAND chip working at default mode 0 timing |
| even if a better timing can be used. |
| |
| Fix this uninitialized returned value. |
| |
| nand_choose_best_sdr_timings() is pretty similar to |
| nand_choose_best_nvddr_timings(). Even if onfi->sdr_timing_modes |
| should never be seen as 0, nand_choose_best_sdr_timings() returned |
| value is fixed. |
| |
| Fixes: a9ecc8c814e9 ("mtd: rawnand: Choose the best timings, NV-DDR included") |
| Signed-off-by: Herve Codina <herve.codina@bootlin.com> |
| Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> |
| Link: https://lore.kernel.org/linux-mtd/20211119150316.43080-3-herve.codina@bootlin.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/mtd/nand/raw/nand_base.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c |
| index 5c6b065837eff..a130320de4128 100644 |
| --- a/drivers/mtd/nand/raw/nand_base.c |
| +++ b/drivers/mtd/nand/raw/nand_base.c |
| @@ -926,7 +926,7 @@ int nand_choose_best_sdr_timings(struct nand_chip *chip, |
| struct nand_sdr_timings *spec_timings) |
| { |
| const struct nand_controller_ops *ops = chip->controller->ops; |
| - int best_mode = 0, mode, ret; |
| + int best_mode = 0, mode, ret = -EOPNOTSUPP; |
| |
| iface->type = NAND_SDR_IFACE; |
| |
| @@ -977,7 +977,7 @@ int nand_choose_best_nvddr_timings(struct nand_chip *chip, |
| struct nand_nvddr_timings *spec_timings) |
| { |
| const struct nand_controller_ops *ops = chip->controller->ops; |
| - int best_mode = 0, mode, ret; |
| + int best_mode = 0, mode, ret = -EOPNOTSUPP; |
| |
| iface->type = NAND_NVDDR_IFACE; |
| |
| -- |
| 2.33.0 |
| |