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