
Here is the patch.
Regards,
York
--- u-boot-pq3-base/drivers/cfi_flash.c 2004-08-06 13:08:19.000000000 -0500 +++ u-boot-pq3-for-release/drivers/cfi_flash.c 2004-10-27 16:02:34.028749216 -0500 @@ -10,6 +10,11 @@ * Ed Okerson * Modified to work with little-endian systems. * + * Copyright (C) 2004 + * York Sun + * Modified to support 8-bit port and 32-bit chip, not verified + * Modified to support polling DQ7 and DQ6 for AMD flash + * * See file CREDITS for list of people who contributed to this * project. * @@ -33,16 +38,29 @@ * 01/22/2004 - Write performance enhancements for parallel chips (Tolunay) * 01/23/2004 - Support for x8/x16 chips (Rune Raknerud) * 01/27/2004 - Little endian support Ed Okerson + * 10/26/2004 - Revised to support polling DQ7 and DQ6 for AMD flash + * and to support 8-bit port width on 8-bit chip + * and 32/64-bit port width on 32-bit chip (not verified) by York Sun + * According to AMD technical support: It is a good practice + * to the use exact where data is being written to when using + * "DQ6" method, even though in theory you don't have to. * * Tested Architectures * Port Width Chip Width # of banks Flash Chip Board * 32 16 1 28F128J3 seranoa/eagle * 64 16 1 28F128J3 seranoa/falcon + * 16 16 2 AM29LV641DH MPC8555CDS rev 1.0 + * 16 16 2 AM29LV641MH MPC8555CDS rev 1.0 * */
/* The DEBUG define must be before common to enable debugging */ -/* #define DEBUG */ +/* #define DEBUG */ + +#define POLLING_AMD_DQ6 +#ifndef POLLING_AMD_DQ6 +#define POLLING_AMD_DQ7 /* To use polling DQ7 instead of DQ6 for AMD algorithm */ +#endif
#include <common.h> #include <asm/processor.h> @@ -105,6 +123,10 @@ #define AMD_CMD_UNLOCK_START 0xAA #define AMD_CMD_UNLOCK_ACK 0x55
+#define AMD_DQ7 0x80 +#define AMD_DQ5 0x20 +#define AMD_STATUS_TIMEOUT 0x20 + #define AMD_STATUS_TOGGLE 0x40 #define AMD_STATUS_ERROR 0x20 #define AMD_ADDR_ERASE_START 0x555 @@ -174,14 +196,14 @@ static void flash_make_cmd (flash_info_t * info, uchar cmd, void *cmdbuf); static void flash_write_cmd (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd); static void flash_unlock_seq (flash_info_t * info, flash_sect_t sect); -static int flash_isequal (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd); -static int flash_isset (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd); -static int flash_toggle (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd); +static int flash_isequal (flash_info_t * info, cfiptr_t cptr, uchar cmd); +static int flash_isset (flash_info_t * info, cfiptr_t cptr, uchar cmd); +static int flash_toggle (flash_info_t * info, cfiptr_t cptr, uchar cmd); static int flash_detect_cfi (flash_info_t * info); static ulong flash_get_size (ulong base, int banknum); static int flash_write_cfiword (flash_info_t * info, ulong dest, cfiword_t cword); -static int flash_full_status_check (flash_info_t * info, flash_sect_t sector, - ulong tout, char *prompt); +static int Data_Polling_Check(flash_info_t * info, cfiptr_t cptr, cfiword_t cword); +static int flash_full_status_check (flash_info_t * info, cfiptr_t cptr, cfiword_t cword, ulong tout, char *prompt); #ifdef CFG_FLASH_USE_BUFFER_WRITE static int flash_write_cfibuffer (flash_info_t * info, ulong dest, uchar * cp, int len); #endif @@ -189,9 +211,21 @@
/*---------------------------------------------------------------------- - * create an address based on the offset and the port width */ +static const uint offset_multiply[9][5]={ /* chip width = 0 (dummy), 1 (8-bit), 2 (16-bit), 3 (dummy), 4(32-bit) */ + {0,0,0,0,0}, /* dummy */ + {0,2,0,0,0}, /* port width = 1 (8-bit) */ + {0,4,2,0,0}, /* port width = 2 (16-bit) */ + {0,0,0,0,0}, /* dummy */ + {0,8,4,0,4}, /* port width = 4 (32-bit) */ + {0,0,0,0,0}, /* 5, dummy */ + {0,0,0,0,0}, /* 6, dummy */ + {0,0,0,0,0}, /* 7, dummy */ + {0,16,8,0,8}, /* port width = 8 (64-bit) */ + }; + inline uchar *flash_make_addr (flash_info_t * info, flash_sect_t sect, uint offset) { - return ((uchar *) (info->start[sect] + (offset * info->portwidth))); + return ((uchar *) (info->start[sect] + (offset * offset_multiply[info->portwidth][info->chipwidth]))); }
#ifdef DEBUG @@ -347,8 +381,12 @@ { int rcode = 0; int prot; + cfiword_t cword; + cfiptr_t cptr; flash_sect_t sect;
+ cword.c = 0xff; + if (info->flash_id != FLASH_MAN_CFI) { puts ("Can't erase unknown flash type - aborted\n"); return 1; @@ -393,11 +431,11 @@ info->vendor); break; } - - if (flash_full_status_check - (info, sect, info->erase_blk_tout, "erase")) { + cptr.cp = flash_make_addr(info,sect,0); + if (flash_full_status_check(info,cptr,cword, info->erase_blk_tout,"erase") ) { rcode = 1; - } else + } + else putc ('.'); } } @@ -416,8 +454,43 @@ return; }
- printf ("CFI conformant FLASH (%d x %d)", + printf ("CFI compatible FLASH (%d port width with %d chip width)\n", (info->portwidth << 3), (info->chipwidth << 3)); + printf ("Command set is "); + switch (info->vendor) { + case CFI_CMDSET_INTEL_EXTENDED: + printf ("Intel/Sharp extended\n"); + break; + case CFI_CMDSET_AMD_STANDARD: + printf ("AMD/Fujitsu standard. "); +#ifdef POLLING_AMD_DQ7 + printf ("Driver is polling DQ7 for status checking.\n"); +#else + printf ("Driver is polling DQ6 for status checking.\n"); +#endif + break; + case CFI_CMDSET_INTEL_STANDARD: + printf ("Intel/Sharp standard\n"); + break; + case CFI_CMDSET_AMD_EXTENDED: + printf ("AMD/Fujitsu extended\n"); +#ifdef POLLING_AMD_DQ7 + printf ("Driver is polling DQ7 for status checking.\n"); +#else + printf ("Driver is polling DQ6 for status checking.\n"); +#endif + break; + case CFI_CMDSET_MITSU_STANDARD: + printf ("Mitsubishi standard\n"); + break; + case CFI_CMDSET_MITSU_EXTENDED: + printf ("Mitsubishi extendend\n"); + break; + default: + printf ("Not defined\n"); + break; + } + printf (" Size: %ld MB in %d Sectors\n", info->size >> 20, info->sector_count); printf (" Erase timeout %ld ms, write timeout %ld ms, buffer write timeout %ld ms, buffer size %d\n", @@ -482,6 +555,9 @@ int aln; cfiword_t cword; int i, rc; + ulong temp,count; + + count = cnt;
#ifdef CFG_FLASH_USE_BUFFER_WRITE int buffered_size; @@ -522,6 +598,8 @@ cnt -= i; } #else + temp = 0; + printf("\n"); while (cnt >= info->portwidth) { cword.l = 0; for (i = 0; i < info->portwidth; i++) { @@ -531,6 +609,10 @@ return rc; wp += info->portwidth; cnt -= info->portwidth; + if (((count-cnt)>>10)>temp) { + temp=(count-cnt)>>10; + printf("\r%d KB",temp); + } } #endif /* CFG_FLASH_USE_BUFFER_WRITE */ if (cnt == 0) { @@ -568,7 +650,7 @@ flash_write_cmd (info, sector, 0, FLASH_CMD_PROTECT_CLEAR);
if ((retcode = - flash_full_status_check (info, sector, info->erase_blk_tout, + flash_full_status_check (info, sector, 0,0,info->erase_blk_tout, prot ? "protect" : "unprotect")) == 0) {
info->protect[sector] = prot; @@ -621,18 +703,22 @@ * flash_is_busy - check to see if the flash is busy * This routine checks the status of the chip and returns true if the chip is busy */ -static int flash_is_busy (flash_info_t * info, flash_sect_t sect) +static int flash_is_busy (flash_info_t * info, cfiptr_t cptr, cfiword_t cword) { int retval;
switch (info->vendor) { case CFI_CMDSET_INTEL_STANDARD: case CFI_CMDSET_INTEL_EXTENDED: - retval = !flash_isset (info, sect, 0, FLASH_STATUS_DONE); + retval = !flash_isset (info, cptr, FLASH_STATUS_DONE); break; case CFI_CMDSET_AMD_STANDARD: case CFI_CMDSET_AMD_EXTENDED: - retval = flash_toggle (info, sect, 0, AMD_STATUS_TOGGLE); +#ifdef POLLING_AMD_DQ7 + retval = Data_Polling_Check (info, cptr, cword); /* data polling for D7 */ +#else + retval = flash_toggle (info, cptr, AMD_STATUS_TOGGLE); +#endif break; default: retval = 0; @@ -641,24 +727,109 @@ return retval; }
+ +/* ---------------------------------------------------------------------- + * Polling DQ5 for AMD flash + * Edited by York Sun (yorksun@freescale.com) + */ +static int flash_time_out (flash_info_t * info, cfiptr_t cptr, cfiword_t cword) +{ + int retval; +
+ switch (info->vendor) { + case CFI_CMDSET_AMD_STANDARD: + case CFI_CMDSET_AMD_EXTENDED: + retval = flash_isset (info, cptr, AMD_STATUS_TIMEOUT); + break; + default: + retval = 0; + } + debug ("flash_time_out: %d\n", retval); + return retval; +} + +/* ---------------------------------------------------------------------- + * Polling DQ7 for AMD flash + * Edited by York Sun (yorksun@freescale.com) + */ +static int Data_Polling_Check(flash_info_t * info, cfiptr_t cptr, cfiword_t cword) +{ + uchar read_data=0,polling_data=0; + + switch (info->portwidth) { + case FLASH_CFI_8BIT: + polling_data= cword.c; + break; + case FLASH_CFI_16BIT: + polling_data=(uchar) (cword.w & 0xff); + break; + case FLASH_CFI_32BIT: + polling_data=(uchar) (cword.l & 0xff); + break; + case FLASH_CFI_64BIT: + polling_data=(uchar) (cword.ll & 0xff); + break; + default: + printf("Error in function %s\n",__FUNCTION__); + } + do { + switch (info->portwidth) { + case FLASH_CFI_8BIT: + read_data = cptr.cp[0]; + break; + case FLASH_CFI_16BIT: + read_data = (uchar) (cptr.wp[0] & 0xff); + break; + case FLASH_CFI_32BIT: + read_data = (uchar) (cptr.lp[0] & 0xff); + break; + case FLASH_CFI_64BIT: + read_data = (uchar) (cptr.llp[0] & 0xff); + break; + } + if ((read_data & AMD_DQ7) == (polling_data & AMD_DQ7)) + break; + } while ((read_data & AMD_DQ5) != (uchar) AMD_DQ5); + switch (info->portwidth) { + case FLASH_CFI_8BIT: + read_data = cptr.cp[0]; + break; + case FLASH_CFI_16BIT: + read_data = (uchar) (cptr.wp[0] & 0xff); + break; + case FLASH_CFI_32BIT: + read_data = (uchar) (cptr.lp[0] & 0xff); + break; + case FLASH_CFI_64BIT: + read_data = (uchar) (cptr.llp[0] & 0xff); + break; + } + if ((read_data & AMD_DQ7) != (polling_data & AMD_DQ7)) + return ERR_TIMOUT; + else + return ERR_OK; +} +
/*---------------------------------------------------------------------- - * wait for XSR.7 to be set. Time out with an error if it does not. * This routine does not set the flash to read-array mode. + * get_timer does not always work. Polling DQ5 can get the time out info for AMD flash. */ -static int flash_status_check (flash_info_t * info, flash_sect_t sector, - ulong tout, char *prompt) +static int flash_status_check (flash_info_t * info, cfiptr_t cptr, cfiword_t cword, ulong tout, char *prompt) { - ulong start; + ulong start,now;
/* Wait for command completion */ - start = get_timer (0); - while (flash_is_busy (info, sector)) { - if (get_timer (start) > info->erase_blk_tout * CFG_HZ) { - printf ("Flash %s timeout at address %lx data %lx\n", - prompt, info->start[sector], - flash_read_long (info, sector, 0)); - flash_write_cmd (info, sector, 0, info->cmd_reset); - return ERR_TIMOUT; + start = get_timer (0); + while (flash_is_busy (info, cptr,cword)) { + if ((flash_time_out(info,cptr,cword)) || \ + ((now=get_timer (start)) > info->erase_blk_tout * CFG_HZ)) { + if (flash_is_busy (info, cptr,cword)) { + printf ("Flash %s timeout at address %lx data %lx\n",\ + prompt, (ulong)cptr.cp,cword.l); + flash_write_cmd (info, 0, 0, info->cmd_reset); + return ERR_TIMOUT; + } } } return ERR_OK; @@ -668,36 +839,34 @@ * Wait for XSR.7 to be set, if it times out print an error, otherwise do a full status check. * This routine sets the flash to read-array mode. */ -static int flash_full_status_check (flash_info_t * info, flash_sect_t sector, - ulong tout, char *prompt) +static int flash_full_status_check (flash_info_t * info, cfiptr_t cptr, cfiword_t cword, ulong tout, char *prompt) { int retcode;
- retcode = flash_status_check (info, sector, tout, prompt); + retcode = flash_status_check (info, cptr, cword, tout, prompt); switch (info->vendor) { case CFI_CMDSET_INTEL_EXTENDED: case CFI_CMDSET_INTEL_STANDARD: if ((retcode != ERR_OK) - && !flash_isequal (info, sector, 0, FLASH_STATUS_DONE)) { + && !flash_isequal (info, cptr, FLASH_STATUS_DONE)) { retcode = ERR_INVAL; - printf ("Flash %s error at address %lx\n", prompt, - info->start[sector]); - if (flash_isset (info, sector, 0, FLASH_STATUS_ECLBS | FLASH_STATUS_PSLBS)) { + printf ("Flash %s error at address %lx\n", prompt,(ulong)cptr.cp); + if (flash_isset (info, cptr, FLASH_STATUS_ECLBS | FLASH_STATUS_PSLBS)) { puts ("Command Sequence Error.\n"); - } else if (flash_isset (info, sector, 0, FLASH_STATUS_ECLBS)) { + } else if (flash_isset (info, cptr, FLASH_STATUS_ECLBS)) { puts ("Block Erase Error.\n"); retcode = ERR_NOT_ERASED; - } else if (flash_isset (info, sector, 0, FLASH_STATUS_PSLBS)) { + } else if (flash_isset (info, cptr, FLASH_STATUS_PSLBS)) { puts ("Locking Error\n"); } - if (flash_isset (info, sector, 0, FLASH_STATUS_DPS)) { + if (flash_isset (info, cptr, FLASH_STATUS_DPS)) { puts ("Block locked.\n"); retcode = ERR_PROTECTED; } - if (flash_isset (info, sector, 0, FLASH_STATUS_VPENS)) + if (flash_isset (info, cptr, FLASH_STATUS_VPENS)) puts ("Vpp Low Error.\n"); } - flash_write_cmd (info, sector, 0, FLASH_CMD_RESET); + flash_write_cmd (info, 0,0, FLASH_CMD_RESET); break; default: break; @@ -762,9 +931,16 @@ uint stmpi; #endif uchar *cp = (uchar *) cmdbuf; - - for (i = 0; i < info->portwidth; i++) - *cp++ = ((i + 1) % info->chipwidth) ? '\0' : cmd; + if (info->chipwidth < FLASH_CFI_BY32) { + for (i = 0; i < info->portwidth; i++) + *cp++ = ((i + 1) % info->chipwidth) ? '\0' : cmd; + } + else { + ushort *ccp= (ushort *) cmdbuf; + ushort cmd_16= cmd + cmd * 256; + for (i = 0; i< info->portwidth; i=i+2) + *ccp++= ((i + 2) % info->chipwidth) ? '\0' :cmd_16; + } #if defined(__LITTLE_ENDIAN) switch (info->portwidth) { case FLASH_CFI_8BIT: @@ -797,20 +973,18 @@ flash_make_cmd (info, cmd, &cword); switch (info->portwidth) { case FLASH_CFI_8BIT: - debug ("fwc addr %p cmd %x %x 8bit x %d bit\n", addr.cp, cmd, - cword.c, info->chipwidth << CFI_FLASH_SHIFT_WIDTH); + debug ("fwc issues cmd %x to addr %p with %x,\nassuming flash port width 8bit, chip width %d bit\n",\ + cmd, addr.cp, cword.c, info->chipwidth << CFI_FLASH_SHIFT_WIDTH); *addr.cp = cword.c; break; case FLASH_CFI_16BIT: - debug ("fwc addr %p cmd %x %4.4x 16bit x %d bit\n", addr.wp, - cmd, cword.w, - info->chipwidth << CFI_FLASH_SHIFT_WIDTH); + debug ("fwc issues cmd %x to addr %p with %4.4x,\nassuming flash port width 16bit, chip width %d bit\n",\ + cmd, addr.wp, cword.w, info->chipwidth << CFI_FLASH_SHIFT_WIDTH); *addr.wp = cword.w; break; case FLASH_CFI_32BIT: - debug ("fwc addr %p cmd %x %8.8lx 32bit x %d bit\n", addr.lp, - cmd, cword.l, - info->chipwidth << CFI_FLASH_SHIFT_WIDTH); + debug ("fwc issues cmd %x to addr %p with %8.8lx,\nassuming flash port width 32bit, chip width %d bit\n",\ + cmd, addr.lp, cword.l, info->chipwidth << CFI_FLASH_SHIFT_WIDTH); *addr.lp = cword.l; break; case FLASH_CFI_64BIT: @@ -820,9 +994,8 @@
print_longlong (str, cword.ll);
- debug ("fwrite addr %p cmd %x %s 64 bit x %d bit\n", - addr.llp, cmd, str, - info->chipwidth << CFI_FLASH_SHIFT_WIDTH); + debug ("fwrite issues cmd %x to addr %p with %s,\nassuming flash port width 64 bit, chip width %d bit\n",\ + cmd, addr.llp, str, info->chipwidth << CFI_FLASH_SHIFT_WIDTH); } #endif *addr.llp = cword.ll; @@ -838,27 +1011,25 @@
/*---------------------------------------------------------------------- - */ -static int flash_isequal (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd) +static int flash_isequal (flash_info_t * info, cfiptr_t cptr, uchar cmd) { - cfiptr_t cptr; cfiword_t cword; int retval;
- cptr.cp = flash_make_addr (info, sect, offset); flash_make_cmd (info, cmd, &cword);
- debug ("is= cmd %x(%c) addr %p ", cmd, cmd, cptr.cp); + debug ("expecting net value is %x(%c) at addr %p,\n", cmd, cmd, cptr.cp); switch (info->portwidth) { case FLASH_CFI_8BIT: - debug ("is= %x %x\n", cptr.cp[0], cword.c); + debug ("expected read value %x, actual read %x\n", cword.c,cptr.cp[0]); retval = (cptr.cp[0] == cword.c); break; case FLASH_CFI_16BIT: - debug ("is= %4.4x %4.4x\n", cptr.wp[0], cword.w); + debug ("expected read value %4.4x, actual read %4.4x\n", cword.w,cptr.wp[0]); retval = (cptr.wp[0] == cword.w); break; case FLASH_CFI_32BIT: - debug ("is= %8.8lx %8.8lx\n", cptr.lp[0], cword.l); + debug ("expected read value %8.8lx, actual read %8.8lx\n", cword.l,cptr.lp[0]); retval = (cptr.lp[0] == cword.l); break; case FLASH_CFI_64BIT: @@ -869,7 +1040,7 @@
print_longlong (str1, cptr.llp[0]); print_longlong (str2, cword.ll); - debug ("is= %s %s\n", str1, str2); + debug ("expected read vaule is %s, actual read %s\n", str2, str1); } #endif retval = (cptr.llp[0] == cword.ll); @@ -883,13 +1054,11 @@
/*---------------------------------------------------------------------- - */ -static int flash_isset (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd) +static int flash_isset (flash_info_t * info, cfiptr_t cptr, uchar cmd) { - cfiptr_t cptr; cfiword_t cword; int retval;
- cptr.cp = flash_make_addr (info, sect, offset); flash_make_cmd (info, cmd, &cword); switch (info->portwidth) { case FLASH_CFI_8BIT: @@ -913,13 +1082,11 @@
/*---------------------------------------------------------------------- - */ -static int flash_toggle (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd) +static int flash_toggle (flash_info_t * info, cfiptr_t cptr, uchar cmd) { - cfiptr_t cptr; cfiword_t cword; int retval;
- cptr.cp = flash_make_addr (info, sect, offset); flash_make_cmd (info, cmd, &cword); switch (info->portwidth) { case FLASH_CFI_8BIT: @@ -949,6 +1116,7 @@ */ static int flash_detect_cfi (flash_info_t * info) { + cfiptr_t cptr1,cptr2,cptr3; debug ("flash detect cfi\n");
for (info->portwidth = FLASH_CFI_8BIT; @@ -956,11 +1124,14 @@ for (info->chipwidth = FLASH_CFI_BY8; info->chipwidth <= info->portwidth; info->chipwidth <<= 1) { + cptr1.cp = flash_make_addr(info,0,FLASH_OFFSET_CFI_RESP); + cptr2.cp = flash_make_addr(info,0,FLASH_OFFSET_CFI_RESP + 1); + cptr3.cp = flash_make_addr(info,0,FLASH_OFFSET_CFI_RESP + 2); flash_write_cmd (info, 0, 0, FLASH_CMD_RESET); flash_write_cmd (info, 0, FLASH_OFFSET_CFI, FLASH_CMD_CFI); - if (flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP, 'Q') - && flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 1, 'R') - && flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 2, 'Y')) { + if (flash_isequal (info, cptr1,'Q') + && flash_isequal (info, cptr2, 'R') + && flash_isequal (info, cptr3, 'Y')) { info->interface = flash_read_ushort (info, 0, FLASH_OFFSET_INTERFACE); debug ("device interface is %d\n", info->interface); @@ -992,6 +1163,7 @@ uchar num_erase_regions; int erase_region_size; int erase_region_count; + cfiptr_t cptr;
info->start[0] = base;
@@ -1044,10 +1216,9 @@ for (j = 0; j < erase_region_count; j++) { info->start[sect_cnt] = sector; sector += (erase_region_size * size_ratio); + cptr.cp = flash_make_addr(info,sect_cnt,FLASH_OFFSET_PROTECT); info->protect[sect_cnt] = - flash_isset (info, sect_cnt, - FLASH_OFFSET_PROTECT, - FLASH_STATUS_PROTECT); + flash_isset (info, cptr,FLASH_STATUS_PROTECT); sect_cnt++; } } @@ -1081,7 +1252,7 @@
cfiptr_t ctladdr; cfiptr_t cptr; - int flag; + int flag,retcode;
ctladdr.cp = flash_make_addr (info, 0, 0); cptr.cp = (uchar *) dest; @@ -1142,7 +1313,8 @@ if (flag) enable_interrupts ();
- return flash_full_status_check (info, 0, info->write_tout, "write"); + retcode = flash_full_status_check (info, cptr, cword, info->write_tout, "write"); + return flag; }
#ifdef CFG_FLASH_USE_BUFFER_WRITE @@ -1181,7 +1353,7 @@ flash_write_cmd (info, sector, 0, FLASH_CMD_CLEAR_STATUS); flash_write_cmd (info, sector, 0, FLASH_CMD_WRITE_TO_BUFFER); if ((retcode = - flash_status_check (info, sector, info->buffer_write_tout, + flash_status_check (info, sector, 0,0,info->buffer_write_tout, "write to buffer")) == ERR_OK) { /* reduce the number of loops by the width of the port */ switch (info->portwidth) { @@ -1224,7 +1396,7 @@ flash_write_cmd (info, sector, 0, FLASH_CMD_WRITE_BUFFER_CONFIRM); retcode = - flash_full_status_check (info, sector, + flash_full_status_check (info, sector,0,0,
info->buffer_write_tout, "buffer write"); }