From 50817f6afed0cd2286a4bd5f9a23f375319f9712 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Mon, 15 Aug 2011 00:15:36 +0000 Subject: [PATCH] kernel: disable cfi cmdset 0002 erase suspend on some platforms, erase suspend leads to data corruption and lockups when write ops collide with erase ops. this has been observed on the buffalo wzr-hp-g300nh. rather than play whack-a-mole with a hard to reproduce issue on a variety of devices, simply disable erase suspend, as it will usually not produce any useful gain on the small filesystems used on embedded hardware. SVN-Revision: 27984 --- .../461-cfi_cmdset_0002_no_erase_suspend.patch | 11 +++++++++++ .../460-cfi_cmdset_0002_no_erase_suspend.patch | 11 +++++++++++ .../460-cfi_cmdset_0002_no_erase_suspend.patch | 11 +++++++++++ 3 files changed, 33 insertions(+) create mode 100644 target/linux/generic/patches-2.6.39/461-cfi_cmdset_0002_no_erase_suspend.patch create mode 100644 target/linux/generic/patches-3.0/460-cfi_cmdset_0002_no_erase_suspend.patch create mode 100644 target/linux/generic/patches-3.1/460-cfi_cmdset_0002_no_erase_suspend.patch diff --git a/target/linux/generic/patches-2.6.39/461-cfi_cmdset_0002_no_erase_suspend.patch b/target/linux/generic/patches-2.6.39/461-cfi_cmdset_0002_no_erase_suspend.patch new file mode 100644 index 0000000000..d7b44ef719 --- /dev/null +++ b/target/linux/generic/patches-2.6.39/461-cfi_cmdset_0002_no_erase_suspend.patch @@ -0,0 +1,11 @@ +--- a/drivers/mtd/chips/cfi_cmdset_0002.c ++++ b/drivers/mtd/chips/cfi_cmdset_0002.c +@@ -684,7 +684,7 @@ static int get_chip(struct map_info *map + return 0; + + case FL_ERASING: +- if (!cfip || !(cfip->EraseSuspend & (0x1|0x2)) || ++ if (1 /* no suspend */ || !cfip || !(cfip->EraseSuspend & (0x1|0x2)) || + !(mode == FL_READY || mode == FL_POINT || + (mode == FL_WRITING && (cfip->EraseSuspend & 0x2)))) + goto sleep; diff --git a/target/linux/generic/patches-3.0/460-cfi_cmdset_0002_no_erase_suspend.patch b/target/linux/generic/patches-3.0/460-cfi_cmdset_0002_no_erase_suspend.patch new file mode 100644 index 0000000000..04ef193a86 --- /dev/null +++ b/target/linux/generic/patches-3.0/460-cfi_cmdset_0002_no_erase_suspend.patch @@ -0,0 +1,11 @@ +--- a/drivers/mtd/chips/cfi_cmdset_0002.c ++++ b/drivers/mtd/chips/cfi_cmdset_0002.c +@@ -685,7 +685,7 @@ static int get_chip(struct map_info *map + return 0; + + case FL_ERASING: +- if (!cfip || !(cfip->EraseSuspend & (0x1|0x2)) || ++ if (1 /* no suspend */ || !cfip || !(cfip->EraseSuspend & (0x1|0x2)) || + !(mode == FL_READY || mode == FL_POINT || + (mode == FL_WRITING && (cfip->EraseSuspend & 0x2)))) + goto sleep; diff --git a/target/linux/generic/patches-3.1/460-cfi_cmdset_0002_no_erase_suspend.patch b/target/linux/generic/patches-3.1/460-cfi_cmdset_0002_no_erase_suspend.patch new file mode 100644 index 0000000000..04ef193a86 --- /dev/null +++ b/target/linux/generic/patches-3.1/460-cfi_cmdset_0002_no_erase_suspend.patch @@ -0,0 +1,11 @@ +--- a/drivers/mtd/chips/cfi_cmdset_0002.c ++++ b/drivers/mtd/chips/cfi_cmdset_0002.c +@@ -685,7 +685,7 @@ static int get_chip(struct map_info *map + return 0; + + case FL_ERASING: +- if (!cfip || !(cfip->EraseSuspend & (0x1|0x2)) || ++ if (1 /* no suspend */ || !cfip || !(cfip->EraseSuspend & (0x1|0x2)) || + !(mode == FL_READY || mode == FL_POINT || + (mode == FL_WRITING && (cfip->EraseSuspend & 0x2)))) + goto sleep; -- 2.30.2