1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-04-27 15:12:36 +02:00

Introduce proper error checking for SPI programming

Corresponding to flashrom svn r739.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Stefan Reinauer <stepan@coresystems.de>
This commit is contained in:
Carl-Daniel Hailfinger 2009-10-01 13:16:32 +00:00
parent 4010712033
commit de75a5ed7f
2 changed files with 10 additions and 8 deletions

View File

@ -48,9 +48,9 @@ int sb600_spi_read(struct flashchip *flash, uint8_t *buf, int start, int len)
/* FIXME: SB600 can write 5 bytes per transaction. */ /* FIXME: SB600 can write 5 bytes per transaction. */
int sb600_spi_write_1(struct flashchip *flash, uint8_t *buf) int sb600_spi_write_1(struct flashchip *flash, uint8_t *buf)
{ {
int rc = 0, i; int i;
int total_size = flash->total_size * 1024; int total_size = flash->total_size * 1024;
int result; int result = 0;
spi_disable_blockprotect(); spi_disable_blockprotect();
/* Erase first */ /* Erase first */
@ -63,10 +63,10 @@ int sb600_spi_write_1(struct flashchip *flash, uint8_t *buf)
printf("Programming flash"); printf("Programming flash");
for (i = 0; i < total_size; i++, buf++) { for (i = 0; i < total_size; i++, buf++) {
result = spi_byte_program(i, *buf); result = spi_nbyte_program(i, buf, 1);
if (result) { if (result) {
// spi_byte_program reported the error for us already fprintf(stderr, "Write error!\n");
printf_debug("... continuing anyway.\n"); return result;
} }
/* wait program complete. */ /* wait program complete. */
@ -76,7 +76,7 @@ int sb600_spi_write_1(struct flashchip *flash, uint8_t *buf)
; ;
} }
printf(" done.\n"); printf(" done.\n");
return rc; return result;
} }
static void reset_internal_fifo_pointer(void) static void reset_internal_fifo_pointer(void)

6
spi.c
View File

@ -970,7 +970,7 @@ int spi_chip_read(struct flashchip *flash, uint8_t *buf, int start, int len)
int spi_chip_write_1(struct flashchip *flash, uint8_t *buf) int spi_chip_write_1(struct flashchip *flash, uint8_t *buf)
{ {
int total_size = 1024 * flash->total_size; int total_size = 1024 * flash->total_size;
int i; int i, result = 0;
spi_disable_blockprotect(); spi_disable_blockprotect();
/* Erase first */ /* Erase first */
@ -981,7 +981,9 @@ int spi_chip_write_1(struct flashchip *flash, uint8_t *buf)
} }
printf("done.\n"); printf("done.\n");
for (i = 0; i < total_size; i++) { for (i = 0; i < total_size; i++) {
spi_byte_program(i, buf[i]); result = spi_byte_program(i, buf[i]);
if (result)
return 1;
while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
programmer_delay(10); programmer_delay(10);
} }