[U-Boot] [PATCH v2] mtd: resync with Linux-3.7.1

Sergey Lapin slapin at ossfans.org
Thu Jan 17 13:07:39 CET 2013


Dear Scott,
thanks a lot for your review,
see below.

On Wed, Jan 16, 2013 at 04:09:45PM -0600, Scott Wood wrote:
> On 01/14/2013 07:46:50 AM, Sergey Lapin wrote:
> >This patch is essentially an update of u-boot MTD subsystem to
> >the state of Linux-3.7.1 with exclusion of some bits:
> >
> >- the update is concentrated on NAND, no onenand or CFI/NOR/SPI
> >flashes interfaces are updated EXCEPT for API changes.
> >
> >- new large NAND chips support is there, though some updates
> >have got in Linux-3.8.-rc1, (which will follow on top of this patch).
> >
> >To produce this update I used tag v3.7.1 of linux-stable repository.
> >
> >The update was made using application of relevant patches,
> >with changes relevant to U-Boot-only stuff sticked together
> >to keep bisectability. Then all changes were grouped together
> >to this patch.
> >
> >Signed-off-by: Sergey Lapin <slapin at ossfans.org>
> >---
> 
> Applying: mtd: resync with Linux-3.7.1
> /home/scott/fsl/git/u-boot/upstream/.git/rebase-apply/patch:4292:
> space before tab in indent.
>  		chip->ecc.strength =
> /home/scott/fsl/git/u-boot/upstream/.git/rebase-apply/patch:835: new
> blank line at EOF.
> +
> /home/scott/fsl/git/u-boot/upstream/.git/rebase-apply/patch:6011:
> new blank line at EOF.
> +
> /home/scott/fsl/git/u-boot/upstream/.git/rebase-apply/patch:7970:
> new blank line at EOF.
> +
> warning: 4 lines add whitespace errors.
> 
> Are these whitespace errors in Linux?
Yeah, this thing wonders me why. I can fix these without too much
hussle, should I?
> 
> I tried booting on P2020RDB-PC_NAND, and got this:
> 
> >L2:    512 KB already enabled, moving to 0xf8f80000
> >NAND:  BUG: failure at nand_base.c:3214/nand_scan_tail()!
> >BUG!
> >### ERROR ### Please RESET the board ###
Can you debug this farther, as I don't have devices with hardware ECC
NAND, and was unable to convince anyone for testing?
Or, better, direct access to some board for several days could be nice.

> 
> It boots fine without this patch.  nand_base.c:3214 is complaining about
> missing ecc.strength.  You need to update existing U-Boot drivers
> for new
> API so that nothing breaks.  Ask maintainers of particular drivers for
> help if necessary.
I updated all drivers I could test and tried to do that for all others,
but it seems it won't work without testing.

> 
> You'll probably need to go through the various NAND patches between 3.0
> and 3.7.1 looking for API changes, and make sure that they're all
> accounted for, beyond just making things build.
This is what I did most of time, shit happens.

> 
> >diff --git a/board/ait/cam_enc_4xx/cam_enc_4xx.c
> >b/board/ait/cam_enc_4xx/cam_enc_4xx.c
> >index 32b28f9..2a0c31c 100644
> >--- a/board/ait/cam_enc_4xx/cam_enc_4xx.c
> >+++ b/board/ait/cam_enc_4xx/cam_enc_4xx.c
> >@@ -120,7 +120,7 @@ int board_eth_init(bd_t *bis)
> > #ifdef CONFIG_NAND_DAVINCI
> > static int
> > davinci_std_read_page_syndrome(struct mtd_info *mtd, struct
> >nand_chip *chip,
> >-				   uint8_t *buf, int page)
> >+				   uint8_t *buf, int oob_required, int page)
> > {
> > 	struct nand_chip *this = mtd->priv;
> > 	int i, eccsize = chip->ecc.size;
> >@@ -167,8 +167,9 @@ davinci_std_read_page_syndrome(struct mtd_info
> >*mtd, struct nand_chip *chip,
> > 	return 0;
> > }
> 
> We really should not be having NAND driver code (stuff that interacts
> with the NAND API; not hardware setup) outside of drivers/mtd/nand.
This probably should be split.
> 
> >diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile
> >index 543c845..99f39fc 100644
> >--- a/drivers/mtd/Makefile
> >+++ b/drivers/mtd/Makefile
> >@@ -25,7 +25,9 @@ include $(TOPDIR)/config.mk
> >
> > LIB	:= $(obj)libmtd.o
> >
> >-COBJS-$(CONFIG_MTD_DEVICE) += mtdcore.o
> >+ifneq (,$(findstring
> >y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND)))
> >+COBJS-y += mtdcore.o
> >+endif
> 
> Please just require users of CONFIG_CMD_NAND or CONFIG_CMD_ONENAND to
> also select CONFIG_MTD_DEVICE, if it's not going to be practical to do
> without it -- and remove the "#ifdef CONFIG_MTD_DEVICE" from nand.c.
> 
> Could you explain why it's no longer practical to have NAND by itself?

