On Fri, Jul 17, 2009 at 02:53:55PM +0400, Ilya Yanok wrote: > +/* OOB placement block for use with hardware ecc generation */ > +static struct nand_ecclayout nand_hw_eccoob = { > + .eccbytes = 5, > + .eccpos = {6, 7, 8, 9, 10}, > + .oobfree = {{0, 5}, {11, 5}, } > +}; > + > +#ifndef CONFIG_MXC_NAND_HWECC > +static struct nand_ecclayout nand_hw_eccoob_soft = { > + .eccbytes = 6, > + .eccpos = {6, 7, 8, 9, 10, 11}, > + .oobfree = {{0, 5}, {12, 4}, } > +}; > +#endif
Why is one struct #ifndef, but the other isn't #ifdef? > +/* > + * This function requests the NANDFC to initate the transfer > + * of data currently in the NANDFC RAM buffer to the NAND device. > + */ > +static void send_prog_page(struct mxc_nand_host *host, uint8_t buf_id, > + int spare_only) > +{ > + MTDDEBUG(MTD_DEBUG_LEVEL3, "send_prog_page (%d)\n", spare_only); > + > + /* NANDFC buffer 0 is used for page read/write */ > + writew(buf_id, &host->regs->nfc_buf_addr); Comment does not match code. > + /* > + * NANDFC buffer 1 is used for device status to prevent > + * corruption of read/write buffer on status requests. > + */ > + writew(1, &host->regs->nfc_buf_addr); >From discussion on the previous patch: > > But it looks like buffer 1 is used for data with large page flash. > > > > Well, we save first word of the buffer and then recover it. So then there's no longer any special reason to use buffer 1 for status, and that comment is misleading... > +static u_char mxc_nand_read_byte(struct mtd_info *mtd) > +{ > + struct nand_chip *nand_chip = mtd->priv; > + struct mxc_nand_host *host = nand_chip->priv; > + uint8_t ret = 0; > + uint16_t col, rd_word; > + uint16_t __iomem *main_buf = > + (uint16_t __iomem *)host->regs->main_area0; > + uint16_t __iomem *spare_buf = > + (uint16_t __iomem *)host->regs->spare_area0; > + > + /* Check for status request */ > + if (host->status_request) > + return get_dev_status(host) & 0xFF; > + > + /* Get column for 16-bit access */ > + col = host->col_addr >> 1; > + > + /* If we are accessing the spare region */ > + if (host->spare_only) > + rd_word = readw(&spare_buf[col]); > + else > + rd_word = readw(&main_buf[col]); > + > + /* Pick upper/lower byte of word from RAM buffer */ > + if (host->col_addr & 0x1) > + ret = (rd_word >> 8) & 0xFF; > + else > + ret = rd_word & 0xFF; Use a union, as in read_buf(). Otherwise, this breaks on big-endian -- you may not care, but it's better to not have such dependencies lurking in the code that could be reused who-knows-where. > + if (col & 1) { > + rd_word = readw(p); > + ret = (rd_word >> 8) & 0xff; > + rd_word = readw(&p[1]); > + ret |= (rd_word << 8) & 0xff00; Again, this is unnecessary, but if you insist, use a union. > +#ifdef CONFIG_MTD_NAND_MXC_FORCE_CE > + if (chip > 0) { > + MTDDEBUG(MTD_DEBUG_LEVEL0, > + "ERROR: Illegal chip select (chip = %d)\n", chip); If it's an error, that's not exactly debug (especially since there's no way to propagate the error upwards)... > + return; > + } > + > + if (chip == -1) { > + writew(readw(&host->regs->nfc_config1) & ~NFC_CE, > + &host->regs->nfc_config1); > + return; > + } > + > + writew(readw(&host->regs->nfc_config1) | NFC_CE, > + &host->regs->nfc_config1); > +#endif #else? > + if (column >= mtd->writesize) { > + /* > + * before sending SEQIN command for partial write, > + * we need read one page out. FSL NFC does not support > + * partial write. It alway send out 512+ecc+512+ecc ... > + * for large page nand flash. But for small page nand > + * flash, it does support SPARE ONLY operation. > + */ > + if (host->pagesize_2k) { > + /* call ourself to read a page */ > + mxc_nand_command(mtd, NAND_CMD_READ0, 0, > + page_addr); > + } #ifdef CONFIG_MXC_NAND_HWECC? > + /* 50 us command delay time */ > + this->chip_delay = 5; 5 or 50? > + host->pagesize_2k = 0; Make this board-configurable. Has large page been tested? If not, perhaps it should stay out for now, given how weird it is on this controller. -Scott _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot