linux-mtd.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 1/8] mtd: cfi_probe: enter Auto Select Mode after filling cfi->cfiq members
@ 2010-04-22  8:35 Guillaume LECERF
  2010-04-22  8:35 ` [PATCH v3 2/8] mtd: cfi_probe: make the addresses used to enter Auto Select Mode variable Guillaume LECERF
                   ` (7 more replies)
  0 siblings, 8 replies; 12+ messages in thread
From: Guillaume LECERF @ 2010-04-22  8:35 UTC (permalink / raw)
  To: linux-mtd; +Cc: David Woodhouse, Wolfram Sang, Artem Bityutskiy

Move the code to enter Auto Select Mode down to be able to use cfi->cfiq
members to add support for chips using alternative sequence / unlock
addresses.

Signed-off-by: Guillaume LECERF <glecerf@gmail.com>
---
 drivers/mtd/chips/cfi_probe.c |   47 +++++++++++++++++++++--------------------
 1 files changed, 24 insertions(+), 23 deletions(-)

diff --git a/drivers/mtd/chips/cfi_probe.c b/drivers/mtd/chips/cfi_probe.c
index e63e674..f657d16 100644
--- a/drivers/mtd/chips/cfi_probe.c
+++ b/drivers/mtd/chips/cfi_probe.c
@@ -181,29 +181,6 @@ static int __xipram cfi_chip_setup(struct map_info *map,
 	for (i=0; i<(sizeof(struct cfi_ident) + num_erase_regions * 4); i++)
 		((unsigned char *)cfi->cfiq)[i] = cfi_read_query(map,base + (0x10 + i)*ofs_factor);
 
-	/* Note we put the device back into Read Mode BEFORE going into Auto
-	 * Select Mode, as some devices support nesting of modes, others
-	 * don't. This way should always work.
-	 * On cmdset 0001 the writes of 0xaa and 0x55 are not needed, and
-	 * so should be treated as nops or illegal (and so put the device
-	 * back into Read Mode, which is a nop in this case).
-	 */
-	cfi_send_gen_cmd(0xf0,     0, base, map, cfi, cfi->device_type, NULL);
-	cfi_send_gen_cmd(0xaa, 0x555, base, map, cfi, cfi->device_type, NULL);
-	cfi_send_gen_cmd(0x55, 0x2aa, base, map, cfi, cfi->device_type, NULL);
-	cfi_send_gen_cmd(0x90, 0x555, base, map, cfi, cfi->device_type, NULL);
-	cfi->mfr = cfi_read_query16(map, base);
-	cfi->id = cfi_read_query16(map, base + ofs_factor);
-
-	/* Get AMD/Spansion extended JEDEC ID */
-	if (cfi->mfr == CFI_MFR_AMD && (cfi->id & 0xff) == 0x7e)
-		cfi->id = cfi_read_query(map, base + 0xe * ofs_factor) << 8 |
-			  cfi_read_query(map, base + 0xf * ofs_factor);
-
-	/* Put it back into Read Mode */
-	cfi_qry_mode_off(base, map, cfi);
-	xip_allowed(base, map);
-
 	/* Do any necessary byteswapping */
 	cfi->cfiq->P_ID = le16_to_cpu(cfi->cfiq->P_ID);
 
@@ -228,6 +205,30 @@ static int __xipram cfi_chip_setup(struct map_info *map,
 #endif
 	}
 
+	/*
+	 * Note we put the device back into Read Mode BEFORE going into Auto
+	 * Select Mode, as some devices support nesting of modes, others
+	 * don't. This way should always work.
+	 * On cmdset 0001 the writes of 0xaa and 0x55 are not needed, and
+	 * so should be treated as nops or illegal (and so put the device
+	 * back into Read Mode, which is a nop in this case).
+	 */
+	cfi_send_gen_cmd(0xf0,     0, base, map, cfi, cfi->device_type, NULL);
+	cfi_send_gen_cmd(0xaa, 0x555, base, map, cfi, cfi->device_type, NULL);
+	cfi_send_gen_cmd(0x55, 0x2aa, base, map, cfi, cfi->device_type, NULL);
+	cfi_send_gen_cmd(0x90, 0x555, base, map, cfi, cfi->device_type, NULL);
+	cfi->mfr = cfi_read_query16(map, base);
+	cfi->id = cfi_read_query16(map, base + ofs_factor);
+
+	/* Get AMD/Spansion extended JEDEC ID */
+	if (cfi->mfr == CFI_MFR_AMD && (cfi->id & 0xff) == 0x7e)
+		cfi->id = cfi_read_query(map, base + 0xe * ofs_factor) << 8 |
+			  cfi_read_query(map, base + 0xf * ofs_factor);
+
+	/* Put it back into Read Mode */
+	cfi_qry_mode_off(base, map, cfi);
+	xip_allowed(base, map);
+
 	printk(KERN_INFO "%s: Found %d x%d devices at 0x%x in %d-bit bank\n",
 	       map->name, cfi->interleave, cfi->device_type*8, base,
 	       map->bankwidth*8);

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 2/8] mtd: cfi_probe: make the addresses used to enter Auto Select Mode variable
  2010-04-22  8:35 [PATCH v3 1/8] mtd: cfi_probe: enter Auto Select Mode after filling cfi->cfiq members Guillaume LECERF
