support 4GB disk.

This commit is contained in:
zhaoyifeng 2011-01-21 18:03:02 +08:00
parent 17c6f64a46
commit 1cb77a4a76
4 changed files with 32 additions and 16 deletions

28
drivers/mtd/mtd_blkdevs.c Normal file → Executable file
View File

@ -38,9 +38,24 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
{
unsigned long block, nsect;
char *buf;
#if 0
block = blk_rq_pos(req) << 9 >> tr->blkshift;
nsect = blk_rq_cur_bytes(req) >> tr->blkshift;
#else //modify by zyf for cap>=4GB 20110120
block = blk_rq_pos(req);
nsect = blk_rq_cur_bytes(req) >> tr->blkshift;
if(tr->blkshift != 9)
{
if(tr->blkshift > 9)
{
block = blk_rq_pos(req) >> (tr->blkshift - 9);
}
else
{
block = blk_rq_pos(req) << (9 - tr->blkshift);
}
}
#endif
buf = req->buffer;
@ -56,8 +71,8 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
switch(rq_data_dir(req)) {
case READ:
for (; nsect > 0; nsect--, block++, buf += tr->blksize)
if (tr->readsect(dev, block, buf))
//for (; nsect > 0; nsect--, block++, buf += tr->blksize)
if (tr->readsect(dev, block,nsect, buf))
return -EIO;
return 0;
@ -65,8 +80,8 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
if (!tr->writesect)
return -EIO;
for (; nsect > 0; nsect--, block++, buf += tr->blksize)
if (tr->writesect(dev, block, buf))
//for (; nsect > 0; nsect--, block++, buf += tr->blksize)
if (tr->writesect(dev, block,nsect, buf))
return -EIO;
return 0;
@ -277,7 +292,8 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
/* 2.5 has capacity in units of 512 bytes while still
having BLOCK_SIZE_BITS set to 10. Just to keep us amused. */
set_capacity(gd, (new->size * tr->blksize) >> 9);
//set_capacity(gd, (new->size * tr->blksize) >> 9);
set_capacity(gd, (new->size >> 9) * tr->blksize); //modify by zyf for cap>=4GB 20110120
gd->private_data = new;
new->blkcore_priv = gd;

8
drivers/mtd/mtdblock.c Normal file → Executable file
View File

@ -242,14 +242,14 @@ static int do_cached_read (struct mtdblk_dev *mtdblk, unsigned long pos,
}
static int mtdblock_readsect(struct mtd_blktrans_dev *dev,
unsigned long block, char *buf)
unsigned long block,unsigned long nsect, char *buf)
{
struct mtdblk_dev *mtdblk = mtdblks[dev->devnum];
return do_cached_read(mtdblk, block<<9, 512, buf);
return do_cached_read(mtdblk, block<<9, 512*nsect, buf);
}
static int mtdblock_writesect(struct mtd_blktrans_dev *dev,
unsigned long block, char *buf)
unsigned long block,unsigned long nsect, char *buf)
{
struct mtdblk_dev *mtdblk = mtdblks[dev->devnum];
if (unlikely(!mtdblk->cache_data && mtdblk->cache_size)) {
@ -261,7 +261,7 @@ static int mtdblock_writesect(struct mtd_blktrans_dev *dev,
* return -EAGAIN sometimes, but why bother?
*/
}
return do_cached_write(mtdblk, block<<9, 512, buf);
return do_cached_write(mtdblk, block<<9, 512*nsect, buf);
}
static int mtdblock_open(struct mtd_blktrans_dev *mbd)

View File

@ -10,21 +10,21 @@
#include <linux/mtd/blktrans.h>
static int mtdblock_readsect(struct mtd_blktrans_dev *dev,
unsigned long block, char *buf)
unsigned long block, unsigned long nsect, char *buf)
{
size_t retlen;
if (dev->mtd->read(dev->mtd, (block * 512), 512, &retlen, buf))
if (dev->mtd->read(dev->mtd, (block * 512), 512*nsect, &retlen, buf))
return 1;
return 0;
}
static int mtdblock_writesect(struct mtd_blktrans_dev *dev,
unsigned long block, char *buf)
unsigned long block, unsigned long nsect, char *buf)
{
size_t retlen;
if (dev->mtd->write(dev->mtd, (block * 512), 512, &retlen, buf))
if (dev->mtd->write(dev->mtd, (block * 512), 512*nsect, &retlen, buf))
return 1;
return 0;
}

4
include/linux/mtd/blktrans.h Normal file → Executable file
View File

@ -38,9 +38,9 @@ struct mtd_blktrans_ops {
/* Access functions */
int (*readsect)(struct mtd_blktrans_dev *dev,
unsigned long block, char *buffer);
unsigned long block,unsigned long nsect, char *buffer);
int (*writesect)(struct mtd_blktrans_dev *dev,
unsigned long block, char *buffer);
unsigned long block,unsigned long nsect, char *buffer);
int (*discard)(struct mtd_blktrans_dev *dev,
unsigned long block, unsigned nr_blocks);