Working for me with SB750 and SST25VF080B on a DFI JR 790GX-M3H5, automatic erase > write > verify OK<br><br>
<meta name="qrichtext" content="1"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><style type="text/css">
p, li { white-space: pre-wrap; }
</style>
<p style="margin: 0px; text-indent: 0px;"><span style="color: rgb(0, 0, 0);">Acked-by: Carlos Arnau Perez <<a href="mailto:cemede@gmail.com">cemede@gmail.com</a>></span></p><br><br><div class="gmail_quote">2009/8/10 Carl-Daniel Hailfinger <span dir="ltr"><<a href="mailto:c-d.hailfinger.devel.2006@gmx.net">c-d.hailfinger.devel.2006@gmx.net</a>></span><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Some SPI chip drivers and the generic 1-byte SPI chip write functions<br>
didn't include the automatic erase present in other chip drivers. Since<br>
the majority is definitely auto-erase, change the remaining<br>
explicit-erase cases to be auto-erase as well.<br>
<br>
Signed-off-by: Carl-Daniel Hailfinger <<a href="mailto:c-d.hailfinger.devel.2006@gmx.net">c-d.hailfinger.devel.2006@gmx.net</a>><br>
<br>
Index: flashrom-spi_autoerase_before_write/flash.h<br>
===================================================================<br>
--- flashrom-spi_autoerase_before_write/flash.h (revision 672)<br>
+++ flashrom-spi_autoerase_before_write/flash.h (working copy)<br>
@@ -505,7 +505,6 @@<br>
 int it8716f_spi_send_command(unsigned int writecnt, unsigned int readcnt,<br>
                        const unsigned char *writearr, unsigned char *readarr);<br>
 int it8716f_spi_chip_read(struct flashchip *flash, uint8_t *buf, int start, int len);<br>
-int it8716f_spi_chip_write_1(struct flashchip *flash, uint8_t *buf);<br>
 int it8716f_spi_chip_write_256(struct flashchip *flash, uint8_t *buf);<br>
<br>
 /* sb600spi.c */<br>
Index: flashrom-spi_autoerase_before_write/it87spi.c<br>
===================================================================<br>
--- flashrom-spi_autoerase_before_write/it87spi.c       (revision 672)<br>
+++ flashrom-spi_autoerase_before_write/it87spi.c       (working copy)<br>
@@ -248,32 +248,6 @@<br>
 }<br>
<br>
 /*<br>
- * Program chip using firmware cycle byte programming. (SLOW!)<br>
- * This is for chips which can only handle one byte writes<br>
- * and for chips where memory mapped programming is impossible due to<br>
- * size constraints in IT87* (over 512 kB)<br>
- */<br>
-int it8716f_spi_chip_write_1(struct flashchip *flash, uint8_t *buf)<br>
-{<br>
-       int total_size = 1024 * flash->total_size;<br>
-       int i;<br>
-       int result;<br>
-<br>
-       fast_spi = 0;<br>
-<br>
-       spi_disable_blockprotect();<br>
-       for (i = 0; i < total_size; i++) {<br>
-               result = spi_byte_program(i, buf[i]);<br>
-               while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)<br>
-                       programmer_delay(10);<br>
-       }<br>
-       /* resume normal ops... */<br>
-       OUTB(0x20, it8716f_flashport);<br>
-<br>
-       return 0;<br>
-}<br>
-<br>
-/*<br>
  * IT8716F only allows maximum of 512 kb SPI mapped to LPC memory cycles<br>
  * Need to read this big flash using firmware cycles 3 byte at a time.<br>
  */<br>
