diff options
-rw-r--r-- | projects/flashrom/patches/0005-Workaround-MX25-reliable-operation.patch | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/projects/flashrom/patches/0005-Workaround-MX25-reliable-operation.patch b/projects/flashrom/patches/0005-Workaround-MX25-reliable-operation.patch new file mode 100644 index 00000000..f46db48e --- /dev/null +++ b/projects/flashrom/patches/0005-Workaround-MX25-reliable-operation.patch @@ -0,0 +1,74 @@ +diff --git a/cli_classic.c b/cli_classic.c +index 0a09cfd..bba601d 100644 +--- a/cli_classic.c ++++ b/cli_classic.c +@@ -61,6 +61,7 @@ static void cli_classic_usage(const char *name) + " -i | --image <name> only flash image <name> from flash layout\n" + " -o | --output <logfile> log output to <logfile>\n" + " -L | --list-supported print supported devices\n" ++ " | --workaround-mx more reliable operations with MX25* chips\n" + #if CONFIG_PRINT_WIKI == 1 + " -z | --list-supported-wiki print supported devices in wiki syntax\n" + #endif +@@ -109,6 +110,7 @@ int main(int argc, char *argv[]) + struct flashrom_layout *layout = NULL; + enum programmer prog = PROGRAMMER_INVALID; + int ret = 0; ++ const int WORKAROUND_MX = 0x101; + + static const char optstring[] = "r:Rw:v:nNVEfc:l:i:p:Lzho:"; + static const struct option long_options[] = { +@@ -130,6 +132,7 @@ int main(int argc, char *argv[]) + {"help", 0, NULL, 'h'}, + {"version", 0, NULL, 'R'}, + {"output", 1, NULL, 'o'}, ++ {"workaround-mx", 0, NULL, WORKAROUND_MX}, + {NULL, 0, NULL, 0}, + }; + +@@ -337,6 +340,9 @@ int main(int argc, char *argv[]) + } + #endif /* STANDALONE */ + break; ++ case WORKAROUND_MX: ++ workaround_mx = 1; ++ break; + default: + cli_classic_abort_usage(); + break; +diff --git a/programmer.h b/programmer.h +index 1a6216a..6f97cfc 100644 +--- a/programmer.h ++++ b/programmer.h +@@ -650,6 +650,7 @@ enum ich_chipset { + CHIPSET_8_SERIES_WELLSBURG, + CHIPSET_9_SERIES_WILDCAT_POINT, + }; ++extern int workaround_mx; /* workaround for MX25* chips, makes flash operations more reliable, less failures */ + + /* ichspi.c */ + #if CONFIG_INTERNAL == 1 +diff --git a/spi.c b/spi.c +index 894f73f..05aa5d0 100644 +--- a/spi.c ++++ b/spi.c +@@ -30,10 +30,19 @@ + #include "programmer.h" + #include "spi.h" + ++int workaround_mx; /* Make operations with MX25* chips more reliable */ ++ + int spi_send_command(struct flashctx *flash, unsigned int writecnt, + unsigned int readcnt, const unsigned char *writearr, + unsigned char *readarr) + { ++ if (workaround_mx) { ++ const unsigned char cmd[JEDEC_READ_OUTSIZE] = {JEDEC_READ, 0, 0, 0}; ++ unsigned char buf[256]; ++ /* keep flash busy for some time, keep CS warm before sending actual command */ ++ flash->mst->spi.command(flash, sizeof(cmd), sizeof(buf), cmd, buf); ++ } ++ /* actual command */ + return flash->mst->spi.command(flash, writecnt, readcnt, writearr, + readarr); + } |