@ 2010-04-22  8:35 ` Guillaume LECERF
  2010-04-22  8:35 ` [PATCH v3 3/8] mtd: cfi_probe: add support for SST 0x0701 vendorname Guillaume LECERF
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Guillaume LECERF @ 2010-04-22  8:35 UTC (permalink / raw)
  To: linux-mtd; +Cc: David Woodhouse, Wolfram Sang, Artem Bityutskiy

Make the addresses used to enter Auto Select Mode variable to leave place
for handling chips using non-standard addresses.

Signed-off-by: Guillaume LECERF <glecerf@gmail.com>
---
 drivers/mtd/chips/cfi_probe.c |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/mtd/chips/cfi_probe.c b/drivers/mtd/chips/cfi_probe.c
index f657d16..045dc10 100644
--- a/drivers/mtd/chips/cfi_probe.c
+++ b/drivers/mtd/chips/cfi_probe.c
@@ -158,6 +158,7 @@ static int __xipram cfi_chip_setup(struct map_info *map,
 	__u32 base = 0;
 	int num_erase_regions = cfi_read_query(map, base + (0x10 + 28)*ofs_factor);
 	int i;
+	int addr_unlock1 = 0x555, addr_unlock2 = 0x2AA;
 
 	xip_enable(base, map, cfi);
 #ifdef DEBUG_CFI
@@ -214,9 +215,9 @@ static int __xipram cfi_chip_setup(struct map_info *map,
 	 * back into Read Mode, which is a nop in this case).
 	 */
 	cfi_send_gen_cmd(0xf0,     0, base, map, cfi, cfi->device_type, NULL);
-	cfi_send_gen_cmd(0xaa, 0x555, base, map, cfi, cfi->device_type, NULL);
-	cfi_send_gen_cmd(0x55, 0x2aa, base, map, cfi, cfi->device_type, NULL);
-	cfi_send_gen_cmd(0x90, 0x555, base, map, cfi, cfi->device_type, NULL);
+	cfi_send_gen_cmd(0xaa, addr_unlock1, base, map, cfi, cfi->device_type, NULL);
+	cfi_send_gen_cmd(0x55, addr_unlock2, base, map, cfi, cfi->device_type, NULL);
+	cfi_send_gen_cmd(0x90, addr_unlock1, base, map, cfi, cfi->device_type, NULL);
 	cfi->mfr = cfi_read_query16(map, base);
 	cfi->id = cfi_read_query16(map, base + ofs_factor);
 

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 3/8] mtd: cfi_probe: add support for SST 0x0701 vendorname
  2010-04-22  8:35 [PATCH v3 1/8] mtd: cfi_probe: enter Auto Select Mode after filling cfi->cfiq members Guillaume LECERF
  2010-04-22  8:35 ` [PATCH v3 2/8] mtd: cfi_probe: make the addresses used to enter Auto Select Mode variable Guillaume LECERF
@ 2010-04-22  8:35 ` Guillaume LECERF
  2010-04-22  8:36 ` [PATCH v3 4/8] mtd: cfi_probe: use P_ID_* definitions instead of hardcoded values Guillaume LECERF
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Guillaume LECERF @ 2010-04-22  8:35 UTC (permalink / raw)
  To: linux-mtd; +Cc: David Woodhouse, Wolfram Sang, Artem Bityutskiy

SST 39VF160x and 39VF320x chips use vendorname id 0x0701 and alternative
unlock addresses. Add support for them in cfi_probe.c.

Signed-off-by: Guillaume LECERF <glecerf@gmail.com>
---
 drivers/mtd/chips/cfi_probe.c |    8 ++++++++
 include/linux/mtd/cfi.h       |    1 +
 2 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/drivers/mtd/chips/cfi_probe.c b/drivers/mtd/chips/cfi_probe.c
index 045dc10..b2acd32 100644
--- a/drivers/mtd/chips/cfi_probe.c
+++ b/drivers/mtd/chips/cfi_probe.c
@@ -206,6 +206,11 @@ static int __xipram cfi_chip_setup(struct map_info *map,
 #endif
 	}
 
+	if (cfi->cfiq->P_ID == P_ID_SST_OLD) {
+		addr_unlock1 = 0x5555;
+		addr_unlock2 = 0x2AAA;
+	}
+
 	/*
 	 * Note we put the device back into Read Mode BEFORE going into Auto
 	 * Select Mode, as some devices support nesting of modes, others
@@ -271,6 +276,9 @@ static char *vendorname(__u16 vendor)
 	case P_ID_SST_PAGE:
 		return "SST Page Write";
 
+	case P_ID_SST_OLD:
+		return "SST 39VF160x/39VF320x";
+
 	case P_ID_INTEL_PERFORMANCE:
 		return "Intel Performance Code";
 
diff --git a/include/linux/mtd/cfi.h b/include/linux/mtd/cfi.h
index cee05b1..5716fc7 100644
--- a/include/linux/mtd/cfi.h
+++ b/include/linux/mtd/cfi.h
@@ -253,6 +253,7 @@ struct cfi_bri_query {
 #define P_ID_MITSUBISHI_STD     0x0100
 #define P_ID_MITSUBISHI_EXT     0x0101
 #define P_ID_SST_PAGE           0x0102
+#define P_ID_SST_OLD            0x0701
 #define P_ID_INTEL_PERFORMANCE  0x0200
 #define P_ID_INTEL_DATA         0x0210
 #define P_ID_RESERVED           0xffff

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 4/8] mtd: cfi_probe: use P_ID_* definitions instead of hardcoded values
  2010-04-22  8:35 [PATCH v3 1/8] mtd: cfi_probe: enter Auto Select Mode after filling cfi->cfiq members Guillaume LECERF
  2010-04-22  8:35 ` [PATCH v3 2/8] mtd: cfi_probe: make the addresses used to enter Auto Select Mode variable Guillaume LECERF
  2010-04-22  8:35 ` [PATCH v3 3/8] mtd: cfi_probe: add support for SST 0x0701 vendorname Guillaume LECERF
@ 2010-04-22  8:36 ` Guillaume LECERF
  2010-04-22  8:36 ` [PATCH v3 5/8] mtd: cfi_cmdset_0002: do not fail on no extended query table as they are both optional Guillaume LECERF
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Guillaume LECERF @ 2010-04-22  8:36 UTC (permalink / raw)
  To: linux-mtd; +Cc: David Woodhouse, Wolfram Sang, Artem Bityutskiy

Use P_ID_* definitions already in include/linux/mtd/cfi.h instead of the
hardcoded values. Make the code more readable.

Signed-off-by: Guillaume LECERF <glecerf@gmail.com>
---
 drivers/mtd/chips/gen_probe.c |   10 +++++-----
 1 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/mtd/chips/gen_probe.c b/drivers/mtd/chips/gen_probe.c
index e2dc964..991c457 100644
--- a/drivers/mtd/chips/gen_probe.c
+++ b/drivers/mtd/chips/gen_probe.c
@@ -242,17 +242,17 @@ static struct mtd_info *check_cmd_set(struct map_info *map, int primary)
 		/* We need these for the !CONFIG_MODULES case,
 		   because symbol_get() doesn't work there */
 #ifdef CONFIG_MTD_CFI_INTELEXT
-	case 0x0001:
-	case 0x0003:
-	case 0x0200:
+	case P_ID_INTEL_EXT:
+	case P_ID_INTEL_STD:
+	case P_ID_INTEL_PERFORMANCE:
 		return cfi_cmdset_0001(map, primary);
 #endif
 #ifdef CONFIG_MTD_CFI_AMDSTD
-	case 0x0002:
+	case P_ID_AMD_STD:
 		return cfi_cmdset_0002(map, primary);
 #endif
 #ifdef CONFIG_MTD_CFI_STAA
-        case 0x0020:
+        case P_ID_ST_ADV:
 		return cfi_cmdset_0020(map, primary);
 #endif
 	default:

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 5/8] mtd: cfi_cmdset_0002: do not fail on no extended query table as they are both optional
  2010-04-22  8:35 [PATCH v3 1/8] mtd: cfi_probe: enter Auto Select Mode after filling cfi->cfiq members Guillaume LECERF
                   ` (2 preceding siblings ...)
  2010-04-22  8:36 ` [PATCH v3 4/8] mtd: cfi_probe: use P_ID_* definitions instead of hardcoded values Guillaume LECERF
@ 2010-04-22  8:36 ` Guillaume LECERF
  2010-04-23  5:27   ` Chris Moore
  2010-04-22  8:36 ` [PATCH v3 6/8] mtd: cfi_cmdset_0002: add CFI detection for SST 39VF{16, 32}xx chips Guillaume LECERF
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 12+ messages in thread
From: Guillaume LECERF @ 2010-04-22  8:36 UTC (permalink / raw)
  To: linux-mtd; +Cc: David Woodhouse, Wolfram Sang, Artem Bityutskiy

