From: Asier Llano Palacios I've been testing the 1-Wire Dallas in a bigendian machine (through a GPIO) and I've found some problems that can easily addressed with the provided patch. (inline at the end of the message). I have a question about the implementation of w1_smem. In the line 90 of drivers/w1/w1_smem.c. for (i = 0; i < 9; ++i) count += sprintf(buf + count, "%02x ", ((u8 *)&sl->reg_num)[i]); I don't see why this loop is execute 9 times when the provided reg_num is 8 bytes long. I don't understand the purpose of the last byte. Signed-off-by: Andrew Morton --- 25-akpm/drivers/w1/w1.c | 7 ++++--- 25-akpm/drivers/w1/w1.h | 8 ++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff -puN drivers/w1/w1.c~fix-1-wire-dallas-in-bigendian-machines drivers/w1/w1.c --- 25/drivers/w1/w1.c~fix-1-wire-dallas-in-bigendian-machines Tue Feb 22 17:19:37 2005 +++ 25-akpm/drivers/w1/w1.c Tue Feb 22 17:19:37 2005 @@ -521,9 +521,10 @@ void w1_slave_found(unsigned long data, slave_count++; } - if (slave_count == dev->slave_count && - rn && ((rn >> 56) & 0xff) == w1_calc_crc8((u8 *)&rn, 7)) { - w1_attach_slave_device(dev, (struct w1_reg_num *) &rn); + if (slave_count == dev->slave_count && rn ) { + tmp = cpu_to_le64(rn); + if(((rn >> 56) & 0xff) == w1_calc_crc8((u8 *)&tmp, 7)) + w1_attach_slave_device(dev, (struct w1_reg_num *) &rn); } atomic_dec(&dev->refcnt); diff -puN drivers/w1/w1.h~fix-1-wire-dallas-in-bigendian-machines drivers/w1/w1.h --- 25/drivers/w1/w1.h~fix-1-wire-dallas-in-bigendian-machines Tue Feb 22 17:19:37 2005 +++ 25-akpm/drivers/w1/w1.h Tue Feb 22 17:19:37 2005 @@ -24,9 +24,17 @@ struct w1_reg_num { +#if defined(__LITTLE_ENDIAN_BITFIELD) __u64 family:8, id:48, crc:8; +#elif defined(__BIG_ENDIAN_BITFIELD) + __u64 crc:8, + id:48, + family:8; +#else +#error "Please fix " +#endif }; #ifdef __KERNEL__ _