Ben, The data (packet data) and the status/len are different in LE/BE, cannot use just the macro dm9000_x to cover both. In my case, packet data is already in BE, but the status/len is in LE; therefore, status/len require byteswap. This has to do with cpu endian mode.
Regards, TsiChung -----Original Message----- From: Ben Warren [mailto:[EMAIL PROTECTED] Sent: Wednesday, June 25, 2008 4:01 PM To: Liew Tsi Chung Cc: U-Boot-Users; Rigby John Subject: Re: [PATCH] Fix dm9000 receive status and len little endian issue Tsi-Chung Liew wrote: > From: TsiChung Liew <[EMAIL PROTECTED]> > > The received status and len was in little endian format and caused the > ethernet unable to proceed further. Add __le16_to_cpu() in > dm9000_rx_status_8/16/32bit(). > > Signed-off-by: TsiChung Liew <[EMAIL PROTECTED]> > --- > drivers/net/dm9000x.c | 16 ++++++++++------ > 1 files changed, 10 insertions(+), 6 deletions(-) > > diff --git a/drivers/net/dm9000x.c b/drivers/net/dm9000x.c index > 844fb76..e7365fe 100644 > --- a/drivers/net/dm9000x.c > +++ b/drivers/net/dm9000x.c > @@ -214,24 +214,28 @@ static void dm9000_rx_status_32bit(u16 *RxStatus, u16 *RxLen) > DM9000_outb(DM9000_MRCMD, DM9000_IO); > > tmpdata = DM9000_inl(DM9000_DATA); > - *RxStatus = tmpdata; > - *RxLen = tmpdata >> 16; > + *RxStatus = __le16_to_cpu(tmpdata); > + *RxLen = __le16_to_cpu(tmpdata >> 16); > } > > static void dm9000_rx_status_16bit(u16 *RxStatus, u16 *RxLen) { > DM9000_outb(DM9000_MRCMD, DM9000_IO); > > - *RxStatus = DM9000_inw(DM9000_DATA); > - *RxLen = DM9000_inw(DM9000_DATA); > + *RxStatus = __le16_to_cpu(DM9000_inw(DM9000_DATA)); > + *RxLen = __le16_to_cpu(DM9000_inw(DM9000_DATA)); > } > > static void dm9000_rx_status_8bit(u16 *RxStatus, u16 *RxLen) { > DM9000_outb(DM9000_MRCMD, DM9000_IO); > > - *RxStatus = DM9000_inb(DM9000_DATA) + (DM9000_inb(DM9000_DATA) << 8); > - *RxLen = DM9000_inb(DM9000_DATA) + (DM9000_inb(DM9000_DATA) << 8); > + *RxStatus = > + __le16_to_cpu(DM9000_inb(DM9000_DATA) + > + (DM9000_inb(DM9000_DATA) << 8)); > + *RxLen = > + __le16_to_cpu(DM9000_inb(DM9000_DATA) + > + (DM9000_inb(DM9000_DATA) << 8)); > } > > /* > Sorry for opening Pandora's box, but wouldn't it be better to redefine the DM9000_x macros instead of where they're called? regards, Ben ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://sourceforge.net/services/buy/index.php _______________________________________________ U-Boot-Users mailing list U-Boot-Users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/u-boot-users