changeset 2989:8fb3f9a53423

Further refine CYGSEM_IO_NAND_USE_BBT, drop the relevant parts of the struct when not enabled.
author Ross Younger <wry@ecoscentric.com>
date Fri, 13 Nov 2009 12:36:33 +0000
parents 5cd059c3887b
children 436d18a77629
files packages/io/nand/current/ChangeLog packages/io/nand/current/include/nand_device.h packages/io/nand/current/src/nand.c
diffstat 3 files changed, 12 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/packages/io/nand/current/ChangeLog
+++ b/packages/io/nand/current/ChangeLog
@@ -1,6 +1,8 @@
 2009-11-13  Ross Younger  <wry@eCosCentric.com>
 
 	* utils/erasenand.c: Fix fencepost error
+	* nand_device.h nand.c: Further refine CYGSEM_IO_NAND_USE_BBT,
+	drop the relevant parts of the struct when not enabled.
 
 2009-11-12  Ross Younger  <wry@eCosCentric.com>
 
--- a/packages/io/nand/current/include/nand_device.h
+++ b/packages/io/nand/current/include/nand_device.h
@@ -240,6 +240,7 @@ struct _cyg_nand_device_t {
     size_t blockcount_bits; /* log2 of number of blocks */
     size_t chipsize_log; /* log2 of total chip size in BYTES. */
 
+#ifdef CYGSEM_IO_NAND_USE_BBT
     struct {
         cyg_nand_block_addr primary, mirror; // or 0xFFFFFFFF if not present
         CYG_BYTE *data; /* in-RAM bad block table. See nand_bbt.c.
@@ -247,6 +248,7 @@ struct _cyg_nand_device_t {
         size_t datasize; /* size of data in bytes, used to cross-check */
         CYG_BYTE version; /* _current_ version tag */
     } bbt;
+#endif
 
     cyg_nand_ecc_t *ecc;
     const cyg_nand_oob_layout *oob;
--- a/packages/io/nand/current/src/nand.c
+++ b/packages/io/nand/current/src/nand.c
@@ -208,7 +208,9 @@ int cyg_nand_lookup(const char *devname,
             dev->pf = nand_default_pf;
             for (i=0; i<CYGNUM_NAND_MAX_PARTITIONS; i++)
                 dev->partition[i].dev = 0;
+#ifdef CYGSEM_IO_NAND_USE_BBT
             dev->bbt.data = 0; // Paranoia, ensure devinit sets up
+#endif
 
             rv = dev->fns->devinit(dev);
 
@@ -228,7 +230,9 @@ int cyg_nand_lookup(const char *devname,
             CYG_CHECK_FUNC_PTRC(dev->fns->erase_block);
             CYG_CHECK_FUNC_PTRC(dev->fns->is_factory_bad);
 
+#ifdef CYGSEM_IO_NAND_USE_BBT
             CYG_CHECK_DATA_PTRC(dev->bbt.data);
+#endif
             CYG_CHECK_DATA_PTRC(dev->ecc);
             CYG_CHECK_DATA_PTRC(dev->oob);
             if (!dev->chipsize_log ||
@@ -236,7 +240,9 @@ int cyg_nand_lookup(const char *devname,
                     !dev->block_page_bits ||
                     !dev->spare_per_page ||
                     !dev->page_bits ||
+#ifdef CYGSEM_IO_NAND_USE_BBT
                     !dev->bbt.data ||
+#endif
                     !dev->ecc ||
                     !dev->oob) {
                 NAND_ERROR(dev,"BUG: NAND driver devinit did not fill in all required fields - disabling device\n");
@@ -244,11 +250,13 @@ int cyg_nand_lookup(const char *devname,
                 goto done;
             }
 
+#ifdef CYGSEM_IO_NAND_USE_BBT
             if (dev->bbt.datasize < (1 << (dev->blockcount_bits-2)) ) {
                 NAND_ERROR(dev,"BUG: NAND driver declared bbt.data_size isn't big enough (got %lu, want %u) - disabling device\n", (unsigned long) dev->bbt.datasize, (1 << (dev->blockcount_bits-2)));
                 rv = -ENOSYS;
                 goto done;
             }
+#endif
 
             if ( dev->oob->ecc_size != CYG_NAND_ECCPERPAGE(dev) ) {
                 NAND_ERROR(dev,"BUG: NAND driver has inconsistent ECC size declaration (oob says %d, ecc says %d) - disabling device\n", dev->oob->ecc_size, CYG_NAND_ECCPERPAGE(dev));