diff options
author | brooks <brooks@FreeBSD.org> | 2013-05-30 01:22:50 +0000 |
---|---|---|
committer | brooks <brooks@FreeBSD.org> | 2013-05-30 01:22:50 +0000 |
commit | 9bf497cb85133de1caf43db4c48c5f19a3f4e342 (patch) | |
tree | 6299251079cb994f2371ee493e84aa9bdc111232 | |
parent | eeccce259710f21dd4331291eca8fc9fdfc64b33 (diff) | |
download | FreeBSD-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.c | 20 | ||||
-rw-r--r-- | sys/dev/cfi/cfi_reg.h | 3 |
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 */ |