ulong mmc_bwrite(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt, const void *src) #endif { #ifdef CONFIG_BLK struct blk_desc *block_dev = dev_get_uclass_platdata(dev); #endif int dev_num = block_dev->devnum; lbaint_t cur, blocks_todo = blkcnt; int err; struct mmc *mmc = find_mmc_device(dev_num); if (!mmc) return 0; err = blk_select_hwpart_devnum(IF_TYPE_MMC, dev_num, block_dev->hwpart); if (err < 0) return 0; if (mmc_set_blocklen(mmc, mmc->write_bl_len)) return 0; do { cur = (blocks_todo > mmc->cfg->b_max) ? mmc->cfg->b_max : blocks_todo; if (mmc_write_blocks(mmc, start, cur, src) != cur) return 0; blocks_todo -= cur; start += cur; src += cur * mmc->write_bl_len; } while (blocks_todo > 0); return blkcnt; }
unsigned long mmc_bwrite(int dev_num, unsigned long start, unsigned blkcnt, const void*src) { unsigned cur, blocks_todo = blkcnt; struct mmc *mmc = find_mmc_device(dev_num); if (blkcnt == 0) return 0; if (!mmc) return 0; if (mmc_set_blocklen(mmc, mmc->write_bl_len)) return 0; do { cur = (blocks_todo > mmc->b_max) ? mmc->b_max : blocks_todo; if(mmc_write_blocks(mmc, start, cur, src) != cur) return 0; blocks_todo -= cur; start += cur; // src += cur * mmc->write_bl_len; src = (char*)src + cur * mmc->write_bl_len; } while (blocks_todo > 0); return blkcnt; }
unsigned long mmc_bwrite(int dev_num, unsigned long start, unsigned blkcnt, const void*src) { unsigned cur, blocks_todo = blkcnt; struct mmc *mmc = find_mmc_device(dev_num); if (blkcnt == 0){ mmcinfo("mmc %d blkcnt should not be 0\n",dev_num); return 0; } if (!mmc){ mmcinfo("Can not found device %d\n",dev_num); return 0; } if (mmc_set_blocklen(mmc, mmc->write_bl_len)){ mmcinfo("mmc %d set block len failed\n",mmc->control_num); // sunxi_mmc_exit(dev_num); // if(sunxi_mmc_init(dev_num,4)<0){ // mmcinfo("re init failed\n"); // return 0; // } return 0; } do { cur = (blocks_todo > mmc->b_max) ? mmc->b_max : blocks_todo; if(mmc_write_blocks(mmc, start, cur, src) != cur){ mmcinfo("mmc %d write block failed\n",mmc->control_num); return 0; } blocks_todo -= cur; start += cur; // src += cur * mmc->write_bl_len; src = (char*)src + cur * mmc->write_bl_len; } while (blocks_todo > 0); return blkcnt; }