Mercurial > nand-ecoscentric
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));
