|
@@ -844,25 +844,29 @@ static int flash_write_cfibuffer (flash_info_t * info, ulong dest, uchar * cp,
|
|
|
void *dst = map_physmem(dest, len, MAP_NOCACHE);
|
|
|
void *dst2 = dst;
|
|
|
int flag = 0;
|
|
|
+ uint offset = 0;
|
|
|
+ unsigned int shift;
|
|
|
|
|
|
switch (info->portwidth) {
|
|
|
case FLASH_CFI_8BIT:
|
|
|
- cnt = len;
|
|
|
+ shift = 0;
|
|
|
break;
|
|
|
case FLASH_CFI_16BIT:
|
|
|
- cnt = len >> 1;
|
|
|
+ shift = 1;
|
|
|
break;
|
|
|
case FLASH_CFI_32BIT:
|
|
|
- cnt = len >> 2;
|
|
|
+ shift = 2;
|
|
|
break;
|
|
|
case FLASH_CFI_64BIT:
|
|
|
- cnt = len >> 3;
|
|
|
+ shift = 3;
|
|
|
break;
|
|
|
default:
|
|
|
retcode = ERR_INVAL;
|
|
|
goto out_unmap;
|
|
|
}
|
|
|
|
|
|
+ cnt = len >> shift;
|
|
|
+
|
|
|
while ((cnt-- > 0) && (flag == 0)) {
|
|
|
switch (info->portwidth) {
|
|
|
case FLASH_CFI_8BIT:
|
|
@@ -906,23 +910,7 @@ static int flash_write_cfibuffer (flash_info_t * info, ulong dest, uchar * cp,
|
|
|
if (retcode == ERR_OK) {
|
|
|
/* reduce the number of loops by the width of
|
|
|
* the port */
|
|
|
- switch (info->portwidth) {
|
|
|
- case FLASH_CFI_8BIT:
|
|
|
- cnt = len;
|
|
|
- break;
|
|
|
- case FLASH_CFI_16BIT:
|
|
|
- cnt = len >> 1;
|
|
|
- break;
|
|
|
- case FLASH_CFI_32BIT:
|
|
|
- cnt = len >> 2;
|
|
|
- break;
|
|
|
- case FLASH_CFI_64BIT:
|
|
|
- cnt = len >> 3;
|
|
|
- break;
|
|
|
- default:
|
|
|
- retcode = ERR_INVAL;
|
|
|
- goto out_unmap;
|
|
|
- }
|
|
|
+ cnt = len >> shift;
|
|
|
flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
|
|
|
while (cnt-- > 0) {
|
|
|
switch (info->portwidth) {
|
|
@@ -959,36 +947,34 @@ static int flash_write_cfibuffer (flash_info_t * info, ulong dest, uchar * cp,
|
|
|
case CFI_CMDSET_AMD_STANDARD:
|
|
|
case CFI_CMDSET_AMD_EXTENDED:
|
|
|
flash_unlock_seq(info,0);
|
|
|
- flash_write_cmd (info, sector, 0, AMD_CMD_WRITE_TO_BUFFER);
|
|
|
+
|
|
|
+#ifdef CONFIG_FLASH_SPANSION_S29WS_N
|
|
|
+ offset = ((unsigned long)dst - info->start[sector]) >> shift;
|
|
|
+#endif
|
|
|
+ flash_write_cmd(info, sector, offset, AMD_CMD_WRITE_TO_BUFFER);
|
|
|
+ cnt = len >> shift;
|
|
|
+ flash_write_cmd(info, sector, offset, (uchar)cnt - 1);
|
|
|
|
|
|
switch (info->portwidth) {
|
|
|
case FLASH_CFI_8BIT:
|
|
|
- cnt = len;
|
|
|
- flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
|
|
|
while (cnt-- > 0) {
|
|
|
flash_write8(flash_read8(src), dst);
|
|
|
src += 1, dst += 1;
|
|
|
}
|
|
|
break;
|
|
|
case FLASH_CFI_16BIT:
|
|
|
- cnt = len >> 1;
|
|
|
- flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
|
|
|
while (cnt-- > 0) {
|
|
|
flash_write16(flash_read16(src), dst);
|
|
|
src += 2, dst += 2;
|
|
|
}
|
|
|
break;
|
|
|
case FLASH_CFI_32BIT:
|
|
|
- cnt = len >> 2;
|
|
|
- flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
|
|
|
while (cnt-- > 0) {
|
|
|
flash_write32(flash_read32(src), dst);
|
|
|
src += 4, dst += 4;
|
|
|
}
|
|
|
break;
|
|
|
case FLASH_CFI_64BIT:
|
|
|
- cnt = len >> 3;
|
|
|
- flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
|
|
|
while (cnt-- > 0) {
|
|
|
flash_write64(flash_read64(src), dst);
|
|
|
src += 8, dst += 8;
|