Support for the mtd part size larger than 4GB part 2.
authorzhaoyifeng <zyf@rock-chips.com>
Mon, 21 Mar 2011 09:35:58 +0000 (17:35 +0800)
committerzhaoyifeng <zyf@rock-chips.com>
Mon, 21 Mar 2011 09:35:58 +0000 (17:35 +0800)
drivers/mtd/mtdblock.c

index 3a5653a3c002e3ef6aa0dabccc85a6cf166e5427..e9051b4f39c103b30c6f3831fe5edbd6424e6593 100755 (executable)
@@ -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;