Commit 4ea5e988 authored by a.llano@usyscom.com's avatar a.llano@usyscom.com Committed by Linus Torvalds

[PATCH] Fix 1-Wire Dallas in bigendian machines

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: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent a61faa62
...@@ -521,9 +521,10 @@ void w1_slave_found(unsigned long data, u64 rn) ...@@ -521,9 +521,10 @@ void w1_slave_found(unsigned long data, u64 rn)
slave_count++; slave_count++;
} }
if (slave_count == dev->slave_count && if (slave_count == dev->slave_count && rn ) {
rn && ((rn >> 56) & 0xff) == w1_calc_crc8((u8 *)&rn, 7)) { tmp = cpu_to_le64(rn);
w1_attach_slave_device(dev, (struct w1_reg_num *) &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); atomic_dec(&dev->refcnt);
......
...@@ -24,9 +24,17 @@ ...@@ -24,9 +24,17 @@
struct w1_reg_num struct w1_reg_num
{ {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u64 family:8, __u64 family:8,
id:48, id:48,
crc:8; crc:8;
#elif defined(__BIG_ENDIAN_BITFIELD)
__u64 crc:8,
id:48,
family:8;
#else
#error "Please fix <asm/byteorder.h>"
#endif
}; };
#ifdef __KERNEL__ #ifdef __KERNEL__
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment