support 4GB disk.
authorzhaoyifeng <zyf@ubuntu-fs.(none)>
Fri, 21 Jan 2011 10:03:02 +0000 (18:03 +0800)
committerzhaoyifeng <zyf@ubuntu-fs.(none)>
Fri, 21 Jan 2011 10:03:02 +0000 (18:03 +0800)
drivers/mtd/mtd_blkdevs.c [changed mode: 0644->0755]
drivers/mtd/mtdblock.c [changed mode: 0644->0755]
drivers/mtd/mtdblock_ro.c
include/linux/mtd/blktrans.h [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 8ca17a3..4c1ded5
@@ -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;
old mode 100644 (file)
new mode 100755 (executable)
index 9f41b1a..3a5653a
@@ -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)
index 852165f8b1c3510720cfc03ad80c2e68b4cbd728..f807b2c08bb0765069f84b446fc3bf7c47c04ba8 100644 (file)
 #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;
 }
old mode 100644 (file)
new mode 100755 (executable)
index 8b4aa05..2e0ef53
@@ -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);