From 688768b05971715cb6d6ac6b31fc53e5cd6f3d85 Mon Sep 17 00:00:00 2001 From: zhaoyifeng Date: Mon, 21 Mar 2011 17:35:58 +0800 Subject: [PATCH] Support for the mtd part size larger than 4GB part 2. --- drivers/mtd/mtdblock.c | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/drivers/mtd/mtdblock.c b/drivers/mtd/mtdblock.c index 3a5653a3c002..e9051b4f39c1 100755 --- a/drivers/mtd/mtdblock.c +++ b/drivers/mtd/mtdblock.c @@ -124,8 +124,8 @@ static int write_cached_data (struct mtdblk_dev *mtdblk) return 0; } - -static int do_cached_write (struct mtdblk_dev *mtdblk, unsigned long pos, +#if 0 +static int do_cached_write (struct mtdblk_dev *mtdblk, loff_t pos, int len, const char *buf) { struct mtd_info *mtd = mtdblk->mtd; @@ -195,7 +195,7 @@ static int do_cached_write (struct mtdblk_dev *mtdblk, unsigned long pos, } -static int do_cached_read (struct mtdblk_dev *mtdblk, unsigned long pos, +static int do_cached_read (struct mtdblk_dev *mtdblk, loff_t pos, int len, char *buf) { struct mtd_info *mtd = mtdblk->mtd; @@ -242,10 +242,10 @@ static int do_cached_read (struct mtdblk_dev *mtdblk, unsigned long pos, } static int mtdblock_readsect(struct mtd_blktrans_dev *dev, - unsigned long block,unsigned long nsect, char *buf) + loff_t block,unsigned long nsect, char *buf) { struct mtdblk_dev *mtdblk = mtdblks[dev->devnum]; - return do_cached_read(mtdblk, block<<9, 512*nsect, buf); + return do_cached_read(mtdblk, (loff_t)block<<9, 512*nsect, buf); } static int mtdblock_writesect(struct mtd_blktrans_dev *dev, @@ -261,9 +261,35 @@ static int mtdblock_writesect(struct mtd_blktrans_dev *dev, * return -EAGAIN sometimes, but why bother? */ } - return do_cached_write(mtdblk, block<<9, 512*nsect, buf); + return do_cached_write(mtdblk, (loff_t)block<<9, 512*nsect, buf); } +#else +static int mtdblock_readsect(struct mtd_blktrans_dev *dev, + unsigned long block,unsigned long nsect, char *buf) +{ + struct mtdblk_dev *mtdblk = mtdblks[dev->devnum]; + struct mtd_info *mtd = mtdblk->mtd; + size_t retlen,len; + loff_t pos = (loff_t)block*512; + len = 512*nsect; + DEBUG(MTD_DEBUG_LEVEL2, "mtdblock: read on \"%s\" at 0x%llx, size 0x%x\n",mtd->name, pos, len); + return mtd->read(mtd, pos, len, &retlen, buf); +} + +static int mtdblock_writesect(struct mtd_blktrans_dev *dev, + unsigned long block,unsigned long nsect, char *buf) +{ + struct mtdblk_dev *mtdblk = mtdblks[dev->devnum]; + struct mtd_info *mtd = mtdblk->mtd; + size_t retlen,len; + loff_t pos = (loff_t)block*512; + len = 512*nsect; + + DEBUG(MTD_DEBUG_LEVEL2, "mtdblock: write on \"%s\" at 0x%llx, size 0x%x\n",mtd->name, pos, len); + return mtd->write(mtd, pos, len, &retlen, buf); +} +#endif static int mtdblock_open(struct mtd_blktrans_dev *mbd) { struct mtdblk_dev *mtdblk; -- 2.34.1