{
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;
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;
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;
/* 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;
}
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)) {
* 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)
#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;
}
/* 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);