|
From: Adrian M. <zx8...@us...> - 2002-09-03 21:46:34
|
Update of /cvsroot/linuxdc/linux-sh-dc/drivers/mtd/maps
In directory usw-pr-cvs1:/tmp/cvs-serv6320/drivers/mtd/maps
Modified Files:
vmu-flash.c
Log Message:
VMU writes cached
Index: vmu-flash.c
===================================================================
RCS file: /cvsroot/linuxdc/linux-sh-dc/drivers/mtd/maps/vmu-flash.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- vmu-flash.c 1 Sep 2002 21:26:05 -0000 1.8
+++ vmu-flash.c 3 Sep 2002 21:46:31 -0000 1.9
@@ -89,7 +89,7 @@
struct maple_driver_data *mdd =
(struct maple_driver_data *) (vmu_flash_mtd->priv);
- memcard_t *memcard = (memcard_t *)(mdd->private_data);
+ memcard_t *memcard = (memcard_t *) (mdd->private_data);
struct mapleq *mqu = (struct mapleq *) &(mdd->mq);
mqu->command = MAPLE_COMMAND_BREAD;
mqu->length = 2;
@@ -141,36 +141,40 @@
return -1;
}
+ vmu_cache->valid = 0; /* Writing so any cache may be invalid */
struct maple_driver_data *mdd =
(struct maple_driver_data *) (vmu_flash_mtd->priv);
struct mapleq *mqu = (struct mapleq *) &(mdd->mq);
- memcard_t *memcard = (memcard_t *)mdd->private_data;
+ memcard_t *memcard = (memcard_t *) mdd->private_data;
/* Writing is phased */
int x;
- for (x = 0; x < memcard->writecnt; x++)
- {
- mqu->command = MAPLE_COMMAND_BWRITE;
- mqu->length = (VMU_BLOCK_SIZE/(memcard->writecnt * 4)) + 2;
+ for (x = 0; x < memcard->writecnt; x++) {
+ mqu->command = MAPLE_COMMAND_BWRITE;
+ mqu->length =
+ (VMU_BLOCK_SIZE / (memcard->writecnt * 4)) + 2;
- ((unsigned long *) (mqu->recvbuf))[0] =
- cpu_to_be32(MAPLE_FUNC_MEMCARD);
+ ((unsigned long *) (mqu->recvbuf))[0] =
+ cpu_to_be32(MAPLE_FUNC_MEMCARD);
- ((unsigned long *) (mqu->recvbuf))[1] = num << 24 | x << 8;
- memcpy(mqu->recvbuf + 8, buf + (VMU_BLOCK_SIZE/memcard->writecnt)* x, VMU_BLOCK_SIZE/memcard->writecnt);
+ ((unsigned long *) (mqu->recvbuf))[1] = num << 24 | x << 8;
+ memcpy(mqu->recvbuf + 8,
+ buf + (VMU_BLOCK_SIZE / memcard->writecnt) * x,
+ VMU_BLOCK_SIZE / memcard->writecnt);
- mqu->sendbuf = mqu->recvbuf;
- if (maple_add_packet(mqu) != 0) {
- printk(KERN_WARNING "VMU FLASH: Could not add packet\n");
- return -1;
- }
+ mqu->sendbuf = mqu->recvbuf;
+ if (maple_add_packet(mqu) != 0) {
+ printk(KERN_WARNING
+ "VMU FLASH: Could not add packet\n");
+ return -1;
+ }
- lastmq = NULL;
- /* Wait */
- do {
- interruptible_sleep_on_timeout(&wq_mq, 1);
- } while (lastmq == NULL);
- }
+ lastmq = NULL;
+ /* Wait */
+ do {
+ interruptible_sleep_on_timeout(&wq_mq, 1);
+ } while (lastmq == NULL);
+ }
return 0;
}
@@ -258,7 +262,8 @@
if (vmu_cache->valid) {
if (vmu_cache->block == block->num) {
if ((vmu_cache->jiffies_atc + 10) >= jiffies) { /* short lifespan */
- memcpy(buf, vmu_cache->buffer, VMU_BLOCK_SIZE);
+ memcpy(buf, vmu_cache->buffer,
+ VMU_BLOCK_SIZE);
u_char *buf2 = buf;
buf2 += block->ofs;
@@ -375,13 +380,63 @@
if (len < 1)
return -1;
+ if (len == 1) { /* Simple one char write */
+ vmu_flash_write8(buf[0], from);
+ *retlen = 1;
+ return 0;
+ }
+
+ /* Cached write */
int index = 0;
+
+ block_t *block;
+ /* Find the block */
+ block = __ofs_to_block(from);
+
+ /* Validate it was found */
+ if (!block) {
+ printk(KERN_WARNING "Got an invalid block\n");
+ *retlen = 0;
+ return -1;
+ }
+
do {
- vmu_flash_write8(buf[index], from + index);
- index++;
+
+
+ u_char *buffer = kmalloc(VMU_BLOCK_SIZE, GFP_KERNEL);
+
+
+
+
+ /* Read the block */
+ if (maple_vmu_read_block(block->num, buffer)) {
+ printk(KERN_WARNING "Can't read block: %d\n",
+ block->num);
+ kfree(block);
+ *retlen = 0;
+ return -1;
+ }
+
+ do {
+ buffer[block->ofs] = buf[index];
+ (block->ofs)++;
+ index++;
+ if (index >= len)
+ break;
+ } while (block->ofs < VMU_BLOCK_SIZE);
+ maple_vmu_write_block(block->num, buffer);
+ kfree(buffer);
+ (block->num)++;
+ block->ofs = 0;
} while (len > index);
*retlen = index;
+ kfree(block);
return 0;
+
+
+
+
+
}
static int vmu_flash_erase(struct mtd_info *mtd, struct erase_info *erase)
@@ -557,7 +612,7 @@
/* Now query flash partition 0 to find definitve block size */
mqu = (struct mapleq *) &(d->mq);
- mqu->command = MAPLE_COMMAND_GETMINFO ;
+ mqu->command = MAPLE_COMMAND_GETMINFO;
mqu->length = 2;
((unsigned long *) (mqu->recvbuf))[0] =
cpu_to_be32(MAPLE_FUNC_MEMCARD);
@@ -597,7 +652,9 @@
/* This is 'other' */
vmu_flash_mtd->type = MTD_OTHER;
- vmu_flash_mtd->flags = MTD_CLEAR_BITS|MTD_SET_BITS|MTD_ERASEABLE|MTD_WRITEB_WRITEABLE;
+ vmu_flash_mtd->flags =
+ MTD_CLEAR_BITS | MTD_SET_BITS | MTD_ERASEABLE |
+ MTD_WRITEB_WRITEABLE;
vmu_flash_mtd->size = VMU_NUM_BLOCKS * VMU_BLOCK_SIZE;
vmu_flash_mtd->erasesize = VMU_BLOCK_SIZE;
|