RE: [U-Boot-Users] CFI driver

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"); }

On Wed, 2004-10-27 at 16:10, York Sun wrote:
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.
York,
I tried to apply this version of your patch and was unable to have it patch properly due to mailer wrapping and munging.
Privately, you sent me an updated version of this patch that worked well on my MPC8540/60ADS and MPC8555/41CDS systems.
Could you please repost that patch to the list here in a form that won't be munged by mailer MUAs? If you do, please state thta it _replaces_ this version of the patch. Also, please include the required CHANGELOG entry for it!
Thanks! jdl

Jon,
On Mon, 2004-11-22 at 11:46, Jon Loeliger wrote:
I tried to apply this version of your patch and was unable to have it patch properly due to mailer wrapping and munging.
Privately, you sent me an updated version of this patch that worked well on my MPC8540/60ADS and MPC8555/41CDS systems.
Could you please repost that patch to the list here in a form that won't be munged by mailer MUAs? If you do, please state thta it _replaces_ this version of the patch. Also, please include the required CHANGELOG entry for it!
I have reposted the patch on Nov 1. Please check the archived mails.
Which CHANGELOG should I change? Some comments has been added to show the changes.
Regards,
York

On Mon, 2004-11-22 at 12:57, York Sun wrote:
Could you please repost that patch to the list here in a form that won't be munged by mailer MUAs? If you do, please state thta it _replaces_ this version of the patch. Also, please include the required CHANGELOG entry for it!
I have reposted the patch on Nov 1. Please check the archived mails.
I searched the archives but was unable to find a clean version of the patch that was not munged by a mailer. (Ref: From: York Sun <ysun@me...> RE: CFI driver 2004-10-27 14:25)
Which CHANGELOG should I change? Some comments has been added to show the changes.
Wolfgang requires a CHANGELOG entry that he can add to the master CHANGELOG file for submitted patches. This is NOT the same as comments within the code itself.
Regards,
York
Thanks, jdl

In message 1101758313.15446.55.camel@cashmere.sps.mot.com you wrote:
On Mon, 2004-11-22 at 12:57, York Sun wrote:
...
I have reposted the patch on Nov 1. Please check the archived mails.
I searched the archives but was unable to find a clean version of the patch that was not munged by a mailer.
The patch posted on Nov 1 is indeed not munged by a mailer. Nevertheless, it does not satisfy the requirements for a patch; especially it adds lots of trailing white space; it does not use TABs for indentation, etc.
Wolfgang requires a CHANGELOG entry that he can add to the master CHANGELOG file for submitted patches. This is NOT the same as comments within the code itself.
Indeed.
Best regards,
Wolfgang Denk
participants (4)
-
Jon Loeliger
-
Wolfgang Denk
-
York Sun
-
York Sun