svn commit: r251118 - head/sys/dev/cfi
Brooks Davis
brooks at FreeBSD.org
Thu May 30 01:22:51 UTC 2013
Author: brooks
Date: Thu May 30 01:22:50 2013
New Revision: 251118
URL: http://svnweb.freebsd.org/changeset/base/251118
Log:
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.
Modified:
head/sys/dev/cfi/cfi_core.c
head/sys/dev/cfi/cfi_reg.h
Modified: head/sys/dev/cfi/cfi_core.c
==============================================================================
--- head/sys/dev/cfi/cfi_core.c Thu May 30 01:19:02 2013 (r251117)
+++ head/sys/dev/cfi/cfi_core.c Thu May 30 01:22:50 2013 (r251118)
@@ -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);
}
Modified: head/sys/dev/cfi/cfi_reg.h
==============================================================================
--- head/sys/dev/cfi/cfi_reg.h Thu May 30 01:19:02 2013 (r251117)
+++ head/sys/dev/cfi/cfi_reg.h Thu May 30 01:22:50 2013 (r251118)
@@ -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 */
More information about the svn-src-head
mailing list