On Mon, Aug 03, 2009 at 05:45:14AM +0400, Ilya Yanok wrote:
> +     if (this->options & NAND_BUSWIDTH_16) {
> +             void __iomem *main_buf = host->regs->main_area0;
> +             /* compress the ID info */
> +             writeb(readb(main_buf + 2), main_buf + 1);
> +             writeb(readb(main_buf + 4), main_buf + 2);
> +             writeb(readb(main_buf + 6), main_buf + 3);
> +             writeb(readb(main_buf + 8), main_buf + 4);
> +             writeb(readb(main_buf + 10), main_buf + 5);
> +     }

This indicates that read_byte isn't doing what the generic NAND code is
expecting.  It should advance by a word in the buffer for each byte read
-- the implementation of nand_read_byte16 confirms this.

In that case, though, why have separate read_byte and read_word?  Just
to provide an endian-broken alternative, that is only used where
endianness doesn't matter (checking bad block markers)? :-(

> +     if (col & 1) {
> +             union {
> +                     uint16_t word;
> +                     uint8_t bytes[2];
> +             } nfc_word;
> +
> +             nfc_word.word = readw(p);
> +             ret = nfc_word.bytes[1];
> +             nfc_word.word = readw(&p[1]);
> +             ret |= nfc_word.bytes[0] << 16;

This still has an endian assumption (and shouldn't << 16 be << 8, and
require a cast to avoid shifting beyond the type width?) -- it's moot
given the nature of read_byte and read_word, but if this were necessary
it should be something like:

union {
        ...
} nfc_word[3];

nfc_word[0] = readw(p);
nfc_word[1] = readw(p + 1);

nfc_word[2].bytes[0] = nfc_word[0].bytes[1];
nfc_word[2].bytes[1] = nfc_word[1].bytes[0];

ret = nfc_word[2].word;

Alternatively, you could apply le16_to_cpu to the result of something
like your version.

-Scott
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to