|
@@ -78,17 +78,11 @@ struct mmc *find_mmc_device(int dev_num)
|
|
|
}
|
|
|
|
|
|
static ulong
|
|
|
-mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
|
|
|
+mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
|
|
|
{
|
|
|
struct mmc_cmd cmd;
|
|
|
struct mmc_data data;
|
|
|
- int err;
|
|
|
- int stoperr = 0;
|
|
|
- struct mmc *mmc = find_mmc_device(dev_num);
|
|
|
- int blklen;
|
|
|
-
|
|
|
- if (!mmc)
|
|
|
- return -1;
|
|
|
+ int blklen, err;
|
|
|
|
|
|
blklen = mmc->write_bl_len;
|
|
|
|
|
@@ -97,12 +91,6 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
|
|
|
start + blkcnt, mmc->block_dev.lba);
|
|
|
return 0;
|
|
|
}
|
|
|
- err = mmc_set_blocklen(mmc, mmc->write_bl_len);
|
|
|
-
|
|
|
- if (err) {
|
|
|
- printf("set write bl len failed\n\r");
|
|
|
- return err;
|
|
|
- }
|
|
|
|
|
|
if (blkcnt > 1)
|
|
|
cmd.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK;
|
|
@@ -134,9 +122,45 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
|
|
|
cmd.cmdarg = 0;
|
|
|
cmd.resp_type = MMC_RSP_R1b;
|
|
|
cmd.flags = 0;
|
|
|
- stoperr = mmc_send_cmd(mmc, &cmd, NULL);
|
|
|
+ err = mmc_send_cmd(mmc, &cmd, NULL);
|
|
|
+ if (err) {
|
|
|
+ printf("mmc fail to send stop cmd\n\r");
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return blkcnt;
|
|
|
+}
|
|
|
+
|
|
|
+static ulong
|
|
|
+mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+ struct mmc *mmc = find_mmc_device(dev_num);
|
|
|
+ lbaint_t cur, blocks_todo = blkcnt;
|
|
|
+
|
|
|
+ if (!mmc)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ err = mmc_set_blocklen(mmc, mmc->write_bl_len);
|
|
|
+ if (err) {
|
|
|
+ printf("set write bl len failed\n\r");
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
+ do {
|
|
|
+ /*
|
|
|
+ * The 65535 constraint comes from some hardware has
|
|
|
+ * only 16 bit width block number counter
|
|
|
+ */
|
|
|
+ cur = (blocks_todo > 65535) ? 65535 : blocks_todo;
|
|
|
+ if(mmc_write_blocks(mmc, start, cur, src) != cur)
|
|
|
+ return -1;
|
|
|
+ blocks_todo -= cur;
|
|
|
+ start += cur;
|
|
|
+ src += cur * mmc->write_bl_len;
|
|
|
+ } while (blocks_todo > 0);
|
|
|
+
|
|
|
return blkcnt;
|
|
|
}
|
|
|
|