From: Adrian M. <zx8...@us...> - 2002-09-01 21:26:08
|
Update of /cvsroot/linuxdc/linux-sh-dc/drivers/mtd/maps In directory usw-pr-cvs1:/tmp/cvs-serv13970/drivers/mtd/maps Modified Files: vmu-flash.c Log Message: VMU driver now supports writing Index: vmu-flash.c =================================================================== RCS file: /cvsroot/linuxdc/linux-sh-dc/drivers/mtd/maps/vmu-flash.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- vmu-flash.c 31 Aug 2002 18:17:13 -0000 1.7 +++ vmu-flash.c 1 Sep 2002 21:26:05 -0000 1.8 @@ -26,8 +26,7 @@ static int VMU_NUM_BLOCKS; /* This is a dynamic property */ static int VMU_BLOCK_SIZE; -/* Maple Device */ -static struct maple_device *vmu_flash_mdev = NULL; + /* MTD Information */ static struct mtd_info *vmu_flash_mtd = NULL; @@ -90,8 +89,9 @@ struct maple_driver_data *mdd = (struct maple_driver_data *) (vmu_flash_mtd->priv); + memcard_t *memcard = (memcard_t *)(mdd->private_data); struct mapleq *mqu = (struct mapleq *) &(mdd->mq); - mqu->command = 11; + mqu->command = MAPLE_COMMAND_BREAD; mqu->length = 2; ((unsigned long *) (mqu->recvbuf))[0] = @@ -99,8 +99,7 @@ /* With thanks to KOS */ - ((unsigned long *) (mqu->recvbuf))[1] = - /*((num & 0xff) << 24) | ((num >> 8) << 16) */ num << 24; + ((unsigned long *) (mqu->recvbuf))[1] = num << 24; mqu->sendbuf = mqu->recvbuf; if (maple_add_packet(mqu) != 0) { printk(KERN_WARNING "VMU FLASH: Could not add packet\n"); @@ -116,7 +115,7 @@ /* Now check if we've got a proper return */ if (block_buffer) { - memcpy(buf, block_buffer, 512); + memcpy(buf, block_buffer, memcard->blocklen); kfree(block_buffer); block_buffer = NULL; return 0; @@ -134,7 +133,6 @@ static int maple_vmu_write_block(unsigned int num, u_char * buf) { - /* This function does not have to sleep */ /* Sanity check */ if (!vmu_flash_mtd) { @@ -146,14 +144,20 @@ struct maple_driver_data *mdd = (struct maple_driver_data *) (vmu_flash_mtd->priv); struct mapleq *mqu = (struct mapleq *) &(mdd->mq); - mqu->command = 12; - mqu->length = 514; + 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; ((unsigned long *) (mqu->recvbuf))[0] = cpu_to_be32(MAPLE_FUNC_MEMCARD); - ((unsigned long *) (mqu->recvbuf))[1] = num; - memcpy(buf, (mqu->recvbuf) + 8, 512); + ((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) { @@ -161,6 +165,12 @@ return -1; } + lastmq = NULL; + /* Wait */ + do { + interruptible_sleep_on_timeout(&wq_mq, 1); + } while (lastmq == NULL); + } return 0; } @@ -233,7 +243,7 @@ { block_t *block; *retval = 0; - u_char *buf = kmalloc(512, GFP_KERNEL); + u_char *buf = kmalloc(VMU_BLOCK_SIZE, GFP_KERNEL); /* Find the block */ block = __ofs_to_block(ofs); @@ -248,7 +258,7 @@ if (vmu_cache->valid) { if (vmu_cache->block == block->num) { if ((vmu_cache->jiffies_atc + 10) >= jiffies) { /* short lifespan */ - memcpy(buf, vmu_cache->buffer, 512); + memcpy(buf, vmu_cache->buffer, VMU_BLOCK_SIZE); u_char *buf2 = buf; buf2 += block->ofs; @@ -295,7 +305,7 @@ static void vmu_flash_write8(__u8 d, unsigned long ofs) { block_t *block; - u_char *buf = kmalloc(512, GFP_KERNEL); + u_char *buf = kmalloc(VMU_BLOCK_SIZE, GFP_KERNEL); /* Find the block */ block = __ofs_to_block(ofs); @@ -335,10 +345,12 @@ size_t * retlen, u_char * buf) { /* printk("Reading from %llx with length %llx\n", from, len); */ + + if (len < 1) return -1; - if (len > (128 * 1024)) - len = 128 * 1024; + if (len > (VMU_NUM_BLOCKS * VMU_BLOCK_SIZE)) + len = VMU_NUM_BLOCKS * VMU_BLOCK_SIZE; int start_here = (int) (from & 0xffffffff); long retval = 0; int index = 0; @@ -362,6 +374,7 @@ { if (len < 1) return -1; + int index = 0; do { vmu_flash_write8(buf[index], from + index); @@ -432,11 +445,11 @@ { struct mapleq *mq = &data->mq; if (flash_queried == 0) { - if (mq->recvbuf[0] == 5) { + if (mq->recvbuf[0] == MAPLE_RESPONSE_DEVINFO) { lastmq = mq; wake_up_interruptible(&wq_mq); /* Wake sleeping code */ return; - } else if (mq->recvbuf[0] == 8) { + } else if (mq->recvbuf[0] == MAPLE_RESPONSE_DATATRF) { lastmq = mq; wake_up_interruptible(&wq_mq); /* Wake sleeping code */ flash_queried = 1; @@ -445,7 +458,7 @@ } - if (mq->recvbuf[0] == 8) { + if (mq->recvbuf[0] == MAPLE_RESPONSE_DATATRF) { /* int res = mq->recvbuf[0]; printk @@ -456,13 +469,13 @@ mq->recvbuf[8], mq->recvbuf[9], mq->recvbuf[10], mq->recvbuf[11]); */ - block_buffer = kmalloc(512, GFP_KERNEL); + block_buffer = kmalloc(VMU_BLOCK_SIZE, GFP_KERNEL); /* Copy over */ - memcpy(block_buffer, mq->recvbuf + 12, 512); + memcpy(block_buffer, mq->recvbuf + 12, VMU_BLOCK_SIZE); lastmq = mq; wake_up_interruptible(&wq_mq); /* Wake sleeping code */ - memcpy(vmu_cache->buffer, block_buffer, 512); + memcpy(vmu_cache->buffer, block_buffer, VMU_BLOCK_SIZE); vmu_cache->block = mq->recvbuf[11] & 0xff; vmu_cache->jiffies_atc = jiffies; /* Mark the creation time */ vmu_cache->valid = 1; /* Block is now valid */ @@ -482,7 +495,7 @@ struct mapleq *mqu = (struct mapleq *) &(d->mq); - mqu->command = 1; + mqu->command = MAPLE_COMMAND_DEVINFO; mqu->length = 0; lastmq = NULL; @@ -544,7 +557,7 @@ /* Now query flash partition 0 to find definitve block size */ mqu = (struct mapleq *) &(d->mq); - mqu->command = 10; + mqu->command = MAPLE_COMMAND_GETMINFO ; mqu->length = 2; ((unsigned long *) (mqu->recvbuf))[0] = cpu_to_be32(MAPLE_FUNC_MEMCARD); @@ -584,9 +597,9 @@ /* This is 'other' */ vmu_flash_mtd->type = MTD_OTHER; - vmu_flash_mtd->flags = 0; + 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 / card->writecnt; + vmu_flash_mtd->erasesize = VMU_BLOCK_SIZE; /* Mandatory functions */ vmu_flash_mtd->write = vmu_flash_write; @@ -613,7 +626,7 @@ /* Create the cache */ vmu_cache = kmalloc(64, GFP_KERNEL); - vmu_cache->buffer = kmalloc(512, GFP_KERNEL); + vmu_cache->buffer = kmalloc(VMU_BLOCK_SIZE, GFP_KERNEL); vmu_cache->valid = 0; return 0; |