I have dilemma here:

New MTD API instead of calling mtd->foo(mtd...) uses mtd_foo(mtd...)
functions. In Linux, these are defined in mtdcore.c

We can either move these functions from mtdcore.c somewhere (where?), or
#ifndef unrelated parts from mtdcore.c

> 
> >diff --git a/drivers/mtd/nand/diskonchip.c
> >b/drivers/mtd/nand/diskonchip.c
> >index edf3a09..104d97f 100644
> >--- a/drivers/mtd/nand/diskonchip.c
> >+++ b/drivers/mtd/nand/diskonchip.c
> >@@ -134,7 +134,7 @@ static struct rs_control *rs_decoder;
> >
> > /*
> >  * The HW decoder in the DoC ASIC's provides us a error syndrome,
> >- * which we must convert to a standard syndrom usable by the generic
> >+ * which we must convert to a standard syndrome usable by the generic
> >  * Reed-Solomon library code.
> >  *
> >  * Fabrice Bellard figured this out in the old docecc code. I added
> 
> This file should just go away, as nobody has stepped up to fix and use
> it.
> 
> > #ifdef CONFIG_MTD_DEBUG
> >+#define pr_debug(args...)	MTDDEBUG(MTD_DEBUG_LEVEL0, args)
> > #define MTDDEBUG(n, args...)				\
> > 	do {						\
> > 		if (n <= CONFIG_MTD_DEBUG_VERBOSE)	\
> > 			printk(KERN_INFO args);		\
> > 	} while(0)
> > #else /* CONFIG_MTD_DEBUG */
> >+#define pr_debug(args...)
> > #define MTDDEBUG(n, args...)				\
> > 	do {						\
> > 		if (0)					\
> > 			printk(KERN_INFO args);		\
> > 	} while(0)
> > #endif /* CONFIG_MTD_DEBUG */
> 
> If you define pr_debug() to be absolutely nothing, you won't catch
> errors
> until CONFIG_MTD_DEBUG is actually turned on.  That's why MTDDEBUG does
> the "if (0)" thing.
> 
> pr_debug() should not be defined in terms of CONFIG_MTD_DEBUG.  What if
> this header gets included by some other part of U-Boot?  What if some
> other part of U-Boot also wants pr_debug, but based on a different
> subsystem's CONFIG_FOO_DEBUG?
> 
> >+#define pr_info(args...)	MTDDEBUG(MTD_DEBUG_LEVEL0, args)
> >+#define pr_warn(args...)	MTDDEBUG(MTD_DEBUG_LEVEL0, args)
> >+#define pr_err(args...)		MTDDEBUG(MTD_DEBUG_LEVEL0, args)
> 
> These should be ordinary printf, not MTDDEBUG.  Under normal
> (non-debug) circumstances MTDDEBUG is a no-op.  We want to see
> errors and
> warnings always.
> 
> Plus, these should be defined somewhere that isn't MTD-specific.
So, should I add separate header?
> 
> >+static inline int mtd_is_bitflip(int err) {
> >+	return err == -EUCLEAN;
> >+}
> >+
> >+static inline int mtd_is_eccerr(int err) {
> >+	return err == -EBADMSG;
> >+}
> >+
> >+static inline int mtd_is_bitflip_or_eccerr(int err) {
> >+	return mtd_is_bitflip(err) || mtd_is_eccerr(err);
> >+}
> 
> Sigh, Linux isn't following its own coding style.
> 
> >diff --git a/include/mtd/mtd-abi.h b/include/mtd/mtd-abi.h
> >new file mode 100644
> >index 0000000..d51c1ab
> >--- /dev/null
> >+++ b/include/mtd/mtd-abi.h
> >@@ -0,0 +1,209 @@
> >+/*
> >+ * $Id: mtd-abi.h,v 1.13 2005/11/07 11:14:56 gleixner Exp $
> >+ *
> >+ * Portions of MTD ABI definition which are shared by kernel and
> >user space
> >+ */
> >+
> >+#ifndef __MTD_ABI_H__
> >+#define __MTD_ABI_H__
> >+
> >+#if 1
> >+#include <linux/compat.h>
> >+#endif
> 
> Why "#if 1"?

Sorry, this is probably my conflict resolution issue, will fix.

So, what is next step?

Thanks a lot,
S.



More information about the U-Boot mailing list