summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbrooks <brooks@FreeBSD.org>2013-05-30 01:22:50 +0000
committerbrooks <brooks@FreeBSD.org>2013-05-30 01:22:50 +0000
commit9bf497cb85133de1caf43db4c48c5f19a3f4e342 (patch)
tree6299251079cb994f2371ee493e84aa9bdc111232
parenteeccce259710f21dd4331291eca8fc9fdfc64b33 (diff)
downloadFreeBSD-src-9bf497cb85133de1caf43db4c48c5f19a3f4e342.zip
FreeBSD-src-9bf497cb85133de1caf43db4c48c5f19a3f4e342.tar.gz
MFP4 @217311
Intel and Sharp flash power on with their blocks in a "locked" state. Unlocked them before attempting to perform an erase or write action and relock when the action is complete.
-rw-r--r--sys/dev/cfi/cfi_core.c20
-rw-r--r--sys/dev/cfi/cfi_reg.h3
2 files changed, 23 insertions, 0 deletions
diff --git a/sys/dev/cfi/cfi_core.c b/sys/dev/cfi/cfi_core.c
index c7d0db9..083f5fc 100644
--- a/sys/dev/cfi/cfi_core.c
+++ b/sys/dev/cfi/cfi_core.c
@@ -409,6 +409,16 @@ cfi_write_block(struct cfi_softc *sc)
register_t intr;
int error, i;
+ /* Intel flash must be unlocked before modification */
+ switch (sc->sc_cmdset) {
+ case CFI_VEND_INTEL_ECS:
+ case CFI_VEND_INTEL_SCS:
+ cfi_write(sc, sc->sc_wrofs, CFI_INTEL_LBS);
+ cfi_write(sc, sc->sc_wrofs, CFI_INTEL_UB);
+ cfi_write(sc, sc->sc_wrofs, CFI_BCS_READ_ARRAY);
+ break;
+ }
+
/* Erase the block. */
switch (sc->sc_cmdset) {
case CFI_VEND_INTEL_ECS:
@@ -477,6 +487,16 @@ cfi_write_block(struct cfi_softc *sc)
out:
cfi_write(sc, 0, CFI_BCS_READ_ARRAY);
+
+ /* Relock Intel flash */
+ switch (sc->sc_cmdset) {
+ case CFI_VEND_INTEL_ECS:
+ case CFI_VEND_INTEL_SCS:
+ cfi_write(sc, sc->sc_wrofs, CFI_INTEL_LBS);
+ cfi_write(sc, sc->sc_wrofs, CFI_INTEL_LB);
+ cfi_write(sc, sc->sc_wrofs, CFI_BCS_READ_ARRAY);
+ break;
+ }
return (error);
}
diff --git a/sys/dev/cfi/cfi_reg.h b/sys/dev/cfi/cfi_reg.h
index d492678..7c22211 100644
--- a/sys/dev/cfi/cfi_reg.h
+++ b/sys/dev/cfi/cfi_reg.h
@@ -105,8 +105,11 @@ struct cfi_qry {
#define CFI_BCS_READ_ARRAY 0xff
/* Intel commands. */
+#define CFI_INTEL_LB 0x01 /* Lock Block */
+#define CFI_INTEL_LBS 0x60 /* Lock Block Setup */
#define CFI_INTEL_READ_ID 0x90 /* Read Identifier */
#define CFI_INTEL_PP_SETUP 0xc0 /* Protection Program Setup */
+#define CFI_INTEL_UB 0xd0 /* Unlock Block */
/* NB: these are addresses for 16-bit accesses */
#define CFI_INTEL_PLR 0x80 /* Protection Lock Register */
OpenPOWER on IntegriCloud