diff --git a/src/flash/mflash.c b/src/flash/mflash.c
index b5c7d46ba912171649bec9ef59eec0b88005d231..f2cfd4a111f49a053a40fc48bd85b9c13e85f61a 100644
--- a/src/flash/mflash.c
+++ b/src/flash/mflash.c
@@ -670,13 +670,11 @@ static int mg_mflash_write(u32 addr, u8 *buff, u32 len)
 
 static int mg_write_cmd(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
-	u32 address, buf_cnt;
+	u32 address, buf_cnt, cnt, res, i;
 	u8 *buffer;
-	/* TODO : multi-bank support, large file support */
 	fileio_t fileio;
 	duration_t duration;
 	char *duration_text;
-	int ret;
 
 	if (argc != 3) {
 		return ERROR_COMMAND_SYNTAX_ERROR;
@@ -688,18 +686,32 @@ static int mg_write_cmd(struct command_context_s *cmd_ctx, char *cmd, char **arg
 		return ERROR_FAIL;
 	}
 
-	buffer = malloc(fileio.size);
-
-	if (fileio_read(&fileio, fileio.size, buffer, &buf_cnt) != ERROR_OK)
-	{
-		free(buffer);
+	buffer = malloc(MG_FILEIO_CHUNK);
+	if (!buffer) {
 		fileio_close(&fileio);
 		return ERROR_FAIL;
 	}
 
+	cnt = fileio.size / MG_FILEIO_CHUNK;
+	res = fileio.size % MG_FILEIO_CHUNK;
+
 	duration_start_measure(&duration);
 
-	ret = mg_mflash_write(address, buffer, (u32)fileio.size);
+	for (i = 0; i < cnt; i++) {
+		if (fileio_read(&fileio, MG_FILEIO_CHUNK, buffer, &buf_cnt) !=
+				ERROR_OK)
+			goto mg_write_cmd_err;
+		if (mg_mflash_write(address, buffer, MG_FILEIO_CHUNK) != ERROR_OK)
+			goto mg_write_cmd_err;
+		address += MG_FILEIO_CHUNK;
+	}
+ 
+	if (res) {
+		if (fileio_read(&fileio, res, buffer, &buf_cnt) != ERROR_OK)
+			goto mg_write_cmd_err;			
+		if (mg_mflash_write(address, buffer, res) != ERROR_OK)
+			goto mg_write_cmd_err;
+	}
 
 	duration_stop_measure(&duration, &duration_text);
 
@@ -708,19 +720,24 @@ static int mg_write_cmd(struct command_context_s *cmd_ctx, char *cmd, char **arg
 		(float)fileio.size / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0)));
 
 	free(duration_text);
-
-	fileio_close(&fileio);
-
 	free(buffer);
+	fileio_close(&fileio);
 
 	return ERROR_OK;
+
+mg_write_cmd_err:
+	duration_stop_measure(&duration, &duration_text);
+	free(duration_text);
+ 	free(buffer);
+	fileio_close(&fileio);
+
+	return ERROR_FAIL;
 }
 
 static int mg_dump_cmd(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
-	u32 address, size_written, size;
+	u32 address, size_written, size, cnt, res, i;
 	u8 *buffer;
-	/* TODO : multi-bank support */
 	fileio_t fileio;
 	duration_t duration;
 	char *duration_text;
@@ -735,30 +752,54 @@ static int mg_dump_cmd(struct command_context_s *cmd_ctx, char *cmd, char **args
 	if (fileio_open(&fileio, args[1], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK) {
 		return ERROR_FAIL;
 	}
+ 
+	buffer = malloc(MG_FILEIO_CHUNK);
+	if (!buffer) {
+		fileio_close(&fileio);
+		return ERROR_FAIL;
+	}
 
-	buffer = malloc(size);
-
+	cnt = size / MG_FILEIO_CHUNK;
+	res = size % MG_FILEIO_CHUNK;
+ 
 	duration_start_measure(&duration);
 
-	mg_mflash_read(address, buffer, size);
+	for (i = 0; i < cnt; i++) {
+		if (mg_mflash_read(address, buffer, MG_FILEIO_CHUNK) != ERROR_OK)
+			goto mg_dump_cmd_err;
+		if (fileio_write(&fileio, MG_FILEIO_CHUNK, buffer, &size_written)
+				!= ERROR_OK)
+			goto mg_dump_cmd_err;
+		address += MG_FILEIO_CHUNK;
+	}
+ 
+	if (res) {
+		if (mg_mflash_read(address, buffer, res) != ERROR_OK)
+			goto mg_dump_cmd_err;
+		if (fileio_write(&fileio, res, buffer, &size_written) != ERROR_OK)
+			goto mg_dump_cmd_err;
+	}
 
 	duration_stop_measure(&duration, &duration_text);
 
-	fileio_write(&fileio, size, buffer, &size_written);
-
 	command_print(cmd_ctx, "dump image (address 0x%8.8x size %u) to file %s in %s (%f kB/s)",
 				address, size, args[1], duration_text,
 				(float)size / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0)));
 
 	free(duration_text);
-
-	fileio_close(&fileio);
-
 	free(buffer);
+	fileio_close(&fileio);
 
 	return ERROR_OK;
-}
 
+mg_dump_cmd_err:
+	duration_stop_measure(&duration, &duration_text);
+	free(duration_text);
+ 	free(buffer);
+	fileio_close(&fileio);
+ 
+	return ERROR_FAIL;	
+}
 
 static int mg_set_feature(mg_feature_id feature, mg_feature_val config)
 {
diff --git a/src/flash/mflash.h b/src/flash/mflash.h
index da148dcae3c5c405e711bb197d29fdd84fc5722d..b42eaeffff0d4a9f6c43567ea065f16facfc6ae1 100644
--- a/src/flash/mflash.h
+++ b/src/flash/mflash.h
@@ -176,6 +176,8 @@ extern int mflash_init_drivers(struct command_context_s *cmd_ctx);
 
 #define MG_UNLOCK_OTP_AREA 0xFF
 
+#define MG_FILEIO_CHUNK 1048576
+
 typedef enum _mg_io_type_wait{
 
 	mg_io_wait_bsy       = 1,