[PATCH] cfi: Fixup of write errors on XIP

Korolev, Alexey alexey.korolev at intel.com
Wed Mar 1 13:20:08 EST 2006


Hi all,

Several days ago I sent this patch to the list. I wonder are there any
objections to it?
I guess this patch shouldn't break anything. It just fixes write errors
I saw in our tests. The patch has been verified on several
configurations. 
If you don't mind I will commit it by the end of this week.

Thanks,
Alexey 

 
> Here is fixup of issue I have seen on XIP configuration. 
> Sometimes I received write errors with message "buffer write error
> (status timeout)" on test  which did read write and erase on several
> volumes at the same time.
> 
> I investigated the issue. 
> The scenario of the issue is following:
 
> 1. do_write_buffer 
> 2. Waiting for write complete in xip_udelay
> 3. System Interrupt
> 4. Write suspend
> 5. Rescheduling
> 6. Block erasing by other process. ( This operation typically took
> rather long time )
> 7. Complete, rescheduling 
> 8. Return to write (write is not complete due to suspend ). 
> 9. Check timeout. Time is up.
> 10. Error.
>  
> I made small fixup for these issue. Please see patch below.


===================================================================
--- c/drivers/mtd/chips/cfi_cmdset_0001.c	2006-02-22
20:58:05.869203280 +0300
+++ b/drivers/mtd/chips/cfi_cmdset_0001.c	2006-02-22
20:55:42.272033368 +0300
@@ -1571,6 +1571,7 @@
 	/* GO GO GO */
 	map_write(map, CMD(0xd0), cmd_adr);
 	chip->state = FL_WRITING;
+	chip->write_suspended = 0;
 
 	INVALIDATE_CACHE_UDELAY(map, chip, cmd_adr,
 				adr, len,
@@ -1592,6 +1593,12 @@
 			continue;
 		}
 
+		/* Somebody suspended write. We should reset timeo. */
+		if (chip->write_suspended) {
+			chip->write_suspended = 0;
+			timeo = jiffies + (HZ/2);
+		}
+		
 		status = map_read(map, cmd_adr);
 		if (map_word_andequal(map, status, status_OK,
status_OK))
 			break;
====================================================================





More information about the linux-mtd mailing list