Sverdlin, Alexander (Nokia - DE/Ulm)
2018-11-29 18:15:34 UTC
JESD216 allows "variable address length" and "variable latency" in
Configuration Detection Command Descriptors, in other words "as-is".
And they are still unset during Sector Map Parameter Table parsing,
which led to "map_id" determined erroneously as 0 for, e.g. S25FS128S.
Fixes: b038e8e3b ("mtd: spi-nor: parse SFDP Sector Map Parameter Table")
Signed-off-by: Alexander Sverdlin <***@nokia.com>
---
drivers/mtd/spi-nor/spi-nor.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
index 828d03e..5557c89 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
@@ -2893,6 +2893,16 @@ static const u32 *spi_nor_get_map_in_use(struct spi_nor *nor, const u32 *smpt)
nor->read_opcode = SMPT_CMD_OPCODE(smpt[i]);
addr = smpt[i + 1];
+ /*
+ * JESD216 allows to omit particular address length or latency
+ * specification in the header and at this point they are still
+ * unset, so we need some heuristics. One example is S25FS128S.
+ */
+ if (!nor->addr_width)
+ nor->addr_width = 3;
+ if (!nor->read_dummy)
+ nor->read_dummy = 8;
+
err = spi_nor_read_raw(nor, addr, 1, &data_byte);
if (err)
goto out;
Configuration Detection Command Descriptors, in other words "as-is".
And they are still unset during Sector Map Parameter Table parsing,
which led to "map_id" determined erroneously as 0 for, e.g. S25FS128S.
Fixes: b038e8e3b ("mtd: spi-nor: parse SFDP Sector Map Parameter Table")
Signed-off-by: Alexander Sverdlin <***@nokia.com>
---
drivers/mtd/spi-nor/spi-nor.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
index 828d03e..5557c89 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
@@ -2893,6 +2893,16 @@ static const u32 *spi_nor_get_map_in_use(struct spi_nor *nor, const u32 *smpt)
nor->read_opcode = SMPT_CMD_OPCODE(smpt[i]);
addr = smpt[i + 1];
+ /*
+ * JESD216 allows to omit particular address length or latency
+ * specification in the header and at this point they are still
+ * unset, so we need some heuristics. One example is S25FS128S.
+ */
+ if (!nor->addr_width)
+ nor->addr_width = 3;
+ if (!nor->read_dummy)
+ nor->read_dummy = 8;
+
err = spi_nor_read_raw(nor, addr, 1, &data_byte);
if (err)
goto out;
--
2.4.6
2.4.6