@@ -301,8 +275,16 @@<br>
         * mapped access.<br>
         */<br>
        if ((programmer == PROGRAMMER_IT87SPI) || (total_size > 512 * 1024)) {<br>
-               it8716f_spi_chip_write_1(flash, buf);<br>
+               spi_chip_write_1(flash, buf);<br>
        } else {<br>
+               spi_disable_blockprotect();<br>
+               /* Erase first */<br>
+               printf("Erasing flash before programming... ");<br>
+               if (flash->erase(flash)) {<br>
+                       fprintf(stderr, "ERASE FAILED!\n");<br>
+                       return -1;<br>
+               }<br>
+               printf("done.\n");<br>
                for (i = 0; i < total_size / 256; i++) {<br>
                        it8716f_spi_page_program(flash, i, buf);<br>
                }<br>
Index: flashrom-spi_autoerase_before_write/spi.c<br>
===================================================================<br>
--- flashrom-spi_autoerase_before_write/spi.c   (revision 672)<br>
+++ flashrom-spi_autoerase_before_write/spi.c   (working copy)<br>
@@ -963,6 +963,13 @@<br>
        int i;<br>
<br>
        spi_disable_blockprotect();<br>
+       /* Erase first */<br>
+       printf("Erasing flash before programming... ");<br>
+       if (flash->erase(flash)) {<br>
+               fprintf(stderr, "ERASE FAILED!\n");<br>
+               return -1;<br>
+       }<br>
+       printf("done.\n");<br>
        for (i = 0; i < total_size; i++) {<br>
                spi_byte_program(i, buf[i]);<br>
                while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)<br>
Index: flashrom-spi_autoerase_before_write/ft2232_spi.c<br>
===================================================================<br>
--- flashrom-spi_autoerase_before_write/ft2232_spi.c    (revision 672)<br>
+++ flashrom-spi_autoerase_before_write/ft2232_spi.c    (working copy)<br>
@@ -271,6 +271,14 @@<br>
        int total_size = 1024 * flash->total_size;<br>
        int i;<br>
<br>
+       spi_disable_blockprotect();<br>
+       /* Erase first */<br>
+       printf("Erasing flash before programming... ");<br>
+       if (flash->erase(flash)) {<br>
+               fprintf(stderr, "ERASE FAILED!\n");<br>
+               return -1;<br>
+       }<br>
+       printf("done.\n");<br>
        printf_debug("total_size is %d\n", total_size);<br>
        for (i = 0; i < total_size; i += 256) {<br>
                int l, r;<br>
@@ -281,14 +289,12 @@<br>
<br>
                if ((r = spi_nbyte_program(i, &buf[i], l))) {<br>
                        fprintf(stderr, "%s: write fail %d\n", __FUNCTION__, r);<br>
-                       // spi_write_disable();  chip does this for us<br>
                        return 1;<br>
                }<br>
<br>
                while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)<br>
                        /* loop */;<br>
        }<br>
-       // spi_write_disable();  chip does this for us<br>
<br>
        return 0;<br>
 }<br>
Index: flashrom-spi_autoerase_before_write/wbsio_spi.c<br>
===================================================================<br>
--- flashrom-spi_autoerase_before_write/wbsio_spi.c     (revision 672)<br>
+++ flashrom-spi_autoerase_before_write/wbsio_spi.c     (working copy)<br>
@@ -183,29 +183,17 @@<br>
                return 1;<br>
        }<br>
<br>
-       read_memmapped(flash, buf, start, len);<br>
-       return 0;<br>
+       return read_memmapped(flash, buf, start, len);<br>
 }<br>
<br>
 int wbsio_spi_write_1(struct flashchip *flash, uint8_t *buf)<br>
 {<br>
-       int pos, size = flash->total_size * 1024;<br>
-       int result;<br>
+       int size = flash->total_size * 1024;<br>
<br>
-       if (flash->total_size > 1024) {<br>
+       if (size > 1024 * 1024) {<br>
                fprintf(stderr, "%s: Winbond saved on 4 register bits so max chip size is 1024 KB!\n", __func__);<br>
                return 1;<br>
        }<br>
<br>
-       if (flash->erase(flash)) {<br>
-               fprintf(stderr, "ERASE FAILED!\n");<br>
-               return -1;<br>
-       }<br>
-       for (pos = 0; pos < size; pos++) {<br>
-               result = spi_byte_program(pos, buf[pos]);<br>
-               while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)<br>
-                       programmer_delay(10);<br>
-       }<br>
-       spi_write_disable();<br>
-       return 0;<br>
+       return spi_chip_write_1(flash, buf);<br>
 }<br>
Index: flashrom-spi_autoerase_before_write/sb600spi.c<br>
===================================================================<br>
--- flashrom-spi_autoerase_before_write/sb600spi.c      (revision 672)<br>
+++ flashrom-spi_autoerase_before_write/sb600spi.c      (working copy)<br>
@@ -45,12 +45,14 @@<br>
        return spi_read_chunked(flash, buf, start, len, 8);<br>
 }<br>
<br>
+/* FIXME: SB600 can write 5 bytes per transaction. */<br>
 int sb600_spi_write_1(struct flashchip *flash, uint8_t *buf)<br>
 {<br>
        int rc = 0, i;<br>
        int total_size = flash->total_size * 1024;<br>
        int result;<br>
<br>
+       spi_disable_blockprotect();<br>
        /* Erase first */<br>
        printf("Erasing flash before programming... ");<br>
        if (flash->erase(flash)) {<br>
@@ -61,7 +63,6 @@<br>
<br>
        printf("Programming flash");<br>
        for (i = 0; i < total_size; i++, buf++) {<br>
-               spi_disable_blockprotect();<br>
                result = spi_byte_program(i, *buf);<br>
                /* wait program complete. */<br>
                if (i % 0x8000 == 0)<br>
<font color="#888888"><br>
<br>
--<br>
<a href="http://www.hailfinger.org/" target="_blank">http://www.hailfinger.org/</a><br>
<br>
<br>
_______________________________________________<br>
flashrom mailing list<br>
<a href="mailto:flashrom@flashrom.org">flashrom@flashrom.org</a><br>
<a href="http://www.flashrom.org/mailman/listinfo/flashrom" target="_blank">http://www.flashrom.org/mailman/listinfo/flashrom</a><br>
</font></blockquote></div><br>