Re: [PATCH v6 4/5] mtd: spi-nor: atmel: Fix unlock_all() for AT25FS010/040
From: Michael Walle
Date: Mon Nov 30 2020 - 09:18:14 EST
Am 2020-11-28 09:25, schrieb Tudor.Ambarus@xxxxxxxxxxxxx:
On 11/26/20 10:26 PM, Michael Walle wrote:
EXTERNAL EMAIL: Do not click links or open attachments unless you know
the content is safe
These flashes have some weird BP bits mapping which aren't supported
in
the current locking code. Just add a simple unlock op to unprotect the
entire flash array which is needed for legacy behavior.
Signed-off-by: Michael Walle <michael@xxxxxxxx>
---
changes since v5
- new patch
drivers/mtd/spi-nor/atmel.c | 53
+++++++++++++++++++++++++++++++++++--
drivers/mtd/spi-nor/core.c | 2 +-
drivers/mtd/spi-nor/core.h | 1 +
3 files changed, 53 insertions(+), 3 deletions(-)
diff --git a/drivers/mtd/spi-nor/atmel.c b/drivers/mtd/spi-nor/atmel.c
index 49d392c6c8bc..fe6a4653823d 100644
--- a/drivers/mtd/spi-nor/atmel.c
+++ b/drivers/mtd/spi-nor/atmel.c
@@ -8,10 +8,59 @@
#include "core.h"
+/*
+ * The Atmel AT25FS010/AT25FS040 parts have some weird configuration
for the
+ * block protection bits. We don't support them. But legacy behaviour
in linux
+ * is to unlock the whole flash array on startup. Therefore, we have
to support
+ * exactly this operation.
+ */
+static int atmel_at25fs_lock(struct spi_nor *nor, loff_t ofs,
uint64_t len)
+{
+ return -EOPNOTSUPP;
+}
+
+static int atmel_at25fs_unlock(struct spi_nor *nor, loff_t ofs,
uint64_t len)
+{
+ /* We only support unlocking the whole flash array */
+ if (ofs || len != nor->params->size)
+ return -EINVAL;
+
+ /*
+ * Write 0x00 to the status register to try to disable the
write
+ * protection. This will fail if SRWD (the datasheet calls it
WPEN) is
+ * set. But there is nothing we can do.
+ */
can't we do the same as you did in 5/5?
Sure, but - assuming it is only used for the legacy unlock all operation
- the
outcome will be the same. It will either keep being locked or all will
be
unlocked.
That being said, I can also change it to the same as the
global_unprotect().
I don't have any option on that other than this is simpler.
-michael