--- cfi.c.orig	2009-01-16 08:02:24.000000000 +0100
+++ cfi.c	2009-04-09 16:01:45.000000000 +0200
@@ -1589,7 +1589,7 @@
 	u8 command[8];
 
 	/* Calculate buffer size and boundary mask */
-	u32 buffersize = 1UL << cfi_info->max_buf_write_size;
+	u32 buffersize = (1UL << cfi_info->max_buf_write_size) * (bank->bus_width / bank->chip_width);
 	u32 buffermask = buffersize-1;
 	u32 bufferwsize;
 
@@ -1609,6 +1609,9 @@
 		return ERROR_FLASH_OPERATION_FAILED;
 	}
 
+	bufferwsize/=(bank->bus_width / bank->chip_width);
+
+
 	/* Check for valid size */
 	if (wordcount > bufferwsize)
 	{
@@ -1725,7 +1728,7 @@
 	cfi_spansion_pri_ext_t *pri_ext = cfi_info->pri_ext;
 
 	/* Calculate buffer size and boundary mask */
-	u32 buffersize = 1UL << cfi_info->max_buf_write_size;
+	u32 buffersize = (1UL << cfi_info->max_buf_write_size) * (bank->bus_width / bank->chip_width);
 	u32 buffermask = buffersize-1;
 	u32 bufferwsize;
 
@@ -1745,6 +1748,8 @@
 		return ERROR_FLASH_OPERATION_FAILED;
 	}
 
+	bufferwsize/=(bank->bus_width / bank->chip_width);
+
 	/* Check for valid size */
 	if (wordcount > bufferwsize)
 	{
@@ -1946,7 +1951,8 @@
 	{
 		if (retval == ERROR_TARGET_RESOURCE_NOT_AVAILABLE)
 		{
-			u32 buffersize = 1UL << cfi_info->max_buf_write_size;
+			//adjust buffersize for chip width
+			u32 buffersize = (1UL << cfi_info->max_buf_write_size) * (bank->bus_width / bank->chip_width);
 			u32 buffermask = buffersize-1;
 			u32 bufferwsize;
 
@@ -1959,6 +1965,8 @@
 				LOG_ERROR("Unsupported chip width %d", bank->chip_width);
 				return ERROR_FLASH_OPERATION_FAILED;
 			}
+			
+			bufferwsize/=(bank->bus_width / bank->chip_width);
 
 			/* fall back to memory writes */
 			while (count >= bank->bus_width)
