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; |