All of lore.kernel.org
 help / color / mirror / Atom feed
From: Josh Wu <josh.wu@atmel.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] env_fat: use get_device_and_partition() during env save and load
Date: Mon, 16 Jun 2014 16:14:52 +0800	[thread overview]
Message-ID: <1402906493-26723-1-git-send-email-josh.wu@atmel.com> (raw)

Use get_device_and_partition() is better since:
1. It will call the device initialize function internally. So we can
remove the mmc intialization code to save many lines.
2. It is used by fatls/fatload/fatwrite. So saveenv & load env should
use it too.
3. It can parse the "D:P", "D", "D:", "D:auto" string to get correct
device and partition information by run-time.

Also we remove the FAT_ENV_DEVICE and FAT_ENV_PART. We use a string:
FAT_ENV_DEVICE_AND_PART.
For at91sam9m10g45ek, it is "0". That means use device 0 and if:
a)device 0 has no partition table, use the whole device as a FAT file
system.
b)device 0 has partittion table, use the partition #1.

Refer to the commit: 10a37fd7a4 for details of device & partition string.

Signed-off-by: Josh Wu <josh.wu@atmel.com>
---
 common/env_fat.c                   |   86 ++++++++++++------------------------
 include/configs/at91sam9m10g45ek.h |    8 +++-
 2 files changed, 34 insertions(+), 60 deletions(-)

diff --git a/common/env_fat.c b/common/env_fat.c
index aad0487..328c09d 100644
--- a/common/env_fat.c
+++ b/common/env_fat.c
@@ -38,39 +38,24 @@ int saveenv(void)
 {
 	env_t	env_new;
 	block_dev_desc_t *dev_desc = NULL;
-	int dev = FAT_ENV_DEVICE;
-	int part = FAT_ENV_PART;
+	disk_partition_t info;
+	int dev, part;
 	int err;
 
 	err = env_export(&env_new);
 	if (err)
 		return err;
 
-#ifdef CONFIG_MMC
-	if (strcmp(FAT_ENV_INTERFACE, "mmc") == 0) {
-		struct mmc *mmc = find_mmc_device(dev);
-
-		if (!mmc) {
-			printf("no mmc device at slot %x\n", dev);
-			return 1;
-		}
-
-		mmc->has_init = 0;
-		mmc_init(mmc);
-	}
-#endif /* CONFIG_MMC */
-
-	dev_desc = get_dev(FAT_ENV_INTERFACE, dev);
-	if (dev_desc == NULL) {
-		printf("Failed to find %s%d\n",
-			FAT_ENV_INTERFACE, dev);
+	part = get_device_and_partition(FAT_ENV_INTERFACE,
+					FAT_ENV_DEVICE_AND_PART,
+					&dev_desc, &info, 1);
+	if (part < 0)
 		return 1;
-	}
 
-	err = fat_register_device(dev_desc, part);
-	if (err) {
-		printf("Failed to register %s%d:%d\n",
-			FAT_ENV_INTERFACE, dev, part);
+	dev = dev_desc->dev;
+	if (fat_set_blk_dev(dev_desc, &info) != 0) {
+		printf("\n** Unable to use %s %d:%d for saveenv **\n",
+		       FAT_ENV_INTERFACE, dev, part);
 		return 1;
 	}
 
@@ -90,48 +75,33 @@ void env_relocate_spec(void)
 {
 	char buf[CONFIG_ENV_SIZE];
 	block_dev_desc_t *dev_desc = NULL;
-	int dev = FAT_ENV_DEVICE;
-	int part = FAT_ENV_PART;
+	disk_partition_t info;
+	int dev, part;
 	int err;
 
-#ifdef CONFIG_MMC
-	if (strcmp(FAT_ENV_INTERFACE, "mmc") == 0) {
-		struct mmc *mmc = find_mmc_device(dev);
-
-		if (!mmc) {
-			printf("no mmc device at slot %x\n", dev);
-			set_default_env(NULL);
-			return;
-		}
-
-		mmc->has_init = 0;
-		mmc_init(mmc);
-	}
-#endif /* CONFIG_MMC */
-
-	dev_desc = get_dev(FAT_ENV_INTERFACE, dev);
-	if (dev_desc == NULL) {
-		printf("Failed to find %s%d\n",
-			FAT_ENV_INTERFACE, dev);
-		set_default_env(NULL);
-		return;
-	}
-
-	err = fat_register_device(dev_desc, part);
-	if (err) {
-		printf("Failed to register %s%d:%d\n",
-			FAT_ENV_INTERFACE, dev, part);
-		set_default_env(NULL);
-		return;
+	part = get_device_and_partition(FAT_ENV_INTERFACE,
+					FAT_ENV_DEVICE_AND_PART,
+					&dev_desc, &info, 1);
+	if (part < 0)
+		goto err_env_relocate;
+
+	dev = dev_desc->dev;
+	if (fat_set_blk_dev(dev_desc, &info) != 0) {
+		printf("\n** Unable to use %s %d:%d for loading the env **\n",
+		       FAT_ENV_INTERFACE, dev, part);
+		goto err_env_relocate;
 	}
 
 	err = file_fat_read(FAT_ENV_FILE, (uchar *)&buf, CONFIG_ENV_SIZE);
 	if (err == -1) {
 		printf("\n** Unable to read \"%s\" from %s%d:%d **\n",
 			FAT_ENV_FILE, FAT_ENV_INTERFACE, dev, part);
-		set_default_env(NULL);
-		return;
+		goto err_env_relocate;
 	}
 
 	env_import(buf, 1);
+	return;
+
+err_env_relocate:
+	set_default_env(NULL);
 }
diff --git a/include/configs/at91sam9m10g45ek.h b/include/configs/at91sam9m10g45ek.h
index 341b21d..db5d5ea 100644
--- a/include/configs/at91sam9m10g45ek.h
+++ b/include/configs/at91sam9m10g45ek.h
@@ -167,8 +167,12 @@
 #elif CONFIG_SYS_USE_MMC
 /* bootstrap + u-boot + env + linux in mmc */
 #define FAT_ENV_INTERFACE	"mmc"
-#define FAT_ENV_DEVICE		0
-#define FAT_ENV_PART		1
+/*
+ * We don't specify the part number, if device 0 has partition table, it means
+ * the first partition; it no partition table, then take whole device as a
+ * FAT file system.
+ */
+#define FAT_ENV_DEVICE_AND_PART	"0"
 #define FAT_ENV_FILE		"uboot.env"
 #define CONFIG_ENV_IS_IN_FAT
 #define CONFIG_FAT_WRITE
-- 
1.7.9.5

             reply	other threads:[~2014-06-16  8:14 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-16  8:14 Josh Wu [this message]
2014-06-16 19:51 ` [U-Boot] [PATCH] env_fat: use get_device_and_partition() during env save and load Stephen Warren
2014-06-19  2:35   ` Josh Wu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1402906493-26723-1-git-send-email-josh.wu@atmel.com \
    --to=josh.wu@atmel.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.