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 */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to