mtd/drivers/mtd/chips cfi_cmdset_0001.c,1.123,1.124
David Woodhouse
dwmw2 at infradead.org
Fri Jun 13 04:45:12 EDT 2003
Update of /home/cvs/mtd/drivers/mtd/chips
In directory phoenix.infradead.org:/tmp/cvs-serv10751/drivers/mtd/chips
Modified Files:
cfi_cmdset_0001.c
Log Message:
From: Joakim Tjernlund <joakim.tjernlund at lumentis.se>
Let do_write_buffer write the trailing bytes of a write request instead
of doing the do_write_oneword dance. This will save quite a few acceses to
the flash.
Index: cfi_cmdset_0001.c
===================================================================
RCS file: /home/cvs/mtd/drivers/mtd/chips/cfi_cmdset_0001.c,v
retrieving revision 1.123
retrieving revision 1.124
diff -u -r1.123 -r1.124
--- cfi_cmdset_0001.c 28 May 2003 12:51:48 -0000 1.123
+++ cfi_cmdset_0001.c 13 Jun 2003 08:45:09 -0000 1.124
@@ -936,7 +936,7 @@
struct cfi_private *cfi = map->fldrv_priv;
cfi_word status, status_OK;
unsigned long cmd_adr, timeo;
- int wbufsize, z, ret=0;
+ int wbufsize, z, ret=0, bytes, words;
wbufsize = CFIDEV_INTERLEAVE << cfi->cfiq->MaxBufWriteSize;
adr += chip->start;
@@ -995,10 +995,13 @@
}
/* Write length of data to come */
- cfi_write(map, CMD(len/CFIDEV_BUSWIDTH-1), cmd_adr );
+ bytes = len & (CFIDEV_BUSWIDTH-1);
+ words = len / CFIDEV_BUSWIDTH;
+ cfi_write(map, CMD(words - !bytes), cmd_adr );
/* Write data */
- for (z = 0; z < len; z += CFIDEV_BUSWIDTH) {
+ z = 0;
+ while(z < words * CFIDEV_BUSWIDTH) {
if (cfi_buswidth_is_1()) {
map_write8 (map, *((__u8*)buf)++, adr+z);
} else if (cfi_buswidth_is_2()) {
@@ -1011,6 +1014,26 @@
ret = -EINVAL;
goto out;
}
+ z += CFIDEV_BUSWIDTH;
+ }
+ if (bytes) {
+ int i = 0, n = 0;
+ u_char tmp_buf[8], *tmp_p = tmp_buf;
+
+ while (bytes--)
+ tmp_buf[i++] = buf[n++];
+ while (i < CFIDEV_BUSWIDTH)
+ tmp_buf[i++] = 0xff;
+ if (cfi_buswidth_is_2()) {
+ map->write16 (map, *((__u16*)tmp_p)++, adr+z);
+ } else if (cfi_buswidth_is_4()) {
+ map->write32 (map, *((__u32*)tmp_p)++, adr+z);
+ } else if (cfi_buswidth_is_8()) {
+ map->write64 (map, *((__u64*)tmp_p)++, adr+z);
+ } else {
+ ret = -EINVAL;
+ goto out;
+ }
}
/* GO GO GO */
cfi_write(map, CMD(0xd0), cmd_adr);
@@ -1119,12 +1142,12 @@
}
/* Write buffer is worth it only if more than one word to write... */
- while(len > CFIDEV_BUSWIDTH) {
+ while(len) {
/* We must not cross write block boundaries */
int size = wbufsize - (ofs & (wbufsize-1));
if (size > len)
- size = len & ~(CFIDEV_BUSWIDTH-1);
+ size = len;
ret = do_write_buffer(map, &cfi->chips[chipnum],
ofs, buf, size);
if (ret)
@@ -1142,17 +1165,6 @@
return 0;
}
}
-
- /* ... and write the remaining bytes */
- if (len > 0) {
- size_t local_retlen;
- ret = cfi_intelext_write_words(mtd, ofs + (chipnum << cfi->chipshift),
- len, &local_retlen, buf);
- if (ret)
- return ret;
- (*retlen) += local_retlen;
- }
-
return 0;
}
More information about the linux-mtd-cvs
mailing list