diff --git a/src/flash/cfi.c b/src/flash/cfi.c
index a4b95f08bd4c19b71bd15803ab3dae9ca7f357aa..fea75a741ff4470440c375ae3d03b9ddffdccaa0 100644
--- a/src/flash/cfi.c
+++ b/src/flash/cfi.c
@@ -1738,21 +1738,25 @@ int cfi_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count)
 			/* fall back to memory writes */
 			while (count >= bank->bus_width)
 			{
+				int fallback;
 				if ((write_p & 0xff) == 0)
 				{
 					LOG_INFO("Programming at %08x, count %08x bytes remaining", write_p, count);
 				}
+				fallback = 1;
 				if ((bufferwsize > 0) && (count >= buffersize) && !(write_p & buffermask))
 				{
 					retval = cfi_write_words(bank, buffer, bufferwsize, write_p);
-					if (retval != ERROR_OK)
-						return retval;
-
-					buffer += buffersize;
-					write_p += buffersize;
-					count -= buffersize;
+					if (retval == ERROR_OK)
+					{
+						buffer += buffersize;
+						write_p += buffersize;
+						count -= buffersize;
+						fallback=0;
+					}
 				}
-				else
+				/* try the slow way? */
+				if (fallback)
 				{
 					for (i = 0; i < bank->bus_width; i++)
 						current_word[i] = 0;