After looking at AMD's CFI specification [1], both of the extended query
tables are optional. Thus, it looks like relying that at least one of
those tables exist is a bug in cfi_cmdset_0002.

This patch inverts the logic and checks for unlock function pointers before
exiting on error. This approach leaves place to add a call to a fixup
function to try to handle chips compatible with the early AMD specification
from 1995 [2].


[1] http://www.amd.com/us-en/assets/content_type/DownloadableAssets/cfi_r20.pdf
[2] http://noel.feld.cvut.cz/hw/amd/20158a.pdf

Signed-off-by: Guillaume LECERF <glecerf@gmail.com>
---
 drivers/mtd/chips/cfi_cmdset_0002.c |   89 ++++++++++++++++++-----------------
 1 files changed, 45 insertions(+), 44 deletions(-)

diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
index ea2a7f6..de1b4ba 100644
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
@@ -353,65 +353,66 @@ struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary)
 
 	if (cfi->cfi_mode==CFI_MODE_CFI){
 		unsigned char bootloc;
-		/*
-		 * It's a real CFI chip, not one for which the probe
-		 * routine faked a CFI structure. So we read the feature
-		 * table from it.
-		 */
 		__u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR;
 		struct cfi_pri_amdstd *extp;
 
 		extp = (struct cfi_pri_amdstd*)cfi_read_pri(map, adr, sizeof(*extp), "Amd/Fujitsu");
-		if (!extp) {
-			kfree(mtd);
-			return NULL;
-		}
-
-		cfi_fixup_major_minor(cfi, extp);
-
-		if (extp->MajorVersion != '1' ||
-		    (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
-			printk(KERN_ERR "  Unknown Amd/Fujitsu Extended Query "
-			       "version %c.%c.\n",  extp->MajorVersion,
-			       extp->MinorVersion);
-			kfree(extp);
-			kfree(mtd);
-			return NULL;
-		}
+		if (extp) {
+			/*
+			 * It's a real CFI chip, not one for which the probe
+			 * routine faked a CFI structure.
+			 */
+			cfi_fixup_major_minor(cfi, extp);
+
+			if (extp->MajorVersion != '1' ||
+			    (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
+				printk(KERN_ERR "  Unknown Amd/Fujitsu Extended Query "
+				       "version %c.%c.\n",  extp->MajorVersion,
+				       extp->MinorVersion);
+				kfree(extp);
+				kfree(mtd);
+				return NULL;
+			}
 
-		/* Install our own private info structure */
-		cfi->cmdset_priv = extp;
+			/* Install our own private info structure */
+			cfi->cmdset_priv = extp;
 
-		/* Apply cfi device specific fixups */
-		cfi_fixup(mtd, cfi_fixup_table);
+			/* Apply cfi device specific fixups */
+			cfi_fixup(mtd, cfi_fixup_table);
 
 #ifdef DEBUG_CFI_FEATURES
-		/* Tell the user about it in lots of lovely detail */
-		cfi_tell_features(extp);
+			/* Tell the user about it in lots of lovely detail */
+			cfi_tell_features(extp);
 #endif
 
-		bootloc = extp->TopBottom;
-		if ((bootloc != 2) && (bootloc != 3)) {
-			printk(KERN_WARNING "%s: CFI does not contain boot "
-			       "bank location. Assuming top.\n", map->name);
-			bootloc = 2;
-		}
+			bootloc = extp->TopBottom;
+			if ((bootloc != 2) && (bootloc != 3)) {
+				printk(KERN_WARNING "%s: CFI does not contain boot "
+				       "bank location. Assuming top.\n", map->name);
+				bootloc = 2;
+			}
 
-		if (bootloc == 3 && cfi->cfiq->NumEraseRegions > 1) {
-			printk(KERN_WARNING "%s: Swapping erase regions for broken CFI table.\n", map->name);
+			if (bootloc == 3 && cfi->cfiq->NumEraseRegions > 1) {
+				printk(KERN_WARNING "%s: Swapping erase regions for broken CFI table.\n", map->name);
 
-			for (i=0; i<cfi->cfiq->NumEraseRegions / 2; i++) {
-				int j = (cfi->cfiq->NumEraseRegions-1)-i;
-				__u32 swap;
+				for (i=0; i<cfi->cfiq->NumEraseRegions / 2; i++) {
+					int j = (cfi->cfiq->NumEraseRegions-1)-i;
+					__u32 swap;
 
-				swap = cfi->cfiq->EraseRegionInfo[i];
-				cfi->cfiq->EraseRegionInfo[i] = cfi->cfiq->EraseRegionInfo[j];
-				cfi->cfiq->EraseRegionInfo[j] = swap;
+					swap = cfi->cfiq->EraseRegionInfo[i];
+					cfi->cfiq->EraseRegionInfo[i] = cfi->cfiq->EraseRegionInfo[j];
+					cfi->cfiq->EraseRegionInfo[j] = swap;
+				}
 			}
+			/* Set the default CFI lock/unlock addresses */
+			cfi->addr_unlock1 = 0x555;
+			cfi->addr_unlock2 = 0x2aa;
+		}
+
+		if (!cfi->addr_unlock1 || !cfi->addr_unlock2) {
+			kfree(mtd);
+			return NULL;
 		}
-		/* Set the default CFI lock/unlock addresses */
-		cfi->addr_unlock1 = 0x555;
-		cfi->addr_unlock2 = 0x2aa;
 
 	} /* CFI mode */
 	else if (cfi->cfi_mode == CFI_MODE_JEDEC) {

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 6/8] mtd: cfi_cmdset_0002: add CFI detection for SST 39VF{16, 32}xx chips
  2010-04-22  8:35 [PATCH v3 1/8] mtd: cfi_probe: enter Auto Select Mode after filling cfi->cfiq members Guillaume LECERF
                   ` (3 preceding siblings ...)
  2010-04-22  8:36 ` [PATCH v3 5/8] mtd: cfi_cmdset_0002: do not fail on no extended query table as they are both optional Guillaume LECERF
@ 2010-04-22  8:36 ` Guillaume LECERF
  2010-04-22  8:36 ` [PATCH v3 7/8] mtd: cfi_cmdset_0002: add CFI detection for SST 39VF{32, 64}xxB chips Guillaume LECERF
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Guillaume LECERF @ 2010-04-22  8:36 UTC (permalink / raw)
  To: linux-mtd; +Cc: David Woodhouse, Wolfram Sang, Artem Bityutskiy

SST 39VF{16,32}xx chips use the 0x0701 command set, fully compatible
with the AMD one. This patch adds support for detecting them in CFI
mode.

Signed-off-by: Guillaume LECERF <glecerf@gmail.com>
---
 drivers/mtd/chips/cfi_cmdset_0002.c |   35 +++++++++++++++++++++++++++++++++++
 drivers/mtd/chips/gen_probe.c       |    1 +
 2 files changed, 36 insertions(+), 0 deletions(-)

diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
index de1b4ba..0e91dce 100644
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
@@ -256,6 +256,31 @@ static void fixup_use_atmel_lock(struct mtd_info *mtd, void *param)
 	mtd->flags |= MTD_POWERUP_LOCK;
 }
 
+static void fixup_old_sst_eraseregion(struct mtd_info *mtd)
+{
+	struct map_info *map = mtd->priv;
+	struct cfi_private *cfi = map->fldrv_priv;
+
+	/*
+	 * These flashes report two seperate eraseblock regions based on the
+	 * sector_erase-size and block_erase-size, although they both operate on the
+	 * same memory. This is not allowed according to CFI, so we just pick the
+	 * sector_erase-size.
+	 */
+	cfi->cfiq->NumEraseRegions = 1;
+}
+
+static void fixup_sst39vf(struct mtd_info *mtd, void *param)
+{
+	struct map_info *map = mtd->priv;
+	struct cfi_private *cfi = map->fldrv_priv;
+
+	fixup_old_sst_eraseregion(mtd);
+
+	cfi->addr_unlock1 = 0x5555;
+	cfi->addr_unlock2 = 0x2AAA;
+}
+
 static void fixup_s29gl064n_sectors(struct mtd_info *mtd, void *param)
 {
 	struct map_info *map = mtd->priv;
@@ -278,6 +303,15 @@ static void fixup_s29gl032n_sectors(struct mtd_info *mtd, void *param)
 	}
 }
 
+/* Used to fix CFI-Tables of chips without Extended Query Tables */
+static struct cfi_fixup cfi_nopri_fixup_table[] = {
+	{ CFI_MFR_SST, 0x234A, fixup_sst39vf, NULL, }, // SST39VF1602
+	{ CFI_MFR_SST, 0x234B, fixup_sst39vf, NULL, }, // SST39VF1601
+	{ CFI_MFR_SST, 0x235A, fixup_sst39vf, NULL, }, // SST39VF3202
+	{ CFI_MFR_SST, 0x235B, fixup_sst39vf, NULL, }, // SST39VF3201
+	{ 0, 0, NULL, NULL }
+};
+
 static struct cfi_fixup cfi_fixup_table[] = {
 	{ CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
 #ifdef AMD_BOOTLOC_BUG
@@ -408,6 +442,7 @@ struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary)
 			cfi->addr_unlock1 = 0x555;
 			cfi->addr_unlock2 = 0x2aa;
 		}
+		cfi_fixup(mtd, cfi_nopri_fixup_table);
 
 		if (!cfi->addr_unlock1 || !cfi->addr_unlock2) {
 			kfree(mtd);
diff --git a/drivers/mtd/chips/gen_probe.c b/drivers/mtd/chips/gen_probe.c
index 991c457..599c259 100644
--- a/drivers/mtd/chips/gen_probe.c
+++ b/drivers/mtd/chips/gen_probe.c
@@ -249,6 +249,7 @@ static struct mtd_info *check_cmd_set(struct map_info *map, int primary)
 #endif
 #ifdef CONFIG_MTD_CFI_AMDSTD
 	case P_ID_AMD_STD:
+	case P_ID_SST_OLD:
 		return cfi_cmdset_0002(map, primary);
 #endif
 #ifdef CONFIG_MTD_CFI_STAA

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 7/8] mtd: cfi_cmdset_0002: add CFI detection for SST 39VF{32, 64}xxB chips
  2010-04-22  8:35 [PATCH v3 1/8] mtd: cfi_probe: enter Auto Select Mode after filling cfi->cfiq members Guillaume LECERF
                   ` (4 preceding siblings ...)
  2010-04-22  8:36 ` [PATCH v3 6/8] mtd: cfi_cmdset_0002: add CFI detection for SST 39VF{16, 32}xx chips Guillaume LECERF
@ 2010-04-22  8:36 ` Guillaume LECERF
  2010-04-22  8:36 ` [PATCH v3 8/8] mtd: cfi_util: do not printk if no extended query table Guillaume LECERF
  2010-04-23  1:37 ` [PATCH v3 1/8] mtd: cfi_probe: enter Auto Select Mode after filling cfi->cfiq members Wolfram Sang
  7 siblings, 0 replies; 12+ messages in thread
From: Guillaume LECERF @ 2010-04-22  8:36 UTC (permalink / raw)
  To: linux-mtd; +Cc: David Woodhouse, Wolfram Sang, Artem Bityutskiy

This patch adds support for detecting SST 39VF32xxB and 39VF64xxB
chips in CFI mode.

Signed-off-by: Guillaume LECERF <glecerf@gmail.com>
---
 drivers/mtd/chips/cfi_cmdset_0002.c |   15 +++++++++++++++
 1 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
index 0e91dce..66e5586 100644
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
@@ -281,6 +281,17 @@ static void fixup_sst39vf(struct mtd_info *mtd, void *param)
 	cfi->addr_unlock2 = 0x2AAA;
 }
 
+static void fixup_sst39vf_rev_b(struct mtd_info *mtd, void *param)
+{
+	struct map_info *map = mtd->priv;
+	struct cfi_private *cfi = map->fldrv_priv;
+
+	fixup_old_sst_eraseregion(mtd);
+
+	cfi->addr_unlock1 = 0x555;
+	cfi->addr_unlock2 = 0x2AA;
+}
+
 static void fixup_s29gl064n_sectors(struct mtd_info *mtd, void *param)
 {
 	struct map_info *map = mtd->priv;
@@ -309,6 +320,10 @@ static struct cfi_fixup cfi_nopri_fixup_table[] = {
 	{ CFI_MFR_SST, 0x234B, fixup_sst39vf, NULL, }, // SST39VF1601
 	{ CFI_MFR_SST, 0x235A, fixup_sst39vf, NULL, }, // SST39VF3202
 	{ CFI_MFR_SST, 0x235B, fixup_sst39vf, NULL, }, // SST39VF3201
+	{ CFI_MFR_SST, 0x235C, fixup_sst39vf_rev_b, NULL, }, // SST39VF3202B
+	{ CFI_MFR_SST, 0x235D, fixup_sst39vf_rev_b, NULL, }, // SST39VF3201B
+	{ CFI_MFR_SST, 0x236C, fixup_sst39vf_rev_b, NULL, }, // SST39VF6402B
+	{ CFI_MFR_SST, 0x236D, fixup_sst39vf_rev_b, NULL, }, // SST39VF6401B
 	{ 0, 0, NULL, NULL }
 };
 

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 8/8] mtd: cfi_util: do not printk if no extended query table
  2010-04-22  8:35 [PATCH v3 1/8] mtd: cfi_probe: enter Auto Select Mode after filling cfi->cfiq members Guillaume LECERF
                   ` (5 preceding siblings ...)
  2010-04-22  8:36 ` [PATCH v3 7/8] mtd: cfi_cmdset_0002: add CFI detection for SST 39VF{32, 64}xxB chips Guillaume LECERF
@ 2010-04-22  8:36 ` Guillaume LECERF
  2010-04-23  1:39   ` Wolfram Sang
  2010-04-23  1:37 ` [PATCH v3 1/8] mtd: cfi_probe: enter Auto Select Mode after filling cfi->cfiq members Wolfram Sang
  7 siblings, 1 reply; 12+ messages in thread
From: Guillaume LECERF @ 2010-04-22  8:36 UTC (permalink / raw)
  To: linux-mtd; +Cc: David Woodhouse, Wolfram Sang, Artem Bityutskiy

Signed-off-by: Guillaume LECERF <glecerf@gmail.com>
---
 drivers/mtd/chips/cfi_util.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/drivers/mtd/chips/cfi_util.c b/drivers/mtd/chips/cfi_util.c
index ca584d0..6ce5107 100644
--- a/drivers/mtd/chips/cfi_util.c
+++ b/drivers/mtd/chips/cfi_util.c
@@ -104,10 +104,11 @@ __xipram cfi_read_pri(struct map_info *map, __u16 adr, __u16 size, const char* n
 	int i;
 	struct cfi_extquery *extp = NULL;
 
-	printk(" %s Extended Query Table at 0x%4.4X\n", name, adr);
 	if (!adr)
 		goto out;
 
+	printk(" %s Extended Query Table at 0x%4.4X\n", name, adr);
+
 	extp = kmalloc(size, GFP_KERNEL);
 	if (!extp) {
 		printk(KERN_ERR "Failed to allocate memory\n");

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v3 1/8] mtd: cfi_probe: enter Auto Select Mode after filling cfi->cfiq members
  2010-04-22  8:35 [PATCH v3 1/8] mtd: cfi_probe: enter Auto Select Mode after filling cfi->cfiq members Guillaume LECERF
                   ` (6 preceding siblings ...)
  2010-04-22  8:36 ` [PATCH v3 8/8] mtd: cfi_util: do not printk if no extended query table Guillaume LECERF
@ 2010-04-23  1:37 ` Wolfram Sang
  7 siblings, 0 replies; 12+ messages in thread
From: Wolfram Sang @ 2010-04-23  1:37 UTC (permalink / raw)
  To: Guillaume LECERF; +Cc: David Woodhouse, linux-mtd, Artem Bityutskiy

[-- Attachment #1: Type: text/plain, Size: 229 bytes --]


Whole series:

Reviewed-by: Wolfram Sang <w.sang@pengutronix.de>

-- 
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v3 8/8] mtd: cfi_util: do not printk if no extended query table
  2010-04-22  8:36 ` [PATCH v3 8/8] mtd: cfi_util: do not printk if no extended query table Guillaume LECERF
@ 2010-04-23  1:39   ` Wolfram Sang
  0 siblings, 0 replies; 12+ messages in thread
From: Wolfram Sang @ 2010-04-23  1:39 UTC (permalink / raw)
  To: Guillaume LECERF; +Cc: David Woodhouse, linux-mtd, Artem Bityutskiy

[-- Attachment #1: Type: text/plain, Size: 1098 bytes --]


One thing here...

On Thu, Apr 22, 2010 at 10:36:21AM +0200, Guillaume LECERF wrote:
> Signed-off-by: Guillaume LECERF <glecerf@gmail.com>
> ---
>  drivers/mtd/chips/cfi_util.c |    3 ++-
>  1 files changed, 2 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/mtd/chips/cfi_util.c b/drivers/mtd/chips/cfi_util.c
> index ca584d0..6ce5107 100644
> --- a/drivers/mtd/chips/cfi_util.c
> +++ b/drivers/mtd/chips/cfi_util.c
> @@ -104,10 +104,11 @@ __xipram cfi_read_pri(struct map_info *map, __u16 adr, __u16 size, const char* n
>  	int i;
>  	struct cfi_extquery *extp = NULL;
>  
> -	printk(" %s Extended Query Table at 0x%4.4X\n", name, adr);
>  	if (!adr)
>  		goto out;
>  
> +	printk(" %s Extended Query Table at 0x%4.4X\n", name, adr);
> +

Log level is missing. KERN_INFO or use pr_info?

>  	extp = kmalloc(size, GFP_KERNEL);
>  	if (!extp) {
>  		printk(KERN_ERR "Failed to allocate memory\n");
> 

-- 
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v3 5/8] mtd: cfi_cmdset_0002: do not fail on no extended query table as they are both optional
  2010-04-22  8:36 ` [PATCH v3 5/8] mtd: cfi_cmdset_0002: do not fail on no extended query table as they are both optional Guillaume LECERF
@ 2010-04-23  5:27   ` Chris Moore
  2010-04-23 13:58     ` Guillaume LECERF
  0 siblings, 1 reply; 12+ messages in thread
From: Chris Moore @ 2010-04-23  5:27 UTC (permalink / raw)
  To: Guillaume LECERF, David Woodhouse
  Cc: linux-mtd, Wolfram Sang, Artem Bityutskiy

Hi,

Le 22/04/2010 10:36, Guillaume LECERF a écrit :

[snip]


>
> -		bootloc = extp->TopBottom;
> -		if ((bootloc != 2)&&  (bootloc != 3)) {
> -			printk(KERN_WARNING "%s: CFI does not contain boot "
> -			       "bank location. Assuming top.\n", map->name);
> -			bootloc = 2;
> -		}
> +			bootloc = extp->TopBottom;
> +			if ((bootloc != 2)&&  (bootloc != 3)) {
> +				printk(KERN_WARNING "%s: CFI does not contain boot "
> +				       "bank location. Assuming top.\n", map->name);
> +				bootloc = 2;
> +			}
>
>    

[snip]

It is not your fault, Guillaume, but this whole "Assuming top" stuff is 
completely bogus :(
(The most obvious, but not the only, bug is that it actually sets 
bootloc to 2 which is bottom :( )

Uwe Kleine-Koenig submitted a patch for this ages ago which I tried to 
ping. See these threads :
http://thread.gmane.org/gmane.linux.drivers.mtd/22176
http://thread.gmane.org/gmane.linux.drivers.mtd/22266

*Please*, David, could we get this cleaned up?

Cheers,
Chris

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v3 5/8] mtd: cfi_cmdset_0002: do not fail on no extended query table as they are both optional
  2010-04-23  5:27   ` Chris Moore
@ 2010-04-23 13:58     ` Guillaume LECERF
  0 siblings, 0 replies; 12+ messages in thread
From: Guillaume LECERF @ 2010-04-23 13:58 UTC (permalink / raw)
  To: Chris Moore; +Cc: linux-mtd, David Woodhouse, Wolfram Sang, Artem Bityutskiy

Hi Chris,

2010/4/23 Chris Moore <moore@free.fr>:
> It is not your fault, Guillaume, but this whole "Assuming top" stuff is
> completely bogus :(
> (The most obvious, but not the only, bug is that it actually sets bootloc to
> 2 which is bottom :( )
>
> Uwe Kleine-Koenig submitted a patch for this ages ago which I tried to ping.
> See these threads :
> http://thread.gmane.org/gmane.linux.drivers.mtd/22176
> http://thread.gmane.org/gmane.linux.drivers.mtd/22266
>
> *Please*, David, could we get this cleaned up?

I've resent Uwe's patch, and re-based mine as v4.

-- 
Guillaume LECERF
GeeXboX developer - www.geexbox.org

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2010-04-23 13:58 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-22  8:35 [PATCH v3 1/8] mtd: cfi_probe: enter Auto Select Mode after filling cfi->cfiq members Guillaume LECERF
2010-04-22  8:35 ` [PATCH v3 2/8] mtd: cfi_probe: make the addresses used to enter Auto Select Mode variable Guillaume LECERF
2010-04-22  8:35 ` [PATCH v3 3/8] mtd: cfi_probe: add support for SST 0x0701 vendorname Guillaume LECERF
2010-04-22  8:36 ` [PATCH v3 4/8] mtd: cfi_probe: use P_ID_* definitions instead of hardcoded values Guillaume LECERF
2010-04-22  8:36 ` [PATCH v3 5/8] mtd: cfi_cmdset_0002: do not fail on no extended query table as they are both optional Guillaume LECERF
2010-04-23  5:27   ` Chris Moore
2010-04-23 13:58     ` Guillaume LECERF
2010-04-22  8:36 ` [PATCH v3 6/8] mtd: cfi_cmdset_0002: add CFI detection for SST 39VF{16, 32}xx chips Guillaume LECERF
2010-04-22  8:36 ` [PATCH v3 7/8] mtd: cfi_cmdset_0002: add CFI detection for SST 39VF{32, 64}xxB chips Guillaume LECERF
2010-04-22  8:36 ` [PATCH v3 8/8] mtd: cfi_util: do not printk if no extended query table Guillaume LECERF
2010-04-23  1:39   ` Wolfram Sang
2010-04-23  1:37 ` [PATCH v3 1/8] mtd: cfi_probe: enter Auto Select Mode after filling cfi->cfiq members Wolfram Sang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).