* [PATCH 1/6] environment: drop envfs_register_partition
@ 2014-04-28 9:49 Sascha Hauer
2014-04-28 9:49 ` [PATCH 2/6] env: erase/protect in envfs_save Sascha Hauer
` (4 more replies)
0 siblings, 5 replies; 8+ messages in thread
From: Sascha Hauer @ 2014-04-28 9:49 UTC (permalink / raw)
To: barebox
The purpose of envfs_register_partition is to print an error
message when the partition does not exist. Print an error message
from generic code instead and drop this function.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
arch/arm/boards/chumby_falconwing/falconwing.c | 4 +-
arch/arm/boards/crystalfontz-cfa10036/cfa10036.c | 5 +--
arch/arm/boards/imx233-olinuxino/imx23-olinuxino.c | 5 +--
common/environment.c | 50 ++--------------------
include/envfs.h | 2 -
5 files changed, 6 insertions(+), 60 deletions(-)
diff --git a/arch/arm/boards/chumby_falconwing/falconwing.c b/arch/arm/boards/chumby_falconwing/falconwing.c
index 24dc6e3..669de95 100644
--- a/arch/arm/boards/chumby_falconwing/falconwing.c
+++ b/arch/arm/boards/chumby_falconwing/falconwing.c
@@ -299,9 +299,7 @@ static int falconwing_devices_init(void)
armlinux_set_architecture(MACH_TYPE_CHUMBY);
- rc = envfs_register_partition("disk0", 1);
- if (rc != 0)
- printf("Cannot create the 'env0' persistent environment storage (%d)\n", rc);
+ default_environment_path_set("/dev/disk0.1");
return 0;
}
diff --git a/arch/arm/boards/crystalfontz-cfa10036/cfa10036.c b/arch/arm/boards/crystalfontz-cfa10036/cfa10036.c
index 60f09d4..3374338 100644
--- a/arch/arm/boards/crystalfontz-cfa10036/cfa10036.c
+++ b/arch/arm/boards/crystalfontz-cfa10036/cfa10036.c
@@ -135,10 +135,7 @@ static int cfa10036_devices_init(void)
cfa10036_detect_hw();
- ret = envfs_register_partition("disk0", 1);
- if (ret != 0)
- printf("Cannot create the 'env0' persistent "
- "environment storage (%d)\n", ret);
+ default_environment_path_set("/dev/disk0.1");
return 0;
}
diff --git a/arch/arm/boards/imx233-olinuxino/imx23-olinuxino.c b/arch/arm/boards/imx233-olinuxino/imx23-olinuxino.c
index 1181612..3d46604 100644
--- a/arch/arm/boards/imx233-olinuxino/imx23-olinuxino.c
+++ b/arch/arm/boards/imx233-olinuxino/imx23-olinuxino.c
@@ -129,10 +129,7 @@ static int imx23_olinuxino_devices_init(void)
olinuxino_init_usb();
- rc = envfs_register_partition("disk0", 1);
- if (rc != 0)
- printf("Cannot create the 'env0' persistent "
- "environment storage (%d)\n", rc);
+ default_environment_path_set("/dev/disk0.1");
return 0;
}
diff --git a/common/environment.c b/common/environment.c
index f2ac17d..e55df40 100644
--- a/common/environment.c
+++ b/common/environment.c
@@ -395,7 +395,9 @@ int envfs_load(const char *filename, const char *dir, unsigned flags)
envfd = open(filename, O_RDONLY);
if (envfd < 0) {
- printf("Open %s %s\n", filename, errno_str());
+ printf("environment load %s: %s\n", filename, errno_str());
+ if (errno == ENOENT)
+ printf("Maybe you have to create the partition.\n");
return -1;
}
@@ -451,49 +453,3 @@ out:
return ret;
}
-
-#ifdef __BAREBOX__
-/**
- * Try to register an environment storage on a device's partition
- * @return 0 on success
- *
- * We rely on the existence of a usable storage device, already attached to
- * our system, to get something like a persistent memory for our environment.
- * We need to specify the partition number to use on this device.
- * @param[in] devname Name of the device
- * @param[in] partnr Partition number
- * @return 0 on success, anything else in case of failure
- */
-
-int envfs_register_partition(const char *devname, unsigned int partnr)
-{
- struct cdev *cdev, *part;
- char *partname;
-
- if (!devname)
- return -EINVAL;
-
- cdev = cdev_by_name(devname);
- if (cdev == NULL) {
- pr_err("No %s present\n", devname);
- return -ENODEV;
- }
- partname = asprintf("%s.%d", devname, partnr);
- cdev = cdev_by_name(partname);
- if (cdev == NULL) {
- pr_err("No %s partition available\n", partname);
- pr_info("Please create the partition %s to store the env\n", partname);
- return -ENODEV;
- }
-
- part = devfs_add_partition(partname, 0, cdev->size,
- DEVFS_PARTITION_FIXED, "env0");
- if (part)
- return 0;
-
- free(partname);
-
- return -EINVAL;
-}
-EXPORT_SYMBOL(envfs_register_partition);
-#endif
diff --git a/include/envfs.h b/include/envfs.h
index ae98808..9b86398 100644
--- a/include/envfs.h
+++ b/include/envfs.h
@@ -110,8 +110,6 @@ static inline char *default_environment_path_get(void)
}
#endif
-int envfs_register_partition(const char *devname, unsigned int partnr);
-
#ifdef CONFIG_DEFAULT_ENVIRONMENT
void defaultenv_append(void *buf, unsigned int size, const char *name);
int defaultenv_load(const char *dir, unsigned flags);
--
1.9.1
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/6] env: erase/protect in envfs_save
2014-04-28 9:49 [PATCH 1/6] environment: drop envfs_register_partition Sascha Hauer
@ 2014-04-28 9:49 ` Sascha Hauer
2014-04-28 9:49 ` [PATCH 3/6] mtd: nand: bb: use mtd api directly Sascha Hauer
` (3 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Sascha Hauer @ 2014-04-28 9:49 UTC (permalink / raw)
To: barebox
So that the envfs_save is more useful outside of the saveenv command
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
commands/saveenv.c | 46 +---------------------------------------------
common/environment.c | 38 ++++++++++++++++++++++++++++++++++++--
2 files changed, 37 insertions(+), 47 deletions(-)
diff --git a/commands/saveenv.c b/commands/saveenv.c
index 8ead98d..cb2b01d 100644
--- a/commands/saveenv.c
+++ b/commands/saveenv.c
@@ -29,7 +29,7 @@
static int do_saveenv(int argc, char *argv[])
{
- int ret, fd;
+ int ret;
char *filename, *dirname;
printf("saving environment\n");
@@ -42,52 +42,8 @@ static int do_saveenv(int argc, char *argv[])
else
filename = argv[1];
- fd = open(filename, O_WRONLY | O_CREAT);
- if (fd < 0) {
- printf("could not open %s: %s\n", filename, errno_str());
- return 1;
- }
-
- ret = protect(fd, ~0, 0, 0);
-
- /* ENOSYS is no error here, many devices do not need it */
- if (ret && errno != ENOSYS) {
- printf("could not unprotect %s: %s\n", filename, errno_str());
- close(fd);
- return 1;
- }
-
- ret = erase(fd, ~0, 0);
-
- /* ENOSYS is no error here, many devices do not need it */
- if (ret && errno != ENOSYS) {
- printf("could not erase %s: %s\n", filename, errno_str());
- close(fd);
- return 1;
- }
-
- close(fd);
-
ret = envfs_save(filename, dirname);
- if (ret) {
- printf("saveenv failed\n");
- goto out;
- }
-
- fd = open(filename, O_WRONLY | O_CREAT);
-
- ret = protect(fd, ~0, 0, 1);
-
- /* ENOSYS is no error here, many devices do not need it */
- if (ret && errno != ENOSYS) {
- printf("could not protect %s: %s\n", filename, errno_str());
- close(fd);
- return 1;
- }
- ret = 0;
-out:
- close(fd);
return ret;
}
diff --git a/common/environment.c b/common/environment.c
index e55df40..2d1edf8 100644
--- a/common/environment.c
+++ b/common/environment.c
@@ -60,6 +60,16 @@ char *default_environment_path_get(void)
{
return default_environment_path;
}
+#else
+static inline int protect(int fd, size_t count, unsigned long offset, int prot)
+{
+ return 0;
+}
+
+static inline int erase(int fd, size_t count, unsigned long offset)
+{
+ return 0;
+}
#endif
static int file_size_action(const char *filename, struct stat *statbuf,
@@ -196,11 +206,27 @@ int envfs_save(const char *filename, const char *dirname)
envfd = open(filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
if (envfd < 0) {
- printf("Open %s %s\n", filename, errno_str());
- ret = envfd;
+ printf("could not open %s: %s\n", filename, errno_str());
+ ret = -errno;
goto out1;
}
+ ret = protect(envfd, ~0, 0, 0);
+
+ /* ENOSYS is no error here, many devices do not need it */
+ if (ret && errno != ENOSYS) {
+ printf("could not unprotect %s: %s\n", filename, errno_str());
+ goto out;
+ }
+
+ ret = erase(envfd, ~0, 0);
+
+ /* ENOSYS is no error here, many devices do not need it */
+ if (ret && errno != ENOSYS) {
+ printf("could not erase %s: %s\n", filename, errno_str());
+ goto out;
+ }
+
size += sizeof(struct envfs_super);
wbuf = buf;
@@ -216,6 +242,14 @@ int envfs_save(const char *filename, const char *dirname)
size -= now;
}
+ ret = protect(envfd, ~0, 0, 1);
+
+ /* ENOSYS is no error here, many devices do not need it */
+ if (ret && errno != ENOSYS) {
+ printf("could not protect %s: %s\n", filename, errno_str());
+ goto out;
+ }
+
ret = 0;
out:
--
1.9.1
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/6] mtd: nand: bb: use mtd api directly
2014-04-28 9:49 [PATCH 1/6] environment: drop envfs_register_partition Sascha Hauer
2014-04-28 9:49 ` [PATCH 2/6] env: erase/protect in envfs_save Sascha Hauer
@ 2014-04-28 9:49 ` Sascha Hauer
2014-04-28 13:05 ` Alexander Aring
2014-04-28 9:49 ` [PATCH 4/6] mtd: refactor bb device creation Sascha Hauer
` (2 subsequent siblings)
4 siblings, 1 reply; 8+ messages in thread
From: Sascha Hauer @ 2014-04-28 9:49 UTC (permalink / raw)
To: barebox
The devfs layer just adds an addition indirection between mtd
and the bb devices with no purpose. Drop it.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/nand-bb.c | 122 +++++++++++++++++++--------------------------
1 file changed, 50 insertions(+), 72 deletions(-)
diff --git a/drivers/mtd/nand/nand-bb.c b/drivers/mtd/nand/nand-bb.c
index f387ef6..06b5824 100644
--- a/drivers/mtd/nand/nand-bb.c
+++ b/drivers/mtd/nand/nand-bb.c
@@ -25,22 +25,18 @@
#include <init.h>
#include <ioctl.h>
#include <nand.h>
-#include <linux/mtd/mtd-abi.h>
+#include <linux/mtd/mtd.h>
#include <fcntl.h>
#include <libgen.h>
#include <linux/list.h>
struct nand_bb {
- char cdevname[MAX_DRIVER_NAME];
- struct cdev *cdev_parent;
char *name;
int open;
int needs_write;
- struct mtd_info_user info;
+ struct mtd_info *mtd;
- loff_t raw_size;
- loff_t size;
loff_t offset;
unsigned long flags;
void *writebuf;
@@ -54,31 +50,28 @@ static ssize_t nand_bb_read(struct cdev *cdev, void *buf, size_t count,
loff_t offset, ulong flags)
{
struct nand_bb *bb = cdev->priv;
- struct cdev *parent = bb->cdev_parent;
+ size_t retlen;
int ret, bytes = 0, now;
debug("%s 0x%08llx %d\n", __func__, offset, count);
- while(count) {
- ret = cdev_ioctl(parent, MEMGETBADBLOCK, &bb->offset);
- if (ret < 0)
- return ret;
-
- if (ret) {
+ while (count) {
+ if (mtd_block_isbad(bb->mtd, offset)) {
printf("skipping bad block at 0x%08llx\n", bb->offset);
- bb->offset += bb->info.erasesize;
+ bb->offset += bb->mtd->erasesize;
continue;
}
- now = min(count, (size_t)(bb->info.erasesize -
- ((size_t)bb->offset % bb->info.erasesize)));
- ret = cdev_read(parent, buf, now, bb->offset, 0);
+ now = min(count, (size_t)(bb->mtd->erasesize -
+ ((size_t)bb->offset % bb->mtd->erasesize)));
+
+ ret = mtd_read(bb->mtd, bb->offset, now, &retlen, buf);
if (ret < 0)
return ret;
- buf += now;
- count -= now;
- bb->offset += now;
- bytes += now;
+ buf += retlen;
+ count -= retlen;
+ bb->offset += retlen;
+ bytes += retlen;
};
return bytes;
@@ -91,29 +84,25 @@ static ssize_t nand_bb_read(struct cdev *cdev, void *buf, size_t count,
static int nand_bb_write_buf(struct nand_bb *bb, size_t count)
{
int ret, now;
- struct cdev *parent = bb->cdev_parent;
+ size_t retlen;
void *buf = bb->writebuf;
loff_t cur_ofs = bb->offset & ~(BB_WRITEBUF_SIZE - 1);
while (count) {
- ret = cdev_ioctl(parent, MEMGETBADBLOCK, &cur_ofs);
- if (ret < 0)
- return ret;
-
- if (ret) {
+ if (mtd_block_isbad(bb->mtd, cur_ofs)) {
debug("skipping bad block at 0x%08llx\n", cur_ofs);
- bb->offset += bb->info.erasesize;
- cur_ofs += bb->info.erasesize;
+ bb->offset += bb->mtd->erasesize;
+ cur_ofs += bb->mtd->erasesize;
continue;
}
- now = min(count, (size_t)(bb->info.erasesize));
- ret = cdev_write(parent, buf, now, cur_ofs, 0);
+ now = min(count, (size_t)(bb->mtd->erasesize));
+ ret = mtd_write(bb->mtd, cur_ofs, now, &retlen, buf);
if (ret < 0)
return ret;
- buf += now;
- count -= now;
- cur_ofs += now;
+ buf += retlen;
+ count -= retlen;
+ cur_ofs += retlen;
};
return 0;
@@ -152,13 +141,17 @@ static ssize_t nand_bb_write(struct cdev *cdev, const void *buf, size_t count,
static int nand_bb_erase(struct cdev *cdev, size_t count, loff_t offset)
{
struct nand_bb *bb = cdev->priv;
+ struct erase_info erase = {};
if (offset != 0) {
printf("can only erase from beginning of device\n");
return -EINVAL;
}
- return cdev_erase(bb->cdev_parent, bb->raw_size, 0);
+ erase.addr = 0;
+ erase.len = bb->mtd->size;
+
+ return mtd_erase(bb->mtd, &erase);
}
#endif
@@ -195,16 +188,12 @@ static int nand_bb_close(struct cdev *cdev)
static int nand_bb_calc_size(struct nand_bb *bb)
{
loff_t pos = 0;
- int ret;
- while (pos < bb->raw_size) {
- ret = cdev_ioctl(bb->cdev_parent, MEMGETBADBLOCK, &pos);
- if (ret < 0)
- return ret;
- if (!ret)
- bb->cdev.size += bb->info.erasesize;
+ while (pos < bb->mtd->size) {
+ if (!mtd_block_isbad(bb->mtd, pos))
+ bb->cdev.size += bb->mtd->erasesize;
- pos += bb->info.erasesize;
+ pos += bb->mtd->erasesize;
}
return 0;
@@ -215,22 +204,18 @@ static loff_t nand_bb_lseek(struct cdev *cdev, loff_t __offset)
struct nand_bb *bb = cdev->priv;
loff_t raw_pos = 0;
uint32_t offset = __offset;
- int ret;
/* lseek only in readonly mode */
if (bb->flags & O_ACCMODE)
return -ENOSYS;
- while (raw_pos < bb->raw_size) {
- off_t now = min(offset, bb->info.erasesize);
+ while (raw_pos < bb->mtd->size) {
+ off_t now = min(offset, bb->mtd->erasesize);
- ret = cdev_ioctl(bb->cdev_parent, MEMGETBADBLOCK, &raw_pos);
- if (ret < 0)
- return ret;
- if (!ret) {
+ if (mtd_block_isbad(bb->mtd, raw_pos)) {
+ raw_pos += bb->mtd->erasesize;
+ } else {
offset -= now;
raw_pos += now;
- } else {
- raw_pos += bb->info.erasesize;
}
if (!offset) {
@@ -264,28 +249,23 @@ static LIST_HEAD(bb_list);
int dev_add_bb_dev(const char *path, const char *name)
{
struct nand_bb *bb;
+ struct cdev *parent;
int ret = -ENOMEM;
- bb = xzalloc(sizeof(*bb));
-
- bb->cdev_parent = cdev_open(path, O_RDWR);
- if (!bb->cdev_parent)
- goto out1;
-
- if (name) {
- strcpy(bb->cdevname, name);
- } else {
- strcpy(bb->cdevname, path);
- strcat(bb->cdevname, ".bb");
- }
+ parent = cdev_by_name(path);
+ if (!parent)
+ return -ENODEV;
- bb->cdev.name = bb->cdevname;
+ if (!parent->mtd)
+ return -EINVAL;
- bb->raw_size = bb->cdev_parent->size;
+ bb = xzalloc(sizeof(*bb));
+ bb->mtd = parent->mtd;
- ret = cdev_ioctl(bb->cdev_parent, MEMGETINFO, &bb->info);
- if (ret)
- goto out4;
+ if (name)
+ bb->cdev.name = xstrdup(name);
+ else
+ bb->cdev.name = asprintf("%s.bb", path);;
nand_bb_calc_size(bb);
bb->cdev.ops = &nand_bb_ops;
@@ -300,8 +280,6 @@ int dev_add_bb_dev(const char *path, const char *name)
return 0;
out4:
- cdev_close(bb->cdev_parent);
-out1:
free(bb);
return ret;
}
@@ -313,8 +291,8 @@ int dev_remove_bb_dev(const char *name)
list_for_each_entry(bb, &bb_list, list) {
if (!strcmp(bb->cdev.name, name)) {
devfs_remove(&bb->cdev);
- cdev_close(bb->cdev_parent);
list_del_init(&bb->list);
+ free(bb->name);
free(bb);
return 0;
}
--
1.9.1
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 4/6] mtd: refactor bb device creation
2014-04-28 9:49 [PATCH 1/6] environment: drop envfs_register_partition Sascha Hauer
2014-04-28 9:49 ` [PATCH 2/6] env: erase/protect in envfs_save Sascha Hauer
2014-04-28 9:49 ` [PATCH 3/6] mtd: nand: bb: use mtd api directly Sascha Hauer
@ 2014-04-28 9:49 ` Sascha Hauer
2014-04-28 9:49 ` [PATCH 5/6] mtd: nand: create bb devices automatically Sascha Hauer
2014-04-28 9:49 ` [PATCH 6/6] OF: barebox-env: Use bb device on NAND Sascha Hauer
4 siblings, 0 replies; 8+ messages in thread
From: Sascha Hauer @ 2014-04-28 9:49 UTC (permalink / raw)
To: barebox
This refactors the code so that we get a mtd_add_bb which can
be used to create a bb dev on a mtd_info.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/nand-bb.c | 53 +++++++++++++++++++++++++++-------------------
include/nand.h | 6 ++++++
2 files changed, 37 insertions(+), 22 deletions(-)
diff --git a/drivers/mtd/nand/nand-bb.c b/drivers/mtd/nand/nand-bb.c
index 06b5824..0d3de41 100644
--- a/drivers/mtd/nand/nand-bb.c
+++ b/drivers/mtd/nand/nand-bb.c
@@ -29,6 +29,7 @@
#include <fcntl.h>
#include <libgen.h>
#include <linux/list.h>
+#include <linux/err.h>
struct nand_bb {
char *name;
@@ -240,32 +241,18 @@ static struct file_operations nand_bb_ops = {
static LIST_HEAD(bb_list);
-/**
- * Add a bad block aware device ontop of another (NAND) device
- * @param[in] dev The device to add a partition on
- * @param[in] name Partition name (can be obtained with devinfo command)
- * @return The device representing the new partition.
- */
-int dev_add_bb_dev(const char *path, const char *name)
+struct cdev *mtd_add_bb(struct mtd_info *mtd, const char *name)
{
struct nand_bb *bb;
- struct cdev *parent;
- int ret = -ENOMEM;
-
- parent = cdev_by_name(path);
- if (!parent)
- return -ENODEV;
-
- if (!parent->mtd)
- return -EINVAL;
+ int ret;
bb = xzalloc(sizeof(*bb));
- bb->mtd = parent->mtd;
+ bb->mtd = mtd;
if (name)
bb->cdev.name = xstrdup(name);
else
- bb->cdev.name = asprintf("%s.bb", path);;
+ bb->cdev.name = asprintf("%s.bb", mtd->cdev.name);
nand_bb_calc_size(bb);
bb->cdev.ops = &nand_bb_ops;
@@ -273,15 +260,37 @@ int dev_add_bb_dev(const char *path, const char *name)
ret = devfs_create(&bb->cdev);
if (ret)
- goto out4;
+ goto err;
list_add_tail(&bb->list, &bb_list);
- return 0;
+ return &bb->cdev;
-out4:
+err:
free(bb);
- return ret;
+ return ERR_PTR(ret);
+}
+
+/**
+ * Add a bad block aware device ontop of another (NAND) device
+ * @param[in] dev The device to add a partition on
+ * @param[in] name Partition name (can be obtained with devinfo command)
+ * @return The device representing the new partition.
+ */
+int dev_add_bb_dev(const char *path, const char *name)
+{
+ struct cdev *parent, *cdev;
+
+ parent = cdev_by_name(path);
+ if (!parent)
+ return -ENODEV;
+
+ if (!parent->mtd)
+ return -EINVAL;
+
+ cdev = mtd_add_bb(parent->mtd, name);
+
+ return PTR_ERR(cdev);
}
int dev_remove_bb_dev(const char *name)
diff --git a/include/nand.h b/include/nand.h
index a0e77cc..1da35d0 100644
--- a/include/nand.h
+++ b/include/nand.h
@@ -7,6 +7,7 @@ struct nand_bb;
#ifdef CONFIG_NAND
int dev_add_bb_dev(const char *filename, const char *name);
int dev_remove_bb_dev(const char *name);
+struct cdev *mtd_add_bb(struct mtd_info *mtd, const char *name);
#else
static inline int dev_add_bb_dev(const char *filename, const char *name) {
return 0;
@@ -15,6 +16,11 @@ static inline int dev_remove_bb_dev(const char *name)
{
return 0;
}
+
+static inline struct cdev *mtd_add_bb(struct mtd_info *mtd, const char *name)
+{
+ return NULL;
+}
#endif
#endif /* __NAND_H__ */
--
1.9.1
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 5/6] mtd: nand: create bb devices automatically
2014-04-28 9:49 [PATCH 1/6] environment: drop envfs_register_partition Sascha Hauer
` (2 preceding siblings ...)
2014-04-28 9:49 ` [PATCH 4/6] mtd: refactor bb device creation Sascha Hauer
@ 2014-04-28 9:49 ` Sascha Hauer
2014-04-28 9:49 ` [PATCH 6/6] OF: barebox-env: Use bb device on NAND Sascha Hauer
4 siblings, 0 replies; 8+ messages in thread
From: Sascha Hauer @ 2014-04-28 9:49 UTC (permalink / raw)
To: barebox
When a mtd device can have bad blocks we want to create a
bb device, so do this automatically. This allows us to
drop bb device creation from the environment.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
arch/arm/boards/a9m2410/env/bin/hush_hack | 1 -
arch/arm/boards/a9m2410/env/bin/init | 4 ----
arch/arm/boards/a9m2440/env/bin/hush_hack | 1 -
arch/arm/boards/a9m2440/env/bin/init | 4 ----
arch/arm/boards/eukrea_cpuimx27/env/bin/hush_hack | 1 -
arch/arm/boards/eukrea_cpuimx27/env/bin/init | 4 ----
arch/arm/boards/freescale-mx25-3ds/env/bin/hush_hack | 1 -
arch/arm/boards/freescale-mx25-3ds/env/bin/init | 4 ----
arch/arm/boards/mmccpu/env/bin/hush_hack | 1 -
arch/arm/boards/mmccpu/env/bin/init | 4 ----
arch/arm/boards/pm9263/env/bin/hush_hack | 1 -
arch/arm/boards/pm9263/env/bin/init | 4 ----
defaultenv/defaultenv-1/bin/init | 1 -
defaultenv/defaultenv-2-base/bin/mtdparts-add | 4 ----
drivers/mtd/core.c | 3 +++
drivers/of/partition.c | 3 ---
include/linux/mtd/mtd.h | 2 ++
17 files changed, 5 insertions(+), 38 deletions(-)
delete mode 100644 arch/arm/boards/a9m2410/env/bin/hush_hack
delete mode 100644 arch/arm/boards/a9m2440/env/bin/hush_hack
delete mode 100644 arch/arm/boards/eukrea_cpuimx27/env/bin/hush_hack
delete mode 100644 arch/arm/boards/freescale-mx25-3ds/env/bin/hush_hack
delete mode 100644 arch/arm/boards/mmccpu/env/bin/hush_hack
delete mode 100644 arch/arm/boards/pm9263/env/bin/hush_hack
diff --git a/arch/arm/boards/a9m2410/env/bin/hush_hack b/arch/arm/boards/a9m2410/env/bin/hush_hack
deleted file mode 100644
index 5fffa92..0000000
--- a/arch/arm/boards/a9m2410/env/bin/hush_hack
+++ /dev/null
@@ -1 +0,0 @@
-nand -a /dev/nand0.*
diff --git a/arch/arm/boards/a9m2410/env/bin/init b/arch/arm/boards/a9m2410/env/bin/init
index 5ae44dd..dd94ef6 100644
--- a/arch/arm/boards/a9m2410/env/bin/init
+++ b/arch/arm/boards/a9m2410/env/bin/init
@@ -7,10 +7,6 @@ export PATH
if [ -e /dev/nand0 ]; then
addpart /dev/nand0 $nand_parts
-
- # Uh, oh, hush first expands wildcards and then starts executing
- # commands. What a bug!
- source /env/bin/hush_hack
fi
if [ -z $eth0.ethaddr ]; then
diff --git a/arch/arm/boards/a9m2440/env/bin/hush_hack b/arch/arm/boards/a9m2440/env/bin/hush_hack
deleted file mode 100644
index 5fffa92..0000000
--- a/arch/arm/boards/a9m2440/env/bin/hush_hack
+++ /dev/null
@@ -1 +0,0 @@
-nand -a /dev/nand0.*
diff --git a/arch/arm/boards/a9m2440/env/bin/init b/arch/arm/boards/a9m2440/env/bin/init
index 5ae44dd..dd94ef6 100644
--- a/arch/arm/boards/a9m2440/env/bin/init
+++ b/arch/arm/boards/a9m2440/env/bin/init
@@ -7,10 +7,6 @@ export PATH
if [ -e /dev/nand0 ]; then
addpart /dev/nand0 $nand_parts
-
- # Uh, oh, hush first expands wildcards and then starts executing
- # commands. What a bug!
- source /env/bin/hush_hack
fi
if [ -z $eth0.ethaddr ]; then
diff --git a/arch/arm/boards/eukrea_cpuimx27/env/bin/hush_hack b/arch/arm/boards/eukrea_cpuimx27/env/bin/hush_hack
deleted file mode 100644
index 5fffa92..0000000
--- a/arch/arm/boards/eukrea_cpuimx27/env/bin/hush_hack
+++ /dev/null
@@ -1 +0,0 @@
-nand -a /dev/nand0.*
diff --git a/arch/arm/boards/eukrea_cpuimx27/env/bin/init b/arch/arm/boards/eukrea_cpuimx27/env/bin/init
index cd74974..e3c1091 100644
--- a/arch/arm/boards/eukrea_cpuimx27/env/bin/init
+++ b/arch/arm/boards/eukrea_cpuimx27/env/bin/init
@@ -10,10 +10,6 @@ fi
if [ -e /dev/nand0 ]; then
addpart /dev/nand0 $nand_parts
-
- # Uh, oh, hush first expands wildcards and then starts executing
- # commands. What a bug!
- source /env/bin/hush_hack
fi
if [ -f /env/logo.bmp ]; then
diff --git a/arch/arm/boards/freescale-mx25-3ds/env/bin/hush_hack b/arch/arm/boards/freescale-mx25-3ds/env/bin/hush_hack
deleted file mode 100644
index 5fffa92..0000000
--- a/arch/arm/boards/freescale-mx25-3ds/env/bin/hush_hack
+++ /dev/null
@@ -1 +0,0 @@
-nand -a /dev/nand0.*
diff --git a/arch/arm/boards/freescale-mx25-3ds/env/bin/init b/arch/arm/boards/freescale-mx25-3ds/env/bin/init
index 0600b9e..8eafa34 100644
--- a/arch/arm/boards/freescale-mx25-3ds/env/bin/init
+++ b/arch/arm/boards/freescale-mx25-3ds/env/bin/init
@@ -10,10 +10,6 @@ fi
if [ -e /dev/nand0 ]; then
addpart /dev/nand0 $nand_parts
-
- # Uh, oh, hush first expands wildcards and then starts executing
- # commands. What a bug!
- source /env/bin/hush_hack
fi
echo
diff --git a/arch/arm/boards/mmccpu/env/bin/hush_hack b/arch/arm/boards/mmccpu/env/bin/hush_hack
deleted file mode 100644
index 5fffa92..0000000
--- a/arch/arm/boards/mmccpu/env/bin/hush_hack
+++ /dev/null
@@ -1 +0,0 @@
-nand -a /dev/nand0.*
diff --git a/arch/arm/boards/mmccpu/env/bin/init b/arch/arm/boards/mmccpu/env/bin/init
index ac84bd5..ad9b65a 100644
--- a/arch/arm/boards/mmccpu/env/bin/init
+++ b/arch/arm/boards/mmccpu/env/bin/init
@@ -10,10 +10,6 @@ fi
if [ -e /dev/nand0 ]; then
addpart /dev/nand0 $nand_parts
-
- # Uh, oh, hush first expands wildcards and then starts executing
- # commands. What a bug!
- source /env/bin/hush_hack
fi
if [ -z $eth0.ethaddr ]; then
diff --git a/arch/arm/boards/pm9263/env/bin/hush_hack b/arch/arm/boards/pm9263/env/bin/hush_hack
deleted file mode 100644
index 5fffa92..0000000
--- a/arch/arm/boards/pm9263/env/bin/hush_hack
+++ /dev/null
@@ -1 +0,0 @@
-nand -a /dev/nand0.*
diff --git a/arch/arm/boards/pm9263/env/bin/init b/arch/arm/boards/pm9263/env/bin/init
index 02f5cd4..ad9b65a 100644
--- a/arch/arm/boards/pm9263/env/bin/init
+++ b/arch/arm/boards/pm9263/env/bin/init
@@ -10,10 +10,6 @@ fi
if [ -e /dev/nand0 ]; then
addpart /dev/nand0 $nand_parts
-
- # Uh, oh, hush first expands wildcards and then starts executing
- # commands. What a bug!
- source /env/bin/hush_hack
fi
if [ -z $eth0.ethaddr ]; then
diff --git a/defaultenv/defaultenv-1/bin/init b/defaultenv/defaultenv-1/bin/init
index adb3c43..4781b5a 100644
--- a/defaultenv/defaultenv-1/bin/init
+++ b/defaultenv/defaultenv-1/bin/init
@@ -16,7 +16,6 @@ fi
if [ -e /dev/nand0 -a -n "$nand_parts" ]; then
addpart /dev/nand0 $nand_parts
- nand -a /dev/nand0.*
fi
if [ -f /env/bin/init_board ]; then
diff --git a/defaultenv/defaultenv-2-base/bin/mtdparts-add b/defaultenv/defaultenv-2-base/bin/mtdparts-add
index 58c9fa7..05ab638 100644
--- a/defaultenv/defaultenv-2-base/bin/mtdparts-add
+++ b/defaultenv/defaultenv-2-base/bin/mtdparts-add
@@ -39,10 +39,6 @@ fi
addpart -n /dev/${device} "$parts" || exit
mkdir -p /tmp/mtdparts/${device}
-if [ -n "${bbdev}" ]; then
- nand -a /dev/${device}.*
-fi
-
if [ -n ${kernelname} ]; then
global linux.mtdparts.${device}
global.linux.mtdparts.${device}="${kernelname}:${parts}"
diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c
index c97c8c1..d954f72 100644
--- a/drivers/mtd/core.c
+++ b/drivers/mtd/core.c
@@ -409,6 +409,9 @@ int add_mtd_device(struct mtd_info *mtd, char *devname, int device_id)
devfs_create(&mtd->cdev);
+ if (mtd_can_have_bb(mtd))
+ mtd->cdev_bb = mtd_add_bb(mtd, NULL);
+
if (mtd->parent && !mtd->master)
of_parse_partitions(&mtd->cdev, mtd->parent->device_node);
diff --git a/drivers/of/partition.c b/drivers/of/partition.c
index 5ed44a8..074be09 100644
--- a/drivers/of/partition.c
+++ b/drivers/of/partition.c
@@ -61,9 +61,6 @@ struct cdev *of_parse_partition(struct cdev *cdev, struct device_node *node)
new = devfs_add_partition(cdev->name, offset, size, flags, filename);
- if (cdev->mtd && cdev->mtd->type == MTD_NANDFLASH)
- dev_add_bb_dev(filename, NULL);
-
free(filename);
return new;
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
index c63b514..5f02aee 100644
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
@@ -211,6 +211,8 @@ struct mtd_info {
struct device_d *parent;
struct cdev cdev;
+ struct cdev *cdev_bb;
+
struct param_d param_size;
char *size_str;
--
1.9.1
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 6/6] OF: barebox-env: Use bb device on NAND
2014-04-28 9:49 [PATCH 1/6] environment: drop envfs_register_partition Sascha Hauer
` (3 preceding siblings ...)
2014-04-28 9:49 ` [PATCH 5/6] mtd: nand: create bb devices automatically Sascha Hauer
@ 2014-04-28 9:49 ` Sascha Hauer
4 siblings, 0 replies; 8+ messages in thread
From: Sascha Hauer @ 2014-04-28 9:49 UTC (permalink / raw)
To: barebox
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/of/barebox.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/drivers/of/barebox.c b/drivers/of/barebox.c
index 44ec820..8c05924 100644
--- a/drivers/of/barebox.c
+++ b/drivers/of/barebox.c
@@ -24,6 +24,7 @@
#include <malloc.h>
#include <partition.h>
#include <envfs.h>
+#include <linux/mtd/mtd.h>
struct of_partition {
struct list_head list;
@@ -57,6 +58,24 @@ static int environment_probe(struct device_d *dev)
if (ret)
return ret;
+ /*
+ * The environment support is not bad block aware, hence we
+ * have to use the .bb device. Test if we have a nand device
+ * and if yes, append .bb to the filename.
+ */
+ if (!strncmp(path, "/dev/", 5)) {
+ struct cdev *cdev;
+ char *cdevname;
+
+ cdevname = path + 5;
+ cdev = cdev_by_name(cdevname);
+ if (cdev && cdev->mtd && mtd_can_have_bb(cdev->mtd)) {
+ char *bbpath = asprintf("%s.bb", path);
+ free(path);
+ path = bbpath;
+ }
+ }
+
dev_info(dev, "setting default environment path to %s\n", path);
default_environment_path_set(path);
--
1.9.1
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 3/6] mtd: nand: bb: use mtd api directly
2014-04-28 9:49 ` [PATCH 3/6] mtd: nand: bb: use mtd api directly Sascha Hauer
@ 2014-04-28 13:05 ` Alexander Aring
2014-04-28 18:48 ` Sascha Hauer
0 siblings, 1 reply; 8+ messages in thread
From: Alexander Aring @ 2014-04-28 13:05 UTC (permalink / raw)
To: Sascha Hauer; +Cc: barebox
Hi Sascha,
On Mon, Apr 28, 2014 at 11:49:36AM +0200, Sascha Hauer wrote:
> The devfs layer just adds an addition indirection between mtd
> and the bb devices with no purpose. Drop it.
>
> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> ---
> drivers/mtd/nand/nand-bb.c | 122 +++++++++++++++++++--------------------------
> 1 file changed, 50 insertions(+), 72 deletions(-)
>
> diff --git a/drivers/mtd/nand/nand-bb.c b/drivers/mtd/nand/nand-bb.c
> index f387ef6..06b5824 100644
> --- a/drivers/mtd/nand/nand-bb.c
> +++ b/drivers/mtd/nand/nand-bb.c
> @@ -25,22 +25,18 @@
> #include <init.h>
> #include <ioctl.h>
> #include <nand.h>
> -#include <linux/mtd/mtd-abi.h>
> +#include <linux/mtd/mtd.h>
> #include <fcntl.h>
> #include <libgen.h>
...
> @@ -313,8 +291,8 @@ int dev_remove_bb_dev(const char *name)
> list_for_each_entry(bb, &bb_list, list) {
> if (!strcmp(bb->cdev.name, name)) {
> devfs_remove(&bb->cdev);
> - cdev_close(bb->cdev_parent);
> list_del_init(&bb->list);
> + free(bb->name);
> free(bb);
> return 0;
> }
I know you doesn't change this line but I think we need a
list_for_each_entry_safe here instead of list_for_each_entry.
- Alex
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 3/6] mtd: nand: bb: use mtd api directly
2014-04-28 13:05 ` Alexander Aring
@ 2014-04-28 18:48 ` Sascha Hauer
0 siblings, 0 replies; 8+ messages in thread
From: Sascha Hauer @ 2014-04-28 18:48 UTC (permalink / raw)
To: Alexander Aring; +Cc: barebox
On Mon, Apr 28, 2014 at 03:05:26PM +0200, Alexander Aring wrote:
> Hi Sascha,
>
> On Mon, Apr 28, 2014 at 11:49:36AM +0200, Sascha Hauer wrote:
> > The devfs layer just adds an addition indirection between mtd
> > and the bb devices with no purpose. Drop it.
> >
> > Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> > ---
> > drivers/mtd/nand/nand-bb.c | 122 +++++++++++++++++++--------------------------
> > 1 file changed, 50 insertions(+), 72 deletions(-)
> >
> > diff --git a/drivers/mtd/nand/nand-bb.c b/drivers/mtd/nand/nand-bb.c
> > index f387ef6..06b5824 100644
> > --- a/drivers/mtd/nand/nand-bb.c
> > +++ b/drivers/mtd/nand/nand-bb.c
> > @@ -25,22 +25,18 @@
> > #include <init.h>
> > #include <ioctl.h>
> > #include <nand.h>
> > -#include <linux/mtd/mtd-abi.h>
> > +#include <linux/mtd/mtd.h>
> > #include <fcntl.h>
> > #include <libgen.h>
> ...
>
> > @@ -313,8 +291,8 @@ int dev_remove_bb_dev(const char *name)
> > list_for_each_entry(bb, &bb_list, list) {
> > if (!strcmp(bb->cdev.name, name)) {
> > devfs_remove(&bb->cdev);
> > - cdev_close(bb->cdev_parent);
> > list_del_init(&bb->list);
> > + free(bb->name);
> > free(bb);
> > return 0;
> > }
>
> I know you doesn't change this line but I think we need a
> list_for_each_entry_safe here instead of list_for_each_entry.
Ouch, you are right. I'll prepare a patch for this.
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2014-04-28 18:48 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-04-28 9:49 [PATCH 1/6] environment: drop envfs_register_partition Sascha Hauer
2014-04-28 9:49 ` [PATCH 2/6] env: erase/protect in envfs_save Sascha Hauer
2014-04-28 9:49 ` [PATCH 3/6] mtd: nand: bb: use mtd api directly Sascha Hauer
2014-04-28 13:05 ` Alexander Aring
2014-04-28 18:48 ` Sascha Hauer
2014-04-28 9:49 ` [PATCH 4/6] mtd: refactor bb device creation Sascha Hauer
2014-04-28 9:49 ` [PATCH 5/6] mtd: nand: create bb devices automatically Sascha Hauer
2014-04-28 9:49 ` [PATCH 6/6] OF: barebox-env: Use bb device on NAND Sascha Hauer
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.