Re-factoring the legacy NAND code (legacy NAND now only in board-specific
[pandora-u-boot.git] / common / cmd_doc.c
index 17c9d0d..c726957 100644 (file)
@@ -22,8 +22,9 @@
 #if (CONFIG_COMMANDS & CFG_CMD_DOC)
 
 #include <linux/mtd/nftl.h>
-#include <linux/mtd/nand.h>
+#include <linux/mtd/nand_legacy.h>
 #include <linux/mtd/nand_ids.h>
+
 #include <linux/mtd/doc2000.h>
 #include <linux/mtd/nftl.h>
 
@@ -143,7 +144,7 @@ int do_doc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                        cmd ? "read" : "write", curr_device, off, size);
 
                ret = doc_rw(doc_dev_desc + curr_device, cmd, off, size,
-                            &total, (u_char*)addr);
+                            (size_t *)&total, (u_char*)addr);
 
                printf ("%d bytes %s: %s\n", total, cmd ? "read" : "write",
                        ret ? "ERROR" : "OK");
@@ -170,8 +171,8 @@ int do_doc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        return rcode;
     }
 }
-cmd_tbl_t U_BOOT_CMD(DOC) = MK_CMD_ENTRY(
-       "doc",  5,      1,      do_doc,
+U_BOOT_CMD(
+       doc,    5,      1,      do_doc,
        "doc     - Disk-On-Chip sub-system\n",
        "info  - show available DOC devices\n"
        "doc device [dev] - show or set current device\n"
@@ -284,8 +285,8 @@ int do_docboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        return rcode;
 }
 
-cmd_tbl_t U_BOOT_CMD(DOCBOOT) = MK_CMD_ENTRY(
-       "docboot",      4,      1,      do_docboot,
+U_BOOT_CMD(
+       docboot,        4,      1,      do_docboot,
        "docboot - boot from DOC device\n",
        "loadAddr dev\n"
 );
@@ -304,12 +305,12 @@ int doc_rw (struct DiskOnChip* this, int cmd,
 
                if (cmd)
                        ret = doc_read_ecc(this, from, len,
-                                          &n, (u_char*)buf,
-                                          noecc ? NULL : eccbuf);
+                                          (size_t *)&n, (u_char*)buf,
+                                          noecc ? (uchar *)NULL : (uchar *)eccbuf);
                else
                        ret = doc_write_ecc(this, from, len,
-                                           &n, (u_char*)buf,
-                                           noecc ? NULL : eccbuf);
+                                           (size_t *)&n, (u_char*)buf,
+                                           noecc ? (uchar *)NULL : (uchar *)eccbuf);
 
                if (ret)
                        break;
@@ -525,7 +526,7 @@ static int DoC_Address(struct DiskOnChip *doc, int numbytes, unsigned long ofs,
        return DoC_WaitReady(doc);
 }
 
-/* Read a buffer from DoC, taking care of Millennium odditys */
+/* Read a buffer from DoC, taking care of Millennium oddities */
 static void DoC_ReadBuf(struct DiskOnChip *doc, u_char * buf, int len)
 {
        volatile int dummy;
@@ -558,7 +559,7 @@ static void DoC_ReadBuf(struct DiskOnChip *doc, u_char * buf, int len)
        }
 }
 
-/* Write a buffer to DoC, taking care of Millennium odditys */
+/* Write a buffer to DoC, taking care of Millennium oddities */
 static void DoC_WriteBuf(struct DiskOnChip *doc, const u_char * buf, int len)
 {
        unsigned long docptr;
@@ -804,7 +805,7 @@ static int find_boot_record(struct NFTLrecord *nftl)
                /* Check for ANAND header first. Then can whinge if it's found but later
                   checks fail */
                if ((ret = doc_read_ecc(nftl->mtd, block * nftl->EraseSize, SECTORSIZE,
-                                       &retlen, buf, NULL))) {
+                                       (size_t *)&retlen, buf, NULL))) {
                        static int warncount = 5;
 
                        if (warncount) {
@@ -829,7 +830,7 @@ static int find_boot_record(struct NFTLrecord *nftl)
 
                /* To be safer with BIOS, also use erase mark as discriminant */
                if ((ret = doc_read_oob(nftl->mtd, block * nftl->EraseSize + SECTORSIZE + 8,
-                               8, &retlen, (char *)&h1) < 0)) {
+                               8, (size_t *)&retlen, (uchar *)&h1) < 0)) {
 #ifdef NFTL_DEBUG
                        printf("ANAND header found at 0x%x, but OOB data read failed\n",
                               block * nftl->EraseSize);
@@ -861,8 +862,13 @@ static int find_boot_record(struct NFTLrecord *nftl)
                memcpy(mh, buf, sizeof(struct NFTLMediaHeader));
 
                /* Do some sanity checks on it */
-               if (mh->UnitSizeFactor != 0xff) {
-                       puts ("Sorry, we don't support UnitSizeFactor "
+               if (mh->UnitSizeFactor == 0) {
+#ifdef NFTL_DEBUG
+                       puts ("UnitSizeFactor 0x00 detected.\n"
+                             "This violates the spec but we think we know what it means...\n");
+#endif
+               } else if (mh->UnitSizeFactor != 0xff) {
+                       printf ("Sorry, we don't support UnitSizeFactor "
                              "of != 1 yet.\n");
                        return -1;
                }
@@ -897,7 +903,7 @@ static int find_boot_record(struct NFTLrecord *nftl)
                                /* read one sector for every SECTORSIZE of blocks */
                                if ((ret = doc_read_ecc(nftl->mtd, block * nftl->EraseSize +
                                                       i + SECTORSIZE, SECTORSIZE,
-                                                      &retlen, buf, (char *)&oob)) < 0) {
+                                                      (size_t *)&retlen, buf, (uchar *)&oob)) < 0) {
                                        puts ("Read of bad sector table failed\n");
                                        return -1;
                                }
@@ -950,6 +956,8 @@ static void DoC2k_init(struct DiskOnChip* this)
 
        /* Ident all the chips present. */
        DoC_ScanChips(this);
+       if ((!this->numchips) || (!this->chips))
+               return;
 
        nftl = &this->nftl;
 
@@ -992,7 +1000,7 @@ int doc_read_ecc(struct DiskOnChip* this, loff_t from, size_t len,
                printf("ECC needs a full sector read (adr: %lx size %lx)\n",
                       (long) from, (long) len);
 
-#ifdef PHYCH_DEBUG
+#ifdef PSYCHO_DEBUG
        printf("DoC_Read (adr: %lx size %lx)\n", (long) from, (long) len);
 #endif